View Javadoc

1   /*
2    *  soapUI, copyright (C) 2006 eviware.com 
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of the GNU Lesser General Public License as published by the Free Software Foundation; 
6    *  either version 2.1 of the License, or (at your option) any later version.
7    *
8    *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
9    *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
10   *  See the GNU Lesser General Public License for more details at gnu.org.
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 }