diff --git a/platform/platform-impl/src/com/intellij/ui/TextFieldWithAutoCompletionListProvider.java b/platform/platform-impl/src/com/intellij/ui/TextFieldWithAutoCompletionListProvider.java index c7a0a7fd7cd5..564928437862 100644 --- a/platform/platform-impl/src/com/intellij/ui/TextFieldWithAutoCompletionListProvider.java +++ b/platform/platform-impl/src/com/intellij/ui/TextFieldWithAutoCompletionListProvider.java @@ -80,15 +80,22 @@ public abstract class TextFieldWithAutoCompletionListProvider extends Default public void fillCompletionVariants(@NotNull CompletionParameters parameters, @NotNull String prefix, @NotNull CompletionResultSet result) { + addCachedItems(parameters, prefix, result); + addNonCachedItems(parameters, prefix, result); + } + + private void addCachedItems(@NotNull CompletionParameters parameters, @NotNull String prefix, @NotNull CompletionResultSet result) { Collection items = getItems(prefix, true, parameters); addCompletionElements(result, this, items, -10000); + } + private void addNonCachedItems(@NotNull CompletionParameters parameters, @NotNull String prefix, @NotNull CompletionResultSet result) { final ProgressManager progressManager = ProgressManager.getInstance(); ProgressIndicator mainIndicator = progressManager.getProgressIndicator(); final ProgressIndicator indicator = mainIndicator != null ? new SensitiveProgressWrapper(mainIndicator) : new EmptyProgressIndicator(); - Future> - future = - ApplicationManager.getApplication().executeOnPooledThread(() -> progressManager.runProcess(() -> getItems(prefix, false, parameters), indicator)); + Future> future = ApplicationManager + .getApplication() + .executeOnPooledThread(() -> progressManager.runProcess(() -> getItems(prefix, false, parameters), indicator)); while (true) { try { @@ -108,10 +115,10 @@ public abstract class TextFieldWithAutoCompletionListProvider extends Default } } - private static void addCompletionElements(final CompletionResultSet result, - final TextCompletionValueDescriptor descriptor, - final Collection items, - final int index) { + protected static void addCompletionElements(final CompletionResultSet result, + final TextCompletionValueDescriptor descriptor, + final Collection items, + final int index) { final AutoCompletionPolicy completionPolicy = ApplicationManager.getApplication().isUnitTestMode() ? AutoCompletionPolicy.ALWAYS_AUTOCOMPLETE : AutoCompletionPolicy.NEVER_AUTOCOMPLETE; diff --git a/platform/platform-impl/src/com/intellij/ui/TextFieldWithAutoCompletionWithBrowseButton.java b/platform/platform-impl/src/com/intellij/ui/TextFieldWithAutoCompletionWithBrowseButton.java index 4168f372dd3d..5f82c57d23d7 100644 --- a/platform/platform-impl/src/com/intellij/ui/TextFieldWithAutoCompletionWithBrowseButton.java +++ b/platform/platform-impl/src/com/intellij/ui/TextFieldWithAutoCompletionWithBrowseButton.java @@ -3,6 +3,7 @@ package com.intellij.ui; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.ComponentWithBrowseButton; +import com.intellij.util.textCompletion.TextCompletionCache; import java.util.Collection; import java.util.Collections; @@ -17,6 +18,10 @@ public class TextFieldWithAutoCompletionWithBrowseButton super(TextFieldWithAutoCompletion.create(project, Collections.emptyList(), false, null), null); } + public TextFieldWithAutoCompletionWithBrowseButton(Project project, TextCompletionCache cache, boolean prefixMatchesOnly) { + super(TextFieldWithAutoCompletionWithCache.create(cache, prefixMatchesOnly, project, null, false, null), null); + } + @Override public String getText() { return getChildComponent().getText(); diff --git a/platform/platform-impl/src/com/intellij/ui/TextFieldWithAutoCompletionWithCache.java b/platform/platform-impl/src/com/intellij/ui/TextFieldWithAutoCompletionWithCache.java new file mode 100644 index 000000000000..26810cff2d7c --- /dev/null +++ b/platform/platform-impl/src/com/intellij/ui/TextFieldWithAutoCompletionWithCache.java @@ -0,0 +1,63 @@ +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.ui; + +import com.intellij.codeInsight.completion.PlainPrefixMatcher; +import com.intellij.codeInsight.completion.PrefixMatcher; +import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.textCompletion.TextCompletionCache; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +public class TextFieldWithAutoCompletionWithCache extends TextFieldWithAutoCompletion { + public TextFieldWithAutoCompletionWithCache(@Nullable Project project, + @NotNull TextFieldWithAutoCompletionWithCacheListProvider provider, + boolean showCompletionHint, @Nullable String text) { + super(project, provider, showCompletionHint, text); + } + + @NotNull + public static TextFieldWithAutoCompletionWithCache create(@NotNull TextCompletionCache cache, + boolean prefixMatchesOnly, + @Nullable Project project, + @Nullable Icon icon, + boolean showCompletionHint, + @Nullable String text) { + return new TextFieldWithAutoCompletionWithCache<>(project, new StringsCompletionWithCacheProvider(cache, prefixMatchesOnly, icon), showCompletionHint, text); + } + + private static class StringsCompletionWithCacheProvider extends TextFieldWithAutoCompletionWithCacheListProvider implements DumbAware { + @Nullable private final Icon myIcon; + private final boolean myPrefixMatchesOnly; + + private StringsCompletionWithCacheProvider(@NotNull TextCompletionCache cache, boolean prefixMatchesOnly, @Nullable Icon icon) { + super(cache); + myIcon = icon; + myPrefixMatchesOnly = prefixMatchesOnly; + } + + @Override + public int compare(String item1, String item2) { + return StringUtil.compare(item1, item2, false); + } + + @Override + protected Icon getIcon(@NotNull String item) { + return myIcon; + } + + @NotNull + @Override + protected String getLookupString(@NotNull String item) { + return item; + } + + @Override + public @Nullable PrefixMatcher createPrefixMatcher(@NotNull String prefix) { + return new PlainPrefixMatcher(prefix, myPrefixMatchesOnly); + } + } +} diff --git a/platform/platform-impl/src/com/intellij/ui/TextFieldWithAutoCompletionWithCacheListProvider.java b/platform/platform-impl/src/com/intellij/ui/TextFieldWithAutoCompletionWithCacheListProvider.java new file mode 100644 index 000000000000..27ec17708688 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/ui/TextFieldWithAutoCompletionWithCacheListProvider.java @@ -0,0 +1,32 @@ +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.ui; + +import com.intellij.codeInsight.completion.CompletionParameters; +import com.intellij.util.textCompletion.TextCompletionCache; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.Collections; + +public abstract class TextFieldWithAutoCompletionWithCacheListProvider extends TextFieldWithAutoCompletionListProvider { + protected TextCompletionCache myCache; + + public TextFieldWithAutoCompletionWithCacheListProvider(@NotNull TextCompletionCache cache) { + super(Collections.emptyList()); + myCache = cache; + } + + @Override + public void setItems(@Nullable Collection variants) { + // do nothing + } + + @Override + public @NotNull Collection getItems(String prefix, boolean cached, CompletionParameters parameters) { + if (!cached) { + myCache.updateCache(prefix, parameters); + } + return myCache.getItems(prefix, parameters); + } +} diff --git a/platform/platform-impl/src/com/intellij/util/textCompletion/TextCompletionCache.java b/platform/platform-impl/src/com/intellij/util/textCompletion/TextCompletionCache.java new file mode 100644 index 000000000000..11439cf1e4e0 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/util/textCompletion/TextCompletionCache.java @@ -0,0 +1,15 @@ +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.util.textCompletion; + +import com.intellij.codeInsight.completion.CompletionParameters; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; + +public interface TextCompletionCache { + void setItems(@NotNull Collection items); + + Collection getItems(@NotNull String prefix, @NotNull CompletionParameters parameters); + + void updateCache(@NotNull String prefix, @NotNull CompletionParameters parameters); +}