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 Object node = (Object) path.getLastPathComponent();
89 while (node != null && !(node instanceof ProjectTreeNode))
90 {
91 path = path.getParentPath();
92 node = (path == null ? null : path.getLastPathComponent());
93 }
94
95 if (node == null)
96 return null;
97
98 return ((ProjectTreeNode) node).getProject();
99 }
100
101 public void addNavigatorListener( NavigatorListener listener )
102 {
103 listeners.add( listener );
104 }
105
106 public void removeNavigatorListener( NavigatorListener listener )
107 {
108 listeners.remove( listener );
109 }
110
111 public void selectModelItem(ModelItem modelItem)
112 {
113 TreePath path = treeModel.getPath( modelItem );
114 mainTree.setSelectionPath( path );
115 mainTree.expandPath( path );
116 mainTree.scrollPathToVisible( path );
117 }
118
119 private final class TreeKeyListener extends KeyAdapter
120 {
121 public void keyPressed(KeyEvent e)
122 {
123 SoapUITreeNode lastPathComponent = (SoapUITreeNode) mainTree.getSelectionPath().getLastPathComponent();
124 ActionList actions = lastPathComponent.getModelItem().getActions();
125 if( actions != null )
126 {
127 actions.dispatchKeyEvent( e );
128 }
129 }
130 }
131
132 public class InternalTreeSelectionListener implements TreeSelectionListener
133 {
134 public void valueChanged(TreeSelectionEvent e)
135 {
136 Object obj = e.getPath().getLastPathComponent();
137 if (obj instanceof SoapUITreeNode)
138 {
139 SoapUITreeNode treeNode = (SoapUITreeNode) obj;
140
141 if( !listeners.isEmpty() )
142 {
143 TreePath newPath = e.getNewLeadSelectionPath();
144 NavigatorListener[] array = listeners.toArray( new NavigatorListener[listeners.size()]);
145 for( NavigatorListener listener : array )
146 {
147 listener.nodeSelected( newPath == null ? null : treeNode );
148 }
149 }
150 }
151 }
152 }
153
154 public class TreeMouseListener extends MouseAdapter
155 {
156 public void mouseClicked(MouseEvent e)
157 {
158 if (e.isPopupTrigger())
159 showPopup(e);
160 else if (e.getClickCount() < 2)
161 return;
162 if (mainTree.getSelectionCount() != 1)
163 return;
164
165 TreePath path = mainTree.getSelectionPath();
166 SoapUITreeNode node = (SoapUITreeNode) path.getLastPathComponent();
167
168 ModelItem modelItem = node.getModelItem();
169 ActionList actions = modelItem.getActions();
170 if( actions != null )
171 actions.performDefaultAction( new ActionEvent( mainTree, 0, null ));
172 }
173
174 public void mousePressed(MouseEvent e)
175 {
176 if (e.isPopupTrigger())
177 showPopup(e);
178 }
179
180 public void mouseReleased(MouseEvent e)
181 {
182 if (e.isPopupTrigger())
183 showPopup(e);
184 }
185
186 private void showPopup(MouseEvent e)
187 {
188 TreePath path = mainTree.getPathForLocation((int) e.getPoint().getX(), (int) e.getPoint().getY());
189 if (path == null)
190 return;
191 SoapUITreeNode node = (SoapUITreeNode) path.getLastPathComponent();
192
193 JPopupMenu popupMenu = node.getPopup();
194 if (popupMenu == null)
195 return;
196
197 mainTree.setSelectionPath(path);
198
199 popupMenu.show(mainTree, e.getX(), e.getY());
200 }
201 }
202
203 public boolean isVisible( TreePath path )
204 {
205 return mainTree.isVisible( path );
206 }
207
208 public boolean isExpanded( TreePath path )
209 {
210 return mainTree.isExpanded( path );
211 }
212 }