Package com.intellij.coldFusion.UI

Source Code of com.intellij.coldFusion.UI.CfmlLookUpItemUtil

/*
* Copyright 2000-2013 JetBrains s.r.o.
*
* 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.coldFusion.UI;

import com.intellij.codeInsight.completion.InsertHandler;
import com.intellij.codeInsight.completion.InsertionContext;
import com.intellij.codeInsight.completion.JavaLookupElementBuilder;
import com.intellij.codeInsight.completion.util.ParenthesesInsertHandler;
import com.intellij.codeInsight.hint.ShowParameterInfoHandler;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.codeInsight.lookup.PsiTypeLookupItem;
import com.intellij.coldFusion.UI.editorActions.completionProviders.CfmlMethodInsertHandler;
import com.intellij.coldFusion.model.info.CfmlFunctionDescription;
import com.intellij.coldFusion.model.psi.*;
import com.intellij.coldFusion.model.psi.impl.CfmlNamedAttributeImpl;
import com.intellij.psi.*;
import com.intellij.util.PlatformIcons;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;

public class CfmlLookUpItemUtil implements PlatformIcons {
  public static LookupElement functionDescriptionToLookupItem(final CfmlFunctionDescription functionDescription) {
    String name = "" + functionDescription.getName();
    String typeText = functionDescription.getReturnType();
    String tailText = "(" + functionDescription.getParametersListPresentableText() + ")";

    return LookupElementBuilder.create(name).withTypeText(typeText).withIcon(METHOD_ICON)
      .withInsertHandler(new ParenthesesInsertHandler<LookupElement>() {
        protected boolean placeCaretInsideParentheses(final InsertionContext context, final LookupElement item) {
          return functionDescription.getParameters().size() != 0;
        }

        @Override
        public void handleInsert(InsertionContext context, LookupElement item) {
          super.handleInsert(context, item);
          new ShowParameterInfoHandler().invoke(context.getProject(), context.getEditor(), context.getFile());
        }
      }).withTailText(tailText).withCaseSensitivity(false);
  }

  public static LookupElement namedElementToLookupItem(PsiNamedElement element, @Nullable String prefix) {
    if (element instanceof LookupElement) return (LookupElement)element;
    // about java
    if (element instanceof PsiClass) {
      return JavaLookupElementBuilder.forClass((PsiClass)element);
    }
    if (element instanceof PsiMethod) {
      if (((PsiMethod)element).isConstructor()) {
        return JavaLookupElementBuilder.forMethod((PsiMethod)element, "init", PsiSubstitutor.EMPTY, null);
      }
      return JavaLookupElementBuilder.forMethod((PsiMethod)element, PsiSubstitutor.EMPTY);
    }
    if (element instanceof PsiVariable) {
      //noinspection CastConflictsWithInstanceof
      return JavaLookupElementBuilder.forField((PsiField)element);
    }
    if (element instanceof PsiType) {
      return PsiTypeLookupItem.createLookupItem((PsiType)element, null);
    }
    // about cfml

    String name = "" + element.getName();
    String typeText = null;
    String tailText = null;

    if (element instanceof CfmlFunction) {
      tailText = "(" + ((CfmlFunction)element).getParametersAsString() + ")";
      PsiType returnType = ((CfmlFunction)element).getReturnType();
      typeText = returnType != null ? returnType.getCanonicalText() : null;
    }
    else if (element instanceof CfmlNamedAttributeImpl && element.getParent() instanceof CfmlFunction) {
      CfmlFunction cfmlFunction = (CfmlFunction)element.getParent();
      tailText = "(" + cfmlFunction.getParametersAsString() + ")";
      PsiType returnType = cfmlFunction.getReturnType();
      typeText = returnType != null ? returnType.getCanonicalText() : null;
    }
    else if (element instanceof CfmlVariable) {
      PsiType type = ((CfmlVariable)element).getPsiType();
      if (type != null) {
        typeText = type.getPresentableText();
      }
      name = ((CfmlVariable)element).getlookUpString();
    }
    else if (element instanceof PsiDirectory) {
      name = element.getName();
      tailText = ".";
    }

    if (prefix != null && prefix.length() != 0 && !name.toLowerCase().startsWith(prefix.toLowerCase())) {
      name = prefix + "." + name;
    }

    return LookupElementBuilder.create(element, name).withTypeText(typeText).withIcon(getIcon(element))
      .withInsertHandler(getInsertHandler(element)).withTailText(tailText).withCaseSensitivity(false);
  }

  @Nullable
  private static InsertHandler<LookupElement> getInsertHandler(PsiNamedElement element) {
    if (CfmlPsiUtil.isFunctionDefinition(element)) {
      return CfmlMethodInsertHandler.getInstance();
    }
    return null;
  }

  @Nullable
  private static Icon getIcon(PsiElement element) {
    if (CfmlPsiUtil.isFunctionDefinition(element)) {
      return METHOD_ICON;
    }
    else if (element instanceof CfmlParameter) {
      return PARAMETER_ICON;
    }
    else if (element instanceof CfmlVariable) {
      return VARIABLE_ICON;
    }
    else if (element instanceof CfmlComponent) {
      if (((CfmlComponent)element).isInterface()) {
        return INTERFACE_ICON;
      }
      else {
        return CLASS_ICON;
      }
    }
    return null;
  }

  public static CfmlFunctionDescription getFunctionDescription(CfmlFunction function) {
    PsiType returnType = function.getReturnType();
    CfmlFunctionDescription functionInfo = new CfmlFunctionDescription(function.getName(),
                                                                       returnType != null ? returnType.getCanonicalText() : null);
    CfmlParameter[] params = function.getParameters();
    for (CfmlParameter param : params) {
      functionInfo.addParameter(new CfmlFunctionDescription.CfmlParameterDescription(param.getName(), param.getType(), param.isRequired()));
    }
    return functionInfo;
  }
}
TOP

Related Classes of com.intellij.coldFusion.UI.CfmlLookUpItemUtil

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.