View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2010 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 }