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