blob: 771ca526b5fe784baa7bdd7221f71f76f92b050a [file] [log] [blame]
/*
* Copyright 2000-2014 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.codeInsight.lookup;
import com.intellij.codeInsight.completion.InsertHandler;
import com.intellij.codeInsight.completion.InsertionContext;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiNamedElement;
import com.intellij.psi.util.PsiUtilCore;
import gnu.trove.THashSet;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.util.Collections;
import java.util.Set;
/**
* @author peter
*/
public final class LookupElementBuilder extends LookupElement {
@NotNull private final String myLookupString;
@NotNull private final Object myObject;
private final boolean myCaseSensitive;
@Nullable private final InsertHandler<LookupElement> myInsertHandler;
@Nullable private final LookupElementRenderer<LookupElement> myRenderer;
@Nullable private final LookupElementPresentation myHardcodedPresentation;
@NotNull private final Set<String> myAllLookupStrings;
private LookupElementBuilder(@NotNull String lookupString, @NotNull Object object, @Nullable InsertHandler<LookupElement> insertHandler,
@Nullable LookupElementRenderer<LookupElement> renderer,
@Nullable LookupElementPresentation hardcodedPresentation,
@NotNull Set<String> allLookupStrings,
boolean caseSensitive) {
myLookupString = lookupString;
myObject = object;
myInsertHandler = insertHandler;
myRenderer = renderer;
myHardcodedPresentation = hardcodedPresentation;
myAllLookupStrings = allLookupStrings;
myCaseSensitive = caseSensitive;
}
private LookupElementBuilder(@NotNull String lookupString, @NotNull Object object) {
this(lookupString, object, null, null, null, Collections.singleton(lookupString), true);
}
public static LookupElementBuilder create(@NotNull String lookupString) {
return new LookupElementBuilder(lookupString, lookupString);
}
public static LookupElementBuilder create(@NotNull PsiNamedElement element) {
PsiUtilCore.ensureValid(element);
return new LookupElementBuilder(StringUtil.notNullize(element.getName()), element);
}
public static LookupElementBuilder createWithIcon(@NotNull PsiNamedElement element) {
PsiUtilCore.ensureValid(element);
return create(element).withIcon(element.getIcon(0));
}
public static LookupElementBuilder create(@NotNull Object lookupObject, @NotNull String lookupString) {
if (lookupObject instanceof PsiElement) {
PsiUtilCore.ensureValid((PsiElement)lookupObject);
}
return new LookupElementBuilder(lookupString, lookupObject);
}
/**
* @deprecated use {@link #withInsertHandler(com.intellij.codeInsight.completion.InsertHandler)}
*/
@Contract(value="", pure=true)
public LookupElementBuilder setInsertHandler(@Nullable InsertHandler<LookupElement> insertHandler) {
return withInsertHandler(insertHandler);
}
@Contract(value="", pure=true)
public LookupElementBuilder withInsertHandler(@Nullable InsertHandler<LookupElement> insertHandler) {
return new LookupElementBuilder(myLookupString, myObject, insertHandler, myRenderer, myHardcodedPresentation,
myAllLookupStrings, myCaseSensitive);
}
/**
* @deprecated use {@link #withRenderer(LookupElementRenderer)}
*/
@Contract(value="", pure=true)
public LookupElementBuilder setRenderer(@Nullable LookupElementRenderer<LookupElement> renderer) {
return withRenderer(renderer);
}
@Contract(value="", pure=true)
public LookupElementBuilder withRenderer(@Nullable LookupElementRenderer<LookupElement> renderer) {
return new LookupElementBuilder(myLookupString, myObject, myInsertHandler, renderer, myHardcodedPresentation,
myAllLookupStrings, myCaseSensitive);
}
@Override
@NotNull
public Set<String> getAllLookupStrings() {
return myAllLookupStrings;
}
/**
* @deprecated use {@link #withIcon(javax.swing.Icon)}
*/
@Contract(value="", pure=true)
public LookupElementBuilder setIcon(@Nullable Icon icon) {
return withIcon(icon);
}
@Contract(value="", pure=true)
public LookupElementBuilder withIcon(@Nullable Icon icon) {
final LookupElementPresentation presentation = copyPresentation();
presentation.setIcon(icon);
return new LookupElementBuilder(myLookupString, myObject, myInsertHandler, null, presentation,
myAllLookupStrings, myCaseSensitive);
}
@NotNull
private LookupElementPresentation copyPresentation() {
final LookupElementPresentation presentation = new LookupElementPresentation();
if (myHardcodedPresentation != null) {
presentation.copyFrom(myHardcodedPresentation);
} else {
presentation.setItemText(myLookupString);
}
return presentation;
}
/**
* @deprecated use {@link #withLookupString(String)}
*/
@Contract(value="", pure=true)
public LookupElementBuilder addLookupString(@NotNull String another) {
return withLookupString(another);
}
@Contract(value="", pure=true)
public LookupElementBuilder withLookupString(@NotNull String another) {
final THashSet<String> set = new THashSet<String>(myAllLookupStrings);
set.add(another);
return new LookupElementBuilder(myLookupString, myObject, myInsertHandler, myRenderer, myHardcodedPresentation,
Collections.unmodifiableSet(set), myCaseSensitive);
}
@Override
public boolean isCaseSensitive() {
return myCaseSensitive;
}
/**
* @deprecated use {@link #withCaseSensitivity(boolean)}
*/
@Contract(value="", pure=true)
public LookupElementBuilder setCaseSensitive(boolean caseSensitive) {
return withCaseSensitivity(caseSensitive);
}
/**
* @param caseSensitive if this lookup item should be completed in the same letter case as prefix
* @return modified builder
* @see com.intellij.codeInsight.completion.CompletionResultSet#caseInsensitive()
*/
@Contract(value="", pure=true)
public LookupElementBuilder withCaseSensitivity(boolean caseSensitive) {
return new LookupElementBuilder(myLookupString, myObject, myInsertHandler, myRenderer, myHardcodedPresentation,
myAllLookupStrings, caseSensitive);
}
/**
* @deprecated use {@link #withItemTextForeground(java.awt.Color)}
*/
@Contract(value="", pure=true)
public LookupElementBuilder setItemTextForeground(@NotNull Color itemTextForeground) {
return withItemTextForeground(itemTextForeground);
}
@Contract(value="", pure=true)
public LookupElementBuilder withItemTextForeground(@NotNull Color itemTextForeground) {
final LookupElementPresentation presentation = copyPresentation();
presentation.setItemTextForeground(itemTextForeground);
return new LookupElementBuilder(myLookupString, myObject, myInsertHandler, null, presentation, myAllLookupStrings, myCaseSensitive);
}
/**
* @deprecated use {@link #withItemTextUnderlined(boolean)}
*/
@Contract(value="", pure=true)
public LookupElementBuilder setItemTextUnderlined(boolean underlined) {
return withItemTextUnderlined(underlined);
}
@Contract(value="", pure=true)
public LookupElementBuilder withItemTextUnderlined(boolean underlined) {
final LookupElementPresentation presentation = copyPresentation();
presentation.setItemTextUnderlined(underlined);
return new LookupElementBuilder(myLookupString, myObject, myInsertHandler, null, presentation, myAllLookupStrings, myCaseSensitive);
}
/**
* @deprecated use {@link #withTypeText(String)}
*/
@Contract(value="", pure=true)
public LookupElementBuilder setTypeText(@Nullable String typeText) {
return withTypeText(typeText);
}
@Contract(value="", pure=true)
public LookupElementBuilder withTypeText(@Nullable String typeText) {
return withTypeText(typeText, false);
}
/**
* @deprecated use {@link #withTypeText(String, boolean)}
*/
@Contract(value="", pure=true)
public LookupElementBuilder setTypeText(@Nullable String typeText, boolean grayed) {
return withTypeText(typeText, grayed);
}
@Contract(value="", pure=true)
public LookupElementBuilder withTypeText(@Nullable String typeText, boolean grayed) {
return withTypeText(typeText, null, grayed);
}
@Contract(value="", pure=true)
public LookupElementBuilder withTypeText(@Nullable String typeText, @Nullable Icon typeIcon, boolean grayed) {
final LookupElementPresentation presentation = copyPresentation();
presentation.setTypeText(typeText, typeIcon);
presentation.setTypeGrayed(grayed);
return new LookupElementBuilder(myLookupString, myObject, myInsertHandler, null, presentation,
myAllLookupStrings, myCaseSensitive);
}
/**
* @deprecated use {@link #withPresentableText(String)}
*/
@Contract(value="", pure=true)
public LookupElementBuilder setPresentableText(@NotNull String presentableText) {
return withPresentableText(presentableText);
}
@Contract(value="", pure=true)
public LookupElementBuilder withPresentableText(@NotNull String presentableText) {
final LookupElementPresentation presentation = copyPresentation();
presentation.setItemText(presentableText);
return new LookupElementBuilder(myLookupString, myObject, myInsertHandler, null, presentation,
myAllLookupStrings, myCaseSensitive);
}
/**
* @deprecated use {@link #bold()}
*/
@Contract(value="", pure=true)
public LookupElementBuilder setBold() {
return bold();
}
@Contract(value="", pure=true)
public LookupElementBuilder bold() {
return withBoldness(true);
}
/**
* @deprecated use {@link #withBoldness(boolean)}
*/
@Contract(value="", pure=true)
public LookupElementBuilder setBold(boolean bold) {
return withBoldness(bold);
}
@Contract(value="", pure=true)
public LookupElementBuilder withBoldness(boolean bold) {
final LookupElementPresentation presentation = copyPresentation();
presentation.setItemTextBold(bold);
return new LookupElementBuilder(myLookupString, myObject, myInsertHandler, null, presentation,
myAllLookupStrings, myCaseSensitive);
}
/**
* @deprecated use {@link #strikeout()}
*/
@Contract(value="", pure=true)
public LookupElementBuilder setStrikeout() {
return strikeout();
}
@Contract(value="", pure=true)
public LookupElementBuilder strikeout() {
return withStrikeoutness(true);
}
/**
* @deprecated use {@link #withStrikeoutness(boolean)}
*/
@Contract(value="", pure=true)
public LookupElementBuilder setStrikeout(boolean strikeout) {
return withStrikeoutness(strikeout);
}
@Contract(value="", pure=true)
public LookupElementBuilder withStrikeoutness(boolean strikeout) {
final LookupElementPresentation presentation = copyPresentation();
presentation.setStrikeout(strikeout);
return new LookupElementBuilder(myLookupString, myObject, myInsertHandler, null, presentation,
myAllLookupStrings, myCaseSensitive);
}
/**
* @deprecated use {@link #withTailText(String)}
*/
@Contract(value="", pure=true)
public LookupElementBuilder setTailText(@Nullable String tailText) {
return withTailText(tailText);
}
@Contract(value="", pure=true)
public LookupElementBuilder withTailText(@Nullable String tailText) {
return withTailText(tailText, false);
}
/**
* @deprecated use {@link #withTailText(String, boolean)}
*/
@Contract(value="", pure=true)
public LookupElementBuilder setTailText(@Nullable String tailText, boolean grayed) {
return withTailText(tailText, grayed);
}
@Contract(value="", pure=true)
public LookupElementBuilder withTailText(@Nullable String tailText, boolean grayed) {
final LookupElementPresentation presentation = copyPresentation();
presentation.setTailText(tailText, grayed);
return new LookupElementBuilder(myLookupString, myObject, myInsertHandler, null, presentation,
myAllLookupStrings, myCaseSensitive);
}
@Contract(value="", pure=true)
public LookupElementBuilder appendTailText(@NotNull String tailText, boolean grayed) {
final LookupElementPresentation presentation = copyPresentation();
presentation.appendTailText(tailText, grayed);
return new LookupElementBuilder(myLookupString, myObject, myInsertHandler, null, presentation, myAllLookupStrings, myCaseSensitive);
}
@Contract(value="", pure=true)
public LookupElement withAutoCompletionPolicy(AutoCompletionPolicy policy) {
return policy.applyPolicy(this);
}
@NotNull
@Override
public String getLookupString() {
return myLookupString;
}
@NotNull
@Override
public Object getObject() {
return myObject;
}
@Override
public void handleInsert(InsertionContext context) {
if (myInsertHandler != null) {
myInsertHandler.handleInsert(context, this);
}
}
@Override
public void renderElement(LookupElementPresentation presentation) {
if (myRenderer != null) {
myRenderer.renderElement(this, presentation);
}
else if (myHardcodedPresentation != null) {
presentation.copyFrom(myHardcodedPresentation);
} else {
presentation.setItemText(myLookupString);
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
LookupElementBuilder that = (LookupElementBuilder)o;
final InsertHandler<LookupElement> insertHandler = that.myInsertHandler;
if (myInsertHandler != null && insertHandler != null ? !myInsertHandler.getClass().equals(insertHandler.getClass())
: myInsertHandler != insertHandler) return false;
if (!myLookupString.equals(that.myLookupString)) return false;
if (!myObject.equals(that.myObject)) return false;
final LookupElementRenderer<LookupElement> renderer = that.myRenderer;
if (myRenderer != null && renderer != null ? !myRenderer.getClass().equals(renderer.getClass()) : myRenderer != renderer) return false;
return true;
}
@Override
public String toString() {
return "LookupElementBuilder: string=" + getLookupString() + "; handler=" + myInsertHandler;
}
@Override
public int hashCode() {
int result = 0;
result = 31 * result + (myInsertHandler != null ? myInsertHandler.getClass().hashCode() : 0);
result = 31 * result + (myLookupString.hashCode());
result = 31 * result + (myObject.hashCode());
result = 31 * result + (myRenderer != null ? myRenderer.getClass().hashCode() : 0);
return result;
}
}