Flowchart.java Source code

Java tutorial

Introduction

Here is the source code for Flowchart.java

Source

/*
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();
    }
}