From 0758cbd9f92261f67a5c811cb64cdeda02a23526 Mon Sep 17 00:00:00 2001 From: Sergey Simonchik Date: Sat, 9 Apr 2016 00:12:13 +0300 Subject: [PATCH] enable in-place replace action for Analyze Stacktrace (IDEA-CR-9987) --- .../execution/impl/ConsoleViewImpl.java | 8 ++- .../editor/actions/IncrementalFindAction.java | 3 +- .../unscramble/AnalyzeStacktraceUtil.java | 61 ++----------------- .../execution/impl/ConsoleViewUtil.java | 10 ++- 4 files changed, 24 insertions(+), 58 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java index a5570e045027..f46811c0a2d1 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java @@ -992,7 +992,13 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo } } else { - LOG.warn("unhandled external change: " + event); + if (ConsoleViewUtil.isReplaceActionEnabledForConsoleViewEditor(myEditor)) { + clearHyperlinkAndFoldings(); + highlightHyperlinksAndFoldings(event.getDocument().createRangeMarker(0, 0)); + } + else { + LOG.warn("unhandled external change: " + event); + } } } } diff --git a/platform/lang-impl/src/com/intellij/openapi/editor/actions/IncrementalFindAction.java b/platform/lang-impl/src/com/intellij/openapi/editor/actions/IncrementalFindAction.java index a5bf21e817a4..347cb9e52d40 100644 --- a/platform/lang-impl/src/com/intellij/openapi/editor/actions/IncrementalFindAction.java +++ b/platform/lang-impl/src/com/intellij/openapi/editor/actions/IncrementalFindAction.java @@ -66,7 +66,8 @@ public class IncrementalFindAction extends EditorAction { @Override public boolean isEnabled(Editor editor, DataContext dataContext) { - if (myReplace && ConsoleViewUtil.isConsoleViewEditor(editor)) { + if (myReplace && ConsoleViewUtil.isConsoleViewEditor(editor) && + !ConsoleViewUtil.isReplaceActionEnabledForConsoleViewEditor(editor)) { return false; } Project project = CommonDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext(editor.getComponent())); diff --git a/platform/lang-impl/src/com/intellij/unscramble/AnalyzeStacktraceUtil.java b/platform/lang-impl/src/com/intellij/unscramble/AnalyzeStacktraceUtil.java index 34f0649183ac..edc2b6156d79 100644 --- a/platform/lang-impl/src/com/intellij/unscramble/AnalyzeStacktraceUtil.java +++ b/platform/lang-impl/src/com/intellij/unscramble/AnalyzeStacktraceUtil.java @@ -23,11 +23,14 @@ import com.intellij.execution.filters.Filter; import com.intellij.execution.filters.TextConsoleBuilder; import com.intellij.execution.filters.TextConsoleBuilderFactory; import com.intellij.execution.impl.ConsoleViewImpl; -import com.intellij.execution.ui.*; +import com.intellij.execution.impl.ConsoleViewUtil; +import com.intellij.execution.ui.ConsoleView; +import com.intellij.execution.ui.ConsoleViewContentType; +import com.intellij.execution.ui.ExecutionConsole; +import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.execution.ui.actions.CloseAction; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; -import com.intellij.openapi.actionSystem.ex.ActionUtil; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.editor.Document; @@ -38,19 +41,15 @@ import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.ide.CopyPasteManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.playback.commands.ActionCommand; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.ui.JBUI; -import com.intellij.util.ui.update.UiNotifyConnector; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.awt.datatransfer.DataFlavor; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; /** * @author yole @@ -105,13 +104,13 @@ public class AnalyzeStacktraceUtil { return true; } }; - registerReplaceAction(project, descriptor, consoleView, text); final Executor executor = DefaultRunExecutor.getRunExecutorInstance(); for (AnAction action: consoleView.createConsoleActions()) { toolbarActions.add(action); } final ConsoleViewImpl console = (ConsoleViewImpl)consoleView; + ConsoleViewUtil.enableReplaceActionForConsoleViewEditor(console.getEditor()); console.getEditor().getSettings().setCaretRowShown(true); toolbarActions.add(new AnnotateStackTraceAction(console.getEditor(), console.getHyperlinks())); toolbarActions.add(new CloseAction(executor, descriptor, project)); @@ -123,54 +122,6 @@ public class AnalyzeStacktraceUtil { return descriptor; } - /** - * Regular "Replace" editor action is unavailable for console editors (see com.intellij.openapi.editor.actions.IncrementalFindAction.Handler#isEnabled). - * However, it can be convenient to be able to replace user-specific paths with local paths - * if stacktrace links involves absolute paths (e.g. Node.js stack-traces contain absolute paths). - * - * @param consoleView - */ - private static void registerReplaceAction(@NotNull Project project, - @NotNull RunContentDescriptor descriptor, - @NotNull ConsoleView consoleView, - @NotNull String stacktrace) { - AnAction replaceAction = ActionManager.getInstance().getAction(IdeActions.ACTION_REPLACE); - if (replaceAction == null) { - return; - } - ActionUtil.registerForEveryKeyboardShortcut(consoleView.getComponent(), new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - AnalyzeStacktraceDialog dialog = new AnalyzeStacktraceDialog(project) { - @Override - protected JComponent createCenterPanel() { - JComponent result = super.createCenterPanel(); - myEditorPanel.setText(stacktrace); - UiNotifyConnector.doWhenFirstShown(myEditorPanel, new Runnable() { - @Override - public void run() { - ActionManager.getInstance().tryToExecute(replaceAction, - ActionCommand.getInputEvent(IdeActions.ACTION_REPLACE), - myEditorPanel, - ActionPlaces.UNKNOWN, - false); - } - }); - return result; - } - - @Override - protected void doOKAction() { - super.doOKAction(); - RunContentManager contentManager = ExecutionManager.getInstance(project).getContentManager(); - contentManager.removeRunContent(DefaultRunExecutor.getRunExecutorInstance(), descriptor); - } - }; - dialog.show(); - } - }, replaceAction.getShortcutSet()); - } - private static final class MyConsolePanel extends JPanel { public MyConsolePanel(ExecutionConsole consoleView, ActionGroup toolbarActions) { super(new BorderLayout()); diff --git a/platform/platform-impl/src/com/intellij/execution/impl/ConsoleViewUtil.java b/platform/platform-impl/src/com/intellij/execution/impl/ConsoleViewUtil.java index 5453bc1e5792..00020f5ada47 100644 --- a/platform/platform-impl/src/com/intellij/execution/impl/ConsoleViewUtil.java +++ b/platform/platform-impl/src/com/intellij/execution/impl/ConsoleViewUtil.java @@ -54,7 +54,7 @@ import static com.intellij.execution.ui.ConsoleViewContentType.registerNewConsol public class ConsoleViewUtil { public static final Key EDITOR_IS_CONSOLE_VIEW = Key.create("EDITOR_IS_CONSOLE_VIEW"); - + private static final Key REPLACE_ACTION_ENABLED = Key.create("REPLACE_ACTION_ENABLED"); public static EditorEx setupConsoleEditor(Project project, final boolean foldingOutlineShown, final boolean lineMarkerAreaShown) { EditorFactory editorFactory = EditorFactory.getInstance(); @@ -141,6 +141,14 @@ public class ConsoleViewUtil { return editor.getUserData(EDITOR_IS_CONSOLE_VIEW) == Boolean.TRUE; } + public static boolean isReplaceActionEnabledForConsoleViewEditor(@NotNull Editor editor) { + return editor.getUserData(REPLACE_ACTION_ENABLED) == Boolean.TRUE; + } + + public static void enableReplaceActionForConsoleViewEditor(@NotNull Editor editor) { + editor.putUserData(REPLACE_ACTION_ENABLED, true); + } + @SuppressWarnings("MismatchedQueryAndUpdateOfCollection") private static class ColorCache { static { -- 2.23.3