/*
* @(#)GraphTreeModel.java 3.3 23-APR-04
*
* Copyright (c) 2001-2004, Gaudenz Alder All rights reserved.
*
* See LICENSE file in distribution for licensing details of this source file
*/
package com.jgraph.example;
import java.util.Enumeration;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import org.jgraph.JGraph;
import org.jgraph.event.GraphModelEvent;
import org.jgraph.event.GraphModelListener;
import org.jgraph.graph.GraphModel;
/**
* JGraph gives you the opportunity to define whatever graph model you want.
* Since trees are only special cases of graph, we will here show a fairly simple
* new graph model: a tree model.
*
* So we build a new type inheriting most of its behavior
* from DefaultTreeModel and adding the minimal requirements to be a GraphModel also.
* To achieve this, we hold a GraphModel reference in GraphModelTreeNode which implements
* TreeModel and we use GraphModelTreeNode as the TreeModel to construct the DefaultTreeModel.
*
* Finally, don't believe graph models are limited to trees. Rather the GraphModel
* interface provides you lots of hooks to detail your model. For instance you
* could define custome implemetations to decide wether or not some
* connections are allowed...
*/
public class GraphTreeModel
extends DefaultTreeModel
implements GraphModelListener {
public static void main(String[] args) {
JFrame frame = new JFrame("GraphTreeModel");
JGraph graph = new JGraph();
GraphTreeModel gtModel = new GraphTreeModel(graph.getModel());
JTree tree = new JTree(gtModel);
graph.getModel().addGraphModelListener(gtModel);
tree.setRootVisible(false);
JScrollPane sGraph = new JScrollPane(graph);
JScrollPane sTree = new JScrollPane(tree);
JSplitPane pane =
new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sTree, sGraph);
frame.getContentPane().add(pane);
frame.pack();
//frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
/**
* Look how we wrapp the GraphModel into a GraphModelTreeNode to construct
* the GraphTreeModel and satisfy both the GraphModel and the TreeModel interfaces.
* @param model
*/
public GraphTreeModel(GraphModel model) {
super(new GraphModelTreeNode(model));
}
public void graphChanged(GraphModelEvent e) {
reload();
}
public static class GraphModelTreeNode implements TreeNode {
protected GraphModel model;
public GraphModelTreeNode(GraphModel model) {
this.model = model;
}
public Enumeration children() {
Vector v = new Vector();
for (int i = 0; i < model.getRootCount(); i++)
v.add(model.getRootAt(i));
return v.elements();
}
public boolean getAllowsChildren() {
return true;
}
public TreeNode getChildAt(int childIndex) {
return (TreeNode) model.getRootAt(childIndex);
}
public int getChildCount() {
return model.getRootCount();
}
public int getIndex(TreeNode node) {
return model.getIndexOfRoot(node);
}
public TreeNode getParent() {
return null;
}
public boolean isLeaf() {
return false;
}
public String toString() {
return model.toString();
}
}
}