/******************************************************************************* * Copyright (c) 2003, 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.draw2d.examples.cg; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.Ellipse; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.MouseEvent; import org.eclipse.draw2d.MouseListener; import org.eclipse.draw2d.MouseMotionListener; import org.eclipse.draw2d.RectangleFigure; import org.eclipse.draw2d.examples.AbstractExample; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.PointList; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.draw2d.graph.Path; import org.eclipse.draw2d.graph.ShortestPathRouter; /** * @since 3.0 */ public class ObstructionExample extends AbstractExample { static ShortestPathRouter router = new ShortestPathRouter(); static int COUNT = 0; static List sourceList = new ArrayList(); static List targetList = new ArrayList(); static Map obstacleMap = new HashMap(); static List paths = new ArrayList(); static class EllipseDragFigure extends Ellipse { protected Point loc; protected EllipseDragFigure oFigure; protected EllipseDragFigure thisFigure; protected boolean isSource; protected Path path; private static Dimension offset = new Dimension(); public EllipseDragFigure(Point location, boolean isItSource) { loc = location; thisFigure = this; this.isSource = isItSource; setBackgroundColor(ColorConstants.darkBlue()); addMouseListener(new MouseListener.Stub() { public void mousePressed(MouseEvent event) { event.consume(); offset.setWidth(event.x - getLocation().x()); offset.setHeight(event.y - getLocation().y()); } public void mouseReleased(MouseEvent event) { offset.setWidth(0); offset.setHeight(0); if (event.button == 3) { getParent().remove(oFigure); getParent().remove(thisFigure); if (isSource) { sourceList.remove(loc); targetList.remove(oFigure.loc); router.removePath(path); paths.remove(path); } else { sourceList.remove(oFigure.loc); targetList.remove(loc); router.removePath(path); paths.remove(path); } } } }); addMouseMotionListener(new MouseMotionListener.Stub() { public void mouseDragged(MouseEvent event) { Rectangle rect = getBounds().getCopy(); rect.setX(event.x - offset.width()); rect.setY(event.y - offset.height()); setBounds(rect); int index = 0; if (isSource) { index = sourceList.indexOf(loc); router.removePath(path); paths.remove(path); sourceList.remove(loc); loc = new Point(rect.x() + 10, rect.y() + 10); sourceList.add(index, loc); path = new Path(loc, (Point) targetList.get(index)); router.addPath(path); paths.add(path); oFigure.path = path; } else { index = targetList.indexOf(loc); router.removePath(path); paths.remove(path); targetList.remove(loc); loc = new Point(rect.x() + 10, rect.y() + 10); targetList.add(index, loc); path = new Path((Point) sourceList.get(index), loc); router.addPath(path); paths.add(path); oFigure.path = path; } getParent().repaint(); } }); } public void addOtherFigure(EllipseDragFigure figure) { this.oFigure = figure; } } static class DragFigure extends RectangleFigure { private static Dimension offset = new Dimension(); private DragFigure thisFigure; public DragFigure() { thisFigure = this; setBackgroundColor(ColorConstants.green()); addMouseListener(new MouseListener.Stub() { public void mousePressed(MouseEvent event) { event.consume(); offset.setWidth(event.x - getLocation().x()); offset.setHeight(event.y - getLocation().y()); } public void mouseReleased(MouseEvent event) { offset.setWidth(0); offset.setHeight(0); if (event.button == 3) { getParent().remove(thisFigure); router.removeObstacle((Rectangle) ObstructionExample.obstacleMap .get(thisFigure)); ObstructionExample.obstacleMap.remove(thisFigure); } } }); addMouseMotionListener(new MouseMotionListener.Stub() { public void mouseDragged(MouseEvent event) { Rectangle rect = getBounds().getCopy(); rect.setX(event.x - offset.width()); rect.setY(event.y - offset.height()); router.updateObstacle( (Rectangle) ObstructionExample.obstacleMap .get(thisFigure), rect); ObstructionExample.obstacleMap.put(thisFigure, rect); setBounds(rect); getParent().repaint(); } }); } public void paint(Graphics graphics) { super.paint(graphics); Rectangle b = getBounds(); Point p = b.getCenter().translate(-22, -15); graphics.drawString("y:" + b.y() + "h:" + b.height(), p); p.setY(p.y() + 12); graphics.drawString("x:" + b.x() + "w:" + b.width(), p); } } class TestFigure extends Figure { Map obstacleMap = new HashMap(); List obstaclesList = new ArrayList(); boolean showSegs = false; public TestFigure() { router = new ShortestPathRouter(); addMouseListener(new MouseListener.Stub() { private Point pressPoint; private boolean firstPointCreated = false; private EllipseDragFigure figure; private Point pPoint; public void mousePressed(MouseEvent event) { event.consume(); pPoint = event.getLocation(); } public void mouseReleased(MouseEvent event) { if (event.button == 1) { if (Math.abs(pPoint.x() - event.getLocation().x()) > 10) { DragFigure f = new DragFigure(); add(f); f.setBounds(new Rectangle(pPoint, event .getLocation())); Rectangle bounds = new Rectangle(pPoint, event.getLocation()); router.addObstacle(bounds); ObstructionExample.obstacleMap.put(f, bounds); } } else if (event.button == 3) { if (firstPointCreated) { targetList.add(event.getLocation()); EllipseDragFigure eFigure = new EllipseDragFigure( event.getLocation(), false); eFigure.setBounds(new Rectangle(event.getLocation() .x() - 10, event.getLocation().y() - 10, 20, 20)); add(eFigure); firstPointCreated = false; figure.addOtherFigure(eFigure); eFigure.addOtherFigure(figure); Path path = new Path(pressPoint, event.getLocation()); router.addPath(path); paths.add(path); eFigure.path = path; figure.path = path; figure = null; pressPoint = null; path = null; } else { sourceList.add(event.getLocation()); pressPoint = event.getLocation(); EllipseDragFigure eFigure = new EllipseDragFigure( event.getLocation(), true); eFigure.setBounds(new Rectangle(event.getLocation() .x() - 10, event.getLocation().y() - 10, 20, 20)); add(eFigure); figure = eFigure; firstPointCreated = true; } } else showSegs = !showSegs; getParent().repaint(); } }); DragFigure f; Random r = new Random(0); int rowSize = (int) Math.sqrt(COUNT); for (int i = 0; i < COUNT; i++) { add(f = new DragFigure()); f.setBounds(new Rectangle((i / rowSize) * 101 + (i) % 3 * 10 + 100, i % rowSize * 101 + (i % 7) * 6, 50, 80 + (int) (r.nextDouble() * 10))); } for (int i = 0; i < COUNT; i++) { Rectangle bounds = ((IFigure) obstaclesList.get(i)).getBounds() .getCopy(); ObstructionExample.obstacleMap .put(obstaclesList.get(i), bounds); router.addObstacle(bounds); } } public void add(IFigure figure, Object constraint, int index) { if (figure instanceof DragFigure) obstaclesList.add(figure); super.add(figure, constraint, index); } protected void paintBorder(Graphics g) { router.solve(); g.setLineWidth(1); g.setForegroundColor(ColorConstants.blue()); g.setBackgroundColor(ColorConstants.button()); // draw paths Path path = null; for (int n = 0; n < paths.size(); n++) { path = (Path) paths.get(n); PointList pList = path.getPoints(); for (int i = 1; i < pList.size(); i++) g.drawLine(pList.getPoint(i - 1), pList.getPoint(i)); } } public void remove(IFigure figure) { if (figure instanceof DragFigure) { obstaclesList.remove(figure); } super.remove(figure); repaint(); } } /** * @see org.eclipse.draw2d.examples.AbstractExample#getContents() */ protected IFigure getContents() { Figure f = new TestFigure(); f.setPreferredSize(900, 700); return f; } public static void main(String[] args) { new ObstructionExample().run(); } }