1 package prefuse.util.ui; 2 3 import javax.swing.JFrame ; 4 import javax.swing.JScrollPane ; 5 import javax.swing.JTree ; 6 import javax.swing.event.TreeModelEvent ; 7 import javax.swing.event.TreeModelListener ; 8 import javax.swing.tree.TreeModel ; 9 import javax.swing.tree.TreePath ; 10 11 import prefuse.data.Graph; 12 import prefuse.data.Node; 13 import prefuse.data.Tree; 14 import prefuse.data.event.EventConstants; 15 import prefuse.data.event.GraphListener; 16 import prefuse.util.StringLib; 17 import prefuse.util.collections.CopyOnWriteArrayList; 18 import prefuse.visual.VisualTree; 19 20 29 public class JPrefuseTree extends JTree { 30 31 private Tree m_tree; 32 private String m_field; 33 34 39 public JPrefuseTree(Tree t, String labelField) { 40 super(); 41 m_tree = t; 42 m_field = labelField; 43 44 PrefuseTreeModel model = new PrefuseTreeModel(); 45 super.setModel(model); 46 m_tree.addGraphModelListener(model); 47 } 48 49 53 public Tree getTree() { 54 return m_tree; 55 } 56 57 62 public String convertValueToText(Object value, boolean selected, 63 boolean expanded, boolean leaf, int row, boolean hasFocus) 64 { 65 if ( value == null ) 66 return ""; 67 68 if ( value instanceof Node ) { 69 Object o = ((Node)value).get(m_field); 70 if ( o.getClass().isArray() ) { 71 return StringLib.getArrayString(o); 72 } else { 73 return o.toString(); 74 } 75 } else { 76 return value.toString(); 77 } 78 } 79 80 82 86 public class PrefuseTreeModel implements TreeModel , GraphListener { 87 88 private CopyOnWriteArrayList m_listeners = new CopyOnWriteArrayList(); 89 90 93 public Object getRoot() { 94 return m_tree.getRoot(); 95 } 96 97 100 public Object getChild(Object node, int idx) { 101 Node c = ((Node)node).getChild(idx); 102 if ( c == null ) { 103 throw new IllegalArgumentException ("Index out of range: "+idx); 104 } 105 return c; 106 } 107 108 111 public int getChildCount(Object node) { 112 return ((Node)node).getChildCount(); 113 } 114 115 118 public boolean isLeaf(Object node) { 119 return ((Node)node).getChildCount() == 0; 120 } 121 122 125 public void valueForPathChanged(TreePath path, Object newValue) { 126 } 128 129 132 public int getIndexOfChild(Object parent, Object child) { 133 return ((Node)parent).getChildIndex(((Node)child)); 134 } 135 136 139 public void addTreeModelListener(TreeModelListener tml) { 140 if ( !m_listeners.contains(tml) ) 141 m_listeners.add(tml); 142 } 143 144 147 public void removeTreeModelListener(TreeModelListener tml) { 148 m_listeners.remove(tml); 149 } 150 151 154 public void graphChanged(Graph g, String table, int start, int end, 155 int col, int type) 156 { 157 if ( m_listeners == null || m_listeners.size() == 0 ) 158 return; 160 boolean nodeTable = table.equals(Graph.NODES); 161 if ( type != EventConstants.UPDATE && nodeTable ) 162 return; 163 else if ( type == EventConstants.UPDATE && !nodeTable ) 164 return; 165 166 for ( int row = start; row <= end; ++row ) { 167 Node n = null; 169 if ( nodeTable ) 170 n = g.getNode(row); 171 else 172 n = g.getEdge(row).getTargetNode(); 173 Object [] path = new Object [n.getDepth()+1]; 174 for ( int i=path.length; --i>=0; n=n.getParent() ) { 175 path[i] = n; 176 } 177 TreeModelEvent e = new TreeModelEvent (this, path); 178 179 Object [] lstnrs = m_listeners.getArray(); 181 for ( int i=0; i<lstnrs.length; ++i ) { 182 TreeModelListener tml = (TreeModelListener )lstnrs[i]; 183 184 switch ( type ) { 185 case EventConstants.INSERT: 186 tml.treeNodesInserted(e); 187 break; 188 case EventConstants.DELETE: 189 tml.treeNodesRemoved(e); 190 break; 191 case EventConstants.UPDATE: 192 tml.treeNodesChanged(e); 193 } 194 } 195 } 196 } 197 198 } 200 202 209 public static JFrame showTreeWindow(Tree t, String labelField) { 210 JPrefuseTree tree = new JPrefuseTree(t, labelField); 211 String title = t.toString(); 212 if ( t instanceof VisualTree ) { 213 title = ((VisualTree)t).getGroup() + " " + title; 214 } 215 JFrame frame = new JFrame (title); 216 frame.getContentPane().add(new JScrollPane (tree)); 217 frame.pack(); 218 frame.setVisible(true); 219 return frame; 220 } 221 222 } | Popular Tags |