View Javadoc

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 }