/*
* $Id: JGraphAdapterExample.java,v 1.3 2007/08/16 17:35:20 david Exp $
*
* Copyright (c) 2001-2005, Gaudenz Alder
*
* See LICENSE file in distribution for licensing details of this source file
*/
package com.jgraph.example.adapter;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.Point2D;
import java.net.URL;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JToolBar;
import javax.swing.event.UndoableEditEvent;
import org.jgraph.event.GraphSelectionEvent;
import org.jgraph.example.GraphEd;
import org.jgraph.graph.DefaultCellViewFactory;
import org.jgraph.graph.DefaultEdge;
import org.jgraph.graph.DefaultGraphCell;
import org.jgraph.graph.GraphConstants;
import org.jgraph.graph.GraphLayoutCache;
import org.jgraph.graph.GraphUndoManager;
import org.jgraph.util.ParallelEdgeRouter;
/**
* NOTE: To connect a database to this example please go to the main method and
* read to comments in the try block. If you want to use HSQLDB you can simply
* add the driver to the classpath and uncomment the two commented-out lines.
* For other databases you must change the name of the driver class.
*/
public class JGraphAdapterExample extends GraphEd {
// Actions which Change State
protected Action hide, collapse, expand, expandAll;
// Add a console
protected static JTextArea console = new JTextArea();
protected static JGraphSQLBackend backend = null;
protected static Connection conn = null;
public JGraphAdapterExample(JGraphAdapterBackend backend) {
println("Connect this example to a database (see JGraphAdapterExample)");
// Use Border Layout
getContentPane().setLayout(new BorderLayout());
JGraphAdapterModel bm = new JGraphSQLBusinessModel();
bm.setBackend(backend);
// Construct the Graph
graph = new MyGraph(bm);
graph.setGraphLayoutCache(new GraphLayoutCache(graph.getModel(),
new DefaultCellViewFactory(), true));
// Use a Custom Marquee Handler
graph.setMarqueeHandler(new MyMarqueeHandler());
// Construct Command History
//
// Create a GraphUndoManager which also Updates the ToolBar
undoManager = new GraphUndoManager() {
// Override Superclass
public void undoableEditHappened(UndoableEditEvent e) {
// First Invoke Superclass
super.undoableEditHappened(e);
// Then Update Undo/Redo Buttons
updateHistoryButtons();
}
};
// Add Listeners to Graph
//
// Register UndoManager with the Model
graph.getModel().addUndoableEditListener(undoManager);
// Update ToolBar based on Selection Changes
graph.getSelectionModel().addGraphSelectionListener(this);
// Listen for Delete Keystroke when the Graph has Focus
graph.addKeyListener(this);
// Construct Panel
//
// Add a ToolBar
getContentPane().add(createToolBar(), BorderLayout.NORTH);
// Add the Graph as Center Component
JGraphSQLQueryPane queryPane = new JGraphSQLQueryPane(this, graph);
// queryPane.setPreferredSize(new Dimension(100, 40));
JSplitPane mainSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
queryPane, graph);
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
mainSplit, new JScrollPane(console));
splitPane.setResizeWeight(1.0);
getContentPane().add(splitPane, BorderLayout.CENTER);
}
public Map createCellAttributes(Point2D point) {
Map map = super.createCellAttributes(point);
GraphConstants.setInset(map, 5);
return map;
}
public Map createEdgeAttributes() {
Map map = super.createEdgeAttributes();
// Adds a parallel edge router
GraphConstants
.setRouting(map, ParallelEdgeRouter.getSharedInstance());
return map;
}
protected DefaultGraphCell createGroupCell() {
return createAdapterVertex();
}
protected DefaultGraphCell createDefaultGraphCell() {
return createAdapterVertex();
}
protected static DefaultGraphCell createAdapterVertex() {
DefaultGraphCell cell = new DefaultGraphCell(new JGraphSQLEntity(
"New Cell"));
cell.addPort();
return cell;
}
// Hook for subclassers
protected DefaultEdge createDefaultEdge() {
return createAdapterEdge();
}
protected static DefaultEdge createAdapterEdge() {
return new DefaultEdge(new JGraphSQLRelation("New Edge"));
}
public JToolBar createToolBar() {
JToolBar toolbar = super.createToolBar();
// Hide
hide = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
graph.getGraphLayoutCache().hideCells(
graph.getSelectionCells(), true);
}
};
URL url = getClass().getClassLoader().getResource(
"com/jgraph/example/adapter/image/hide.gif");
hide.putValue(Action.SMALL_ICON, new ImageIcon(url));
hide.setEnabled(false);
toolbar.addSeparator();
toolbar.add(hide);
toolbar.addSeparator();
// Collapse
collapse = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
graph.getGraphLayoutCache().collapse(graph.getSelectionCells());
}
};
url = getClass().getClassLoader().getResource(
"com/jgraph/example/adapter/image/collapse.gif");
collapse.putValue(Action.SMALL_ICON, new ImageIcon(url));
collapse.setEnabled(false);
toolbar.add(collapse);
// Expand
expand = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
graph.getGraphLayoutCache().expand(graph.getSelectionCells());
}
};
url = getClass().getClassLoader().getResource(
"com/jgraph/example/adapter/image/expand.gif");
expand.putValue(Action.SMALL_ICON, new ImageIcon(url));
expand.setEnabled(false);
toolbar.add(expand);
// ExpandAll
expandAll = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
graph.getGraphLayoutCache().expand(
graph.getDescendants(graph.getSelectionCells()));
}
};
url = getClass().getClassLoader().getResource(
"com/jgraph/example/adapter/image/expandAll.gif");
expandAll.putValue(Action.SMALL_ICON, new ImageIcon(url));
expandAll.setEnabled(false);
toolbar.add(expandAll);
return toolbar;
}
// From GraphSelectionListener Interface
public void valueChanged(GraphSelectionEvent e) {
super.valueChanged(e);
// Group Button only Enabled if a cell is selected
boolean enabled = !graph.isSelectionEmpty();
hide.setEnabled(enabled);
expand.setEnabled(enabled);
expandAll.setEnabled(enabled);
collapse.setEnabled(enabled);
}
/**
* Main method
*/
public static void main(String[] args) {
// Initializing backend (file-based database)
try {
// Download the HSQLDB (org.hsqldb.jdbcDriver) or any other JDBC
// driver and connect this example to a real database by
// uncommenting the following statement (passing a connection to the
// SQL backend):
// Class.forName("org.hsqldb.jdbcDriver");
// conn = DriverManager.getConnection(
// "jdbc:hsqldb:" + backendFilename, "sa", "");
backend = new JGraphSQLBackend(conn, createAdapterVertex(),
createAdapterEdge());
// Construct Frame
JFrame frame = new JFrame("JGraphAdapterExample");
// Set Close Operation to Exit
frame.addWindowListener(new WindowAdapter() {
public void windowClosed(WindowEvent e) {
try {
if (backend != null && conn != null) {
backend.update("SHUTDOWN");
conn.close();
}
} catch (SQLException e1) {
e1.printStackTrace();
}
System.exit(0);
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Add an Editor Panel
frame.getContentPane().add(new JGraphAdapterExample(backend));
// Fetch URL to Icon Resource
URL jgraphUrl = JGraphAdapterExample.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);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void println(String msg) {
console.setText(console.getText() + msg + "\n");
}
}