001 package net.sourceforge.pmd.util.viewer.gui;
002
003 import java.awt.BorderLayout;
004 import java.awt.event.MouseAdapter;
005 import java.awt.event.MouseEvent;
006 import java.util.ArrayList;
007 import java.util.Collections;
008 import java.util.List;
009
010 import javax.swing.BorderFactory;
011 import javax.swing.JPanel;
012 import javax.swing.JPopupMenu;
013 import javax.swing.JScrollPane;
014 import javax.swing.JTree;
015 import javax.swing.event.TreeSelectionEvent;
016 import javax.swing.event.TreeSelectionListener;
017 import javax.swing.tree.TreeNode;
018 import javax.swing.tree.TreePath;
019
020 import net.sourceforge.pmd.lang.ast.Node;
021 import net.sourceforge.pmd.util.viewer.gui.menu.ASTNodePopupMenu;
022 import net.sourceforge.pmd.util.viewer.model.ASTModel;
023 import net.sourceforge.pmd.util.viewer.model.ViewerModel;
024 import net.sourceforge.pmd.util.viewer.model.ViewerModelEvent;
025 import net.sourceforge.pmd.util.viewer.model.ViewerModelListener;
026 import net.sourceforge.pmd.util.viewer.util.NLS;
027
028 /**
029 * tree panel GUI
030 *
031 * @author Boris Gruschko ( boris at gruschko.org )
032 * @version $Id: ASTPanel.java 6321 2008-07-02 04:18:58Z rgustav $
033 */
034
035 public class ASTPanel extends JPanel implements ViewerModelListener, TreeSelectionListener {
036 private ViewerModel model;
037 private JTree tree;
038
039 /**
040 * constructs the panel
041 *
042 * @param model model to attach the panel to
043 */
044 public ASTPanel(ViewerModel model) {
045 this.model = model;
046 init();
047 }
048
049 private void init() {
050 model.addViewerModelListener(this);
051 setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), NLS.nls("AST.PANEL.TITLE")));
052 setLayout(new BorderLayout());
053 tree = new JTree((TreeNode) null);
054 tree.addTreeSelectionListener(this);
055 tree.addMouseListener(new MouseAdapter() {
056 public void mouseReleased(MouseEvent e) {
057 if (e.isPopupTrigger()) {
058 TreePath path = tree.getClosestPathForLocation(e.getX(), e.getY());
059 tree.setSelectionPath(path);
060 JPopupMenu menu = new ASTNodePopupMenu(model, (Node) path.getLastPathComponent());
061 menu.show(tree, e.getX(), e.getY());
062 }
063 }
064 });
065
066 add(new JScrollPane(tree), BorderLayout.CENTER);
067 }
068
069 /**
070 * @see ViewerModelListener#viewerModelChanged(ViewerModelEvent)
071 */
072 public void viewerModelChanged(ViewerModelEvent e) {
073 switch (e.getReason()) {
074 case ViewerModelEvent.CODE_RECOMPILED:
075 tree.setModel(new ASTModel(model.getRootNode()));
076 break;
077 case ViewerModelEvent.NODE_SELECTED:
078 if (e.getSource() != this) {
079 List<Node> list = new ArrayList<Node>();
080 for (Node n = (Node) e.getParameter(); n != null; n = n.jjtGetParent()) {
081 list.add(n);
082 }
083 Collections.reverse(list);
084 TreePath path = new TreePath(list.toArray());
085 tree.setSelectionPath(path);
086 tree.scrollPathToVisible(path);
087 }
088 break;
089 default:
090 // Do nothing
091 break;
092 }
093 }
094
095 /**
096 * @see javax.swing.event.TreeSelectionListener#valueChanged(javax.swing.event.TreeSelectionEvent)
097 */
098 public void valueChanged(TreeSelectionEvent e) {
099 model.selectNode((Node) e.getNewLeadSelectionPath().getLastPathComponent(), this);
100 }
101 }
|