1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.ui;
14
15 import java.awt.BorderLayout;
16 import java.awt.event.ActionEvent;
17 import java.awt.event.KeyAdapter;
18 import java.awt.event.KeyEvent;
19 import java.awt.event.MouseAdapter;
20 import java.awt.event.MouseEvent;
21 import java.util.HashSet;
22 import java.util.Set;
23
24 import javax.swing.JPanel;
25 import javax.swing.JPopupMenu;
26 import javax.swing.JScrollPane;
27 import javax.swing.JTree;
28 import javax.swing.ToolTipManager;
29 import javax.swing.event.TreeSelectionEvent;
30 import javax.swing.event.TreeSelectionListener;
31 import javax.swing.tree.TreePath;
32 import javax.swing.tree.TreeSelectionModel;
33
34 import com.eviware.soapui.model.ModelItem;
35 import com.eviware.soapui.model.project.Project;
36 import com.eviware.soapui.model.tree.SoapUITreeModel;
37 import com.eviware.soapui.model.tree.SoapUITreeNode;
38 import com.eviware.soapui.model.tree.SoapUITreeNodeRenderer;
39 import com.eviware.soapui.model.tree.nodes.ProjectTreeNode;
40 import com.eviware.soapui.model.workspace.Workspace;
41 import com.eviware.soapui.support.action.ActionList;
42
43 /***
44 * The soapUI navigator tree
45 *
46 * @author Ole.Matzura
47 */
48
49 public class Navigator extends JPanel
50 {
51 private Workspace workspace;
52 private JTree mainTree;
53 private SoapUITreeModel treeModel;
54 private Set<NavigatorListener> listeners = new HashSet<NavigatorListener>();
55
56 public Navigator( Workspace workspace )
57 {
58 super( new BorderLayout() );
59 this.workspace = workspace;
60
61 buildUI();
62 }
63
64 private void buildUI()
65 {
66 treeModel = new SoapUITreeModel(workspace);
67
68 mainTree = new JTree( treeModel );
69 mainTree.setRootVisible(true);
70 mainTree.setExpandsSelectedPaths(true);
71 mainTree.setToggleClickCount( 0 );
72 mainTree.addMouseListener(new TreeMouseListener());
73 mainTree.addTreeSelectionListener(new InternalTreeSelectionListener());
74 mainTree.setCellRenderer( new SoapUITreeNodeRenderer() );
75 mainTree.setBorder(null);
76 mainTree.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION );
77
78 mainTree.addKeyListener( new TreeKeyListener() );
79
80 ToolTipManager.sharedInstance().registerComponent(mainTree);
81
82 add( new JScrollPane( mainTree ), BorderLayout.CENTER );
83 }
84
85 public Project getCurrentProject()
86 {
87 TreePath path = mainTree.getSelectionPath();
88 if( path == null )
89 return null;
90
91 Object node = (Object) path.getLastPathComponent();
92 while (node != null && !(node instanceof ProjectTreeNode))
93 {
94 path = path.getParentPath();
95 node = (path == null ? null : path.getLastPathComponent());
96 }
97
98 if (node == null)
99 return null;
100
101 return ((ProjectTreeNode) node).getProject();
102 }
103
104 public void addNavigatorListener( NavigatorListener listener )
105 {
106 listeners.add( listener );
107 }
108
109 public void removeNavigatorListener( NavigatorListener listener )
110 {
111 listeners.remove( listener );
112 }
113
114 public void selectModelItem(ModelItem modelItem)
115 {
116 TreePath path = treeModel.getPath( modelItem );
117 mainTree.setSelectionPath( path );
118 mainTree.expandPath( path );
119 mainTree.scrollPathToVisible( path );
120 }
121
122 public JTree getMainTree()
123 {
124 return mainTree;
125 }
126
127 private final class TreeKeyListener extends KeyAdapter
128 {
129 public void keyPressed(KeyEvent e)
130 {
131 TreePath selectionPath = mainTree.getSelectionPath();
132 if( selectionPath != null )
133 {
134 SoapUITreeNode lastPathComponent = (SoapUITreeNode) selectionPath.getLastPathComponent();
135 ActionList actions = lastPathComponent.getModelItem().getActions();
136 if( actions != null )
137 {
138 actions.dispatchKeyEvent( e );
139 }
140 }
141 }
142 }
143
144 public class InternalTreeSelectionListener implements TreeSelectionListener
145 {
146 public void valueChanged(TreeSelectionEvent e)
147 {
148 Object obj = e.getPath().getLastPathComponent();
149 if (obj instanceof SoapUITreeNode)
150 {
151 SoapUITreeNode treeNode = (SoapUITreeNode) obj;
152
153 if( !listeners.isEmpty() )
154 {
155 TreePath newPath = e.getNewLeadSelectionPath();
156 NavigatorListener[] array = listeners.toArray( new NavigatorListener[listeners.size()]);
157 for( NavigatorListener listener : array )
158 {
159 listener.nodeSelected( newPath == null ? null : treeNode );
160 }
161 }
162 }
163 }
164 }
165
166 public class TreeMouseListener extends MouseAdapter
167 {
168 public void mouseClicked(MouseEvent e)
169 {
170 if (e.isPopupTrigger())
171 showPopup(e);
172 else if (e.getClickCount() < 2)
173 return;
174 if (mainTree.getSelectionCount() != 1)
175 return;
176
177 TreePath path = mainTree.getSelectionPath();
178 if( path == null )
179 return;
180
181 SoapUITreeNode node = (SoapUITreeNode) path.getLastPathComponent();
182
183 ModelItem modelItem = node.getModelItem();
184 ActionList actions = modelItem.getActions();
185 if( actions != null )
186 actions.performDefaultAction( new ActionEvent( mainTree, 0, null ));
187 }
188
189 public void mousePressed(MouseEvent e)
190 {
191 if (e.isPopupTrigger())
192 showPopup(e);
193 }
194
195 public void mouseReleased(MouseEvent e)
196 {
197 if (e.isPopupTrigger())
198 showPopup(e);
199 }
200
201 private void showPopup(MouseEvent e)
202 {
203 TreePath path = mainTree.getPathForLocation((int) e.getPoint().getX(), (int) e.getPoint().getY());
204 if (path == null)
205 return;
206 SoapUITreeNode node = (SoapUITreeNode) path.getLastPathComponent();
207
208 JPopupMenu popupMenu = node.getPopup();
209 if (popupMenu == null)
210 return;
211
212 mainTree.setSelectionPath(path);
213
214 popupMenu.show(mainTree, e.getX(), e.getY());
215 }
216 }
217
218 public boolean isVisible( TreePath path )
219 {
220 return mainTree.isVisible( path );
221 }
222
223 public boolean isExpanded( TreePath path )
224 {
225 return mainTree.isExpanded( path );
226 }
227 }