/* * Copyright (c) 2012 Sam Harwell, Tunnel Vision Laboratories LLC * All rights reserved. * * The source code of this document is proprietary work, and is not licensed for * distribution. For information about licensing, contact Sam Harwell at: * sam@tunnelvisionlabs.com */ package org.tvl.goworks.editor.go.completion; import javax.swing.ImageIcon; import org.antlr.netbeans.editor.navigation.Description; import org.netbeans.api.annotations.common.NonNull; import org.openide.util.ImageUtilities; import org.openide.util.Parameters; import org.tvl.goworks.editor.go.codemodel.FunctionModel; import org.tvl.goworks.editor.go.codemodel.ParameterModel; import org.tvl.goworks.editor.go.highlighter.SemanticHighlighter; /** * * @author Sam Harwell */ public class FunctionReferenceCompletionItem extends GoCompletionItem { private static ImageIcon FUNCTION_ICON; private static ImageIcon FUNCTION_ICON_PROTECTED; private static ImageIcon METHOD_ICON; private static ImageIcon METHOD_ICON_PROTECTED; private final FunctionModel functionModel; private final String functionName; private String leftText; private String rightText; public FunctionReferenceCompletionItem(@NonNull String typeName) { Parameters.notNull("typeName", typeName); this.functionModel = null; this.functionName = typeName; } public FunctionReferenceCompletionItem(@NonNull FunctionModel functionModel) { Parameters.notNull("functionModel", functionModel); this.functionModel = functionModel; this.functionName = functionModel.getName(); } @Override public FunctionModel getCodeElementModel() { return functionModel; } @Override public int getSortPriority() { return MEMBER_SORT_PRIORITY; } @Override public String getSortTextImpl() { return functionName; } @Override public CharSequence getInsertPrefix() { return functionName; } @Override public String getToolTipText() { if (functionModel != null) { return functionModel.toString(); } return ""; } @Override protected ImageIcon getIcon() { ImageIcon icon; if (functionModel == null || functionModel.getReceiverParameter() == null) { if (Character.isUpperCase(functionName.charAt(0)) || SemanticHighlighter.PREDEFINED_FUNCTIONS.contains(functionName)) { if (FUNCTION_ICON == null) { FUNCTION_ICON = new ImageIcon(ImageUtilities.loadImage("org/tvl/goworks/editor/go/resources/methods_static.png")); } icon = FUNCTION_ICON; } else { if (FUNCTION_ICON_PROTECTED == null) { FUNCTION_ICON_PROTECTED = new ImageIcon(ImageUtilities.loadImage("org/tvl/goworks/editor/go/resources/methods_static_protected.png")); } icon = FUNCTION_ICON_PROTECTED; } } else { if (Character.isUpperCase(functionName.charAt(0))) { if (METHOD_ICON == null) { METHOD_ICON = new ImageIcon(ImageUtilities.loadImage("org/tvl/goworks/editor/go/resources/methods.png")); } icon = METHOD_ICON; } else { if (METHOD_ICON_PROTECTED == null) { METHOD_ICON_PROTECTED = new ImageIcon(ImageUtilities.loadImage("org/tvl/goworks/editor/go/resources/methods_protected.png")); } icon = METHOD_ICON_PROTECTED; } } return icon; } @Override protected String getLeftHtmlText() { if (leftText == null) { StringBuilder builder = new StringBuilder(); builder.append(METHOD_COLOR); builder.append(functionName); builder.append(COLOR_END); if (functionModel != null) { builder.append("("); boolean first = true; for (ParameterModel parameter : functionModel.getParameters()) { if (!first) { builder.append(", "); } appendParameter(builder, parameter); first = false; } builder.append(")"); } leftText = builder.toString(); } return leftText; } @Override protected String getRightHtmlText() { if (rightText == null) { if (functionModel != null && !functionModel.getReturnValues().isEmpty()) { if (functionModel.getReturnValues().size() == 1) { ParameterModel model = functionModel.getReturnValues().iterator().next(); if ("_".equals(model.getName())) { return model.getVarType().getSimpleName(); } } else { StringBuilder builder = new StringBuilder(); builder.append("("); boolean first = true; for (ParameterModel parameter : functionModel.getReturnValues()) { if (!first) { builder.append(", "); } appendParameter(builder, parameter); first = false; } builder.append(")"); rightText = builder.toString(); } } else { rightText = ""; } } return rightText; } private void appendParameter(StringBuilder builder, ParameterModel parameter) { if (!"_".equals(parameter.getName())) { builder.append(PARAMETER_NAME_COLOR); builder.append(Description.htmlEscape(parameter.getName())); builder.append(COLOR_END); builder.append(" "); } builder.append(PARAMETER_TYPE_COLOR); builder.append(Description.htmlEscape(parameter.getVarType().getSimpleName())); builder.append(COLOR_END); } }