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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.scenegraph.example;
\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
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
39 public class SampleThread implements Runnable {
\r
41 public G2DSceneGraph sg = new G2DSceneGraph();
\r
42 protected TransformNode transform = null;
\r
43 protected TransformNode transform2 = null;
\r
45 protected boolean interrupted = false;
\r
47 public void start() {
\r
48 interrupted = false;
\r
49 Thread t = new Thread(this);
\r
53 public void stop() {
\r
57 protected void close() {
\r
60 protected boolean init() {
\r
64 protected boolean rotate = true;
\r
65 protected float t1 = 0;
\r
66 protected float t2 = 0;
\r
68 private String loadSVG(String filename) throws IOException {
\r
70 BufferedReader reader = new BufferedReader(new InputStreamReader(this.getClass().getResourceAsStream(filename)));
\r
72 while(reader.ready()) {
\r
73 data += reader.readLine();
\r
83 final NavigationNode nav = sg.addNode(NavigationNode.class);
\r
84 GridNode grid = nav.addNode(GridNode.class);
\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
93 String data = loadSVG("tynnyri.svg");
\r
94 svg1 = nav.addNode(AnimatedSVGNode.class);
\r
97 svg1.setTransform(AffineTransform.getTranslateInstance(0, 150));
\r
98 svg1.useMipMap(false);
\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
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
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
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
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
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
144 // "m[1] = Math.sin(rotate*3.14/180); "+
\r
145 // "m[3] = Math.cos(rotate*3.14/180); "+
\r
147 // "if(svg.getRoot().hasAttribute(\"transform\", 1)) {"+
\r
148 // " svg.getRoot().setAttribute(\"transform\", 1, \"matrix(\"+m.join(\",\")+\")\");"+
\r
150 // " svg.getRoot().addAttribute(\"transform\", 1, \"matrix(\"+m.join(\",\")+\")\");"+
\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
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
167 box.setShape(new Rectangle2D.Double(-50, -50, 100, 100));
\r
169 MonitorNode cn = nav.addNode(MonitorNode.class);
\r
171 cn.setTransform(AffineTransform.getTranslateInstance(100, 50));
\r
172 cn.setBounds(new Rectangle2D.Double(0, 0, 100, 25));
\r
174 final ButtonNode button = nav.addNode(ButtonNode.class);
\r
175 button.setZIndex(3);
\r
176 button.addActionListener(new ActionListener() {
\r
178 public void actionPerformed(ActionEvent e) {
\r
180 button.setText("Start rotation");
\r
183 button.setText("Stop rotation");
\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
191 SliderNode sn1 = nav.addNode(SliderNode.class);
\r
193 sn1.setTransform(AffineTransform.getTranslateInstance(100, 100));
\r
194 sn1.setBounds(new Rectangle2D.Double(0, 0, 150, 50));
\r
196 sn1.setTitle("Rotation speed 1");
\r
197 sn1.setMaximum(100);
\r
199 sn1.setMajorTickSpacing(20);
\r
200 sn1.setMinorTickSpacing(5);
\r
201 sn1.setPaintTicks(true);
\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
213 // sn2.setComponent(slider2);
\r
214 sn2.setTransform(AffineTransform.getTranslateInstance(250, 100));
\r
215 sn2.setBounds(new Rectangle2D.Double(0, 0, 150, 50));
\r
217 LabelNode cn2 = nav.addNode(LabelNode.class);
\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
223 MonitorNode cn3 = nav.addNode(MonitorNode.class);
\r
225 cn3.setTransform(AffineTransform.getTranslateInstance(250, 50));
\r
226 cn3.setBounds(new Rectangle2D.Double(0, 0, 100, 25));
\r
228 LabelNode cn4 = nav.addNode(LabelNode.class);
\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
234 transform2 = transform.addNode(TransformNode.class);
\r
235 transform2.setZIndex(9);
\r
237 ShapeNode box2 = transform2.addNode(ShapeNode.class);
\r
238 box2.setShape(new Rectangle2D.Double(-30, -30, 60, 60));
\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
246 for(p = 0; p < 20;) {
\r
247 points.add(new Trend2DNode.TrendPoint(p++, Math.random()));
\r
249 trend.updatePoints(points);
\r
251 RulerNode ruler = nav.addNode(RulerNode.class);
\r
252 ruler.setZIndex(11);
\r
255 // "if(level === undefined) {\n"+
\r
256 // " var level = (time/10)%200;\n"+
\r
257 // " if(level > 100) level = 200 - level;\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
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
278 "var level = (time/10)%200;\n"+
\r
279 "if(level > 100) level = 200 - level;\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
286 sn1.setActionListener(new ActionListener() {
\r
288 public void actionPerformed(ActionEvent e) {
\r
289 Integer v = Integer.parseInt(e.getActionCommand());
\r
290 t1 = (float)v/1000;
\r
292 sn2.setActionListener(new ActionListener() {
\r
294 public void actionPerformed(ActionEvent e) {
\r
295 Integer v = Integer.parseInt(e.getActionCommand());
\r
296 t2 = (float)v/1000;
\r
299 svg1.setScript(script1);
\r
300 svg2.setScript(script1);
\r
302 while(!interrupted) {
\r
304 transform.rotate(t1);
\r
305 transform2.rotate(t2);
\r
307 points.add(new Trend2DNode.TrendPoint(p++, Math.random()));
\r
308 trend.updatePoints(points);
\r
310 svg1.setValue("level", new Double(t1*1000));
\r
311 svg2.setValue("level", new Double(t2*1000));
\r
313 svg3.animate(script2);
\r
314 svg4.animate(script2);
\r
318 Thread.sleep(1000);
\r
319 } catch (InterruptedException e) {
\r
320 // TODO Auto-generated catch block
\r
321 e.printStackTrace();
\r
328 public void repaint() {
\r