-package org.simantics.scenegraph.tests;\r
-import java.awt.AWTEvent;\r
-import java.awt.BasicStroke;\r
-import java.awt.Color;\r
-import java.awt.Graphics;\r
-import java.awt.Graphics2D;\r
-import java.awt.Stroke;\r
-import java.awt.event.ComponentEvent;\r
-import java.awt.event.FocusEvent;\r
-import java.awt.event.KeyEvent;\r
-import java.awt.event.MouseEvent;\r
-import java.awt.event.MouseWheelEvent;\r
-import java.awt.geom.AffineTransform;\r
-import java.awt.image.VolatileImage;\r
-import java.util.Timer;\r
-import java.util.TimerTask;\r
-\r
-import javax.swing.JApplet;\r
-\r
-import org.simantics.diagram.connection.RouteGraph;\r
-import org.simantics.diagram.connection.RouteLine;\r
-import org.simantics.diagram.connection.RouteTerminal;\r
-import org.simantics.diagram.connection.rendering.BasicConnectionStyle;\r
-import org.simantics.diagram.connection.rendering.StyledRouteGraphRenderer;\r
-import org.simantics.diagram.connection.rendering.arrows.ILineEndStyle;\r
-import org.simantics.diagram.connection.rendering.arrows.PlainExampleLineEndStyle;\r
-import org.simantics.scenegraph.g2d.G2DFocusManager;\r
-import org.simantics.scenegraph.g2d.G2DParentNode;\r
-import org.simantics.scenegraph.g2d.G2DSceneGraph;\r
-import org.simantics.scenegraph.g2d.events.EventDelegator;\r
-import org.simantics.scenegraph.g2d.nodes.NavigationNode;\r
-import org.simantics.scenegraph.g2d.nodes.connection.IRouteGraphListener;\r
-import org.simantics.scenegraph.g2d.nodes.connection.RouteGraphChangeEvent;\r
-import org.simantics.scenegraph.g2d.nodes.connection.RouteGraphNode;\r
-\r
-\r
-/**\r
- * @author Tuukka Lehtonen\r
- */\r
-public class TestRouteGraphNodeApplet extends JApplet implements Runnable {\r
-\r
- private static final long serialVersionUID = -2097427018689455381L;\r
-\r
- private static final int FPS = 60;\r
-\r
- protected VolatileImage backbuffer = null;\r
- protected boolean interrupted = false;\r
-\r
- Color LINE_COLOR1 = Color.RED;\r
- Color LINE_COLOR2 = Color.GREEN;\r
- Stroke LINE_STROKE = new BasicStroke(1, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_BEVEL);\r
- Stroke ROUTE_LINE_STROKE = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);\r
-\r
- G2DSceneGraph sg;\r
- RouteGraph rg;\r
- RouteGraphNode rgn;\r
- BasicConnectionStyle style = new BasicConnectionStyle(LINE_COLOR1, Color.BLACK, 3.0, LINE_STROKE, ROUTE_LINE_STROKE, 8);\r
-\r
- Timer timer = new Timer();\r
- TimerTask task = new TimerTask() {\r
- boolean toggle = false;\r
- @Override\r
- public void run() {\r
- //Color color = toggle ? LINE_COLOR1 : LINE_COLOR2;\r
- //style.setLineColor(color);\r
- rgn.setRenderer(new StyledRouteGraphRenderer(style));\r
- toggle ^= true;\r
- }\r
- };\r
-\r
- public void init() {\r
- setSize(600, 600);\r
- setFocusable(true);\r
- setFocusCycleRoot(true);\r
- enableInputMethods(true);\r
- 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
-\r
- backbuffer = createVolatileImage(getWidth(), getHeight());\r
-\r
- this.rg = new RouteGraph();\r
- RouteLine v = rg.addLine(false, 0);\r
- v.setData( "L1" );\r
-\r
- rg.link(addTerminal("T1", rg, -100, -100, 1, PlainExampleLineEndStyle.INSTANCE), v);\r
-// rg.link(addTerminal("T2", rg, -100, 100, 1, PlainExampleLineEndStyle.INSTANCE), v);\r
-// rg.link(addTerminal("T3", rg, 100, -80, 1, ArrowExampleLineEndStyle.INSTANCE), v);\r
-// rg.link(addTerminal("T4", rg, 100, 100, 4, ArrowExampleLineEndStyle.INSTANCE), v);\r
-\r
- sg = new G2DSceneGraph();\r
- NavigationNode nav = sg.addNode("navigation", NavigationNode.class);\r
-\r
- // This just tests that RouteGraphNode handles transforms correctly\r
- final G2DParentNode temp = nav.addNode("temp", G2DParentNode.class);\r
- temp.setTransform(AffineTransform.getTranslateInstance(50, 50));\r
-\r
- rgn = temp.addNode("rg1", RouteGraphNode.class);\r
- rgn.setTransform(AffineTransform.getTranslateInstance(100, 100));\r
- rgn.setRouteGraph(rg);\r
- rgn.setRenderer(new StyledRouteGraphRenderer(style));\r
-\r
- rgn.setRouteGraphListener(new IRouteGraphListener() {\r
- @Override\r
- public void routeGraphChanged(RouteGraphChangeEvent event) {\r
- event.node.getRouteGraphDelta().print();\r
- }\r
- });\r
-\r
- Thread t = new Thread(this);\r
- t.start();\r
-\r
- timer.schedule(task, 1000, 1000);\r
- }\r
-\r
- private static RouteTerminal addTerminal(Object data, RouteGraph rg, double x, double y, int allowedDirections, ILineEndStyle style) {\r
- RouteTerminal rt = rg.addTerminal(x, y, x-20, y-20, x+20, y+20, allowedDirections, style);\r
- rt.setData( data );\r
- return rt;\r
- }\r
-\r
- public void run() {\r
- while(!interrupted) {\r
- repaint();\r
- long ival = 1000 / FPS;\r
- try {\r
- Thread.sleep(ival);\r
- } catch (InterruptedException e) {\r
- e.printStackTrace();\r
- }\r
- }\r
- }\r
-\r
- public void update(Graphics g) {\r
- int result = backbuffer.validate(getGraphicsConfiguration()); \r
- if (result == VolatileImage.IMAGE_INCOMPATIBLE) {\r
- backbuffer = this.createVolatileImage(getWidth(), getHeight());\r
- }\r
-\r
- Graphics2D g2d = backbuffer.createGraphics();\r
- g2d.clearRect(0, 0, getWidth(), getHeight());\r
- g2d.setClip(0, 0, getWidth(), getHeight());\r
- sg.render(g2d);\r
- g2d.dispose();\r
- g.drawImage(backbuffer, 0, 0, this);\r
- }\r
- \r
- public void paint(Graphics g) {\r
- update(g);\r
- }\r
-\r
- public void processEvent(AWTEvent event) {\r
- if(event.getID() == ComponentEvent.COMPONENT_RESIZED) {\r
- backbuffer = this.createVolatileImage(getWidth(), getHeight());\r
- repaint();\r
- }\r
-\r
- {\r
- EventDelegator handler = sg.getEventDelegator();\r
- switch(event.getID()) {\r
- case MouseEvent.MOUSE_PRESSED:\r
- G2DFocusManager.INSTANCE.clearFocus();\r
- handler.mousePressed((MouseEvent)event);\r
- if(G2DFocusManager.INSTANCE.getFocusOwner() == null) {\r
- this.requestFocusInWindow();\r
- }\r
- break;\r
- \r
- case MouseEvent.MOUSE_RELEASED:\r
- handler.mouseReleased((MouseEvent)event);\r
- break;\r
- \r
- case MouseEvent.MOUSE_CLICKED:\r
- handler.mouseClicked((MouseEvent)event);\r
- break;\r
- \r
- case MouseEvent.MOUSE_MOVED:\r
- handler.mouseMoved((MouseEvent)event);\r
- break;\r
-\r
- case MouseEvent.MOUSE_DRAGGED:\r
- handler.mouseDragged((MouseEvent)event);\r
- break;\r
- \r
- case MouseEvent.MOUSE_WHEEL:\r
- handler.mouseWheelMoved((MouseWheelEvent)event);\r
- break;\r
- \r
- case MouseEvent.MOUSE_ENTERED:\r
- handler.mouseEntered((MouseEvent)event);\r
- break;\r
- \r
- case MouseEvent.MOUSE_EXITED:\r
- handler.mouseExited((MouseEvent)event);\r
- break;\r
- \r
- case KeyEvent.KEY_PRESSED:\r
- handler.keyPressed((KeyEvent)event);\r
- break;\r
- \r
- case KeyEvent.KEY_RELEASED:\r
- handler.keyReleased((KeyEvent)event);\r
- break;\r
- \r
- case KeyEvent.KEY_TYPED:\r
- handler.keyTyped((KeyEvent)event);\r
- break;\r
- \r
- case FocusEvent.FOCUS_GAINED:\r
- handler.focusGained((FocusEvent)event);\r
- break;\r
- \r
- case FocusEvent.FOCUS_LOST:\r
- handler.focusLost((FocusEvent)event);\r
- break;\r
- \r
- default:\r
- break;\r
- }\r
- }\r
- }\r
-\r
-}\r
+package org.simantics.scenegraph.tests;
+import java.awt.AWTEvent;
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Stroke;
+import java.awt.event.ComponentEvent;
+import java.awt.event.FocusEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseWheelEvent;
+import java.awt.geom.AffineTransform;
+import java.awt.image.VolatileImage;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import javax.swing.JApplet;
+
+import org.simantics.diagram.connection.RouteGraph;
+import org.simantics.diagram.connection.RouteLine;
+import org.simantics.diagram.connection.RouteTerminal;
+import org.simantics.diagram.connection.rendering.BasicConnectionStyle;
+import org.simantics.diagram.connection.rendering.StyledRouteGraphRenderer;
+import org.simantics.diagram.connection.rendering.arrows.ILineEndStyle;
+import org.simantics.diagram.connection.rendering.arrows.PlainExampleLineEndStyle;
+import org.simantics.scenegraph.g2d.G2DFocusManager;
+import org.simantics.scenegraph.g2d.G2DParentNode;
+import org.simantics.scenegraph.g2d.G2DSceneGraph;
+import org.simantics.scenegraph.g2d.events.EventDelegator;
+import org.simantics.scenegraph.g2d.nodes.NavigationNode;
+import org.simantics.scenegraph.g2d.nodes.connection.IRouteGraphListener;
+import org.simantics.scenegraph.g2d.nodes.connection.RouteGraphChangeEvent;
+import org.simantics.scenegraph.g2d.nodes.connection.RouteGraphNode;
+
+
+/**
+ * @author Tuukka Lehtonen
+ */
+public class TestRouteGraphNodeApplet extends JApplet implements Runnable {
+
+ private static final long serialVersionUID = -2097427018689455381L;
+
+ private static final int FPS = 60;
+
+ protected VolatileImage backbuffer = null;
+ protected boolean interrupted = false;
+
+ Color LINE_COLOR1 = Color.RED;
+ Color LINE_COLOR2 = Color.GREEN;
+ Stroke LINE_STROKE = new BasicStroke(1, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_BEVEL);
+ Stroke ROUTE_LINE_STROKE = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);
+
+ G2DSceneGraph sg;
+ RouteGraph rg;
+ RouteGraphNode rgn;
+ BasicConnectionStyle style = new BasicConnectionStyle(LINE_COLOR1, Color.BLACK, 3.0, LINE_STROKE, ROUTE_LINE_STROKE, 8, 0.0);
+
+ Timer timer = new Timer();
+ TimerTask task = new TimerTask() {
+ boolean toggle = false;
+ @Override
+ public void run() {
+ //Color color = toggle ? LINE_COLOR1 : LINE_COLOR2;
+ //style.setLineColor(color);
+ rgn.setRenderer(new StyledRouteGraphRenderer(style));
+ toggle ^= true;
+ }
+ };
+
+ public void init() {
+ setSize(600, 600);
+ setFocusable(true);
+ setFocusCycleRoot(true);
+ enableInputMethods(true);
+ 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);
+
+ backbuffer = createVolatileImage(getWidth(), getHeight());
+
+ this.rg = new RouteGraph();
+ RouteLine v = rg.addLine(false, 0);
+ v.setData( "L1" );
+
+ rg.link(addTerminal("T1", rg, -100, -100, 1, PlainExampleLineEndStyle.INSTANCE), v);
+// rg.link(addTerminal("T2", rg, -100, 100, 1, PlainExampleLineEndStyle.INSTANCE), v);
+// rg.link(addTerminal("T3", rg, 100, -80, 1, ArrowExampleLineEndStyle.INSTANCE), v);
+// rg.link(addTerminal("T4", rg, 100, 100, 4, ArrowExampleLineEndStyle.INSTANCE), v);
+
+ sg = new G2DSceneGraph();
+ NavigationNode nav = sg.addNode("navigation", NavigationNode.class);
+
+ // This just tests that RouteGraphNode handles transforms correctly
+ final G2DParentNode temp = nav.addNode("temp", G2DParentNode.class);
+ temp.setTransform(AffineTransform.getTranslateInstance(50, 50));
+
+ rgn = temp.addNode("rg1", RouteGraphNode.class);
+ rgn.setTransform(AffineTransform.getTranslateInstance(100, 100));
+ rgn.setRouteGraph(rg);
+ rgn.setRenderer(new StyledRouteGraphRenderer(style));
+
+ rgn.setRouteGraphListener(new IRouteGraphListener() {
+ @Override
+ public void routeGraphChanged(RouteGraphChangeEvent event) {
+ event.node.getRouteGraphDelta().print();
+ }
+ });
+
+ Thread t = new Thread(this);
+ t.start();
+
+ timer.schedule(task, 1000, 1000);
+ }
+
+ private static RouteTerminal addTerminal(Object data, RouteGraph rg, double x, double y, int allowedDirections, ILineEndStyle style) {
+ RouteTerminal rt = rg.addTerminal(x, y, x-20, y-20, x+20, y+20, allowedDirections, style);
+ rt.setData( data );
+ return rt;
+ }
+
+ public void run() {
+ while(!interrupted) {
+ repaint();
+ long ival = 1000 / FPS;
+ try {
+ Thread.sleep(ival);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public void update(Graphics g) {
+ int result = backbuffer.validate(getGraphicsConfiguration());
+ if (result == VolatileImage.IMAGE_INCOMPATIBLE) {
+ backbuffer = this.createVolatileImage(getWidth(), getHeight());
+ }
+
+ Graphics2D g2d = backbuffer.createGraphics();
+ g2d.clearRect(0, 0, getWidth(), getHeight());
+ g2d.setClip(0, 0, getWidth(), getHeight());
+ sg.render(g2d);
+ g2d.dispose();
+ g.drawImage(backbuffer, 0, 0, this);
+ }
+
+ public void paint(Graphics g) {
+ update(g);
+ }
+
+ public void processEvent(AWTEvent event) {
+ if(event.getID() == ComponentEvent.COMPONENT_RESIZED) {
+ backbuffer = this.createVolatileImage(getWidth(), getHeight());
+ repaint();
+ }
+
+ {
+ EventDelegator handler = sg.getEventDelegator();
+ switch(event.getID()) {
+ case MouseEvent.MOUSE_PRESSED:
+ G2DFocusManager.INSTANCE.clearFocus();
+ handler.mousePressed((MouseEvent)event);
+ if(G2DFocusManager.INSTANCE.getFocusOwner() == null) {
+ this.requestFocusInWindow();
+ }
+ break;
+
+ case MouseEvent.MOUSE_RELEASED:
+ handler.mouseReleased((MouseEvent)event);
+ break;
+
+ case MouseEvent.MOUSE_CLICKED:
+ handler.mouseClicked((MouseEvent)event);
+ break;
+
+ case MouseEvent.MOUSE_MOVED:
+ handler.mouseMoved((MouseEvent)event);
+ break;
+
+ case MouseEvent.MOUSE_DRAGGED:
+ handler.mouseDragged((MouseEvent)event);
+ break;
+
+ case MouseEvent.MOUSE_WHEEL:
+ handler.mouseWheelMoved((MouseWheelEvent)event);
+ break;
+
+ case MouseEvent.MOUSE_ENTERED:
+ handler.mouseEntered((MouseEvent)event);
+ break;
+
+ case MouseEvent.MOUSE_EXITED:
+ handler.mouseExited((MouseEvent)event);
+ break;
+
+ case KeyEvent.KEY_PRESSED:
+ handler.keyPressed((KeyEvent)event);
+ break;
+
+ case KeyEvent.KEY_RELEASED:
+ handler.keyReleased((KeyEvent)event);
+ break;
+
+ case KeyEvent.KEY_TYPED:
+ handler.keyTyped((KeyEvent)event);
+ break;
+
+ case FocusEvent.FOCUS_GAINED:
+ handler.focusGained((FocusEvent)event);
+ break;
+
+ case FocusEvent.FOCUS_LOST:
+ handler.focusLost((FocusEvent)event);
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+}