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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.ui.workbench;
\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
31 * Manages the installation and removal of global actions for
\r
32 * the same type of editors.
\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
38 * Subclasses may override the following methods:
\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
46 * @see org.eclipse.ui.texteditor.ITextEditorActionConstants
\r
48 public class ResourceEditorActionContributor extends EditorActionBarContributor {
\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
67 * Status field definition.
\r
70 @SuppressWarnings("unused")
\r
71 private static class StatusFieldDef {
\r
73 private String category;
\r
74 private String actionId;
\r
75 private boolean visible;
\r
76 private int widthInChars;
\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
88 * The status fields to be set to the editor
\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
99 * The active editor part.
\r
101 private IEditorPart activeEditorPart;
\r
103 * The find next action.
\r
106 // private RetargetTextEditorAction fFindNext;
\r
108 * The find previous action.
\r
111 // private RetargetTextEditorAction fFindPrevious;
\r
113 * The incremental find action.
\r
116 // private RetargetTextEditorAction fIncrementalFind;
\r
118 * The reverse incremental find action.
\r
121 // private RetargetTextEditorAction fIncrementalFindReverse;
\r
123 * The go to line action.
\r
125 // private RetargetTextEditorAction fGotoLine;
\r
127 * The word completion action.
\r
130 // private RetargetTextEditorAction fHippieCompletion;
\r
132 * The map of status fields.
\r
135 // private Map fStatusFields;
\r
139 * Creates an empty editor action bar contributor. The action bars are
\r
140 * furnished later via the <code>init</code> method.
\r
142 * @see org.eclipse.ui.IEditorActionBarContributor#init(org.eclipse.ui.IActionBars, org.eclipse.ui.IWorkbenchPage)
\r
144 public ResourceEditorActionContributor() {
\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
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
167 * Returns the active editor part.
\r
169 * @return the active editor part
\r
171 protected final IEditorPart getActiveEditorPart() {
\r
172 return activeEditorPart;
\r
176 * Returns the action registered with the given text editor.
\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
182 protected final IAction getAction(IResourceEditorPart editor, String actionId) {
\r
184 // return (editor == null || actionId == null ? null : editor.getAction(actionId));
\r
188 * The method installs the global action handlers for the given text editor.
\r
190 * This method cannot be overridden by subclasses.</p>
\r
192 * @param part the active editor part
\r
195 private void doSetActiveEditor(IEditorPart part) {
\r
197 if (activeEditorPart == part)
\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
206 activeEditorPart= part;
\r
207 IResourceEditorPart editor = (part instanceof IResourceEditorPart) ? (IResourceEditorPart) part : null;
\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
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
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
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
236 * Subclasses may extend.</p>
\r
238 * @param part {@inheritDoc}
\r
240 public void setActiveEditor(IEditorPart part) {
\r
241 doSetActiveEditor(part);
\r
245 * @see EditorActionBarContributor#contributeToMenu(IMenuManager)
\r
247 public void contributeToMenu(IMenuManager menu) {
\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
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
262 // editMenu.appendToGroup(ITextEditorActionConstants.GROUP_ASSIST, fHippieCompletion);
\r
265 // IMenuManager navigateMenu= menu.findMenuUsingPath(IWorkbenchActionConstants.M_NAVIGATE);
\r
266 // if (navigateMenu != null) {
\r
267 // navigateMenu.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, fGotoLine);
\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
277 * @param menu the contribution manager
\r
278 * @param item the contribution item
\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
287 menu.insertAfter(id, item);
\r
291 * @see EditorActionBarContributor#contributeToStatusLine(org.eclipse.jface.action.IStatusLineManager)
\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
301 * @see org.eclipse.ui.IEditorActionBarContributor#dispose()
\r
304 public void dispose() {
\r
305 doSetActiveEditor(null);
\r