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.event.MouseEvent;
\r
22 import java.awt.event.MouseListener;
\r
23 import java.awt.event.MouseMotionListener;
\r
24 import java.awt.event.WindowEvent;
\r
25 import java.awt.event.WindowListener;
\r
26 import java.awt.geom.Rectangle2D;
\r
27 import java.util.ArrayList;
\r
28 import java.util.Collection;
\r
29 import java.util.HashMap;
\r
30 import java.util.Map;
\r
32 import org.simantics.g2d.routing.algorithm1.Penalty;
\r
33 import org.simantics.g2d.routing.algorithm1.Rectangle;
\r
34 import org.simantics.g2d.routing.algorithm1.StopSet;
\r
35 import org.simantics.g2d.routing.algorithm1.StopSet.IStopProcedure;
\r
36 import org.simantics.g2d.routing.algorithm1.StopSet.Line;
\r
37 import org.simantics.g2d.routing.algorithm1.StopSet.Stop;
\r
39 public class TestStopSet extends Frame {
\r
41 private static final long serialVersionUID = 2181877722124429003L;
\r
43 Collection<Rectangle> rectangles = new ArrayList<Rectangle>();
\r
47 double startX, startY;
\r
49 int mouseButtons = 0;
\r
51 public TestStopSet() {
\r
52 addWindowListener(new WindowListener() {
\r
55 public void windowActivated(WindowEvent e) {
\r
59 public void windowClosed(WindowEvent e) {
\r
63 public void windowClosing(WindowEvent e) {
\r
68 public void windowDeactivated(WindowEvent e) {
\r
72 public void windowDeiconified(WindowEvent e) {
\r
76 public void windowIconified(WindowEvent e) {
\r
80 public void windowOpened(WindowEvent e) {
\r
85 addMouseListener(new MouseListener() {
\r
88 public void mouseClicked(MouseEvent e) {
\r
89 // TODO Auto-generated method stub
\r
94 public void mouseEntered(MouseEvent e) {
\r
95 // TODO Auto-generated method stub
\r
100 public void mouseExited(MouseEvent e) {
\r
101 // TODO Auto-generated method stub
\r
106 public void mousePressed(MouseEvent e) {
\r
107 mouseButtons = e.getButton();
\r
108 curX = startX = e.getX();
\r
109 curY = startY = e.getY();
\r
110 if(e.getButton() == MouseEvent.BUTTON2)
\r
112 else if(e.getButton() == MouseEvent.BUTTON3)
\r
118 public void mouseReleased(MouseEvent e) {
\r
120 double x0 = startX;
\r
121 double y0 = startY;
\r
122 double x1 = e.getX();
\r
123 double y1 = e.getY();
\r
134 Rectangle rect = new Rectangle(x0, y0, x1, y1);
\r
136 if(e.getButton() == MouseEvent.BUTTON1)
\r
137 rectangles.add(rect);
\r
138 else if(e.getButton() == MouseEvent.BUTTON2)
\r
140 else if(e.getButton() == MouseEvent.BUTTON3)
\r
148 addMouseMotionListener(new MouseMotionListener() {
\r
151 public void mouseDragged(MouseEvent e) {
\r
158 public void mouseMoved(MouseEvent e) {
\r
168 public void paint(Graphics _g) {
\r
169 final Graphics2D g = (Graphics2D)_g;
\r
170 Map<Object, Object> hints = new HashMap<Object, Object>();
\r
171 hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
\r
172 hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
\r
173 g.addRenderingHints(hints);
\r
175 /*Path2D path = new Path2D.Double();
\r
176 path.moveTo(0.0, 0.0);
\r
177 path.lineTo(100.0, 100.0);
\r
178 path.lineTo(400.0, 100.0);
\r
183 g.setColor(Color.GRAY);
\r
184 g.setStroke(new BasicStroke(1.0f));
\r
185 for(Rectangle rect : rectangles)
\r
186 drawRectangle(g, rect.x0, rect.y0, rect.x1, rect.y1);
\r
188 if(source != null) {
\r
189 g.setColor(Color.BLUE);
\r
190 drawRectangle(g, source.x0, source.y0, source.x1, source.y1);
\r
192 if(target != null) {
\r
193 g.setColor(Color.GREEN);
\r
194 drawRectangle(g, target.x0, target.y0, target.x1, target.y1);
\r
196 if(mouseButtons != 0) {
\r
197 if(mouseButtons == 1)
\r
198 g.setColor(Color.BLACK);
\r
199 else if(mouseButtons == 2)
\r
200 g.setColor(Color.BLUE);
\r
201 else if(mouseButtons == 3)
\r
202 g.setColor(Color.GREEN);
\r
203 drawRectangle(g, startX, startY, curX, curY);
\r
206 Collection<Stop> stops = new ArrayList<Stop>(rectangles.size());
\r
207 Penalty penalty = new Penalty(100.0, 0.0);
\r
208 for(Rectangle rect : rectangles)
\r
209 stops.add(new Stop(penalty, rect.x0, rect.x1, rect.y0));
\r
210 StopSet ss = new StopSet(stops);
\r
212 if(target != null) {
\r
213 g.setColor(Color.GREEN);
\r
214 g.setStroke(new BasicStroke(1.0f));
\r
215 drawFront(g, ss, target.x0, target.x1, target.y1);
\r
219 public final double PADDING = 2.0;
\r
221 void drawFront(final Graphics2D g, final StopSet ss, final double x0, final double x1, final double y) {
\r
222 ss.findStops(x0, x1, y, new IStopProcedure() {
\r
225 public void blockEnd(double y1) {
\r
226 if(y1 == Double.POSITIVE_INFINITY)
\r
228 Rectangle2D rect = new Rectangle2D.Double(x0 + PADDING, y + PADDING, x1-x0 - PADDING*2, y1-y - PADDING*2);
\r
233 public void continuation(double min, double max, int pos, Line line) {
\r
234 drawFront(g, ss, pos, line, min, max);
\r
240 void drawFront(final Graphics2D g, final StopSet ss, int pos, final Line line, final double x0, final double x1) {
\r
241 StopSet.continueStop(pos, line, x0, x1, new IStopProcedure() {
\r
244 public void blockEnd(double y1) {
\r
245 if(y1 == Double.POSITIVE_INFINITY)
\r
247 Rectangle2D rect = new Rectangle2D.Double(x0 + PADDING, line.y + PADDING, x1-x0 - PADDING*2, y1-line.y - PADDING*2);
\r
252 public void continuation(double min, double max, int pos, Line line) {
\r
253 drawFront(g, ss, pos, line, min, max);
\r
259 static void drawRectangle(Graphics2D g, double x0, double y0, double x1, double y1) {
\r
270 Rectangle2D rect = new Rectangle2D.Double(x0, y0, x1-x0, y1-y0);
\r
274 Image offScreenImage;
\r
275 int offScreenImageWidth;
\r
276 int offScreenImageHeight;
\r
278 public void update( Graphics g ) {
\r
279 if ( offScreenImage == null || getWidth() != offScreenImageWidth || getHeight() != offScreenImageHeight) {
\r
280 offScreenImageWidth = getWidth();
\r
281 offScreenImageHeight = getHeight();
\r
282 offScreenImage = createImage(offScreenImageWidth, offScreenImageHeight);
\r
285 Graphics gOffScreenImage = offScreenImage.getGraphics();
\r
287 gOffScreenImage.clearRect(0, 0, getWidth(), getHeight());
\r
288 paint( gOffScreenImage );
\r
290 g.drawImage(offScreenImage, 0, 0, this);
\r
292 gOffScreenImage.dispose();
\r
295 public static void main(String[] args) {
\r