]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.ui/src/org/simantics/ui/workbench/ResourceEditorActionContributor.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.ui / src / org / simantics / ui / workbench / ResourceEditorActionContributor.java
diff --git a/bundles/org.simantics.ui/src/org/simantics/ui/workbench/ResourceEditorActionContributor.java b/bundles/org.simantics.ui/src/org/simantics/ui/workbench/ResourceEditorActionContributor.java
new file mode 100644 (file)
index 0000000..1c864a5
--- /dev/null
@@ -0,0 +1,308 @@
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ *     VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.ui.workbench;\r
+\r
+\r
+import org.eclipse.core.runtime.Assert;\r
+import org.eclipse.jface.action.IAction;\r
+import org.eclipse.jface.action.IContributionItem;\r
+import org.eclipse.jface.action.IContributionManager;\r
+import org.eclipse.jface.action.IMenuManager;\r
+import org.eclipse.jface.action.IStatusLineManager;\r
+import org.eclipse.ui.IActionBars;\r
+import org.eclipse.ui.IEditorPart;\r
+import org.eclipse.ui.actions.ActionFactory;\r
+import org.eclipse.ui.part.EditorActionBarContributor;\r
+\r
+\r
+\r
+\r
+\r
+/**\r
+ * Manages the installation and removal of global actions for\r
+ * the same type of editors.\r
+ * <p>\r
+ * If instantiated and used as-is, this contributor connects to all of the workbench defined\r
+ * global editor actions the corresponding actions of the current editor. It also adds addition\r
+ * actions for searching and navigation (go to line) as well as a set of status fields.</p>\r
+ * <p>\r
+ * Subclasses may override the following methods:\r
+ * <ul>\r
+ *   <li><code>contributeToMenu</code> - extend to contribute to menu</li>\r
+ *   <li><code>contributeToToolBar</code> - reimplement to contribute to tool bar</li>\r
+ *   <li><code>contributeToStatusLine</code> - reimplement to contribute to status line</li>\r
+ *   <li><code>setActiveEditor</code> - extend to react to editor changes</li>\r
+ * </ul>\r
+ * </p>\r
+ * @see org.eclipse.ui.texteditor.ITextEditorActionConstants\r
+ */\r
+public class ResourceEditorActionContributor extends EditorActionBarContributor {\r
+\r
+\r
+       /** The global actions to be connected with editor actions */\r
+       private final static String[] ACTIONS= {\r
+               ActionFactory.UNDO.getId(),\r
+        ActionFactory.REDO.getId(),\r
+        ActionFactory.CUT.getId(),\r
+        ActionFactory.COPY.getId(),\r
+        ActionFactory.PASTE.getId(),\r
+        ActionFactory.DELETE.getId(),\r
+        ActionFactory.SELECT_ALL.getId(),\r
+        ActionFactory.FIND.getId(),\r
+        ActionFactory.PRINT.getId(),\r
+        ActionFactory.PROPERTIES.getId(),\r
+        //ActionFactory.REVERT.getId(),\r
+       };\r
+\r
+       /**\r
+        * Status field definition.\r
+        * @since 3.0\r
+        */\r
+       @SuppressWarnings("unused")\r
+    private static class StatusFieldDef {\r
+\r
+               private String category;\r
+               private String actionId;\r
+               private boolean visible;\r
+               private int widthInChars;\r
+\r
+               private StatusFieldDef(String category, String actionId, boolean visible, int widthInChars) {\r
+                       Assert.isNotNull(category);\r
+                       this.category= category;\r
+                       this.actionId= actionId;\r
+                       this.visible= visible;\r
+                       this.widthInChars= widthInChars;\r
+               }\r
+       }\r
+\r
+       /**\r
+        * The status fields to be set to the editor\r
+        * @since 3.0\r
+        */\r
+//     private final static StatusFieldDef[] STATUS_FIELD_DEFS= {\r
+//             new StatusFieldDef(ITextEditorActionConstants.STATUS_CATEGORY_FIND_FIELD, null, false, EditorMessages.Editor_FindIncremental_reverse_name.length() + 15),\r
+//             new StatusFieldDef(ITextEditorActionConstants.STATUS_CATEGORY_ELEMENT_STATE, null, true, StatusLineContributionItem.DEFAULT_WIDTH_IN_CHARS + 1),\r
+//             new StatusFieldDef(ITextEditorActionConstants.STATUS_CATEGORY_INPUT_MODE, ITextEditorActionDefinitionIds.TOGGLE_OVERWRITE, true, StatusLineContributionItem.DEFAULT_WIDTH_IN_CHARS),\r
+//             new StatusFieldDef(ITextEditorActionConstants.STATUS_CATEGORY_INPUT_POSITION, ITextEditorActionConstants.GOTO_LINE, true, StatusLineContributionItem.DEFAULT_WIDTH_IN_CHARS)\r
+//     };\r
+\r
+       /**\r
+        * The active editor part.\r
+        */\r
+       private IEditorPart activeEditorPart;\r
+       /**\r
+        * The find next action.\r
+        * @since 2.0\r
+        */\r
+//     private RetargetTextEditorAction fFindNext;\r
+       /**\r
+        * The find previous action.\r
+        * @since 2.0\r
+        */\r
+//     private RetargetTextEditorAction fFindPrevious;\r
+       /**\r
+        * The incremental find action.\r
+        * @since 2.0\r
+        */\r
+//     private RetargetTextEditorAction fIncrementalFind;\r
+       /**\r
+        * The reverse incremental find action.\r
+        * @since 2.1\r
+        */\r
+//     private RetargetTextEditorAction fIncrementalFindReverse;\r
+       /**\r
+        * The go to line action.\r
+        */\r
+//     private RetargetTextEditorAction fGotoLine;\r
+       /**\r
+        * The word completion action.\r
+        * @since 3.1\r
+        */\r
+//     private RetargetTextEditorAction fHippieCompletion;\r
+       /**\r
+        * The map of status fields.\r
+        * @since 2.0\r
+        */\r
+//     private Map fStatusFields;\r
+\r
+\r
+       /**\r
+        * Creates an empty editor action bar contributor. The action bars are\r
+        * furnished later via the <code>init</code> method.\r
+        *\r
+        * @see org.eclipse.ui.IEditorActionBarContributor#init(org.eclipse.ui.IActionBars, org.eclipse.ui.IWorkbenchPage)\r
+        */\r
+       public ResourceEditorActionContributor() {\r
+\r
+//             fFindNext= new RetargetTextEditorAction(EditorMessages.getBundleForConstructedKeys(), "Editor.FindNext."); //$NON-NLS-1$\r
+//             fFindNext.setActionDefinitionId(IWorkbenchActionDefinitionIds.FIND_NEXT);\r
+//             fFindPrevious= new RetargetTextEditorAction(EditorMessages.getBundleForConstructedKeys(), "Editor.FindPrevious."); //$NON-NLS-1$\r
+//             fFindPrevious.setActionDefinitionId(IWorkbenchActionDefinitionIds.FIND_PREVIOUS);\r
+//             fIncrementalFind= new RetargetTextEditorAction(EditorMessages.getBundleForConstructedKeys(), "Editor.FindIncremental."); //$NON-NLS-1$\r
+//             fIncrementalFind.setActionDefinitionId(IWorkbenchActionDefinitionIds.FIND_INCREMENTAL);\r
+//             fIncrementalFindReverse= new RetargetTextEditorAction(EditorMessages.getBundleForConstructedKeys(), "Editor.FindIncrementalReverse."); //$NON-NLS-1$\r
+//             fIncrementalFindReverse.setActionDefinitionId(IWorkbenchActionDefinitionIds.FIND_INCREMENTAL_REVERSE);\r
+//             fGotoLine= new RetargetTextEditorAction(EditorMessages.getBundleForConstructedKeys(), "Editor.GotoLine."); //$NON-NLS-1$\r
+//             fGotoLine.setActionDefinitionId(ITextEditorActionDefinitionIds.LINE_GOTO);\r
+//             fHippieCompletion= new RetargetTextEditorAction(EditorMessages.getBundleForConstructedKeys(), "Editor.HippieCompletion."); //$NON-NLS-1$\r
+//             fHippieCompletion.setActionDefinitionId(ITextEditorActionDefinitionIds.HIPPIE_COMPLETION);\r
+\r
+//             fStatusFields= new HashMap(3);\r
+//             for (int i= 0; i < STATUS_FIELD_DEFS.length; i++) {\r
+//                     StatusFieldDef fieldDef= STATUS_FIELD_DEFS[i];\r
+//                     fStatusFields.put(fieldDef, new StatusLineContributionItem(fieldDef.category, fieldDef.visible, fieldDef.widthInChars));\r
+//             }\r
+       }\r
+\r
+       /**\r
+        * Returns the active editor part.\r
+        *\r
+        * @return the active editor part\r
+        */\r
+       protected final IEditorPart getActiveEditorPart() {\r
+               return activeEditorPart;\r
+       }\r
+\r
+       /**\r
+        * Returns the action registered with the given text editor.\r
+        *\r
+        * @param editor the editor, or <code>null</code>\r
+        * @param actionId the action id\r
+        * @return the action, or <code>null</code> if none\r
+        */\r
+       protected final IAction getAction(IResourceEditorPart editor, String actionId) {\r
+           return null;\r
+//             return (editor == null || actionId == null ? null : editor.getAction(actionId));\r
+       }\r
+\r
+       /**\r
+        * The method installs the global action handlers for the given text editor.\r
+        * <p>\r
+        * This method cannot be overridden by subclasses.</p>\r
+        *\r
+        * @param part the active editor part\r
+        * @since 2.0\r
+        */\r
+       private void doSetActiveEditor(IEditorPart part) {\r
+\r
+               if (activeEditorPart == part)\r
+                       return;\r
+\r
+//             if (fActiveEditorPart instanceof ITextEditorExtension) {\r
+//                     ITextEditorExtension extension= (ITextEditorExtension) fActiveEditorPart;\r
+//                     for (int i= 0; i < STATUS_FIELD_DEFS.length; i++)\r
+//                             extension.setStatusField(null, STATUS_FIELD_DEFS[i].category);\r
+//             }\r
+\r
+               activeEditorPart= part;\r
+               IResourceEditorPart editor = (part instanceof IResourceEditorPart) ? (IResourceEditorPart) part : null;\r
+\r
+               IActionBars actionBars= getActionBars();\r
+               for (int i= 0; i < ACTIONS.length; i++)\r
+                       actionBars.setGlobalActionHandler(ACTIONS[i], getAction(editor, ACTIONS[i]));\r
+\r
+//             fFindNext.setAction(getAction(editor, ITextEditorActionConstants.FIND_NEXT));\r
+//             fFindPrevious.setAction(getAction(editor, ITextEditorActionConstants.FIND_PREVIOUS));\r
+//             fIncrementalFind.setAction(getAction(editor, ITextEditorActionConstants.FIND_INCREMENTAL));\r
+//             fIncrementalFindReverse.setAction(getAction(editor, ITextEditorActionConstants.FIND_INCREMENTAL_REVERSE));\r
+//             fGotoLine.setAction(getAction(editor, ITextEditorActionConstants.GOTO_LINE));\r
+//             fHippieCompletion.setAction(getAction(editor, ITextEditorActionConstants.HIPPIE_COMPLETION));\r
+//\r
+//             for (int i= 0; i < STATUS_FIELD_DEFS.length; i++) {\r
+//                     if (fActiveEditorPart instanceof ITextEditorExtension) {\r
+//                             StatusLineContributionItem statusField= (StatusLineContributionItem) fStatusFields.get(STATUS_FIELD_DEFS[i]);\r
+//                             statusField.setActionHandler(getAction(editor, STATUS_FIELD_DEFS[i].actionId));\r
+//                             ITextEditorExtension extension= (ITextEditorExtension) fActiveEditorPart;\r
+//                             extension.setStatusField(statusField, STATUS_FIELD_DEFS[i].category);\r
+//                     }\r
+//             }\r
+       }\r
+\r
+       /**\r
+        * The <code>BasicTextEditorActionContributor</code> implementation of this\r
+        * <code>IEditorActionBarContributor</code> method installs the global\r
+        * action handler for the given text editor by calling a private helper\r
+        * method.\r
+        * <p>\r
+        * Subclasses may extend.</p>\r
+        *\r
+        * @param part {@inheritDoc}\r
+        */\r
+       public void setActiveEditor(IEditorPart part) {\r
+               doSetActiveEditor(part);\r
+       }\r
+\r
+       /*\r
+        * @see EditorActionBarContributor#contributeToMenu(IMenuManager)\r
+        */\r
+       public void contributeToMenu(IMenuManager menu) {\r
+\r
+//             IMenuManager editMenu= menu.findMenuUsingPath(IWorkbenchActionConstants.M_EDIT);\r
+//             if (editMenu != null) {\r
+//                     editMenu.prependToGroup(IWorkbenchActionConstants.FIND_EXT, fIncrementalFindReverse);\r
+//                     editMenu.prependToGroup(IWorkbenchActionConstants.FIND_EXT, fIncrementalFind);\r
+//                     editMenu.prependToGroup(IWorkbenchActionConstants.FIND_EXT, fFindPrevious);\r
+//                     editMenu.prependToGroup(IWorkbenchActionConstants.FIND_EXT, fFindNext);\r
+//\r
+//                     addOrInsert(editMenu, new Separator(ITextEditorActionConstants.GROUP_OPEN));\r
+//                     addOrInsert(editMenu, new Separator(ITextEditorActionConstants.GROUP_INFORMATION));\r
+//                     addOrInsert(editMenu, new Separator(ITextEditorActionConstants.GROUP_ASSIST));\r
+//                     addOrInsert(editMenu, new Separator(ITextEditorActionConstants.GROUP_GENERATE));\r
+//                     addOrInsert(editMenu, new Separator(IWorkbenchActionConstants.MB_ADDITIONS));\r
+//\r
+//                     editMenu.appendToGroup(ITextEditorActionConstants.GROUP_ASSIST, fHippieCompletion);\r
+//             }\r
+//\r
+//             IMenuManager navigateMenu= menu.findMenuUsingPath(IWorkbenchActionConstants.M_NAVIGATE);\r
+//             if (navigateMenu != null) {\r
+//                     navigateMenu.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, fGotoLine);\r
+//             }\r
+       }\r
+\r
+       /**\r
+        * The <code>item</code> is {@link IContributionManager#add(IContributionItem) added} to\r
+        * <code>menu</code> if no item with the same id currently exists. If there already is an\r
+        * contribution item with the same id, the new item gets\r
+        * {@link IContributionManager#insertAfter(String, IContributionItem) inserted after} it.\r
+        * \r
+        * @param menu the contribution manager\r
+        * @param item the contribution item\r
+        * @since 3.2\r
+        */\r
+       @SuppressWarnings("unused")\r
+    private void addOrInsert(IContributionManager menu, IContributionItem item) {\r
+           String id= item.getId();\r
+               if (menu.find(id) == null)\r
+               menu.add(item);\r
+           else\r
+               menu.insertAfter(id, item);\r
+    }\r
+\r
+       /*\r
+        * @see EditorActionBarContributor#contributeToStatusLine(org.eclipse.jface.action.IStatusLineManager)\r
+        * @since 2.0\r
+        */\r
+       public void contributeToStatusLine(IStatusLineManager statusLineManager) {\r
+               super.contributeToStatusLine(statusLineManager);\r
+//             for (int i= 0; i < STATUS_FIELD_DEFS.length; i++)\r
+//                     statusLineManager.add((IContributionItem)fStatusFields.get(STATUS_FIELD_DEFS[i]));\r
+       }\r
+\r
+       /*\r
+        * @see org.eclipse.ui.IEditorActionBarContributor#dispose()\r
+        * @since 2.0\r
+        */\r
+       public void dispose() {\r
+               doSetActiveEditor(null);\r
+               super.dispose();\r
+       }\r
+}\r