ctrl+enter and ctrl+arrows in lookup features, advertise features in lookups more often

This commit is contained in:
peter
2011-07-12 18:10:10 +02:00
parent b08ab89857
commit a5e4d4472d
13 changed files with 70 additions and 18 deletions
@@ -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());
}
}
@@ -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";
}
@@ -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");
@@ -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;
}
@@ -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();
@@ -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);
}
@@ -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);
}
@@ -34,7 +34,8 @@ import java.util.Set;
id = "other",
file = "$APP_CONFIG$/feature.usage.statistics.xml")})
public class FeatureUsageTrackerImpl extends FeatureUsageTracker implements PersistentStateComponent<Element> {
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<String> result = new ArrayList<String>();
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();
@@ -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
@@ -0,0 +1,12 @@
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/tips.css">
</head>
<body>
<p>
When an autopopup completion is active,
<span class="shortcut">&shortcut:EditorLookupDown;</span> and <span class="shortcut">&shortcut:EditorLookupUp;</span>
will close it and move the caret down or up in the editor
</p>
</body>
</html>
@@ -0,0 +1,9 @@
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/tips.css">
</head>
<body>
<p>
<span class="shortcut">&shortcut:EditorChooseLookupItemAlways;</span> will choose the first item of the autopopup completion when there is no selection there</p>
</body>
</html>
@@ -228,6 +228,18 @@
first-show="5"
successive-show="7"
/>
<feature
id="editing.completion.finishByControlEnter"
tip-file="FinishByControlEnter.html"
min-usage-count="10"
first-show="2"
successive-show="3"/>
<feature
id="editing.completion.cancelByControlArrows"
tip-file="CancelByControlArrows.html"
min-usage-count="10"
first-show="2"
successive-show="3"/>
</group>
<group id="editing">
@@ -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);