From e319b4eaaa321731750b2f3a7766f89d6c146900 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 26 Sep 2008 17:25:33 +0400 Subject: [PATCH] API for registering editor action handlers via XML --- .../com/intellij/testFramework/UsefulTestCase.java | 2 +- .../intellij/codeInsight/CodeInsightSettings.java | 21 +------- .../codeInsight/highlighting/EscapeHandler.java | 61 ++++++++++++++++++++++ .../codeInsight/lookup/impl/BackspaceHandler.java | 2 +- .../codeInsight/lookup/impl/DownHandler.java | 2 +- .../codeInsight/lookup/impl/EndHandler.java | 6 +-- .../codeInsight/lookup/impl/HomeHandler.java | 6 +-- .../codeInsight/lookup/impl/PageDownHandler.java | 4 +- .../codeInsight/lookup/impl/PageUpHandler.java | 4 +- .../codeInsight/lookup/impl/TypedHandler.java | 2 +- .../codeInsight/lookup/impl/UpHandler.java | 4 +- .../template/impl/editorActions/EndHandler.java | 12 +++++ .../template/impl/editorActions/EnterHandler.java | 37 +++++++++++++ .../template/impl/editorActions/EscapeHandler.java | 39 ++++++++++++++ .../impl/editorActions/HomeEndHandler.java | 37 +++++++++++++ .../template/impl/editorActions/HomeHandler.java | 12 +++++ .../template/impl/editorActions/SpaceHandler.java | 35 +++++++++++++ .../template/impl/editorActions/TabHandler.java | 37 +++++++++++++ .../openapi/editor/actionSystem/EditorAction.java | 16 ++++++ .../actionSystem/EditorActionHandlerBean.java | 40 ++++++++++++++ .../actionSystem/EditorTypedHandlerBean.java | 38 ++++++++++++++ .../openapi/editor/actionSystem/TypedAction.java | 13 +++++ .../intellij/codeInsight/hint/EscapeHandler.java | 33 ++++++++++++ .../intellij/codeInsight/hint/HintManagerImpl.java | 44 ++++------------ platform-resources/src/META-INF/LangExtensions.xml | 34 ++++++++++++ .../src/META-INF/PlatformExtensionPoints.xml | 3 ++ .../src/META-INF/PlatformExtensions.xml | 2 + platform-resources/src/componentSets/Lang.xml | 13 ----- 28 files changed, 470 insertions(+), 89 deletions(-) create mode 100644 lang-impl/src/com/intellij/codeInsight/highlighting/EscapeHandler.java create mode 100644 lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/EndHandler.java create mode 100644 lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/EnterHandler.java create mode 100644 lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/EscapeHandler.java create mode 100644 lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/HomeEndHandler.java create mode 100644 lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/HomeHandler.java create mode 100644 lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/SpaceHandler.java create mode 100644 lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/TabHandler.java create mode 100644 platform-api/src/com/intellij/openapi/editor/actionSystem/EditorActionHandlerBean.java create mode 100644 platform-api/src/com/intellij/openapi/editor/actionSystem/EditorTypedHandlerBean.java create mode 100644 platform-impl/src/com/intellij/codeInsight/hint/EscapeHandler.java diff --git a/ExtendedApi/src/com/intellij/testFramework/UsefulTestCase.java b/ExtendedApi/src/com/intellij/testFramework/UsefulTestCase.java index d46844b81f..d05697c9c9 100644 --- a/ExtendedApi/src/com/intellij/testFramework/UsefulTestCase.java +++ b/ExtendedApi/src/com/intellij/testFramework/UsefulTestCase.java @@ -39,7 +39,7 @@ public abstract class UsefulTestCase extends TestCase { private static final String DEFAULT_SETTINGS_EXTERNALIZED; static { try { - CodeInsightSettings defaultSettings = new CodeInsightSettings(null); + CodeInsightSettings defaultSettings = new CodeInsightSettings(); Element oldS = new Element("temp"); defaultSettings.writeExternal(oldS); DEFAULT_SETTINGS_EXTERNALIZED = JDOMUtil.writeElement(oldS, "\n"); diff --git a/lang-impl/src/com/intellij/codeInsight/CodeInsightSettings.java b/lang-impl/src/com/intellij/codeInsight/CodeInsightSettings.java index 9c029166ec..a57137bf05 100644 --- a/lang-impl/src/com/intellij/codeInsight/CodeInsightSettings.java +++ b/lang-impl/src/com/intellij/codeInsight/CodeInsightSettings.java @@ -1,12 +1,8 @@ package com.intellij.codeInsight; -import com.intellij.codeInsight.editorActions.*; -import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.components.ExportableApplicationComponent; -import com.intellij.openapi.editor.actionSystem.EditorActionManager; -import com.intellij.openapi.editor.actionSystem.TypedAction; import com.intellij.openapi.util.DefaultJDOMExternalizer; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.NamedJDOMExternalizable; @@ -122,22 +118,7 @@ public class CodeInsightSettings implements NamedJDOMExternalizable, Cloneable, ) public String[] EXCLUDED_PACKAGES = new String[0]; - public CodeInsightSettings(EditorActionManager actionManager) { - if (actionManager != null) { - actionManager.setActionHandler(IdeActions.ACTION_EDITOR_ENTER, new EnterHandler(actionManager.getActionHandler(IdeActions.ACTION_EDITOR_ENTER))); - actionManager.setActionHandler(IdeActions.ACTION_EDITOR_MOVE_LINE_END, new EndHandler(actionManager.getActionHandler(IdeActions.ACTION_EDITOR_MOVE_LINE_END))); - actionManager.setActionHandler(IdeActions.ACTION_EDITOR_SELECT_WORD_AT_CARET, new SelectWordHandler(actionManager.getActionHandler(IdeActions.ACTION_EDITOR_SELECT_WORD_AT_CARET))); - actionManager.setActionHandler(IdeActions.ACTION_EDITOR_UNSELECT_WORD_AT_CARET, new UnSelectWordHandler(actionManager.getActionHandler(IdeActions.ACTION_EDITOR_UNSELECT_WORD_AT_CARET))); - actionManager.setActionHandler(IdeActions.ACTION_EDITOR_PASTE, new PasteHandler(actionManager.getActionHandler(IdeActions.ACTION_EDITOR_PASTE))); - actionManager.setActionHandler(IdeActions.ACTION_EDITOR_COPY, new CopyHandler(actionManager.getActionHandler(IdeActions.ACTION_EDITOR_COPY))); - actionManager.setActionHandler(IdeActions.ACTION_EDITOR_CUT, new CutHandler(actionManager.getActionHandler(IdeActions.ACTION_EDITOR_CUT))); - actionManager.setActionHandler(IdeActions.ACTION_EDITOR_JOIN_LINES, new JoinLinesHandler(actionManager.getActionHandler(IdeActions.ACTION_EDITOR_JOIN_LINES))); - actionManager.setActionHandler(IdeActions.ACTION_EDITOR_BACKSPACE, new BackspaceHandler(actionManager.getActionHandler(IdeActions.ACTION_EDITOR_BACKSPACE))); - actionManager.setActionHandler(IdeActions.ACTION_EDITOR_DELETE_TO_WORD_START, new BackspaceHandler(actionManager.getActionHandler(IdeActions.ACTION_EDITOR_DELETE_TO_WORD_START))); - - TypedAction typedAction = actionManager.getTypedAction(); - typedAction.setupHandler(new TypedHandler(typedAction.getHandler())); - } + public CodeInsightSettings() { } public void initComponent() { } diff --git a/lang-impl/src/com/intellij/codeInsight/highlighting/EscapeHandler.java b/lang-impl/src/com/intellij/codeInsight/highlighting/EscapeHandler.java new file mode 100644 index 0000000000..8330fd9a6c --- /dev/null +++ b/lang-impl/src/com/intellij/codeInsight/highlighting/EscapeHandler.java @@ -0,0 +1,61 @@ +package com.intellij.codeInsight.highlighting; + +import com.intellij.openapi.editor.actionSystem.EditorActionHandler; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.markup.RangeHighlighter; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.wm.WindowManager; +import com.intellij.find.FindManager; +import com.intellij.find.FindModel; + +import java.util.Map; + +public class EscapeHandler extends EditorActionHandler { + private final EditorActionHandler myOriginalHandler; + + public EscapeHandler(EditorActionHandler originalHandler){ + myOriginalHandler = originalHandler; + } + + public void execute(Editor editor, DataContext dataContext){ + Project project = PlatformDataKeys.PROJECT.getData(dataContext); + + editor.setHeaderComponent(null); + if (project != null && ((HighlightManagerImpl)HighlightManager.getInstance(project)).hideHighlights(editor, HighlightManager.HIDE_BY_ESCAPE | + HighlightManager .HIDE_BY_ANY_KEY)) { + WindowManager.getInstance().getStatusBar(project).setInfo(""); //?? + FindManager findManager = FindManager.getInstance(project); + FindModel model = findManager.getFindNextModel(editor); + if (model != null) { + model.setSearchHighlighters(false); + findManager.setFindNextModel(model); + } + } + else{ + myOriginalHandler.execute(editor, dataContext); + } + } + + public boolean isEnabled(Editor editor, DataContext dataContext) { + if (editor.hasHeaderComponent()) return true; + Project project = PlatformDataKeys.PROJECT.getData(dataContext); + + if (project != null) { + HighlightManagerImpl highlightManager = (HighlightManagerImpl)HighlightManager.getInstance(project); + Map map = highlightManager.getHighlightInfoMap(editor, false); + + if (map != null) { + for (HighlightManagerImpl.HighlightInfo info : map.values()) { + if (!info.editor.equals(editor)) continue; + if ((info.flags & HighlightManager.HIDE_BY_ESCAPE) != 0) { + return true; + } + } + } + } + + return myOriginalHandler.isEnabled(editor, dataContext); + } +} diff --git a/lang-impl/src/com/intellij/codeInsight/lookup/impl/BackspaceHandler.java b/lang-impl/src/com/intellij/codeInsight/lookup/impl/BackspaceHandler.java index 8c1aa905ec..1131202582 100644 --- a/lang-impl/src/com/intellij/codeInsight/lookup/impl/BackspaceHandler.java +++ b/lang-impl/src/com/intellij/codeInsight/lookup/impl/BackspaceHandler.java @@ -7,7 +7,7 @@ import com.intellij.openapi.editor.actionSystem.EditorActionHandler; import java.awt.*; -class BackspaceHandler extends EditorActionHandler { +public class BackspaceHandler extends EditorActionHandler { private final EditorActionHandler myOriginalHandler; public BackspaceHandler(EditorActionHandler originalHandler){ diff --git a/lang-impl/src/com/intellij/codeInsight/lookup/impl/DownHandler.java b/lang-impl/src/com/intellij/codeInsight/lookup/impl/DownHandler.java index ff2eebe5e9..9623ff060b 100644 --- a/lang-impl/src/com/intellij/codeInsight/lookup/impl/DownHandler.java +++ b/lang-impl/src/com/intellij/codeInsight/lookup/impl/DownHandler.java @@ -3,7 +3,7 @@ package com.intellij.codeInsight.lookup.impl; import com.intellij.openapi.editor.actionSystem.EditorActionHandler; import com.intellij.ui.ListScrollingUtil; -class DownHandler extends LookupActionHandler { +public class DownHandler extends LookupActionHandler { public DownHandler(EditorActionHandler originalHandler){ super(originalHandler); diff --git a/lang-impl/src/com/intellij/codeInsight/lookup/impl/EndHandler.java b/lang-impl/src/com/intellij/codeInsight/lookup/impl/EndHandler.java index 40dc40ac73..fbfcc47b1e 100644 --- a/lang-impl/src/com/intellij/codeInsight/lookup/impl/EndHandler.java +++ b/lang-impl/src/com/intellij/codeInsight/lookup/impl/EndHandler.java @@ -1,14 +1,12 @@ package com.intellij.codeInsight.lookup.impl; +import com.intellij.codeInsight.lookup.LookupManager; import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.actionSystem.ex.DataConstantsEx; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.actionSystem.EditorActionHandler; -import com.intellij.openapi.project.Project; import com.intellij.ui.ListScrollingUtil; -import com.intellij.codeInsight.lookup.LookupManager; -class EndHandler extends EditorActionHandler { +public class EndHandler extends EditorActionHandler { private final EditorActionHandler myOriginalHandler; public EndHandler(EditorActionHandler originalHandler){ diff --git a/lang-impl/src/com/intellij/codeInsight/lookup/impl/HomeHandler.java b/lang-impl/src/com/intellij/codeInsight/lookup/impl/HomeHandler.java index 48274b4f71..e3b3fb6844 100644 --- a/lang-impl/src/com/intellij/codeInsight/lookup/impl/HomeHandler.java +++ b/lang-impl/src/com/intellij/codeInsight/lookup/impl/HomeHandler.java @@ -1,14 +1,12 @@ package com.intellij.codeInsight.lookup.impl; +import com.intellij.codeInsight.lookup.LookupManager; import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.actionSystem.ex.DataConstantsEx; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.actionSystem.EditorActionHandler; -import com.intellij.openapi.project.Project; import com.intellij.ui.ListScrollingUtil; -import com.intellij.codeInsight.lookup.LookupManager; -class HomeHandler extends EditorActionHandler { +public class HomeHandler extends EditorActionHandler { private final EditorActionHandler myOriginalHandler; public HomeHandler(EditorActionHandler originalHandler){ diff --git a/lang-impl/src/com/intellij/codeInsight/lookup/impl/PageDownHandler.java b/lang-impl/src/com/intellij/codeInsight/lookup/impl/PageDownHandler.java index 1a0b03ba09..e8d65c38f1 100644 --- a/lang-impl/src/com/intellij/codeInsight/lookup/impl/PageDownHandler.java +++ b/lang-impl/src/com/intellij/codeInsight/lookup/impl/PageDownHandler.java @@ -1,11 +1,9 @@ package com.intellij.codeInsight.lookup.impl; -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.actionSystem.EditorActionHandler; import com.intellij.ui.ListScrollingUtil; -class PageDownHandler extends LookupActionHandler { +public class PageDownHandler extends LookupActionHandler { public PageDownHandler(final EditorActionHandler originalHandler) { super(originalHandler); } diff --git a/lang-impl/src/com/intellij/codeInsight/lookup/impl/PageUpHandler.java b/lang-impl/src/com/intellij/codeInsight/lookup/impl/PageUpHandler.java index 7218377829..8fca782369 100644 --- a/lang-impl/src/com/intellij/codeInsight/lookup/impl/PageUpHandler.java +++ b/lang-impl/src/com/intellij/codeInsight/lookup/impl/PageUpHandler.java @@ -1,11 +1,9 @@ package com.intellij.codeInsight.lookup.impl; -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.actionSystem.EditorActionHandler; import com.intellij.ui.ListScrollingUtil; -class PageUpHandler extends LookupActionHandler { +public class PageUpHandler extends LookupActionHandler { public PageUpHandler(EditorActionHandler originalHandler){ super(originalHandler); } diff --git a/lang-impl/src/com/intellij/codeInsight/lookup/impl/TypedHandler.java b/lang-impl/src/com/intellij/codeInsight/lookup/impl/TypedHandler.java index 0142c68a56..558b9640de 100644 --- a/lang-impl/src/com/intellij/codeInsight/lookup/impl/TypedHandler.java +++ b/lang-impl/src/com/intellij/codeInsight/lookup/impl/TypedHandler.java @@ -18,7 +18,7 @@ import com.intellij.openapi.extensions.Extensions; import java.awt.*; import java.util.Arrays; -class TypedHandler implements TypedActionHandler { +public class TypedHandler implements TypedActionHandler { private final TypedActionHandler myOriginalHandler; public TypedHandler(TypedActionHandler originalHandler){ diff --git a/lang-impl/src/com/intellij/codeInsight/lookup/impl/UpHandler.java b/lang-impl/src/com/intellij/codeInsight/lookup/impl/UpHandler.java index 9f76710787..b3c4680e70 100644 --- a/lang-impl/src/com/intellij/codeInsight/lookup/impl/UpHandler.java +++ b/lang-impl/src/com/intellij/codeInsight/lookup/impl/UpHandler.java @@ -1,11 +1,9 @@ package com.intellij.codeInsight.lookup.impl; -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.actionSystem.EditorActionHandler; import com.intellij.ui.ListScrollingUtil; -class UpHandler extends LookupActionHandler { +public class UpHandler extends LookupActionHandler { public UpHandler(EditorActionHandler originalHandler){ super(originalHandler); } diff --git a/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/EndHandler.java b/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/EndHandler.java new file mode 100644 index 0000000000..9db753c693 --- /dev/null +++ b/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/EndHandler.java @@ -0,0 +1,12 @@ +package com.intellij.codeInsight.template.impl.editorActions; + +import com.intellij.openapi.editor.actionSystem.EditorActionHandler; + +/** + * @author yole + */ +public class EndHandler extends HomeEndHandler { + public EndHandler(final EditorActionHandler originalHandler) { + super(originalHandler, false); + } +} \ No newline at end of file diff --git a/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/EnterHandler.java b/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/EnterHandler.java new file mode 100644 index 0000000000..65587bd96b --- /dev/null +++ b/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/EnterHandler.java @@ -0,0 +1,37 @@ +package com.intellij.codeInsight.template.impl.editorActions; + +import com.intellij.openapi.editor.actionSystem.EditorWriteActionHandler; +import com.intellij.openapi.editor.actionSystem.EditorActionHandler; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.project.Project; +import com.intellij.codeInsight.template.impl.TemplateManagerImpl; +import com.intellij.codeInsight.template.impl.TemplateSettings; + +public class EnterHandler extends EditorWriteActionHandler { + private EditorActionHandler myOriginalHandler; + + public EnterHandler(EditorActionHandler originalHandler) { + myOriginalHandler = originalHandler; + } + + public boolean isEnabled(Editor editor, DataContext dataContext) { + return myOriginalHandler.isEnabled(editor, dataContext); + } + + public void executeWriteAction(Editor editor, DataContext dataContext) { + Project project = PlatformDataKeys.PROJECT.getData(dataContext); + + if (project == null) { + myOriginalHandler.execute(editor, dataContext); + return; + } + + TemplateManagerImpl templateManager = (TemplateManagerImpl) TemplateManagerImpl.getInstance(project); + + if (!templateManager.startTemplate(templateManager, editor, TemplateSettings.ENTER_CHAR)) { + myOriginalHandler.execute(editor, dataContext); + } + } +} diff --git a/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/EscapeHandler.java b/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/EscapeHandler.java new file mode 100644 index 0000000000..6a775a9aac --- /dev/null +++ b/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/EscapeHandler.java @@ -0,0 +1,39 @@ +package com.intellij.codeInsight.template.impl.editorActions; + +import com.intellij.openapi.editor.actionSystem.EditorActionHandler; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.command.CommandProcessor; +import com.intellij.codeInsight.template.impl.TemplateState; +import com.intellij.codeInsight.template.impl.TemplateManagerImpl; +import com.intellij.codeInsight.CodeInsightBundle; + +public class EscapeHandler extends EditorActionHandler { + private EditorActionHandler myOriginalHandler; + + public EscapeHandler(EditorActionHandler originalHandler) { + myOriginalHandler = originalHandler; + } + + public void execute(Editor editor, DataContext dataContext) { + if (!editor.getSelectionModel().hasSelection()) { //remove selection has higher precedence over finishing template editing + final TemplateState templateState = TemplateManagerImpl.getTemplateState(editor); + if (templateState != null && !templateState.isFinished()) { + CommandProcessor.getInstance().setCurrentCommandName(CodeInsightBundle.message("finish.template.command")); + templateState.gotoEnd(); + return; + } + } + + myOriginalHandler.execute(editor, dataContext); + } + + public boolean isEnabled(Editor editor, DataContext dataContext) { + final TemplateState templateState = TemplateManagerImpl.getTemplateState(editor); + if (templateState != null && !templateState.isFinished()) { + return true; + } else { + return myOriginalHandler.isEnabled(editor, dataContext); + } + } +} diff --git a/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/HomeEndHandler.java b/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/HomeEndHandler.java new file mode 100644 index 0000000000..36d94deb52 --- /dev/null +++ b/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/HomeEndHandler.java @@ -0,0 +1,37 @@ +package com.intellij.codeInsight.template.impl.editorActions; + +import com.intellij.openapi.editor.actionSystem.EditorActionHandler; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.util.TextRange; +import com.intellij.codeInsight.template.impl.TemplateState; +import com.intellij.codeInsight.template.impl.TemplateManagerImpl; + +public abstract class HomeEndHandler extends EditorActionHandler { + private EditorActionHandler myOriginalHandler; + boolean myIsHomeHandler; + + public HomeEndHandler(final EditorActionHandler originalHandler, boolean isHomeHandler) { + myOriginalHandler = originalHandler; + myIsHomeHandler = isHomeHandler; + } + + public void execute(Editor editor, DataContext dataContext) { + final TemplateState templateState = TemplateManagerImpl.getTemplateState(editor); + if (templateState != null && !templateState.isFinished()) { + final TextRange range = templateState.getCurrentVariableRange(); + final int caretOffset = editor.getCaretModel().getOffset(); + if (range != null && range.getStartOffset() <= caretOffset && caretOffset <= range.getEndOffset()) { + int offsetToMove = myIsHomeHandler ? range.getStartOffset() : range.getEndOffset(); + if (offsetToMove != caretOffset) { + editor.getCaretModel().moveToOffset(offsetToMove); + editor.getSelectionModel().removeSelection(); + } + } else { + myOriginalHandler.execute(editor, dataContext); + } + } else { + myOriginalHandler.execute(editor, dataContext); + } + } +} diff --git a/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/HomeHandler.java b/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/HomeHandler.java new file mode 100644 index 0000000000..08162cb7c1 --- /dev/null +++ b/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/HomeHandler.java @@ -0,0 +1,12 @@ +package com.intellij.codeInsight.template.impl.editorActions; + +import com.intellij.openapi.editor.actionSystem.EditorActionHandler; + +/** + * @author yole + */ +public class HomeHandler extends HomeEndHandler { + public HomeHandler(final EditorActionHandler originalHandler) { + super(originalHandler, true); + } +} diff --git a/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/SpaceHandler.java b/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/SpaceHandler.java new file mode 100644 index 0000000000..1726172e4f --- /dev/null +++ b/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/SpaceHandler.java @@ -0,0 +1,35 @@ +package com.intellij.codeInsight.template.impl.editorActions; + +import com.intellij.openapi.editor.actionSystem.TypedActionHandler; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.project.Project; +import com.intellij.codeInsight.template.impl.TemplateManagerImpl; +import com.intellij.codeInsight.template.impl.TemplateSettings; + +public class SpaceHandler implements TypedActionHandler { + private TypedActionHandler myOriginalHandler; + + public SpaceHandler(TypedActionHandler originalHandler) { + myOriginalHandler = originalHandler; + } + + public void execute(Editor editor, char charTyped, DataContext dataContext) { + if (charTyped != ' ') { + myOriginalHandler.execute(editor, charTyped, dataContext); + return; + } + + Project project = PlatformDataKeys.PROJECT.getData(dataContext); + if (project == null) { + myOriginalHandler.execute(editor, charTyped, dataContext); + return; + } + + TemplateManagerImpl templateManager = (TemplateManagerImpl) TemplateManagerImpl.getInstance(project); + if (!templateManager.startTemplate(templateManager, editor, TemplateSettings.SPACE_CHAR)) { + myOriginalHandler.execute(editor, charTyped, dataContext); + } + } +} diff --git a/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/TabHandler.java b/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/TabHandler.java new file mode 100644 index 0000000000..058f553cea --- /dev/null +++ b/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/TabHandler.java @@ -0,0 +1,37 @@ +package com.intellij.codeInsight.template.impl.editorActions; + +import com.intellij.openapi.editor.actionSystem.EditorWriteActionHandler; +import com.intellij.openapi.editor.actionSystem.EditorActionHandler; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.project.Project; +import com.intellij.codeInsight.template.impl.TemplateManagerImpl; +import com.intellij.codeInsight.template.impl.TemplateSettings; + +public class TabHandler extends EditorWriteActionHandler { + private EditorActionHandler myOriginalHandler; + + public TabHandler(EditorActionHandler originalHandler) { + myOriginalHandler = originalHandler; + } + + public void executeWriteAction(Editor editor, DataContext dataContext) { + Project project = PlatformDataKeys.PROJECT.getData(dataContext); + + if (project == null) { + myOriginalHandler.execute(editor, dataContext); + return; + } + + TemplateManagerImpl templateManager = (TemplateManagerImpl) TemplateManagerImpl.getInstance(project); + + if (!templateManager.startTemplate(templateManager, editor, TemplateSettings.TAB_CHAR)) { + myOriginalHandler.execute(editor, dataContext); + } + } + + public boolean isEnabled(Editor editor, DataContext dataContext) { + return myOriginalHandler.isEnabled(editor, dataContext); + } +} diff --git a/platform-api/src/com/intellij/openapi/editor/actionSystem/EditorAction.java b/platform-api/src/com/intellij/openapi/editor/actionSystem/EditorAction.java index 8a0ec458d6..01f40ec631 100644 --- a/platform-api/src/com/intellij/openapi/editor/actionSystem/EditorAction.java +++ b/platform-api/src/com/intellij/openapi/editor/actionSystem/EditorAction.java @@ -20,12 +20,15 @@ import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.command.UndoConfirmationPolicy; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.Ref; +import com.intellij.openapi.extensions.Extensions; import org.jetbrains.annotations.Nullable; public abstract class EditorAction extends AnAction { private EditorActionHandler myHandler; + private boolean myHandlersLoaded; public final EditorActionHandler getHandler() { + ensureHandlersLoaded(); return myHandler; } @@ -35,11 +38,24 @@ public abstract class EditorAction extends AnAction { } public final EditorActionHandler setupHandler(EditorActionHandler newHandler) { + ensureHandlersLoaded(); EditorActionHandler tmp = myHandler; myHandler = newHandler; return tmp; } + private void ensureHandlersLoaded() { + if (!myHandlersLoaded) { + myHandlersLoaded = true; + final String id = ActionManager.getInstance().getId(this); + for(EditorActionHandlerBean handlerBean: Extensions.getExtensions(EditorActionHandlerBean.EP_NAME)) { + if (handlerBean.action.equals(id)) { + myHandler = handlerBean.getHandler(myHandler); + } + } + } + } + public final void actionPerformed(AnActionEvent e) { DataContext dataContext = e.getDataContext(); Editor editor = getEditor(dataContext); diff --git a/platform-api/src/com/intellij/openapi/editor/actionSystem/EditorActionHandlerBean.java b/platform-api/src/com/intellij/openapi/editor/actionSystem/EditorActionHandlerBean.java new file mode 100644 index 0000000000..cfe74e6018 --- /dev/null +++ b/platform-api/src/com/intellij/openapi/editor/actionSystem/EditorActionHandlerBean.java @@ -0,0 +1,40 @@ +package com.intellij.openapi.editor.actionSystem; + +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.extensions.AbstractExtensionPointBean; +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.util.pico.IdeaPicoContainer; +import com.intellij.util.xmlb.annotations.Attribute; + +/** + * @author yole + */ +public class EditorActionHandlerBean extends AbstractExtensionPointBean { + private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.editor.actionSystem.EditorActionHandlerBean"); + + public static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.editorActionHandler"); + + // these must be public for scrambling compatibility + @Attribute("action") + public String action; + @Attribute("implementationClass") + public String implementationClass; + + private EditorActionHandler myHandler; + + public EditorActionHandler getHandler(EditorActionHandler originalHandler) { + if (myHandler == null) { + try { + IdeaPicoContainer container = new IdeaPicoContainer(ApplicationManager.getApplication().getPicoContainer()); + container.registerComponentInstance(originalHandler); + myHandler = instantiate(implementationClass, container); + } + catch(Exception e) { + LOG.error(e); + return null; + } + } + return myHandler; + } +} diff --git a/platform-api/src/com/intellij/openapi/editor/actionSystem/EditorTypedHandlerBean.java b/platform-api/src/com/intellij/openapi/editor/actionSystem/EditorTypedHandlerBean.java new file mode 100644 index 0000000000..c5b740ab33 --- /dev/null +++ b/platform-api/src/com/intellij/openapi/editor/actionSystem/EditorTypedHandlerBean.java @@ -0,0 +1,38 @@ +package com.intellij.openapi.editor.actionSystem; + +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.extensions.AbstractExtensionPointBean; +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.util.pico.IdeaPicoContainer; +import com.intellij.util.xmlb.annotations.Attribute; + +/** + * @author yole + */ +public class EditorTypedHandlerBean extends AbstractExtensionPointBean { + private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.editor.actionSystem.EditorActionHandlerBean"); + + public static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.editorTypedHandler"); + + // these must be public for scrambling compatibility + @Attribute("implementationClass") + public String implementationClass; + + private TypedActionHandler myHandler; + + public TypedActionHandler getHandler(TypedActionHandler originalHandler) { + if (myHandler == null) { + try { + IdeaPicoContainer container = new IdeaPicoContainer(ApplicationManager.getApplication().getPicoContainer()); + container.registerComponentInstance(originalHandler); + myHandler = instantiate(implementationClass, container); + } + catch(Exception e) { + LOG.error(e); + return null; + } + } + return myHandler; + } +} \ No newline at end of file diff --git a/platform-api/src/com/intellij/openapi/editor/actionSystem/TypedAction.java b/platform-api/src/com/intellij/openapi/editor/actionSystem/TypedAction.java index 17a503c4fa..ddd0f973a3 100644 --- a/platform-api/src/com/intellij/openapi/editor/actionSystem/TypedAction.java +++ b/platform-api/src/com/intellij/openapi/editor/actionSystem/TypedAction.java @@ -21,6 +21,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.command.UndoConfirmationPolicy; import com.intellij.openapi.editor.*; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileEditor.FileDocumentManager; /** @@ -30,11 +31,21 @@ import com.intellij.openapi.fileEditor.FileDocumentManager; */ public class TypedAction { private TypedActionHandler myHandler; + private boolean myHandlersLoaded; public TypedAction() { myHandler = new Handler(); } + private void ensureHandlersLoaded() { + if (!myHandlersLoaded) { + myHandlersLoaded = true; + for(EditorTypedHandlerBean handlerBean: Extensions.getExtensions(EditorTypedHandlerBean.EP_NAME)) { + myHandler = handlerBean.getHandler(myHandler); + } + } + } + private static class Handler implements TypedActionHandler { public void execute(Editor editor, char charTyped, DataContext dataContext) { if (editor.isViewer()) return; @@ -67,6 +78,7 @@ public class TypedAction { * @return the current typing handler. */ public TypedActionHandler getHandler() { + ensureHandlersLoaded(); return myHandler; } @@ -78,6 +90,7 @@ public class TypedAction { * @return the previously registered handler. */ public TypedActionHandler setupHandler(TypedActionHandler handler) { + ensureHandlersLoaded(); TypedActionHandler tmp = myHandler; myHandler = handler; return tmp; diff --git a/platform-impl/src/com/intellij/codeInsight/hint/EscapeHandler.java b/platform-impl/src/com/intellij/codeInsight/hint/EscapeHandler.java new file mode 100644 index 0000000000..4560cf8a1c --- /dev/null +++ b/platform-impl/src/com/intellij/codeInsight/hint/EscapeHandler.java @@ -0,0 +1,33 @@ +package com.intellij.codeInsight.hint; + +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.actionSystem.EditorActionHandler; +import com.intellij.openapi.project.Project; + +public class EscapeHandler extends EditorActionHandler { + private final EditorActionHandler myOriginalHandler; + + public EscapeHandler(EditorActionHandler originalHandler) { + myOriginalHandler = originalHandler; + } + + public void execute(Editor editor, DataContext dataContext) { + Project project = PlatformDataKeys.PROJECT.getData(dataContext); + if (project == null || !HintManagerImpl.getInstanceImpl().hideHints(HintManagerImpl.HIDE_BY_ESCAPE | HintManagerImpl.HIDE_BY_ANY_KEY, true, false)) { + myOriginalHandler.execute(editor, dataContext); + } + } + + public boolean isEnabled(Editor editor, DataContext dataContext) { + Project project = PlatformDataKeys.PROJECT.getData(dataContext); + + if (project != null) { + HintManagerImpl hintManager = HintManagerImpl.getInstanceImpl(); + return hintManager.isEscapeHandlerEnabled(); + } + + return myOriginalHandler.isEnabled(editor, dataContext); + } +} diff --git a/platform-impl/src/com/intellij/codeInsight/hint/HintManagerImpl.java b/platform-impl/src/com/intellij/codeInsight/hint/HintManagerImpl.java index 1db1f4ff58..542b80e596 100644 --- a/platform-impl/src/com/intellij/codeInsight/hint/HintManagerImpl.java +++ b/platform-impl/src/com/intellij/codeInsight/hint/HintManagerImpl.java @@ -7,7 +7,6 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.LogicalPosition; -import com.intellij.openapi.editor.actionSystem.EditorActionHandler; import com.intellij.openapi.editor.actionSystem.EditorActionManager; import com.intellij.openapi.editor.event.*; import com.intellij.openapi.editor.ex.EditorEx; @@ -153,9 +152,6 @@ public class HintManagerImpl extends HintManager { } }; - editorActionManager.setActionHandler(IdeActions.ACTION_EDITOR_ESCAPE, - new EscapeHandler(editorActionManager.getActionHandler(IdeActions.ACTION_EDITOR_ESCAPE))); - myTooltipController = new TooltipController(); } @@ -724,41 +720,19 @@ public class HintManagerImpl extends HintManager { } } - public static class EscapeHandler extends EditorActionHandler { - private final EditorActionHandler myOriginalHandler; - - public EscapeHandler(EditorActionHandler originalHandler) { - myOriginalHandler = originalHandler; - } - - public void execute(Editor editor, DataContext dataContext) { - Project project = PlatformDataKeys.PROJECT.getData(dataContext); - if (project == null || !getInstanceImpl().hideHints(HIDE_BY_ESCAPE | HIDE_BY_ANY_KEY, true, false)) { - myOriginalHandler.execute(editor, dataContext); + boolean isEscapeHandlerEnabled() { + for (int i = myHintsStack.size() - 1; i >= 0; i--) { + final HintInfo info = myHintsStack.get(i); + if (!info.hint.isVisible()) { + myHintsStack.remove(i); + continue; } - } - - public boolean isEnabled(Editor editor, DataContext dataContext) { - LOG.assertTrue(SwingUtilities.isEventDispatchThread()); - Project project = PlatformDataKeys.PROJECT.getData(dataContext); - - if (project != null) { - HintManagerImpl hintManager = getInstanceImpl(); - for (int i = hintManager.myHintsStack.size() - 1; i >= 0; i--) { - final HintInfo info = hintManager.myHintsStack.get(i); - if (!info.hint.isVisible()) { - hintManager.myHintsStack.remove(i); - continue; - } - if ((info.flags & (HIDE_BY_ESCAPE | HIDE_BY_ANY_KEY)) != 0) { - return true; - } - } + if ((info.flags & (HIDE_BY_ESCAPE | HIDE_BY_ANY_KEY)) != 0) { + return true; } - - return myOriginalHandler.isEnabled(editor, dataContext); } + return false; } protected boolean hideHints(int mask, boolean onlyOne, boolean editorChanged) { diff --git a/platform-resources/src/META-INF/LangExtensions.xml b/platform-resources/src/META-INF/LangExtensions.xml index e7c46cdaa3..a77808e50e 100644 --- a/platform-resources/src/META-INF/LangExtensions.xml +++ b/platform-resources/src/META-INF/LangExtensions.xml @@ -315,4 +315,38 @@ com.intellij.codeInsight.intention.impl.EditFoldingOptionsAction + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/platform-resources/src/META-INF/PlatformExtensionPoints.xml b/platform-resources/src/META-INF/PlatformExtensionPoints.xml index ec4dbedd4d..c44daee3e0 100644 --- a/platform-resources/src/META-INF/PlatformExtensionPoints.xml +++ b/platform-resources/src/META-INF/PlatformExtensionPoints.xml @@ -70,4 +70,7 @@ + + + diff --git a/platform-resources/src/META-INF/PlatformExtensions.xml b/platform-resources/src/META-INF/PlatformExtensions.xml index 12a6fb3f32..9b04c7aec7 100644 --- a/platform-resources/src/META-INF/PlatformExtensions.xml +++ b/platform-resources/src/META-INF/PlatformExtensions.xml @@ -113,4 +113,6 @@ + + \ No newline at end of file diff --git a/platform-resources/src/componentSets/Lang.xml b/platform-resources/src/componentSets/Lang.xml index b0b89a1f92..49d1aa6235 100644 --- a/platform-resources/src/componentSets/Lang.xml +++ b/platform-resources/src/componentSets/Lang.xml @@ -38,14 +38,6 @@ - com.intellij.codeInsight.template.impl.TemplateManagerActions - com.intellij.codeInsight.template.impl.TemplateManagerActions - - - com.intellij.codeInsight.lookup.impl.LookupManagerActions - com.intellij.codeInsight.lookup.impl.LookupManagerActions - - com.intellij.util.indexing.FileBasedIndex @@ -64,11 +56,6 @@ - com.intellij.codeInsight.highlighting.HighlightManagerActions - com.intellij.codeInsight.highlighting.HighlightManagerActions - - - com.intellij.psi.stubs.SerializationManager com.intellij.psi.stubs.SerializationManagerImpl -- 2.11.4.GIT