--- /dev/null
+/*******************************************************************************\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