--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.scenegraph.example;\r
+\r
+import java.awt.event.ActionEvent;\r
+import java.awt.event.ActionListener;\r
+import java.awt.geom.AffineTransform;\r
+import java.awt.geom.Rectangle2D;\r
+import java.io.BufferedReader;\r
+import java.io.IOException;\r
+import java.io.InputStreamReader;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import javax.swing.BorderFactory;\r
+import javax.swing.JSlider;\r
+import org.simantics.scenegraph.g2d.G2DSceneGraph;\r
+import org.simantics.scenegraph.g2d.nodes.AnimatedSVGNode;\r
+import org.simantics.scenegraph.g2d.nodes.GridNode;\r
+import org.simantics.scenegraph.g2d.nodes.NavigationNode;\r
+import org.simantics.scenegraph.g2d.nodes.RulerNode;\r
+import org.simantics.scenegraph.g2d.nodes.ShapeNode;\r
+import org.simantics.scenegraph.g2d.nodes.TransformNode;\r
+import org.simantics.scenegraph.g2d.nodes.Trend2DNode;\r
+import org.simantics.scenegraph.swing.ButtonNode;\r
+import org.simantics.scenegraph.swing.LabelNode;\r
+import org.simantics.scenegraph.swing.MonitorNode;\r
+import org.simantics.scenegraph.swing.SliderNode;\r
+\r
+public class SampleThread implements Runnable {\r
+\r
+ public G2DSceneGraph sg = new G2DSceneGraph();\r
+ protected TransformNode transform = null;\r
+ protected TransformNode transform2 = null;\r
+ \r
+ protected boolean interrupted = false;\r
+ \r
+ public void start() {\r
+ interrupted = false;\r
+ Thread t = new Thread(this);\r
+ t.start();\r
+ }\r
+ \r
+ public void stop() {\r
+ interrupted = true;\r
+ }\r
+ \r
+ protected void close() {\r
+ }\r
+\r
+ protected boolean init() {\r
+ return true;\r
+ }\r
+ \r
+ protected boolean rotate = true;\r
+ protected float t1 = 0;\r
+ protected float t2 = 0;\r
+ \r
+ private String loadSVG(String filename) throws IOException {\r
+ String data = "";\r
+ BufferedReader reader = new BufferedReader(new InputStreamReader(this.getClass().getResourceAsStream(filename)));\r
+\r
+ while(reader.ready()) {\r
+ data += reader.readLine();\r
+ }\r
+\r
+ reader.close();\r
+ return data;\r
+ }\r
+ \r
+ public void run() {\r
+ if(!init()) return;\r
+\r
+ final NavigationNode nav = sg.addNode(NavigationNode.class);\r
+ GridNode grid = nav.addNode(GridNode.class);\r
+ grid.setZIndex(1);\r
+ \r
+// AnimatedSVGNode bmw = null;\r
+ AnimatedSVGNode svg1 = null;\r
+ AnimatedSVGNode svg2 = null;\r
+ AnimatedSVGNode svg3 = null;\r
+ AnimatedSVGNode svg4 = null;\r
+ try {\r
+ String data = loadSVG("tynnyri.svg");\r
+ svg1 = nav.addNode(AnimatedSVGNode.class);\r
+ svg1.setZIndex(20);\r
+ svg1.setData(data);\r
+ svg1.setTransform(AffineTransform.getTranslateInstance(0, 150));\r
+ svg1.useMipMap(false);\r
+ \r
+ svg2 = nav.addNode(AnimatedSVGNode.class);\r
+ svg2.setZIndex(20);\r
+ svg2.setData(data);\r
+ svg2.setTransform(AffineTransform.getTranslateInstance(250, 150));\r
+ svg2.useMipMap(false);\r
+ \r
+ svg3 = nav.addNode(AnimatedSVGNode.class);\r
+ svg3.setZIndex(20);\r
+ svg3.setData(data);\r
+ svg3.setTransform(AffineTransform.getTranslateInstance(500, 150));\r
+ svg3.useMipMap(false);\r
+ \r
+ svg4 = nav.addNode(AnimatedSVGNode.class);\r
+ svg4.setZIndex(20);\r
+ svg4.setData(data);\r
+ svg4.setTransform(AffineTransform.getTranslateInstance(750, 150));\r
+ svg4.useMipMap(false);\r
+ } catch(IOException e) {\r
+ e.printStackTrace();\r
+ }\r
+\r
+// try {\r
+// bmw = nav.addNode(AnimatedSVGNode.class);\r
+// bmw.setZIndex(50);\r
+// bmw.setData(loadSVG("D:\\bemari.svg"));\r
+// bmw.setPosition(100, 100);\r
+//// bmw.setTargetSize(50, 50);\r
+// bmw.useMipMap(false);\r
+// \r
+// String init = "if(rotate === undefined || y === undefined || x === undefined) { var rotate = 0; var y = 0; var x = 0; }";\r
+// String left = "rotate = (rotate - 10)%360;";\r
+// String right = "rotate = (rotate + 10)%360;";\r
+// String up = "x -= (Math.cos(rotate*3.14/180))*20; y -= (Math.sin(rotate*3.14/180))*20; ";\r
+// String down = "x += (Math.cos(rotate*3.14/180))*20; y += (Math.sin(rotate*3.14/180))*20; ";\r
+// \r
+// String base = \r
+// "t.setValue(\"rotate\", rotate); "+\r
+// "t.setValue(\"x\", x); "+\r
+// "t.setValue(\"y\", y); "+\r
+// "var m = new Array(6); "+\r
+// "m[0] = Math.cos(rotate*3.14/180); "+\r
+// "m[2] = -Math.sin(rotate*3.14/180); "+\r
+// "m[4] = x; "+\r
+// \r
+// "m[1] = Math.sin(rotate*3.14/180); "+\r
+// "m[3] = Math.cos(rotate*3.14/180); "+\r
+// "m[5] = y; "+\r
+// "if(svg.getRoot().hasAttribute(\"transform\", 1)) {"+\r
+// " svg.getRoot().setAttribute(\"transform\", 1, \"matrix(\"+m.join(\",\")+\")\");"+\r
+// "} else {"+\r
+// " svg.getRoot().addAttribute(\"transform\", 1, \"matrix(\"+m.join(\",\")+\")\");"+\r
+// "}";\r
+// bmw.registerEventAnimation("LEFT", init+left+base);\r
+// bmw.registerEventAnimation("RIGHT", init+right+base);\r
+// bmw.registerEventAnimation("UP", init+up+base);\r
+// bmw.registerEventAnimation("DOWN", init+down+base);\r
+// } catch(IOException e) {\r
+// e.printStackTrace();\r
+// }\r
+// \r
+ transform = nav.addNode(TransformNode.class);\r
+ transform.setZIndex(3);\r
+ AffineTransform at = new AffineTransform();\r
+ at.translate(200, 200);\r
+ transform.setTransform(at);\r
+ ShapeNode box = transform.addNode(ShapeNode.class);\r
+ box.setZIndex(1);\r
+ box.setShape(new Rectangle2D.Double(-50, -50, 100, 100));\r
+\r
+ MonitorNode cn = nav.addNode(MonitorNode.class);\r
+ cn.setZIndex(2);\r
+ cn.setTransform(AffineTransform.getTranslateInstance(100, 50));\r
+ cn.setBounds(new Rectangle2D.Double(0, 0, 100, 25));\r
+\r
+ final ButtonNode button = nav.addNode(ButtonNode.class);\r
+ button.setZIndex(3);\r
+ button.addActionListener(new ActionListener() {\r
+ @Override\r
+ public void actionPerformed(ActionEvent e) {\r
+ if(rotate) {\r
+ button.setText("Start rotation");\r
+ rotate = false;\r
+ } else {\r
+ button.setText("Stop rotation");\r
+ rotate = true;\r
+ }\r
+ }});\r
+ button.setText("Stop rotation");\r
+ button.setBounds(new Rectangle2D.Double(0, 0, 100, 20));\r
+ button.setTransform(AffineTransform.getTranslateInstance(100, 75));\r
+\r
+ SliderNode sn1 = nav.addNode(SliderNode.class);\r
+ sn1.setZIndex(4);\r
+ sn1.setTransform(AffineTransform.getTranslateInstance(100, 100));\r
+ sn1.setBounds(new Rectangle2D.Double(0, 0, 150, 50));\r
+ \r
+ sn1.setTitle("Rotation speed 1");\r
+ sn1.setMaximum(100);\r
+ sn1.setValue(20);\r
+ sn1.setMajorTickSpacing(20);\r
+ sn1.setMinorTickSpacing(5);\r
+ sn1.setPaintTicks(true);\r
+\r
+ \r
+ JSlider slider2 = new JSlider();\r
+ slider2.setBorder(BorderFactory.createTitledBorder("Rotation speed 2"));\r
+ slider2.setMaximum(100);\r
+ slider2.setValue(50);\r
+ slider2.setMajorTickSpacing(20);\r
+ slider2.setMinorTickSpacing(5);\r
+ slider2.setPaintTicks(true);\r
+ SliderNode sn2 = nav.addNode(SliderNode.class);\r
+ sn2.setZIndex(5);\r
+// sn2.setComponent(slider2);\r
+ sn2.setTransform(AffineTransform.getTranslateInstance(250, 100));\r
+ sn2.setBounds(new Rectangle2D.Double(0, 0, 150, 50));\r
+ \r
+ LabelNode cn2 = nav.addNode(LabelNode.class);\r
+ cn2.setZIndex(6);\r
+ cn2.setText("Name");\r
+ cn2.setBounds(new Rectangle2D.Double(0, 0, 100, 25));\r
+ cn2.setTransform(AffineTransform.getTranslateInstance(100, 30));\r
+\r
+ MonitorNode cn3 = nav.addNode(MonitorNode.class);\r
+ cn3.setZIndex(7);\r
+ cn3.setTransform(AffineTransform.getTranslateInstance(250, 50));\r
+ cn3.setBounds(new Rectangle2D.Double(0, 0, 100, 25));\r
+ \r
+ LabelNode cn4 = nav.addNode(LabelNode.class);\r
+ cn4.setZIndex(8);\r
+ cn4.setText("Phone number");\r
+ cn4.setTransform(AffineTransform.getTranslateInstance(250, 30));\r
+ cn4.setBounds(new Rectangle2D.Double(0, 0, 100, 25));\r
+ \r
+ transform2 = transform.addNode(TransformNode.class);\r
+ transform2.setZIndex(9);\r
+ \r
+ ShapeNode box2 = transform2.addNode(ShapeNode.class);\r
+ box2.setShape(new Rectangle2D.Double(-30, -30, 60, 60));\r
+\r
+ Trend2DNode trend = nav.addNode(Trend2DNode.class);\r
+ trend.setZIndex(10);\r
+ trend.setBounds(new Rectangle2D.Double(0, 0, 200, 200));\r
+ trend.setPosition(400, 200);\r
+ List<Trend2DNode.TrendPoint> points = new ArrayList<Trend2DNode.TrendPoint>();\r
+ int p = 0;\r
+ for(p = 0; p < 20;) {\r
+ points.add(new Trend2DNode.TrendPoint(p++, Math.random()));\r
+ }\r
+ trend.updatePoints(points);\r
+ \r
+ RulerNode ruler = nav.addNode(RulerNode.class);\r
+ ruler.setZIndex(11);\r
+\r
+// String script =\r
+// "if(level === undefined) {\n"+\r
+// " var level = (time/10)%200;\n"+\r
+// " if(level > 100) level = 200 - level;\n"+\r
+// "}\n"+\r
+// "var y = 620;\n"+\r
+// "var height = 285*level/100;\n"+\r
+// "svg.getElement(\"fill\").setAttribute(\"y\", 1, y-height);\n"+\r
+// "svg.getElement(\"fill\").setAttribute(\"height\", 1, height);\n"+\r
+// "svg.getElement(\"upperlevel\").setAttribute(\"transform\", 1, \"translate(1.4285587, \"+(280-height)+\")\");\n";\r
+\r
+ String script1 =\r
+ "var y = 620;\n"+\r
+ "var height = 285*level/100;\n"+\r
+ "var r = (2*level).toString(16); var b = (2*(100-level)).toString(16);\n"+\r
+ "var color = \"#\"+(r.length == 1 ? \"0\"+r : r)+\"00\"+(b.length == 1 ? \"0\"+b : b);\n"+\r
+ "svg.getElement(\"fill\").setAttribute(\"fill\", 0, color)\n"+\r
+ "svg.getElement(\"upperlevel\").setAttribute(\"fill\", 0, color)\n"+\r
+ "svg.getElement(\"bottom\").setAttribute(\"fill\", 0, color)\n"+\r
+ "svg.getElement(\"fill\").setAttribute(\"y\", 1, y-height);\n"+\r
+ "svg.getElement(\"fill\").setAttribute(\"height\", 1, height);\n"+\r
+ "svg.getElement(\"upperlevel\").setAttribute(\"transform\", 1, \"translate(1.4285587, \"+(280-height)+\")\");\n";\r
+\r
+ String script2 =\r
+ "var level = (time/10)%200;\n"+\r
+ "if(level > 100) level = 200 - level;\n"+\r
+ "var y = 620;\n"+\r
+ "var height = 285*level/100;\n"+\r
+ "svg.getElement(\"fill\").setAttribute(\"y\", 1, y-height);\n"+\r
+ "svg.getElement(\"fill\").setAttribute(\"height\", 1, height);\n"+\r
+ "svg.getElement(\"upperlevel\").setAttribute(\"transform\", 1, \"translate(1.4285587, \"+(280-height)+\")\");\n";\r
+ \r
+ sn1.setActionListener(new ActionListener() {\r
+ @Override\r
+ public void actionPerformed(ActionEvent e) {\r
+ Integer v = Integer.parseInt(e.getActionCommand());\r
+ t1 = (float)v/1000;\r
+ }});\r
+ sn2.setActionListener(new ActionListener() {\r
+ @Override\r
+ public void actionPerformed(ActionEvent e) {\r
+ Integer v = Integer.parseInt(e.getActionCommand());\r
+ t2 = (float)v/1000;\r
+ }});\r
+ \r
+ svg1.setScript(script1);\r
+ svg2.setScript(script1);\r
+\r
+ while(!interrupted) {\r
+ if(rotate) {\r
+ transform.rotate(t1);\r
+ transform2.rotate(t2);\r
+ \r
+ points.add(new Trend2DNode.TrendPoint(p++, Math.random()));\r
+ trend.updatePoints(points);\r
+ }\r
+ svg1.setValue("level", new Double(t1*1000));\r
+ svg2.setValue("level", new Double(t2*1000));\r
+ \r
+ svg3.animate(script2);\r
+ svg4.animate(script2);\r
+\r
+ repaint();\r
+ try {\r
+ Thread.sleep(1000);\r
+ } catch (InterruptedException e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ \r
+ close();\r
+ }\r
+ \r
+ public void repaint() {\r
+ \r
+ }\r
+\r
+}\r