SWT 2D Chart: Flowchart
/*
SWT/JFace in Action
GUI Design with Eclipse 3.0
Matthew Scarpino, Stephen Holder, Stanford Ng, and Laurent Mihalkovic
ISBN: 1932394273
Publisher: Manning
*/
import java.util.Enumeration;
import java.util.Hashtable;
import org.eclipse.draw2d.AbstractConnectionAnchor;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.FreeformLayeredPane;
import org.eclipse.draw2d.FreeformLayout;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.LightweightSystem;
import org.eclipse.draw2d.ManhattanConnectionRouter;
import org.eclipse.draw2d.MarginBorder;
import org.eclipse.draw2d.MouseEvent;
import org.eclipse.draw2d.MouseListener;
import org.eclipse.draw2d.MouseMotionListener;
import org.eclipse.draw2d.PolylineConnection;
import org.eclipse.draw2d.PolylineDecoration;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.draw2d.geometry.PrecisionPoint;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class Flowchart {
public static void main(String args[]) {
Shell shell = new Shell();
shell.setSize(200, 300);
shell.open();
shell.setText("Flowchart");
LightweightSystem lws = new LightweightSystem(shell);
ChartFigure flowchart = new ChartFigure();
lws.setContents(flowchart);
TerminatorFigure start = new TerminatorFigure();
start.setName("Start");
start.setBounds(new Rectangle(40, 20, 80, 20));
DecisionFigure dec = new DecisionFigure();
dec.setName("Should I?");
dec.setBounds(new Rectangle(30, 60, 100, 60));
ProcessFigure proc = new ProcessFigure();
proc.setName("Do it!");
proc.setBounds(new Rectangle(40, 140, 80, 40));
TerminatorFigure stop = new TerminatorFigure();
stop.setName("End");
stop.setBounds(new Rectangle(40, 200, 80, 20));
PathFigure path1 = new PathFigure();
path1.setSourceAnchor(start.outAnchor);
path1.setTargetAnchor(dec.inAnchor);
PathFigure path2 = new PathFigure();
path2.setSourceAnchor(dec.yesAnchor);
path2.setTargetAnchor(proc.inAnchor);
PathFigure path3 = new PathFigure();
path3.setSourceAnchor(dec.noAnchor);
path3.setTargetAnchor(stop.inAnchor);
PathFigure path4 = new PathFigure();
path4.setSourceAnchor(proc.outAnchor);
path4.setTargetAnchor(stop.inAnchor);
flowchart.add(start);
flowchart.add(dec);
flowchart.add(proc);
flowchart.add(stop);
flowchart.add(path1);
flowchart.add(path2);
flowchart.add(path3);
flowchart.add(path4);
new Dnd(start);
new Dnd(proc);
new Dnd(dec);
new Dnd(stop);
Display display = Display.getDefault();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
}
class ChartFigure extends FreeformLayeredPane {
public ChartFigure() {
setLayoutManager(new FreeformLayout());
setBorder(new MarginBorder(5));
setBackgroundColor(ColorConstants.white);
setOpaque(true);
}
}
class Dnd extends MouseMotionListener.Stub implements MouseListener {
public Dnd(IFigure figure) {
figure.addMouseMotionListener(this);
figure.addMouseListener(this);
}
Point start;
public void mouseReleased(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
public void mouseDoubleClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
start = e.getLocation();
}
public void mouseDragged(MouseEvent e) {
Point p = e.getLocation();
Dimension d = p.getDifference(start);
start = p;
Figure f = ((Figure) e.getSource());
f.setBounds(f.getBounds().getTranslated(d.width, d.height));
}
}
class TerminatorFigure extends ActivityFigure {
FixedAnchor inAnchor, outAnchor;
public TerminatorFigure() {
inAnchor = new FixedAnchor(this);
inAnchor.place = new Point(1, 0);
targetAnchors.put("in_term", inAnchor);
outAnchor = new FixedAnchor(this);
outAnchor.place = new Point(1, 2);
sourceAnchors.put("out_term", outAnchor);
}
public void paintFigure(Graphics g) {
Rectangle r = bounds;
g.drawArc(r.x + r.width / 8, r.y, r.width / 4, r.height - 1, 90, 180);
g.drawLine(r.x + r.width / 4, r.y, r.x + 3 * r.width / 4, r.y);
g.drawLine(r.x + r.width / 4, r.y + r.height - 1,
r.x + 3 * r.width / 4, r.y + r.height - 1);
g.drawArc(r.x + 5 * r.width / 8, r.y, r.width / 4, r.height - 1, 270,
180);
g.drawText(message, r.x + 3 * r.width / 8, r.y + r.height / 8);
}
}
class FixedAnchor extends AbstractConnectionAnchor {
Point place;
public FixedAnchor(IFigure owner) {
super(owner);
}
public Point getLocation(Point loc) {
Rectangle r = getOwner().getBounds();
int x = r.x + place.x * r.width / 2;
int y = r.y + place.y * r.height / 2;
Point p = new PrecisionPoint(x, y);
getOwner().translateToAbsolute(p);
return p;
}
}
class DecisionFigure extends ActivityFigure {
FixedAnchor inAnchor, yesAnchor, noAnchor;
public DecisionFigure() {
inAnchor = new FixedAnchor(this);
inAnchor.place = new Point(1, 0);
targetAnchors.put("in_dec", inAnchor);
noAnchor = new FixedAnchor(this);
noAnchor.place = new Point(2, 1);
sourceAnchors.put("no", noAnchor);
yesAnchor = new FixedAnchor(this);
yesAnchor.place = new Point(1, 2);
sourceAnchors.put("yes", yesAnchor);
}
public void paintFigure(Graphics g) {
Rectangle r = bounds;
PointList pl = new PointList(4);
pl.addPoint(r.x + r.width / 2, r.y);
pl.addPoint(r.x, r.y + r.height / 2);
pl.addPoint(r.x + r.width / 2, r.y + r.height - 1);
pl.addPoint(r.x + r.width, r.y + r.height / 2);
g.drawPolygon(pl);
g.drawText(message, r.x + r.width / 4 + 5, r.y + 3 * r.height / 8);
g.drawText("N", r.x + 7 * r.width / 8, r.y + 3 * r.height / 8);
g.drawText("Y", r.x + r.width / 2 - 2, r.y + 3 * r.height / 4);
}
}
class PathFigure extends PolylineConnection {
public PathFigure() {
setTargetDecoration(new PolylineDecoration());
setConnectionRouter(new ManhattanConnectionRouter());
}
}
class ProcessFigure extends ActivityFigure {
FixedAnchor inAnchor, outAnchor;
public ProcessFigure() {
inAnchor = new FixedAnchor(this);
inAnchor.place = new Point(1, 0);
targetAnchors.put("in_proc", inAnchor);
outAnchor = new FixedAnchor(this);
outAnchor.place = new Point(1, 2);
sourceAnchors.put("out_proc", outAnchor);
}
public void paintFigure(Graphics g) {
Rectangle r = bounds;
g.drawText(message, r.x + r.width / 4, r.y + r.height / 4);
g.drawRectangle(r.x, r.y, r.width - 1, r.height - 1);
}
}
abstract class ActivityFigure extends Figure {
Rectangle r = new Rectangle();
Hashtable targetAnchors = new Hashtable();
Hashtable sourceAnchors = new Hashtable();
String message = new String();
public void setName(String msg) {
message = msg;
repaint();
}
public ConnectionAnchor ConnectionAnchorAt(Point p) {
ConnectionAnchor closest = null;
long min = Long.MAX_VALUE;
Hashtable conn = getSourceConnectionAnchors();
conn.putAll(getTargetConnectionAnchors());
Enumeration e = conn.elements();
while (e.hasMoreElements()) {
ConnectionAnchor c = (ConnectionAnchor) e.nextElement();
Point p2 = c.getLocation(null);
long d = p.getDistance2(p2);
if (d < min) {
min = d;
closest = c;
}
}
return closest;
}
public ConnectionAnchor getSourceConnectionAnchor(String name) {
return (ConnectionAnchor) sourceAnchors.get(name);
}
public ConnectionAnchor getTargetConnectionAnchor(String name) {
return (ConnectionAnchor) targetAnchors.get(name);
}
public String getSourceAnchorName(ConnectionAnchor c) {
Enumeration e = sourceAnchors.keys();
String name;
while (e.hasMoreElements()) {
name = (String) e.nextElement();
if (sourceAnchors.get(name).equals(c))
return name;
}
return null;
}
public String getTargetAnchorName(ConnectionAnchor c) {
Enumeration e = targetAnchors.keys();
String name;
while (e.hasMoreElements()) {
name = (String) e.nextElement();
if (targetAnchors.get(name).equals(c))
return name;
}
return null;
}
public ConnectionAnchor getSourceConnectionAnchorAt(Point p) {
ConnectionAnchor closest = null;
long min = Long.MAX_VALUE;
Enumeration e = getSourceConnectionAnchors().elements();
while (e.hasMoreElements()) {
ConnectionAnchor c = (ConnectionAnchor) e.nextElement();
Point p2 = c.getLocation(null);
long d = p.getDistance2(p2);
if (d < min) {
min = d;
closest = c;
}
}
return closest;
}
public Hashtable getSourceConnectionAnchors() {
return sourceAnchors;
}
public ConnectionAnchor getTargetConnectionAnchorAt(Point p) {
ConnectionAnchor closest = null;
long min = Long.MAX_VALUE;
Enumeration e = getTargetConnectionAnchors().elements();
while (e.hasMoreElements()) {
ConnectionAnchor c = (ConnectionAnchor) e.nextElement();
Point p2 = c.getLocation(null);
long d = p.getDistance2(p2);
if (d < min) {
min = d;
closest = c;
}
}
return closest;
}
public Hashtable getTargetConnectionAnchors() {
return targetAnchors;
}
}
class FigureFactory {
public static IFigure createTerminatorFigure() {
return new TerminatorFigure();
}
public static IFigure createDecisionFigure() {
return new DecisionFigure();
}
public static IFigure createProcessFigure() {
return new ProcessFigure();
}
public static PathFigure createPathFigure() {
return new PathFigure();
}
public static ChartFigure createChartFigure() {
return new ChartFigure();
}
}
Related examples in the same category