]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scenegraph.swing/src/org/simantics/scenegraph/example/SampleThread.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scenegraph.swing / src / org / simantics / scenegraph / example / SampleThread.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.scenegraph.example;\r
13 \r
14 import java.awt.event.ActionEvent;\r
15 import java.awt.event.ActionListener;\r
16 import java.awt.geom.AffineTransform;\r
17 import java.awt.geom.Rectangle2D;\r
18 import java.io.BufferedReader;\r
19 import java.io.IOException;\r
20 import java.io.InputStreamReader;\r
21 import java.util.ArrayList;\r
22 import java.util.List;\r
23 \r
24 import javax.swing.BorderFactory;\r
25 import javax.swing.JSlider;\r
26 import org.simantics.scenegraph.g2d.G2DSceneGraph;\r
27 import org.simantics.scenegraph.g2d.nodes.AnimatedSVGNode;\r
28 import org.simantics.scenegraph.g2d.nodes.GridNode;\r
29 import org.simantics.scenegraph.g2d.nodes.NavigationNode;\r
30 import org.simantics.scenegraph.g2d.nodes.RulerNode;\r
31 import org.simantics.scenegraph.g2d.nodes.ShapeNode;\r
32 import org.simantics.scenegraph.g2d.nodes.TransformNode;\r
33 import org.simantics.scenegraph.g2d.nodes.Trend2DNode;\r
34 import org.simantics.scenegraph.swing.ButtonNode;\r
35 import org.simantics.scenegraph.swing.LabelNode;\r
36 import org.simantics.scenegraph.swing.MonitorNode;\r
37 import org.simantics.scenegraph.swing.SliderNode;\r
38 \r
39 public class SampleThread implements Runnable {\r
40 \r
41         public G2DSceneGraph sg = new G2DSceneGraph();\r
42         protected TransformNode transform = null;\r
43         protected TransformNode transform2 = null;\r
44         \r
45         protected boolean interrupted = false;\r
46         \r
47         public void start() {\r
48                 interrupted = false;\r
49                 Thread t = new Thread(this);\r
50                 t.start();\r
51         }\r
52         \r
53         public void stop() {\r
54                 interrupted = true;\r
55         }\r
56         \r
57         protected void close() {\r
58         }\r
59 \r
60         protected boolean init() {\r
61                 return true;\r
62         }\r
63         \r
64         protected boolean rotate = true;\r
65         protected float t1 = 0;\r
66         protected float t2 = 0;\r
67         \r
68         private String loadSVG(String filename) throws IOException {\r
69                 String data = "";\r
70                 BufferedReader reader = new BufferedReader(new InputStreamReader(this.getClass().getResourceAsStream(filename)));\r
71 \r
72                 while(reader.ready()) {\r
73                         data += reader.readLine();\r
74                 }\r
75 \r
76                 reader.close();\r
77                 return data;\r
78         }\r
79         \r
80         public void run() {\r
81                 if(!init()) return;\r
82 \r
83                 final NavigationNode nav = sg.addNode(NavigationNode.class);\r
84                 GridNode grid = nav.addNode(GridNode.class);\r
85                 grid.setZIndex(1);\r
86                 \r
87 //              AnimatedSVGNode bmw = null;\r
88                 AnimatedSVGNode svg1 = null;\r
89                 AnimatedSVGNode svg2 = null;\r
90                 AnimatedSVGNode svg3 = null;\r
91                 AnimatedSVGNode svg4 = null;\r
92                 try {\r
93                         String data = loadSVG("tynnyri.svg");\r
94                         svg1 = nav.addNode(AnimatedSVGNode.class);\r
95                         svg1.setZIndex(20);\r
96                         svg1.setData(data);\r
97                         svg1.setTransform(AffineTransform.getTranslateInstance(0, 150));\r
98                         svg1.useMipMap(false);\r
99                         \r
100                         svg2 = nav.addNode(AnimatedSVGNode.class);\r
101                         svg2.setZIndex(20);\r
102                         svg2.setData(data);\r
103                         svg2.setTransform(AffineTransform.getTranslateInstance(250, 150));\r
104                         svg2.useMipMap(false);\r
105                         \r
106                         svg3 = nav.addNode(AnimatedSVGNode.class);\r
107                         svg3.setZIndex(20);\r
108                         svg3.setData(data);\r
109                         svg3.setTransform(AffineTransform.getTranslateInstance(500, 150));\r
110                         svg3.useMipMap(false);\r
111                         \r
112                         svg4 = nav.addNode(AnimatedSVGNode.class);\r
113                         svg4.setZIndex(20);\r
114                         svg4.setData(data);\r
115                         svg4.setTransform(AffineTransform.getTranslateInstance(750, 150));\r
116                         svg4.useMipMap(false);\r
117                 } catch(IOException e) {\r
118                         e.printStackTrace();\r
119                 }\r
120 \r
121 //              try {\r
122 //                      bmw = nav.addNode(AnimatedSVGNode.class);\r
123 //                      bmw.setZIndex(50);\r
124 //                      bmw.setData(loadSVG("D:\\bemari.svg"));\r
125 //                      bmw.setPosition(100, 100);\r
126 ////                    bmw.setTargetSize(50, 50);\r
127 //                      bmw.useMipMap(false);\r
128 //                      \r
129 //                      String init = "if(rotate === undefined || y === undefined || x === undefined) { var rotate = 0; var y = 0; var x = 0; }";\r
130 //                      String left = "rotate = (rotate - 10)%360;";\r
131 //                      String right = "rotate = (rotate + 10)%360;";\r
132 //                      String up = "x -= (Math.cos(rotate*3.14/180))*20; y -= (Math.sin(rotate*3.14/180))*20; ";\r
133 //                      String down = "x += (Math.cos(rotate*3.14/180))*20; y += (Math.sin(rotate*3.14/180))*20; ";\r
134 //                      \r
135 //                      String base = \r
136 //                              "t.setValue(\"rotate\", rotate); "+\r
137 //                              "t.setValue(\"x\", x); "+\r
138 //                              "t.setValue(\"y\", y); "+\r
139 //                              "var m = new Array(6); "+\r
140 //                              "m[0] = Math.cos(rotate*3.14/180); "+\r
141 //                              "m[2] = -Math.sin(rotate*3.14/180); "+\r
142 //                              "m[4] = x; "+\r
143 //                              \r
144 //                              "m[1] = Math.sin(rotate*3.14/180); "+\r
145 //                              "m[3] = Math.cos(rotate*3.14/180); "+\r
146 //                              "m[5] = y; "+\r
147 //                              "if(svg.getRoot().hasAttribute(\"transform\", 1)) {"+\r
148 //                              "    svg.getRoot().setAttribute(\"transform\", 1, \"matrix(\"+m.join(\",\")+\")\");"+\r
149 //                              "} else {"+\r
150 //                              "       svg.getRoot().addAttribute(\"transform\", 1, \"matrix(\"+m.join(\",\")+\")\");"+\r
151 //                              "}";\r
152 //                      bmw.registerEventAnimation("LEFT", init+left+base);\r
153 //                      bmw.registerEventAnimation("RIGHT", init+right+base);\r
154 //                      bmw.registerEventAnimation("UP", init+up+base);\r
155 //                      bmw.registerEventAnimation("DOWN", init+down+base);\r
156 //              } catch(IOException e) {\r
157 //                      e.printStackTrace();\r
158 //              }\r
159 //              \r
160                 transform = nav.addNode(TransformNode.class);\r
161                 transform.setZIndex(3);\r
162                 AffineTransform at = new AffineTransform();\r
163                 at.translate(200, 200);\r
164                 transform.setTransform(at);\r
165                 ShapeNode box = transform.addNode(ShapeNode.class);\r
166                 box.setZIndex(1);\r
167                 box.setShape(new Rectangle2D.Double(-50, -50, 100, 100));\r
168 \r
169                 MonitorNode cn = nav.addNode(MonitorNode.class);\r
170                 cn.setZIndex(2);\r
171                 cn.setTransform(AffineTransform.getTranslateInstance(100, 50));\r
172                 cn.setBounds(new Rectangle2D.Double(0, 0, 100, 25));\r
173 \r
174                 final ButtonNode button = nav.addNode(ButtonNode.class);\r
175                 button.setZIndex(3);\r
176                 button.addActionListener(new ActionListener() {\r
177                         @Override\r
178                         public void actionPerformed(ActionEvent e) {\r
179                                 if(rotate) {\r
180                                         button.setText("Start rotation");\r
181                                         rotate = false;\r
182                                 } else {\r
183                                         button.setText("Stop rotation");\r
184                                         rotate = true;\r
185                                 }\r
186                         }});\r
187                 button.setText("Stop rotation");\r
188                 button.setBounds(new Rectangle2D.Double(0, 0, 100, 20));\r
189                 button.setTransform(AffineTransform.getTranslateInstance(100, 75));\r
190 \r
191             SliderNode sn1 = nav.addNode(SliderNode.class);\r
192             sn1.setZIndex(4);\r
193                 sn1.setTransform(AffineTransform.getTranslateInstance(100, 100));\r
194                 sn1.setBounds(new Rectangle2D.Double(0, 0, 150, 50));\r
195                 \r
196                 sn1.setTitle("Rotation speed 1");\r
197                 sn1.setMaximum(100);\r
198                 sn1.setValue(20);\r
199                 sn1.setMajorTickSpacing(20);\r
200                 sn1.setMinorTickSpacing(5);\r
201                 sn1.setPaintTicks(true);\r
202 \r
203                 \r
204             JSlider slider2 = new JSlider();\r
205             slider2.setBorder(BorderFactory.createTitledBorder("Rotation speed 2"));\r
206             slider2.setMaximum(100);\r
207             slider2.setValue(50);\r
208             slider2.setMajorTickSpacing(20);\r
209             slider2.setMinorTickSpacing(5);\r
210             slider2.setPaintTicks(true);\r
211             SliderNode sn2 = nav.addNode(SliderNode.class);\r
212             sn2.setZIndex(5);\r
213 //          sn2.setComponent(slider2);\r
214                 sn2.setTransform(AffineTransform.getTranslateInstance(250, 100));\r
215                 sn2.setBounds(new Rectangle2D.Double(0, 0, 150, 50));\r
216                 \r
217                 LabelNode cn2 = nav.addNode(LabelNode.class);\r
218                 cn2.setZIndex(6);\r
219                 cn2.setText("Name");\r
220                 cn2.setBounds(new Rectangle2D.Double(0, 0, 100, 25));\r
221                 cn2.setTransform(AffineTransform.getTranslateInstance(100, 30));\r
222 \r
223                 MonitorNode cn3 = nav.addNode(MonitorNode.class);\r
224                 cn3.setZIndex(7);\r
225                 cn3.setTransform(AffineTransform.getTranslateInstance(250, 50));\r
226                 cn3.setBounds(new Rectangle2D.Double(0, 0, 100, 25));\r
227                 \r
228                 LabelNode cn4 = nav.addNode(LabelNode.class);\r
229                 cn4.setZIndex(8);\r
230                 cn4.setText("Phone number");\r
231                 cn4.setTransform(AffineTransform.getTranslateInstance(250, 30));\r
232                 cn4.setBounds(new Rectangle2D.Double(0, 0, 100, 25));\r
233                 \r
234                 transform2 = transform.addNode(TransformNode.class);\r
235                 transform2.setZIndex(9);\r
236                 \r
237                 ShapeNode box2 = transform2.addNode(ShapeNode.class);\r
238                 box2.setShape(new Rectangle2D.Double(-30, -30, 60, 60));\r
239 \r
240                 Trend2DNode trend = nav.addNode(Trend2DNode.class);\r
241                 trend.setZIndex(10);\r
242                 trend.setBounds(new Rectangle2D.Double(0, 0, 200, 200));\r
243                 trend.setPosition(400, 200);\r
244                 List<Trend2DNode.TrendPoint> points = new ArrayList<Trend2DNode.TrendPoint>();\r
245                 int p = 0;\r
246                 for(p = 0; p < 20;) {\r
247                         points.add(new Trend2DNode.TrendPoint(p++, Math.random()));\r
248                 }\r
249                 trend.updatePoints(points);\r
250                 \r
251                 RulerNode ruler = nav.addNode(RulerNode.class);\r
252                 ruler.setZIndex(11);\r
253 \r
254 //      String script =\r
255 //              "if(level === undefined) {\n"+\r
256 //              "       var level = (time/10)%200;\n"+\r
257 //                      "   if(level > 100) level = 200 - level;\n"+\r
258 //              "}\n"+\r
259 //              "var y = 620;\n"+\r
260 //              "var height = 285*level/100;\n"+\r
261 //              "svg.getElement(\"fill\").setAttribute(\"y\", 1, y-height);\n"+\r
262 //              "svg.getElement(\"fill\").setAttribute(\"height\", 1, height);\n"+\r
263 //              "svg.getElement(\"upperlevel\").setAttribute(\"transform\", 1, \"translate(1.4285587, \"+(280-height)+\")\");\n";\r
264 \r
265         String script1 =\r
266                 "var y = 620;\n"+\r
267                 "var height = 285*level/100;\n"+\r
268                 "var r = (2*level).toString(16); var b = (2*(100-level)).toString(16);\n"+\r
269                 "var color = \"#\"+(r.length == 1 ? \"0\"+r : r)+\"00\"+(b.length == 1 ? \"0\"+b : b);\n"+\r
270                 "svg.getElement(\"fill\").setAttribute(\"fill\", 0, color)\n"+\r
271                 "svg.getElement(\"upperlevel\").setAttribute(\"fill\", 0, color)\n"+\r
272                 "svg.getElement(\"bottom\").setAttribute(\"fill\", 0, color)\n"+\r
273                 "svg.getElement(\"fill\").setAttribute(\"y\", 1, y-height);\n"+\r
274                 "svg.getElement(\"fill\").setAttribute(\"height\", 1, height);\n"+\r
275                 "svg.getElement(\"upperlevel\").setAttribute(\"transform\", 1, \"translate(1.4285587, \"+(280-height)+\")\");\n";\r
276 \r
277         String script2 =\r
278                 "var level = (time/10)%200;\n"+\r
279                         "if(level > 100) level = 200 - level;\n"+\r
280                 "var y = 620;\n"+\r
281                 "var height = 285*level/100;\n"+\r
282                 "svg.getElement(\"fill\").setAttribute(\"y\", 1, y-height);\n"+\r
283                 "svg.getElement(\"fill\").setAttribute(\"height\", 1, height);\n"+\r
284                 "svg.getElement(\"upperlevel\").setAttribute(\"transform\", 1, \"translate(1.4285587, \"+(280-height)+\")\");\n";\r
285         \r
286         sn1.setActionListener(new ActionListener() {\r
287                         @Override\r
288                         public void actionPerformed(ActionEvent e) {\r
289                                 Integer v = Integer.parseInt(e.getActionCommand());\r
290                                 t1 = (float)v/1000;\r
291                         }});\r
292         sn2.setActionListener(new ActionListener() {\r
293                         @Override\r
294                         public void actionPerformed(ActionEvent e) {\r
295                                 Integer v = Integer.parseInt(e.getActionCommand());\r
296                                 t2 = (float)v/1000;\r
297                         }});\r
298         \r
299                 svg1.setScript(script1);\r
300                 svg2.setScript(script1);\r
301 \r
302                 while(!interrupted) {\r
303                         if(rotate) {\r
304                                 transform.rotate(t1);\r
305                                 transform2.rotate(t2);\r
306                                 \r
307                                 points.add(new Trend2DNode.TrendPoint(p++, Math.random()));\r
308                                 trend.updatePoints(points);\r
309                         }\r
310                         svg1.setValue("level", new Double(t1*1000));\r
311                         svg2.setValue("level", new Double(t2*1000));\r
312                         \r
313                         svg3.animate(script2);\r
314                         svg4.animate(script2);\r
315 \r
316                         repaint();\r
317                         try {\r
318                                 Thread.sleep(1000);\r
319                         } catch (InterruptedException e) {\r
320                                 // TODO Auto-generated catch block\r
321                                 e.printStackTrace();\r
322                         }\r
323                 }\r
324                 \r
325                 close();\r
326         }\r
327         \r
328         public void repaint() {\r
329                 \r
330         }\r
331 \r
332 }\r