KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > antlr > works > awtree > AWTreePanel


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 JavaDoc;
11 import javax.swing.event.ChangeListener JavaDoc;
12 import javax.swing.tree.DefaultTreeCellRenderer JavaDoc;
13 import javax.swing.tree.DefaultTreeModel JavaDoc;
14 import javax.swing.tree.TreeNode JavaDoc;
15 import javax.swing.tree.TreePath JavaDoc;
16 import java.awt.*;
17 import java.awt.event.*;
18
19 /*
20
21 [The "BSD licence"]
22 Copyright (c) 2005 Jean Bovet
23 All rights reserved.
24
25 Redistribution and use in source and binary forms, with or without
26 modification, are permitted provided that the following conditions
27 are met:
28
29 1. Redistributions of source code must retain the above copyright
30 notice, this list of conditions and the following disclaimer.
31 2. Redistributions in binary form must reproduce the above copyright
32 notice, this list of conditions and the following disclaimer in the
33 documentation and/or other materials provided with the distribution.
34 3. The name of the author may not be used to endorse or promote products
35 derived from this software without specific prior written permission.
36
37 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
38 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
40 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
41 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
43 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
44 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
45 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
46 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
47
48 */

49
50 public class AWTreePanel extends JPanel {
51
52     protected Component listViewComponent;
53     protected Component graphViewComponent;
54
55     protected JTree tree;
56     protected DefaultTreeModel JavaDoc jTreeModel;
57
58     protected AWTreeGraphView treeGraphView;
59     protected JScrollPane graphScrollPane;
60
61     protected AWTreePanelDelegate delegate;
62
63     public AWTreePanel(DefaultTreeModel JavaDoc 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 JavaDoc treeRenderer = new DefaultTreeCellRenderer JavaDoc();
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 JavaDoc 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         //if(XJSystem.isMacOS())
119
// box.add(Box.createHorizontalStrut(15));
120

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         //if(XJSystem.isMacOS())
184
// box.add(Box.createHorizontalStrut(15));
185

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 JavaDoc() {
212             public void stateChanged(ChangeEvent JavaDoc 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 JavaDoc node) {
228         jTreeModel.setRoot(node);
229         treeGraphView.setRoot(node);
230     }
231
232     public Object JavaDoc 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 JavaDoc node) {
263         TreePath JavaDoc path = new TreePath JavaDoc(jTreeModel.getPathToRoot(node));
264         tree.scrollPathToVisible(path);
265         tree.setSelectionPath(path);
266
267         treeGraphView.highlightNode(node);
268     }
269
270     public void scrollNodeToVisible(TreeNode JavaDoc node) {
271         if(node == null)
272             return;
273
274         tree.scrollPathToVisible(new TreePath JavaDoc(jTreeModel.getPathToRoot(node)));
275         treeGraphView.scrollNodeToVisible(node);
276     }
277
278     public void displayNodeInfo(Object JavaDoc 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 JavaDoc 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