From bad7f4b2176e8b83f2fe9d8a31fd748b3e139529 Mon Sep 17 00:00:00 2001 From: Gregory Shrago Date: Tue, 29 Mar 2011 19:31:31 +0400 Subject: [PATCH] browse history action ( IDEA-21689 & Co) --- .../console/ConsoleHistoryController.java | 42 ++++++++++++++++++- .../editor/actions/ContentChooser.java | 2 +- .../process/ConsoleHistoryModel.java | 22 ++++++++-- .../src/idea/PlatformActions.xml | 1 + 4 files changed, 61 insertions(+), 6 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/console/ConsoleHistoryController.java b/platform/lang-impl/src/com/intellij/execution/console/ConsoleHistoryController.java index 0c24b9c04308..04abc29cb262 100644 --- a/platform/lang-impl/src/com/intellij/execution/console/ConsoleHistoryController.java +++ b/platform/lang-impl/src/com/intellij/execution/console/ConsoleHistoryController.java @@ -29,6 +29,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.CaretModel; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.actions.ContentChooser; import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ex.ProjectEx; @@ -46,6 +47,7 @@ import org.xmlpull.v1.XmlSerializer; import java.awt.event.KeyEvent; import java.io.*; import java.util.ArrayList; +import java.util.List; import java.util.ListIterator; /** @@ -61,6 +63,7 @@ public class ConsoleHistoryController { private final ConsoleHistoryModel myModel; private final AnAction myHistoryNext = new MyAction(true); private final AnAction myHistoryPrev = new MyAction(false); + private final AnAction myBrowseHistory = new MyBrowseAction(); private boolean myMultiline; private long myLastSaveStamp; @@ -110,15 +113,16 @@ public class ConsoleHistoryController { } private void configureActions() { - // todo add clipboard-like history viewer/selector action EmptyAction.setupAction(myHistoryNext, "Console.History.Next", null); EmptyAction.setupAction(myHistoryPrev, "Console.History.Previous", null); + EmptyAction.setupAction(myBrowseHistory, "Console.History.Browse", null); if (!myMultiline) { myHistoryNext.registerCustomShortcutSet(KeyEvent.VK_UP, 0, null); myHistoryPrev.registerCustomShortcutSet(KeyEvent.VK_DOWN, 0, null); } myHistoryNext.registerCustomShortcutSet(myHistoryNext.getShortcutSet(), myConsole.getConsoleEditor().getComponent()); myHistoryPrev.registerCustomShortcutSet(myHistoryPrev.getShortcutSet(), myConsole.getConsoleEditor().getComponent()); + myBrowseHistory.registerCustomShortcutSet(myBrowseHistory.getShortcutSet(), myConsole.getConsoleEditor().getComponent()); } private File getFile() { @@ -205,6 +209,9 @@ public class ConsoleHistoryController { return myHistoryPrev; } + public AnAction getBrowseHistory() { + return myBrowseHistory; + } protected void actionTriggered(final String command) { final Editor editor = myConsole.getConsoleEditor(); @@ -287,4 +294,37 @@ public class ConsoleHistoryController { out.endTag(null, "console-history"); out.endDocument(); } + + private class MyBrowseAction extends AnAction { + + @Override + public void update(final AnActionEvent e) { + e.getPresentation().setEnabled(myModel.getHistorySize() > 0); + } + + @Override + public void actionPerformed(final AnActionEvent e) { + final ContentChooser chooser = new ContentChooser(myConsole.getProject(), myConsole.getTitle(), true) { + + @Override + protected void removeContentAt(final String content) { + myModel.removeFromHistory(content); + } + + @Override + protected String getStringRepresentationFor(final String content) { + return content; + } + + @Override + protected List getContents() { + return myModel.getHistory(); + } + }; + chooser.show(); + if (chooser.isOK()) { + actionTriggered(myModel.getHistory().get(chooser.getSelectedIndex())); + } + } + } } diff --git a/platform/platform-api/src/com/intellij/openapi/editor/actions/ContentChooser.java b/platform/platform-api/src/com/intellij/openapi/editor/actions/ContentChooser.java index 875f73d67e17..32de0990bfe4 100644 --- a/platform/platform-api/src/com/intellij/openapi/editor/actions/ContentChooser.java +++ b/platform/platform-api/src/com/intellij/openapi/editor/actions/ContentChooser.java @@ -133,7 +133,7 @@ public abstract class ContentChooser extends DialogWrapper { return mySplitter; } - protected abstract void removeContentAt(final Data Content); + protected abstract void removeContentAt(final Data content); protected String getDimensionServiceKey() { return "#com.intellij.openapi.editor.actions.MultiplePasteAction.Chooser"; diff --git a/platform/platform-impl/src/com/intellij/execution/process/ConsoleHistoryModel.java b/platform/platform-impl/src/com/intellij/execution/process/ConsoleHistoryModel.java index 3e7e397a8ff8..58163cc12942 100644 --- a/platform/platform-impl/src/com/intellij/execution/process/ConsoleHistoryModel.java +++ b/platform/platform-impl/src/com/intellij/execution/process/ConsoleHistoryModel.java @@ -22,13 +22,21 @@ public class ConsoleHistoryModel implements ModificationTracker { public void addToHistory(final String statement) { synchronized (myHistory) { - myModificationTracker ++; - myHistoryCursor = -1; - myHistory.remove(statement); + removeFromHistory(statement); if (myHistory.size() >= myMaxHistorySize) { myHistory.removeLast(); } - myHistory.addFirst(statement); + else { + myHistory.addFirst(statement); + } + } + } + + public void removeFromHistory(final String statement) { + synchronized (myHistory) { + myModificationTracker ++; + myHistoryCursor = -1; + myHistory.remove(statement); } } @@ -44,6 +52,12 @@ public class ConsoleHistoryModel implements ModificationTracker { } } + public int getHistorySize() { + synchronized (myHistory) { + return myHistory.size(); + } + } + public void setMaxHistorySize(final int maxHistorySize) { synchronized (myHistory) { myMaxHistorySize = maxHistorySize; diff --git a/platform/platform-resources/src/idea/PlatformActions.xml b/platform/platform-resources/src/idea/PlatformActions.xml index bcda6f9e02e8..7e443655072c 100644 --- a/platform/platform-resources/src/idea/PlatformActions.xml +++ b/platform/platform-resources/src/idea/PlatformActions.xml @@ -426,6 +426,7 @@ +