]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scenegraph/testcases/org/simantics/scenegraph/tests/TestRouteGraphNodeApplet.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scenegraph / testcases / org / simantics / scenegraph / tests / TestRouteGraphNodeApplet.java
1 package org.simantics.scenegraph.tests;\r
2 import java.awt.AWTEvent;\r
3 import java.awt.BasicStroke;\r
4 import java.awt.Color;\r
5 import java.awt.Graphics;\r
6 import java.awt.Graphics2D;\r
7 import java.awt.Stroke;\r
8 import java.awt.event.ComponentEvent;\r
9 import java.awt.event.FocusEvent;\r
10 import java.awt.event.KeyEvent;\r
11 import java.awt.event.MouseEvent;\r
12 import java.awt.event.MouseWheelEvent;\r
13 import java.awt.geom.AffineTransform;\r
14 import java.awt.image.VolatileImage;\r
15 import java.util.Timer;\r
16 import java.util.TimerTask;\r
17 \r
18 import javax.swing.JApplet;\r
19 \r
20 import org.simantics.diagram.connection.RouteGraph;\r
21 import org.simantics.diagram.connection.RouteLine;\r
22 import org.simantics.diagram.connection.RouteTerminal;\r
23 import org.simantics.diagram.connection.rendering.BasicConnectionStyle;\r
24 import org.simantics.diagram.connection.rendering.StyledRouteGraphRenderer;\r
25 import org.simantics.diagram.connection.rendering.arrows.ILineEndStyle;\r
26 import org.simantics.diagram.connection.rendering.arrows.PlainExampleLineEndStyle;\r
27 import org.simantics.scenegraph.g2d.G2DFocusManager;\r
28 import org.simantics.scenegraph.g2d.G2DParentNode;\r
29 import org.simantics.scenegraph.g2d.G2DSceneGraph;\r
30 import org.simantics.scenegraph.g2d.events.EventDelegator;\r
31 import org.simantics.scenegraph.g2d.nodes.NavigationNode;\r
32 import org.simantics.scenegraph.g2d.nodes.connection.IRouteGraphListener;\r
33 import org.simantics.scenegraph.g2d.nodes.connection.RouteGraphChangeEvent;\r
34 import org.simantics.scenegraph.g2d.nodes.connection.RouteGraphNode;\r
35 \r
36 \r
37 /**\r
38  * @author Tuukka Lehtonen\r
39  */\r
40 public class TestRouteGraphNodeApplet extends JApplet implements Runnable {\r
41 \r
42     private static final long serialVersionUID = -2097427018689455381L;\r
43 \r
44     private static final int FPS = 60;\r
45 \r
46     protected VolatileImage backbuffer = null;\r
47     protected boolean interrupted = false;\r
48 \r
49     Color LINE_COLOR1 = Color.RED;\r
50     Color LINE_COLOR2 = Color.GREEN;\r
51     Stroke LINE_STROKE = new BasicStroke(1, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_BEVEL);\r
52     Stroke ROUTE_LINE_STROKE = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);\r
53 \r
54     G2DSceneGraph sg;\r
55     RouteGraph rg;\r
56     RouteGraphNode rgn;\r
57     BasicConnectionStyle style = new BasicConnectionStyle(LINE_COLOR1, Color.BLACK, 3.0, LINE_STROKE, ROUTE_LINE_STROKE, 8);\r
58 \r
59     Timer timer = new Timer();\r
60     TimerTask task = new TimerTask() {\r
61         boolean toggle = false;\r
62         @Override\r
63         public void run() {\r
64             //Color color = toggle ? LINE_COLOR1 : LINE_COLOR2;\r
65             //style.setLineColor(color);\r
66             rgn.setRenderer(new StyledRouteGraphRenderer(style));\r
67             toggle ^= true;\r
68         }\r
69     };\r
70 \r
71     public void init() {\r
72         setSize(600, 600);\r
73         setFocusable(true);\r
74         setFocusCycleRoot(true);\r
75         enableInputMethods(true);\r
76         enableEvents(AWTEvent.INPUT_METHOD_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.KEY_EVENT_MASK | AWTEvent.TEXT_EVENT_MASK | AWTEvent.MOUSE_WHEEL_EVENT_MASK | AWTEvent.COMPONENT_EVENT_MASK | AWTEvent.PAINT_EVENT_MASK | AWTEvent.FOCUS_EVENT_MASK);\r
77 \r
78         backbuffer = createVolatileImage(getWidth(), getHeight());\r
79 \r
80         this.rg = new RouteGraph();\r
81         RouteLine v = rg.addLine(false, 0);\r
82         v.setData( "L1" );\r
83 \r
84         rg.link(addTerminal("T1", rg, -100, -100, 1, PlainExampleLineEndStyle.INSTANCE), v);\r
85 //        rg.link(addTerminal("T2", rg, -100, 100, 1, PlainExampleLineEndStyle.INSTANCE), v);\r
86 //        rg.link(addTerminal("T3", rg, 100, -80, 1, ArrowExampleLineEndStyle.INSTANCE), v);\r
87 //        rg.link(addTerminal("T4", rg, 100, 100, 4, ArrowExampleLineEndStyle.INSTANCE), v);\r
88 \r
89         sg = new G2DSceneGraph();\r
90         NavigationNode nav = sg.addNode("navigation", NavigationNode.class);\r
91 \r
92         // This just tests that RouteGraphNode handles transforms correctly\r
93         final G2DParentNode temp = nav.addNode("temp", G2DParentNode.class);\r
94         temp.setTransform(AffineTransform.getTranslateInstance(50, 50));\r
95 \r
96         rgn = temp.addNode("rg1", RouteGraphNode.class);\r
97         rgn.setTransform(AffineTransform.getTranslateInstance(100, 100));\r
98         rgn.setRouteGraph(rg);\r
99         rgn.setRenderer(new StyledRouteGraphRenderer(style));\r
100 \r
101         rgn.setRouteGraphListener(new IRouteGraphListener() {\r
102             @Override\r
103             public void routeGraphChanged(RouteGraphChangeEvent event) {\r
104                 event.node.getRouteGraphDelta().print();\r
105             }\r
106         });\r
107 \r
108         Thread t = new Thread(this);\r
109         t.start();\r
110 \r
111         timer.schedule(task, 1000, 1000);\r
112     }\r
113 \r
114     private static RouteTerminal addTerminal(Object data, RouteGraph rg, double x, double y, int allowedDirections, ILineEndStyle style) {\r
115         RouteTerminal rt = rg.addTerminal(x, y, x-20, y-20, x+20, y+20, allowedDirections, style);\r
116         rt.setData( data );\r
117         return rt;\r
118     }\r
119 \r
120     public void run() {\r
121         while(!interrupted) {\r
122             repaint();\r
123             long ival = 1000 / FPS;\r
124             try {\r
125                 Thread.sleep(ival);\r
126             } catch (InterruptedException e) {\r
127                 e.printStackTrace();\r
128             }\r
129         }\r
130     }\r
131 \r
132     public void update(Graphics g) {\r
133         int result = backbuffer.validate(getGraphicsConfiguration());           \r
134         if (result == VolatileImage.IMAGE_INCOMPATIBLE) {\r
135             backbuffer = this.createVolatileImage(getWidth(), getHeight());\r
136         }\r
137 \r
138         Graphics2D g2d = backbuffer.createGraphics();\r
139         g2d.clearRect(0, 0, getWidth(), getHeight());\r
140         g2d.setClip(0, 0, getWidth(), getHeight());\r
141         sg.render(g2d);\r
142         g2d.dispose();\r
143         g.drawImage(backbuffer, 0, 0, this);\r
144     }\r
145     \r
146     public void paint(Graphics g) {\r
147         update(g);\r
148     }\r
149 \r
150     public void processEvent(AWTEvent event) {\r
151         if(event.getID() == ComponentEvent.COMPONENT_RESIZED) {\r
152             backbuffer = this.createVolatileImage(getWidth(), getHeight());\r
153             repaint();\r
154         }\r
155 \r
156         {\r
157             EventDelegator handler = sg.getEventDelegator();\r
158             switch(event.getID()) {\r
159                 case MouseEvent.MOUSE_PRESSED:\r
160                     G2DFocusManager.INSTANCE.clearFocus();\r
161                     handler.mousePressed((MouseEvent)event);\r
162                     if(G2DFocusManager.INSTANCE.getFocusOwner() == null) {\r
163                         this.requestFocusInWindow();\r
164                     }\r
165                     break;\r
166                     \r
167                 case MouseEvent.MOUSE_RELEASED:\r
168                     handler.mouseReleased((MouseEvent)event);\r
169                     break;\r
170                     \r
171                 case MouseEvent.MOUSE_CLICKED:\r
172                     handler.mouseClicked((MouseEvent)event);\r
173                     break;\r
174                     \r
175                 case MouseEvent.MOUSE_MOVED:\r
176                     handler.mouseMoved((MouseEvent)event);\r
177                     break;\r
178 \r
179                 case MouseEvent.MOUSE_DRAGGED:\r
180                     handler.mouseDragged((MouseEvent)event);\r
181                     break;\r
182                     \r
183                 case MouseEvent.MOUSE_WHEEL:\r
184                     handler.mouseWheelMoved((MouseWheelEvent)event);\r
185                     break;\r
186                     \r
187                 case MouseEvent.MOUSE_ENTERED:\r
188                     handler.mouseEntered((MouseEvent)event);\r
189                     break;\r
190                     \r
191                 case MouseEvent.MOUSE_EXITED:\r
192                     handler.mouseExited((MouseEvent)event);\r
193                     break;\r
194                     \r
195                 case KeyEvent.KEY_PRESSED:\r
196                     handler.keyPressed((KeyEvent)event);\r
197                     break;\r
198                     \r
199                 case KeyEvent.KEY_RELEASED:\r
200                     handler.keyReleased((KeyEvent)event);\r
201                     break;\r
202                     \r
203                 case KeyEvent.KEY_TYPED:\r
204                     handler.keyTyped((KeyEvent)event);\r
205                     break;\r
206                     \r
207                 case FocusEvent.FOCUS_GAINED:\r
208                     handler.focusGained((FocusEvent)event);\r
209                     break;\r
210                     \r
211                 case FocusEvent.FOCUS_LOST:\r
212                     handler.focusLost((FocusEvent)event);\r
213                     break;\r
214                     \r
215                 default:\r
216                     break;\r
217             }\r
218         }\r
219     }\r
220 \r
221 }\r