1 package net.sourceforge.pmd.util.viewer.gui;
2
3 import net.sourceforge.pmd.ast.Node;
4 import net.sourceforge.pmd.ast.SimpleNode;
5 import net.sourceforge.pmd.util.viewer.gui.menu.ASTNodePopupMenu;
6 import net.sourceforge.pmd.util.viewer.model.ASTModel;
7 import net.sourceforge.pmd.util.viewer.model.ViewerModel;
8 import net.sourceforge.pmd.util.viewer.model.ViewerModelEvent;
9 import net.sourceforge.pmd.util.viewer.model.ViewerModelListener;
10 import net.sourceforge.pmd.util.viewer.util.NLS;
11
12 import javax.swing.*;
13 import javax.swing.event.TreeSelectionEvent;
14 import javax.swing.event.TreeSelectionListener;
15 import javax.swing.tree.TreeNode;
16 import javax.swing.tree.TreePath;
17 import java.awt.BorderLayout;
18 import java.awt.event.MouseAdapter;
19 import java.awt.event.MouseEvent;
20 import java.util.LinkedList;
21
22 /***
23 * tree panel GUI
24 *
25 * @author Boris Gruschko ( boris at gruschko.org )
26 * @version $Id: ASTPanel.java,v 1.9 2005/09/02 19:36:22 tomcopeland Exp $
27 */
28
29 public class ASTPanel
30 extends JPanel
31 implements ViewerModelListener, TreeSelectionListener {
32 private ViewerModel model;
33 private JTree tree;
34
35 /***
36 * constructs the panel
37 *
38 * @param model model to attach the panel to
39 */
40 public ASTPanel(ViewerModel model) {
41 this.model = model;
42
43 init();
44 }
45
46 private void init() {
47 model.addViewerModelListener(this);
48
49 setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), NLS.nls("AST.PANEL.TITLE")));
50
51 setLayout(new BorderLayout());
52
53 tree = new JTree((TreeNode) null);
54
55 tree.addTreeSelectionListener(this);
56
57 tree.addMouseListener(new MouseAdapter() {
58 public void mouseReleased(MouseEvent e) {
59 if (e.isPopupTrigger()) {
60 TreePath path =
61 tree.getClosestPathForLocation(e.getX(), e.getY());
62 tree.setSelectionPath(path);
63
64 JPopupMenu menu =
65 new ASTNodePopupMenu(model, (SimpleNode) path.getLastPathComponent());
66
67 menu.show(tree, e.getX(), e.getY());
68 }
69 }
70 });
71
72 add(new JScrollPane(tree), BorderLayout.CENTER);
73 }
74
75 /***
76 * @see ViewerModelListener#viewerModelChanged(ViewerModelEvent)
77 */
78 public void viewerModelChanged(ViewerModelEvent e) {
79 switch (e.getReason()) {
80 case ViewerModelEvent.CODE_RECOMPILED:
81 tree.setModel(new ASTModel(model.getRootNode()));
82 break;
83 case ViewerModelEvent.NODE_SELECTED:
84 if (e.getSource() != this) {
85 LinkedList list = new LinkedList();
86 for (
87 Node node = (Node) e.getParameter(); node != null;
88 node = node.jjtGetParent())
89 list.addFirst(node);
90 TreePath path = new TreePath(list.toArray());
91 tree.setSelectionPath(path);
92 tree.scrollPathToVisible(path);
93 }
94 break;
95 }
96 }
97
98 /***
99 * @see javax.swing.event.TreeSelectionListener#valueChanged(javax.swing.event.TreeSelectionEvent)
100 */
101 public void valueChanged(TreeSelectionEvent e) {
102 model.selectNode((SimpleNode) e.getNewLeadSelectionPath().getLastPathComponent(), this);
103 }
104 }