blob: 09554a7842297d0a033f54e8886f6e345e835b94 [file] [log] [blame]
/*******************************************************************************
* 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();
}
}