package com.intellij.util; import com.intellij.codeInsight.completion.CompletionResultSet; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.PlainTextLanguage; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileFactory; import com.intellij.ui.EditorTextField; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * @author sergey.evdokimov */ public abstract class TextFieldCompletionProvider { static final Key<TextFieldCompletionProvider> COMPLETING_TEXT_FIELD_KEY = Key.create("COMPLETING_TEXT_FIELD_KEY"); protected boolean myCaseInsensitivity; protected TextFieldCompletionProvider() { this(false); } protected TextFieldCompletionProvider(boolean caseInsensitivity) { myCaseInsensitivity = caseInsensitivity; } public void apply(@NotNull EditorTextField field, @NotNull String text) { Project project = field.getProject(); if (project != null) { field.setDocument(createDocument(project, text)); } } public void apply(@NotNull EditorTextField field) { apply(field, ""); } private Document createDocument(final Project project, @NotNull String text) { final FileType fileType = PlainTextLanguage.INSTANCE.getAssociatedFileType(); assert fileType != null; final long stamp = LocalTimeCounter.currentTime(); final PsiFile psiFile = PsiFileFactory.getInstance(project) .createFileFromText("Dummy." + fileType.getDefaultExtension(), fileType, text, stamp, true, false); psiFile.putUserData(COMPLETING_TEXT_FIELD_KEY, this); final Document document = PsiDocumentManager.getInstance(project).getDocument(psiFile); assert document != null; return document; } public boolean isCaseInsensitivity() { return myCaseInsensitivity; } @NotNull protected String getPrefix(@NotNull String currentTextPrefix) { return currentTextPrefix; } protected abstract void addCompletionVariants(@NotNull String text, int offset, @NotNull String prefix, @NotNull CompletionResultSet result); @NotNull public EditorTextField createEditor(Project project) { return createEditor(project, true); } @NotNull public EditorTextField createEditor(Project project, final boolean shouldHaveBorder) { return createEditor(project, shouldHaveBorder, null); } @NotNull public EditorTextField createEditor(Project project, final boolean shouldHaveBorder, @Nullable final Consumer<Editor> editorConstructionCallback) { return new EditorTextField(createDocument(project, ""), project, PlainTextLanguage.INSTANCE.getAssociatedFileType()) { @Override protected boolean shouldHaveBorder() { return shouldHaveBorder; } @Override protected void updateBorder(@NotNull EditorEx editor) { if (shouldHaveBorder) { super.updateBorder(editor); } else { editor.setBorder(null); } } @Override protected EditorEx createEditor() { EditorEx result = super.createEditor(); if (editorConstructionCallback != null) { editorConstructionCallback.consume(result); } return result; } }; } }