ASTPanel.java
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((TreeNodenull);
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, (Nodepath.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 = (Nodee.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((Nodee.getNewLeadSelectionPath().getLastPathComponent()this);
100     }
101 }