/* * Copyright 2011 The authors * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.intellij.struts2; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.paths.PathReference; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiClass; import com.intellij.struts2.dom.struts.action.Action; import com.intellij.struts2.dom.struts.action.Result; import com.intellij.struts2.dom.struts.strutspackage.ResultType; import com.intellij.struts2.dom.struts.strutspackage.StrutsPackage; import com.intellij.util.Function; import com.intellij.util.NullableFunction; import com.intellij.util.xml.ElementPresentationManager; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * Application-level support. * * @author Yann Cébron */ public class StrutsApplicationComponent implements ApplicationComponent { @NonNls @NotNull public String getComponentName() { return "Struts2ApplicationComponent"; } public void initComponent() { // TODO remove, this should not be needed --> DOM unique name highlighting not working ElementPresentationManager.registerNameProvider(new Function<Object, String>() { @Override public String fun(final Object o) { if (o instanceof Result) { final String resultName = ((Result) o).getName().getStringValue(); return resultName != null ? resultName : Result.DEFAULT_NAME; } return null; } }); registerDocumentationProviders(); } public void disposeComponent() { } private static void registerDocumentationProviders() { ElementPresentationManager.registerDocumentationProvider(new NullableFunction<Object, String>() { public String fun(final Object o) { if (o instanceof Action) { final Action action = (Action) o; final StrutsPackage strutsPackage = action.getStrutsPackage(); final DocumentationBuilder builder = new DocumentationBuilder(); final PsiClass actionClass = action.searchActionClass(); builder.addLine("Action", action.getName().getStringValue()) .addLine("Class", actionClass != null ? actionClass.getQualifiedName() : null) .addLine("Method", action.getMethod().getStringValue()) .addLine("Package", strutsPackage.getName().getStringValue()) .addLine("Namespace", strutsPackage.searchNamespace()); return builder.getText(); } if (o instanceof Result) { final Result result = (Result) o; final PathReference pathReference = result.getValue(); final String displayPath = pathReference != null ? pathReference.getPath() : "???"; final ResultType resultType = result.getEffectiveResultType(); final String resultTypeValue = resultType != null ? resultType.getName().getStringValue() : "???"; final DocumentationBuilder builder = new DocumentationBuilder(); builder.addLine("Path", displayPath) .addLine("Type", resultTypeValue); return builder.getText(); } return null; } }); } /** * Builds HTML-table based descriptions for use in documentation, tooltips. * * @author Yann Cébron */ private static class DocumentationBuilder { @NonNls private final StringBuilder builder = new StringBuilder("<html><table>"); /** * Adds a labeled content line. * * @param label Content description. * @param content Content text, {@code null} or empty text will be replaced with '-'. * @return this instance. */ private DocumentationBuilder addLine(@NotNull @NonNls final String label, @Nullable @NonNls final String content) { builder.append("<tr><td><strong>").append(label).append(":</strong></td>") .append("<td>").append(StringUtil.isNotEmpty(content) ? content : "-").append("</td></tr>"); return this; } private String getText() { builder.append("</table></html>"); return builder.toString(); } } }