From 61d4f4017793e4cff28fdc5259a454f7b724f5f0 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 3 Jun 2013 21:01:03 +0200 Subject: [PATCH] IDEA-108197 Warn user about incomplete completion results in dumb mode --- .../CompletionProgressIndicator.java | 11 +++++--- .../codeInsight/lookup/impl/Advertiser.java | 25 +++++++++++++------ .../codeInsight/lookup/impl/LookupImpl.java | 7 +++--- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java index ab36b57cf3d4..8893b2d4baf4 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java @@ -46,6 +46,7 @@ import com.intellij.openapi.progress.util.ProgressWrapper; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; @@ -178,7 +179,7 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement if (FeatureUsageTracker.getInstance().isToBeAdvertisedInLookup(CodeCompletionFeatures.EDITING_COMPLETION_FINISH_BY_CONTROL_DOT, getProject())) { myLookup.addAdvertisement("Press " + CompletionContributor.getActionShortcut(IdeActions.ACTION_CHOOSE_LOOKUP_ITEM_DOT) + - " to choose the selected (or first) suggestion and insert a dot afterwards"); + " to choose the selected (or first) suggestion and insert a dot afterwards", null); } } else { myLookup.setFocusDegree(LookupImpl.FocusDegree.FOCUSED); @@ -188,15 +189,17 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement .isToBeAdvertisedInLookup(CodeCompletionFeatures.EDITING_COMPLETION_CONTROL_ENTER, getProject())) { myLookup.addAdvertisement("Press " + CompletionContributor.getActionShortcut(IdeActions.ACTION_CHOOSE_LOOKUP_ITEM_ALWAYS) + - " to choose the selected (or first) suggestion"); + " to choose the selected (or first) suggestion", null); } if (!myEditor.isOneLineMode() && FeatureUsageTracker.getInstance() .isToBeAdvertisedInLookup(CodeCompletionFeatures.EDITING_COMPLETION_CONTROL_ARROWS, getProject())) { myLookup.addAdvertisement(CompletionContributor.getActionShortcut(IdeActions.ACTION_LOOKUP_DOWN) + " and " + CompletionContributor.getActionShortcut(IdeActions.ACTION_LOOKUP_UP) + - " will move caret down and up in the editor"); + " will move caret down and up in the editor", null); } + } else if (DumbService.isDumb(getProject())) { + myLookup.addAdvertisement("Completion results might be incomplete until indexing is complete", MessageType.WARNING.getPopupBackground()); } ProgressManager.checkCanceled(); @@ -333,7 +336,7 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement PerformanceWatcher.getInstance().dumpThreads(true); } - if (StringUtil.isEmpty(myLookup.getAdvertisementText()) && !isAutopopupCompletion()) { + if (StringUtil.isEmpty(myLookup.getAdvertisementText()) && !isAutopopupCompletion() && !DumbService.isDumb(getProject())) { final String text = DefaultCompletionContributor.getDefaultAdvertisementText(myParameters); if (text != null) { myLookup.setAdvertisementText(text); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/Advertiser.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/Advertiser.java index 6e46eb4a0db7..20b2e88052c9 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/Advertiser.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/Advertiser.java @@ -16,12 +16,15 @@ package com.intellij.codeInsight.lookup.impl; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.util.Pair; import com.intellij.ui.ClickListener; import com.intellij.ui.JBColor; +import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.GridBag; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; @@ -34,7 +37,7 @@ import java.util.Random; * @author peter */ public class Advertiser { - private final List myTexts = ContainerUtil.createLockFreeCopyOnWriteList(); + private final List> myTexts = ContainerUtil.createLockFreeCopyOnWriteList(); private volatile Dimension myCachedPrefSize; private final JPanel myComponent = new JPanel(new GridBagLayout()) { private JLabel mySample = createLabel(); @@ -54,8 +57,8 @@ public class Advertiser { } int maxSize = 0; - for (String label : myTexts) { - mySample.setText(prepareText(label)); + for (Pair label : myTexts) { + mySample.setText(prepareText(label.first)); maxSize = Math.max(maxSize, mySample.getPreferredSize().width); } @@ -92,11 +95,14 @@ public class Advertiser { private void updateAdvertisements() { myNextLabel.setVisible(myTexts.size() > 1); if (!myTexts.isEmpty()) { - String text = myTexts.get(myCurrentItem % myTexts.size()); + Pair pair = myTexts.get(myCurrentItem % myTexts.size()); + String text = pair.first; myTextPanel.setText(prepareText(text)); + myComponent.setBackground(pair.second); } else { myTextPanel.setText(""); + myComponent.setBackground(null); } myCachedPrefSize = null; myComponent.revalidate(); @@ -131,9 +137,9 @@ public class Advertiser { return font.deriveFont((float)(font.getSize() - 2)); } - public void addAdvertisement(@NotNull String text) { + public void addAdvertisement(@NotNull String text, @Nullable Color bgColor) { ApplicationManager.getApplication().assertIsDispatchThread(); - myTexts.add(text); + myTexts.add(Pair.create(text, bgColor)); updateAdvertisements(); } @@ -142,6 +148,11 @@ public class Advertiser { } public List getAdvertisements() { - return myTexts; + return ContainerUtil.map(myTexts, new Function, String>() { + @Override + public String fun(Pair pair) { + return pair.first; + } + }); } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java index 60e8695d89fc..3f22987ffa86 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java @@ -66,7 +66,6 @@ import com.intellij.ui.plaf.beg.BegPopupMenuBorder; import com.intellij.ui.popup.AbstractPopup; import com.intellij.util.Alarm; import com.intellij.util.CollectConsumer; -import com.intellij.util.ObjectUtils; import com.intellij.util.PlatformIcons; import com.intellij.util.containers.ConcurrentHashMap; import com.intellij.util.containers.ContainerUtil; @@ -378,7 +377,7 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable public void setAdvertisementText(@Nullable String text) { myAdText = text; if (StringUtil.isNotEmpty(text)) { - addAdvertisement(ObjectUtils.assertNotNull(text)); + addAdvertisement(text, null); } } @@ -1294,12 +1293,12 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable requestResize(); } - public void addAdvertisement(@NotNull final String text) { + public void addAdvertisement(@NotNull final String text, final @Nullable Color bgColor) { Runnable runnable = new Runnable() { @Override public void run() { if (!myDisposed) { - myAdComponent.addAdvertisement(text); + myAdComponent.addAdvertisement(text, bgColor); if (myShown) { requestResize(); refreshUi(false, false);