From 46d153a76c4e7fbd0791ce4baa4b442113d10fd1 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 27 Apr 2012 15:52:17 +0200 Subject: [PATCH] select the most relevant item only on explicit user actions (e.g. typing), otherwise try to preserve the lookup selection --- .../completion/JavaAutoPopupTest.groovy | 2 +- .../completion/CodeCompletionHandlerBase.java | 2 +- .../completion/CompletionLookupArranger.java | 8 ++++---- .../CompletionProgressIndicator.java | 4 ++-- .../codeInsight/lookup/LookupArranger.java | 4 ++-- .../lookup/impl/LookupActionHandler.java | 4 ++-- .../lookup/impl/LookupActionsStep.java | 2 +- .../codeInsight/lookup/impl/LookupImpl.java | 18 +++++++++--------- .../lookup/impl/LookupManagerImpl.java | 4 ++-- .../impl/actions/ChooseItemReplaceAction.java | 2 +- .../template/impl/ListTemplatesHandler.java | 4 ++-- .../template/impl/TemplateState.java | 2 +- 12 files changed, 28 insertions(+), 28 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy index e6c5dec8a4dd..4cbd44f021da 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy @@ -527,7 +527,7 @@ public interface Test { myFixture.completeBasic() while (!lookup.items) { Thread.sleep(10) - edt { lookup.refreshUi(false) } + edt { lookup.refreshUi(false, false) } } edt { myFixture.type '\t' } myFixture.checkResult 'public interface Test { RuntimeExceptionx }' diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java index 21b142063751..3a860e8e8ff5 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -475,7 +475,7 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { LOG.assertTrue(!indicator.isRunning(), "running"); LOG.assertTrue(!indicator.isCanceled(), "canceled"); - indicator.getLookup().refreshUi(true); + indicator.getLookup().refreshUi(true, false); final AutoCompletionDecision decision = shouldAutoComplete(indicator, items); if (decision == AutoCompletionDecision.SHOW_LOOKUP) { CompletionServiceImpl.setCompletionPhase(new CompletionPhase.ItemsCalculated(indicator)); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionLookupArranger.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionLookupArranger.java index 05c219d42fd7..c2d168ec6fd5 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionLookupArranger.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionLookupArranger.java @@ -137,7 +137,7 @@ public class CompletionLookupArranger extends LookupArranger { } @Override - public Pair, Integer> arrangeItems(@NotNull Lookup lookup) { + public Pair, Integer> arrangeItems(@NotNull Lookup lookup, boolean onExplicitAction) { List items = matchingItems(lookup); Collections.sort(items, new Comparator() { public int compare(LookupElement o1, LookupElement o2) { @@ -188,7 +188,7 @@ public class CompletionLookupArranger extends LookupArranger { } ArrayList listModel = new ArrayList(model); - return new Pair, Integer>(listModel, getItemToSelect(lookup, listModel, inputBySorter)); + return new Pair, Integer>(listModel, getItemToSelect(lookup, listModel, inputBySorter, onExplicitAction)); } @@ -197,12 +197,12 @@ public class CompletionLookupArranger extends LookupArranger { return new CompletionLookupArranger(myParameters, myProcess); } - private int getItemToSelect(Lookup lookup, List items, MultiMap inputBySorter) { + private int getItemToSelect(Lookup lookup, List items, MultiMap inputBySorter, boolean onExplicitAction) { if (items.isEmpty() || !lookup.isFocused()) { return 0; } - if (lookup.isSelectionTouched()) { + if (lookup.isSelectionTouched() || !onExplicitAction) { LookupElement lastSelection = lookup.getCurrentItem(); int old = items.indexOf(lastSelection); if (old >= 0) { 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 f19a2408fdda..2868f0ca6123 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java @@ -353,7 +353,7 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement } justShown = true; } - myLookup.refreshUi(true); + myLookup.refreshUi(true, false); hideAutopopupIfMeaningless(); if (justShown) { myLookup.ensureSelectionVisible(); @@ -518,7 +518,7 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement private boolean hideAutopopupIfMeaningless() { if (!myLookup.isLookupDisposed() && isAutopopupCompletion() && !myLookup.isSelectionTouched() && !myLookup.isCalculating()) { - myLookup.refreshUi(true); + myLookup.refreshUi(true, false); final List items = myLookup.getItems(); for (LookupElement item : items) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupArranger.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupArranger.java index 5aee53c4232e..cdfc8ec5570c 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupArranger.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupArranger.java @@ -34,7 +34,7 @@ public abstract class LookupArranger { public void prefixChanged() { } - public abstract Pair, Integer> arrangeItems(@NotNull Lookup lookup); + public abstract Pair, Integer> arrangeItems(@NotNull Lookup lookup, boolean onExplicitAction); public final void clearItems() { prefixChanged(); @@ -82,7 +82,7 @@ public abstract class LookupArranger { } public static class DefaultArranger extends LookupArranger { - public Pair, Integer> arrangeItems(@NotNull Lookup lookup) { + public Pair, Integer> arrangeItems(@NotNull Lookup lookup, boolean onExplicitAction) { LinkedHashSet result = new LinkedHashSet(); List items = matchingItems(lookup); addPrefixItems(lookup, result, true, items); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupActionHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupActionHandler.java index aa3f9ca8eceb..95e471c65450 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupActionHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupActionHandler.java @@ -84,7 +84,7 @@ public abstract class LookupActionHandler extends EditorActionHandler { if (!lookup.isFocused()) { lookup.setFocused(true); lookup.getList().setSelectedIndex(0); - lookup.refreshUi(false); + lookup.refreshUi(false, true); } else { ListScrollingUtil.moveDown(lookup.getList(), 0); } @@ -146,7 +146,7 @@ public abstract class LookupActionHandler extends EditorActionHandler { lookup.setFocused(true); lookup.getList().setSelectedIndex(0); - lookup.refreshUi(false); + lookup.refreshUi(false, true); } ListScrollingUtil.moveUp(lookup.getList(), 0); return true; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupActionsStep.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupActionsStep.java index 258a6815cd3d..65e6cd8fcb01 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupActionsStep.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupActionsStep.java @@ -61,7 +61,7 @@ public class LookupActionsStep extends BaseListPopupStep im } else if (result == LookupElementAction.Result.REFRESH_ITEM) { myLookup.updateLookupWidth(myLookupElement); myLookup.requestResize(); - myLookup.refreshUi(false); + myLookup.refreshUi(false, true); } else if (result instanceof LookupElementAction.Result.ChooseItem) { myLookup.setCurrentItem(((LookupElementAction.Result.ChooseItem)result).item); CommandProcessor.getInstance().executeCommand(myLookup.getEditor().getProject(), new Runnable() { 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 1efb5e21fb6b..9534a81cf2b4 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 @@ -314,7 +314,7 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable for (final LookupElement item : items) { addItem(item, itemMatcher(item)); } - refreshUi(true); + refreshUi(true, true); } public void addItem(LookupElement item, PrefixMatcher matcher) { @@ -387,7 +387,7 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable myPresentableArranger.prefixChanged(); } requestResize(); - refreshUi(false); + refreshUi(false, true); ensureSelectionVisible(); } @@ -422,14 +422,14 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable } requestResize(); if (shouldUpdate) { - refreshUi(false); + refreshUi(false, true); ensureSelectionVisible(); } return true; } - private boolean updateList() { + private boolean updateList(boolean onExplicitAction) { if (!ApplicationManager.getApplication().isUnitTestMode()) { ApplicationManager.getApplication().assertIsDispatchThread(); } @@ -437,7 +437,7 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable DefaultListModel listModel = (DefaultListModel)myList.getModel(); synchronized (myList) { - Pair, Integer> pair = myPresentableArranger.arrangeItems(this); + Pair, Integer> pair = myPresentableArranger.arrangeItems(this, onExplicitAction); List items = pair.first; Integer toSelect = pair.second; if (toSelect == null || toSelect < 0 || items.size() > 0 && toSelect >= items.size()) { @@ -1125,7 +1125,7 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable })) { return; } - refreshUi(true); + refreshUi(true, true); } @Nullable @@ -1236,7 +1236,7 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable staticDisposeTrace = disposeTrace; } - public void refreshUi(boolean mayCheckReused) { + public void refreshUi(boolean mayCheckReused, boolean onExplicitAction) { final boolean reused = mayCheckReused && checkReused(); if (reused) { myAdditionalPrefix = ""; @@ -1244,7 +1244,7 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable boolean selectionVisible = isSelectionVisible(); - boolean itemsChanged = updateList(); + boolean itemsChanged = updateList(onExplicitAction); if (isVisible()) { LOG.assertTrue(!ApplicationManager.getApplication().isUnitTestMode()); @@ -1300,7 +1300,7 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable if (!myDisposed) { myAdComponent.addAdvertisement(text); requestResize(); - refreshUi(false); + refreshUi(false, false); } } }); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupManagerImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupManagerImpl.java index fff9ed1e854e..ed9fbc348937 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupManagerImpl.java @@ -203,12 +203,12 @@ public class LookupManagerImpl extends LookupManager { } }); - CamelHumpMatcher matcher = new CamelHumpMatcher(prefix == null ? "" : prefix); + CamelHumpMatcher matcher = new CamelHumpMatcher(prefix); if (items.length > 0) { for (final LookupElement item : items) { myActiveLookup.addItem(item, matcher); } - myActiveLookup.refreshUi(true); + myActiveLookup.refreshUi(true, true); } else { alarm.cancelAllRequests(); // no items -> no doc } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/actions/ChooseItemReplaceAction.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/actions/ChooseItemReplaceAction.java index e4b7dfdcd608..dadb6d17c085 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/actions/ChooseItemReplaceAction.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/actions/ChooseItemReplaceAction.java @@ -67,7 +67,7 @@ public class ChooseItemReplaceAction extends EditorAction { } public static boolean hasTemplatePrefix(LookupImpl lookup, char shortcutChar) { - lookup.refreshUi(false); // to bring the list model up to date + lookup.refreshUi(false, false); // to bring the list model up to date CompletionProcess completion = CompletionService.getCompletionService().getCurrentCompletion(); if (completion == null || !completion.isAutopopupCompletion()) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ListTemplatesHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ListTemplatesHandler.java index 1778d0c1a6ae..7841f165e3a3 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ListTemplatesHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ListTemplatesHandler.java @@ -127,7 +127,7 @@ public class ListTemplatesHandler implements CodeInsightActionHandler { Editor editor = lookup.getEditor(); Project project = editor.getProject(); lookup.addLookupListener(new MyLookupAdapter(project, editor, template2Argument)); - lookup.refreshUi(false); + lookup.refreshUi(false, true); lookup.showLookup(); } @@ -180,7 +180,7 @@ public class ListTemplatesHandler implements CodeInsightActionHandler { private static class TemplatesArranger extends LookupArranger { @Override - public Pair, Integer> arrangeItems(@NotNull Lookup lookup) { + public Pair, Integer> arrangeItems(@NotNull Lookup lookup, boolean onExplicitAction) { LinkedHashSet result = new LinkedHashSet(); List items = matchingItems(lookup); for (LookupElement item : items) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java index b93e614ffb79..7db33ad96ae5 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java @@ -513,7 +513,7 @@ public class TemplateState implements Disposable { } lookup.setAdvertisementText(advertisingText); - lookup.refreshUi(true); + lookup.refreshUi(true, true); ourLookupShown = true; lookup.addLookupListener(new LookupAdapter() { public void lookupCanceled(LookupEvent event) {