mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
ctrl+enter and ctrl+arrows in lookup features, advertise features in lookups more often
This commit is contained in:
@@ -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";
|
||||
}
|
||||
|
||||
+4
-2
@@ -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();
|
||||
|
||||
+7
-1
@@ -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);
|
||||
}
|
||||
|
||||
+12
-12
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user