1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.x.form.support;
14
15 import java.awt.BorderLayout;
16 import java.awt.Component;
17 import java.awt.Dimension;
18 import java.awt.event.ActionEvent;
19 import java.awt.event.MouseAdapter;
20 import java.awt.event.MouseEvent;
21 import java.util.ArrayList;
22 import java.util.Arrays;
23 import java.util.List;
24
25 import javax.swing.AbstractAction;
26 import javax.swing.BorderFactory;
27 import javax.swing.DefaultListModel;
28 import javax.swing.JButton;
29 import javax.swing.JCheckBox;
30 import javax.swing.JList;
31 import javax.swing.JPanel;
32 import javax.swing.JScrollPane;
33 import javax.swing.ListCellRenderer;
34 import javax.swing.ListSelectionModel;
35
36 import com.eviware.soapui.support.UISupport;
37 import com.eviware.soapui.support.components.JXToolBar;
38 import com.eviware.x.form.XFormOptionsField;
39 import com.eviware.x.impl.swing.AbstractSwingXFormField;
40
41 /***
42 * Swing-Specific multi-select list
43 *
44 * @author ole.matzura
45 */
46
47 public class XFormMultiSelectList extends AbstractSwingXFormField<JPanel> implements XFormOptionsField
48 {
49 private JList list;
50 private DefaultListModel listModel;
51 private List<Boolean> selected = new ArrayList<Boolean>();
52
53 public XFormMultiSelectList( String [] values )
54 {
55 super( new JPanel( new BorderLayout() ) );
56
57 listModel = new DefaultListModel();
58 for( String value : values )
59 {
60 selected.add( false );
61 listModel.addElement( value );
62 }
63
64 list = new JList( listModel );
65 list.setCellRenderer( new CheckListCellRenderer() );
66 list.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
67 list.addMouseListener(new MouseAdapter()
68 {
69 public void mousePressed(MouseEvent e)
70 {
71 int index = list.locationToIndex(e.getPoint());
72
73 if (index != -1)
74 {
75 selected.set( index, !selected.get( index ));
76 list.repaint();
77 }
78 }
79 });
80
81 getComponent().add( new JScrollPane( list ), BorderLayout.CENTER );
82 getComponent().add( buildToolbar(), BorderLayout.SOUTH );
83 getComponent().setSize( new Dimension( 400, 120 ) );
84 getComponent().setMaximumSize( new Dimension( 400, 120 ) );
85 getComponent().setPreferredSize( new Dimension( 400, 120 ) );
86 getComponent().setMinimumSize( new Dimension( 400, 120 ) );
87 }
88
89 private Component buildToolbar()
90 {
91 JXToolBar toolbar = UISupport.createSmallToolbar();
92
93 toolbar.addFixed( new JButton( new SelectAllAction() ));
94 toolbar.addRelatedGap();
95 toolbar.addFixed( new JButton( new UnselectAllAction() ));
96
97 return toolbar;
98 }
99
100 public String getValue()
101 {
102 return ( String ) list.getSelectedValue();
103 }
104
105 public void setValue( String value )
106 {
107 int index = listModel.indexOf( value );
108 selected.set( index, true );
109 list.setSelectedIndex( index );
110 }
111
112 public void addItem( String value )
113 {
114 listModel.addElement( value );
115 selected.add( false );
116 }
117
118 public String[] getOptions()
119 {
120 String [] options = new String[listModel.size()];
121 for( int c = 0; c < options.length; c++ )
122 options[c] = ( String ) listModel.get( c );
123 return options;
124 }
125
126 public String[] getSelectedOptions()
127 {
128 List<String> result = new ArrayList<String>();
129
130 for( int c = 0; c < selected.size(); c++ )
131 {
132 if( selected.get( c ))
133 result.add( ( String ) listModel.get( c ));
134 }
135
136 return result.toArray( new String[result.size()] );
137 }
138
139 public void setOptions( Object[] values )
140 {
141 listModel.clear();
142 selected.clear();
143 for( Object value : values )
144 {
145 selected.add( false );
146 listModel.addElement( value );
147 }
148 }
149
150 public class CheckListCellRenderer extends JCheckBox implements ListCellRenderer
151 {
152 public CheckListCellRenderer()
153 {
154 setBorder( BorderFactory.createEmptyBorder( 3, 3, 3, 3 ) );
155 }
156
157 public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected,
158 boolean cellHasFocus )
159 {
160 setText( value.toString() );
161 setSelected( selected.get( index ) );
162
163 if (isSelected)
164 {
165 setBackground(list.getSelectionBackground());
166 setForeground(list.getSelectionForeground());
167 }
168 else
169 {
170 setBackground(list.getBackground());
171 setForeground(list.getForeground());
172 }
173
174 return this;
175 }
176 }
177
178 public void setSelectedOptions( String[] options )
179 {
180 List<String> asList = Arrays.asList( options );
181
182 for( int c = 0; c < selected.size(); c++ )
183 {
184 selected.set( c, asList.contains( listModel.get( c )));
185 }
186
187 list.repaint();
188 }
189
190 private class SelectAllAction extends AbstractAction
191 {
192 public SelectAllAction()
193 {
194 super( "Select all" );
195 putValue( SHORT_DESCRIPTION, "Selects all items in the list" );
196 }
197
198 public void actionPerformed( ActionEvent e )
199 {
200 setSelectedOptions( getOptions() );
201 }
202 }
203
204 private class UnselectAllAction extends AbstractAction
205 {
206 public UnselectAllAction()
207 {
208 super( "Unselect all" );
209 putValue( SHORT_DESCRIPTION, "Unselects all items in the list" );
210 }
211
212 public void actionPerformed( ActionEvent e )
213 {
214 setSelectedOptions( new String[0] );
215 }
216 }
217
218 public int[] getSelectedIndexes()
219 {
220 int cnt = 0;
221
222 for( int c = 0; c < selected.size(); c++ )
223 {
224 if( selected.get( c ))
225 cnt++;
226 }
227
228 int [] result = new int[cnt];
229 cnt = 0;
230
231 for( int c = 0; c < selected.size(); c++ )
232 {
233 if( selected.get( c ))
234 result[cnt++] = c;
235 }
236
237 return result;
238 }
239 }