--- /dev/null
+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