/* * $Id: FastGraph.java,v 1.3 2006/01/03 11:11:41 david Exp $ * * Copyright (c) 2001-2005, Gaudenz Alder * Copyright (c) 2005, David Benson * * See LICENSE file in distribution for licensing details of this source file */ package com.jgraph.example.fastgraph; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.net.URL; import java.util.Hashtable; import java.util.Map; import javax.swing.AbstractAction; import javax.swing.ImageIcon; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import org.jgraph.JGraph; import org.jgraph.example.GraphEd; import org.jgraph.graph.DefaultGraphCell; import org.jgraph.graph.GraphConstants; import org.jgraph.graph.GraphModel; import com.jgraph.example.JGraphGraphFactory; /** * An example applet that demonstrates how to improve the performance of * JGraph and reduce its memory footprint */ public class FastGraph extends GraphEd { /** * JGraph Factory instance for random new graphs */ protected JGraphGraphFactory graphFactory; /** * Reference to the layout dialog which is used to configure the current * layout. */ protected JDialog sampleDialog = null; /** * Constructs a new example */ public FastGraph() { setJMenuBar(new FastGraphMenuBar(this)); // Initializes actions states valueChanged(null); graphFactory = new FastGraphFactory(); // Use a Custom Marquee Handler graph.setMarqueeHandler(new FastMarqueeHandler()); graph.getGraphLayoutCache().setFactory(new FastCellViewFactory()); } // Override parent method protected JGraph createGraph() { // Creates a model that does not allow disconnections return new MyFastGraph(new FastGraphModel()); } // // Custom Graph // // Defines a Graph that uses the Shift-Button (Instead of the Right // Mouse Button, which is Default) to add/remove point to/from an edge. public static class MyFastGraph extends JGraph { // Construct the Graph using the Model as its Data Source public MyFastGraph(GraphModel model) { super(model); // Make Ports Invisible by Default setPortsVisible(false); // No Grid setGridEnabled(false); // Set the Tolerance to 2 Pixel setTolerance(2); // Accept edits if click on background setInvokesStopCellEditing(true); // Allows control-drag setCloneable(true); // Jump to default port on connect setJumpToDefaultPort(true); // Turn off double buffering for speed setDoubleBuffered(false); // Pretty background setBackground(Color.YELLOW); } /** * Override parent method with custom GraphUI. */ public void updateUI() { setUI(new FastGraphUI()); invalidate(); } } public class FastMarqueeHandler extends MyMarqueeHandler { // Add timings public void mousePressed(final MouseEvent e) { System.out.println("Started mousePressed, timestamp=" + System.currentTimeMillis() + "ms"); super.mousePressed(e); } // Add timings public void mouseDragged(MouseEvent e) { System.out.println("Started mouseDragged, timestamp=" + System.currentTimeMillis() + "ms"); super.mouseDragged(e); } // Add timings public void mouseReleased(MouseEvent e) { System.out.println("Started mouseReleased, timestamp=" + System.currentTimeMillis() + "ms"); super.mouseReleased(e); } } public class FastGraphMenuBar extends JMenuBar { public FastGraphMenuBar(final FastGraph app) { // Sample data menu JMenu sampleMenu = new JMenu("Sample Data"); sampleMenu.add(new JMenuItem(new AbstractAction( "Insert Randomly Connected Graph") { public void actionPerformed(ActionEvent e) { graphFactory.setInsertIntoModel(true); System.out .println("Starting to insert randomly connected graph, timestamp=" + System.currentTimeMillis() + "ms"); graphFactory.insertGraph(app.getGraph(), JGraphGraphFactory.RANDOM_CONNECTED, app .createCellAttributes(new Point2D.Double(0, 0)), app.createEdgeAttributes()); System.out .println("Finished inserting randomly connected graph, timestamp=" + System.currentTimeMillis() + "ms"); } })); sampleMenu.add(new JMenuItem(new AbstractAction( "Insert Fully Connected Graph") { public void actionPerformed(ActionEvent e) { graphFactory.setInsertIntoModel(true); System.out .println("Starting to insert fully connected graph, timestamp=" + System.currentTimeMillis() + "ms"); graphFactory.insertGraph(app.getGraph(), JGraphGraphFactory.FULLY_CONNECTED, app .createCellAttributes(new Point2D.Double(0, 0)), app.createEdgeAttributes()); System.out .println("Finished inserting fully connected graph, timestamp=" + System.currentTimeMillis() + "ms"); } })); add(sampleMenu); // Performance/Memory data menu JMenu profileMenu = new JMenu("Profiling"); profileMenu.add(new JMenuItem(new AbstractAction( "Perform Garbage Collection") { public void actionPerformed(ActionEvent e) { System.gc(); } })); add(profileMenu); } } /** * Hook from GraphEd to set attributes of a new cell */ public Map createCellAttributes(Point2D point) { Map map = new Hashtable(); // Add a Bounds Attribute to the Map GraphConstants.setBounds(map, new Rectangle2D.Double(point.getX(), point.getY(), 40, 40)); // Add a nice looking gradient background GraphConstants.setGradientColor(map, Color.blue); // Add a Border Color Attribute to the Map GraphConstants.setBorderColor(map, Color.black); // Add a White Background GraphConstants.setBackground(map, Color.white); // Make Vertex Opaque GraphConstants.setOpaque(map, true); return map; } /** * Create circles with fixed ports */ protected DefaultGraphCell createDefaultGraphCell() { DefaultGraphCell cell = new FastCircleCell("Cell " + new Integer(cellCount++)); // Restrict to a square shape GraphConstants.setConstrained(cell.getAttributes(), true); // Add one central fixed port Point2D point = new Point2D.Double(GraphConstants.PERMILLE / 2, GraphConstants.PERMILLE / 2); cell.addPort(point); return cell; } /** * Hook from GraphEd to set attributes of a new edge */ public Map createEdgeAttributes() { return null; } /** * Main method */ public static void main(String[] args) { try { System.out.println("FastGraph starting, timestamp=" + System.currentTimeMillis() + "ms"); // Construct Frame JFrame frame = new JFrame(JGraph.VERSION); // Set Close Operation to Exit frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Add an Editor Panel FastGraph fastGraph = new FastGraph(); frame.getContentPane().add(fastGraph); // Fetch URL to Icon Resource URL jgraphUrl = FastGraph.class.getClassLoader().getResource( "org/jgraph/example/resources/jgraph.gif"); // If Valid URL if (jgraphUrl != null) { // Load Icon ImageIcon jgraphIcon = new ImageIcon(jgraphUrl); // Use in Window frame.setIconImage(jgraphIcon.getImage()); } // Set Default Size frame.setSize(640, 480); // Show Frame frame.setVisible(true); fastGraph.init(); System.out.println("FastGraph initialised, timestamp=" + System.currentTimeMillis() + "ms"); } catch (Exception e) { e.printStackTrace(); } } }