From e931270474d5c2cd43a506b46c315bc32a5f664f Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 8 Sep 2011 12:32:39 +0200 Subject: [PATCH] if a user types a char occurring in a lookup string of the currently selected lookup item, insert everything that's before that occurrence --- .../codeInsight/lookup/impl/LookupImpl.java | 32 +++++++++---------- .../lookup/impl/LookupTypedHandler.java | 29 ++++++++++++++++- 2 files changed, 43 insertions(+), 18 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 d5149450a6bb..7c475cbb125c 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 @@ -1130,29 +1130,27 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable myInitialPrefix = null; } - final String finalCommonPrefix = commonPrefix; - Runnable runnable = new Runnable() { - public void run() { - doInsertCommonPrefix(presentPrefix, finalCommonPrefix); - } - }; - performGuardedChange(runnable); + replacePrefix(presentPrefix, commonPrefix); return true; } - private void doInsertCommonPrefix(String presentPrefix, String newPrefix) { - EditorModificationUtil.deleteSelectedText(myEditor); - int offset = myEditor.getCaretModel().getOffset(); - final int start = offset - presentPrefix.length(); - myEditor.getDocument().replaceString(start, offset, newPrefix); + public void replacePrefix(final String presentPrefix, final String newPrefix) { + performGuardedChange(new Runnable() { + public void run() { + EditorModificationUtil.deleteSelectedText(myEditor); + int offset = myEditor.getCaretModel().getOffset(); + final int start = offset - presentPrefix.length(); + myEditor.getDocument().replaceString(start, offset, newPrefix); - Map newItems = myModel.retainMatchingItems(newPrefix, this); - myMatchers.clear(); - myMatchers.putAll(newItems); + Map newItems = myModel.retainMatchingItems(newPrefix, LookupImpl.this); + myMatchers.clear(); + myMatchers.putAll(newItems); - myAdditionalPrefix = ""; + myAdditionalPrefix = ""; - myEditor.getCaretModel().moveToOffset(start + newPrefix.length()); + myEditor.getCaretModel().moveToOffset(start + newPrefix.length()); + } + }); refreshUi(); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupTypedHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupTypedHandler.java index 936028d22020..2d3bfd2dabf1 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupTypedHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupTypedHandler.java @@ -92,7 +92,11 @@ public class LookupTypedHandler extends TypedHandlerDelegate { if (result == CharFilter.Result.SELECT_ITEM_AND_FINISH_LOOKUP && lookup.isFocused()) { LookupElement item = lookup.getCurrentItem(); - if (item != null){ + if (item != null) { + if (completeTillTypedCharOccurrence(charTyped, lookup, item)) { + return Result.STOP; + } + inside = false; ((CommandProcessorEx)CommandProcessor.getInstance()).enterModal(); try { @@ -117,6 +121,29 @@ public class LookupTypedHandler extends TypedHandlerDelegate { } } + private boolean completeTillTypedCharOccurrence(char charTyped, LookupImpl lookup, LookupElement item) { + PrefixMatcher matcher = lookup.itemMatcher(item); + final String oldPrefix = matcher.getPrefix() + lookup.getAdditionalPrefix(); + PrefixMatcher expanded = matcher.cloneWithPrefix(oldPrefix + charTyped); + if (expanded.prefixMatches(item)) { + for (String s : item.getAllLookupStrings()) { + if (matcher.prefixMatches(s)) { + int i = -1; + while (true) { + i = s.indexOf(charTyped, i + 1); + if (i < 0) break; + final String newPrefix = s.substring(0, i + 1); + if (expanded.prefixMatches(newPrefix)) { + lookup.replacePrefix(oldPrefix, newPrefix); + return true; + } + } + } + } + } + return false; + } + public static void finishLookup(final char charTyped, @NotNull final LookupImpl lookup, final Runnable baseChange) { Editor editor = lookup.getEditor(); FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_FINISH_BY_DOT_ETC);