]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/DiagramViewerActionContributor.java
Sync git svn branch with SVN repository r33406.
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / diagramEditor / DiagramViewerActionContributor.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.modeling.ui.diagramEditor;\r
13 \r
14 import org.eclipse.jface.action.Action;\r
15 import org.eclipse.jface.action.ActionContributionItem;\r
16 import org.eclipse.jface.action.IContributionItem;\r
17 import org.eclipse.jface.action.ICoolBarManager;\r
18 import org.eclipse.jface.action.IToolBarManager;\r
19 import org.eclipse.jface.action.ToolBarContributionItem;\r
20 import org.eclipse.swt.widgets.Display;\r
21 import org.eclipse.ui.IEditorPart;\r
22 import org.eclipse.ui.IPartListener2;\r
23 import org.eclipse.ui.IWorkbenchPart;\r
24 import org.eclipse.ui.IWorkbenchPartReference;\r
25 import org.eclipse.ui.part.EditorActionBarContributor;\r
26 import org.simantics.g2d.canvas.Hints;\r
27 import org.simantics.g2d.canvas.ICanvasContext;\r
28 import org.simantics.g2d.canvas.IToolMode;\r
29 import org.simantics.modeling.ui.Activator;\r
30 import org.simantics.utils.datastructures.hints.HintListenerAdapter;\r
31 import org.simantics.utils.datastructures.hints.IHintContext.Key;\r
32 import org.simantics.utils.datastructures.hints.IHintListener;\r
33 import org.simantics.utils.datastructures.hints.IHintObservable;\r
34 import org.simantics.utils.threads.ThreadUtils;\r
35 \r
36 /**\r
37  * @author Tuukka Lehtonen\r
38  */\r
39 public class DiagramViewerActionContributor extends EditorActionBarContributor {\r
40 \r
41     private static final boolean DEBUG = false;\r
42 \r
43     private IEditorPart    activePart;\r
44     private Display        display;\r
45 \r
46     private ICanvasContext currentContext;\r
47 \r
48     ModeAction             pointerAction;\r
49     ModeAction             connectAction;\r
50     IContributionItem      pointerItem;\r
51     IContributionItem      connectItem;\r
52     protected IToolBarManager        mgr;\r
53 \r
54     IPartListener2 partListener = new IPartListener2() {\r
55         @Override\r
56         public void partVisible(IWorkbenchPartReference partRef) {\r
57         }\r
58         @Override\r
59         public void partOpened(IWorkbenchPartReference partRef) {\r
60         }\r
61         @Override\r
62         public void partInputChanged(IWorkbenchPartReference partRef) {\r
63         }\r
64         @Override\r
65         public void partHidden(IWorkbenchPartReference partRef) {\r
66         }\r
67         @Override\r
68         public void partDeactivated(IWorkbenchPartReference partRef) {\r
69             IWorkbenchPart part = partRef.getPart(false);\r
70             if (part == activePart) {\r
71                 setActiveEditor(null);\r
72             }\r
73         }\r
74         @Override\r
75         public void partClosed(IWorkbenchPartReference partRef) {\r
76         }\r
77         @Override\r
78         public void partBroughtToTop(IWorkbenchPartReference partRef) {\r
79         }\r
80         @Override\r
81         public void partActivated(IWorkbenchPartReference partRef) {\r
82         }\r
83     };\r
84 \r
85     @Override\r
86     public void contributeToCoolBar(ICoolBarManager coolBarManager) {\r
87         IContributionItem item = coolBarManager.find("org.simantics.modeling.ui.diagramtoolbar");\r
88         if (item instanceof ToolBarContributionItem)\r
89             mgr = ((ToolBarContributionItem) item).getToolBarManager();\r
90         if (mgr == null)\r
91             return;\r
92 \r
93         pointerAction = new ModeAction("org.simantics.modeling.ui.pointerMode", Hints.POINTERTOOL);\r
94         pointerAction.setText("Pointer Mode");\r
95         pointerAction.setImageDescriptor(Activator.POINTER_MODE);\r
96         connectAction = new ModeAction("org.simantics.modeling.ui.connectMode", Hints.CONNECTTOOL);\r
97         connectAction.setText("Connect Mode");\r
98         connectAction.setImageDescriptor(Activator.CONNECT_MODE);\r
99 \r
100         pointerItem = new ActionContributionItem(pointerAction);\r
101         connectItem = new ActionContributionItem(connectAction);\r
102 \r
103         mgr.appendToGroup("tool.additions", pointerItem);\r
104         mgr.appendToGroup("tool.additions", connectItem);\r
105         mgr.markDirty();\r
106 \r
107         getPage().addPartListener(partListener);\r
108     }\r
109 \r
110     @Override\r
111     public void dispose() {\r
112         getPage().removePartListener(partListener);\r
113 \r
114         if (mgr != null) {\r
115             mgr.remove(connectItem);\r
116             mgr.remove(pointerItem);\r
117             connectItem.dispose();\r
118             pointerItem.dispose();\r
119             mgr.markDirty();\r
120             mgr.update(true);\r
121             if (activePart != null) {\r
122                 activePart.getEditorSite().getActionBars().updateActionBars();\r
123                 activePart = null;\r
124             }\r
125         }\r
126         setContext(null, null);\r
127         super.dispose();\r
128         setContext(null, null);\r
129         activePart = null;\r
130     }\r
131 \r
132     public void setActiveEditor(IEditorPart part) {\r
133         if (DEBUG)\r
134             System.out.println("setActiveEditor: " + part);\r
135         if (part == activePart)\r
136             return;\r
137 \r
138         this.activePart = part;\r
139         if (part != null) {\r
140             this.display = part.getSite().getShell().getDisplay();\r
141         }\r
142 \r
143         ICanvasContext ctx = part != null ? (ICanvasContext) part.getAdapter(ICanvasContext.class) : null;\r
144         setContext(part, ctx);\r
145     }\r
146 \r
147     private void setContext(IEditorPart part, ICanvasContext context) {\r
148         if (DEBUG)\r
149             System.out.println("setContext: " + part + "\nNEW CONTEXT: " + context + "\nPREVIOUS CONTEXT: " + currentContext);\r
150 \r
151         ICanvasContext previous = currentContext;\r
152         currentContext = context;\r
153         if (previous != context) {\r
154             if (previous != null && !previous.isDisposed())\r
155                 previous.getHintStack().removeKeyHintListener(Hints.KEY_TOOL, TOOL_LISTENER);\r
156             if (context != null && !context.isDisposed())\r
157                 context.getHintStack().addKeyHintListener(Hints.KEY_TOOL, TOOL_LISTENER);\r
158         }\r
159 \r
160         if (part != null && context != null && !context.isDisposed())\r
161             updateActionBars(part, (IToolMode) context.getHintStack().getHint(Hints.KEY_TOOL));\r
162         else\r
163             updateActionBars(null, null);\r
164     }\r
165 \r
166     private void updateActionBars(IEditorPart part, IToolMode toolMode) {\r
167         if (DEBUG)\r
168             System.out.println("updateActionBars: " + part + ", " + toolMode);\r
169         updateToolMode(toolMode);\r
170         if (part != null)\r
171             part.getEditorSite().getActionBars().updateActionBars();\r
172     }\r
173 \r
174     private void updateToolMode(IToolMode toolMode) {\r
175         if (DEBUG)\r
176             System.out.println("updateToolMode: " + toolMode);\r
177         if (toolMode != null) {\r
178             pointerAction.setEnabled(true);\r
179             connectAction.setEnabled(true);\r
180             if (toolMode == Hints.POINTERTOOL) {\r
181                 pointerAction.setChecked(true);\r
182                 connectAction.setChecked(false);\r
183             } else if (toolMode == Hints.CONNECTTOOL) {\r
184                 pointerAction.setChecked(false);\r
185                 connectAction.setChecked(true);\r
186             }\r
187         } else {\r
188             pointerAction.setEnabled(false);\r
189             connectAction.setEnabled(false);\r
190         }\r
191     }\r
192 \r
193     IHintListener TOOL_LISTENER = new HintListenerAdapter() {\r
194         @Override\r
195         public void hintChanged(IHintObservable sender, Key key, Object oldValue, Object newValue) {\r
196             final IToolMode mode = (IToolMode) newValue;\r
197             final IEditorPart part = activePart;\r
198             display.asyncExec(new Runnable() {\r
199                 @Override\r
200                 public void run() {\r
201                     if (display.isDisposed())\r
202                         return;\r
203                     if (activePart != part)\r
204                         return;\r
205                     updateActionBars(part, mode);\r
206                 }\r
207             });\r
208         }\r
209     };\r
210 \r
211     public class ModeAction extends Action {\r
212 \r
213         private IToolMode targetMode;\r
214 \r
215         public ModeAction(String id, IToolMode targetMode) {\r
216             super(id, Action.AS_RADIO_BUTTON);\r
217             this.targetMode = targetMode;\r
218         }\r
219 \r
220         @Override\r
221         public void run() {\r
222             final ICanvasContext context = currentContext;\r
223             if (context == null)\r
224                 return;\r
225 \r
226             final IEditorPart part = activePart;\r
227             if (part == null)\r
228                 return;\r
229 \r
230             if (context.isDisposed())\r
231                 return;\r
232 \r
233             ThreadUtils.asyncExec(context.getThreadAccess(), new Runnable() {\r
234                 @Override\r
235                 public void run() {\r
236                     if (context.isDisposed())\r
237                         return;\r
238                     IToolMode toolMode = context.getHintStack().getHint(Hints.KEY_TOOL);\r
239                     if (!targetMode.equals(toolMode)) {\r
240                         if (DEBUG)\r
241                             System.out.println("changing tool mode to " + targetMode.getId());\r
242                         context.getDefaultHintContext().setHint(Hints.KEY_TOOL, targetMode);\r
243                     }\r
244                 }\r
245             });\r
246         }\r
247 \r
248     }\r
249 \r
250 }\r