package net.sourceforge.pmd.util.viewer.gui; import net.sourceforge.pmd.ast.Node; import net.sourceforge.pmd.ast.SimpleNode; import net.sourceforge.pmd.util.viewer.gui.menu.ASTNodePopupMenu; import net.sourceforge.pmd.util.viewer.model.ASTModel; import net.sourceforge.pmd.util.viewer.model.ViewerModel; import net.sourceforge.pmd.util.viewer.model.ViewerModelEvent; import net.sourceforge.pmd.util.viewer.model.ViewerModelListener; import net.sourceforge.pmd.util.viewer.util.NLS; import javax.swing.*; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.LinkedList; /** * tree panel GUI * * @author Boris Gruschko ( boris at gruschko.org ) * @version $Id: ASTPanel.java,v 1.3 2004/04/15 18:21:58 tomcopeland Exp $ */ public class ASTPanel extends JPanel implements ViewerModelListener, TreeSelectionListener { private ViewerModel model; private JTree tree; /** * constructs the panel * * @param model model to attach the panel to */ public ASTPanel( ViewerModel model ) { this.model = model; init( ); } private void init( ) { model.addViewerModelListener( this ); setBorder( BorderFactory.createTitledBorder( BorderFactory.createEtchedBorder( ), NLS.nls( "AST.PANEL.TITLE" ) ) ); setLayout( new BorderLayout( ) ); tree = new JTree( (TreeNode)null ); tree.addTreeSelectionListener( this ); tree.addMouseListener( new MouseAdapter( ) { public void mouseReleased( MouseEvent e ) { if ( e.isPopupTrigger( ) ) { TreePath path = tree.getClosestPathForLocation( e.getX( ), e.getY( ) ); tree.setSelectionPath( path ); JPopupMenu menu = new ASTNodePopupMenu( model, (SimpleNode)path.getLastPathComponent( ) ); menu.show( tree, e.getX( ), e.getY( ) ); } } } ); add( new JScrollPane( tree ), BorderLayout.CENTER ); } /** * @see org.gruschko.pmd.viewer.model.ViewerModelListener#viewerModelChanged(org.gruschko.pmd.viewer.model.ViewerModelEvent) */ public void viewerModelChanged( ViewerModelEvent e ) { switch ( e.getReason( ) ) { case ViewerModelEvent.CODE_RECOMPILED : tree.setModel( new ASTModel( model.getRootNode( ) ) ); break; case ViewerModelEvent.NODE_SELECTED : if ( e.getSource( ) != this ) { LinkedList list = new LinkedList( ); for ( Node node = (Node)e.getParameter( ); node != null; node = node.jjtGetParent( ) ) list.addFirst( node ); TreePath path = new TreePath( list.toArray( ) ); tree.setSelectionPath( path ); tree.scrollPathToVisible( path ); } break; } } /** * @see javax.swing.event.TreeSelectionListener#valueChanged(javax.swing.event.TreeSelectionEvent) */ public void valueChanged( TreeSelectionEvent e ) { model.selectNode( (SimpleNode)e.getNewLeadSelectionPath( ).getLastPathComponent( ), this ); } } /* * $Log: ASTPanel.java,v $ * Revision 1.3 2004/04/15 18:21:58 tomcopeland * Cleaned up imports with new version of IDEA; fixed some deprecated Ant junx * * Revision 1.2 2003/09/23 20:51:06 tomcopeland * Cleaned up imports * * Revision 1.1 2003/09/23 20:32:42 tomcopeland * Added Boris Gruschko's new AST/XPath viewer * * Revision 1.1 2003/09/24 01:33:03 bgr * moved to a new package * * Revision 1.3 2003/09/24 00:40:35 bgr * evaluation results browsing added * * Revision 1.2 2003/09/23 07:52:16 bgr * menus added * * Revision 1.1 2003/09/22 05:21:54 bgr * initial commit * */