]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.g2d/src/org/simantics/g2d/chassis/SWTChassis.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / chassis / SWTChassis.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.g2d.chassis;\r
13 \r
14 import java.awt.Component;\r
15 \r
16 import org.eclipse.swt.graphics.Color;\r
17 import org.eclipse.swt.widgets.Composite;\r
18 import org.eclipse.swt.widgets.Display;\r
19 import org.eclipse.ui.IEditorPart;\r
20 import org.eclipse.ui.IWorkbenchPage;\r
21 import org.eclipse.ui.IWorkbenchWindow;\r
22 import org.simantics.g2d.canvas.ICanvasContext;\r
23 import org.simantics.g2d.event.adapter.SWTFocusAdapter;\r
24 import org.simantics.g2d.event.adapter.SWTKeyEventAdapter;\r
25 import org.simantics.g2d.event.adapter.SWTMouseEventAdapter;\r
26 import org.simantics.utils.datastructures.hints.IHintContext;\r
27 import org.simantics.utils.datastructures.hints.IHintContext.Key;\r
28 import org.simantics.utils.datastructures.hints.IHintContext.KeyOf;\r
29 import org.simantics.utils.threads.IThreadWorkQueue;\r
30 import org.simantics.utils.ui.SWTAWTComponent;\r
31 \r
32 /**\r
33  * SWT Composite based chassis\r
34  * \r
35  * User must invoke CompositeChassis.syncPopulate() after constructions.\r
36  * \r
37  * @author Toni Kalajainen\r
38  */\r
39 public class SWTChassis extends SWTAWTComponent implements ICanvasChassis {\r
40 \r
41     protected AWTChassis                                                        component;\r
42     protected SWTMouseEventAdapter                                      mouseAdapter;\r
43     protected SWTKeyEventAdapter                                        keyAdapter;\r
44     protected SWTFocusAdapter                                           focusAdapter;\r
45 \r
46     /**\r
47      * Tells the Composite where the canvas is installed.\r
48      */\r
49     public static final Key KEY_SWT_COMPOSITE = new KeyOf(Composite.class, "SWT_COMPOSITE");\r
50 \r
51     public static final Key KEY_SWT_DISPLAY = new KeyOf(Display.class, "SWT_DISPLAY");\r
52 \r
53     public static final Key KEY_WORKBENCHWINDOW = new KeyOf(IWorkbenchWindow.class, "WORKBENCH_WINDOW");\r
54     public static final Key KEY_WORKBENCHPAGE = new KeyOf(IWorkbenchPage.class, "WORKBENCH_PAGE");\r
55     public static final Key KEY_EDITORPART = new KeyOf(IEditorPart.class, "EDITORPART");\r
56 \r
57     public SWTChassis(Composite parent, int style) {\r
58         super(parent, style);\r
59     }\r
60 \r
61     @Override\r
62     protected void doDispose() {\r
63         if (component!=null)\r
64             component.fireChassisClosed();\r
65         super.doDispose();\r
66     }\r
67 \r
68     @Override\r
69     protected Component createSwingComponent() {\r
70         component = new AWTChassis(false);\r
71         return component;\r
72     }\r
73 \r
74     /**\r
75      * Run in SWT thread.\r
76      * \r
77      * @param canvasContext new ICanvasContext to add or null to remove\r
78      */\r
79     @Override\r
80     public void setCanvasContext(ICanvasContext canvasContext) {\r
81         assert component != null;\r
82 \r
83         // Unhook old context\r
84         if (component.canvasContext!=null) {\r
85             if (component.hintCtx != null) {\r
86                 component.hintCtx.removeHint( KEY_SWT_COMPOSITE );\r
87                 component.hintCtx.removeHint( KEY_SWT_DISPLAY );\r
88             }\r
89             // keyAdapter, mouseAdapter and focusAdapter may be null if\r
90             // the underlying AWTChassis has already had its CanvasContext set\r
91             // through other means than this method.\r
92             if (keyAdapter != null) {\r
93                 removeKeyListener(keyAdapter);\r
94                 removeMouseWheelListener(mouseAdapter);\r
95                 removeMouseMoveListener(mouseAdapter);\r
96                 removeMouseTrackListener(mouseAdapter);\r
97                 removeMouseListener(mouseAdapter);\r
98                 removeFocusListener(focusAdapter);\r
99             }\r
100         }\r
101         component.setCanvasContext(canvasContext);\r
102         // Hook new context\r
103         if (canvasContext!=null) {\r
104             if (component.hintCtx != null) {\r
105                 component.hintCtx.setHint( KEY_SWT_COMPOSITE, this);\r
106                 component.hintCtx.setHint( KEY_SWT_DISPLAY, this.getDisplay());\r
107             }\r
108             mouseAdapter = new SWTMouseEventAdapter(canvasContext, canvasContext.getEventQueue());\r
109             keyAdapter = new SWTKeyEventAdapter(canvasContext, canvasContext.getEventQueue());\r
110             focusAdapter = new SWTFocusAdapter(canvasContext, canvasContext.getEventQueue());\r
111             addKeyListener(keyAdapter);\r
112             addMouseWheelListener(mouseAdapter);\r
113             addMouseMoveListener(mouseAdapter);\r
114             addMouseTrackListener(mouseAdapter);\r
115             addMouseListener(mouseAdapter);\r
116             addFocusListener(focusAdapter);\r
117         }\r
118     }\r
119 \r
120     @Override\r
121     public AWTChassis getAWTComponent() {\r
122         return component;\r
123     }\r
124 \r
125     @Override\r
126     public ICanvasContext getCanvasContext() {\r
127         return component.canvasContext;\r
128     }\r
129 \r
130     @Override\r
131     public void addChassisListener(IThreadWorkQueue thread, IChassisListener listener) {\r
132         component.addChassisListener(thread, listener);\r
133     }\r
134 \r
135     @Override\r
136     public void removeChassisListener(IThreadWorkQueue thread, IChassisListener listener) {\r
137         component.removeChassisListener(thread, listener);\r
138     }\r
139 \r
140     @Override\r
141     public void addChassisListener(IChassisListener listener) {\r
142         component.addChassisListener(listener);\r
143     }\r
144 \r
145     @Override\r
146     public void removeChassisListener(IChassisListener listener) {\r
147         component.removeChassisListener(listener);\r
148     }\r
149 \r
150     @Override\r
151     public IHintContext getHintContext() {\r
152         return component.hintCtx;\r
153     }\r
154 \r
155     @Override\r
156     public void setBackground(Color color) {\r
157         super.setBackground(color);\r
158         if (component != null) {\r
159             java.awt.Color awtColor = null;\r
160             if (color != null)\r
161                 awtColor = new java.awt.Color(color.getRed(), color.getGreen(), color.getBlue());\r
162             component.setBackground(awtColor);\r
163         }\r
164     }\r
165 \r
166 }\r