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.g2d.routing.test;
\r
14 import java.awt.BasicStroke;
\r
15 import java.awt.Color;
\r
16 import java.awt.Frame;
\r
17 import java.awt.Graphics;
\r
18 import java.awt.Graphics2D;
\r
19 import java.awt.Image;
\r
20 import java.awt.RenderingHints;
\r
21 import java.awt.Stroke;
\r
22 import java.awt.event.KeyEvent;
\r
23 import java.awt.event.KeyListener;
\r
24 import java.awt.event.MouseEvent;
\r
25 import java.awt.event.MouseListener;
\r
26 import java.awt.event.MouseMotionListener;
\r
27 import java.awt.event.WindowEvent;
\r
28 import java.awt.event.WindowListener;
\r
29 import java.awt.geom.Ellipse2D;
\r
30 import java.awt.geom.Path2D;
\r
31 import java.awt.geom.Rectangle2D;
\r
32 import java.util.ArrayList;
\r
33 import java.util.Arrays;
\r
34 import java.util.HashMap;
\r
35 import java.util.List;
\r
36 import java.util.Map;
\r
38 import org.simantics.g2d.routing.Connection;
\r
39 import org.simantics.g2d.routing.Obstacle;
\r
40 import org.simantics.g2d.routing.algorithm1.RouterOld;
\r
42 public class TestRouter extends Frame {
\r
44 private static final long serialVersionUID = 2181877722124429003L;
\r
46 List<Obstacle> obstacles = new ArrayList<Obstacle>();
\r
47 List<Connection> connections = new ArrayList<Connection>();
\r
48 Connection connection;
\r
50 RouterOld router = new RouterOld();
\r
52 double startX, startY;
\r
54 int mouseButtons = 0;
\r
56 public TestRouter() {
\r
57 addWindowListener(new WindowListener() {
\r
60 public void windowActivated(WindowEvent e) {
\r
64 public void windowClosed(WindowEvent e) {
\r
68 public void windowClosing(WindowEvent e) {
\r
73 public void windowDeactivated(WindowEvent e) {
\r
77 public void windowDeiconified(WindowEvent e) {
\r
81 public void windowIconified(WindowEvent e) {
\r
85 public void windowOpened(WindowEvent e) {
\r
90 addMouseListener(new MouseListener() {
\r
93 public void mouseClicked(MouseEvent e) {
\r
94 // TODO Auto-generated method stub
\r
99 public void mouseEntered(MouseEvent e) {
\r
100 // TODO Auto-generated method stub
\r
105 public void mouseExited(MouseEvent e) {
\r
106 // TODO Auto-generated method stub
\r
111 public void mousePressed(MouseEvent e) {
\r
112 mouseButtons = e.getButton();
\r
113 curX = startX = e.getX();
\r
114 curY = startY = e.getY();
\r
115 if(e.getButton() == MouseEvent.BUTTON3) {
\r
116 if(connection == null)
\r
117 connection = new Connection(new double[0], 0xf, 0xf);
\r
118 connection.routePath =
\r
119 Arrays.copyOf(connection.routePath, connection.routePath.length+2);
\r
120 connection.routePath[connection.routePath.length-2] = curX;
\r
121 connection.routePath[connection.routePath.length-1] = curY;
\r
127 public void mouseReleased(MouseEvent e) {
\r
129 if(e.getButton() == MouseEvent.BUTTON1) {
\r
130 double x0 = startX;
\r
131 double y0 = startY;
\r
132 double x1 = e.getX();
\r
133 double y1 = e.getY();
\r
144 Obstacle obs = new Obstacle(new Rectangle2D.Double(x0, y0, x1-x0, y1-y0));
\r
145 obstacles.add(obs);
\r
146 router.addObstacle(obs);
\r
154 addMouseMotionListener(new MouseMotionListener() {
\r
157 public void mouseDragged(MouseEvent e) {
\r
164 public void mouseMoved(MouseEvent e) {
\r
167 if(connection != null)
\r
173 addKeyListener(new KeyListener() {
\r
176 public void keyPressed(KeyEvent e) {
\r
177 if(e.getKeyChar() == 'c') {
\r
178 if(connection != null) {
\r
179 connection.routePath =
\r
180 Arrays.copyOf(connection.routePath, connection.routePath.length+2);
\r
181 connection.routePath[connection.routePath.length-2] = curX;
\r
182 connection.routePath[connection.routePath.length-1] = curY;
\r
184 connections.add(connection);
\r
185 router.addConnection(connection);
\r
193 public void keyReleased(KeyEvent e) {
\r
194 // TODO Auto-generated method stub
\r
199 public void keyTyped(KeyEvent e) {
\r
200 // TODO Auto-generated method stub
\r
211 public void paint(Graphics _g) {
\r
212 final Graphics2D g = (Graphics2D)_g;
\r
213 Map<Object, Object> hints = new HashMap<Object, Object>();
\r
214 hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
\r
215 hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
\r
216 g.addRenderingHints(hints);
\r
218 /*Path2D path = new Path2D.Double();
\r
219 path.moveTo(0.0, 0.0);
\r
220 path.lineTo(100.0, 100.0);
\r
221 path.lineTo(400.0, 100.0);
\r
226 g.setColor(Color.GRAY);
\r
227 g.setStroke(new BasicStroke(1.0f));
\r
228 for(Obstacle obs : obstacles)
\r
229 g.fill(obs.shape);
\r
231 Obstacle curObs = null;
\r
232 if(mouseButtons == 1) {
\r
233 double x0 = startX;
\r
234 double y0 = startY;
\r
247 curObs = new Obstacle(new Rectangle2D.Double(x0, y0, x1-x0, y1-y0));
\r
248 g.fill(curObs.shape);
\r
249 router.addObstacle(curObs);
\r
252 Connection curConnection = null;
\r
253 if(connection != null) {
\r
254 double[] points = Arrays.copyOf(connection.routePath, connection.routePath.length+2);
\r
255 points[points.length-2] = curX;
\r
256 points[points.length-1] = curY;
\r
257 curConnection = new Connection(points, connection.startDirections, connection.endDirections);
\r
258 router.addConnection(curConnection);
\r
261 g.setColor(Color.BLACK);
\r
262 g.setStroke(new BasicStroke(3.0f));
\r
263 for(Connection c : connections)
\r
265 if(curConnection != null) {
\r
266 draw(g, curConnection);
\r
267 router.removeConnection(curConnection);
\r
270 router.removeObstacle(curObs);
\r
273 public void draw(Graphics2D g, Connection c) {
\r
274 Path2D path = router.getPath(c);
\r
277 g.setColor(Color.WHITE);
\r
278 g.setStroke(stroke5);
\r
280 g.setColor(Color.BLACK);
\r
281 g.setStroke(stroke1);
\r
283 double[] points = c.routePath;
\r
284 for(int i=0;i<points.length;i+=2) {
\r
285 double x = points[i];
\r
286 double y = points[i+1];
\r
287 g.setStroke(stroke1);
\r
288 g.draw(new Ellipse2D.Double(x-5.0, y-5.0, 10.0, 10.0));
\r
292 static final Stroke stroke1 = new BasicStroke(1.0f);
\r
293 static final Stroke stroke3 = new BasicStroke(3.0f);
\r
294 static final Stroke stroke5 = new BasicStroke(5.0f);
\r
296 static void drawRectangle(Graphics2D g, double x0, double y0, double x1, double y1) {
\r
311 Rectangle2D rect = new Rectangle2D.Double(x0, y0, x1-x0, y1-y0);
\r
315 Image offScreenImage;
\r
316 int offScreenImageWidth;
\r
317 int offScreenImageHeight;
\r
319 public void update( Graphics g ) {
\r
320 if ( offScreenImage == null || getWidth() != offScreenImageWidth || getHeight() != offScreenImageHeight) {
\r
321 offScreenImageWidth = getWidth();
\r
322 offScreenImageHeight = getHeight();
\r
323 offScreenImage = createImage(offScreenImageWidth, offScreenImageHeight);
\r
326 Graphics gOffScreenImage = offScreenImage.getGraphics();
\r
328 gOffScreenImage.clearRect(0, 0, getWidth(), getHeight());
\r
329 paint( gOffScreenImage );
\r
331 g.drawImage(offScreenImage, 0, 0, this);
\r
333 gOffScreenImage.dispose();
\r
336 public static void main(String[] args) {
\r