From a5e4d4472dfce64eae79af6627d3d935adc46f9d Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 12 Jul 2011 16:43:29 +0200 Subject: [PATCH] ctrl+enter and ctrl+arrows in lookup features, advertise features in lookups more often --- .../completion/CompletionAdvertiser.java | 2 +- .../completion/CodeCompletionFeatures.java | 3 +++ .../CompletionProgressIndicator.java | 6 +++-- .../completion/CompletionUtil.java | 2 +- .../lookup/impl/LookupActionHandler.java | 4 ++++ .../lookup/impl/actions/ChooseItemAction.java | 8 ++++++- .../FeatureUsageTracker.java | 2 ++ .../FeatureUsageTrackerImpl.java | 24 +++++++++---------- .../FeatureStatisticsBundle.properties | 2 ++ .../src/tips/CancelByControlArrows.html | 12 ++++++++++ .../src/tips/FinishByControlEnter.html | 9 +++++++ .../src/ProductivityFeaturesRegistry.xml | 12 ++++++++++ .../completion/XmlCompletionContributor.java | 2 +- 13 files changed, 70 insertions(+), 18 deletions(-) create mode 100644 platform/platform-resources-en/src/tips/CancelByControlArrows.html create mode 100644 platform/platform-resources-en/src/tips/FinishByControlEnter.html diff --git a/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionAdvertiser.java b/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionAdvertiser.java index 99fc5db96189..83b394571837 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionAdvertiser.java +++ b/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionAdvertiser.java @@ -38,7 +38,7 @@ public abstract class CompletionAdvertiser { } protected static boolean shouldShowFeature(final CompletionParameters parameters, final String id) { - return FeatureUsageTracker.getInstance().isToBeShown(id, parameters.getPosition().getProject()); + return FeatureUsageTracker.getInstance().isToBeAdvertisedInLookup(id, parameters.getPosition().getProject()); } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionFeatures.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionFeatures.java index 062c810b19e1..309508330806 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionFeatures.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionFeatures.java @@ -31,4 +31,7 @@ public interface CodeCompletionFeatures { @NonNls String EDITING_COMPLETION_REPLACE = "editing.completion.replace"; @NonNls String EDITING_COMPLETION_FINISH_BY_DOT_ETC = "editing.completion.finishByDotEtc"; @NonNls String EDITING_COMPLETION_FINISH_BY_SMART_ENTER = "editing.completion.finishBySmartEnter"; + + @NonNls String EDITING_COMPLETION_CONTROL_ENTER = "editing.completion.finishByControlEnter"; + @NonNls String EDITING_COMPLETION_CONTROL_ARROWS = "editing.completion.cancelByControlArrows"; } 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 359b4ea5a4d1..5e501e7e8031 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java @@ -24,6 +24,7 @@ import com.intellij.codeInsight.hint.EditorHintListener; import com.intellij.codeInsight.hint.HintManager; import com.intellij.codeInsight.lookup.*; import com.intellij.codeInsight.lookup.impl.LookupImpl; +import com.intellij.featureStatistics.FeatureUsageTracker; import com.intellij.injected.editor.DocumentWindow; import com.intellij.injected.editor.EditorWindow; import com.intellij.lang.Language; @@ -158,12 +159,13 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement if (isAutopopupCompletion()) { if (shouldFocusLookup(myParameters)) { myLookup.setFocused(true); - } else { + } else if (FeatureUsageTracker.getInstance().isToBeAdvertisedInLookup(CodeCompletionFeatures.EDITING_COMPLETION_CONTROL_ENTER, getProject())) { myLookup.addAdvertisement("Press " + CompletionContributor.getActionShortcut(IdeActions.ACTION_CHOOSE_LOOKUP_ITEM_ALWAYS) + " to choose the first suggestion"); } - if (!myEditor.isOneLineMode()) { + 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"); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java index b5f43705feaf..859d24a9b487 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java @@ -140,7 +140,7 @@ public class CompletionUtil { public static boolean shouldShowFeature(final CompletionParameters parameters, @NonNls final String id) { - if (FeatureUsageTracker.getInstance().isToBeShown(id, parameters.getPosition().getProject())) { + if (FeatureUsageTracker.getInstance().isToBeAdvertisedInLookup(id, parameters.getPosition().getProject())) { FeatureUsageTracker.getInstance().triggerFeatureShown(id); return true; } 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 bc800486c36e..edbcc1856b45 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 @@ -16,11 +16,13 @@ package com.intellij.codeInsight.lookup.impl; +import com.intellij.codeInsight.completion.CodeCompletionFeatures; import com.intellij.codeInsight.completion.CompletionProgressIndicator; import com.intellij.codeInsight.completion.impl.CompletionServiceImpl; import com.intellij.codeInsight.lookup.CharFilter; import com.intellij.codeInsight.lookup.Lookup; import com.intellij.codeInsight.lookup.LookupManager; +import com.intellij.featureStatistics.FeatureUsageTracker; import com.intellij.ide.ui.UISettings; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.application.ApplicationManager; @@ -97,6 +99,7 @@ public abstract class LookupActionHandler extends EditorActionHandler { @Override public void actionPerformed(AnActionEvent e) { + FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_CONTROL_ARROWS); LookupImpl lookup = (LookupImpl)LookupManager.getActiveLookup(PlatformDataKeys.EDITOR.getData(e.getDataContext())); assert lookup != null; lookup.hide(); @@ -114,6 +117,7 @@ public abstract class LookupActionHandler extends EditorActionHandler { @Override public void actionPerformed(AnActionEvent e) { + FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_CONTROL_ARROWS); LookupImpl lookup = (LookupImpl)LookupManager.getActiveLookup(PlatformDataKeys.EDITOR.getData(e.getDataContext())); assert lookup != null; lookup.hide(); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/actions/ChooseItemAction.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/actions/ChooseItemAction.java index bf893de19811..829eee4ccaad 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/actions/ChooseItemAction.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/actions/ChooseItemAction.java @@ -16,9 +16,11 @@ package com.intellij.codeInsight.lookup.impl.actions; +import com.intellij.codeInsight.completion.CodeCompletionFeatures; import com.intellij.codeInsight.lookup.Lookup; import com.intellij.codeInsight.lookup.LookupManager; import com.intellij.codeInsight.lookup.impl.LookupImpl; +import com.intellij.featureStatistics.FeatureUsageTracker; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.actionSystem.EditorAction; @@ -49,7 +51,11 @@ public abstract class ChooseItemAction extends EditorAction { } public void execute(@NotNull final Editor editor, final DataContext dataContext) { - getLookup(editor).finishLookup(Lookup.NORMAL_SELECT_CHAR); + LookupImpl lookup = getLookup(editor); + if (!lookup.isFocused()) { + FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_CONTROL_ENTER); + } + lookup.finishLookup(Lookup.NORMAL_SELECT_CHAR); } diff --git a/platform/platform-api/src/com/intellij/featureStatistics/FeatureUsageTracker.java b/platform/platform-api/src/com/intellij/featureStatistics/FeatureUsageTracker.java index 703af36a9597..0aa2b966f898 100644 --- a/platform/platform-api/src/com/intellij/featureStatistics/FeatureUsageTracker.java +++ b/platform/platform-api/src/com/intellij/featureStatistics/FeatureUsageTracker.java @@ -36,4 +36,6 @@ public abstract class FeatureUsageTracker { public abstract void triggerFeatureShown(@NonNls String featureId); public abstract boolean isToBeShown(@NonNls String featureId, Project project); + + public abstract boolean isToBeAdvertisedInLookup(@NonNls String featureId, Project project); } diff --git a/platform/platform-impl/src/com/intellij/featureStatistics/FeatureUsageTrackerImpl.java b/platform/platform-impl/src/com/intellij/featureStatistics/FeatureUsageTrackerImpl.java index 5da8396ae8af..3cc76b37d269 100644 --- a/platform/platform-impl/src/com/intellij/featureStatistics/FeatureUsageTrackerImpl.java +++ b/platform/platform-impl/src/com/intellij/featureStatistics/FeatureUsageTrackerImpl.java @@ -34,7 +34,8 @@ import java.util.Set; id = "other", file = "$APP_CONFIG$/feature.usage.statistics.xml")}) public class FeatureUsageTrackerImpl extends FeatureUsageTracker implements PersistentStateComponent { - private static final long DAY = 1000 * 60 * 60 * 24; + private static final int HOUR = 1000 * 60 * 60; + private static final long DAY = HOUR * 24; private long FIRST_RUN_TIME = 0; boolean HAVE_BEEN_SHOWN = false; @@ -51,17 +52,11 @@ public class FeatureUsageTrackerImpl extends FeatureUsageTracker implements Pers myRegistry = productivityFeaturesRegistry; } - String[] getFeaturesToShow(Project project) { - List result = new ArrayList(); - for (String id : ProductivityFeaturesRegistry.getInstance().getFeatureIds()) { - if (isToBeShown(id, project)) { - result.add(id); - } - } - return ArrayUtil.toStringArray(result); + public boolean isToBeShown(String featureId, Project project) { + return isToBeShown(featureId, project, DAY); } - public boolean isToBeShown(String featureId, Project project) { + private boolean isToBeShown(String featureId, Project project, final long timeUnit) { ProductivityFeaturesRegistry registry = ProductivityFeaturesRegistry.getInstance(); FeatureDescriptor descriptor = registry.getFeatureDescriptor(featureId); if (descriptor == null || !descriptor.isUnused()) return false; @@ -81,14 +76,19 @@ public class FeatureUsageTrackerImpl extends FeatureUsageTracker implements Pers } long current = System.currentTimeMillis(); - long succesive_interval = descriptor.getDaysBetweenSuccesiveShowUps() * DAY + descriptor.getShownCount() * 2; - long firstShowUpInterval = descriptor.getDaysBeforeFirstShowUp() * DAY; + long succesive_interval = descriptor.getDaysBetweenSuccesiveShowUps() * timeUnit + descriptor.getShownCount() * 2; + long firstShowUpInterval = descriptor.getDaysBeforeFirstShowUp() * timeUnit; long lastTimeUsed = descriptor.getLastTimeUsed(); long lastTimeShown = descriptor.getLastTimeShown(); return lastTimeShown == 0 && firstShowUpInterval + getFirstRunTime() < current || lastTimeShown > 0 && current - lastTimeShown > succesive_interval && current - lastTimeUsed > succesive_interval; } + @Override + public boolean isToBeAdvertisedInLookup(@NonNls String featureId, Project project) { + return isToBeShown(featureId, project, HOUR); + } + public long getFirstRunTime() { if (FIRST_RUN_TIME == 0) { FIRST_RUN_TIME = System.currentTimeMillis(); diff --git a/platform/platform-resources-en/src/messages/FeatureStatisticsBundle.properties b/platform/platform-resources-en/src/messages/FeatureStatisticsBundle.properties index 51a5a165193b..e2e5f8de5d15 100644 --- a/platform/platform-resources-en/src/messages/FeatureStatisticsBundle.properties +++ b/platform/platform-resources-en/src/messages/FeatureStatisticsBundle.properties @@ -56,6 +56,8 @@ editing.completion.finishByDotEtc=Finish lookup by special characters editing.completion.finishByExclamation=Finish lookup by exclamation mark editing.completion.finishBySmartEnter=Finish lookup by smart enter editing.completion.camelHumps=Camel prefixes in code completion +editing.completion.finishByControlEnter=Finish lookup even when non-focused +editing.completion.cancelByControlArrows=Cancel lookup and move caret up/down in the editor editing.select.word=Syntax aware selection editing.incremental.search=Editor incremental search codeassists.quickjavadoc=Quick Documentation popup diff --git a/platform/platform-resources-en/src/tips/CancelByControlArrows.html b/platform/platform-resources-en/src/tips/CancelByControlArrows.html new file mode 100644 index 000000000000..7b49c81b7b14 --- /dev/null +++ b/platform/platform-resources-en/src/tips/CancelByControlArrows.html @@ -0,0 +1,12 @@ + + + + + +

+ When an autopopup completion is active, + &shortcut:EditorLookupDown; and &shortcut:EditorLookupUp; + will close it and move the caret down or up in the editor +

+ + diff --git a/platform/platform-resources-en/src/tips/FinishByControlEnter.html b/platform/platform-resources-en/src/tips/FinishByControlEnter.html new file mode 100644 index 000000000000..dff26f046697 --- /dev/null +++ b/platform/platform-resources-en/src/tips/FinishByControlEnter.html @@ -0,0 +1,9 @@ + + + + + +

+ &shortcut:EditorChooseLookupItemAlways; will choose the first item of the autopopup completion when there is no selection there

+ + diff --git a/resources/src/ProductivityFeaturesRegistry.xml b/resources/src/ProductivityFeaturesRegistry.xml index 5abe2c063c29..6dd2f3c42a7e 100644 --- a/resources/src/ProductivityFeaturesRegistry.xml +++ b/resources/src/ProductivityFeaturesRegistry.xml @@ -228,6 +228,18 @@ first-show="5" successive-show="7" /> + + diff --git a/xml/impl/src/com/intellij/codeInsight/completion/XmlCompletionContributor.java b/xml/impl/src/com/intellij/codeInsight/completion/XmlCompletionContributor.java index a31b0cf0cb38..5e1c167394e0 100644 --- a/xml/impl/src/com/intellij/codeInsight/completion/XmlCompletionContributor.java +++ b/xml/impl/src/com/intellij/codeInsight/completion/XmlCompletionContributor.java @@ -187,7 +187,7 @@ public class XmlCompletionContributor extends CompletionContributor { @Override public String advertise(@NotNull final CompletionParameters parameters) { if (isXmlNameCompletion(parameters) && parameters.getCompletionType() == CompletionType.BASIC) { - if (FeatureUsageTracker.getInstance().isToBeShown(TAG_NAME_COMPLETION_FEATURE, parameters.getPosition().getProject())) { + if (FeatureUsageTracker.getInstance().isToBeAdvertisedInLookup(TAG_NAME_COMPLETION_FEATURE, parameters.getPosition().getProject())) { final String shortcut = getActionShortcut(IdeActions.ACTION_CLASS_NAME_COMPLETION); if (shortcut != null) { return XmlBundle.message("tag.name.completion.hint", shortcut);