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.support.swing;
14  
15  import java.awt.event.ActionEvent;
16  import java.awt.event.MouseAdapter;
17  import java.awt.event.MouseEvent;
18  
19  import javax.swing.JList;
20  import javax.swing.JPopupMenu;
21  
22  import com.eviware.soapui.support.UISupport;
23  import com.eviware.soapui.support.action.swing.ActionList;
24  import com.eviware.soapui.support.action.swing.ActionSupport;
25  
26  /***
27   * Abstract MouseListener for JLists that displays a row-sensitive popup-menu
28   * 
29   * @author ole.matzura
30   */
31  
32  public abstract class AbstractListMouseListener extends MouseAdapter
33  {
34  	private boolean enablePopup;
35  	private JPopupMenu menu;
36  	
37  	protected abstract ActionList getActionsForRow( JList list, int row );
38  	
39  	public AbstractListMouseListener()
40  	{
41  		this( true );
42  	}
43  	
44  	public AbstractListMouseListener( boolean enablePopup )
45  	{
46  		this.enablePopup = enablePopup;
47  	}
48  	
49  	public void mouseClicked( MouseEvent e )
50  	{
51  		if (e.getClickCount() < 2)
52  			return;
53  		
54  		JList list = ( JList ) e.getSource();
55  		
56  		int selectedIndex = list.getSelectedIndex();
57  		
58  		ActionList actions = selectedIndex == -1 ? getDefaultActions() : getActionsForRow( list, selectedIndex );
59  		
60  		if(actions != null)
61  			actions.performDefaultAction(new ActionEvent(this, 0, null));
62  	}
63  
64  	protected ActionList getDefaultActions()
65  	{
66  		return null;
67  	}
68  	
69  	public void mousePressed( MouseEvent e )
70  	{
71  		if (e.isPopupTrigger())
72  			showPopup(e);
73  	}
74  
75  	public void mouseReleased( MouseEvent e )
76  	{
77  		if (e.isPopupTrigger())
78  			showPopup(e);
79  	}
80  
81  	public void showPopup( MouseEvent e )
82  	{
83  		if( !enablePopup )
84  			return;
85  		
86  		ActionList actions = null;
87  		JList list = ( JList ) e.getSource();
88  		int row = list.locationToIndex(e.getPoint());
89  		if (row == -1 || !list.getCellBounds( row, row ).contains( e.getPoint() ))
90  		{
91  			if( list.getSelectedIndex() != -1 )
92  				list.clearSelection();
93  			
94  			actions = getDefaultActions();
95  		}
96  		else
97  		{
98  			if (list.getSelectedIndex() != row)
99  			{
100 				list.setSelectedIndex(row);
101 			}
102 		
103 			actions = getActionsForRow( list, row );
104 		}
105 	
106 		if (actions == null || actions.getActionCount() == 0)
107 			return;
108 	
109 		JPopupMenu popup = menu == null ? ActionSupport.buildPopup(actions) : menu;
110 		UISupport.showPopup(popup, list, e.getPoint());
111 	}
112 	
113 	public void setPopupMenu( JPopupMenu menu )
114 	{
115 		this.menu = menu;
116 	}
117 }