View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2007 eviware.com 
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of version 2.1 of the GNU Lesser General Public License as published by 
6    *  the Free Software Foundation.
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        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 }