blob: 5d62af8d218c0b6642affb586f320ffe3237ad89 [file] [log] [blame]
kchong38cbf172006-03-29 03:38:21 +00001/*******************************************************************************
kchong8e296ca2009-01-21 00:09:54 +00002 * Copyright (c) 2001, 2009 IBM Corporation and others.
kchong38cbf172006-03-29 03:38:21 +00003 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
kchong2be71b32006-04-11 16:32:03 +000011package org.eclipse.wst.xsd.ui.internal.editor;
kchong38cbf172006-03-29 03:38:21 +000012
kchong6e0ae092006-05-09 02:44:20 +000013import java.util.ArrayList;
kchong38cbf172006-03-29 03:38:21 +000014import java.util.Iterator;
15import java.util.List;
16
17import org.eclipse.gef.editparts.ZoomManager;
18import org.eclipse.gef.ui.actions.ActionRegistry;
kchong6e0ae092006-05-09 02:44:20 +000019import org.eclipse.gef.ui.actions.GEFActionConstants;
kchong38cbf172006-03-29 03:38:21 +000020import org.eclipse.gef.ui.actions.ZoomComboContributionItem;
21import org.eclipse.gef.ui.actions.ZoomInRetargetAction;
22import org.eclipse.gef.ui.actions.ZoomOutRetargetAction;
kchong66e32b72007-02-26 20:28:43 +000023import org.eclipse.jface.action.Action;
kchong38cbf172006-03-29 03:38:21 +000024import org.eclipse.jface.action.IAction;
25import org.eclipse.jface.action.IMenuManager;
26import org.eclipse.jface.action.IToolBarManager;
27import org.eclipse.jface.action.MenuManager;
28import org.eclipse.jface.action.Separator;
29import org.eclipse.ui.IActionBars;
kchong6e0ae092006-05-09 02:44:20 +000030import org.eclipse.ui.IEditorActionBarContributor;
kchong38cbf172006-03-29 03:38:21 +000031import org.eclipse.ui.IEditorPart;
csalter143154d2006-07-06 05:55:09 +000032import org.eclipse.ui.IEditorSite;
kchong38cbf172006-03-29 03:38:21 +000033import org.eclipse.ui.IWorkbenchActionConstants;
kchong6e0ae092006-05-09 02:44:20 +000034import org.eclipse.ui.IWorkbenchPage;
csalter143154d2006-07-06 05:55:09 +000035import org.eclipse.ui.IWorkbenchPartSite;
kchong38cbf172006-03-29 03:38:21 +000036import org.eclipse.ui.actions.ActionFactory;
kchong6e0ae092006-05-09 02:44:20 +000037import org.eclipse.ui.actions.RetargetAction;
kchong38cbf172006-03-29 03:38:21 +000038import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
39import org.eclipse.ui.part.MultiPageEditorPart;
40import org.eclipse.ui.texteditor.ITextEditor;
csalter143154d2006-07-06 05:55:09 +000041import org.eclipse.ui.texteditor.ITextEditorActionConstants;
kchong6e0ae092006-05-09 02:44:20 +000042import org.eclipse.wst.sse.ui.internal.ISourceViewerActionBarContributor;
kchong2be71b32006-04-11 16:32:03 +000043import org.eclipse.wst.xsd.ui.internal.actions.IXSDToolbarAction;
kchong66e32b72007-02-26 20:28:43 +000044import org.eclipse.wst.xsd.ui.internal.adt.actions.CaptureScreenAction;
kchong6e0ae092006-05-09 02:44:20 +000045import org.eclipse.wst.xsd.ui.internal.adt.actions.DeleteAction;
kchong38cbf172006-03-29 03:38:21 +000046
47/**
48 * Manages the installation/deinstallation of global actions for multi-page
49 * editors. Responsible for the redirection of global actions to the active
50 * editor. Multi-page contributor replaces the contributors for the individual
51 * editors in the multi-page editor.
52 */
53public class XSDMultiPageEditorContributor extends MultiPageEditorActionBarContributor
54{
55 private IEditorPart activeEditorPart;
kchong6e0ae092006-05-09 02:44:20 +000056 private InternalXSDMultiPageEditor xsdEditor;
57 protected ITextEditor textEditor;
58 protected IEditorActionBarContributor sourceViewerActionContributor = null;
59 protected List fPartListeners= new ArrayList();
60 ZoomInRetargetAction zoomInRetargetAction;
61 ZoomOutRetargetAction zoomOutRetargetAction;
kchong66e32b72007-02-26 20:28:43 +000062 Action captureScreenAction;
kchong6e0ae092006-05-09 02:44:20 +000063 ZoomComboContributionItem zoomComboContributionItem;
kchong38cbf172006-03-29 03:38:21 +000064 /**
65 * Creates a multi-page contributor.
66 */
67 public XSDMultiPageEditorContributor()
68 {
69 super();
kchong6e0ae092006-05-09 02:44:20 +000070 sourceViewerActionContributor = new SourcePageActionContributor();
71 zoomInRetargetAction = new ZoomInRetargetAction();
kchongbce9e9a2008-04-03 20:05:18 +000072 zoomInRetargetAction.setImageDescriptor(XSDEditorPlugin.getImageDescriptor("icons/etool16/zoomplus.gif"));
kchong6e0ae092006-05-09 02:44:20 +000073 zoomOutRetargetAction = new ZoomOutRetargetAction();
kchongbce9e9a2008-04-03 20:05:18 +000074 zoomOutRetargetAction.setImageDescriptor(XSDEditorPlugin.getImageDescriptor("icons/etool16/zoomminus.gif"));
kchong66e32b72007-02-26 20:28:43 +000075 captureScreenAction = new CaptureScreenAction();
kchong6e0ae092006-05-09 02:44:20 +000076 fPartListeners.add(zoomInRetargetAction);
77 fPartListeners.add(zoomOutRetargetAction);
kchong38cbf172006-03-29 03:38:21 +000078 }
79
80 /**
81 * Returns the action registed with the given text editor.
82 *
83 * @return IAction or null if editor is null.
84 */
85 protected IAction getAction(ITextEditor editor, String actionID)
86 {
87 return (editor == null ? null : editor.getAction(actionID));
88 }
89
90 /*
91 * (non-JavaDoc) Method declared in
92 * AbstractMultiPageEditorActionBarContributor.
93 */
94
95 public void setActivePage(IEditorPart part)
96 {
97 if (activeEditorPart == part)
98 return;
99
100 activeEditorPart = part;
101
102 IActionBars actionBars = getActionBars();
kchong6e0ae092006-05-09 02:44:20 +0000103 boolean isSource = false;
104
105 if (activeEditorPart != null && activeEditorPart instanceof ITextEditor)
kchong38cbf172006-03-29 03:38:21 +0000106 {
kchong6e0ae092006-05-09 02:44:20 +0000107 isSource = true;
108 zoomInRetargetAction.setEnabled(false);
109 zoomOutRetargetAction.setEnabled(false);
kchong62b5f1e2007-03-07 20:32:52 +0000110 captureScreenAction.setEnabled(false);
kchong6e0ae092006-05-09 02:44:20 +0000111 activateSourcePage(activeEditorPart, true);
112 }
113 else
114 {
115 activateSourcePage(xsdEditor, false);
116 if (part instanceof InternalXSDMultiPageEditor)
kchong38cbf172006-03-29 03:38:21 +0000117 {
kchong6e0ae092006-05-09 02:44:20 +0000118 xsdEditor = (InternalXSDMultiPageEditor) part;
119 }
120 if (xsdEditor != null)
csalter143154d2006-07-06 05:55:09 +0000121 {
122 // cs: here's we ensure the UNDO and REDO actions are available when
123 // the design view is active
124 IWorkbenchPartSite site = xsdEditor.getSite();
125 if (site instanceof IEditorSite)
126 {
127 ITextEditor textEditor = xsdEditor.getTextEditor();
128 IActionBars siteActionBars = ((IEditorSite) site).getActionBars();
129 siteActionBars.setGlobalActionHandler(ITextEditorActionConstants.UNDO, getAction(textEditor, ITextEditorActionConstants.UNDO));
130 siteActionBars.setGlobalActionHandler(ITextEditorActionConstants.REDO, getAction(textEditor, ITextEditorActionConstants.REDO));
131 siteActionBars.updateActionBars();
132 }
133
kchong6e0ae092006-05-09 02:44:20 +0000134 Object adapter = xsdEditor.getAdapter(ActionRegistry.class);
135 if (adapter instanceof ActionRegistry)
136 {
137 ActionRegistry registry = (ActionRegistry) adapter;
138 actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), registry.getAction(DeleteAction.ID));
139 actionBars.setGlobalActionHandler(GEFActionConstants.ZOOM_IN, registry.getAction(GEFActionConstants.ZOOM_IN));
140 actionBars.setGlobalActionHandler(GEFActionConstants.ZOOM_OUT, registry.getAction(GEFActionConstants.ZOOM_OUT));
kchongc9c08cb2006-07-19 19:11:27 +0000141 actionBars.setGlobalActionHandler(ActionFactory.PRINT.getId(), registry.getAction(ActionFactory.PRINT.getId()));
kchong8e296ca2009-01-21 00:09:54 +0000142 actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), registry.getAction(ActionFactory.SELECT_ALL.getId()));
kchong6e0ae092006-05-09 02:44:20 +0000143 zoomInRetargetAction.setEnabled(true);
144 zoomOutRetargetAction.setEnabled(true);
kchong62b5f1e2007-03-07 20:32:52 +0000145 captureScreenAction.setEnabled(true);
kchong6e0ae092006-05-09 02:44:20 +0000146 }
kchong38cbf172006-03-29 03:38:21 +0000147 }
148 }
149
kchong6e0ae092006-05-09 02:44:20 +0000150 if (actionBars != null) {
151 // update menu bar and tool bar
kchong38cbf172006-03-29 03:38:21 +0000152 actionBars.updateActionBars();
153 }
kchong6e0ae092006-05-09 02:44:20 +0000154
155 if (zoomComboContributionItem != null)
156 {
157 zoomComboContributionItem.setVisible(!isSource);
158 zoomComboContributionItem.update();
kchong6673ee22008-11-20 05:50:50 +0000159 // Bug 254772 - parent contribution manager should not be null. We added this item already.
160 // Force the ToolBarManager to update/redraw the items
161 zoomComboContributionItem.getParent().update(true);
kchong6e0ae092006-05-09 02:44:20 +0000162 }
163 }
164
165 protected void activateSourcePage(IEditorPart activeEditor, boolean state)
166 {
167 if (sourceViewerActionContributor != null && sourceViewerActionContributor instanceof ISourceViewerActionBarContributor)
168 {
169 sourceViewerActionContributor.setActiveEditor(activeEditor);
170 ((ISourceViewerActionBarContributor) sourceViewerActionContributor).setViewerSpecificContributionsEnabled(state);
171 }
kchong38cbf172006-03-29 03:38:21 +0000172 }
173
174 public void setActiveEditor(IEditorPart part)
175 {
176 IEditorPart activeNestedEditor = null;
177 if (part instanceof MultiPageEditorPart)
178 {
kchong3fab7d52006-04-19 19:16:06 +0000179 activeNestedEditor = part;
kchong38cbf172006-03-29 03:38:21 +0000180 }
181 setActivePage(activeNestedEditor);
kchong6e0ae092006-05-09 02:44:20 +0000182
183 if (part instanceof InternalXSDMultiPageEditor)
184 {
185 xsdEditor = (InternalXSDMultiPageEditor) part;
186
187 textEditor = xsdEditor.getTextEditor();
188 if (textEditor != null)
189 {
190// updateActions();
191 getActionBars().updateActionBars();
192 }
193 }
194
kchong38cbf172006-03-29 03:38:21 +0000195 List list = XSDEditorPlugin.getPlugin().getXSDEditorConfiguration().getToolbarActions();
196 for (Iterator i = list.iterator(); i.hasNext(); )
197 {
198 ((IXSDToolbarAction)i.next()).setEditorPart(activeNestedEditor);
199 }
kchong6e0ae092006-05-09 02:44:20 +0000200
201 super.setActiveEditor(part);
kchong38cbf172006-03-29 03:38:21 +0000202 }
203
204 public void contributeToMenu(IMenuManager manager)
205 {
kchong618a1942006-04-13 07:14:23 +0000206 IMenuManager menu = new MenuManager(Messages._UI_MENU_XSD_EDITOR);
kchong38cbf172006-03-29 03:38:21 +0000207 manager.prependToGroup(IWorkbenchActionConstants.MB_ADDITIONS, menu);
208
209 // Add extension menu actions
210 List list = XSDEditorPlugin.getPlugin().getXSDEditorConfiguration().getToolbarActions();
211 for (Iterator i = list.iterator(); i.hasNext(); )
212 {
213 menu.add((IXSDToolbarAction)i.next());
214 }
215
kchong6e0ae092006-05-09 02:44:20 +0000216 menu.add(zoomInRetargetAction);
217 menu.add(zoomOutRetargetAction);
kchong62b5f1e2007-03-07 20:32:52 +0000218 menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
kchong66e32b72007-02-26 20:28:43 +0000219 menu.add(captureScreenAction);
kchong38cbf172006-03-29 03:38:21 +0000220
221 menu.updateAll(true);
222 }
223
224 public void contributeToToolBar(IToolBarManager manager)
225 {
226 manager.add(new Separator());
227 // Add extension toolbar actions
228 List list = XSDEditorPlugin.getPlugin().getXSDEditorConfiguration().getToolbarActions();
229 for (Iterator i = list.iterator(); i.hasNext(); )
230 {
231 manager.add((IXSDToolbarAction)i.next());
232 }
233
234 manager.add(new Separator());
235 String[] zoomStrings = new String[] { ZoomManager.FIT_ALL, ZoomManager.FIT_HEIGHT, ZoomManager.FIT_WIDTH };
kchong6e0ae092006-05-09 02:44:20 +0000236 zoomComboContributionItem = new ZoomComboContributionItem(getPage(), zoomStrings);
237 manager.add(zoomComboContributionItem);
kchong66e32b72007-02-26 20:28:43 +0000238 manager.add(captureScreenAction);
kchong38cbf172006-03-29 03:38:21 +0000239 }
kchong6e0ae092006-05-09 02:44:20 +0000240
241
242 public void init(IActionBars bars, IWorkbenchPage page)
243 {
244 Iterator e = fPartListeners.iterator();
245 while (e.hasNext())
246 {
247 page.addPartListener((RetargetAction) e.next());
248 }
249
250 initSourceViewerActionContributor(bars);
251
252 super.init(bars, page);
253 }
254
255
256 protected void initSourceViewerActionContributor(IActionBars actionBars) {
257 if (sourceViewerActionContributor != null)
258 sourceViewerActionContributor.init(actionBars, getPage());
259 }
260
261 public void dispose()
262 {
263 fPartListeners = null;
264 if (sourceViewerActionContributor != null)
265 sourceViewerActionContributor.dispose();
266 super.dispose();
267 }
268
kchong38cbf172006-03-29 03:38:21 +0000269}