blob: 9dafab84e6dc09f8b9611a2177c7ba8c6ed99002 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 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.graph;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.draw2d.AbsoluteBendpoint;
import org.eclipse.draw2d.BendpointConnectionRouter;
import org.eclipse.draw2d.ChopboxAnchor;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.LineBorder;
import org.eclipse.draw2d.PolygonDecoration;
import org.eclipse.draw2d.PolylineConnection;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.draw2d.graph.Edge;
import org.eclipse.draw2d.graph.Node;
import org.eclipse.draw2d.graph.NodeList;
import org.eclipse.draw2d.rap.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
/**
* @author Daniel Lee
*/
public abstract class AbstractGraphDemo {
/** Indicates whether the prime graph should be built */
protected static boolean buildPrime = false;
/** Contents of the demo */
protected IFigure contents;
/** Name of graph test method to run */
protected static String graphMethod;
/** Demo shell */
protected Shell shell;
private FigureCanvas fc;
static class TopOrBottomAnchor extends ChopboxAnchor {
public TopOrBottomAnchor(IFigure owner) {
super(owner);
}
public Point getLocation(Point reference) {
Point p;
p = getOwner().getBounds().getCenter();
getOwner().translateToAbsolute(p);
if (reference.y < p.y)
p = getOwner().getBounds().getTop();
else
p = getOwner().getBounds().getBottom();
getOwner().translateToAbsolute(p);
return p;
}
}
static class LeftOrRightAnchor extends ChopboxAnchor {
public LeftOrRightAnchor(IFigure owner) {
super(owner);
}
public Point getLocation(Point reference) {
Point p;
p = getOwner().getBounds().getCenter();
getOwner().translateToAbsolute(p);
if (reference.x() < p.x())
p = getOwner().getBounds().getLeft();
else
p = getOwner().getBounds().getRight();
getOwner().translateToAbsolute(p);
return p;
}
}
/**
* Builds a figure for the given edge and adds it to contents
*
* @param contents
* the parent figure to add the edge to
* @param edge
* the edge
*/
static void buildEdgeFigure(Figure contents, Edge edge) {
PolylineConnection conn = connection(edge);
conn.setForegroundColor(ColorConstants.gray);
PolygonDecoration dec = new PolygonDecoration();
conn.setTargetDecoration(dec);
conn.setPoints(edge.getPoints());
contents.add(conn);
}
/**
* Builds a Figure for the given node and adds it to contents
*
* @param contents
* the parent Figure to add the node to
* @param node
* the node to add
*/
static void buildNodeFigure(Figure contents, Node node) {
Label label;
label = new Label();
label.setBackgroundColor(ColorConstants.lightGray);
label.setOpaque(true);
label.setBorder(new LineBorder());
if (node.incoming.isEmpty())
label.setBorder(new LineBorder(2));
String text = node.data.toString();// + "(" + node.index
// +","+node.sortValue+ ")";
label.setText(text);
node.data = label;
contents.add(label, new Rectangle(node.x, node.y, node.width,
node.height));
}
// /**
// * Builds a Figure for the given prime edge
// * @param e the prime edge
// * @return the Figure for the prime edge
// */
// static PolylineConnection buildPrimeEdge(Edge e) {
// PolylineConnection line = new PolylineConnection();
//
// if (e.tree) {
// PolygonDecoration dec = new PolygonDecoration();
// dec.setLineWidth(2);
//
// line.setLineWidth(3);
// Label l = new Label (e.cut + "");
// l.setOpaque(true);
// line.add(l, new ConnectionLocator(line));
// } else {
// line.setLineStyle(Graphics.LINE_DOT);
// Label l = new Label (e.getSlack() + "");
// l.setOpaque(true);
// line.add(l, new ConnectionLocator(line));
// }
// return line;
// }
/**
* Builds a connection for the given edge
*
* @param e
* the edge
* @return the connection
*/
static PolylineConnection connection(Edge e) {
PolylineConnection conn = new PolylineConnection();
conn.setConnectionRouter(new BendpointConnectionRouter());
List bends = new ArrayList();
NodeList nodes = e.vNodes;
if (nodes != null) {
for (int i = 0; i < nodes.size(); i++) {
Node n = nodes.getNode(i);
int x = n.x;
int y = n.y;
bends.add(new AbsoluteBendpoint(x, y));
bends.add(new AbsoluteBendpoint(x, y + n.height));
}
}
conn.setRoutingConstraint(bends);
return conn;
}
/**
* @see org.eclipse.graph.AbstractExample#getContents()
*/
protected IFigure getContents() {
return null;
}
/**
* Returns the FigureCanvas
*
* @return this demo's FigureCanvas
*/
protected FigureCanvas getFigureCanvas() {
return fc;
}
/**
* Returns an array of strings that represent the names of the methods which
* build graphs for this graph demo
*
* @return array of graph building method names
*/
protected abstract String[] getGraphMethods();
/**
* @see org.eclipse.graph.AbstractExample#hookShell()
*/
protected void hookShell(Composite parent) {
Composite composite = new Composite(parent, 0);
composite.setLayoutData(new GridData(GridData.FILL_VERTICAL));
composite.setLayout(new GridLayout());
final org.eclipse.swt.widgets.Label nodesLabel = new org.eclipse.swt.widgets.Label(
composite, SWT.NONE);
nodesLabel.setText("Graph");
final Combo graphList = new Combo(composite, SWT.DROP_DOWN);
String[] graphMethods = getGraphMethods();
for (int i = 0; i < graphMethods.length; i++) {
if (graphMethods[i] != null)
graphList.add(graphMethods[i]);
}
setGraphMethod(graphMethods[0]);
graphList.setText(graphMethod);
graphList.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
setGraphMethod(graphList.getItem(graphList.getSelectionIndex()));
getFigureCanvas().setContents(getContents());
}
public void widgetDefaultSelected(SelectionEvent e) {
graphList.setText(graphMethod);
}
});
final org.eclipse.swt.widgets.Label seedLabel = new org.eclipse.swt.widgets.Label(
composite, SWT.NONE);
seedLabel.setText("Build Prime Graph");
final Button primeGraphButton = new Button(composite, SWT.CHECK);
primeGraphButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
buildPrime = !buildPrime;
getFigureCanvas().setContents(getContents());
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
}
/**
* Runs the demo.
*/
protected void run() {
Display d = Display.getDefault();
shell = new Shell(d);
String appName = getClass().getName();
appName = appName.substring(appName.lastIndexOf('.') + 1);
hookShell(shell);
shell.setText(appName);
shell.setLayout(new GridLayout(2, false));
setFigureCanvas(new FigureCanvas(shell));
getFigureCanvas().setContents(contents = getContents());
getFigureCanvas().getViewport().setContentsTracksHeight(true);
getFigureCanvas().getViewport().setContentsTracksWidth(true);
getFigureCanvas().setLayoutData(new GridData(GridData.FILL_BOTH));
shell.setSize(1100, 700);
shell.open();
while (!shell.isDisposed())
while (!d.readAndDispatch())
d.sleep();
}
/**
* Runs the demo.
*/
public void run(Composite parent) {
Composite main = new Composite(parent, SWT.NONE);
String appName = getClass().getName();
appName = appName.substring(appName.lastIndexOf('.') + 1);
hookShell(main);
// main.setText(appName);
main.setLayout(new GridLayout(2, false));
setFigureCanvas(new FigureCanvas(main));
getFigureCanvas().setContents(contents = getContents());
getFigureCanvas().getViewport().setContentsTracksHeight(true);
getFigureCanvas().getViewport().setContentsTracksWidth(true);
getFigureCanvas().setLayoutData(new GridData(GridData.FILL_BOTH));
// shell.setSize(1100, 700);
// shell.open();
// while (!shell.isDisposed())
// while (!d.readAndDispatch())
// d.sleep();
}
/**
* Sets this demo's FigureCanvas
*
* @param canvas
* this demo's FigureCanvas
*/
protected void setFigureCanvas(FigureCanvas canvas) {
this.fc = canvas;
}
/**
* Sets the name of the method to call to build the graph
*
* @param method
* name of the method used to build the graph
*/
public static void setGraphMethod(String method) {
graphMethod = method;
}
}