]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.ui.workbench;\r
13 \r
14 \r
15 import org.eclipse.core.runtime.Assert;\r
16 import org.eclipse.jface.action.IAction;\r
17 import org.eclipse.jface.action.IContributionItem;\r
18 import org.eclipse.jface.action.IContributionManager;\r
19 import org.eclipse.jface.action.IMenuManager;\r
20 import org.eclipse.jface.action.IStatusLineManager;\r
21 import org.eclipse.ui.IActionBars;\r
22 import org.eclipse.ui.IEditorPart;\r
23 import org.eclipse.ui.actions.ActionFactory;\r
24 import org.eclipse.ui.part.EditorActionBarContributor;\r
25 \r
26 \r
27 \r
28 \r
29 \r
30 /**\r
31  * Manages the installation and removal of global actions for\r
32  * the same type of editors.\r
33  * <p>\r
34  * If instantiated and used as-is, this contributor connects to all of the workbench defined\r
35  * global editor actions the corresponding actions of the current editor. It also adds addition\r
36  * actions for searching and navigation (go to line) as well as a set of status fields.</p>\r
37  * <p>\r
38  * Subclasses may override the following methods:\r
39  * <ul>\r
40  *   <li><code>contributeToMenu</code> - extend to contribute to menu</li>\r
41  *   <li><code>contributeToToolBar</code> - reimplement to contribute to tool bar</li>\r
42  *   <li><code>contributeToStatusLine</code> - reimplement to contribute to status line</li>\r
43  *   <li><code>setActiveEditor</code> - extend to react to editor changes</li>\r
44  * </ul>\r
45  * </p>\r
46  * @see org.eclipse.ui.texteditor.ITextEditorActionConstants\r
47  */\r
48 public class ResourceEditorActionContributor extends EditorActionBarContributor {\r
49 \r
50 \r
51         /** The global actions to be connected with editor actions */\r
52         private final static String[] ACTIONS= {\r
53                 ActionFactory.UNDO.getId(),\r
54         ActionFactory.REDO.getId(),\r
55         ActionFactory.CUT.getId(),\r
56         ActionFactory.COPY.getId(),\r
57         ActionFactory.PASTE.getId(),\r
58         ActionFactory.DELETE.getId(),\r
59         ActionFactory.SELECT_ALL.getId(),\r
60         ActionFactory.FIND.getId(),\r
61         ActionFactory.PRINT.getId(),\r
62         ActionFactory.PROPERTIES.getId(),\r
63         //ActionFactory.REVERT.getId(),\r
64         };\r
65 \r
66         /**\r
67          * Status field definition.\r
68          * @since 3.0\r
69          */\r
70         @SuppressWarnings("unused")\r
71     private static class StatusFieldDef {\r
72 \r
73                 private String category;\r
74                 private String actionId;\r
75                 private boolean visible;\r
76                 private int widthInChars;\r
77 \r
78                 private StatusFieldDef(String category, String actionId, boolean visible, int widthInChars) {\r
79                         Assert.isNotNull(category);\r
80                         this.category= category;\r
81                         this.actionId= actionId;\r
82                         this.visible= visible;\r
83                         this.widthInChars= widthInChars;\r
84                 }\r
85         }\r
86 \r
87         /**\r
88          * The status fields to be set to the editor\r
89          * @since 3.0\r
90          */\r
91 //      private final static StatusFieldDef[] STATUS_FIELD_DEFS= {\r
92 //              new StatusFieldDef(ITextEditorActionConstants.STATUS_CATEGORY_FIND_FIELD, null, false, EditorMessages.Editor_FindIncremental_reverse_name.length() + 15),\r
93 //              new StatusFieldDef(ITextEditorActionConstants.STATUS_CATEGORY_ELEMENT_STATE, null, true, StatusLineContributionItem.DEFAULT_WIDTH_IN_CHARS + 1),\r
94 //              new StatusFieldDef(ITextEditorActionConstants.STATUS_CATEGORY_INPUT_MODE, ITextEditorActionDefinitionIds.TOGGLE_OVERWRITE, true, StatusLineContributionItem.DEFAULT_WIDTH_IN_CHARS),\r
95 //              new StatusFieldDef(ITextEditorActionConstants.STATUS_CATEGORY_INPUT_POSITION, ITextEditorActionConstants.GOTO_LINE, true, StatusLineContributionItem.DEFAULT_WIDTH_IN_CHARS)\r
96 //      };\r
97 \r
98         /**\r
99          * The active editor part.\r
100          */\r
101         private IEditorPart activeEditorPart;\r
102         /**\r
103          * The find next action.\r
104          * @since 2.0\r
105          */\r
106 //      private RetargetTextEditorAction fFindNext;\r
107         /**\r
108          * The find previous action.\r
109          * @since 2.0\r
110          */\r
111 //      private RetargetTextEditorAction fFindPrevious;\r
112         /**\r
113          * The incremental find action.\r
114          * @since 2.0\r
115          */\r
116 //      private RetargetTextEditorAction fIncrementalFind;\r
117         /**\r
118          * The reverse incremental find action.\r
119          * @since 2.1\r
120          */\r
121 //      private RetargetTextEditorAction fIncrementalFindReverse;\r
122         /**\r
123          * The go to line action.\r
124          */\r
125 //      private RetargetTextEditorAction fGotoLine;\r
126         /**\r
127          * The word completion action.\r
128          * @since 3.1\r
129          */\r
130 //      private RetargetTextEditorAction fHippieCompletion;\r
131         /**\r
132          * The map of status fields.\r
133          * @since 2.0\r
134          */\r
135 //      private Map fStatusFields;\r
136 \r
137 \r
138         /**\r
139          * Creates an empty editor action bar contributor. The action bars are\r
140          * furnished later via the <code>init</code> method.\r
141          *\r
142          * @see org.eclipse.ui.IEditorActionBarContributor#init(org.eclipse.ui.IActionBars, org.eclipse.ui.IWorkbenchPage)\r
143          */\r
144         public ResourceEditorActionContributor() {\r
145 \r
146 //              fFindNext= new RetargetTextEditorAction(EditorMessages.getBundleForConstructedKeys(), "Editor.FindNext."); //$NON-NLS-1$\r
147 //              fFindNext.setActionDefinitionId(IWorkbenchActionDefinitionIds.FIND_NEXT);\r
148 //              fFindPrevious= new RetargetTextEditorAction(EditorMessages.getBundleForConstructedKeys(), "Editor.FindPrevious."); //$NON-NLS-1$\r
149 //              fFindPrevious.setActionDefinitionId(IWorkbenchActionDefinitionIds.FIND_PREVIOUS);\r
150 //              fIncrementalFind= new RetargetTextEditorAction(EditorMessages.getBundleForConstructedKeys(), "Editor.FindIncremental."); //$NON-NLS-1$\r
151 //              fIncrementalFind.setActionDefinitionId(IWorkbenchActionDefinitionIds.FIND_INCREMENTAL);\r
152 //              fIncrementalFindReverse= new RetargetTextEditorAction(EditorMessages.getBundleForConstructedKeys(), "Editor.FindIncrementalReverse."); //$NON-NLS-1$\r
153 //              fIncrementalFindReverse.setActionDefinitionId(IWorkbenchActionDefinitionIds.FIND_INCREMENTAL_REVERSE);\r
154 //              fGotoLine= new RetargetTextEditorAction(EditorMessages.getBundleForConstructedKeys(), "Editor.GotoLine."); //$NON-NLS-1$\r
155 //              fGotoLine.setActionDefinitionId(ITextEditorActionDefinitionIds.LINE_GOTO);\r
156 //              fHippieCompletion= new RetargetTextEditorAction(EditorMessages.getBundleForConstructedKeys(), "Editor.HippieCompletion."); //$NON-NLS-1$\r
157 //              fHippieCompletion.setActionDefinitionId(ITextEditorActionDefinitionIds.HIPPIE_COMPLETION);\r
158 \r
159 //              fStatusFields= new HashMap(3);\r
160 //              for (int i= 0; i < STATUS_FIELD_DEFS.length; i++) {\r
161 //                      StatusFieldDef fieldDef= STATUS_FIELD_DEFS[i];\r
162 //                      fStatusFields.put(fieldDef, new StatusLineContributionItem(fieldDef.category, fieldDef.visible, fieldDef.widthInChars));\r
163 //              }\r
164         }\r
165 \r
166         /**\r
167          * Returns the active editor part.\r
168          *\r
169          * @return the active editor part\r
170          */\r
171         protected final IEditorPart getActiveEditorPart() {\r
172                 return activeEditorPart;\r
173         }\r
174 \r
175         /**\r
176          * Returns the action registered with the given text editor.\r
177          *\r
178          * @param editor the editor, or <code>null</code>\r
179          * @param actionId the action id\r
180          * @return the action, or <code>null</code> if none\r
181          */\r
182         protected final IAction getAction(IResourceEditorPart editor, String actionId) {\r
183             return null;\r
184 //              return (editor == null || actionId == null ? null : editor.getAction(actionId));\r
185         }\r
186 \r
187         /**\r
188          * The method installs the global action handlers for the given text editor.\r
189          * <p>\r
190          * This method cannot be overridden by subclasses.</p>\r
191          *\r
192          * @param part the active editor part\r
193          * @since 2.0\r
194          */\r
195         private void doSetActiveEditor(IEditorPart part) {\r
196 \r
197                 if (activeEditorPart == part)\r
198                         return;\r
199 \r
200 //              if (fActiveEditorPart instanceof ITextEditorExtension) {\r
201 //                      ITextEditorExtension extension= (ITextEditorExtension) fActiveEditorPart;\r
202 //                      for (int i= 0; i < STATUS_FIELD_DEFS.length; i++)\r
203 //                              extension.setStatusField(null, STATUS_FIELD_DEFS[i].category);\r
204 //              }\r
205 \r
206                 activeEditorPart= part;\r
207                 IResourceEditorPart editor = (part instanceof IResourceEditorPart) ? (IResourceEditorPart) part : null;\r
208 \r
209                 IActionBars actionBars= getActionBars();\r
210                 for (int i= 0; i < ACTIONS.length; i++)\r
211                         actionBars.setGlobalActionHandler(ACTIONS[i], getAction(editor, ACTIONS[i]));\r
212 \r
213 //              fFindNext.setAction(getAction(editor, ITextEditorActionConstants.FIND_NEXT));\r
214 //              fFindPrevious.setAction(getAction(editor, ITextEditorActionConstants.FIND_PREVIOUS));\r
215 //              fIncrementalFind.setAction(getAction(editor, ITextEditorActionConstants.FIND_INCREMENTAL));\r
216 //              fIncrementalFindReverse.setAction(getAction(editor, ITextEditorActionConstants.FIND_INCREMENTAL_REVERSE));\r
217 //              fGotoLine.setAction(getAction(editor, ITextEditorActionConstants.GOTO_LINE));\r
218 //              fHippieCompletion.setAction(getAction(editor, ITextEditorActionConstants.HIPPIE_COMPLETION));\r
219 //\r
220 //              for (int i= 0; i < STATUS_FIELD_DEFS.length; i++) {\r
221 //                      if (fActiveEditorPart instanceof ITextEditorExtension) {\r
222 //                              StatusLineContributionItem statusField= (StatusLineContributionItem) fStatusFields.get(STATUS_FIELD_DEFS[i]);\r
223 //                              statusField.setActionHandler(getAction(editor, STATUS_FIELD_DEFS[i].actionId));\r
224 //                              ITextEditorExtension extension= (ITextEditorExtension) fActiveEditorPart;\r
225 //                              extension.setStatusField(statusField, STATUS_FIELD_DEFS[i].category);\r
226 //                      }\r
227 //              }\r
228         }\r
229 \r
230         /**\r
231          * The <code>BasicTextEditorActionContributor</code> implementation of this\r
232          * <code>IEditorActionBarContributor</code> method installs the global\r
233          * action handler for the given text editor by calling a private helper\r
234          * method.\r
235          * <p>\r
236          * Subclasses may extend.</p>\r
237          *\r
238          * @param part {@inheritDoc}\r
239          */\r
240         public void setActiveEditor(IEditorPart part) {\r
241                 doSetActiveEditor(part);\r
242         }\r
243 \r
244         /*\r
245          * @see EditorActionBarContributor#contributeToMenu(IMenuManager)\r
246          */\r
247         public void contributeToMenu(IMenuManager menu) {\r
248 \r
249 //              IMenuManager editMenu= menu.findMenuUsingPath(IWorkbenchActionConstants.M_EDIT);\r
250 //              if (editMenu != null) {\r
251 //                      editMenu.prependToGroup(IWorkbenchActionConstants.FIND_EXT, fIncrementalFindReverse);\r
252 //                      editMenu.prependToGroup(IWorkbenchActionConstants.FIND_EXT, fIncrementalFind);\r
253 //                      editMenu.prependToGroup(IWorkbenchActionConstants.FIND_EXT, fFindPrevious);\r
254 //                      editMenu.prependToGroup(IWorkbenchActionConstants.FIND_EXT, fFindNext);\r
255 //\r
256 //                      addOrInsert(editMenu, new Separator(ITextEditorActionConstants.GROUP_OPEN));\r
257 //                      addOrInsert(editMenu, new Separator(ITextEditorActionConstants.GROUP_INFORMATION));\r
258 //                      addOrInsert(editMenu, new Separator(ITextEditorActionConstants.GROUP_ASSIST));\r
259 //                      addOrInsert(editMenu, new Separator(ITextEditorActionConstants.GROUP_GENERATE));\r
260 //                      addOrInsert(editMenu, new Separator(IWorkbenchActionConstants.MB_ADDITIONS));\r
261 //\r
262 //                      editMenu.appendToGroup(ITextEditorActionConstants.GROUP_ASSIST, fHippieCompletion);\r
263 //              }\r
264 //\r
265 //              IMenuManager navigateMenu= menu.findMenuUsingPath(IWorkbenchActionConstants.M_NAVIGATE);\r
266 //              if (navigateMenu != null) {\r
267 //                      navigateMenu.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, fGotoLine);\r
268 //              }\r
269         }\r
270 \r
271         /**\r
272          * The <code>item</code> is {@link IContributionManager#add(IContributionItem) added} to\r
273          * <code>menu</code> if no item with the same id currently exists. If there already is an\r
274          * contribution item with the same id, the new item gets\r
275          * {@link IContributionManager#insertAfter(String, IContributionItem) inserted after} it.\r
276          * \r
277          * @param menu the contribution manager\r
278          * @param item the contribution item\r
279          * @since 3.2\r
280          */\r
281         @SuppressWarnings("unused")\r
282     private void addOrInsert(IContributionManager menu, IContributionItem item) {\r
283             String id= item.getId();\r
284                 if (menu.find(id) == null)\r
285                 menu.add(item);\r
286             else\r
287                 menu.insertAfter(id, item);\r
288     }\r
289 \r
290         /*\r
291          * @see EditorActionBarContributor#contributeToStatusLine(org.eclipse.jface.action.IStatusLineManager)\r
292          * @since 2.0\r
293          */\r
294         public void contributeToStatusLine(IStatusLineManager statusLineManager) {\r
295                 super.contributeToStatusLine(statusLineManager);\r
296 //              for (int i= 0; i < STATUS_FIELD_DEFS.length; i++)\r
297 //                      statusLineManager.add((IContributionItem)fStatusFields.get(STATUS_FIELD_DEFS[i]));\r
298         }\r
299 \r
300         /*\r
301          * @see org.eclipse.ui.IEditorActionBarContributor#dispose()\r
302          * @since 2.0\r
303          */\r
304         public void dispose() {\r
305                 doSetActiveEditor(null);\r
306                 super.dispose();\r
307         }\r
308 }\r