From d6f2228a46f69131cbd88cd91e0d3d8ccd570b4c Mon Sep 17 00:00:00 2001 From: "Dmitry.Krasilschikov" Date: Mon, 14 May 2018 13:41:14 +0300 Subject: [PATCH 01/24] UX-157 IJP-56 replace RunAnythingStringValue with String --- .../RunAnythingCommandExecutionProvider.java | 6 ++--- ...nAnythingCommandExecutionProviderBase.java | 12 +++++----- .../RunAnythingCompletionStringProvider.java | 4 ++-- .../RunAnythingRecentCommandProvider.java | 14 +++++------- .../activity/RunAnythingStringValue.java | 22 ------------------- 5 files changed, 16 insertions(+), 42 deletions(-) delete mode 100644 platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingStringValue.java diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProvider.java index 9e20842060a0..dfa02e2aef9c 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProvider.java @@ -6,11 +6,11 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class RunAnythingCommandExecutionProvider extends RunAnythingCommandExecutionProviderBase - implements RunAnythingActivityProvider { + implements RunAnythingActivityProvider { @Nullable @Override - public RunAnythingStringValue findMatchingValue(@NotNull DataContext dataContext, @NotNull String pattern) { - return RunAnythingStringValue.create(pattern); + public String findMatchingValue(@NotNull DataContext dataContext, @NotNull String pattern) { + return pattern; } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProviderBase.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProviderBase.java index d7f54af33e58..799bf0c9b58e 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProviderBase.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProviderBase.java @@ -28,17 +28,17 @@ import java.util.Collection; import static com.intellij.ide.actions.runAnything.RunAnythingUtil.AD_CONTEXT_TEXT; import static com.intellij.ide.actions.runAnything.RunAnythingUtil.AD_DEBUG_TEXT; -public abstract class RunAnythingCommandExecutionProviderBase implements RunAnythingActivityProvider { +public abstract class RunAnythingCommandExecutionProviderBase implements RunAnythingActivityProvider { public final String AD_DELETE_COMMAND_TEXT = IdeBundle.message("run.anything.ad.command.delete", KeymapUtil.getShortcutText(KeyboardShortcut.fromString("shift BACK_SPACE"))); - public void execute(@NotNull DataContext dataContext, @NotNull RunAnythingStringValue value) { + public void execute(@NotNull DataContext dataContext, @NotNull String value) { VirtualFile workDirectory = dataContext.getData(CommonDataKeys.VIRTUAL_FILE); Executor executor = dataContext.getData(RunAnythingAction.EXECUTOR_KEY); RunAnythingUtil.LOG.assertTrue(workDirectory != null); RunAnythingUtil.LOG.assertTrue(executor != null); - runCommand(workDirectory, value.getDelegate(), executor, dataContext); + runCommand(workDirectory, value, executor, dataContext); } public static void runCommand(@NotNull VirtualFile workDirectory, @@ -76,13 +76,13 @@ public abstract class RunAnythingCommandExecutionProviderBase implements RunAnyt @NotNull @Override - public String getCommand(@NotNull RunAnythingStringValue value) { - return value.getDelegate(); + public String getCommand(@NotNull String value) { + return value; } @Nullable @Override - public Icon getIcon(@NotNull RunAnythingStringValue value) { + public Icon getIcon(@NotNull String value) { return AllIcons.Actions.Run_anything; } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCompletionStringProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCompletionStringProvider.java index 953313175a8b..635984082cc1 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCompletionStringProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCompletionStringProvider.java @@ -7,10 +7,10 @@ import com.intellij.openapi.actionSystem.DataContext; import org.jetbrains.annotations.NotNull; public interface RunAnythingCompletionStringProvider - extends RunAnythingCompletionProvider, RunAnythingActivityProvider { + extends RunAnythingCompletionProvider, RunAnythingActivityProvider { @NotNull @Override - default RunAnythingItem getMainListItem(@NotNull DataContext dataContext, @NotNull RunAnythingStringValue value) { + default RunAnythingItem getMainListItem(@NotNull DataContext dataContext, @NotNull String value) { return new RunAnythingItemBase(getCommand(value), getIcon(value)); } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentCommandProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentCommandProvider.java index 2b80ff166939..925bd3e75e1e 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentCommandProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentCommandProvider.java @@ -8,25 +8,21 @@ import com.intellij.openapi.actionSystem.DataContext; import org.jetbrains.annotations.NotNull; import java.util.Collection; -import java.util.stream.Collectors; import static com.intellij.ide.actions.runAnything.RunAnythingUtil.fetchProject; public class RunAnythingRecentCommandProvider extends RunAnythingCommandExecutionProviderBase - implements RunAnythingRecentProvider, RunAnythingMultiParametrizedExecutionProvider { + implements RunAnythingRecentProvider, RunAnythingMultiParametrizedExecutionProvider { @NotNull @Override - public RunAnythingItem getMainListItem(@NotNull DataContext dataContext, @NotNull RunAnythingStringValue value) { - return new RunAnythingItemBase(value.getDelegate(), getIcon(value)); + public RunAnythingItem getMainListItem(@NotNull DataContext dataContext, @NotNull String value) { + return new RunAnythingItemBase(value, getIcon(value)); } @NotNull @Override - public Collection getValues(@NotNull DataContext dataContext) { - return RunAnythingCache.getInstance(fetchProject(dataContext)).getState().getCommands() - .stream() - .map(value -> RunAnythingStringValue.create(value)) - .collect(Collectors.toList()); + public Collection getValues(@NotNull DataContext dataContext) { + return RunAnythingCache.getInstance(fetchProject(dataContext)).getState().getCommands(); } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingStringValue.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingStringValue.java deleted file mode 100644 index e958dabc2647..000000000000 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingStringValue.java +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.ide.actions.runAnything.activity; - -import org.jetbrains.annotations.NotNull; - -public class RunAnythingStringValue { - @NotNull private final String myDelegate; - - private RunAnythingStringValue(@NotNull String delegate) { - myDelegate = delegate; - } - - @NotNull - public static RunAnythingStringValue create(@NotNull String string) { - return new RunAnythingStringValue(string); - } - - @NotNull - public String getDelegate() { - return myDelegate; - } -} \ No newline at end of file From d1beca0a189c2fecb77082787819e3a856c3b629 Mon Sep 17 00:00:00 2001 From: "Dmitry.Krasilschikov" Date: Mon, 14 May 2018 14:07:50 +0300 Subject: [PATCH 02/24] UX-157 IJP-56 make all generators `recent` --- .../RunAnythingRunConfigurationProvider.java | 11 +---------- .../RunAnythingActionCompletionRecentProvider.java | 3 +-- .../activity/RunAnythingActionExecutionProvider.java | 3 +-- .../activity/RunAnythingActivityProvider.java | 4 ++++ .../RunAnythingCommandExecutionProviderBase.java | 8 ++++++++ .../activity/RunAnythingCompletionProvider.java | 3 +-- .../activity/RunAnythingMainListItemProvider.java | 11 ----------- .../activity/RunAnythingRecentCommandProvider.java | 10 +--------- .../activity/RunAnythingRecentProvider.java | 6 ------ ...RunAnythingRunConfigurationExecutionProvider.java | 7 +++++++ .../runAnything/groups/RunAnythingRecentGroup.java | 12 +----------- 11 files changed, 25 insertions(+), 53 deletions(-) delete mode 100644 platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingMainListItemProvider.java delete mode 100644 platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentProvider.java diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingRunConfigurationProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingRunConfigurationProvider.java index 18a25f0464bc..5a1fb8b66fb1 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingRunConfigurationProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingRunConfigurationProvider.java @@ -7,9 +7,7 @@ import com.intellij.execution.actions.ChooseRunConfigurationPopup; import com.intellij.execution.actions.ExecutorProvider; import com.intellij.ide.IdeBundle; import com.intellij.ide.actions.runAnything.activity.RunAnythingCompletionProvider; -import com.intellij.ide.actions.runAnything.activity.RunAnythingRecentProvider; import com.intellij.ide.actions.runAnything.activity.RunAnythingRunConfigurationExecutionProvider; -import com.intellij.ide.actions.runAnything.items.RunAnythingItem; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.ToolWindowId; @@ -21,20 +19,13 @@ import java.util.Collection; import static com.intellij.ide.actions.runAnything.RunAnythingUtil.fetchProject; public class RunAnythingRunConfigurationProvider extends RunAnythingRunConfigurationExecutionProvider - implements RunAnythingRecentProvider, - RunAnythingCompletionProvider { + implements RunAnythingCompletionProvider { @NotNull @Override public Collection getValues(@NotNull DataContext dataContext) { return Arrays.asList(getWrappers(dataContext)); } - @NotNull - @Override - public RunAnythingItem getMainListItem(@NotNull DataContext dataContext, @NotNull ChooseRunConfigurationPopup.ItemWrapper value) { - return new RunAnythingRunConfigurationItem(value, value.getIcon()); - } - @NotNull @Override public String getGroupTitle() { diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionCompletionRecentProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionCompletionRecentProvider.java index 6d415817bed1..1003473241e4 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionCompletionRecentProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionCompletionRecentProvider.java @@ -4,6 +4,5 @@ package com.intellij.ide.actions.runAnything.activity; import com.intellij.openapi.actionSystem.AnAction; public abstract class RunAnythingActionCompletionRecentProvider extends RunAnythingActionExecutionProvider - implements RunAnythingMultiParametrizedExecutionProvider, RunAnythingRecentProvider, RunAnythingCompletionProvider, - RunAnythingHelpProviderBase { + implements RunAnythingCompletionProvider, RunAnythingHelpProviderBase { } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionExecutionProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionExecutionProvider.java index 59ded762d438..ab80c7e3fa58 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionExecutionProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionExecutionProvider.java @@ -18,8 +18,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; -public abstract class RunAnythingActionExecutionProvider - implements RunAnythingActivityProvider, RunAnythingRecentProvider { +public abstract class RunAnythingActionExecutionProvider implements RunAnythingActivityProvider { @NotNull @Override diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActivityProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActivityProvider.java index 0209896fa0cf..0330a87cf3a7 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActivityProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActivityProvider.java @@ -2,6 +2,7 @@ package com.intellij.ide.actions.runAnything.activity; import com.intellij.ide.actions.runAnything.RunAnythingCache; +import com.intellij.ide.actions.runAnything.items.RunAnythingItem; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.module.Module; @@ -47,6 +48,9 @@ public interface RunAnythingActivityProvider { return null; } + @NotNull + RunAnythingItem getMainListItem(@NotNull DataContext dataContext, @NotNull V value); + /** * Finds provider that matches {@code pattern} * diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProviderBase.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProviderBase.java index 799bf0c9b58e..59e801fbbaf3 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProviderBase.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProviderBase.java @@ -12,6 +12,8 @@ import com.intellij.ide.actions.runAnything.RunAnythingCache; import com.intellij.ide.actions.runAnything.RunAnythingUtil; import com.intellij.ide.actions.runAnything.commands.RunAnythingCommandCustomizer; import com.intellij.ide.actions.runAnything.execution.RunAnythingRunProfile; +import com.intellij.ide.actions.runAnything.items.RunAnythingItem; +import com.intellij.ide.actions.runAnything.items.RunAnythingItemBase; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.KeyboardShortcut; @@ -85,4 +87,10 @@ public abstract class RunAnythingCommandExecutionProviderBase implements RunAnyt public Icon getIcon(@NotNull String value) { return AllIcons.Actions.Run_anything; } + + @NotNull + @Override + public RunAnythingItem getMainListItem(@NotNull DataContext dataContext, @NotNull String value) { + return new RunAnythingItemBase(value, getIcon(value)); + } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCompletionProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCompletionProvider.java index cd79ae732263..234ded91cf90 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCompletionProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCompletionProvider.java @@ -9,8 +9,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.stream.Collectors; -public interface RunAnythingCompletionProvider - extends RunAnythingMultiParametrizedExecutionProvider, RunAnythingMainListItemProvider { +public interface RunAnythingCompletionProvider extends RunAnythingMultiParametrizedExecutionProvider { @NotNull String getGroupTitle(); diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingMainListItemProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingMainListItemProvider.java deleted file mode 100644 index b46f2837e9d0..000000000000 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingMainListItemProvider.java +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.ide.actions.runAnything.activity; - -import com.intellij.ide.actions.runAnything.items.RunAnythingItem; -import com.intellij.openapi.actionSystem.DataContext; -import org.jetbrains.annotations.NotNull; - -public interface RunAnythingMainListItemProvider { - @NotNull - RunAnythingItem getMainListItem(@NotNull DataContext dataContext, @NotNull V value); -} diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentCommandProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentCommandProvider.java index 925bd3e75e1e..ef1f696d3eff 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentCommandProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentCommandProvider.java @@ -2,8 +2,6 @@ package com.intellij.ide.actions.runAnything.activity; import com.intellij.ide.actions.runAnything.RunAnythingCache; -import com.intellij.ide.actions.runAnything.items.RunAnythingItem; -import com.intellij.ide.actions.runAnything.items.RunAnythingItemBase; import com.intellij.openapi.actionSystem.DataContext; import org.jetbrains.annotations.NotNull; @@ -12,13 +10,7 @@ import java.util.Collection; import static com.intellij.ide.actions.runAnything.RunAnythingUtil.fetchProject; public class RunAnythingRecentCommandProvider extends RunAnythingCommandExecutionProviderBase - implements RunAnythingRecentProvider, RunAnythingMultiParametrizedExecutionProvider { - - @NotNull - @Override - public RunAnythingItem getMainListItem(@NotNull DataContext dataContext, @NotNull String value) { - return new RunAnythingItemBase(value, getIcon(value)); - } + implements RunAnythingMultiParametrizedExecutionProvider { @NotNull @Override diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentProvider.java deleted file mode 100644 index c80a205cb5d6..000000000000 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentProvider.java +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.ide.actions.runAnything.activity; - -public interface RunAnythingRecentProvider extends RunAnythingActivityProvider, RunAnythingMainListItemProvider { - -} \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRunConfigurationExecutionProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRunConfigurationExecutionProvider.java index 94469da3813f..97d9a8167ec4 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRunConfigurationExecutionProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRunConfigurationExecutionProvider.java @@ -8,6 +8,7 @@ import com.intellij.execution.RunnerAndConfigurationSettings; import com.intellij.execution.actions.ChooseRunConfigurationPopup; import com.intellij.execution.runners.ExecutionUtil; import com.intellij.ide.actions.runAnything.RunAnythingRunConfigurationItem; +import com.intellij.ide.actions.runAnything.items.RunAnythingItem; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; @@ -57,4 +58,10 @@ public abstract class RunAnythingRunConfigurationExecutionProvider public String getAdText() { return RunAnythingRunConfigurationItem.RUN_CONFIGURATION_AD_TEXT; } + + @NotNull + @Override + public RunAnythingItem getMainListItem(@NotNull DataContext dataContext, @NotNull ChooseRunConfigurationPopup.ItemWrapper value) { + return new RunAnythingRunConfigurationItem(value, value.getIcon()); + } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingRecentGroup.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingRecentGroup.java index 135970a20832..889c4297b8c8 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingRecentGroup.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingRecentGroup.java @@ -4,18 +4,14 @@ package com.intellij.ide.actions.runAnything.groups; import com.intellij.ide.IdeBundle; import com.intellij.ide.actions.runAnything.RunAnythingCache; import com.intellij.ide.actions.runAnything.activity.RunAnythingActivityProvider; -import com.intellij.ide.actions.runAnything.activity.RunAnythingRecentProvider; import com.intellij.ide.actions.runAnything.items.RunAnythingItem; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.project.Project; import com.intellij.util.containers.ContainerUtil; -import one.util.streamex.StreamEx; import org.jetbrains.annotations.NotNull; import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; public class RunAnythingRecentGroup extends RunAnythingGroupBase { public static final RunAnythingRecentGroup INSTANCE = new RunAnythingRecentGroup(); @@ -36,7 +32,7 @@ public class RunAnythingRecentGroup extends RunAnythingGroupBase { Collection collector = ContainerUtil.newArrayList(); for (String command : ContainerUtil.iterateBackward(RunAnythingCache.getInstance(project).getState().getCommands())) { - for (RunAnythingRecentProvider provider : getProviders()) { + for (RunAnythingActivityProvider provider : RunAnythingActivityProvider.EP_NAME.getExtensions()) { Object matchingValue = provider.findMatchingValue(dataContext, command); if (matchingValue != null) { //noinspection unchecked @@ -49,12 +45,6 @@ public class RunAnythingRecentGroup extends RunAnythingGroupBase { return collector; } - private static List getProviders() { - return StreamEx.of(RunAnythingActivityProvider.EP_NAME.getExtensions()) - .select(RunAnythingRecentProvider.class) - .collect(Collectors.toList()); - } - @Override protected int getMaxInitialItems() { return 15; From dc7b17804048340f3bc2448326e1d8be87d61bcf Mon Sep 17 00:00:00 2001 From: "Dmitry.Krasilschikov" Date: Mon, 14 May 2018 14:35:16 +0300 Subject: [PATCH 03/24] UX-157 IJP-56 merge help provider into main provider --- .../activity/RunAnythingActivityProvider.java | 8 +++++- .../activity/RunAnythingHelpProvider.java | 28 ------------------- .../activity/RunAnythingHelpProviderBase.java | 21 +++++++++++--- ...ythingMatchedRunConfigurationProvider.java | 2 +- .../groups/RecentProjectHelpGroup.java | 3 +- .../groups/RunAnythingHelpGroup.java | 6 ++-- 6 files changed, 30 insertions(+), 38 deletions(-) delete mode 100644 platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingHelpProvider.java diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActivityProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActivityProvider.java index 0330a87cf3a7..c9ee34857301 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActivityProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActivityProvider.java @@ -2,6 +2,7 @@ package com.intellij.ide.actions.runAnything.activity; import com.intellij.ide.actions.runAnything.RunAnythingCache; +import com.intellij.ide.actions.runAnything.items.RunAnythingHelpItem; import com.intellij.ide.actions.runAnything.items.RunAnythingItem; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.extensions.ExtensionPointName; @@ -30,7 +31,7 @@ public interface RunAnythingActivityProvider { * Executes arbitrary activity in IDE if {@code pattern} is matched as {@link #isMatching(DataContext, String)} * * @param dataContext 'Run Anything' action {@code dataContext}, may retrieve {@link Project} and {@link Module} from here - * @param value matching value + * @param value matching value * @return true if succeed, false is failed */ void execute(@NotNull DataContext dataContext, @NotNull V value); @@ -51,6 +52,11 @@ public interface RunAnythingActivityProvider { @NotNull RunAnythingItem getMainListItem(@NotNull DataContext dataContext, @NotNull V value); + @Nullable + default RunAnythingHelpItem getHelpItem(@NotNull DataContext dataContext) { + return null; + } + /** * Finds provider that matches {@code pattern} * diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingHelpProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingHelpProvider.java deleted file mode 100644 index b437f2d76b4c..000000000000 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingHelpProvider.java +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.ide.actions.runAnything.activity; - -import com.intellij.ide.actions.runAnything.items.RunAnythingItem; -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.util.ui.EmptyIcon; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import javax.swing.*; - -public interface RunAnythingHelpProvider extends RunAnythingActivityProvider { - @NotNull - RunAnythingItem getHelpItem(@NotNull DataContext dataContext); - - @NotNull - String getHelpCommandPlaceholder(); - - @Nullable - default String getHelpDescription() { - return null; - } - - @Nullable - default Icon getIcon() { - return EmptyIcon.ICON_16; - } -} \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingHelpProviderBase.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingHelpProviderBase.java index 4fe17dc6f75c..19234667cc9e 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingHelpProviderBase.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingHelpProviderBase.java @@ -4,19 +4,32 @@ package com.intellij.ide.actions.runAnything.activity; import com.intellij.ide.actions.runAnything.items.RunAnythingHelpItem; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.util.ui.EmptyIcon; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -public interface RunAnythingHelpProviderBase extends RunAnythingHelpProvider { +import javax.swing.*; + +public interface RunAnythingHelpProviderBase extends RunAnythingActivityProvider { Logger LOG = Logger.getInstance(RunAnythingHelpProviderBase.class); - @NotNull + @Nullable @Override default RunAnythingHelpItem getHelpItem(@NotNull DataContext dataContext) { - return new RunAnythingHelpItem(getHelpCommandPlaceholder(), getCommandPrefix(), getHelpDescription(), getIcon()); + return new RunAnythingHelpItem(getHelpCommandPlaceholder(), getCommandPrefix(), getHelpDescription(), getHelpIcon()); + } + + @Nullable + default Icon getHelpIcon() { + return EmptyIcon.ICON_16; + } + + @Nullable + default String getHelpDescription() { + return null; } @NotNull - @Override default String getHelpCommandPlaceholder() { return getCommandPrefix(); } diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingMatchedRunConfigurationProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingMatchedRunConfigurationProvider.java index b4cd8ea6d29d..ccc1419b703c 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingMatchedRunConfigurationProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingMatchedRunConfigurationProvider.java @@ -32,7 +32,7 @@ public abstract class RunAnythingMatchedRunConfigurationProvider extends RunAnyt public abstract ConfigurationFactory getConfigurationFactory(); @Override - public Icon getIcon() { + public Icon getHelpIcon() { return getConfigurationFactory().getIcon(); } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RecentProjectHelpGroup.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RecentProjectHelpGroup.java index a74305e1ea15..846d4daef724 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RecentProjectHelpGroup.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RecentProjectHelpGroup.java @@ -3,7 +3,6 @@ package com.intellij.ide.actions.runAnything.groups; import com.intellij.ide.IdeBundle; import com.intellij.ide.actions.runAnything.activity.RunAnythingActivityProvider; -import com.intellij.ide.actions.runAnything.activity.RunAnythingHelpProvider; import com.intellij.ide.actions.runAnything.activity.RunAnythingRecentProjectProvider; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -19,7 +18,7 @@ public class RecentProjectHelpGroup extends RunAnythingHelpGroup { @NotNull @Override - public Collection getProviders() { + public Collection getProviders() { return ContainerUtil.immutableSingletonList(RunAnythingActivityProvider.EP_NAME.findExtension(RunAnythingRecentProjectProvider.class)); } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingHelpGroup.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingHelpGroup.java index bae66bf00355..680d894f05b9 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingHelpGroup.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingHelpGroup.java @@ -1,7 +1,7 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide.actions.runAnything.groups; -import com.intellij.ide.actions.runAnything.activity.RunAnythingHelpProvider; +import com.intellij.ide.actions.runAnything.activity.RunAnythingActivityProvider; import com.intellij.ide.actions.runAnything.items.RunAnythingItem; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.extensions.ExtensionPointName; @@ -9,9 +9,10 @@ import org.jetbrains.annotations.NotNull; import java.util.Arrays; import java.util.Collection; +import java.util.Objects; import java.util.stream.Collectors; -public abstract class RunAnythingHelpGroup

+public abstract class RunAnythingHelpGroup

extends RunAnythingGroupBase { public static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.runAnything.helpGroup"); public static final Collection HELP_GROUPS = Arrays.asList(EP_NAME.getExtensions()); @@ -25,6 +26,7 @@ public abstract class RunAnythingHelpGroup

return getProviders() .stream() .map(provider -> provider.getHelpItem(dataContext)) + .filter(Objects::nonNull) .collect(Collectors.toList()); } } \ No newline at end of file From 83815a879811c929b2f8c4691143b802d108620b Mon Sep 17 00:00:00 2001 From: "Dmitry.Krasilschikov" Date: Mon, 14 May 2018 14:48:00 +0300 Subject: [PATCH 04/24] UX-157 IJP-56 simplify classes hierarchy --- .../RunAnythingActionCompletionRecentProvider.java | 8 -------- .../activity/RunAnythingActionExecutionProvider.java | 3 +-- .../activity/RunAnythingActionHelpProvider.java | 8 -------- .../runAnything/activity/RunAnythingHelpProviderBase.java | 3 --- .../activity/RunAnythingRecentProjectProvider.java | 3 ++- 5 files changed, 3 insertions(+), 22 deletions(-) delete mode 100644 platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionCompletionRecentProvider.java delete mode 100644 platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionHelpProvider.java diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionCompletionRecentProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionCompletionRecentProvider.java deleted file mode 100644 index 1003473241e4..000000000000 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionCompletionRecentProvider.java +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.ide.actions.runAnything.activity; - -import com.intellij.openapi.actionSystem.AnAction; - -public abstract class RunAnythingActionCompletionRecentProvider extends RunAnythingActionExecutionProvider - implements RunAnythingCompletionProvider, RunAnythingHelpProviderBase { -} \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionExecutionProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionExecutionProvider.java index ab80c7e3fa58..7b9f9619ed48 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionExecutionProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionExecutionProvider.java @@ -18,8 +18,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; -public abstract class RunAnythingActionExecutionProvider implements RunAnythingActivityProvider { - +public abstract class RunAnythingActionExecutionProvider implements RunAnythingHelpProviderBase { @NotNull @Override public RunAnythingItem getMainListItem(@NotNull DataContext dataContext, @NotNull V value) { diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionHelpProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionHelpProvider.java deleted file mode 100644 index fd1cb5bbb998..000000000000 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionHelpProvider.java +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.ide.actions.runAnything.activity; - -import com.intellij.openapi.actionSystem.AnAction; - -public abstract class RunAnythingActionHelpProvider extends RunAnythingActionExecutionProvider - implements RunAnythingHelpProviderBase, RunAnythingActivityProvider { -} \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingHelpProviderBase.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingHelpProviderBase.java index 19234667cc9e..e4f675b3c220 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingHelpProviderBase.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingHelpProviderBase.java @@ -3,7 +3,6 @@ package com.intellij.ide.actions.runAnything.activity; import com.intellij.ide.actions.runAnything.items.RunAnythingHelpItem; import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.util.ui.EmptyIcon; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -11,8 +10,6 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; public interface RunAnythingHelpProviderBase extends RunAnythingActivityProvider { - Logger LOG = Logger.getInstance(RunAnythingHelpProviderBase.class); - @Nullable @Override default RunAnythingHelpItem getHelpItem(@NotNull DataContext dataContext) { diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentProjectProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentProjectProvider.java index ff717213bee3..25f1ca23e8c3 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentProjectProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentProjectProvider.java @@ -12,7 +12,8 @@ import java.util.Arrays; import java.util.Collection; import java.util.stream.Collectors; -public class RunAnythingRecentProjectProvider extends RunAnythingActionCompletionRecentProvider { +public class RunAnythingRecentProjectProvider extends RunAnythingActionExecutionProvider + implements RunAnythingCompletionProvider { @NotNull @Override public Collection getValues(@NotNull DataContext dataContext) { From ea71dc5b322be2d914650ccd167ec3594eb8543c Mon Sep 17 00:00:00 2001 From: "Dmitry.Krasilschikov" Date: Mon, 14 May 2018 14:59:51 +0300 Subject: [PATCH 05/24] UX-157 IJP-56 main/help models refactoring --- .../runAnything/RunAnythingAction.java | 11 +++--- .../RunAnythingSearchListModel.java | 29 +++++++++++---- .../groups/RunAnythingHelpGroup.java | 2 -- .../ui/RunAnythingHelpListModel.java | 35 ++++--------------- .../ui/RunAnythingMainListModel.java | 34 ++---------------- 5 files changed, 37 insertions(+), 74 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingAction.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingAction.java index 372cf83aa306..b77c44fb051c 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingAction.java @@ -14,7 +14,6 @@ import com.intellij.ide.IdeTooltipManager; import com.intellij.ide.actions.runAnything.activity.RunAnythingActivityProvider; import com.intellij.ide.actions.runAnything.groups.RunAnythingCompletionProviderGroup; import com.intellij.ide.actions.runAnything.groups.RunAnythingGroup; -import com.intellij.ide.actions.runAnything.groups.RunAnythingHelpGroup; import com.intellij.ide.actions.runAnything.groups.RunAnythingRecentGroup; import com.intellij.ide.actions.runAnything.items.RunAnythingItem; import com.intellij.ide.actions.runAnything.ui.RunAnythingHelpListModel; @@ -1070,7 +1069,7 @@ public class RunAnythingAction extends AnAction implements CustomComponentAction } if (isHelpMode(myPopupField.getText())) { - buildHelpGroups(); + buildHelpGroups(myListModel); return; } @@ -1101,8 +1100,8 @@ public class RunAnythingAction extends AnAction implements CustomComponentAction updatePopup(); } - private void buildHelpGroups() { - RunAnythingHelpGroup.HELP_GROUPS.forEach(group -> { + private void buildHelpGroups(@NotNull RunAnythingSearchListModel listModel) { + listModel.getGroups().forEach(group -> { group.collectItems(myDataContext, myListModel, trimHelpPattern(), () -> check()); check(); }); @@ -1136,8 +1135,8 @@ public class RunAnythingAction extends AnAction implements CustomComponentAction private void buildCompletionGroups(@NotNull String pattern, @NotNull Runnable checkCancellation) { LOG.assertTrue(myListModel instanceof RunAnythingMainListModel); - ((RunAnythingMainListModel)myListModel) - .getMainListGroups() + myListModel + .getGroups() .stream() .filter(group -> !(group instanceof RunAnythingCompletionProviderGroup) || ((RunAnythingCompletionProviderGroup)group).isVisible(myDataContext)) diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingSearchListModel.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingSearchListModel.java index eefc85cd420d..871ff0b111db 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingSearchListModel.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingSearchListModel.java @@ -9,6 +9,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.Arrays; +import java.util.Collection; import java.util.Vector; @SuppressWarnings("unchecked") @@ -22,19 +23,35 @@ public abstract class RunAnythingSearchListModel extends DefaultListModel { clearIndexes(); } - protected abstract void clearIndexes(); + @NotNull + protected abstract Collection getGroups(); + + void clearIndexes() { + RunAnythingGroup.clearIndexes(getGroups()); + } @Nullable - protected abstract RunAnythingGroup findGroupByMoreIndex(int index); + RunAnythingGroup findGroupByMoreIndex(int index) { + return RunAnythingGroup.findGroupByMoreIndex(getGroups(), index); + } - protected abstract void shiftIndexes(int baseIndex, int shift); + void shiftIndexes(int baseIndex, int shift) { + RunAnythingGroup.shiftIndexes(getGroups(), baseIndex, shift); + } @Nullable - protected abstract String getTitle(int titleIndex); + String getTitle(int titleIndex) { + return RunAnythingGroup.getTitle(getGroups(), titleIndex); + } - protected abstract int[] getAllIndexes(); + int[] getAllIndexes() { + RunAnythingGroup.getAllIndexes(getGroups()); + return new int[0]; + } - protected abstract boolean isMoreIndex(int index); + boolean isMoreIndex(int index) { + return RunAnythingGroup.isMoreIndex(getGroups(), index); + } int next(int index) { int[] all = getAllIndexes(); diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingHelpGroup.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingHelpGroup.java index 680d894f05b9..d9d1907e06fc 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingHelpGroup.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingHelpGroup.java @@ -7,7 +7,6 @@ import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.extensions.ExtensionPointName; import org.jetbrains.annotations.NotNull; -import java.util.Arrays; import java.util.Collection; import java.util.Objects; import java.util.stream.Collectors; @@ -15,7 +14,6 @@ import java.util.stream.Collectors; public abstract class RunAnythingHelpGroup

extends RunAnythingGroupBase { public static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.runAnything.helpGroup"); - public static final Collection HELP_GROUPS = Arrays.asList(EP_NAME.getExtensions()); @NotNull public abstract Collection

getProviders(); diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/ui/RunAnythingHelpListModel.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/ui/RunAnythingHelpListModel.java index a81038e020c6..76ee5b1a85e2 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/ui/RunAnythingHelpListModel.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/ui/RunAnythingHelpListModel.java @@ -3,37 +3,16 @@ package com.intellij.ide.actions.runAnything.ui; import com.intellij.ide.actions.runAnything.RunAnythingSearchListModel; import com.intellij.ide.actions.runAnything.groups.RunAnythingGroup; -import org.jetbrains.annotations.Nullable; +import com.intellij.ide.actions.runAnything.groups.RunAnythingHelpGroup; +import org.jetbrains.annotations.NotNull; -import static com.intellij.ide.actions.runAnything.groups.RunAnythingHelpGroup.HELP_GROUPS; +import java.util.Arrays; +import java.util.Collection; public class RunAnythingHelpListModel extends RunAnythingSearchListModel { + @NotNull @Override - public void clearIndexes() { - RunAnythingGroup.clearIndexes(HELP_GROUPS); - } - - @Nullable - public RunAnythingGroup findGroupByMoreIndex(int index) { - return RunAnythingGroup.findGroupByMoreIndex(HELP_GROUPS, index); - } - - public void shiftIndexes(int baseIndex, int shift) { - RunAnythingGroup.shiftIndexes(HELP_GROUPS, baseIndex, shift); - } - - @Nullable - public String getTitle(int titleIndex) { - return RunAnythingGroup.getTitle(HELP_GROUPS, titleIndex); - } - - @Override - public int[] getAllIndexes() { - return RunAnythingGroup.getAllIndexes(HELP_GROUPS); - } - - @Override - public boolean isMoreIndex(int index) { - return RunAnythingGroup.isMoreIndex(HELP_GROUPS, index); + protected Collection getGroups() { + return Arrays.asList(RunAnythingHelpGroup.EP_NAME.getExtensions()); } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/ui/RunAnythingMainListModel.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/ui/RunAnythingMainListModel.java index d47c834277cd..4e2f63504f49 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/ui/RunAnythingMainListModel.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/ui/RunAnythingMainListModel.java @@ -7,45 +7,15 @@ import com.intellij.ide.actions.runAnything.groups.RunAnythingGroup; import com.intellij.ide.actions.runAnything.groups.RunAnythingRecentGroup; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.Collection; public class RunAnythingMainListModel extends RunAnythingSearchListModel { @NotNull - public Collection getMainListGroups() { + @Override + public Collection getGroups() { Collection groups = ContainerUtil.newArrayList(RunAnythingRecentGroup.INSTANCE); groups.addAll(RunAnythingCompletionProviderGroup.MAIN_GROUPS); return groups; } - - @Override - protected void clearIndexes() { - RunAnythingGroup.clearIndexes(getMainListGroups()); - } - - @Nullable - public RunAnythingGroup findGroupByMoreIndex(int index) { - return RunAnythingGroup.findGroupByMoreIndex(getMainListGroups(), index); - } - - public void shiftIndexes(int baseIndex, int shift) { - RunAnythingGroup.shiftIndexes(getMainListGroups(), baseIndex, shift); - } - - @Nullable - public String getTitle(int titleIndex) { - return RunAnythingGroup.getTitle(getMainListGroups(), titleIndex); - } - - @Override - public int[] getAllIndexes() { - RunAnythingGroup.getAllIndexes(getMainListGroups()); - return new int[0]; - } - - @Override - public boolean isMoreIndex(int index) { - return RunAnythingGroup.isMoreIndex(getMainListGroups(), index); - } } \ No newline at end of file From 8e77f11e00c20692338618befb437fed715aa02d Mon Sep 17 00:00:00 2001 From: "Dmitry.Krasilschikov" Date: Tue, 15 May 2018 13:15:54 +0300 Subject: [PATCH 06/24] UX-157 IJP-56 merge help and completion provider into base provider; Also, General group is introduced --- .../runAnything/RunAnythingAction.java | 26 ++-- .../actions/runAnything/RunAnythingCache.java | 8 +- .../RunAnythingRunConfigurationProvider.java | 6 +- .../RunAnythingSearchListModel.java | 22 +++- .../RunAnythingActionExecutionProvider.java | 2 +- .../RunAnythingCommandExecutionProvider.java | 3 +- ...nAnythingCommandExecutionProviderBase.java | 10 +- .../RunAnythingCompletionProvider.java | 31 ----- .../RunAnythingCompletionStringProvider.java | 16 --- .../activity/RunAnythingHelpProviderBase.java | 36 ------ ...ythingMatchedRunConfigurationProvider.java | 5 +- ...ingMultiParametrizedExecutionProvider.java | 23 ---- ...nythingNotifiableActivityProviderBase.java | 2 +- ...Provider.java => RunAnythingProvider.java} | 84 ++++++++---- .../activity/RunAnythingProviderBase.java | 122 ++++++++++++++++++ .../RunAnythingRecentCommandProvider.java | 3 +- .../RunAnythingRecentProjectProvider.java | 9 +- ...hingRunConfigurationExecutionProvider.java | 2 +- .../groups/RecentProjectHelpGroup.java | 6 +- .../RunAnythingCompletionProviderGroup.java | 28 ++-- ...unAnythingCompletionProviderGroupImpl.java | 20 --- .../groups/RunAnythingGeneralGroup.java | 47 +++++++ .../groups/RunAnythingHelpGroup.java | 4 +- .../groups/RunAnythingRecentGroup.java | 4 +- .../ui/RunAnythingHelpListModel.java | 18 --- .../ui/RunAnythingMainListModel.java | 21 --- .../src/messages/IdeBundle.properties | 1 + .../src/META-INF/LangExtensionPoints.xml | 2 +- 28 files changed, 308 insertions(+), 253 deletions(-) delete mode 100644 platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCompletionProvider.java delete mode 100644 platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCompletionStringProvider.java delete mode 100644 platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingHelpProviderBase.java delete mode 100644 platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingMultiParametrizedExecutionProvider.java rename platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/{RunAnythingActivityProvider.java => RunAnythingProvider.java} (57%) create mode 100644 platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProviderBase.java delete mode 100644 platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingCompletionProviderGroupImpl.java create mode 100644 platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingGeneralGroup.java delete mode 100644 platform/lang-impl/src/com/intellij/ide/actions/runAnything/ui/RunAnythingHelpListModel.java delete mode 100644 platform/lang-impl/src/com/intellij/ide/actions/runAnything/ui/RunAnythingMainListModel.java diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingAction.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingAction.java index b77c44fb051c..77f1c32341ee 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingAction.java @@ -11,13 +11,11 @@ import com.intellij.ide.DataManager; import com.intellij.ide.IdeBundle; import com.intellij.ide.IdeEventQueue; import com.intellij.ide.IdeTooltipManager; -import com.intellij.ide.actions.runAnything.activity.RunAnythingActivityProvider; +import com.intellij.ide.actions.runAnything.activity.RunAnythingProvider; import com.intellij.ide.actions.runAnything.groups.RunAnythingCompletionProviderGroup; import com.intellij.ide.actions.runAnything.groups.RunAnythingGroup; import com.intellij.ide.actions.runAnything.groups.RunAnythingRecentGroup; import com.intellij.ide.actions.runAnything.items.RunAnythingItem; -import com.intellij.ide.actions.runAnything.ui.RunAnythingHelpListModel; -import com.intellij.ide.actions.runAnything.ui.RunAnythingMainListModel; import com.intellij.ide.actions.runAnything.ui.RunAnythingScrollingUtil; import com.intellij.ide.ui.UISettings; import com.intellij.ide.ui.laf.darcula.ui.DarculaTextBorder; @@ -92,13 +90,13 @@ import javax.swing.event.ListSelectionListener; import javax.swing.plaf.TextUI; import java.awt.*; import java.awt.event.*; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import static com.intellij.ide.actions.runAnything.RunAnythingIconHandler.*; -import static com.intellij.ide.actions.runAnything.activity.RunAnythingCompletionProvider.getCompletionProviders; import static com.intellij.openapi.wm.IdeFocusManager.getGlobalInstance; @SuppressWarnings("FieldAccessedSynchronizedAndUnsynchronized") @@ -214,7 +212,7 @@ public class RunAnythingAction extends AnAction implements CustomComponentAction private void updateComponents() { //noinspection unchecked - myList = new JBList(new RunAnythingMainListModel()) { + myList = new JBList(new RunAnythingSearchListModel.RunAnythingMainListModel()) { int lastKnownHeight = JBUI.scale(30); @Override @@ -425,7 +423,7 @@ public class RunAnythingAction extends AnAction implements CustomComponentAction if (SHIFT_IS_PRESSED.get()) { RunAnythingUtil.triggerShiftStatistics(dataContext); } - onDone = () -> RunAnythingActivityProvider.executeMatched(dataContext, pattern); + onDone = () -> RunAnythingProvider.executeMatched(dataContext, pattern); } finally { final ActionCallback callback = onPopupFocusLost(); @@ -787,7 +785,7 @@ public class RunAnythingAction extends AnAction implements CustomComponentAction String pattern = textField.getText(); DataContext dataContext = createDataContext(myDataContext, isAltPressed); - RunAnythingActivityProvider provider = RunAnythingActivityProvider.findMatchedProvider(dataContext, pattern); + RunAnythingProvider provider = RunAnythingProvider.findMatchedProvider(dataContext, pattern); if (provider == null) { return; @@ -811,8 +809,7 @@ public class RunAnythingAction extends AnAction implements CustomComponentAction Object value = myList.getSelectedValue(); if (value instanceof RunAnythingItem) { - RunAnythingActivityProvider provider = - RunAnythingActivityProvider.findMatchedProvider(dataContext, ((RunAnythingItem)value).getCommand()); + RunAnythingProvider provider = RunAnythingProvider.findMatchedProvider(dataContext, ((RunAnythingItem)value).getCommand()); if (provider != null) { String adText = provider.getAdText(); if (adText != null) { @@ -826,10 +823,11 @@ public class RunAnythingAction extends AnAction implements CustomComponentAction myPopupField.setText(""); final RunAnythingSettingsModel model = new RunAnythingSettingsModel(); - getCompletionProviders() - .stream() + Arrays.stream(RunAnythingProvider.EP_NAME.getExtensions()) + .filter(provider -> provider.getId() != null) + .filter(provider -> provider.getCompletionGroupTitle() != null) .map(provider -> new RunAnythingSEOption(getProject(), - IdeBundle.message("run.anything.group.settings.title", provider.getGroupTitle()), + IdeBundle.message("run.anything.group.settings.title", provider.getCompletionGroupTitle()), provider.getId())) .forEach(model::addElement); @@ -1035,7 +1033,7 @@ public class RunAnythingAction extends AnAction implements CustomComponentAction myListModel = reuseModel && model != null ? model - : isHelpMode(pattern) ? new RunAnythingHelpListModel() : new RunAnythingMainListModel(); + : isHelpMode(pattern) ? new RunAnythingSearchListModel.RunAnythingHelpListModel() : new RunAnythingSearchListModel.RunAnythingMainListModel(); } @Override @@ -1133,7 +1131,7 @@ public class RunAnythingAction extends AnAction implements CustomComponentAction } private void buildCompletionGroups(@NotNull String pattern, @NotNull Runnable checkCancellation) { - LOG.assertTrue(myListModel instanceof RunAnythingMainListModel); + LOG.assertTrue(myListModel instanceof RunAnythingSearchListModel.RunAnythingMainListModel); myListModel .getGroups() diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingCache.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingCache.java index 404961ba1168..2c3c5f655cdf 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingCache.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingCache.java @@ -3,8 +3,7 @@ package com.intellij.ide.actions.runAnything; import com.intellij.execution.ExecutionException; import com.intellij.execution.configurations.GeneralCommandLine; -import com.intellij.ide.actions.runAnything.activity.RunAnythingActivityProvider; -import com.intellij.ide.actions.runAnything.activity.RunAnythingCompletionProvider; +import com.intellij.ide.actions.runAnything.activity.RunAnythingProviderBase; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.*; import com.intellij.openapi.project.Project; @@ -94,8 +93,9 @@ public class RunAnythingCache implements PersistentStateComponent myKeys = - StreamEx.of(RunAnythingActivityProvider.EP_NAME.getExtensions()) - .select(RunAnythingCompletionProvider.class) + StreamEx.of(RunAnythingProviderBase.EP_NAME.getExtensions()) + .filter(provider -> provider.getId() !=null) + .distinct(provider -> provider.getId()) .collect(Collectors.toMap(group -> group.getId(), group -> true)); @XCollection(elementName = "command") diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingRunConfigurationProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingRunConfigurationProvider.java index 5a1fb8b66fb1..d5766c3bfdc0 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingRunConfigurationProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingRunConfigurationProvider.java @@ -6,7 +6,6 @@ import com.intellij.execution.ExecutorRegistry; import com.intellij.execution.actions.ChooseRunConfigurationPopup; import com.intellij.execution.actions.ExecutorProvider; import com.intellij.ide.IdeBundle; -import com.intellij.ide.actions.runAnything.activity.RunAnythingCompletionProvider; import com.intellij.ide.actions.runAnything.activity.RunAnythingRunConfigurationExecutionProvider; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.project.Project; @@ -18,8 +17,7 @@ import java.util.Collection; import static com.intellij.ide.actions.runAnything.RunAnythingUtil.fetchProject; -public class RunAnythingRunConfigurationProvider extends RunAnythingRunConfigurationExecutionProvider - implements RunAnythingCompletionProvider { +public class RunAnythingRunConfigurationProvider extends RunAnythingRunConfigurationExecutionProvider { @NotNull @Override public Collection getValues(@NotNull DataContext dataContext) { @@ -28,7 +26,7 @@ public class RunAnythingRunConfigurationProvider extends RunAnythingRunConfigura @NotNull @Override - public String getGroupTitle() { + public String getCompletionGroupTitle() { return IdeBundle.message("run.anything.run.configurations.group.title"); } diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingSearchListModel.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingSearchListModel.java index 871ff0b111db..ec10233157c4 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingSearchListModel.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingSearchListModel.java @@ -1,9 +1,10 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide.actions.runAnything; -import com.intellij.ide.actions.runAnything.groups.RunAnythingGroup; +import com.intellij.ide.actions.runAnything.groups.*; import com.intellij.openapi.project.Project; import com.intellij.util.ReflectionUtil; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -95,4 +96,23 @@ public abstract class RunAnythingSearchListModel extends DefaultListModel { RunAnythingUsageCollector.Companion .trigger(project, getClass().getSimpleName() + ": " + RunAnythingAction.RUN_ANYTHING + " - more - " + group.getTitle()); } + + public static class RunAnythingMainListModel extends RunAnythingSearchListModel { + @NotNull + @Override + public Collection getGroups() { + Collection groups = ContainerUtil.newArrayList(RunAnythingRecentGroup.INSTANCE); + groups.add(RunAnythingGeneralGroup.INSTANCE); + groups.addAll(RunAnythingCompletionProviderGroup.MAIN_GROUPS); + return groups; + } + } + + public static class RunAnythingHelpListModel extends RunAnythingSearchListModel { + @NotNull + @Override + protected Collection getGroups() { + return Arrays.asList(RunAnythingHelpGroup.EP_NAME.getExtensions()); + } + } } diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionExecutionProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionExecutionProvider.java index 7b9f9619ed48..43cb6002781f 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionExecutionProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActionExecutionProvider.java @@ -18,7 +18,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; -public abstract class RunAnythingActionExecutionProvider implements RunAnythingHelpProviderBase { +public abstract class RunAnythingActionExecutionProvider extends RunAnythingProviderBase { @NotNull @Override public RunAnythingItem getMainListItem(@NotNull DataContext dataContext, @NotNull V value) { diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProvider.java index dfa02e2aef9c..b4317f47d6c4 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProvider.java @@ -5,8 +5,7 @@ import com.intellij.openapi.actionSystem.DataContext; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class RunAnythingCommandExecutionProvider extends RunAnythingCommandExecutionProviderBase - implements RunAnythingActivityProvider { +public class RunAnythingCommandExecutionProvider extends RunAnythingCommandExecutionProviderBase { @Nullable @Override diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProviderBase.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProviderBase.java index 59e801fbbaf3..8020d784dfb7 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProviderBase.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCommandExecutionProviderBase.java @@ -12,8 +12,6 @@ import com.intellij.ide.actions.runAnything.RunAnythingCache; import com.intellij.ide.actions.runAnything.RunAnythingUtil; import com.intellij.ide.actions.runAnything.commands.RunAnythingCommandCustomizer; import com.intellij.ide.actions.runAnything.execution.RunAnythingRunProfile; -import com.intellij.ide.actions.runAnything.items.RunAnythingItem; -import com.intellij.ide.actions.runAnything.items.RunAnythingItemBase; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.KeyboardShortcut; @@ -30,7 +28,7 @@ import java.util.Collection; import static com.intellij.ide.actions.runAnything.RunAnythingUtil.AD_CONTEXT_TEXT; import static com.intellij.ide.actions.runAnything.RunAnythingUtil.AD_DEBUG_TEXT; -public abstract class RunAnythingCommandExecutionProviderBase implements RunAnythingActivityProvider { +public abstract class RunAnythingCommandExecutionProviderBase extends RunAnythingProviderBase { public final String AD_DELETE_COMMAND_TEXT = IdeBundle.message("run.anything.ad.command.delete", KeymapUtil.getShortcutText(KeyboardShortcut.fromString("shift BACK_SPACE"))); @@ -87,10 +85,4 @@ public abstract class RunAnythingCommandExecutionProviderBase implements RunAnyt public Icon getIcon(@NotNull String value) { return AllIcons.Actions.Run_anything; } - - @NotNull - @Override - public RunAnythingItem getMainListItem(@NotNull DataContext dataContext, @NotNull String value) { - return new RunAnythingItemBase(value, getIcon(value)); - } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCompletionProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCompletionProvider.java deleted file mode 100644 index 234ded91cf90..000000000000 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCompletionProvider.java +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.ide.actions.runAnything.activity; - -import com.intellij.ide.actions.runAnything.groups.RunAnythingCompletionProviderGroup; -import com.intellij.ide.actions.runAnything.groups.RunAnythingCompletionProviderGroupImpl; -import one.util.streamex.StreamEx; -import org.jetbrains.annotations.NotNull; - -import java.util.List; -import java.util.stream.Collectors; - -public interface RunAnythingCompletionProvider extends RunAnythingMultiParametrizedExecutionProvider { - @NotNull - String getGroupTitle(); - - @NotNull - default String getId() { - return getGroupTitle(); - } - - @NotNull - default RunAnythingCompletionProviderGroup createGroup() { - //noinspection unchecked - return new RunAnythingCompletionProviderGroupImpl(this); - } - - @NotNull - static List getCompletionProviders() { - return StreamEx.of(EP_NAME.getExtensions()).select(RunAnythingCompletionProvider.class).collect(Collectors.toList()); - } -} \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCompletionStringProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCompletionStringProvider.java deleted file mode 100644 index 635984082cc1..000000000000 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingCompletionStringProvider.java +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.ide.actions.runAnything.activity; - -import com.intellij.ide.actions.runAnything.items.RunAnythingItem; -import com.intellij.ide.actions.runAnything.items.RunAnythingItemBase; -import com.intellij.openapi.actionSystem.DataContext; -import org.jetbrains.annotations.NotNull; - -public interface RunAnythingCompletionStringProvider - extends RunAnythingCompletionProvider, RunAnythingActivityProvider { - @NotNull - @Override - default RunAnythingItem getMainListItem(@NotNull DataContext dataContext, @NotNull String value) { - return new RunAnythingItemBase(getCommand(value), getIcon(value)); - } -} \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingHelpProviderBase.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingHelpProviderBase.java deleted file mode 100644 index e4f675b3c220..000000000000 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingHelpProviderBase.java +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.ide.actions.runAnything.activity; - -import com.intellij.ide.actions.runAnything.items.RunAnythingHelpItem; -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.util.ui.EmptyIcon; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import javax.swing.*; - -public interface RunAnythingHelpProviderBase extends RunAnythingActivityProvider { - @Nullable - @Override - default RunAnythingHelpItem getHelpItem(@NotNull DataContext dataContext) { - return new RunAnythingHelpItem(getHelpCommandPlaceholder(), getCommandPrefix(), getHelpDescription(), getHelpIcon()); - } - - @Nullable - default Icon getHelpIcon() { - return EmptyIcon.ICON_16; - } - - @Nullable - default String getHelpDescription() { - return null; - } - - @NotNull - default String getHelpCommandPlaceholder() { - return getCommandPrefix(); - } - - @NotNull - String getCommandPrefix(); -} \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingMatchedRunConfigurationProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingMatchedRunConfigurationProvider.java index ccc1419b703c..d9ca7e09a57f 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingMatchedRunConfigurationProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingMatchedRunConfigurationProvider.java @@ -2,7 +2,6 @@ package com.intellij.ide.actions.runAnything.activity; import com.intellij.execution.RunnerAndConfigurationSettings; -import com.intellij.execution.actions.ChooseRunConfigurationPopup; import com.intellij.execution.configurations.ConfigurationFactory; import com.intellij.openapi.actionSystem.DataContext; import org.jetbrains.annotations.NotNull; @@ -12,9 +11,7 @@ import javax.swing.*; /** * Implement this class if a particular run configuration should be created for matching input string. */ -public abstract class RunAnythingMatchedRunConfigurationProvider extends RunAnythingRunConfigurationExecutionProvider - implements RunAnythingHelpProviderBase, - RunAnythingActivityProvider { +public abstract class RunAnythingMatchedRunConfigurationProvider extends RunAnythingRunConfigurationExecutionProvider { /** * Actual run configuration creation by {@code commandLine} * diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingMultiParametrizedExecutionProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingMultiParametrizedExecutionProvider.java deleted file mode 100644 index afce8244c28f..000000000000 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingMultiParametrizedExecutionProvider.java +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.ide.actions.runAnything.activity; - -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.util.text.StringUtil; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Collection; - -public interface RunAnythingMultiParametrizedExecutionProvider extends RunAnythingActivityProvider { - @NotNull - Collection getValues(@NotNull DataContext dataContext); - - default boolean isMatching(@NotNull DataContext dataContext, @NotNull String pattern, @NotNull V value) { - return StringUtil.equals(pattern, getCommand(value)); - } - - @Nullable - default V findMatchingValue(@NotNull DataContext dataContext, @NotNull String pattern) { - return getValues(dataContext).stream().filter(value -> isMatching(dataContext, pattern, value)).findFirst().orElse(null); - } -} \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingNotifiableActivityProviderBase.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingNotifiableActivityProviderBase.java index c98e7d722f11..f571f2b4eb7f 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingNotifiableActivityProviderBase.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingNotifiableActivityProviderBase.java @@ -15,7 +15,7 @@ import org.jetbrains.annotations.Nullable; import static com.intellij.ide.actions.runAnything.RunAnythingUtil.fetchProject; -public abstract class RunAnythingNotifiableActivityProviderBase implements RunAnythingActivityProvider { +public abstract class RunAnythingNotifiableActivityProviderBase extends RunAnythingProviderBase { private static final String RUN_ANYTHING_GROUP_ID = IdeBundle.message("run.anything.custom.activity.notification.group.id"); /** diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActivityProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProvider.java similarity index 57% rename from platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActivityProvider.java rename to platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProvider.java index c9ee34857301..6c3902d567ee 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingActivityProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProvider.java @@ -2,18 +2,18 @@ package com.intellij.ide.actions.runAnything.activity; import com.intellij.ide.actions.runAnything.RunAnythingCache; -import com.intellij.ide.actions.runAnything.items.RunAnythingHelpItem; +import com.intellij.ide.actions.runAnything.groups.RunAnythingGroup; import com.intellij.ide.actions.runAnything.items.RunAnythingItem; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; -import com.intellij.util.ui.EmptyIcon; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.Arrays; +import java.util.Collection; import java.util.List; import static com.intellij.ide.actions.runAnything.RunAnythingUtil.fetchProject; @@ -21,41 +21,76 @@ import static com.intellij.ide.actions.runAnything.RunAnythingUtil.fetchProject; /** * This class provides ability to run an arbitrary activity for matched 'Run Anything' input text */ -public interface RunAnythingActivityProvider { - ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.runAnything.executionProvider"); +public interface RunAnythingProvider { + ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.runAnything.executionProvider"); @Nullable V findMatchingValue(@NotNull DataContext dataContext, @NotNull String pattern); - /** - * Executes arbitrary activity in IDE if {@code pattern} is matched as {@link #isMatching(DataContext, String)} - * - * @param dataContext 'Run Anything' action {@code dataContext}, may retrieve {@link Project} and {@link Module} from here - * @param value matching value - * @return true if succeed, false is failed - */ + @NotNull + Collection getValues(@NotNull DataContext dataContext); + + boolean isMatching(@NotNull DataContext dataContext, @NotNull String pattern, @NotNull V value); + void execute(@NotNull DataContext dataContext, @NotNull V value); @Nullable - default Icon getIcon(@NotNull V value) { - return EmptyIcon.ICON_16; - } + Icon getIcon(@NotNull V value); @NotNull String getCommand(@NotNull V value); @Nullable - default String getAdText() { - return null; - } + String getAdText(); @NotNull RunAnythingItem getMainListItem(@NotNull DataContext dataContext, @NotNull V value); + /** + * Null means no completion + * + * @return + */ @Nullable - default RunAnythingHelpItem getHelpItem(@NotNull DataContext dataContext) { - return null; - } + String getCompletionGroupTitle(); + + @Nullable + String getId(); + + /** + * Null means no completion + * + * @return + */ + @Nullable + RunAnythingGroup createCompletionGroup(); + + /** + * Help section + * + * @param dataContext + * @return + */ + + @Nullable + RunAnythingItem getHelpItem(@NotNull DataContext dataContext); + + @Nullable + Icon getHelpIcon(); + + @Nullable + String getHelpDescription(); + + @Nullable + String getHelpCommandPlaceholder(); + + /** + * Null means no help command + * + * @return + */ + @Nullable + String getHelpCommand(); /** * Finds provider that matches {@code pattern} @@ -64,16 +99,19 @@ public interface RunAnythingActivityProvider { * @param pattern 'Run Anything' search bar input text */ @Nullable - static RunAnythingActivityProvider findMatchedProvider(@NotNull DataContext dataContext, @NotNull String pattern) { - return Arrays.stream(EP_NAME.getExtensions()).filter(provider -> provider.findMatchingValue(dataContext, pattern) != null).findFirst() + static RunAnythingProvider findMatchedProvider(@NotNull DataContext dataContext, @NotNull String pattern) { + return Arrays.stream(EP_NAME.getExtensions()) + .filter(provider -> provider.findMatchingValue(dataContext, pattern) != null) + .findFirst() .orElse(null); } static void executeMatched(@NotNull DataContext dataContext, @NotNull String pattern) { List commands = RunAnythingCache.getInstance(fetchProject(dataContext)).getState().getCommands(); - for (RunAnythingActivityProvider provider : EP_NAME.getExtensions()) { + for (RunAnythingProvider provider : EP_NAME.getExtensions()) { Object value = provider.findMatchingValue(dataContext, pattern); if (value != null) { + //noinspection unchecked provider.execute(dataContext, value); commands.remove(pattern); commands.add(pattern); diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProviderBase.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProviderBase.java new file mode 100644 index 000000000000..e583cb4a55d4 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProviderBase.java @@ -0,0 +1,122 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.ide.actions.runAnything.activity; + +import com.intellij.ide.actions.runAnything.groups.RunAnythingCompletionProviderGroup; +import com.intellij.ide.actions.runAnything.groups.RunAnythingGeneralGroup; +import com.intellij.ide.actions.runAnything.groups.RunAnythingGroup; +import com.intellij.ide.actions.runAnything.items.RunAnythingHelpItem; +import com.intellij.ide.actions.runAnything.items.RunAnythingItem; +import com.intellij.ide.actions.runAnything.items.RunAnythingItemBase; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.ui.EmptyIcon; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.util.Collection; + +/** + * This class provides ability to run an arbitrary activity for matched 'Run Anything' input text + */ +public abstract class RunAnythingProviderBase implements RunAnythingProvider { + @NotNull + public Collection getValues(@NotNull DataContext dataContext) { + return ContainerUtil.emptyList(); + } + + public boolean isMatching(@NotNull DataContext dataContext, @NotNull String pattern, @NotNull V value) { + return StringUtil.equals(pattern, getCommand(value)); + } + + @Nullable + public V findMatchingValue(@NotNull DataContext dataContext, @NotNull String pattern) { + return getValues(dataContext).stream().filter(value -> isMatching(dataContext, pattern, value)).findFirst().orElse(null); + } + + @Nullable + public Icon getIcon(@NotNull V value) { + return EmptyIcon.ICON_16; + } + + @Nullable + public String getAdText() { + return null; + } + + @NotNull + @Override + public RunAnythingItem getMainListItem(@NotNull DataContext dataContext, @NotNull V value) { + return new RunAnythingItemBase(getCommand(value), getIcon(value)); + } + + @Nullable + @Override + public RunAnythingHelpItem getHelpItem(@NotNull DataContext dataContext) { + String placeholder = getHelpCommandPlaceholder(); + String commandPrefix = getHelpCommand(); + if (placeholder == null || commandPrefix == null) { + return null; + } + return new RunAnythingHelpItem(placeholder, commandPrefix, getHelpDescription(), getHelpIcon()); + } + + /** + * Null means no completion + * + * @return + */ + @Nullable + public String getCompletionGroupTitle() { + return null; + } + + @Nullable + public String getId() { + return getCompletionGroupTitle(); + } + + /** + * Null means no completion + * + * @return + */ + @Nullable + public RunAnythingGroup createCompletionGroup() { + if (RunAnythingGeneralGroup.GENERAL_GROUP_TITLE.equals(getCompletionGroupTitle())) { + return RunAnythingGeneralGroup.INSTANCE; + } + + if (getCompletionGroupTitle() == null) { + return null; + } + + return new RunAnythingCompletionProviderGroup<>(this); + } + + @Nullable + public Icon getHelpIcon() { + return EmptyIcon.ICON_16; + } + + @Nullable + public String getHelpDescription() { + return null; + } + + @Nullable + public String getHelpCommandPlaceholder() { + return getHelpCommand(); + } + + /** + * Null means no help command + * + * @return + */ + @Nullable + public String getHelpCommand() { + return null; + } +} \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentCommandProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentCommandProvider.java index ef1f696d3eff..cc12093445f3 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentCommandProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentCommandProvider.java @@ -9,8 +9,7 @@ import java.util.Collection; import static com.intellij.ide.actions.runAnything.RunAnythingUtil.fetchProject; -public class RunAnythingRecentCommandProvider extends RunAnythingCommandExecutionProviderBase - implements RunAnythingMultiParametrizedExecutionProvider { +public class RunAnythingRecentCommandProvider extends RunAnythingCommandExecutionProviderBase { @NotNull @Override diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentProjectProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentProjectProvider.java index 25f1ca23e8c3..fb8a81e241bc 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentProjectProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRecentProjectProvider.java @@ -12,8 +12,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.stream.Collectors; -public class RunAnythingRecentProjectProvider extends RunAnythingActionExecutionProvider - implements RunAnythingCompletionProvider { +public class RunAnythingRecentProjectProvider extends RunAnythingActionExecutionProvider { @NotNull @Override public Collection getValues(@NotNull DataContext dataContext) { @@ -21,7 +20,7 @@ public class RunAnythingRecentProjectProvider extends RunAnythingActionExecution } @NotNull - public String getGroupTitle() { + public String getCompletionGroupTitle() { return IdeBundle.message("run.anything.recent.project.completion.group.title"); } @@ -33,14 +32,14 @@ public class RunAnythingRecentProjectProvider extends RunAnythingActionExecution @NotNull @Override - public String getCommandPrefix() { + public String getHelpCommand() { return "open"; } @NotNull @Override public String getCommand(@NotNull AnAction value) { - return getCommandPrefix() + " " + ObjectUtils + return getHelpCommand() + " " + ObjectUtils .notNull(value.getTemplatePresentation().getText(), IdeBundle.message("run.anything.actions.undefined")); } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRunConfigurationExecutionProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRunConfigurationExecutionProvider.java index 97d9a8167ec4..de92dc8c7125 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRunConfigurationExecutionProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingRunConfigurationExecutionProvider.java @@ -20,7 +20,7 @@ import static com.intellij.ide.actions.runAnything.RunAnythingAction.EXECUTOR_KE import static com.intellij.ide.actions.runAnything.RunAnythingUtil.fetchProject; public abstract class RunAnythingRunConfigurationExecutionProvider - implements RunAnythingActivityProvider { + extends RunAnythingProviderBase { @NotNull @Override diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RecentProjectHelpGroup.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RecentProjectHelpGroup.java index 846d4daef724..0e0f8579f475 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RecentProjectHelpGroup.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RecentProjectHelpGroup.java @@ -2,7 +2,7 @@ package com.intellij.ide.actions.runAnything.groups; import com.intellij.ide.IdeBundle; -import com.intellij.ide.actions.runAnything.activity.RunAnythingActivityProvider; +import com.intellij.ide.actions.runAnything.activity.RunAnythingProvider; import com.intellij.ide.actions.runAnything.activity.RunAnythingRecentProjectProvider; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -18,7 +18,7 @@ public class RecentProjectHelpGroup extends RunAnythingHelpGroup { @NotNull @Override - public Collection getProviders() { - return ContainerUtil.immutableSingletonList(RunAnythingActivityProvider.EP_NAME.findExtension(RunAnythingRecentProjectProvider.class)); + public Collection getProviders() { + return ContainerUtil.immutableSingletonList(RunAnythingProvider.EP_NAME.findExtension(RunAnythingRecentProjectProvider.class)); } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingCompletionProviderGroup.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingCompletionProviderGroup.java index 1b8acf2de8ef..625df59b5297 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingCompletionProviderGroup.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingCompletionProviderGroup.java @@ -2,28 +2,37 @@ package com.intellij.ide.actions.runAnything.groups; import com.intellij.ide.actions.runAnything.RunAnythingCache; -import com.intellij.ide.actions.runAnything.activity.RunAnythingActivityProvider; -import com.intellij.ide.actions.runAnything.activity.RunAnythingCompletionProvider; +import com.intellij.ide.actions.runAnything.activity.RunAnythingProvider; import com.intellij.ide.actions.runAnything.items.RunAnythingItem; import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.util.ObjectUtils; import one.util.streamex.StreamEx; import org.jetbrains.annotations.NotNull; import java.util.Collection; +import java.util.Objects; import java.util.stream.Collectors; import static com.intellij.ide.actions.runAnything.RunAnythingUtil.fetchProject; -public abstract class RunAnythingCompletionProviderGroup> extends RunAnythingGroupBase { +public class RunAnythingCompletionProviderGroup> extends RunAnythingGroupBase { public static final Collection MAIN_GROUPS = getAllGroups(); + @NotNull private final P myProvider; + + public RunAnythingCompletionProviderGroup(@NotNull P provider) { + myProvider = provider; + } + @NotNull - protected abstract P getProvider(); + protected P getProvider() { + return myProvider; + } @NotNull @Override public String getTitle() { - return getProvider().getGroupTitle(); + return ObjectUtils.assertNotNull(getProvider().getCompletionGroupTitle()); } @NotNull @@ -34,13 +43,14 @@ public abstract class RunAnythingCompletionProviderGroup getAllGroups() { - return StreamEx.of(RunAnythingActivityProvider.EP_NAME.getExtensions()) - .select(RunAnythingCompletionProvider.class) - .map(provider -> provider.createGroup()) + return StreamEx.of(RunAnythingProvider.EP_NAME.getExtensions()) + .map(provider -> provider.createCompletionGroup()) + .filter(Objects::nonNull) + .distinct() .collect(Collectors.toList()); } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingCompletionProviderGroupImpl.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingCompletionProviderGroupImpl.java deleted file mode 100644 index 48bc9f71a2b4..000000000000 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingCompletionProviderGroupImpl.java +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.ide.actions.runAnything.groups; - -import com.intellij.ide.actions.runAnything.activity.RunAnythingCompletionProvider; -import org.jetbrains.annotations.NotNull; - -public class RunAnythingCompletionProviderGroupImpl> - extends RunAnythingCompletionProviderGroup { - @NotNull private final P myProvider; - - public RunAnythingCompletionProviderGroupImpl(@NotNull P provider) { - myProvider = provider; - } - - @NotNull - @Override - protected P getProvider() { - return myProvider; - } -} \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingGeneralGroup.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingGeneralGroup.java new file mode 100644 index 000000000000..03ad73798e16 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingGeneralGroup.java @@ -0,0 +1,47 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.ide.actions.runAnything.groups; + +import com.intellij.ide.IdeBundle; +import com.intellij.ide.actions.runAnything.activity.RunAnythingProvider; +import com.intellij.ide.actions.runAnything.items.RunAnythingItem; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; + +public class RunAnythingGeneralGroup extends RunAnythingGroupBase { + public static final RunAnythingGeneralGroup INSTANCE = new RunAnythingGeneralGroup(); + public static final String GENERAL_GROUP_TITLE = IdeBundle.message("run.anything.general.group.title"); + + private RunAnythingGeneralGroup() {} + + @NotNull + @Override + public String getTitle() { + return GENERAL_GROUP_TITLE; + } + + @NotNull + @Override + public Collection getGroupItems(@NotNull DataContext dataContext) { + Collection collector = ContainerUtil.newArrayList(); + + for (RunAnythingProvider provider : RunAnythingProvider.EP_NAME.getExtensions()) { + if (GENERAL_GROUP_TITLE.equals(provider.getCompletionGroupTitle())) { + Collection values = provider.getValues(dataContext); + for (Object value : values) { + //noinspection unchecked + collector.add(provider.getMainListItem(dataContext, value)); + } + } + } + + return collector; + } + + @Override + protected int getMaxInitialItems() { + return 15; + } +} diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingHelpGroup.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingHelpGroup.java index d9d1907e06fc..0aed713e3296 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingHelpGroup.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingHelpGroup.java @@ -1,7 +1,7 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide.actions.runAnything.groups; -import com.intellij.ide.actions.runAnything.activity.RunAnythingActivityProvider; +import com.intellij.ide.actions.runAnything.activity.RunAnythingProvider; import com.intellij.ide.actions.runAnything.items.RunAnythingItem; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.extensions.ExtensionPointName; @@ -11,7 +11,7 @@ import java.util.Collection; import java.util.Objects; import java.util.stream.Collectors; -public abstract class RunAnythingHelpGroup

+public abstract class RunAnythingHelpGroup

extends RunAnythingGroupBase { public static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.runAnything.helpGroup"); diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingRecentGroup.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingRecentGroup.java index 889c4297b8c8..b18a2b191317 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingRecentGroup.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingRecentGroup.java @@ -3,7 +3,7 @@ package com.intellij.ide.actions.runAnything.groups; import com.intellij.ide.IdeBundle; import com.intellij.ide.actions.runAnything.RunAnythingCache; -import com.intellij.ide.actions.runAnything.activity.RunAnythingActivityProvider; +import com.intellij.ide.actions.runAnything.activity.RunAnythingProvider; import com.intellij.ide.actions.runAnything.items.RunAnythingItem; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataContext; @@ -32,7 +32,7 @@ public class RunAnythingRecentGroup extends RunAnythingGroupBase { Collection collector = ContainerUtil.newArrayList(); for (String command : ContainerUtil.iterateBackward(RunAnythingCache.getInstance(project).getState().getCommands())) { - for (RunAnythingActivityProvider provider : RunAnythingActivityProvider.EP_NAME.getExtensions()) { + for (RunAnythingProvider provider : RunAnythingProvider.EP_NAME.getExtensions()) { Object matchingValue = provider.findMatchingValue(dataContext, command); if (matchingValue != null) { //noinspection unchecked diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/ui/RunAnythingHelpListModel.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/ui/RunAnythingHelpListModel.java deleted file mode 100644 index 76ee5b1a85e2..000000000000 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/ui/RunAnythingHelpListModel.java +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.ide.actions.runAnything.ui; - -import com.intellij.ide.actions.runAnything.RunAnythingSearchListModel; -import com.intellij.ide.actions.runAnything.groups.RunAnythingGroup; -import com.intellij.ide.actions.runAnything.groups.RunAnythingHelpGroup; -import org.jetbrains.annotations.NotNull; - -import java.util.Arrays; -import java.util.Collection; - -public class RunAnythingHelpListModel extends RunAnythingSearchListModel { - @NotNull - @Override - protected Collection getGroups() { - return Arrays.asList(RunAnythingHelpGroup.EP_NAME.getExtensions()); - } -} \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/ui/RunAnythingMainListModel.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/ui/RunAnythingMainListModel.java deleted file mode 100644 index 4e2f63504f49..000000000000 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/ui/RunAnythingMainListModel.java +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.ide.actions.runAnything.ui; - -import com.intellij.ide.actions.runAnything.RunAnythingSearchListModel; -import com.intellij.ide.actions.runAnything.groups.RunAnythingCompletionProviderGroup; -import com.intellij.ide.actions.runAnything.groups.RunAnythingGroup; -import com.intellij.ide.actions.runAnything.groups.RunAnythingRecentGroup; -import com.intellij.util.containers.ContainerUtil; -import org.jetbrains.annotations.NotNull; - -import java.util.Collection; - -public class RunAnythingMainListModel extends RunAnythingSearchListModel { - @NotNull - @Override - public Collection getGroups() { - Collection groups = ContainerUtil.newArrayList(RunAnythingRecentGroup.INSTANCE); - groups.addAll(RunAnythingCompletionProviderGroup.MAIN_GROUPS); - return groups; - } -} \ No newline at end of file diff --git a/platform/platform-resources-en/src/messages/IdeBundle.properties b/platform/platform-resources-en/src/messages/IdeBundle.properties index fd83ba190d66..9500e7495593 100644 --- a/platform/platform-resources-en/src/messages/IdeBundle.properties +++ b/platform/platform-resources-en/src/messages/IdeBundle.properties @@ -1301,6 +1301,7 @@ run.anything.ad.run.action.with.default.settings=Press {0} to run with default s run.anything.ad.run.with.debug={0} to debug run.anything.ad.run.in.context=Press {0} to run in the current file context run.anything.ad.command.delete={0} to delete recent command +run.anything.general.group.title=General run.anything.recent.group.title=Recent run.anything.recent.project.help.group.title=Recent projects run.anything.recent.project.completion.group.title=Recent projects diff --git a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml index dfa09b10cf57..70d04b6af2ec 100644 --- a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml +++ b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml @@ -297,7 +297,7 @@ + interface="com.intellij.ide.actions.runAnything.activity.RunAnythingProvider"/> From c9d76ed4525e62939b04225a88e141a1b3fafe21 Mon Sep 17 00:00:00 2001 From: "Dmitry.Krasilschikov" Date: Tue, 15 May 2018 15:40:31 +0300 Subject: [PATCH 07/24] UX-157 IJP-56 pull help methods down; refactoring --- .../activity/RunAnythingProvider.java | 35 ------------------- .../activity/RunAnythingProviderBase.java | 27 +------------- .../RunAnythingCompletionProviderGroup.java | 18 +++++++++- 3 files changed, 18 insertions(+), 62 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProvider.java index 6c3902d567ee..2860c3117629 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProvider.java @@ -2,7 +2,6 @@ package com.intellij.ide.actions.runAnything.activity; import com.intellij.ide.actions.runAnything.RunAnythingCache; -import com.intellij.ide.actions.runAnything.groups.RunAnythingGroup; import com.intellij.ide.actions.runAnything.items.RunAnythingItem; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.extensions.ExtensionPointName; @@ -30,8 +29,6 @@ public interface RunAnythingProvider { @NotNull Collection getValues(@NotNull DataContext dataContext); - boolean isMatching(@NotNull DataContext dataContext, @NotNull String pattern, @NotNull V value); - void execute(@NotNull DataContext dataContext, @NotNull V value); @Nullable @@ -57,41 +54,9 @@ public interface RunAnythingProvider { @Nullable String getId(); - /** - * Null means no completion - * - * @return - */ - @Nullable - RunAnythingGroup createCompletionGroup(); - - /** - * Help section - * - * @param dataContext - * @return - */ - @Nullable RunAnythingItem getHelpItem(@NotNull DataContext dataContext); - @Nullable - Icon getHelpIcon(); - - @Nullable - String getHelpDescription(); - - @Nullable - String getHelpCommandPlaceholder(); - - /** - * Null means no help command - * - * @return - */ - @Nullable - String getHelpCommand(); - /** * Finds provider that matches {@code pattern} * diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProviderBase.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProviderBase.java index e583cb4a55d4..78b9d733fdd1 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProviderBase.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProviderBase.java @@ -1,9 +1,6 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide.actions.runAnything.activity; -import com.intellij.ide.actions.runAnything.groups.RunAnythingCompletionProviderGroup; -import com.intellij.ide.actions.runAnything.groups.RunAnythingGeneralGroup; -import com.intellij.ide.actions.runAnything.groups.RunAnythingGroup; import com.intellij.ide.actions.runAnything.items.RunAnythingHelpItem; import com.intellij.ide.actions.runAnything.items.RunAnythingItem; import com.intellij.ide.actions.runAnything.items.RunAnythingItemBase; @@ -26,13 +23,9 @@ public abstract class RunAnythingProviderBase implements RunAnythingProvider< return ContainerUtil.emptyList(); } - public boolean isMatching(@NotNull DataContext dataContext, @NotNull String pattern, @NotNull V value) { - return StringUtil.equals(pattern, getCommand(value)); - } - @Nullable public V findMatchingValue(@NotNull DataContext dataContext, @NotNull String pattern) { - return getValues(dataContext).stream().filter(value -> isMatching(dataContext, pattern, value)).findFirst().orElse(null); + return getValues(dataContext).stream().filter(value -> StringUtil.equals(pattern, getCommand(value))).findFirst().orElse(null); } @Nullable @@ -77,24 +70,6 @@ public abstract class RunAnythingProviderBase implements RunAnythingProvider< return getCompletionGroupTitle(); } - /** - * Null means no completion - * - * @return - */ - @Nullable - public RunAnythingGroup createCompletionGroup() { - if (RunAnythingGeneralGroup.GENERAL_GROUP_TITLE.equals(getCompletionGroupTitle())) { - return RunAnythingGeneralGroup.INSTANCE; - } - - if (getCompletionGroupTitle() == null) { - return null; - } - - return new RunAnythingCompletionProviderGroup<>(this); - } - @Nullable public Icon getHelpIcon() { return EmptyIcon.ICON_16; diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingCompletionProviderGroup.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingCompletionProviderGroup.java index 625df59b5297..ed4eb12e754d 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingCompletionProviderGroup.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingCompletionProviderGroup.java @@ -8,6 +8,7 @@ import com.intellij.openapi.actionSystem.DataContext; import com.intellij.util.ObjectUtils; import one.util.streamex.StreamEx; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Collection; import java.util.Objects; @@ -48,9 +49,24 @@ public class RunAnythingCompletionProviderGroup getAllGroups() { return StreamEx.of(RunAnythingProvider.EP_NAME.getExtensions()) - .map(provider -> provider.createCompletionGroup()) + .map(provider -> createCompletionGroup(provider)) .filter(Objects::nonNull) .distinct() .collect(Collectors.toList()); } + + @Nullable + public static RunAnythingGroup createCompletionGroup(@NotNull RunAnythingProvider provider) { + String title = provider.getCompletionGroupTitle(); + if (title == null) { + return null; + } + + if (RunAnythingGeneralGroup.GENERAL_GROUP_TITLE.equals(title)) { + return RunAnythingGeneralGroup.INSTANCE; + } + + //noinspection unchecked + return new RunAnythingCompletionProviderGroup(provider); + } } \ No newline at end of file From ef50718c067c67b7542d56e3810fbad8e10cd883 Mon Sep 17 00:00:00 2001 From: "Dmitry.Krasilschikov" Date: Tue, 15 May 2018 15:48:27 +0300 Subject: [PATCH 08/24] UX-157 IJP-56 move ruby specific marker interface to ruby sources --- .../activity/RubyActionCompletionProvider.java | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RubyActionCompletionProvider.java diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RubyActionCompletionProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RubyActionCompletionProvider.java deleted file mode 100644 index 9458ac213e56..000000000000 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RubyActionCompletionProvider.java +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.ide.actions.runAnything.activity; - -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.actionSystem.LangDataKeys; -import com.intellij.openapi.module.Module; -import org.jetbrains.annotations.NotNull; - -/** - * Marker interface for ruby-related providers collection - */ -public interface RubyActionCompletionProvider { - static Module fetchModule(@NotNull DataContext dataContext) { - return LangDataKeys.MODULE.getData(dataContext); - } -} \ No newline at end of file From b03eac8cd418cfa2d5590944714976c7967e3052 Mon Sep 17 00:00:00 2001 From: "Dmitry.Krasilschikov" Date: Tue, 15 May 2018 16:56:54 +0300 Subject: [PATCH 09/24] UX-157 IJP-56 provide docs for run anything provider --- .../runAnything/RunAnythingAction.java | 2 +- .../actions/runAnything/RunAnythingUtil.java | 16 ++++ .../activity/RunAnythingProvider.java | 80 ++++++++++++------- 3 files changed, 70 insertions(+), 28 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingAction.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingAction.java index 77f1c32341ee..5290988e2af8 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingAction.java @@ -423,7 +423,7 @@ public class RunAnythingAction extends AnAction implements CustomComponentAction if (SHIFT_IS_PRESSED.get()) { RunAnythingUtil.triggerShiftStatistics(dataContext); } - onDone = () -> RunAnythingProvider.executeMatched(dataContext, pattern); + onDone = () -> RunAnythingUtil.executeMatched(dataContext, pattern); } finally { final ActionCallback callback = onPopupFocusLost(); diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingUtil.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingUtil.java index 3f0571d0e917..e044a2f87aa5 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingUtil.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingUtil.java @@ -5,6 +5,7 @@ import com.intellij.execution.Executor; import com.intellij.execution.ExecutorRegistry; import com.intellij.icons.AllIcons; import com.intellij.ide.IdeBundle; +import com.intellij.ide.actions.runAnything.activity.RunAnythingProvider; import com.intellij.ide.ui.search.OptionDescription; import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.actionSystem.CommonDataKeys; @@ -37,6 +38,7 @@ import javax.swing.*; import javax.swing.border.Border; import java.awt.*; import java.util.Collection; +import java.util.List; import java.util.Objects; import static com.intellij.ide.actions.runAnything.RunAnythingAction.EXECUTOR_KEY; @@ -186,4 +188,18 @@ public class RunAnythingUtil { public static Project fetchProject(@NotNull DataContext dataContext) { return ObjectUtils.assertNotNull(CommonDataKeys.PROJECT.getData(dataContext)); } + + public static void executeMatched(@NotNull DataContext dataContext, @NotNull String pattern) { + List commands = RunAnythingCache.getInstance(fetchProject(dataContext)).getState().getCommands(); + for (RunAnythingProvider provider : RunAnythingProvider.EP_NAME.getExtensions()) { + Object value = provider.findMatchingValue(dataContext, pattern); + if (value != null) { + //noinspection unchecked + provider.execute(dataContext, value); + commands.remove(pattern); + commands.add(pattern); + break; + } + } + } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProvider.java index 2860c3117629..690916bc8160 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProvider.java @@ -1,21 +1,15 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide.actions.runAnything.activity; -import com.intellij.ide.actions.runAnything.RunAnythingCache; import com.intellij.ide.actions.runAnything.items.RunAnythingItem; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.extensions.ExtensionPointName; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.Arrays; import java.util.Collection; -import java.util.List; - -import static com.intellij.ide.actions.runAnything.RunAnythingUtil.fetchProject; /** * This class provides ability to run an arbitrary activity for matched 'Run Anything' input text @@ -23,30 +17,79 @@ import static com.intellij.ide.actions.runAnything.RunAnythingUtil.fetchProject; public interface RunAnythingProvider { ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.runAnything.executionProvider"); + /** + * Finds matching value by input {@code pattern}. + *

+ * E.g. if input "open #projectName" an action {@link com.intellij.openapi.actionSystem.AnAction} "Open recent project #projectName" is returned, + * for "ruby test.rb" an existing run configuration with the name "ruby test.rb" is find. + * + * @param dataContext use it to fetch project, module, working directory + * @param pattern input string + */ @Nullable V findMatchingValue(@NotNull DataContext dataContext, @NotNull String pattern); + /** + * Gets completions variants for input command prefix. E.g. "rvm use" provider should return list of sdk versions. + * + * @param dataContext use it to fetch project, module, working directory + */ @NotNull Collection getValues(@NotNull DataContext dataContext); + /** + * Execute actual matched {@link #findMatchingValue(DataContext, String)} value. + * + * @param dataContext use it to fetch project, module, working directory + * @param value matched value + */ void execute(@NotNull DataContext dataContext, @NotNull V value); + /** + * A value specific icon is painted it in the search field and used by value presentation wrapper. + * E.g. for a configuration value it gets configuration type icon. + * + * @param value matching value + */ @Nullable Icon getIcon(@NotNull V value); + /** + * If select a value in the list this command will be inserted into the search field. + * + * @param value matching value + */ @NotNull String getCommand(@NotNull V value); + /** + * Returns text that is painted on the popup bottom and changed according to the list selection. + */ @Nullable String getAdText(); + /** + * Returns value's presentation wrapper that is actually added into the main list. + * See also {@link #getHelpItem(DataContext)} + * + * @param dataContext use it to fetch project, module, working directory + * @param value matching value + */ @NotNull RunAnythingItem getMainListItem(@NotNull DataContext dataContext, @NotNull V value); /** - * Null means no completion + * Returns value's presentation wrapper that is actually added into the help list. + * See also {@link #getMainListItem(DataContext, Object)} * - * @return + * @param dataContext use it to fetch project, module, working directory + */ + + @Nullable + RunAnythingItem getHelpItem(@NotNull DataContext dataContext); + + /** + * Returns completion group title. {@code null} means that current provider doesn't provide completion. */ @Nullable String getCompletionGroupTitle(); @@ -54,14 +97,11 @@ public interface RunAnythingProvider { @Nullable String getId(); - @Nullable - RunAnythingItem getHelpItem(@NotNull DataContext dataContext); - /** * Finds provider that matches {@code pattern} * - * @param dataContext 'Run Anything' action {@code dataContext}, may retrieve {@link Project} and {@link Module} from here - * @param pattern 'Run Anything' search bar input text + * @param dataContext use it to fetch project, module, working directory + * @param pattern input string */ @Nullable static RunAnythingProvider findMatchedProvider(@NotNull DataContext dataContext, @NotNull String pattern) { @@ -70,18 +110,4 @@ public interface RunAnythingProvider { .findFirst() .orElse(null); } - - static void executeMatched(@NotNull DataContext dataContext, @NotNull String pattern) { - List commands = RunAnythingCache.getInstance(fetchProject(dataContext)).getState().getCommands(); - for (RunAnythingProvider provider : EP_NAME.getExtensions()) { - Object value = provider.findMatchingValue(dataContext, pattern); - if (value != null) { - //noinspection unchecked - provider.execute(dataContext, value); - commands.remove(pattern); - commands.add(pattern); - break; - } - } - } } \ No newline at end of file From a0b6ad6e5ad17ad0fc2c74941e3e36c02704a8e0 Mon Sep 17 00:00:00 2001 From: "Dmitry.Krasilschikov" Date: Tue, 15 May 2018 18:01:58 +0300 Subject: [PATCH 10/24] UX-157 IJP-56 get rid of provider's getId --- .../runAnything/RunAnythingAction.java | 24 +++++++++---------- .../actions/runAnything/RunAnythingCache.java | 10 ++++---- .../RunAnythingSearchListModel.java | 8 ++++--- .../activity/RunAnythingProvider.java | 3 --- .../activity/RunAnythingProviderBase.java | 10 -------- ...p.java => RunAnythingCompletionGroup.java} | 17 ++++--------- 6 files changed, 27 insertions(+), 45 deletions(-) rename platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/{RunAnythingCompletionProviderGroup.java => RunAnythingCompletionGroup.java} (74%) diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingAction.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingAction.java index 5290988e2af8..c54117df6c51 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingAction.java @@ -12,7 +12,8 @@ import com.intellij.ide.IdeBundle; import com.intellij.ide.IdeEventQueue; import com.intellij.ide.IdeTooltipManager; import com.intellij.ide.actions.runAnything.activity.RunAnythingProvider; -import com.intellij.ide.actions.runAnything.groups.RunAnythingCompletionProviderGroup; +import com.intellij.ide.actions.runAnything.groups.RunAnythingCompletionGroup; +import com.intellij.ide.actions.runAnything.groups.RunAnythingGeneralGroup; import com.intellij.ide.actions.runAnything.groups.RunAnythingGroup; import com.intellij.ide.actions.runAnything.groups.RunAnythingRecentGroup; import com.intellij.ide.actions.runAnything.items.RunAnythingItem; @@ -90,7 +91,6 @@ import javax.swing.event.ListSelectionListener; import javax.swing.plaf.TextUI; import java.awt.*; import java.awt.event.*; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -823,13 +823,11 @@ public class RunAnythingAction extends AnAction implements CustomComponentAction myPopupField.setText(""); final RunAnythingSettingsModel model = new RunAnythingSettingsModel(); - Arrays.stream(RunAnythingProvider.EP_NAME.getExtensions()) - .filter(provider -> provider.getId() != null) - .filter(provider -> provider.getCompletionGroupTitle() != null) - .map(provider -> new RunAnythingSEOption(getProject(), - IdeBundle.message("run.anything.group.settings.title", provider.getCompletionGroupTitle()), - provider.getId())) - .forEach(model::addElement); + RunAnythingCompletionGroup.createCompletionGroups() + .stream() + .map(group -> new RunAnythingSEOption(getProject(), IdeBundle + .message("run.anything.group.settings.title", group.getTitle()), group.getTitle())) + .forEach(model::addElement); if (myCalcThread != null && !myCurrentWorker.isProcessed()) { myCurrentWorker = myCalcThread.cancel(); @@ -1033,7 +1031,9 @@ public class RunAnythingAction extends AnAction implements CustomComponentAction myListModel = reuseModel && model != null ? model - : isHelpMode(pattern) ? new RunAnythingSearchListModel.RunAnythingHelpListModel() : new RunAnythingSearchListModel.RunAnythingMainListModel(); + : isHelpMode(pattern) + ? new RunAnythingSearchListModel.RunAnythingHelpListModel() + : new RunAnythingSearchListModel.RunAnythingMainListModel(); } @Override @@ -1136,8 +1136,8 @@ public class RunAnythingAction extends AnAction implements CustomComponentAction myListModel .getGroups() .stream() - .filter(group -> !(group instanceof RunAnythingCompletionProviderGroup) || - ((RunAnythingCompletionProviderGroup)group).isVisible(myDataContext)) + .filter(group -> group instanceof RunAnythingCompletionGroup || group instanceof RunAnythingGeneralGroup) + .filter(group -> RunAnythingCache.getInstance(myProject).isGroupVisible(group.getTitle())) .forEach(group -> { runReadAction(() -> group.collectItems(myDataContext, myListModel, pattern, checkCancellation)); checkCancellation.run(); diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingCache.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingCache.java index 2c3c5f655cdf..62df9bbf6323 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingCache.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingCache.java @@ -3,7 +3,7 @@ package com.intellij.ide.actions.runAnything; import com.intellij.execution.ExecutionException; import com.intellij.execution.configurations.GeneralCommandLine; -import com.intellij.ide.actions.runAnything.activity.RunAnythingProviderBase; +import com.intellij.ide.actions.runAnything.activity.RunAnythingProvider; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.*; import com.intellij.openapi.project.Project; @@ -93,10 +93,10 @@ public class RunAnythingCache implements PersistentStateComponent myKeys = - StreamEx.of(RunAnythingProviderBase.EP_NAME.getExtensions()) - .filter(provider -> provider.getId() !=null) - .distinct(provider -> provider.getId()) - .collect(Collectors.toMap(group -> group.getId(), group -> true)); + StreamEx.of(RunAnythingProvider.EP_NAME.getExtensions()) + .filter(provider -> provider.getCompletionGroupTitle() != null) + .distinct(RunAnythingProvider::getCompletionGroupTitle) + .collect(Collectors.toMap(RunAnythingProvider::getCompletionGroupTitle, group -> true)); @XCollection(elementName = "command") @NotNull private final List myCommands = ContainerUtil.newArrayList(); diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingSearchListModel.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingSearchListModel.java index ec10233157c4..aba5f4561299 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingSearchListModel.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/RunAnythingSearchListModel.java @@ -1,7 +1,10 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide.actions.runAnything; -import com.intellij.ide.actions.runAnything.groups.*; +import com.intellij.ide.actions.runAnything.groups.RunAnythingCompletionGroup; +import com.intellij.ide.actions.runAnything.groups.RunAnythingGroup; +import com.intellij.ide.actions.runAnything.groups.RunAnythingHelpGroup; +import com.intellij.ide.actions.runAnything.groups.RunAnythingRecentGroup; import com.intellij.openapi.project.Project; import com.intellij.util.ReflectionUtil; import com.intellij.util.containers.ContainerUtil; @@ -102,8 +105,7 @@ public abstract class RunAnythingSearchListModel extends DefaultListModel { @Override public Collection getGroups() { Collection groups = ContainerUtil.newArrayList(RunAnythingRecentGroup.INSTANCE); - groups.add(RunAnythingGeneralGroup.INSTANCE); - groups.addAll(RunAnythingCompletionProviderGroup.MAIN_GROUPS); + groups.addAll(RunAnythingCompletionGroup.MAIN_GROUPS); return groups; } } diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProvider.java index 690916bc8160..f9799ef9c00c 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProvider.java @@ -94,9 +94,6 @@ public interface RunAnythingProvider { @Nullable String getCompletionGroupTitle(); - @Nullable - String getId(); - /** * Finds provider that matches {@code pattern} * diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProviderBase.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProviderBase.java index 78b9d733fdd1..5b2db8c2f6de 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProviderBase.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProviderBase.java @@ -55,21 +55,11 @@ public abstract class RunAnythingProviderBase implements RunAnythingProvider< return new RunAnythingHelpItem(placeholder, commandPrefix, getHelpDescription(), getHelpIcon()); } - /** - * Null means no completion - * - * @return - */ @Nullable public String getCompletionGroupTitle() { return null; } - @Nullable - public String getId() { - return getCompletionGroupTitle(); - } - @Nullable public Icon getHelpIcon() { return EmptyIcon.ICON_16; diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingCompletionProviderGroup.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingCompletionGroup.java similarity index 74% rename from platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingCompletionProviderGroup.java rename to platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingCompletionGroup.java index ed4eb12e754d..f1987f3fae9b 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingCompletionProviderGroup.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/groups/RunAnythingCompletionGroup.java @@ -1,7 +1,6 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide.actions.runAnything.groups; -import com.intellij.ide.actions.runAnything.RunAnythingCache; import com.intellij.ide.actions.runAnything.activity.RunAnythingProvider; import com.intellij.ide.actions.runAnything.items.RunAnythingItem; import com.intellij.openapi.actionSystem.DataContext; @@ -14,14 +13,12 @@ import java.util.Collection; import java.util.Objects; import java.util.stream.Collectors; -import static com.intellij.ide.actions.runAnything.RunAnythingUtil.fetchProject; - -public class RunAnythingCompletionProviderGroup> extends RunAnythingGroupBase { - public static final Collection MAIN_GROUPS = getAllGroups(); +public class RunAnythingCompletionGroup> extends RunAnythingGroupBase { + public static final Collection MAIN_GROUPS = createCompletionGroups(); @NotNull private final P myProvider; - public RunAnythingCompletionProviderGroup(@NotNull P provider) { + public RunAnythingCompletionGroup(@NotNull P provider) { myProvider = provider; } @@ -43,11 +40,7 @@ public class RunAnythingCompletionProviderGroup provider.getMainListItem(dataContext, value)).collect(Collectors.toList()); } - public final boolean isVisible(@NotNull DataContext dataContext) { - return RunAnythingCache.getInstance(fetchProject(dataContext)).isGroupVisible(Objects.requireNonNull(getProvider().getId())); - } - - public static Collection getAllGroups() { + public static Collection createCompletionGroups() { return StreamEx.of(RunAnythingProvider.EP_NAME.getExtensions()) .map(provider -> createCompletionGroup(provider)) .filter(Objects::nonNull) @@ -67,6 +60,6 @@ public class RunAnythingCompletionProviderGroup Date: Wed, 16 May 2018 14:10:57 +0300 Subject: [PATCH 11/24] UX-157 IJP-56 enrich docs for run anything provider --- .../actions/runAnything/activity/RunAnythingProvider.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProvider.java index f9799ef9c00c..ffab861d428b 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProvider.java @@ -12,7 +12,12 @@ import java.util.Arrays; import java.util.Collection; /** - * This class provides ability to run an arbitrary activity for matched 'Run Anything' input text + * This class provides ability to run an arbitrary activity for matched input text. + *

+ * {@link RunAnythingProvider} operates with {@code V} that represents a value to be executed. + * E.g. {@code V} can be a run configuration, an action or a string command to be executed in console. + *

+ * See {@link RunAnythingRunConfigurationExecutionProvider}, {@link RunAnythingCommandExecutionProviderBase} and others inheritors. */ public interface RunAnythingProvider { ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.runAnything.executionProvider"); From 4e6a140b72cae7f3e74935d97831fa117bdfdf5c Mon Sep 17 00:00:00 2001 From: "Dmitry.Krasilschikov" Date: Thu, 17 May 2018 13:29:06 +0300 Subject: [PATCH 12/24] UX-157 IJP-56 allow provider to have nullable icon --- .../actions/runAnything/activity/RunAnythingProviderBase.java | 2 +- .../ide/actions/runAnything/items/RunAnythingItemBase.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProviderBase.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProviderBase.java index 5b2db8c2f6de..c215dad42439 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProviderBase.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/activity/RunAnythingProviderBase.java @@ -30,7 +30,7 @@ public abstract class RunAnythingProviderBase implements RunAnythingProvider< @Nullable public Icon getIcon(@NotNull V value) { - return EmptyIcon.ICON_16; + return null; } @Nullable diff --git a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/items/RunAnythingItemBase.java b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/items/RunAnythingItemBase.java index 95a10eacb480..2a10b59cdb42 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/runAnything/items/RunAnythingItemBase.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/runAnything/items/RunAnythingItemBase.java @@ -3,6 +3,8 @@ package com.intellij.ide.actions.runAnything.items; import com.intellij.ui.SimpleColoredComponent; import com.intellij.ui.SimpleTextAttributes; +import com.intellij.util.ObjectUtils; +import com.intellij.util.ui.EmptyIcon; import com.intellij.util.ui.JBUI; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -36,7 +38,7 @@ public class RunAnythingItemBase extends RunAnythingItem { } public void setupIcon(@NotNull SimpleColoredComponent component, @Nullable Icon icon) { - component.setIcon(icon); + component.setIcon(ObjectUtils.notNull(icon, EmptyIcon.ICON_16)); component.setIconTextGap(5); component.setIpad(JBUI.insets(0, 10, 0, 0)); } From 5f45711912ea90a1345ae99270ad4611a0c64442 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Thu, 17 May 2018 15:13:53 +0300 Subject: [PATCH 13/24] increase line limit causing forced soft wrapping IDEA seems to handle long lines much better now --- platform/util/resources/misc/registry.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index 888d29876c0e..06597b140bf8 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -299,7 +299,7 @@ editor.smarterSelectionQuoting=true editor.skip.copy.and.cut.for.empty.selection=false editor.distraction.free.mode=false -editor.soft.wrap.force.limit=10000 +editor.soft.wrap.force.limit=100000 editor.soft.wrap.force.limit.description=If document contains lines longer than this value, soft wraps will be forcibly enabled in editor due to performance reasons editor.navigation.history.stack.size=150 From f49603504a052575eac043c5e3a6953706626913 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Thu, 17 May 2018 15:15:21 +0300 Subject: [PATCH 14/24] better handling for ParserStoppedXmlException --- .../indexing-api/src/com/intellij/util/xml/NanoXmlUtil.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/platform/indexing-api/src/com/intellij/util/xml/NanoXmlUtil.java b/platform/indexing-api/src/com/intellij/util/xml/NanoXmlUtil.java index 05d9141ee782..1875e7cca246 100644 --- a/platform/indexing-api/src/com/intellij/util/xml/NanoXmlUtil.java +++ b/platform/indexing-api/src/com/intellij/util/xml/NanoXmlUtil.java @@ -106,9 +106,10 @@ public class NanoXmlUtil { try { parser.parse(); } + catch (ParserStoppedXmlException ignore) { + } catch (XMLException e) { - if (e.getException() instanceof ParserStoppedXmlException) return; - LOG.debug(e); + LOG.warn(e); } } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) { From d33c82276c290f4dbbf62adce4c6cf5f0221dc92 Mon Sep 17 00:00:00 2001 From: Kirill Kirichenko Date: Thu, 17 May 2018 15:18:34 +0300 Subject: [PATCH 15/24] IDEA-192178 Enable bare IntelliJ laf on mac. --- .../com/intellij/ide/ui/laf/IntelliJLaf.java | 17 +++++++++++ .../ide/ui/laf/darcula/DarculaLaf.java | 28 +++++++++---------- .../laf/intellijlaf_native_windows.properties | 0 .../util/resources/misc/registry.properties | 6 +++- .../util/src/com/intellij/util/ui/UIUtil.java | 2 +- 5 files changed, 37 insertions(+), 16 deletions(-) delete mode 100644 platform/platform-impl/src/com/intellij/ide/ui/laf/intellijlaf_native_windows.properties diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/IntelliJLaf.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/IntelliJLaf.java index 783a0fb0d68b..b260149eb811 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/IntelliJLaf.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/IntelliJLaf.java @@ -16,12 +16,15 @@ package com.intellij.ide.ui.laf; import com.intellij.ide.ui.laf.darcula.DarculaLaf; +import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.registry.RegistryValue; import com.intellij.openapi.util.registry.RegistryValueListener; import com.intellij.ui.mac.foundation.Foundation; import com.intellij.ui.mac.foundation.MacUtil; import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.plaf.basic.BasicLookAndFeel; @@ -38,10 +41,24 @@ public class IntelliJLaf extends DarculaLaf { } @Override + @NotNull protected String getPrefix() { return UIUtil.isUnderWin10LookAndFeel() ? "intellijlaf_native" : "intellijlaf"; } + @Nullable + protected String getSystemPrefix() { + if (SystemInfo.isLinux) { + return super.getSystemPrefix(); + } else if (SystemInfo.isWindows) { + return UIUtil.isUnderWin10LookAndFeel() ? null : getPrefix() + "_windows"; + } else if (SystemInfo.isMac) { + return UIUtil.isUnderDefaultMacTheme() ? getPrefix() + "_mac" : null; + } else { + return null; + } + } + @Override protected BasicLookAndFeel createBaseLookAndFeel() { Registry.get("ide.intellij.laf.win10.ui").addListener(new RegistryValueListener.Adapter() { diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/DarculaLaf.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/DarculaLaf.java index d447bc367553..0f84ab48fc50 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/DarculaLaf.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/DarculaLaf.java @@ -13,6 +13,7 @@ import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.registry.Registry; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.util.Alarm; import com.intellij.util.containers.hash.HashMap; @@ -20,6 +21,7 @@ import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; import org.intellij.lang.annotations.JdkConstants; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import sun.awt.AppContext; import javax.swing.*; @@ -233,19 +235,15 @@ public class DarculaLaf extends BasicLookAndFeel { } } + @NotNull protected String getPrefix() { return "darcula"; } - private void call(String method) { - try { - final Method superMethod = BasicLookAndFeel.class.getDeclaredMethod(method); - superMethod.setAccessible(true); - superMethod.invoke(base); - } - catch (Exception ignore) { - log(ignore); - } + @Nullable + protected String getSystemPrefix() { + String osSuffix = SystemInfo.isMac ? "mac" : SystemInfo.isWindows ? "windows" : "linux"; + return getPrefix() + "_" + osSuffix; } public void initComponentDefaults(UIDefaults defaults) { @@ -313,16 +311,18 @@ public class DarculaLaf extends BasicLookAndFeel { @SuppressWarnings("IOResourceOpenedButNotSafelyClosed") protected void loadDefaults(UIDefaults defaults) { - final Properties properties = new Properties(); - final String osSuffix = SystemInfo.isMac ? "mac" : SystemInfo.isWindows ? "windows" : "linux"; + Properties properties = new Properties(); try { InputStream stream = getClass().getResourceAsStream(getPrefix() + ".properties"); properties.load(stream); stream.close(); - stream = getClass().getResourceAsStream(getPrefix() + "_" + osSuffix + ".properties"); - properties.load(stream); - stream.close(); + String systemPrefix = getSystemPrefix(); + if (StringUtil.isNotEmpty(systemPrefix)) { + stream = getClass().getResourceAsStream(systemPrefix + ".properties"); + properties.load(stream); + stream.close(); + } HashMap darculaGlobalSettings = new HashMap<>(); final String prefix = getPrefix() + "."; diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellijlaf_native_windows.properties b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellijlaf_native_windows.properties deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index 06597b140bf8..a2896775b0da 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -1365,9 +1365,13 @@ ide.text.mouse.selection.new=true ide.text.mouse.selection.description=Use improved mouse-drag processing in single-line text components when mouse pointer is out of area ide.intellij.laf.win10.ui=true -ide.intellij.laf.win10.restartRequired=true +ide.intellij.laf.win10.ui.restartRequired=true ide.intellij.laf.win10.ui.description=Enables Windows 10 look +ide.intellij.laf.macos.ui=true +ide.intellij.laf.macos.ui.restartRequired=true +ide.intellij.laf.macos.ui.description=Enables MacOS Light theme + ide.http.server.response.actual.status=false ide.rest.api.requests.per.minute=30 ide.built.in.web.server.activatable=false diff --git a/platform/util/src/com/intellij/util/ui/UIUtil.java b/platform/util/src/com/intellij/util/ui/UIUtil.java index c4cfa654aacc..a8979e32f3f8 100644 --- a/platform/util/src/com/intellij/util/ui/UIUtil.java +++ b/platform/util/src/com/intellij/util/ui/UIUtil.java @@ -1643,7 +1643,7 @@ public class UIUtil { } public static boolean isUnderDefaultMacTheme() { - return SystemInfo.isMac && isUnderIntelliJLaF(); + return SystemInfo.isMac && isUnderIntelliJLaF() && Registry.is("ide.intellij.laf.macos.ui"); } public static boolean isUnderWin10LookAndFeel() { From b0844ce60be21d185c8b621365a5049ae2077704 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 17 May 2018 15:39:22 +0300 Subject: [PATCH 16/24] get back ability for indicator.startNonCancelableSection() to not throw in indicator.checkCanceled() (for obsolete plugins not yet ported to ProgressManager.executeInNonCancelableSection()) --- .../progress/DumbProgressIndicator.java | 8 ------- .../progress/EmptyProgressIndicator.java | 5 ++++- .../openapi/progress/ProgressIndicator.java | 4 ++-- .../progress/impl/NonCancelableIndicator.java | 10 --------- .../util/AbstractProgressIndicatorBase.java | 5 ++++- .../ide/util/DelegatingProgressIndicator.java | 2 ++ .../progress/impl/ProgressIndicatorTest.java | 21 +++++++++++++++++++ 7 files changed, 33 insertions(+), 22 deletions(-) diff --git a/platform/core-api/src/com/intellij/openapi/progress/DumbProgressIndicator.java b/platform/core-api/src/com/intellij/openapi/progress/DumbProgressIndicator.java index c7c3c305793e..e92378c5f80d 100644 --- a/platform/core-api/src/com/intellij/openapi/progress/DumbProgressIndicator.java +++ b/platform/core-api/src/com/intellij/openapi/progress/DumbProgressIndicator.java @@ -67,14 +67,6 @@ public class DumbProgressIndicator implements StandardProgressIndicator { public void popState() { } - @Override - public void startNonCancelableSection() { - } - - @Override - public void finishNonCancelableSection() { - } - @Override public boolean isModal() { return false; diff --git a/platform/core-api/src/com/intellij/openapi/progress/EmptyProgressIndicator.java b/platform/core-api/src/com/intellij/openapi/progress/EmptyProgressIndicator.java index 3efaa065343f..d011cfe31497 100644 --- a/platform/core-api/src/com/intellij/openapi/progress/EmptyProgressIndicator.java +++ b/platform/core-api/src/com/intellij/openapi/progress/EmptyProgressIndicator.java @@ -25,6 +25,7 @@ public class EmptyProgressIndicator implements StandardProgressIndicator { private volatile boolean myIsRunning; private volatile boolean myIsCanceled; + private volatile int myNonCancelableSectionCount; public EmptyProgressIndicator() { this(ModalityState.defaultModalityState()); @@ -63,7 +64,7 @@ public class EmptyProgressIndicator implements StandardProgressIndicator { @Override public final void checkCanceled() { - if (myIsCanceled) { + if (myIsCanceled && myNonCancelableSectionCount == 0) { throw new ProcessCanceledException(); } } @@ -105,10 +106,12 @@ public class EmptyProgressIndicator implements StandardProgressIndicator { @Override public void startNonCancelableSection() { + myNonCancelableSectionCount++; } @Override public void finishNonCancelableSection() { + myNonCancelableSectionCount--; } @Override diff --git a/platform/core-api/src/com/intellij/openapi/progress/ProgressIndicator.java b/platform/core-api/src/com/intellij/openapi/progress/ProgressIndicator.java index 428703d6f7e2..ec0003bfb608 100644 --- a/platform/core-api/src/com/intellij/openapi/progress/ProgressIndicator.java +++ b/platform/core-api/src/com/intellij/openapi/progress/ProgressIndicator.java @@ -57,11 +57,11 @@ public interface ProgressIndicator { /** use {@link ProgressManager#executeNonCancelableSection(Runnable)} instead */ @Deprecated - void startNonCancelableSection(); + default void startNonCancelableSection() {} /** use {@link ProgressManager#executeNonCancelableSection(Runnable)} instead */ @Deprecated - void finishNonCancelableSection(); + default void finishNonCancelableSection() {} boolean isModal(); diff --git a/platform/core-impl/src/com/intellij/openapi/progress/impl/NonCancelableIndicator.java b/platform/core-impl/src/com/intellij/openapi/progress/impl/NonCancelableIndicator.java index cb88249165d4..26adf0667e0e 100644 --- a/platform/core-impl/src/com/intellij/openapi/progress/impl/NonCancelableIndicator.java +++ b/platform/core-impl/src/com/intellij/openapi/progress/impl/NonCancelableIndicator.java @@ -111,16 +111,6 @@ class NonCancelableIndicator implements NonCancelableSection, StandardProgressIn } - @Override - public void startNonCancelableSection() { - - } - - @Override - public void finishNonCancelableSection() { - - } - @Override public boolean isModal() { return false; diff --git a/platform/core-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorBase.java b/platform/core-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorBase.java index 5570c924ff8f..6ae4cdc29675 100644 --- a/platform/core-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorBase.java +++ b/platform/core-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorBase.java @@ -61,6 +61,7 @@ public class AbstractProgressIndicatorBase extends UserDataHolderBase implements ProgressIndicator myModalityProgress; private volatile ModalityState myModalityState = ModalityState.NON_MODAL; + private volatile int myNonCancelableSectionCount; @Override public synchronized void start() { @@ -209,14 +210,16 @@ public class AbstractProgressIndicatorBase extends UserDataHolderBase implements @Override public void startNonCancelableSection() { + myNonCancelableSectionCount++; } @Override public void finishNonCancelableSection() { + myNonCancelableSectionCount--; } protected boolean isCancelable() { - return !ProgressManager.getInstance().isInNonCancelableSection(); + return myNonCancelableSectionCount == 0 && !ProgressManager.getInstance().isInNonCancelableSection(); } @Override diff --git a/platform/platform-api/src/com/intellij/ide/util/DelegatingProgressIndicator.java b/platform/platform-api/src/com/intellij/ide/util/DelegatingProgressIndicator.java index 2d17b4c01602..8e7594b5ead0 100644 --- a/platform/platform-api/src/com/intellij/ide/util/DelegatingProgressIndicator.java +++ b/platform/platform-api/src/com/intellij/ide/util/DelegatingProgressIndicator.java @@ -102,10 +102,12 @@ public class DelegatingProgressIndicator implements WrappedProgressIndicator, St @Override public void startNonCancelableSection() { + myIndicator.startNonCancelableSection(); } @Override public void finishNonCancelableSection() { + myIndicator.finishNonCancelableSection(); } @Override diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/progress/impl/ProgressIndicatorTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/progress/impl/ProgressIndicatorTest.java index 523be597e3e6..4ae475801417 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/progress/impl/ProgressIndicatorTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/progress/impl/ProgressIndicatorTest.java @@ -44,6 +44,7 @@ import com.intellij.util.containers.DoubleArrayList; import com.intellij.util.containers.Stack; import com.intellij.util.ui.UIUtil; import gnu.trove.TLongArrayList; +import org.assertj.core.util.VisibleForTesting; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -804,9 +805,29 @@ public class ProgressIndicatorTest extends LightPlatformTestCase { } private static class MyAbstractProgressIndicator extends AbstractProgressIndicatorBase { + @VisibleForTesting @Override public boolean isCancelable() { return super.isCancelable(); } } + + public void testIndicatorsStillNotThrowInCheckCanceledIfCalledStartNonCancelableSectionBeforeByOldStaleDeprecatedPluginsNotYetPortedToProgressManagerExecuteInNonCancelableSection() { + checkIndicatorNotThrowInThisOldStaleDisgustingNonCancelableSection(new EmptyProgressIndicator()); + checkIndicatorNotThrowInThisOldStaleDisgustingNonCancelableSection(new AbstractProgressIndicatorBase()); + } + + private static void checkIndicatorNotThrowInThisOldStaleDisgustingNonCancelableSection(ProgressIndicator indicator) { + assertFalse(ProgressManager.getInstance().isInNonCancelableSection()); + indicator.startNonCancelableSection(); + indicator.cancel(); + indicator.checkCanceled(); + indicator.finishNonCancelableSection(); + try { + indicator.checkCanceled(); + fail("Must throw"); + } + catch (ProcessCanceledException ignored) { + } + } } From 1ea80fcd788ca29da29bed98c56cba3c9468b6ac Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 17 May 2018 14:40:42 +0200 Subject: [PATCH 17/24] file history: don't run too more than one VCS processes at a time (IDEA-192097) --- .../vcs/history/FileHistoryPanelImpl.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryPanelImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryPanelImpl.java index 8802d9292942..c7d8218e1eae 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryPanelImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryPanelImpl.java @@ -55,6 +55,7 @@ import com.intellij.ui.dualView.TreeTableView; import com.intellij.ui.speedSearch.SpeedSearchUtil; import com.intellij.ui.table.TableView; import com.intellij.util.*; +import com.intellij.util.concurrency.SequentialTaskExecutor; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.text.DateFormatUtil; import com.intellij.util.ui.ColumnInfo; @@ -76,6 +77,8 @@ import java.awt.datatransfer.StringSelection; import java.io.IOException; import java.util.*; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; import static java.util.Comparator.comparing; import static java.util.Comparator.reverseOrder; @@ -84,6 +87,7 @@ import static java.util.Comparator.reverseOrder; * author: lesya */ public class FileHistoryPanelImpl extends PanelWithActionsAndCloseButton implements EditorColorsListener, CopyProvider { + private static final ExecutorService ourExecutor = SequentialTaskExecutor.createSequentialApplicationPoolExecutor("File History Refresh"); private static final String COMMIT_MESSAGE_TITLE = VcsBundle.message("label.selected.revision.commit.message"); private static final String VCS_HISTORY_POPUP_ACTION_GROUP = "VcsHistoryInternalGroup.Popup"; private static final String VCS_HISTORY_TOOLBAR_ACTION_GROUP = "VcsHistoryInternalGroup.Toolbar"; @@ -194,27 +198,33 @@ public class FileHistoryPanelImpl extends PanelWithActionsAndCloseButton impleme } }; + int delayMillis = 20_000; Alarm updateAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD, this); // todo react to event? updateAlarm.addRequest(new Runnable() { + Future lastTask; + public void run() { + if (lastTask != null) { + lastTask.cancel(false); + } if (myVcs.getProject().isDisposed()) { return; } updateAlarm.cancelAllRequests(); if (updateAlarm.isDisposed()) return; - updateAlarm.addRequest(this, 20000); + updateAlarm.addRequest(this, delayMillis); if (!ApplicationManager.getApplication().isActive()) return; - ApplicationManager.getApplication().executeOnPooledThread(() -> { - if (!myInRefresh && myHistorySession.shouldBeRefreshed()) { + lastTask = ourExecutor.submit(() -> { + if (!myInRefresh && !updateAlarm.isDisposed() && myHistorySession.shouldBeRefreshed()) { refreshUiAndScheduleDataRefresh(true); } }); } - }, 20000); + }, delayMillis); init(); From 9af7b4d15894595df717569b6dc7eb72dd3e11d4 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Thu, 17 May 2018 16:03:45 +0300 Subject: [PATCH 18/24] XmlIndex: accept xsd only by default --- .../xml/index/SchemaTypeInheritanceIndex.java | 2 +- .../src/com/intellij/xml/index/XmlIndex.java | 49 ++----------------- .../intellij/xml/index/XmlNamespaceIndex.java | 24 +++++++-- 3 files changed, 24 insertions(+), 51 deletions(-) diff --git a/xml/xml-psi-impl/src/com/intellij/xml/index/SchemaTypeInheritanceIndex.java b/xml/xml-psi-impl/src/com/intellij/xml/index/SchemaTypeInheritanceIndex.java index 552173f629f3..717d43cd73cd 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/index/SchemaTypeInheritanceIndex.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/index/SchemaTypeInheritanceIndex.java @@ -98,7 +98,7 @@ public class SchemaTypeInheritanceIndex extends XmlIndex> { @Override public int getVersion() { - return 1; + return 2; } @NotNull diff --git a/xml/xml-psi-impl/src/com/intellij/xml/index/XmlIndex.java b/xml/xml-psi-impl/src/com/intellij/xml/index/XmlIndex.java index 109032467860..6810626b13cb 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/index/XmlIndex.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/index/XmlIndex.java @@ -15,16 +15,10 @@ */ package com.intellij.xml.index; -import com.intellij.ide.highlighter.DTDFileType; import com.intellij.ide.highlighter.XmlFileType; -import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.OrderEntry; -import com.intellij.openapi.roots.ProjectFileIndex; -import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VirtualFileFilter; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.util.indexing.DefaultFileTypeSpecificInputFilter; import com.intellij.util.indexing.FileBasedIndex; @@ -33,8 +27,6 @@ import com.intellij.util.io.EnumeratorStringDescriptor; import com.intellij.util.io.KeyDescriptor; import org.jetbrains.annotations.NotNull; -import java.util.List; - /** * @author Dmitry Avdeev */ @@ -66,52 +58,19 @@ public abstract class XmlIndex extends FileBasedIndexExtension { }; } - - protected static VirtualFileFilter createFilter(@NotNull final Module module) { - - final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(module.getProject()).getFileIndex(); - return new VirtualFileFilter() { - @Override - public boolean accept(final VirtualFile file) { - Module moduleForFile = fileIndex.getModuleForFile(file); - if (moduleForFile != null) { // in module content - return module.equals(moduleForFile); - } - if (fileIndex.isInLibraryClasses(file)) { - List orderEntries = fileIndex.getOrderEntriesForFile(file); - if (orderEntries.isEmpty()) { - return false; - } - for (OrderEntry orderEntry : orderEntries) { - Module ownerModule = orderEntry.getOwnerModule(); - if (ownerModule.equals(module)) { - return true; - } - } - } - final VirtualFile parent = file.getParent(); - assert parent != null; - return parent.getName().equals("standardSchemas"); - } - }; - } - @Override @NotNull public KeyDescriptor getKeyDescriptor() { return EnumeratorStringDescriptor.INSTANCE; } - @Override @NotNull + @Override public FileBasedIndex.InputFilter getInputFilter() { - return new DefaultFileTypeSpecificInputFilter(XmlFileType.INSTANCE, DTDFileType.INSTANCE) { + return new DefaultFileTypeSpecificInputFilter(XmlFileType.INSTANCE) { @Override public boolean acceptInput(@NotNull final VirtualFile file) { - FileType fileType = file.getFileType(); - final String extension = file.getExtension(); - return XmlFileType.INSTANCE.equals(fileType) && "xsd".equals(extension) || - DTDFileType.INSTANCE.equals(fileType) && "dtd".equals(extension); + return XmlFileType.INSTANCE.equals(file.getFileType()) && "xsd".equals(file.getExtension()); } }; } @@ -123,6 +82,6 @@ public abstract class XmlIndex extends FileBasedIndexExtension { @Override public int getVersion() { - return 0; + return 1; } } diff --git a/xml/xml-psi-impl/src/com/intellij/xml/index/XmlNamespaceIndex.java b/xml/xml-psi-impl/src/com/intellij/xml/index/XmlNamespaceIndex.java index de48ce5a8c39..393c237cb62a 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/index/XmlNamespaceIndex.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/index/XmlNamespaceIndex.java @@ -15,6 +15,9 @@ */ package com.intellij.xml.index; +import com.intellij.ide.highlighter.DTDFileType; +import com.intellij.ide.highlighter.XmlFileType; +import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.project.DumbService; @@ -25,10 +28,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.xml.XmlFile; import com.intellij.util.NullableFunction; -import com.intellij.util.indexing.DataIndexer; -import com.intellij.util.indexing.FileBasedIndex; -import com.intellij.util.indexing.FileContent; -import com.intellij.util.indexing.ID; +import com.intellij.util.indexing.*; import com.intellij.util.io.DataExternalizer; import com.intellij.util.io.IOUtil; import com.intellij.util.text.CharArrayUtil; @@ -91,6 +91,20 @@ public class XmlNamespaceIndex extends XmlIndex { return NAME; } + @NotNull + @Override + public FileBasedIndex.InputFilter getInputFilter() { + return new DefaultFileTypeSpecificInputFilter(XmlFileType.INSTANCE, DTDFileType.INSTANCE) { + @Override + public boolean acceptInput(@NotNull final VirtualFile file) { + FileType fileType = file.getFileType(); + final String extension = file.getExtension(); + return XmlFileType.INSTANCE.equals(fileType) && "xsd".equals(extension) || + DTDFileType.INSTANCE.equals(fileType) && "dtd".equals(extension); + } + }; + } + @Override @NotNull public DataIndexer getIndexer() { @@ -148,7 +162,7 @@ public class XmlNamespaceIndex extends XmlIndex { @Override public int getVersion() { - return 5; + return 6; } @Nullable From 4d5526c92b4f7e520931cc8635c60ad613ff457c Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 17 May 2018 15:10:37 +0200 Subject: [PATCH 19/24] [platform] correct URL encoding/decoding in file selecting listener (IDEA-191122) --- .../com/intellij/ide/actions/ShowFilePathAction.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/ide/actions/ShowFilePathAction.java b/platform/platform-impl/src/com/intellij/ide/actions/ShowFilePathAction.java index 4ec187551721..d054bff01d5c 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/ShowFilePathAction.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/ShowFilePathAction.java @@ -45,6 +45,7 @@ import javax.swing.filechooser.FileSystemView; import java.awt.*; import java.awt.event.MouseEvent; import java.io.*; +import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.List; @@ -60,7 +61,14 @@ public class ShowFilePathAction extends DumbAwareAction { @Override protected void hyperlinkActivated(@NotNull Notification notification, @NotNull HyperlinkEvent e) { URL url = e.getURL(); - if (url != null) openFile(new File(url.getPath())); + if (url != null) { + try { + openFile(new File(url.toURI())); + } + catch (URISyntaxException ex) { + LOG.warn("invalid URL: " + url, ex); + } + } notification.expire(); } }; From 1cececfe6135bceb54ee307161bcb20d94169fac Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Thu, 17 May 2018 13:56:25 +0200 Subject: [PATCH 20/24] IDEA-191264 remember state of "Remember" checkbox State is global - per-IDE and for all credentials prompts --- .../credentialStore/credentialPromt.kt | 61 ++++++++++--------- .../diagnostic/JetBrainsAccountDialog.kt | 16 ++++- 2 files changed, 46 insertions(+), 31 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/credentialStore/credentialPromt.kt b/platform/platform-impl/src/com/intellij/credentialStore/credentialPromt.kt index 4c9809f088dc..c0a6c9aeb46e 100644 --- a/platform/platform-impl/src/com/intellij/credentialStore/credentialPromt.kt +++ b/platform/platform-impl/src/com/intellij/credentialStore/credentialPromt.kt @@ -1,23 +1,10 @@ -/* - * Copyright 2000-2017 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. @file:JvmName("CredentialPromptDialog") package com.intellij.credentialStore import com.intellij.CommonBundle import com.intellij.ide.passwordSafe.PasswordSafe +import com.intellij.ide.util.PropertiesComponent import com.intellij.openapi.application.ModalityState import com.intellij.openapi.application.invokeAndWaitIfNeed import com.intellij.openapi.project.Project @@ -26,6 +13,7 @@ import com.intellij.ui.components.CheckBox import com.intellij.ui.components.dialog import com.intellij.ui.layout.* import com.intellij.util.text.nullize +import javax.swing.JCheckBox import javax.swing.JPasswordField /** @@ -43,7 +31,21 @@ fun askPassword(project: Project?, attributes: CredentialAttributes, resetPassword: Boolean = false, error: String? = null): String? { - return askCredentials(project, dialogTitle, passwordFieldLabel, attributes, resetPassword = resetPassword, error = error)?.credentials?.getPasswordAsString()?.nullize() + return askCredentials(project, dialogTitle, passwordFieldLabel, attributes, resetPassword = resetPassword, error = error)?.credentials?.getPasswordAsString()?.nullize() +} + +internal object RememberCheckBoxState { + private const val key = "checkbox.remember.password" + private const val defaultValue = true + + val isSelected: Boolean + get() { + return PropertiesComponent.getInstance().getBoolean(key, defaultValue) + } + + fun update(component: JCheckBox) { + PropertiesComponent.getInstance().setValue(key, component.isSelected, defaultValue) + } } @JvmOverloads @@ -51,7 +53,7 @@ fun askCredentials(project: Project?, dialogTitle: String, passwordFieldLabel: String, attributes: CredentialAttributes, - saveOnSuccess: Boolean = true, + isSaveOnOk: Boolean = true, checkExistingBeforeDialog: Boolean = true, resetPassword: Boolean = false, error: String? = null): CredentialRequestResult? { @@ -72,7 +74,7 @@ fun askCredentials(project: Project?, } else { CheckBox(CommonBundle.message("checkbox.remember.password"), - selected = true, + selected = RememberCheckBoxState.isSelected, toolTip = "The password will be stored between application sessions.") } @@ -85,18 +87,21 @@ fun askCredentials(project: Project?, } AppIcon.getInstance().requestAttention(project, true) - if (dialog(dialogTitle, project = project, panel = panel, focusedComponent = passwordField, errorText = error).showAndGet()) { - val isMemoryOnly = store.isMemoryOnly || !rememberCheckBox!!.isSelected - val credentials = Credentials(attributes.userName, passwordField.password.nullize()) - if (saveOnSuccess) { - store.set(attributes, credentials, isMemoryOnly) - credentials.getPasswordAsString() - } - return@invokeAndWaitIfNeed CredentialRequestResult(credentials, isMemoryOnly, false) + if (!dialog(dialogTitle, project = project, panel = panel, focusedComponent = passwordField, errorText = error).showAndGet()) { + return@invokeAndWaitIfNeed null } - else { - null + + if (rememberCheckBox != null) { + RememberCheckBoxState.update(rememberCheckBox) } + + val isMemoryOnly = store.isMemoryOnly || !rememberCheckBox!!.isSelected + val credentials = Credentials(attributes.userName, passwordField.password.nullize()) + if (isSaveOnOk) { + store.set(attributes, credentials, isMemoryOnly) + credentials.getPasswordAsString() + } + return@invokeAndWaitIfNeed CredentialRequestResult(credentials, isMemoryOnly, false) } } diff --git a/platform/platform-impl/src/com/intellij/diagnostic/JetBrainsAccountDialog.kt b/platform/platform-impl/src/com/intellij/diagnostic/JetBrainsAccountDialog.kt index 2fe2e36de7d6..448f28c0a203 100644 --- a/platform/platform-impl/src/com/intellij/diagnostic/JetBrainsAccountDialog.kt +++ b/platform/platform-impl/src/com/intellij/diagnostic/JetBrainsAccountDialog.kt @@ -4,6 +4,7 @@ package com.intellij.diagnostic import com.intellij.CommonBundle import com.intellij.credentialStore.CredentialAttributes import com.intellij.credentialStore.Credentials +import com.intellij.credentialStore.RememberCheckBoxState import com.intellij.ide.BrowserUtil import com.intellij.ide.passwordSafe.PasswordSafe import com.intellij.openapi.project.Project @@ -23,9 +24,17 @@ fun showJetBrainsAccountDialog(parent: Component, project: Project? = null): Dia val userField = JTextField(credentials?.userName) val passwordField = JPasswordField(credentials?.password?.toString()) - // if no user name - never stored and so, defaults to remember. if user name set, but no password, so, previously was stored without password - val selected = credentials?.userName == null || !credentials.password.isNullOrEmpty() - val rememberCheckBox = CheckBox(CommonBundle.message("checkbox.remember.password"), selected) + val isSelected = if (credentials?.userName == null) { + // if no user name - never stored and so, defaults + RememberCheckBoxState.isSelected + } + else { + // if user name set, but no password, so, previously was stored without password + !credentials.password.isNullOrEmpty() + } + + credentials?.userName == null || !credentials.password.isNullOrEmpty() + val rememberCheckBox = CheckBox(CommonBundle.message("checkbox.remember.password"), isSelected) val panel = panel { noteRow("Login to JetBrains Account to get notified\nwhen the submitted exceptions are fixed.") @@ -51,6 +60,7 @@ fun showJetBrainsAccountDialog(parent: Component, project: Project? = null): Dia parent = if (parent.isShowing) parent else null) { val userName = userField.text.nullize(true) val password = if (rememberCheckBox.isSelected) passwordField.password else null + RememberCheckBoxState.update(rememberCheckBox) PasswordSafe.getInstance().set(CredentialAttributes(ErrorReportConfigurable.SERVICE_NAME, userName), Credentials(userName, password)) return@dialog null } From 240a89dbf5eaea25abbbe30fbe532dea017f7f8b Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Thu, 17 May 2018 14:13:28 +0200 Subject: [PATCH 21/24] convert PasswordSafePromptDialog to kotlin --- .../ui/PasswordSafePromptDialog.java | 39 ++++++++----------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.java b/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.java index c2ea7de2f879..114113ddea44 100644 --- a/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.java +++ b/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.java @@ -13,30 +13,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.intellij.ide.passwordSafe.ui; +package com.intellij.ide.passwordSafe.ui -import com.intellij.credentialStore.CredentialPromptDialog; -import com.intellij.openapi.project.Project; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import com.intellij.credentialStore.CredentialAttributes +import com.intellij.credentialStore.askPassword +import com.intellij.openapi.project.Project -import static com.intellij.credentialStore.CredentialAttributesKt.CredentialAttributes; - -@Deprecated -public class PasswordSafePromptDialog { - /** - * @deprecated Use {@link CredentialPromptDialog} - */ - @Nullable - @Deprecated - public static String askPassword(@Nullable Project project, - String title, - String message, - @NotNull Class requestor, - String key, - boolean resetPassword, - String error) { - return CredentialPromptDialog.askPassword(project, title, message, CredentialAttributes(requestor, key), resetPassword, error); +@Deprecated("") +object PasswordSafePromptDialog { + @Deprecated("Use {@link CredentialPromptDialog}", + ReplaceWith("askPassword(project, title, message, CredentialAttributes(requestor, key), resetPassword, error)", "com.intellij.credentialStore.askPassword", + "com.intellij.credentialStore.CredentialAttributes")) + fun askPassword(project: Project?, + title: String, + message: String, + requestor: Class<*>, + key: String, + resetPassword: Boolean, + error: String): String? { + return askPassword(project, title, message, CredentialAttributes(requestor, key), resetPassword, error) } } From 3edb86b0119da94a649a9fbb20b5d5b43cc17067 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Thu, 17 May 2018 14:13:31 +0200 Subject: [PATCH 22/24] convert PasswordSafePromptDialog to kotlin --- ...{PasswordSafePromptDialog.java => PasswordSafePromptDialog.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/{PasswordSafePromptDialog.java => PasswordSafePromptDialog.kt} (100%) diff --git a/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.java b/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.kt similarity index 100% rename from platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.java rename to platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.kt From 058d224c56e8b88ea9fc8ef58624ea23af8dc4e0 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Thu, 17 May 2018 14:19:07 +0200 Subject: [PATCH 23/24] set isCheckExistingBeforeDialog to false by default for simplicity --- .../credentialStore/credentialPromt.kt | 13 ++++++---- .../ui/PasswordPromptComponent.java | 16 +------------ .../ui/PasswordSafePromptDialog.kt | 22 +++-------------- .../commands/GitHttpGuiAuthenticator.java | 24 ++++--------------- 4 files changed, 17 insertions(+), 58 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/credentialStore/credentialPromt.kt b/platform/platform-impl/src/com/intellij/credentialStore/credentialPromt.kt index c0a6c9aeb46e..b56304427e62 100644 --- a/platform/platform-impl/src/com/intellij/credentialStore/credentialPromt.kt +++ b/platform/platform-impl/src/com/intellij/credentialStore/credentialPromt.kt @@ -31,7 +31,10 @@ fun askPassword(project: Project?, attributes: CredentialAttributes, resetPassword: Boolean = false, error: String? = null): String? { - return askCredentials(project, dialogTitle, passwordFieldLabel, attributes, resetPassword = resetPassword, error = error)?.credentials?.getPasswordAsString()?.nullize() + return askCredentials(project, dialogTitle, passwordFieldLabel, attributes, + isResetPassword = resetPassword, + error = error, + isCheckExistingBeforeDialog = true)?.credentials?.getPasswordAsString()?.nullize() } internal object RememberCheckBoxState { @@ -54,14 +57,14 @@ fun askCredentials(project: Project?, passwordFieldLabel: String, attributes: CredentialAttributes, isSaveOnOk: Boolean = true, - checkExistingBeforeDialog: Boolean = true, - resetPassword: Boolean = false, + isCheckExistingBeforeDialog: Boolean = false, + isResetPassword: Boolean = false, error: String? = null): CredentialRequestResult? { val store = PasswordSafe.getInstance() - if (resetPassword) { + if (isResetPassword) { store.set(attributes, null) } - else if (checkExistingBeforeDialog) { + else if (isCheckExistingBeforeDialog) { store.get(attributes)?.let { return CredentialRequestResult(it, false, true) } diff --git a/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordPromptComponent.java b/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordPromptComponent.java index 94145fbfa4f5..682dfd2fd647 100644 --- a/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordPromptComponent.java +++ b/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordPromptComponent.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2016 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide.passwordSafe.ui; import com.intellij.openapi.ui.Messages; diff --git a/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.kt b/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.kt index 114113ddea44..cf8748ef4885 100644 --- a/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.kt +++ b/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.kt @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2016 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide.passwordSafe.ui import com.intellij.credentialStore.CredentialAttributes @@ -24,8 +10,7 @@ object PasswordSafePromptDialog { @Deprecated("Use {@link CredentialPromptDialog}", ReplaceWith("askPassword(project, title, message, CredentialAttributes(requestor, key), resetPassword, error)", "com.intellij.credentialStore.askPassword", "com.intellij.credentialStore.CredentialAttributes")) - fun askPassword(project: Project?, - title: String, + fun askPassword(project: Project?, title: String, message: String, requestor: Class<*>, key: String, @@ -33,5 +18,4 @@ object PasswordSafePromptDialog { error: String): String? { return askPassword(project, title, message, CredentialAttributes(requestor, key), resetPassword, error) } -} - +} \ No newline at end of file diff --git a/plugins/git4idea/src/git4idea/commands/GitHttpGuiAuthenticator.java b/plugins/git4idea/src/git4idea/commands/GitHttpGuiAuthenticator.java index a538eefe4d35..e63f2f35c344 100644 --- a/plugins/git4idea/src/git4idea/commands/GitHttpGuiAuthenticator.java +++ b/plugins/git4idea/src/git4idea/commands/GitHttpGuiAuthenticator.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2017 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package git4idea.commands; import com.intellij.credentialStore.CredentialAttributes; @@ -71,9 +57,9 @@ class GitHttpGuiAuthenticator implements GitHttpAuthenticator { @Nullable private String myPasswordKey; @Nullable private String myUnifiedUrl; @Nullable private String myLogin; - + private ThreeState myIsMemoryOnly = ThreeState.UNSURE; - + @Nullable private GitHttpAuthDataProvider myDataProvider; private boolean myWasCancelled; @@ -112,7 +98,7 @@ class GitHttpGuiAuthenticator implements GitHttpAuthenticator { myPasswordKey = getUnifiedUrl(url); CredentialRequestResult result = CredentialPromptDialog.askCredentials(myProject, myTitle, "Password for " + getDisplayableUrl(url), - credentialAttributes(myPasswordKey), false, false); + credentialAttributes(myPasswordKey), false); String password = result == null ? null : result.getCredentials().getPasswordAsString(); LOG.debug("askPassword. Password was asked and returned: " + (password == null ? "NULL" : password.isEmpty() ? "EMPTY" : "NOT EMPTY")); if (password == null) { @@ -274,7 +260,7 @@ class GitHttpGuiAuthenticator implements GitHttpAuthenticator { } return candidate; } - + @NotNull private List getProviders() { List providers = ContainerUtil.newArrayList(); From eb2a9a5182de28319e6281bd513ee261f0f2e5aa Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Thu, 17 May 2018 15:34:52 +0200 Subject: [PATCH 24/24] IDEA-191264 Remember" checkbox should be shown always regardless of password safe settings memory only store means that password is stored until restart, but unchecked "Remember" checkbox means "do not remember my password now", so, we must show this checkbox. --- .../credentialStore/credentialPromt.kt | 34 +++++++------------ .../ui/PasswordPromptComponent.java | 9 ++++- .../ui/PasswordSafePromptDialog.kt | 1 + .../platform-resources/src/brokenPlugins.txt | 3 +- .../commands/GitHttpGuiAuthenticator.java | 2 +- 5 files changed, 25 insertions(+), 24 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/credentialStore/credentialPromt.kt b/platform/platform-impl/src/com/intellij/credentialStore/credentialPromt.kt index b56304427e62..79ddc436f8ba 100644 --- a/platform/platform-impl/src/com/intellij/credentialStore/credentialPromt.kt +++ b/platform/platform-impl/src/com/intellij/credentialStore/credentialPromt.kt @@ -37,7 +37,7 @@ fun askPassword(project: Project?, isCheckExistingBeforeDialog = true)?.credentials?.getPasswordAsString()?.nullize() } -internal object RememberCheckBoxState { +object RememberCheckBoxState { private const val key = "checkbox.remember.password" private const val defaultValue = true @@ -66,27 +66,20 @@ fun askCredentials(project: Project?, } else if (isCheckExistingBeforeDialog) { store.get(attributes)?.let { - return CredentialRequestResult(it, false, true) + return CredentialRequestResult(it, false) } } return invokeAndWaitIfNeed(ModalityState.any()) { val passwordField = JPasswordField() - val rememberCheckBox = if (store.isMemoryOnly) { - null - } - else { - CheckBox(CommonBundle.message("checkbox.remember.password"), - selected = RememberCheckBoxState.isSelected, - toolTip = "The password will be stored between application sessions.") - } + val rememberCheckBox = CheckBox(CommonBundle.message("checkbox.remember.password"), + selected = RememberCheckBoxState.isSelected, + toolTip = "The password will be stored between application sessions.") val panel = panel { row { label(if (passwordFieldLabel.endsWith(":")) passwordFieldLabel else "$passwordFieldLabel:") } row { passwordField() } - rememberCheckBox?.let { - row { it() } - } + row { rememberCheckBox() } } AppIcon.getInstance().requestAttention(project, true) @@ -94,18 +87,17 @@ fun askCredentials(project: Project?, return@invokeAndWaitIfNeed null } - if (rememberCheckBox != null) { - RememberCheckBoxState.update(rememberCheckBox) - } + RememberCheckBoxState.update(rememberCheckBox) - val isMemoryOnly = store.isMemoryOnly || !rememberCheckBox!!.isSelected val credentials = Credentials(attributes.userName, passwordField.password.nullize()) - if (isSaveOnOk) { - store.set(attributes, credentials, isMemoryOnly) + if (isSaveOnOk && rememberCheckBox.isSelected) { + store.set(attributes, credentials) credentials.getPasswordAsString() } - return@invokeAndWaitIfNeed CredentialRequestResult(credentials, isMemoryOnly, false) + + // for memory only store isRemember is true, because false doesn't matter + return@invokeAndWaitIfNeed CredentialRequestResult(credentials, isRemember = rememberCheckBox.isSelected) } } -data class CredentialRequestResult(val credentials: Credentials, val isMemoryOnly: Boolean, val isSaved: Boolean) \ No newline at end of file +data class CredentialRequestResult(val credentials: Credentials, val isRemember: Boolean) \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordPromptComponent.java b/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordPromptComponent.java index 682dfd2fd647..7930dd5dd141 100644 --- a/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordPromptComponent.java +++ b/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordPromptComponent.java @@ -1,6 +1,7 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide.passwordSafe.ui; +import com.intellij.credentialStore.RememberCheckBoxState; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.ui.UIUtil; @@ -38,7 +39,7 @@ public class PasswordPromptComponent { myRememberCheckBox.setSelected(false); } else { - myRememberCheckBox.setSelected(false); // do not force people to un-check this every time! + myRememberCheckBox.setSelected(RememberCheckBoxState.INSTANCE.isSelected()); myRememberCheckBox.setToolTipText("The password will be stored between application sessions."); } @@ -80,4 +81,10 @@ public class PasswordPromptComponent { public boolean isRememberSelected() { return myRememberCheckBox.isSelected(); } + + public void updateRememberState() { + if (myRememberCheckBox.isEnabled()) { + RememberCheckBoxState.INSTANCE.update(myRememberCheckBox); + } + } } diff --git a/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.kt b/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.kt index cf8748ef4885..b91a969eb808 100644 --- a/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.kt +++ b/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.kt @@ -10,6 +10,7 @@ object PasswordSafePromptDialog { @Deprecated("Use {@link CredentialPromptDialog}", ReplaceWith("askPassword(project, title, message, CredentialAttributes(requestor, key), resetPassword, error)", "com.intellij.credentialStore.askPassword", "com.intellij.credentialStore.CredentialAttributes")) + @JvmStatic fun askPassword(project: Project?, title: String, message: String, requestor: Class<*>, diff --git a/platform/platform-resources/src/brokenPlugins.txt b/platform/platform-resources/src/brokenPlugins.txt index 3d9de0614d8a..6e333284ca0e 100644 --- a/platform/platform-resources/src/brokenPlugins.txt +++ b/platform/platform-resources/src/brokenPlugins.txt @@ -96,4 +96,5 @@ com.javils.ThemeSwitcher 1.0 1.1 1.2 org.ziglang 0.0.3 com.intellij.aspectj 0.7 TRTIdea 1.0 -com.intellij.stats.completion 0.0.41 0.0.42 0.0.49 0.0.519 0.0.536 0.0.537 0.0.538 0.1.0 0.1.1 0.1.2 \ No newline at end of file +com.intellij.stats.completion 0.0.41 0.0.42 0.0.49 0.0.519 0.0.536 0.0.537 0.0.538 0.1.0 0.1.1 0.1.2 +com.huawei.ide 1.0 \ No newline at end of file diff --git a/plugins/git4idea/src/git4idea/commands/GitHttpGuiAuthenticator.java b/plugins/git4idea/src/git4idea/commands/GitHttpGuiAuthenticator.java index e63f2f35c344..72e87c41cd4a 100644 --- a/plugins/git4idea/src/git4idea/commands/GitHttpGuiAuthenticator.java +++ b/plugins/git4idea/src/git4idea/commands/GitHttpGuiAuthenticator.java @@ -105,7 +105,7 @@ class GitHttpGuiAuthenticator implements GitHttpAuthenticator { myWasCancelled = true; return ""; } - myIsMemoryOnly = ThreeState.fromBoolean(result.isMemoryOnly()); + myIsMemoryOnly = ThreeState.fromBoolean(result.isRemember()); myPassword = password; myDataProvider = new BaseGitAuthDataProvider() { @Override