// /******************************************************************************* // * Copyright 2005, CHISEL Group, University of Victoria, Victoria, BC, Canada. // * 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: The Chisel Group, University of Victoria // ******************************************************************************/ // package org.eclipse.zest.layouts.exampleUses; // // import java.util.ArrayList; // import java.util.Date; // import java.util.Iterator; // import java.util.List; // // import org.eclipse.core.runtime.IProgressMonitor; // import org.eclipse.jface.dialogs.ProgressMonitorDialog; // import org.eclipse.swt.SWT; // import org.eclipse.swt.SWTError; // import org.eclipse.swt.events.ControlEvent; // import org.eclipse.swt.events.ControlListener; // import org.eclipse.swt.events.DisposeEvent; // import org.eclipse.swt.events.DisposeListener; // import org.eclipse.swt.events.MouseEvent; // import org.eclipse.swt.events.MouseListener; // import org.eclipse.swt.events.MouseMoveListener; // import org.eclipse.swt.events.PaintEvent; // import org.eclipse.swt.events.PaintListener; // import org.eclipse.swt.events.SelectionEvent; // import org.eclipse.swt.events.SelectionListener; // import org.eclipse.swt.graphics.Color; // import org.eclipse.swt.graphics.GC; // import org.eclipse.swt.graphics.Image; // import org.eclipse.swt.graphics.Point; // import org.eclipse.swt.graphics.Rectangle; // import org.eclipse.swt.layout.FillLayout; // import org.eclipse.swt.layout.GridData; // import org.eclipse.swt.layout.GridLayout; // import org.eclipse.swt.widgets.Canvas; // import org.eclipse.swt.widgets.Composite; // import org.eclipse.swt.widgets.Display; // import org.eclipse.swt.widgets.Label; // import org.eclipse.swt.widgets.Shell; // import org.eclipse.swt.widgets.ToolBar; // import org.eclipse.swt.widgets.ToolItem; // import org.eclipse.zest.layouts.InvalidLayoutConfiguration; // import org.eclipse.zest.layouts.LayoutAlgorithm; // import org.eclipse.zest.layouts.LayoutBendPoint; // import org.eclipse.zest.layouts.LayoutEntity; // import org.eclipse.zest.layouts.LayoutRelationship; // import org.eclipse.zest.layouts.LayoutStyles; // import org.eclipse.zest.layouts.algorithms.GridLayoutAlgorithm; // import org.eclipse.zest.layouts.algorithms.HorizontalLayoutAlgorithm; // import org.eclipse.zest.layouts.algorithms.HorizontalTreeLayoutAlgorithm; // import org.eclipse.zest.layouts.algorithms.RadialLayoutAlgorithm; // import org.eclipse.zest.layouts.algorithms.SpringLayoutAlgorithm; // import org.eclipse.zest.layouts.algorithms.TreeLayoutAlgorithm; // import org.eclipse.zest.layouts.algorithms.VerticalLayoutAlgorithm; // import org.eclipse.zest.layouts.exampleStructures.SimpleNode; // import org.eclipse.zest.layouts.exampleStructures.SimpleRelationship; // import org.eclipse.zest.layouts.progress.ProgressEvent; // import org.eclipse.zest.layouts.progress.ProgressListener; // // /** // * @author Rob Lintern // * @author Ian Bull // * A simple example of using layout algorithms with a SWT application. // */ // public class SimpleSWTExample { // // private static final Color BLACK = new Color(Display.getDefault(), 0, 0, 0); // private static final Color NODE_NORMAL_COLOR = new // Color(Display.getDefault(), 225, 225, 255); // private static final Color NODE_SELECTED_COLOR = new // Color(Display.getDefault(), 255, 125, 125); // private static final Color NODE_ADJACENT_COLOR = new // Color(Display.getDefault(), 255, 200, 125); // private static final Color BORDER_NORMAL_COLOR = new // Color(Display.getDefault(), 0, 0, 0); // private static final Color BORDER_SELECTED_COLOR = new // Color(Display.getDefault(), 255, 0, 0); // private static final Color BORDER_ADJACENT_COLOR = new // Color(Display.getDefault(), 255, 128, 0); // private static final Color RELATIONSHIP_COLOR = new // Color(Display.getDefault(), 192, 192, 225); // private static final Color RELATIONSHIP_HIGHLIGHT_COLOR = new // Color(Display.getDefault(), 255, 200, 125); // // private static final String[] NAMES = new String[] { "Peggy", "Rob", "Ian", // "Chris", "Simon", "Wendy", "Steven", "Kim", "Neil", "Dave", "John", // "Suzanne", "Jody", "Casey", "Bjorn", "Peter", "Erin", "Lisa", "Jennie", // "Liz", "Bert", "Ryan", "Nick", "Amy", "Lee", "Me", "You", "Max", "NCI", // "OWL", // "Ed", "Jamie", "Protege", "Matt", "Bryan", "Pete", "Sam", "Bob", "Katie", // "Bill", "Josh", "Davor", "Ken", "Jacob", "Norm", "Jim", "Maya", "Jill", // "Kit", "Jo", "Joe", "Andrew", "Charles", "Pat", "Patrick", "Jeremy", "Mike", // "Michael", "Patricia", "Marg", "Terry", "Emily", "Ben", "Holly", // "Joanna", "Joanne", "Evan", "Tom", "Dan", "Eric", "Corey", "Meghan", "Kevin", // "Nina", "Ron", "Daniel", "David", "Jeff", "Nathan", "Amanda", "Phil", // "Tricia", "Steph", "Stewart", "Stuart", "Bull", "Lintern", "Callendar", // "Thompson", "Rigby", "Adam", "Judith", "Cynthia", "Sarah", "Sara", // "Roger", "Andy", "Kris", "Mark", "Shane", "Spence", "Ivy", "Ivanna", "Julie", // "Justin", "Emile", "Toby", "Robin", "Rich", "Kathy", "Cathy", "Nicky", // "Ricky", "Danny", "Anne", "Ann", "Jen", "Robert", "Calvin", "Alvin", "Scott", // "Kumar" }; // // //private static final boolean RENDER_HIGH_QUALITY = true; // // private static final int INITIAL_PANEL_WIDTH = 800; // private static final int INITIAL_PANEL_HEIGHT = 600; // private static final double INITIAL_NODE_WIDTH = 20; // private static final double INITIAL_NODE_HEIGHT = 15; // // protected static ArrayList algorithms = new ArrayList(); // { // algorithms.add(new // SpringLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING)); // algorithms.add(new TreeLayoutAlgorithm(LayoutStyles.NONE)); // algorithms.add(new HorizontalTreeLayoutAlgorithm(LayoutStyles.NONE)); // algorithms.add(new RadialLayoutAlgorithm(LayoutStyles.NONE)); // algorithms.add(new GridLayoutAlgorithm(LayoutStyles.NONE)); // algorithms.add(new HorizontalLayoutAlgorithm(LayoutStyles.NONE)); // algorithms.add(new VerticalLayoutAlgorithm(LayoutStyles.NONE)); // } // // protected static ArrayList algorithmNames = new ArrayList(); // { // algorithmNames.add("Spring"); // algorithmNames.add("Fade"); // algorithmNames.add("Tree - V"); // algorithmNames.add("Tree - H"); // algorithmNames.add("Radial"); // algorithmNames.add("Grid"); // algorithmNames.add("Horizontal"); // algorithmNames.add("Vertical"); // } // // protected static ArrayList algorithmAnimates = new ArrayList(); // { // algorithmAnimates.add(Boolean.TRUE); // algorithmAnimates.add(Boolean.TRUE); // algorithmAnimates.add(Boolean.FALSE); // algorithmAnimates.add(Boolean.FALSE); // algorithmAnimates.add(Boolean.FALSE); // algorithmAnimates.add(Boolean.FALSE); // algorithmAnimates.add(Boolean.FALSE); // algorithmAnimates.add(Boolean.FALSE); // } // // //private long updateGUICount = 0; // private boolean animate = true; // private static boolean continuous = false; // private static boolean asynchronously = false; // // private Shell mainShell; // private Composite mainComposite; // private List entities; // private List relationships; // // private ToolBar toolBar; // private Label lblProgress; // // private LayoutAlgorithm currentLayoutAlgorithm; // protected SimpleNode selectedEntity; // protected SimpleNode hoverEntity; // // protected Point mouseDownPoint; // protected Point selectedEntityPositionAtMouseDown; // private long idCount = 0; // // public SimpleSWTExample(Display display) { // mainShell = new Shell(display); // mainShell.addControlListener(new ControlListener() { // public void controlMoved(ControlEvent e) { // } // // public void controlResized(ControlEvent e) { // mainShell.layout(true); // } // }); // GridLayout gridLayout = new GridLayout(1, true); // mainShell.setLayout(gridLayout); // GridData toolbarGridData = new GridData(GridData.HORIZONTAL_ALIGN_CENTER, // GridData.VERTICAL_ALIGN_BEGINNING, true, true); // toolBar = new ToolBar(mainShell, SWT.HORIZONTAL); // toolBar.setLayoutData(toolbarGridData); // toolBar.setLayout(new FillLayout(SWT.HORIZONTAL)); // // GridData progressGridData = new GridData(GridData.HORIZONTAL_ALIGN_CENTER, // GridData.VERTICAL_ALIGN_END, true, false); // progressGridData.widthHint = 300; // lblProgress = new Label(mainShell, SWT.NONE); // lblProgress.setLayoutData(progressGridData); // lblProgress.setText("Progress: "); // // for (int i = 0; i < algorithms.size(); i++) { // final LayoutAlgorithm algorithm = (LayoutAlgorithm) algorithms.get(i); // String algorithmName = (String) algorithmNames.get(i); // final boolean algorithmAnimate = ((Boolean) // algorithmAnimates.get(i)).booleanValue(); // ToolItem algorithmButton = new ToolItem(toolBar, SWT.PUSH); // algorithmButton.setText(algorithmName); // // new ToolItem(toolBar, SWT.SEPARATOR); // // algorithmButton.addSelectionListener(new SelectionListener() { // public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) { // currentLayoutAlgorithm = algorithm; // algorithm.setEntityAspectRatio((double) mainComposite.getClientArea().width / // (double) mainComposite.getClientArea().height); // animate = algorithmAnimate; // performLayout(false); // } // // public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) { // } // }); // } // // ToolItem redrawButton = new ToolItem(toolBar, SWT.PUSH); // redrawButton.setText("Redraw"); // redrawButton.addSelectionListener(new SelectionListener() { // public void widgetSelected(SelectionEvent e) { // mainComposite.redraw(); // } // // public void widgetDefaultSelected(SelectionEvent e) { // } // }); // // ToolItem stopButton = new ToolItem(toolBar, SWT.PUSH); // stopButton.setText("Stop"); // stopButton.addSelectionListener(new SelectionListener() { // public void widgetSelected(SelectionEvent e) { // currentLayoutAlgorithm.stop(); // } // // public void widgetDefaultSelected(SelectionEvent e) { // } // }); // // ToolItem continuousButton = new ToolItem(toolBar, SWT.CHECK); // continuousButton.setText("Continuous"); // continuousButton.addSelectionListener(new SelectionListener() { // public void widgetSelected(SelectionEvent e) { // setContinuous(); // } // // public void widgetDefaultSelected(SelectionEvent e) { // } // }); // // ToolItem asynchronousButton = new ToolItem(toolBar, SWT.CHECK); // asynchronousButton.setText("Asynchronous"); // asynchronousButton.addSelectionListener(new SelectionListener() { // public void widgetSelected(SelectionEvent e) { // setAsynchronously(); // } // // public void widgetDefaultSelected(SelectionEvent e) { // } // }); // // createMainPanel(); // SimpleNode.setNodeColors(NODE_NORMAL_COLOR, BORDER_NORMAL_COLOR, // NODE_SELECTED_COLOR, NODE_ADJACENT_COLOR, BORDER_SELECTED_COLOR, // BORDER_ADJACENT_COLOR); // SimpleRelationship.setDefaultColor(RELATIONSHIP_COLOR); // SimpleRelationship.setDefaultHighlightColor(RELATIONSHIP_HIGHLIGHT_COLOR); // createTreeGraph(4, 3, false); // mainShell.pack(); // //mainShell.setSize(INITIAL_PANEL_WIDTH + 100, INITIAL_PANEL_HEIGHT + 200); // } // // public void setAsynchronously() { // if (asynchronously) { // asynchronously = false; // } else { // asynchronously = true; // } // // } // // public void setContinuous() { // if (continuous) { // continuous = false; // } else { // continuous = true; // } // } // // IProgressMonitor progressMonitor = null; // ProgressMonitorDialog pmd = null; // boolean GUI_UPDATING = false; // // private void performLayout(boolean placeRandomly) { // // if (!continuous) { // } // // if (currentLayoutAlgorithm.isRunning()) { // throw new RuntimeException("Layout is already running"); // } // if (placeRandomly) { // placeRandomly(); // } // ProgressListener progressListener = new ProgressListener() { // // int lastStep = 0; // // class progressSync implements Runnable { // // public static final int PROGRESS_UPDATED = 1; // public static final int PROGRESS_STARTED = 2; // public static final int PROGRESS_ENDED = 3; // public static final int UPDATE_GUI = 4; // // private int progressState = -1; // private ProgressEvent e; // // public progressSync(int progressState, final ProgressEvent e) { // this.progressState = progressState; // this.e = e; // // } // // public void run() { // // switch (progressState) { // case PROGRESS_STARTED: // if (!continuous) { // pmd = new ProgressMonitorDialog(getShell()); // progressMonitor = pmd.getProgressMonitor(); // pmd.open(); // progressMonitor.beginTask("Layout Running...", e.getTotalNumberOfSteps()); // } // break; // // case PROGRESS_UPDATED: // if (!continuous) { // progressMonitor.worked(e.getStepsCompleted() - lastStep); // lastStep = e.getStepsCompleted(); // } // break; // // case PROGRESS_ENDED: // if (!continuous) { // progressMonitor.done(); // pmd.close(); // } // updateGUI(); // mainShell.redraw(); // break; // case UPDATE_GUI: // updateGUI(); // GUI_UPDATING = false; // break; // } // mainComposite.redraw(); // // } // // } // // public void progressUpdated(final ProgressEvent e) { // if (asynchronously) { // if (!mainComposite.isDisposed()) { // Display.getDefault().asyncExec(new // progressSync(progressSync.PROGRESS_UPDATED, e)); // if (!GUI_UPDATING) { // GUI_UPDATING = true; // Display.getDefault().asyncExec(new progressSync(progressSync.UPDATE_GUI, e)); // } // } // } else { // if (!mainComposite.isDisposed()) { // new progressSync(progressSync.PROGRESS_UPDATED, e).run(); // } // } // // } // // public void progressStarted(ProgressEvent e) { // if (asynchronously) { // if (!mainComposite.isDisposed()) { // Display.getDefault().asyncExec(new // progressSync(progressSync.PROGRESS_STARTED, e)); // } // } else { // if (!mainComposite.isDisposed()) { // new progressSync(progressSync.PROGRESS_STARTED, e).run(); // } // } // // } // // public void progressEnded(ProgressEvent e) { // if (asynchronously) { // if (!mainComposite.isDisposed()) { // Display.getDefault().asyncExec(new progressSync(progressSync.PROGRESS_ENDED, // e)); // } // } else { // if (!mainComposite.isDisposed()) { // new progressSync(progressSync.PROGRESS_ENDED, e).run(); // } // } // currentLayoutAlgorithm.removeProgressListener(this); // Display.getDefault().asyncExec(new // progressSync(progressSync.PROGRESS_UPDATED, e)); // } // }; // currentLayoutAlgorithm.addProgressListener(progressListener); // // try { // LayoutEntity[] layoutEntities = new LayoutEntity[entities.size()]; // entities.toArray(layoutEntities); // LayoutRelationship[] layoutRelationships = new // LayoutRelationship[relationships.size()]; // relationships.toArray(layoutRelationships); // currentLayoutAlgorithm.applyLayout(layoutEntities, layoutRelationships, 0, 0, // mainComposite.getClientArea().width - 30, // mainComposite.getClientArea().height - 17, asynchronously, continuous); // if (!animate) { // updateGUI(); // } // } catch (InvalidLayoutConfiguration e) { // e.printStackTrace(); // } // } // // private Shell getShell() { // return mainShell; // } // // private void createMainPanel() { // mainComposite = new Canvas(mainShell, SWT.NO_BACKGROUND); // GridData mainGridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL, // GridData.VERTICAL_ALIGN_FILL, true, true); // mainGridData.widthHint = INITIAL_PANEL_WIDTH; // mainGridData.heightHint = INITIAL_PANEL_HEIGHT; // mainComposite.setLayoutData(mainGridData); // mainComposite.addPaintListener(new GraphPaintListener()); // // mainComposite.setBackground(new Color(Display.getCurrent(), 255, 255, 255)); // mainComposite.setLayout(null); // // mainComposite.addMouseMoveListener(new MouseMoveListener() { // // public void mouseMove(MouseEvent e) { // // if (selectedEntity == null) { // // Nothing selected, lets use a mouse hover // SimpleNode oldEntity = hoverEntity; // hoverEntity = null; // // for (Iterator iter = entities.iterator(); iter.hasNext() && selectedEntity == // null;) { // SimpleNode entity = (SimpleNode) iter.next(); // double x = entity.getX(); // double y = entity.getY(); // double w = entity.getWidth(); // double h = entity.getHeight(); // Rectangle rect = new Rectangle((int) x, (int) y, (int) w, (int) h); // if (rect.contains(e.x, e.y)) { // hoverEntity = entity; // hoverEntity.ignoreInLayout(true); // hoverEntity.setSelected(); // break; // } // } // if (oldEntity != null && oldEntity != hoverEntity) { // oldEntity.ignoreInLayout(false); // oldEntity.setUnSelected(); // } // } // // } // // }); // mainComposite.addMouseListener(new MouseListener() { // // public void mouseDoubleClick(MouseEvent e) { // } // // public void mouseDown(MouseEvent e) { // selectedEntity = null; // hoverEntity = null; // for (Iterator iter = entities.iterator(); iter.hasNext() && selectedEntity == // null;) { // SimpleNode entity = (SimpleNode) iter.next(); // double x = entity.getX(); // double y = entity.getY(); // double w = entity.getWidth(); // double h = entity.getHeight(); // Rectangle rect = new Rectangle((int) x, (int) y, (int) w, (int) h); // if (rect.contains(e.x, e.y)) { // selectedEntity = entity; // } // } // if (selectedEntity != null) { // mouseDownPoint = new Point(e.x, e.y); // selectedEntityPositionAtMouseDown = new Point((int) selectedEntity.getX(), // (int) selectedEntity.getY()); // selectedEntity.ignoreInLayout(true); // selectedEntity.setSelected(); // } else { // mouseDownPoint = null; // selectedEntityPositionAtMouseDown = null; // } // } // // public void mouseUp(MouseEvent e) { // if (selectedEntity != null) { // selectedEntity.ignoreInLayout(false); // selectedEntity.setUnSelected(); // List relatedNodes = selectedEntity.getRelatedEntities(); // for (Iterator iter = relatedNodes.iterator(); iter.hasNext();) { // SimpleNode element = (SimpleNode) iter.next(); // element.setUnSelected(); // } // SimpleRelationship[] rels = selectedEntity.getRelationships(); // for (int i = 0; i < rels.length; i++) { // rels[i].resetLineWidth(); // } // } // selectedEntity = null; // mouseDownPoint = null; // selectedEntityPositionAtMouseDown = null; // } // }); // // // stops the algorithm when the window is closed // mainComposite.addDisposeListener(new DisposeListener() { // public void widgetDisposed(DisposeEvent e) { // if (currentLayoutAlgorithm != null) { // currentLayoutAlgorithm.stop(); // } // } // }); // // mainComposite.addMouseMoveListener(new MouseMoveListener() { // // public void mouseMove(MouseEvent e) { // if (selectedEntity != null && mouseDownPoint != null) { // double dx = e.x - mouseDownPoint.x; // double dy = e.y - mouseDownPoint.y; // // selectedEntity.setLocation(selectedEntityPositionAtMouseDown.x + dx, // selectedEntityPositionAtMouseDown.y + dy); // mainComposite.redraw(); // } // } // }); // } // // static int lastUpdateCall = 0; // // /** // * // * @param maxLevels Max number of levels wanted in tree // * @param maxChildren Max number of children for each node in the tree // * @param random Whether or not to pick random number of levels (from 1 to // maxLevels) and // * random number of children (from 1 to maxChildren) // */ // private void createTreeGraph(int maxLevels, int maxChildren, boolean random) // { // entities = new ArrayList(); // relationships = new ArrayList(); // // // ccallendar - testing out having 2 roots // SimpleNode root = createSimpleNode(getNextID()); // entities.add(root); // SimpleNode root2 = createSimpleNode(getNextID()); // entities.add(root2); // // end // // SimpleNode currentParent = createSimpleNode(getNextID()); // entities.add(currentParent); // // // ccallendar - adding relationships from the parent to the 2 roots // SimpleRelationship rel = new SimpleRelationship(root, currentParent, false); // root.addRelationship(rel); // currentParent.addRelationship(rel); // relationships.add(rel); // rel = new SimpleRelationship(root2, currentParent, false); // root2.addRelationship(rel); // currentParent.addRelationship(rel); // relationships.add(rel); // // end // // int levels = random ? (int) (Math.random() * maxLevels + 1) : maxLevels; // createTreeGraphRecursive(currentParent, maxChildren, levels, 1, random); // } // // private void createTreeGraphRecursive(SimpleNode currentParentNode, int // maxChildren, int maxLevel, int level, boolean random) { // if (level > maxLevel) { // return; // } // // int numChildren = random ? (int) (Math.random() * maxChildren + 1) : // maxChildren; // for (int child = 0; child < numChildren; child++) { // SimpleNode childNode = createSimpleNode(getNextID()); // entities.add(childNode); // SimpleRelationship rel = new SimpleRelationship(currentParentNode, childNode, // false); // childNode.addRelationship(rel); // currentParentNode.addRelationship(rel); // relationships.add(rel); // SimpleRelationship.setDefaultSize(2); // createTreeGraphRecursive(childNode, maxChildren, maxLevel, level + 1, // random); // } // } // // private int repeats = 0; // // /** // * Gets the next name from the names list. // * Once all the names have been used up the names are // * repeated with a '1' after the name. // * @return String name // */ // private String getNextID() { // if (idCount >= NAMES.length) { // idCount = 0; // repeats++; // } // String id = NAMES[(int) idCount]; // if (repeats > 0) { // id += "_" + repeats; // } // idCount++; // return id; // } // // /** Places nodes randomly on the screen **/ // private void placeRandomly() { // for (Iterator iter = entities.iterator(); iter.hasNext();) { // SimpleNode simpleNode = (SimpleNode) iter.next(); // double x = Math.random() * INITIAL_PANEL_WIDTH - INITIAL_NODE_WIDTH; // double y = Math.random() * INITIAL_PANEL_HEIGHT - INITIAL_NODE_HEIGHT; // simpleNode.setLocationInLayout(x, y); // } // } // // /** // * Creates a SimpleNode // * @param name // * @return SimpleNode // */ // private SimpleNode createSimpleNode(String name) { // SimpleNode simpleNode = new SimpleNode(name); // int w = name.length() * 8; // an initial approximation of the width // simpleNode.setSizeInLayout(Math.max(w, INITIAL_NODE_WIDTH), // INITIAL_NODE_HEIGHT); // return simpleNode; // } // // private void updateGUI() { // if (!mainComposite.isDisposed()) { // mainComposite.redraw(); // //mainComposite.update(); // } // } // // static Display display = null; // // public static void main(String[] args) { // display = Display.getDefault(); // SimpleSWTExample simpleSWTExample = new SimpleSWTExample(display); // Shell shell = simpleSWTExample.getShell(); // //shell.pack(); // shell.open(); // while (!shell.isDisposed()) { // if (!display.readAndDispatch()) { // display.sleep(); // } // } // display.dispose(); // } // // /** // * Implements a paint listener to display nodes and edges // */ // private class GraphPaintListener implements PaintListener { // // long lastPaint; // // public void paintControl(PaintEvent e) { // Date date = new Date(); // long currentTime = date.getTime(); // if (currentTime - lastPaint < 40) { // return; // } else { // lastPaint = currentTime; // } // if (Display.getDefault() == null || e.width == 0 || e.height == 0) { // return; // } // long startTime = date.getTime(); // // // do a bit of our own double-buffering to stop flickering // Image imageBuffer; // // try { // imageBuffer = new Image(Display.getDefault(), e.width, e.height); // } catch (SWTError noMoreHandles) { // imageBuffer = null; // noMoreHandles.printStackTrace(); // return; // } catch (IllegalArgumentException tooBig) { // imageBuffer = null; // tooBig.printStackTrace(); // return; // } // // GC gcBuffer = new GC(imageBuffer); // // // paint the relationships // for (Iterator iter = relationships.iterator(); iter.hasNext();) { // SimpleRelationship rel = (SimpleRelationship) iter.next(); // SimpleNode src = (SimpleNode) rel.getSourceInLayout(); // SimpleNode dest = (SimpleNode) rel.getDestinationInLayout(); // // // highlight the adjacent nodes if one of the nodes is selected // if (src.equals(selectedEntity)) { // dest.setAdjacent(); // rel.setSelected(); // } else if (dest.equals(selectedEntity)) { // src.setAdjacent(); // rel.setSelected(); // } else { // rel.setUnSelected(); // } // // // Add bend points if required // if ((rel).getBendPoints() != null && (rel).getBendPoints().length > 0) { // src = drawBendPoints(rel, gcBuffer); // change source to last bendpoint // } // // double srcX = src.getX() + src.getWidth() / 2.0; // double srcY = src.getY() + src.getHeight() / 2.0; // double destX = dest.getX() + dest.getWidth() / 2.0; // double destY = dest.getY() + dest.getHeight() / 2.0; // drawEdge(srcX, srcY, destX, destY, rel, gcBuffer); // // } // // // paint the nodes // for (Iterator iter = entities.iterator(); iter.hasNext();) { // SimpleNode entity = (SimpleNode) iter.next(); // // String name = entity.toString(); // Point textSize = gcBuffer.stringExtent(name); // int entityX = (int) entity.getX(); // int entityY = (int) entity.getY(); // //TODO: What about resize from the layout algorithm // int entityWidth = Math.max((int) entity.getWidth(), textSize.x + 8); // int entityHeight = Math.max((int) entity.getHeight(), textSize.y + 2); // // gcBuffer.setBackground((Color) entity.getColor()); // gcBuffer.fillRoundRectangle(entityX, entityY, entityWidth, entityHeight, 8, // 8); // // // position the text in the middle of the node // int x = (int) (entityX + (entityWidth / 2.0)) - (textSize.x / 2); // gcBuffer.setForeground(BLACK); // gcBuffer.drawString(name, x, entityY); // gcBuffer.setForeground((Color) entity.getBorderColor()); // gcBuffer.setLineWidth(entity.getBorderWidth()); // gcBuffer.drawRoundRectangle(entityX, entityY, entityWidth, entityHeight, 8, // 8); // } // // e.gc.drawImage(imageBuffer, 0, 0); // imageBuffer.dispose(); // gcBuffer.dispose(); // // long time = date.getTime() - startTime; // if (time > 200) { // } // } // // /** // * Draw an edge // * @param gcBuffer // * @param srcX // * @param srcY // * @param destX // * @param destY // * @param rel // */ // private void drawEdge(double srcX, double srcY, double destX, double destY, // SimpleRelationship rel, GC gcBuffer) { // gcBuffer.setForeground((Color) rel.getColor()); // gcBuffer.setLineWidth(rel.getLineWidth()); // gcBuffer.drawLine((int) srcX, (int) srcY, (int) destX, (int) destY); // } // // /** // * Draws a set of lines between bendpoints // * TODO - This does not always draw outside the node. // * @param relationship // * @param bendNodes // * @param bendEdges // * @return the last bendpoint entity or null if there are no bendpoints // */ // private SimpleNode drawBendPoints(SimpleRelationship rel, GC gcBuffer) { // final String DUMMY_TITLE = "dummy"; // LayoutBendPoint[] bendPoints = (rel).getBendPoints(); // LayoutBendPoint bp; // SimpleNode startEntity = (SimpleNode) rel.getSourceInLayout(); // SimpleNode destEntity = null; // // double srcX = startEntity.getX() + startEntity.getWidth() / 2.0; // double srcY = startEntity.getY() + startEntity.getHeight() / 2.0; // for (int i = 1; i < bendPoints.length - 1; i++) { // bp = bendPoints[i]; // destEntity = new SimpleNode(DUMMY_TITLE, bp.getX(), bp.getY(), 0.01, 0.01); // drawEdge(srcX, srcY, bp.getX(), bp.getY(), rel, gcBuffer); // startEntity = destEntity; // srcX = startEntity.getX(); // srcY = startEntity.getY(); // } // return destEntity; // } // // } // //}