1 package org.simantics.scenegraph.tests;
\r
2 import java.awt.AWTEvent;
\r
3 import java.awt.BasicStroke;
\r
4 import java.awt.Color;
\r
5 import java.awt.Graphics;
\r
6 import java.awt.Graphics2D;
\r
7 import java.awt.Stroke;
\r
8 import java.awt.event.ComponentEvent;
\r
9 import java.awt.event.FocusEvent;
\r
10 import java.awt.event.KeyEvent;
\r
11 import java.awt.event.MouseEvent;
\r
12 import java.awt.event.MouseWheelEvent;
\r
13 import java.awt.geom.AffineTransform;
\r
14 import java.awt.image.VolatileImage;
\r
15 import java.util.Timer;
\r
16 import java.util.TimerTask;
\r
18 import javax.swing.JApplet;
\r
20 import org.simantics.diagram.connection.RouteGraph;
\r
21 import org.simantics.diagram.connection.RouteLine;
\r
22 import org.simantics.diagram.connection.RouteTerminal;
\r
23 import org.simantics.diagram.connection.rendering.BasicConnectionStyle;
\r
24 import org.simantics.diagram.connection.rendering.StyledRouteGraphRenderer;
\r
25 import org.simantics.diagram.connection.rendering.arrows.ILineEndStyle;
\r
26 import org.simantics.diagram.connection.rendering.arrows.PlainExampleLineEndStyle;
\r
27 import org.simantics.scenegraph.g2d.G2DFocusManager;
\r
28 import org.simantics.scenegraph.g2d.G2DParentNode;
\r
29 import org.simantics.scenegraph.g2d.G2DSceneGraph;
\r
30 import org.simantics.scenegraph.g2d.events.EventDelegator;
\r
31 import org.simantics.scenegraph.g2d.nodes.NavigationNode;
\r
32 import org.simantics.scenegraph.g2d.nodes.connection.IRouteGraphListener;
\r
33 import org.simantics.scenegraph.g2d.nodes.connection.RouteGraphChangeEvent;
\r
34 import org.simantics.scenegraph.g2d.nodes.connection.RouteGraphNode;
\r
38 * @author Tuukka Lehtonen
\r
40 public class TestRouteGraphNodeApplet extends JApplet implements Runnable {
\r
42 private static final long serialVersionUID = -2097427018689455381L;
\r
44 private static final int FPS = 60;
\r
46 protected VolatileImage backbuffer = null;
\r
47 protected boolean interrupted = false;
\r
49 Color LINE_COLOR1 = Color.RED;
\r
50 Color LINE_COLOR2 = Color.GREEN;
\r
51 Stroke LINE_STROKE = new BasicStroke(1, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_BEVEL);
\r
52 Stroke ROUTE_LINE_STROKE = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);
\r
57 BasicConnectionStyle style = new BasicConnectionStyle(LINE_COLOR1, Color.BLACK, 3.0, LINE_STROKE, ROUTE_LINE_STROKE, 8);
\r
59 Timer timer = new Timer();
\r
60 TimerTask task = new TimerTask() {
\r
61 boolean toggle = false;
\r
64 //Color color = toggle ? LINE_COLOR1 : LINE_COLOR2;
\r
65 //style.setLineColor(color);
\r
66 rgn.setRenderer(new StyledRouteGraphRenderer(style));
\r
71 public void init() {
\r
74 setFocusCycleRoot(true);
\r
75 enableInputMethods(true);
\r
76 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
78 backbuffer = createVolatileImage(getWidth(), getHeight());
\r
80 this.rg = new RouteGraph();
\r
81 RouteLine v = rg.addLine(false, 0);
\r
84 rg.link(addTerminal("T1", rg, -100, -100, 1, PlainExampleLineEndStyle.INSTANCE), v);
\r
85 // rg.link(addTerminal("T2", rg, -100, 100, 1, PlainExampleLineEndStyle.INSTANCE), v);
\r
86 // rg.link(addTerminal("T3", rg, 100, -80, 1, ArrowExampleLineEndStyle.INSTANCE), v);
\r
87 // rg.link(addTerminal("T4", rg, 100, 100, 4, ArrowExampleLineEndStyle.INSTANCE), v);
\r
89 sg = new G2DSceneGraph();
\r
90 NavigationNode nav = sg.addNode("navigation", NavigationNode.class);
\r
92 // This just tests that RouteGraphNode handles transforms correctly
\r
93 final G2DParentNode temp = nav.addNode("temp", G2DParentNode.class);
\r
94 temp.setTransform(AffineTransform.getTranslateInstance(50, 50));
\r
96 rgn = temp.addNode("rg1", RouteGraphNode.class);
\r
97 rgn.setTransform(AffineTransform.getTranslateInstance(100, 100));
\r
98 rgn.setRouteGraph(rg);
\r
99 rgn.setRenderer(new StyledRouteGraphRenderer(style));
\r
101 rgn.setRouteGraphListener(new IRouteGraphListener() {
\r
103 public void routeGraphChanged(RouteGraphChangeEvent event) {
\r
104 event.node.getRouteGraphDelta().print();
\r
108 Thread t = new Thread(this);
\r
111 timer.schedule(task, 1000, 1000);
\r
114 private static RouteTerminal addTerminal(Object data, RouteGraph rg, double x, double y, int allowedDirections, ILineEndStyle style) {
\r
115 RouteTerminal rt = rg.addTerminal(x, y, x-20, y-20, x+20, y+20, allowedDirections, style);
\r
116 rt.setData( data );
\r
120 public void run() {
\r
121 while(!interrupted) {
\r
123 long ival = 1000 / FPS;
\r
125 Thread.sleep(ival);
\r
126 } catch (InterruptedException e) {
\r
127 e.printStackTrace();
\r
132 public void update(Graphics g) {
\r
133 int result = backbuffer.validate(getGraphicsConfiguration());
\r
134 if (result == VolatileImage.IMAGE_INCOMPATIBLE) {
\r
135 backbuffer = this.createVolatileImage(getWidth(), getHeight());
\r
138 Graphics2D g2d = backbuffer.createGraphics();
\r
139 g2d.clearRect(0, 0, getWidth(), getHeight());
\r
140 g2d.setClip(0, 0, getWidth(), getHeight());
\r
143 g.drawImage(backbuffer, 0, 0, this);
\r
146 public void paint(Graphics g) {
\r
150 public void processEvent(AWTEvent event) {
\r
151 if(event.getID() == ComponentEvent.COMPONENT_RESIZED) {
\r
152 backbuffer = this.createVolatileImage(getWidth(), getHeight());
\r
157 EventDelegator handler = sg.getEventDelegator();
\r
158 switch(event.getID()) {
\r
159 case MouseEvent.MOUSE_PRESSED:
\r
160 G2DFocusManager.INSTANCE.clearFocus();
\r
161 handler.mousePressed((MouseEvent)event);
\r
162 if(G2DFocusManager.INSTANCE.getFocusOwner() == null) {
\r
163 this.requestFocusInWindow();
\r
167 case MouseEvent.MOUSE_RELEASED:
\r
168 handler.mouseReleased((MouseEvent)event);
\r
171 case MouseEvent.MOUSE_CLICKED:
\r
172 handler.mouseClicked((MouseEvent)event);
\r
175 case MouseEvent.MOUSE_MOVED:
\r
176 handler.mouseMoved((MouseEvent)event);
\r
179 case MouseEvent.MOUSE_DRAGGED:
\r
180 handler.mouseDragged((MouseEvent)event);
\r
183 case MouseEvent.MOUSE_WHEEL:
\r
184 handler.mouseWheelMoved((MouseWheelEvent)event);
\r
187 case MouseEvent.MOUSE_ENTERED:
\r
188 handler.mouseEntered((MouseEvent)event);
\r
191 case MouseEvent.MOUSE_EXITED:
\r
192 handler.mouseExited((MouseEvent)event);
\r
195 case KeyEvent.KEY_PRESSED:
\r
196 handler.keyPressed((KeyEvent)event);
\r
199 case KeyEvent.KEY_RELEASED:
\r
200 handler.keyReleased((KeyEvent)event);
\r
203 case KeyEvent.KEY_TYPED:
\r
204 handler.keyTyped((KeyEvent)event);
\r
207 case FocusEvent.FOCUS_GAINED:
\r
208 handler.focusGained((FocusEvent)event);
\r
211 case FocusEvent.FOCUS_LOST:
\r
212 handler.focusLost((FocusEvent)event);
\r