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.*;
18 import java.awt.event.MouseAdapter;
19 import java.awt.event.MouseEvent;
20 import java.util.LinkedList;
21
22
23 /***
24 * tree panel GUI
25 *
26 * @author Boris Gruschko ( boris at gruschko.org )
27 * @version $Id: ASTPanel.java,v 1.3 2004/04/15 18:21:58 tomcopeland Exp $
28 */
29 public class ASTPanel
30 extends JPanel
31 implements ViewerModelListener, TreeSelectionListener
32 {
33 private ViewerModel model;
34 private JTree tree;
35
36 /***
37 * constructs the panel
38 *
39 * @param model model to attach the panel to
40 */
41 public ASTPanel( ViewerModel model )
42 {
43 this.model = model;
44
45 init( );
46 }
47
48 private void init( )
49 {
50 model.addViewerModelListener( this );
51
52 setBorder(
53 BorderFactory.createTitledBorder(
54 BorderFactory.createEtchedBorder( ), NLS.nls( "AST.PANEL.TITLE" ) ) );
55
56 setLayout( new BorderLayout( ) );
57
58 tree = new JTree( (TreeNode)null );
59
60 tree.addTreeSelectionListener( this );
61
62 tree.addMouseListener(
63 new MouseAdapter( )
64 {
65 public void mouseReleased( MouseEvent e )
66 {
67 if ( e.isPopupTrigger( ) )
68 {
69 TreePath path =
70 tree.getClosestPathForLocation( e.getX( ), e.getY( ) );
71 tree.setSelectionPath( path );
72
73 JPopupMenu menu =
74 new ASTNodePopupMenu(
75 model, (SimpleNode)path.getLastPathComponent( ) );
76
77 menu.show( tree, e.getX( ), e.getY( ) );
78 }
79 }
80 } );
81
82 add( new JScrollPane( tree ), BorderLayout.CENTER );
83 }
84
85 /***
86 * @see org.gruschko.pmd.viewer.model.ViewerModelListener#viewerModelChanged(org.gruschko.pmd.viewer.model.ViewerModelEvent)
87 */
88 public void viewerModelChanged( ViewerModelEvent e )
89 {
90 switch ( e.getReason( ) )
91 {
92 case ViewerModelEvent.CODE_RECOMPILED :
93 tree.setModel( new ASTModel( model.getRootNode( ) ) );
94
95 break;
96
97 case ViewerModelEvent.NODE_SELECTED :
98
99 if ( e.getSource( ) != this )
100 {
101 LinkedList list = new LinkedList( );
102
103 for (
104 Node node = (Node)e.getParameter( ); node != null;
105 node = node.jjtGetParent( ) )
106 list.addFirst( node );
107
108 TreePath path = new TreePath( list.toArray( ) );
109
110 tree.setSelectionPath( path );
111
112 tree.scrollPathToVisible( path );
113 }
114
115 break;
116 }
117 }
118
119 /***
120 * @see javax.swing.event.TreeSelectionListener#valueChanged(javax.swing.event.TreeSelectionEvent)
121 */
122 public void valueChanged( TreeSelectionEvent e )
123 {
124 model.selectNode(
125 (SimpleNode)e.getNewLeadSelectionPath( ).getLastPathComponent( ), this );
126 }
127 }
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153