1 package org.antlr.works.awtree; 2 3 import org.antlr.xjlib.appkit.gview.object.GElement; 4 import org.antlr.xjlib.appkit.utils.XJAlert; 5 import org.antlr.works.swing.Toolbar; 6 import org.antlr.works.utils.IconManager; 7 import org.antlr.works.utils.TreeUtilities; 8 9 import javax.swing.*; 10 import javax.swing.event.ChangeEvent ; 11 import javax.swing.event.ChangeListener ; 12 import javax.swing.tree.DefaultTreeCellRenderer ; 13 import javax.swing.tree.DefaultTreeModel ; 14 import javax.swing.tree.TreeNode ; 15 import javax.swing.tree.TreePath ; 16 import java.awt.*; 17 import java.awt.event.*; 18 19 49 50 public class AWTreePanel extends JPanel { 51 52 protected Component listViewComponent; 53 protected Component graphViewComponent; 54 55 protected JTree tree; 56 protected DefaultTreeModel jTreeModel; 57 58 protected AWTreeGraphView treeGraphView; 59 protected JScrollPane graphScrollPane; 60 61 protected AWTreePanelDelegate delegate; 62 63 public AWTreePanel(DefaultTreeModel treeModel) { 64 super(new BorderLayout()); 65 66 this.jTreeModel = treeModel; 67 tree = new JTree(treeModel); 68 tree.setRootVisible(false); 69 tree.setShowsRootHandles(true); 70 71 DefaultTreeCellRenderer treeRenderer = new DefaultTreeCellRenderer (); 72 treeRenderer.setClosedIcon(null); 73 treeRenderer.setLeafIcon(null); 74 treeRenderer.setOpenIcon(null); 75 76 tree.setCellRenderer(treeRenderer); 77 78 tree.addMouseListener(new MouseAdapter() { 79 public void mousePressed(MouseEvent e) { 80 int selRow = tree.getRowForLocation(e.getX(), e.getY()); 81 TreePath selPath = tree.getPathForLocation(e.getX(), e.getY()); 82 if(selRow != -1) { 83 if(e.getClickCount() == 2) { 84 displayNodeInfo(selPath.getLastPathComponent()); 85 e.consume(); 86 } 87 } 88 } 89 90 }); 91 92 listViewComponent = createListView(); 93 graphViewComponent = createGraphView(); 94 95 add(graphViewComponent, BorderLayout.CENTER); 96 } 97 98 public void setDelegate(AWTreePanelDelegate delegate) { 99 this.delegate = delegate; 100 } 101 102 public void setAWTreeModel(AWTreeModel model) { 103 treeGraphView.setModel(model); 104 } 105 106 public Component createListView() { 107 JPanel panel = new JPanel(new BorderLayout()); 108 109 JScrollPane scrollPane = new JScrollPane(tree); 110 scrollPane.setWheelScrollingEnabled(true); 111 scrollPane.setBackground(Color.white); 112 113 Toolbar box = Toolbar.createHorizontalToolbar(); 114 box.addElement(createExpandAllButton()); 115 box.addElement(createCollapseAllButton()); 116 box.add(Box.createHorizontalGlue()); 117 box.addElement(createDisplayAsGraphButton()); 118 121 panel.add(scrollPane, BorderLayout.CENTER); 122 panel.add(box, BorderLayout.SOUTH); 123 124 return panel; 125 } 126 127 public JButton createDisplayAsGraphButton() { 128 JButton button = new JButton(IconManager.shared().getIconGraph()); 129 button.setToolTipText("Display as Graph"); 130 button.setFocusable(false); 131 button.addActionListener(new ActionListener() { 132 public void actionPerformed(ActionEvent event) { 133 toggleGraph(); 134 } 135 }); 136 return button; 137 } 138 139 public JButton createExpandAllButton() { 140 JButton button = new JButton(IconManager.shared().getIconExpandAll()); 141 button.setToolTipText("Expand All"); 142 button.setFocusable(false); 143 button.addActionListener(new ActionListener() { 144 public void actionPerformed(ActionEvent event) { 145 TreeUtilities.expandAll(tree); 146 } 147 }); 148 return button; 149 } 150 151 public JButton createCollapseAllButton() { 152 JButton button = new JButton(IconManager.shared().getIconCollapseAll()); 153 button.setToolTipText("Collapse All"); 154 button.setFocusable(false); 155 button.addActionListener(new ActionListener() { 156 public void actionPerformed(ActionEvent event) { 157 TreeUtilities.collapseAll(tree); 158 } 159 }); 160 return button; 161 } 162 163 public Component createGraphView() { 164 JPanel panel = new JPanel(new BorderLayout()); 165 166 treeGraphView = new AWTreeGraphView(this); 167 treeGraphView.setAutoAdjustSize(true); 168 treeGraphView.setBackground(Color.white); 169 treeGraphView.setDrawBorder(false); 170 171 ParseTreeMouseAdapter adapter = new ParseTreeMouseAdapter(); 172 treeGraphView.addMouseListener(adapter); 173 treeGraphView.addMouseMotionListener(adapter); 174 175 graphScrollPane = new JScrollPane(treeGraphView); 176 graphScrollPane.setWheelScrollingEnabled(true); 177 178 Toolbar box = Toolbar.createHorizontalToolbar(); 179 box.addElement(new JLabel("Zoom")); 180 box.addElement(createZoomSlider()); 181 box.add(Box.createHorizontalGlue()); 182 box.addElement(createDisplayAsListButton()); 183 186 panel.add(graphScrollPane, BorderLayout.CENTER); 187 panel.add(box, BorderLayout.SOUTH); 188 189 return panel; 190 } 191 192 public JButton createDisplayAsListButton() { 193 JButton button = new JButton(IconManager.shared().getIconListTree()); 194 button.setToolTipText("Display as List"); 195 button.setFocusable(false); 196 button.addActionListener(new ActionListener() { 197 public void actionPerformed(ActionEvent event) { 198 toggleGraph(); 199 } 200 }); 201 return button; 202 } 203 204 public JSlider createZoomSlider() { 205 JSlider slider = new JSlider(); 206 slider.setFocusable(false); 207 slider.setMinimum(1); 208 slider.setMaximum(200); 209 slider.setValue(100); 210 211 slider.addChangeListener(new ChangeListener () { 212 public void stateChanged(ChangeEvent event) { 213 JSlider slider = (JSlider)event.getSource(); 214 215 treeGraphView.setZoom((float)slider.getValue()/100); 216 treeGraphView.repaint(); 217 treeGraphView.revalidate(); 218 } 219 }); 220 return slider; 221 } 222 223 public void setRootVisible(boolean flag) { 224 tree.setRootVisible(flag); 225 } 226 227 public void setRoot(TreeNode node) { 228 jTreeModel.setRoot(node); 229 treeGraphView.setRoot(node); 230 } 231 232 public Object getRoot() { 233 return jTreeModel.getRoot(); 234 } 235 236 public AWTreeGraphView getGraphView() { 237 return treeGraphView; 238 } 239 240 public void clear() { 241 treeGraphView.clear(); 242 } 243 244 public void refresh() { 245 jTreeModel.reload(); 246 TreeUtilities.expandAll(tree); 247 treeGraphView.refresh(); 248 } 249 250 public void toggleGraph() { 251 if(getComponent(0) == listViewComponent) { 252 remove(listViewComponent); 253 add(graphViewComponent, BorderLayout.CENTER); 254 } else { 255 remove(graphViewComponent); 256 add(listViewComponent, BorderLayout.CENTER); 257 } 258 repaint(); 259 revalidate(); 260 } 261 262 public void selectNode(TreeNode node) { 263 TreePath path = new TreePath (jTreeModel.getPathToRoot(node)); 264 tree.scrollPathToVisible(path); 265 tree.setSelectionPath(path); 266 267 treeGraphView.highlightNode(node); 268 } 269 270 public void scrollNodeToVisible(TreeNode node) { 271 if(node == null) 272 return; 273 274 tree.scrollPathToVisible(new TreePath (jTreeModel.getPathToRoot(node))); 275 treeGraphView.scrollNodeToVisible(node); 276 } 277 278 public void displayNodeInfo(Object node) { 279 AWTreeNode n = (AWTreeNode)node; 280 XJAlert.display(this, "Node info", n.getInfoString()); 281 } 282 283 public JPopupMenu getContextualMenu() { 284 if(delegate != null) 285 return delegate.awTreeGetContextualMenu(); 286 else 287 return null; 288 } 289 290 protected class ParseTreeMouseAdapter implements MouseListener, MouseMotionListener { 291 292 public Point origin; 293 public Rectangle r; 294 public boolean dragging; 295 296 public void mousePressed(MouseEvent e) { 297 GElement elem = treeGraphView.getElementAtMousePosition(e); 298 if(elem != null && elem instanceof AWTreeGraphView.GElementNode) { 299 TreeNode node = treeGraphView.getTreeNodeForElement((AWTreeGraphView.GElementNode)elem); 300 if(node == null) 301 return; 302 303 boolean shiftKey = (e.getModifiersEx() & MouseEvent.SHIFT_DOWN_MASK) == MouseEvent.SHIFT_DOWN_MASK; 304 if(delegate != null) 305 delegate.awTreeDidSelectTreeNode(node, shiftKey); 306 307 selectNode(node); 308 } 309 310 origin = SwingUtilities.convertPoint(treeGraphView, e.getPoint(), null); 311 r = treeGraphView.getVisibleRect(); 312 dragging = true; 313 } 314 315 public void mouseClicked(MouseEvent e) { 316 } 317 318 public void mouseReleased(MouseEvent e) { 319 dragging = false; 320 } 321 322 public void mouseEntered(MouseEvent e) { 323 } 324 325 public void mouseExited(MouseEvent e) { 326 } 327 328 public void mouseDragged(MouseEvent e) { 329 if(!dragging) 330 return; 331 332 Point p = SwingUtilities.convertPoint(treeGraphView, e.getPoint(), null); 333 334 Rectangle r1 = new Rectangle(r); 335 r1.x -= p.x - origin.x; 336 r1.y -= p.y - origin.y; 337 treeGraphView.scrollRectToVisible(r1); 338 } 339 340 public void mouseMoved(MouseEvent e) { 341 } 342 } 343 344 } 345 | Popular Tags |