From 676abb30545bf63409ab061b2fdcd021736896be Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 25 Mar 2011 13:29:04 +0100 Subject: [PATCH] once the first calculation is finished, don't move the lookup --- .../codeInsight/lookup/impl/LookupImpl.java | 35 +++++++++---------- .../codeInsight/lookup/impl/TypedHandler.java | 5 ++- 2 files changed, 20 insertions(+), 20 deletions(-) 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 96cc9fd1da61..5a8433feca8c 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 @@ -87,12 +87,12 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable { private final Project myProject; private final Editor myEditor; - private int myMinPrefixLength; private int myPreferredItemsCount; private String myInitialPrefix; private LookupArranger myCustomArranger; - private RangeMarker myLookupStartMarker; + private boolean myStableStart; + @NotNull private RangeMarker myLookupStartMarker; private final JList myList = new JBList(new DefaultListModel()); private final LookupCellRenderer myCellRenderer; private Boolean myPositionedAbove = null; @@ -154,6 +154,8 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable { myIconPanel.setBackground(Color.LIGHT_GRAY); myIconPanel.add(myProcessIcon); + updateLookupStart(0); + final ListModel model = myList.getModel(); addEmptyItem((DefaultListModel)model); updateListHeight(model); @@ -270,10 +272,6 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable { return myModel.getActionsFor(element); } - public int getMinPrefixLength() { - return myMinPrefixLength; - } - public JList getList() { return myList; } @@ -421,15 +419,17 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable { } private void checkMinPrefixLengthChanges(Collection items) { + if (myStableStart) return; + if (!myCalculating && !items.isEmpty()) { + myStableStart = true; + } + int minPrefixLength = items.isEmpty() ? 0 : Integer.MAX_VALUE; for (final LookupElement item : items) { minPrefixLength = Math.min(item.getPrefixMatcher().getPrefix().length(), minPrefixLength); } - if (myMinPrefixLength != minPrefixLength) { - myLookupStartMarker = null; - } - myMinPrefixLength = minPrefixLength; + updateLookupStart(minPrefixLength); } private void restoreSelection(@Nullable LookupElement oldSelected, boolean choosePreselectedItem, @Nullable String oldInvariant) { @@ -568,7 +568,7 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable { Dimension dim = component.getPreferredSize(); int lookupStart = getLookupStart(); if (lookupStart < 0) { - LOG.error(lookupStart + "; minprefix=" + myMinPrefixLength + "; offset=" + myEditor.getCaretModel().getOffset() + "; element=" + + LOG.error(lookupStart + "; offset=" + myEditor.getCaretModel().getOffset() + "; element=" + getPsiElement()); } @@ -656,12 +656,6 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable { } public int getLookupStart() { - if (myLookupStartMarker == null) { - final int start = calcLookupStart(); - myLookupStartMarker = myEditor.getDocument().createRangeMarker(start, start); - myLookupStartMarker.setGreedyToLeft(true); - } - return myLookupStartMarker.getStartOffset(); } @@ -816,11 +810,14 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable { } } - private int calcLookupStart() { + private int updateLookupStart(int myMinPrefixLength) { int offset = myEditor.getSelectionModel().hasSelection() ? myEditor.getSelectionModel().getSelectionStart() : myEditor.getCaretModel().getOffset(); - return Math.max(offset - myMinPrefixLength - myAdditionalPrefix.length(), 0); + int start = Math.max(offset - myMinPrefixLength - myAdditionalPrefix.length(), 0); + myLookupStartMarker = myEditor.getDocument().createRangeMarker(start, start); + myLookupStartMarker.setGreedyToLeft(true); + return start; } @Nullable diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/TypedHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/TypedHandler.java index 0c32cfa102bd..16a9ae0f7ead 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/TypedHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/TypedHandler.java @@ -126,8 +126,11 @@ public class TypedHandler implements TypedActionHandler { @Nullable private static CharFilter.Result getFiltersDecision(char charTyped, LookupImpl lookup) { + LookupElement item = lookup.getCurrentItem(); + int prefixLength = (item == null ? 0 : item.getPrefixMatcher().getPrefix().length()) + lookup.getAdditionalPrefix().length(); + for (final CharFilter extension : getFilters()) { - final CharFilter.Result result = extension.acceptChar(charTyped, lookup.getMinPrefixLength() + lookup.getAdditionalPrefix().length(), lookup); + final CharFilter.Result result = extension.acceptChar(charTyped, prefixLength, lookup); if (result != null) { return result; }