View Javadoc

1   /*
2    * Copyright (c) 2006 Stiftung Deutsches Elektronen-Synchroton,
3    * Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY.
4    *
5    * THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS.
6    * WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
7    * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND
8    * NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
9    * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
10   * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
11   * THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE
12   * IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR
13   * CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE.
14   * NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
15   * DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
16   * OR MODIFICATIONS.
17   * THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION,
18   * USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS
19   * PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY
20   * AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM
21   */
22  
23  package de.desy.acop.displayers.selector;
24  
25  import java.awt.Component;
26  import java.awt.Dimension;
27  import java.awt.GridBagConstraints;
28  import java.awt.GridBagLayout;
29  import java.awt.Insets;
30  import java.awt.datatransfer.Clipboard;
31  import java.awt.datatransfer.DataFlavor;
32  import java.awt.datatransfer.StringSelection;
33  import java.awt.datatransfer.Transferable;
34  import java.awt.datatransfer.UnsupportedFlavorException;
35  import java.awt.event.ActionEvent;
36  import java.awt.event.ActionListener;
37  import java.awt.event.FocusEvent;
38  import java.awt.event.FocusListener;
39  import java.awt.event.MouseAdapter;
40  import java.awt.event.MouseEvent;
41  import java.awt.event.MouseMotionAdapter;
42  import java.beans.Beans;
43  import java.beans.Customizer;
44  import java.beans.PropertyChangeEvent;
45  import java.beans.PropertyChangeListener;
46  import java.io.IOException;
47  import java.util.ArrayList;
48  import java.util.Arrays;
49  import java.util.StringTokenizer;
50  import java.util.concurrent.LinkedBlockingQueue;
51  import java.util.concurrent.RejectedExecutionHandler;
52  import java.util.concurrent.ThreadPoolExecutor;
53  import java.util.concurrent.TimeUnit;
54  
55  import javax.swing.DefaultListCellRenderer;
56  import javax.swing.JButton;
57  import javax.swing.JCheckBox;
58  import javax.swing.JComboBox;
59  import javax.swing.JComponent;
60  import javax.swing.JDialog;
61  import javax.swing.JFrame;
62  import javax.swing.JLabel;
63  import javax.swing.JList;
64  import javax.swing.JMenuItem;
65  import javax.swing.JPanel;
66  import javax.swing.JPopupMenu;
67  import javax.swing.JTextField;
68  import javax.swing.SwingConstants;
69  import javax.swing.SwingUtilities;
70  import javax.swing.TransferHandler;
71  
72  import com.cosylab.gui.components.NumberField;
73  import com.cosylab.gui.components.util.ComponentPositioner;
74  import com.cosylab.gui.components.util.IconHelper;
75  import com.cosylab.gui.components.util.RunnerHelper;
76  import com.cosylab.gui.util.DisplayerParametersSelectorDialog;
77  import com.cosylab.util.ListenerList;
78  import com.cosylab.util.NumericStringComparator;
79  
80  import de.desy.acop.displayers.AcopSpider;
81  import de.desy.acop.displayers.tools.ConnectionParametersReceiver;
82  import de.desy.acop.displayers.tools.MultipleAcopDisplayer;
83  import de.desy.acop.transport.AccessMode;
84  import de.desy.acop.transport.ConnectionParameters;
85  
86  /**
87   * <code>SelectorGUI</code> is a visual component which enables the construction
88   * of <code>ConnectionParameters</code>. The component consists of sevral combo boxes
89   * and input fields which allow user to configure the connection point. When
90   * constructing a valid ConnectionParameters a SelectorGUIEvent will be
91   * fired notifying the listeners that selection was completed.
92   *  
93   * 
94   * @author <a href="mailto:jaka.bobnar@cosylab.com">Jaka Bobnar</a>
95   * @version $Id: Templates.xml,v 1.10 2004/01/13 16:17:13 jbobnar Exp $
96   * @see ConnectionParameters
97   */
98  public class SelectorGUI extends JPanel implements Customizer {
99  		
100 	private class ComboRenderer extends DefaultListCellRenderer {
101 		
102 		private static final long serialVersionUID = 1L;
103 
104 		@Override
105 		public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
106 		
107 			Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
108 			if (value != null && c instanceof JLabel) {
109 				((JLabel)c).setToolTipText(String.valueOf(value));
110 			}
111 			return c;
112 		}
113 	}
114 	
115 	private enum ExtendedData{
116 		BYTE ("byte"),
117 		SHORT ("short"),
118 		INT16 ("int16"),
119 		INT ("int"),
120 		INT32 ("int32"),
121 		LONG ("long"),
122 		INT64 ("int64"),
123 		DOUBLE ("double"),
124 		FLOAT ("float"),
125 		CHAR ("char"),
126 		STRING ("String");
127 		
128 		private final String displayName;
129 		
130 		private ExtendedData(String name) {
131 			displayName = name;
132 		}
133 		
134 		public String toString() {
135 			return displayName;
136 		}
137 	}
138 	
139 	
140 	private static final long serialVersionUID = 1647591422586736408L;
141 	
142 	private static final String AUTO = "Auto";
143 	private static final String ACTUAL = "Actual";
144 	private Object disp;
145 	
146 	private JPanel commandPanel;
147 	private JComboBox accessProtocolCombo;
148 	private JComboBox deviceContextCombo;
149 	private JComboBox subSystemCombo;
150 	private JComboBox deviceServerCombo;
151 	private JComboBox deviceNameCombo;
152 	private JComboBox propertyNameCombo;
153 	private AcopComboBoxModel<String> accessProtocolModel;
154 	private AcopComboBoxModel<String> deviceContextModel;
155 	private AcopComboBoxModel<String> subSystemModel;
156 	private AcopComboBoxModel<String> deviceServerModel;
157 	private AcopComboBoxModel<String> deviceNameModel;
158 	private AcopComboBoxModel<String> propertyNameModel;
159 	private AcopComboBoxModel<String> arraySizeModel;
160 	private AcopComboBoxModel<ExtendedData> extendedDataModel;
161 	private NumberField accessRateField;
162 	private JLabel accessProtocolLabel;
163 	private JLabel deviceContextLabel;
164 	private JLabel subSystemLabel;
165 	private JLabel deviceServerLabel;
166 	private JLabel deviceNameLabel;
167 	private JLabel propertyNameLabel;
168 	private JLabel accessRateLabel;
169 	private JLabel selectionLabel;
170 	private JLabel descriptionLabel;
171 	private JCheckBox showStockProperties;
172 	private JComboBox accessModeCombo;
173 	private JLabel accessModeLabel;
174 	
175 	private JLabel arraySizeLabel;
176 	private JComboBox arraySizeCombo;
177 
178 	private JLabel extendedDataLabel;
179 	private JComboBox extendedDataCombo;
180 	private JTextField extendedDataTextField;
181 	
182 	private JButton advancedSelectorButton;
183 	private SelectorListGUI listSelector;
184 	private JDialog advancedSelectorDialog;
185 	
186 	private ConnectionParameters connectionParameters;
187 	private volatile Selector selector; 
188 	
189 	private ListenerList selectorGUIListeners = new ListenerList(SelectorGUIListener.class);
190 	
191 	private PropertyChangeListener selectorPropertyListener;
192 	private QueryListener selectorQueryListener;
193 	private ExceptionListener exceptionListener;
194 	private NumericStringComparator comparator = new NumericStringComparator();
195 	
196 	private AcopSpider spiderBean;
197 	private boolean onlyConnectionParametersMode = false;
198 	private boolean settingFromSelector = false;
199 	private JPopupMenu popupMenu;
200 	private JPopupMenu selectionPopup;
201 	
202 	private Dimension comboDim = new Dimension(170,21);
203 	
204 	/**
205 	 * Constructs a new SelectorGUI.
206 	 *
207 	 */
208 	public SelectorGUI() {
209 		super();
210 		initialize();
211 	}
212 	
213 	private void initialize() {
214 		deviceContextModel= new AcopComboBoxModel<String>(String.class);
215 		subSystemModel = new AcopComboBoxModel<String>(String.class);
216 		deviceServerModel= new AcopComboBoxModel<String>(String.class);
217 		deviceNameModel= new AcopComboBoxModel<String>(String.class);
218 		propertyNameModel= new AcopComboBoxModel<String>(String.class);
219 		accessProtocolModel= new AcopComboBoxModel<String>(String.class);
220 		arraySizeModel = new AcopComboBoxModel<String>(String.class);
221 		extendedDataModel = new AcopComboBoxModel<ExtendedData>(ExtendedData.class);
222 		setSelector(new Selector());
223 		
224 		this.setLayout(new GridBagLayout());
225 		this.add(getCommandPanel(), new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0));
226 		this.addMouseListener(new MouseAdapter() {
227 			@Override
228 			public void mouseReleased(MouseEvent e) {
229 				if (SwingUtilities.isRightMouseButton(e)) {
230 					getPopUpMenu().show(SelectorGUI.this, e.getX(), e.getY());
231 				}
232 			}
233 		});
234 		
235 	}
236 	
237 	private JPopupMenu getPopUpMenu() {
238 		if (popupMenu == null) {
239 			popupMenu = new JPopupMenu();
240 			JMenuItem reset = new JMenuItem("Reset selector");
241 			reset.addActionListener(new ActionListener(){
242 				public void actionPerformed(ActionEvent e) {
243 					getExecutorService().shutdownNow();
244 					executorService = null;
245 					setSelector(new Selector());
246 				}
247 			});
248 			popupMenu.add(reset);
249 		}
250 		return popupMenu;
251 	}
252 		
253 	private JPopupMenu getSelectionPopUpMenu() {
254 		if (selectionPopup == null) {
255 			selectionPopup = new JPopupMenu();
256 			JMenuItem copy = new JMenuItem("Copy");
257 			copy.addActionListener(new ActionListener(){
258 				public void actionPerformed(ActionEvent e) {
259 					Clipboard cb = getToolkit().getSystemClipboard();
260 					StringSelection strSel = new StringSelection(getSelectionLabel().getText());
261 					cb.setContents(strSel, strSel);
262 				}
263 			});
264 			selectionPopup.add(copy);
265 		}
266 		return selectionPopup;
267 	}
268 	
269 	private void applySettings() {
270 		
271 		try {
272 			String remoteName = getSelector().getRemoteName();
273 			int accessRate = getAccessRateField().getValue().intValue(); 
274 			ConnectionParameters old = connectionParameters;
275 			connectionParameters = new ConnectionParameters(remoteName,(AccessMode)getAccessModeCombo().getSelectedItem(), accessRate, getArraySize(), getExtendedData());
276 			firePropertyChange(ConnectionParametersReceiver.CONNECTION_PARAMETERS_PROPERTY,old,getConnectionParameters());
277         } catch (Exception e) {
278             handleException(e);
279         } 
280 	}
281 	
282 	private int getArraySize() {
283 		String arraySize = arraySizeModel.getSelectedItem();
284 		if (arraySize == null || AUTO.equals(arraySize)) return ConnectionParameters.AUTO_PROPERTY_SIZE;
285 		else if (arraySize.startsWith(ACTUAL)) return ConnectionParameters.ACTUAL_PROPERTY_SIZE;
286 		else return Integer.parseInt(arraySize);
287 		
288 	}
289 	
290 	private JPanel getCommandPanel() {
291 		if (commandPanel == null) {
292 			commandPanel = new JPanel(new GridBagLayout());
293 			accessProtocolLabel = new JLabel("Access protocol");
294 			accessProtocolLabel.setPreferredSize(new Dimension(120,21));
295 			accessProtocolLabel.setMinimumSize(new Dimension(120,21));
296 			accessProtocolLabel.setMaximumSize(new Dimension(120,21));
297 			commandPanel.add(accessProtocolLabel, new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
298 			commandPanel.add(getAccessProtocolCombo(), new GridBagConstraints(1,0,2,1,1,1,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
299 			
300 			deviceContextLabel = new JLabel("Device context");
301 			deviceContextLabel.setPreferredSize(new Dimension(120,21));
302 			deviceContextLabel.setMinimumSize(new Dimension(120,21));
303 			deviceContextLabel.setMaximumSize(new Dimension(120,21));
304 			commandPanel.add(deviceContextLabel, new GridBagConstraints(0,1,1,1,1,1,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
305 			commandPanel.add(getDeviceContextCombo(), new GridBagConstraints(1,1,2,1,1,1,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
306 			
307 			subSystemLabel = new JLabel("Device subsystem");
308 			subSystemLabel.setPreferredSize(new Dimension(120,21));
309 			subSystemLabel.setMinimumSize(new Dimension(120,21));
310 			subSystemLabel.setMaximumSize(new Dimension(120,21));
311 			commandPanel.add(subSystemLabel, new GridBagConstraints(0,2,1,1,1,1,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
312 			commandPanel.add(getSubSystemCombo(), new GridBagConstraints(1,2,2,1,1,1,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
313 						
314 			deviceServerLabel = new JLabel("Device server");
315 			deviceServerLabel.setPreferredSize(new Dimension(120,21));
316 			deviceServerLabel.setMinimumSize(new Dimension(120,21));
317 			deviceServerLabel.setMaximumSize(new Dimension(120,21));
318 			commandPanel.add(deviceServerLabel, new GridBagConstraints(0,3,1,1,1,1,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
319 			commandPanel.add(getDeviceServerCombo(), new GridBagConstraints(1,3,2,1,1,1,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
320 			
321 			deviceNameLabel = new JLabel("Device name");
322 			deviceNameLabel.setPreferredSize(new Dimension(120,21));
323 			deviceNameLabel.setMinimumSize(new Dimension(120,21));
324 			deviceNameLabel.setMaximumSize(new Dimension(120,21));
325 			commandPanel.add(deviceNameLabel, new GridBagConstraints(0,4,1,1,1,1,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
326 			commandPanel.add(getDeviceNameCombo(), new GridBagConstraints(1,4,2,1,1,1,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
327 			
328 			propertyNameLabel = new JLabel("Property name");
329 			propertyNameLabel.setPreferredSize(new Dimension(120,21));
330 			propertyNameLabel.setMinimumSize(new Dimension(120,21));
331 			propertyNameLabel.setMaximumSize(new Dimension(120,21));
332 			commandPanel.add(propertyNameLabel, new GridBagConstraints(0,5,1,1,1,1,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
333 			commandPanel.add(getPropertyNameCombo(), new GridBagConstraints(1,5,2,1,1,1,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
334 			
335 			commandPanel.add(getShowStockPropertiesCheckBox(), new GridBagConstraints(0,6,3,1,1,1,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
336 						
337 			accessRateLabel = new JLabel("Access rate");
338 			accessRateLabel.setPreferredSize(new Dimension(120,21));
339 			accessRateLabel.setMinimumSize(new Dimension(120,21));
340 			accessRateLabel.setMaximumSize(new Dimension(120,21));
341 			commandPanel.add(accessRateLabel, new GridBagConstraints(0,7,1,1,1,1,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
342 			commandPanel.add(getAccessRateField(), new GridBagConstraints(1,7,2,1,1,1,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
343 			
344 			accessModeLabel = new JLabel("Access mode");
345 			accessModeLabel.setPreferredSize(new Dimension(120,21));
346 			accessModeLabel.setMinimumSize(new Dimension(120,21));
347 			accessModeLabel.setMaximumSize(new Dimension(120,21));
348 			commandPanel.add(accessModeLabel, new GridBagConstraints(0,8,1,1,1,1,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
349 			commandPanel.add(getAccessModeCombo(), new GridBagConstraints(1,8,2,1,1,1,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
350 			
351 			
352 			arraySizeLabel = new JLabel("Data size");
353 			arraySizeLabel.setPreferredSize(new Dimension(120,21));
354 			arraySizeLabel.setMinimumSize(new Dimension(120,21));
355 			arraySizeLabel.setMaximumSize(new Dimension(120,21));
356 			arraySizeLabel.setToolTipText("Size of connected array, ACTUAL takes actual size, AUTO adjust size to the widget.");
357 			commandPanel.add(arraySizeLabel, new GridBagConstraints(0,9,1,1,1,1,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
358 			commandPanel.add(getArraySizeCombo(), new GridBagConstraints(1,9,2,1,1,1,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
359 			
360 			extendedDataLabel = new JLabel("Extended Data");
361 			extendedDataLabel.setPreferredSize(new Dimension(120,21));
362 			extendedDataLabel.setMinimumSize(new Dimension(120,21));
363 			extendedDataLabel.setMaximumSize(new Dimension(120,21));
364 			commandPanel.add(extendedDataLabel, new GridBagConstraints(0,10,1,1,1,1,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,1,1,1),0,0));
365 			JPanel p = new JPanel(new GridBagLayout());
366 			p.add(getExtendedDataCombo(), new GridBagConstraints(0,0,1,1,0,1,GridBagConstraints.CENTER,GridBagConstraints.VERTICAL,new Insets(0,0,1,1),0,0));
367 			p.add(getExtendedDataTextField(), new GridBagConstraints(1,0,1,1,1,0,GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,0,0,0),0,0));
368 			Dimension dim = new Dimension(comboDim.width, comboDim.height + 1);
369 			p.setMaximumSize(dim);
370 			p.setMinimumSize(dim);
371 			p.setPreferredSize(dim);
372 			commandPanel.add(p, new GridBagConstraints(1,10,2,1,1,1,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
373 			commandPanel.add(getAdvancedSelectorButton(),new GridBagConstraints(0,11,3,1,1,0,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5,1,5,1),0,0));
374 			commandPanel.add(getSelectionLabel(), new GridBagConstraints(0,12,3,1,1,0,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0,1,1,1),0,0));
375 			
376 			if (!Beans.isDesignTime()) {
377 				commandPanel.add(getDescriptionLabel(), new GridBagConstraints(0,13,3,1,1,0,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0,1,1,1),0,0));
378 			} else {
379 				commandPanel.add(getSpiderBean(), new GridBagConstraints(1,13,2,1,1,0,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,1,1,1),0,0));
380 			}
381 			
382 			setCombosEnabled(true);
383 		}
384 		return commandPanel;
385 	}
386 	
387 	private JComboBox getAccessModeCombo() {
388 		if (accessModeCombo == null) {
389 			accessModeCombo = new JComboBox(AccessMode.values());
390 			accessModeCombo.removeItem(AccessMode.WRITE);
391 			accessModeCombo.removeItem(AccessMode.WRITE_CONNECT);
392 			accessModeCombo.setSelectedItem(AccessMode.POLL);
393 			accessModeCombo.setPreferredSize(comboDim);
394 			accessModeCombo.setMinimumSize(comboDim);
395 			accessModeCombo.setMaximumSize(comboDim);
396 			accessModeCombo.setRenderer(new ComboRenderer());
397 			accessModeCombo.addActionListener(new ActionListener(){
398 				public void actionPerformed(ActionEvent e) {
399 					if (settingFromSelector) return;
400 					refreshSelectionLabel();
401 					getSelector().setAccessMode((AccessMode)accessModeCombo.getSelectedItem());
402 				}
403 			});
404 		}
405 		return accessModeCombo;
406 	}
407 	
408 	private JLabel getSelectionLabel() {
409 		if (selectionLabel == null) {
410 			selectionLabel = new JLabel();
411 			selectionLabel.setPreferredSize(new Dimension(240,21));
412 			selectionLabel.setMinimumSize(new Dimension(240,21));
413 			selectionLabel.setMaximumSize(new Dimension(240,21));
414 			selectionLabel.setIcon(IconHelper.createIcon("icons/development/ApplicationDeploy16.gif"));
415 			selectionLabel.setHorizontalAlignment(SwingConstants.CENTER);
416 			selectionLabel.addMouseMotionListener(new MouseMotionAdapter() {
417 				
418 				@Override
419 				public void mouseDragged(MouseEvent e) {
420 					applySettings();
421 					selectionLabel.getTransferHandler().exportAsDrag(selectionLabel,e,TransferHandler.COPY);
422 				}
423 			
424 			});
425 			
426 			selectionLabel.addMouseListener(new MouseAdapter() {
427 				@Override
428 				public void mouseReleased(MouseEvent e) {
429 					if (e.getButton() == MouseEvent.BUTTON3 && e.isPopupTrigger()) {
430 						getSelectionPopUpMenu().show(selectionLabel, e.getX(), e.getY());
431 					}
432 				}
433 			});
434 					
435 			selectionLabel.setTransferHandler(new TransferHandler() {
436 
437 				private static final long serialVersionUID = 1658117801619157639L;
438 				private DisplayerParametersSelectorDialog dialog;
439 				@Override
440 				public boolean importData(JComponent comp, Transferable t) {
441 					try {
442 						if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
443 							if (getConnectionParameters() == null) return false;
444 							String input = t.getTransferData(DataFlavor.stringFlavor).toString();
445 							StringTokenizer st = new StringTokenizer(input, "\n");
446 							ArrayList<ConnectionParameters> al = new ArrayList<ConnectionParameters>(0);
447 							while (st.hasMoreTokens()) {
448 								al.add(new ConnectionParameters(
449 										st.nextToken(),	AccessMode.POLL,
450 										1000));
451 							}
452 							ConnectionParameters[] cp = al.toArray(new ConnectionParameters[]{});
453 							int idx = selectByDialog(getSelectionLabel(), cp);
454 							if (idx < 0) return false;
455 							setConnectionParameters(cp[idx]);
456 							return true;
457 						}
458 					} catch (Exception e) {
459 						handleException(e);
460 					}
461 					return false;
462 				}
463 
464 				@Override
465 				protected Transferable createTransferable(JComponent c) {
466 					return new Transferable() {
467 					
468 						public Object getTransferData(DataFlavor flavor)
469 								throws UnsupportedFlavorException, IOException {
470 							if (flavor.isFlavorTextType()) {
471 								return getConnectionParameters().getRemoteName();
472 							}
473 							throw new UnsupportedFlavorException(flavor);
474 						}
475 					
476 						public boolean isDataFlavorSupported(DataFlavor flavor) {
477 							return flavor.isFlavorTextType();
478 						}
479 					
480 						public DataFlavor[] getTransferDataFlavors() {
481 							return new DataFlavor[]{DataFlavor.stringFlavor};
482 						}
483 					};
484 				}
485 
486 				@Override
487 				public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) {
488 					for (int i = 0; i < transferFlavors.length; i++) {
489 						if (transferFlavors[i].isFlavorTextType()) {
490 							return true;
491 						}
492 					}
493 					return false;
494 				}
495 				@Override
496 				public int getSourceActions(JComponent c) {
497 					return TransferHandler.COPY;
498 				}
499 				
500 				protected int selectByDialog(Component c, ConnectionParameters[] dp) {
501 					if (dialog == null) {
502 						dialog = new DisplayerParametersSelectorDialog(c, "Adding Source", "Select Source:");
503 					}
504 					String[] s= new String[dp.length];
505 					for (int i = 0; i < s.length; i++) {
506 						s[i]=dp[i].getRemoteName();
507 					}
508 					return dialog.showSelectionDialog(c,s);
509 				}
510 			});
511 			
512 			refreshSelectionLabel();
513 		}
514 		return selectionLabel;
515 	}
516 	
517 	private JLabel getDescriptionLabel() {
518 		if (descriptionLabel == null) {
519 	        descriptionLabel = new JLabel();
520 	        descriptionLabel.setPreferredSize(new Dimension(240,21));
521 	        descriptionLabel.setMinimumSize(new Dimension(240,21));
522 	        descriptionLabel.setMaximumSize(new Dimension(240,21));
523         }
524 
525         return descriptionLabel;
526 	}
527 	
528 	private JComboBox getAccessProtocolCombo() {
529 		if (accessProtocolCombo == null) {
530 			accessProtocolCombo = new JComboBox();
531 			accessProtocolCombo.setModel(accessProtocolModel);
532 			accessProtocolModel.setElements(new String[]{Selector.PROTOCOL_TINE});
533 			accessProtocolModel.setSelectedItem(null);
534 			accessProtocolCombo.setPreferredSize(comboDim);
535 			accessProtocolCombo.setMinimumSize(comboDim);
536 			accessProtocolCombo.setMaximumSize(comboDim);
537 			accessProtocolCombo.setRenderer(new ComboRenderer());
538 			accessProtocolCombo.addActionListener(new ActionListener(){
539 				public void actionPerformed(ActionEvent e) {
540 					if (settingFromSelector) return;
541 					getExecutorService().execute(new Runnable() {
542 						public void run() {
543 							getSelector().setSelectedProtocol(accessProtocolModel.getSelectedItem());							
544 						}
545 					});
546                 }
547 			});
548 		}
549 		return accessProtocolCombo;
550 	}
551 	
552 	private JComboBox getSubSystemCombo() {
553 		if (subSystemCombo == null) {
554 			subSystemCombo = new JComboBox();
555 //			Set<String> subSysName = Selector.SUB_SYSTEM.keySet();
556 //			String[] subSys = new String[subSysName.size()];
557 //			subSys = subSysName.toArray(subSys);
558 //			subSystemModel.setElements(subSys);
559 			subSystemCombo.setModel(subSystemModel);
560 			subSystemCombo.setPreferredSize(comboDim);
561 			subSystemCombo.setMinimumSize(comboDim);
562 			subSystemCombo.setMaximumSize(comboDim);
563 			subSystemCombo.setRenderer(new ComboRenderer());
564 			subSystemCombo.addActionListener(new ActionListener() {
565 				public void actionPerformed(ActionEvent e) {
566 					if (settingFromSelector) return;
567 					getExecutorService().execute(new Runnable() {
568 						public void run() {
569 							getSelector().setSelectedSubSystem(subSystemModel.getSelectedItem());							
570 						}
571 					});
572                 }
573 			});
574 		}
575 		return subSystemCombo;
576 	}
577 	
578 	private JComboBox getDeviceContextCombo() {
579 		if (deviceContextCombo == null) {
580 			deviceContextCombo = new JComboBox();
581 			deviceContextCombo.setModel(deviceContextModel);
582 			deviceContextCombo.setPreferredSize(comboDim);
583 			deviceContextCombo.setMinimumSize(comboDim);
584 			deviceContextCombo.setMaximumSize(comboDim);
585 			deviceContextCombo.setRenderer(new ComboRenderer());
586 			deviceContextCombo.addActionListener(new ActionListener() {
587 				public void actionPerformed(ActionEvent e) {
588 					if (settingFromSelector) return;
589 					getExecutorService().execute(new Runnable() {
590 						public void run() {
591 							getSelector().setSelectedContext(deviceContextModel.getSelectedItem());
592 						}
593 					});
594 					
595                 }
596 			});
597 		}
598 		return deviceContextCombo;
599 	}
600 	
601 	private JComboBox getDeviceServerCombo() {
602 		if (deviceServerCombo == null) {
603 			deviceServerCombo = new JComboBox();
604 			deviceServerCombo.setModel(deviceServerModel);
605 			deviceServerCombo.setPreferredSize(comboDim);
606 			deviceServerCombo.setMinimumSize(comboDim);
607 			deviceServerCombo.setMaximumSize(comboDim);
608 			deviceServerCombo.setRenderer(new ComboRenderer());
609 			deviceServerCombo.addActionListener(new ActionListener() {
610 				public void actionPerformed(ActionEvent e) {
611 					if (settingFromSelector) return;
612 					getExecutorService().execute(new Runnable() {
613 						public void run() {
614 							getSelector().setSelectedServer(deviceServerModel.getSelectedItem());
615 						}
616 					});
617                 }
618 			});
619 		}
620 		return deviceServerCombo;
621 	}
622 	
623 	private JComboBox getDeviceNameCombo() {
624 		if (deviceNameCombo == null) {
625 			deviceNameCombo = new JComboBox();
626 			deviceNameCombo.setModel(deviceNameModel);
627 			deviceNameCombo.setPreferredSize(comboDim);
628 			deviceNameCombo.setMinimumSize(comboDim);
629 			deviceNameCombo.setMaximumSize(comboDim);
630 			deviceNameCombo.setRenderer(new ComboRenderer());
631 			deviceNameCombo.setEditable(true);
632 			deviceNameCombo.addActionListener(new ActionListener() {
633 				public void actionPerformed(ActionEvent e) {
634 					if (settingFromSelector) return;
635 					getExecutorService().execute(new Runnable(){
636 						public void run() {
637 							getSelector().setSelectedDevice(deviceNameModel.getSelectedItem());
638 							fireSelectorGUIEvent(SelectorUtilities.isConnectionParametersValid(getConnectionParameters()));
639 						}
640 					});
641                 }
642 			});
643 		}
644 		return deviceNameCombo;
645 	}
646 	
647 	private JComboBox getPropertyNameCombo() {
648 		if (propertyNameCombo == null) {
649 			propertyNameCombo = new JComboBox();
650 			propertyNameCombo.setModel(propertyNameModel);
651 			propertyNameCombo.setPreferredSize(comboDim);
652 			propertyNameCombo.setMinimumSize(comboDim);
653 			propertyNameCombo.setMaximumSize(comboDim);
654 			propertyNameCombo.setRenderer(new ComboRenderer());
655 			propertyNameCombo.setEditable(true);
656 			propertyNameCombo.addActionListener(new ActionListener() {
657 				public void actionPerformed(ActionEvent e) {
658 					if (settingFromSelector) return;
659 					getExecutorService().execute(new Runnable() {
660 						public void run() {
661 							String obj = ((String)propertyNameCombo.getEditor().getItem());
662 							if (obj != null) {
663 								getSelector().setSelectedProperty(obj);
664 								fireSelectorGUIEvent(SelectorUtilities.isConnectionParametersValid(getConnectionParameters()));
665 							} else if (propertyNameCombo.getSelectedIndex() < 0 || propertyNameCombo.getSelectedItem() == null) {
666 								getSelector().setSelectedProperty(null);
667 								fireSelectorGUIEvent(false);
668 							} else {
669 								getSelector().setSelectedProperty(propertyNameModel.getSelectedItem());
670 								fireSelectorGUIEvent(true);
671 							}
672 						}
673 					});
674                 }
675 			});
676 		}
677 		return propertyNameCombo;
678 	}
679 	
680 	private JCheckBox getShowStockPropertiesCheckBox() {
681 		if (showStockProperties == null) {
682 			showStockProperties = new JCheckBox("Show stock properties");
683 			showStockProperties.addActionListener(new ActionListener() {
684 				public void actionPerformed(ActionEvent e) {
685 					if (settingFromSelector) return;
686 					getExecutorService().execute(new Runnable() {
687 						public void run() {
688 							getSelector().setShowStockProperties(showStockProperties.isSelected());							
689 						}
690 					});
691 				}
692 			});
693 		}
694 		return showStockProperties;
695 	}
696 	
697 	private NumberField getAccessRateField() {
698 		if (accessRateField == null) {
699 			accessRateField = new NumberField();
700 			accessRateField.setNumberType(Integer.class);
701 			accessRateField.setFormat("%d");
702 			accessRateField.setValue(1000);
703 			accessRateField.setPreferredSize(comboDim);
704 			accessRateField.setMinimumSize(comboDim);
705 			accessRateField.setMaximumSize(comboDim);
706 			accessRateField.setText(String.valueOf(1000));
707 			accessRateField.addPropertyChangeListener("value", new PropertyChangeListener() {
708 				public void propertyChange(PropertyChangeEvent evt) {
709 					if (settingFromSelector) return;
710 					refreshSelectionLabel();
711 					getSelector().setAccessRate(accessRateField.getValue().intValue());	
712 				}
713 			});
714 		}
715 		return accessRateField;
716 	}
717 	
718 	private JComboBox getArraySizeCombo() {
719 		if (arraySizeCombo == null) {
720 			arraySizeCombo = new JComboBox();
721 			arraySizeCombo.setEditable(true);
722 			arraySizeCombo.setPreferredSize(comboDim);
723 			arraySizeCombo.setMinimumSize(comboDim);
724 			arraySizeCombo.setMaximumSize(comboDim);
725 			arraySizeCombo.setRenderer(new ComboRenderer());
726 			arraySizeCombo.setModel(arraySizeModel);
727 			arraySizeModel.setElements(new String[]{"1",ACTUAL,AUTO});
728 			arraySizeModel.setSelectedItem(AUTO);
729 			arraySizeCombo.setToolTipText("Size of connected array, ACTUAL takes actual size, AUTO adjusts size to the widget.");
730 			arraySizeCombo.addActionListener(new ActionListener() {
731 				@SuppressWarnings("unchecked")
732 				public void actionPerformed(ActionEvent e) {
733 					Object o = arraySizeCombo.getEditor().getItem();
734 				    try {
735 						int size = Integer.parseInt((String)o);
736 						if (size <=0 ) return;
737 					} catch(NumberFormatException ex) {
738 						if (o.toString().startsWith(ACTUAL)) {
739 							arraySizeModel.setSelectedItem(o);
740 						} else {
741 							arraySizeModel.setSelectedItem(AUTO);
742 						}
743 						refreshSelectionLabel();
744 						return;
745 					}
746 					if (arraySizeModel.contains(o)) {
747 						refreshSelectionLabel();
748 						return;
749 					}
750 					String[] elements = new String[arraySizeModel.getElements().length + 1];
751 					for (int i = 0; i < arraySizeModel.getElements().length; i ++) {
752 						elements[i] = arraySizeModel.getElements()[i];
753 					}
754 					elements[elements.length-1] = (String)o;
755 					Arrays.sort(elements, comparator);
756 					arraySizeModel.setElements(elements);
757 					refreshSelectionLabel();
758 				}
759 			});
760 		}
761 
762 		return arraySizeCombo;
763 	}
764 		
765 	private JTextField getExtendedDataTextField() {
766 		if(extendedDataTextField == null) {
767 			extendedDataTextField = new JTextField();	
768 			extendedDataTextField.addActionListener(new ActionListener() {
769 				public void actionPerformed(ActionEvent arg0) {
770 					if (settingFromSelector) return;
771 					refreshSelectionLabel();
772 				}
773 			});
774 			extendedDataTextField.addFocusListener(new FocusListener() {
775 				public void focusLost(FocusEvent e) {
776 					if (settingFromSelector) return;
777 					refreshSelectionLabel();
778 					}
779 				public void focusGained(FocusEvent e) {}
780 			});
781 		}
782 		return extendedDataTextField;
783 	}
784 
785 	private JComboBox getExtendedDataCombo() {
786 		if (extendedDataCombo == null) {
787 			extendedDataCombo = new JComboBox();
788 			extendedDataCombo.setRenderer(new ComboRenderer());
789 			extendedDataCombo.setModel(extendedDataModel);
790 			extendedDataModel.setElements(ExtendedData.values());
791 			//bugfix
792 			SwingUtilities.invokeLater(new Runnable() {
793 				public void run() {
794 					extendedDataModel.setSelectedItem(ExtendedData.DOUBLE);				
795 				}
796 			});
797 			extendedDataCombo.addActionListener(new ActionListener() {
798 				public void actionPerformed(ActionEvent e) {
799 					if (settingFromSelector) return;
800 					refreshSelectionLabel();
801 				}
802 			});
803 		}
804 		
805 		return extendedDataCombo;
806 	}
807 	
808 	private Object getExtendedData() {
809 		try {
810     		ExtendedData ed = (ExtendedData) getExtendedDataCombo().getSelectedItem();
811     		if(getExtendedDataTextField().getText().isEmpty()){
812     			return null;
813     		}
814     		String[] stringArray = getExtendedDataTextField().getText().split(";");
815     		switch (ed) {
816     		case DOUBLE:{
817     			double[] dbl = new double[stringArray.length];
818     			for(int i=0;i<dbl.length;i++)
819     				dbl[i]=Double.parseDouble(stringArray[i]);
820     			return dbl;
821     		}
822     		case FLOAT:{
823     			float[] flt = new float[stringArray.length];
824     			for(int i=0;i<flt.length;i++)
825     				flt[i]=Float.parseFloat(stringArray[i]);
826     			return flt;
827     		}
828     		case INT32:
829     		case INT:{
830     			int[] intgr = new int[stringArray.length];
831     			for(int i=0;i<intgr.length;i++)
832     				intgr[i]=Integer.parseInt(stringArray[i]);
833     			return intgr;			
834     		}
835     		case INT16:
836     		case SHORT:{
837     			short[] shrt = new short[stringArray.length];
838     			for(int i=0;i<shrt.length;i++)
839     				shrt[i]=Short.parseShort(stringArray[i]);
840     			return shrt;	
841     		}
842     		case BYTE:{
843     			byte[] byt = new byte[stringArray.length];
844     			for(int i=0;i<byt.length;i++)
845     				byt[i]=Byte.parseByte(stringArray[i]);
846     			return byt;	
847     		}
848     		case INT64:
849     		case LONG:{
850     			long[] lng = new long[stringArray.length];
851     			for(int i=0;i<lng.length;i++)
852     				lng[i]=Long.parseLong(stringArray[i]);
853     			return lng;	
854     		}
855     		case CHAR:{
856     			char[] chr = new char[stringArray.length];
857     			for(int i=0;i<chr.length;i++)
858     				chr[i]=stringArray[i].charAt(0);
859     			return chr;	
860     		}
861     		case STRING:{
862     			return extendedDataTextField.getText();
863     		}
864     		default: return null;
865     		}
866 		} catch (Exception e) {
867 			return null;
868 		}
869 	}
870 	
871 	private void updateArraySizeCombo(ConnectionParameters param) {
872 		String[] elements = arraySizeModel.getElements();
873 		if (param == null) {
874 			for (int i = 0; i < elements.length; i++) {
875 				if (elements[i].startsWith(ACTUAL)) {
876 					arraySizeModel.replaceElement(i, ACTUAL);
877 					return;
878 				}
879 			}
880 		} else {
881 			for (int i = 0; i < elements.length; i++) {
882 				if (elements[i].startsWith(ACTUAL)) {
883 					arraySizeModel.replaceElement(i, ACTUAL + " (" + getActualSize(param) + ")");
884 					return;
885 				}
886 			}
887 		}
888 	}
889 	
890 	private void refreshSelectionLabel() {
891 		applySettings();
892 		String text = connectionParameters.toString();
893 		getSelectionLabel().setText(text);
894 		getSelectionLabel().setToolTipText(text);
895 	}
896 	
897 	private void update(final ConnectionParameters params) {
898 		if (params == null || params.equals(connectionParameters)) return;
899 		ConnectionParameters old = connectionParameters;
900 		connectionParameters = params;
901 		getExecutorService().execute(new Runnable() {
902 			public void run() {
903 				getSelector().setSelectedProtocol(params.getAccessProtocol());
904 				getSelector().setSelectedContext(params.getDeviceContext());
905 				getSelector().setSelectedServer(params.getDeviceGroup());
906 				getSelector().setSelectedDevice(params.getDeviceName());
907 				getSelector().setSelectedProperty(params.getDeviceProperty());
908                 // due to device query precedence device has to be reselected
909 				getSelector().setSelectedDevice(params.getDeviceName());
910 				getSelector().setAccessMode(params.getAccessMode()); // mdavid: fixed (?)
911 				getSelector().setAccessRate(params.getAccessRate());
912 			}
913 		});
914 
915 		int size = params.getPropertySize();
916 		if (size == -1) {
917 			getArraySizeCombo().setSelectedItem(AUTO);
918 		} else if (size == 0){
919 			String o = ACTUAL;
920 			for (String s :arraySizeModel.getElements()) {
921 				if (s.startsWith(ACTUAL)) {
922 					o = s;
923 				}
924 			}
925 			getArraySizeCombo().setSelectedItem(o);
926 		} else {
927 			getArraySizeCombo().setSelectedItem(String.valueOf(size));
928 		}
929 		
930 		if (SelectorUtilities.isConnectionParametersValid(connectionParameters)) {
931 			getExecutorService().execute(new Runnable() {
932 				public void run() {
933 					String text = SelectorUtilities.getInfo(connectionParameters);
934 					getDescriptionLabel().setText(text);
935 			        getDescriptionLabel().setToolTipText(text);
936 			        updateArraySizeCombo(connectionParameters);
937 				}
938 			});
939 		}
940 		
941         firePropertyChange(ConnectionParametersReceiver.CONNECTION_PARAMETERS_PROPERTY,old,connectionParameters);
942 	}
943 	
944 	/*
945 	 * (non-Javadoc)
946 	 * @see java.beans.Customizer#setObject(java.lang.Object)
947 	 */
948 	public void setObject(Object bean) {
949 		if (bean instanceof MultipleAcopDisplayer<?>) {
950 			disp = bean;
951 		} else if (bean instanceof ConnectionParametersReceiver) {
952 			disp = bean;
953 			update(((ConnectionParametersReceiver)disp).getConnectionParameters());
954 			((ConnectionParametersReceiver)disp).addPropertyChangeListener(ConnectionParametersReceiver.CONNECTION_PARAMETERS_PROPERTY, new PropertyChangeListener(){
955 
956 				public void propertyChange(PropertyChangeEvent evt) {
957 					if (!ConnectionParametersReceiver.CONNECTION_PARAMETERS_PROPERTY.equals(evt.getPropertyName())) return;
958 					update(((ConnectionParametersReceiver)disp).getConnectionParameters());
959 				}
960 				
961 			});   
962 		} else {
963 			throw new IllegalArgumentException("Only ConnectionParametersReceiver and" +
964 				" MultipleAcopDisplayer can use this Customizer.");
965 		}
966 		
967 		     
968     }
969 
970 	/**
971 	 * Returns the selected ConnectionParameters.
972 	 * 
973      * @return the parameters
974      */
975     public ConnectionParameters getConnectionParameters() {
976     	return connectionParameters;
977     }
978 
979 	/**
980 	 * Sets the ConnectionParameters and applies the values to the UI.
981 	 * 
982      * @param parameters the parameters to set
983      */
984     public void setConnectionParameters(ConnectionParameters parameters) {
985     	if (this.connectionParameters != null && this.connectionParameters.equals(parameters)) return;
986 		update(parameters);
987     }
988     
989     protected void setSelector(Selector selector) {
990     	if (this.selector != null && this.selector.equals(selector)) return;
991     	if (this.selector != null) {
992 	    	this.selector.removePropertyChangeListener(getSelectorPropertyListener());
993 	    	this.selector.removeQueryListener(getSelectorQueryListener());
994 	    	this.selector.removeExceptionListener(getExceptionListener());
995     	}
996     	Selector old = this.selector;
997     	this.selector = selector;
998     	if (this.selector != null) {
999 	    	this.selector.addPropertyChangeListener(getSelectorPropertyListener());
1000 	    	this.selector.addQueryListener(getSelectorQueryListener());
1001 	    	this.selector.addExceptionListener(getExceptionListener());
1002     	}
1003     	getListSelector().setSelector(selector);
1004     	
1005     	getExecutorService().execute(new Runnable() {
1006 			public void run() {
1007 		    	SelectorGUI.this.selector.setSelectedProtocol(Selector.PROTOCOL_TINE);
1008 		    	fillAndSelectValue();
1009 		    	refreshSelectionLabel();
1010 			}
1011     	});
1012 //    	fillAndSelectValue();
1013 //    	refreshSelectionLabel();
1014     	firePropertyChange("selector", old, this.selector);
1015     }
1016     
1017 	protected Selector getSelector() {
1018         return selector;
1019     }
1020 	
1021 	private ExceptionListener getExceptionListener() {
1022 		if (exceptionListener == null) {
1023 			exceptionListener = new ExceptionListener() {
1024 				public void exceptionReceived(ExceptionEvent e) {
1025 					handleException(e.getThrowable());
1026 				}
1027 			};
1028 		}
1029 		return exceptionListener;
1030 	}
1031 	
1032 	protected void handleException(Throwable e) {
1033 		if (Beans.isDesignTime()) {
1034 			getSpiderBean().addError(e);
1035 		} else {
1036 			e.printStackTrace();
1037 		}
1038 	}
1039 	
1040 	private AcopSpider getSpiderBean() {
1041 		if (spiderBean == null) {
1042 			spiderBean = new AcopSpider();
1043 			spiderBean.setAutoResize(false);
1044 			spiderBean.setSize(new Dimension(30,30));
1045 			spiderBean.setMaximumSize(new Dimension(30,30));
1046 			spiderBean.setMinimumSize(new Dimension(30,30));
1047 			spiderBean.setPreferredSize(new Dimension(30,30));
1048 			spiderBean.setSize(new Dimension(30,30));
1049 			spiderBean.rescaleIconToFit();
1050 		}
1051 		return spiderBean;
1052 	}
1053 	
1054 	private PropertyChangeListener getSelectorPropertyListener() {
1055     	if (selectorPropertyListener == null) {
1056     		selectorPropertyListener = new PropertyChangeListener(){
1057 	        	public void propertyChange(PropertyChangeEvent evt) {
1058 	        		if (getSelector() == null) return;
1059 	        		if (!getPropertyNameCombo().isEnabled()) return;
1060 	        		final String name = evt.getPropertyName();
1061 	        		if ("accessRate".equals(name)) {
1062 	        			getAccessRateField().setValue(getSelector().getAccessRate());
1063 	        			refreshSelectionLabel();
1064 	        			getAccessRateField().requestFocus();
1065 	        			return;
1066 	        		} else if ("accessMode".equals(name)) {
1067 	        			getAccessModeCombo().setSelectedItem(getSelector().getAccessMode());
1068 	        			refreshSelectionLabel();
1069 	        			getAccessModeCombo().requestFocus();
1070 	        			return;
1071 	        		}
1072 	        		
1073             		if ("selectedProtocol".equals(name)) {
1074             			accessProtocolModel.setSelectedItem(getSelector().getSelectedProtocol());
1075             		} else if ("selectedContext".equals(name)) {
1076             			deviceContextModel.setSelectedItem(getSelector().getSelectedContext());
1077             		} else if ("selectedSubSystem".equals(name)) {
1078             			subSystemModel.setSelectedItem(getSelector().getSelectedSubSystem());
1079             		} else if ("selectedServer".equals(name)) {
1080             			deviceServerModel.setSelectedItem(getSelector().getSelectedServer());
1081             		} else if ("selectedDevice".equals(name)) {
1082             			deviceNameModel.setSelectedItem(getSelector().getSelectedDevice());
1083             		} else if ("selectedProperty".equals(name)) {
1084             			propertyNameModel.setSelectedItem(getSelector().getSelectedProperty());
1085             		} else if ("availableContexts".equals(name)) {
1086             			deviceContextModel.setElements(getSelector().getAvailableContexts());
1087             		} else if ("availableSubsystems".equals(name)) {
1088             			subSystemModel.setElements(getSelector().getAvailableSubsystems());
1089             		} else if ("availableServers".equals(name)) {
1090             			deviceServerModel.setElements(getSelector().getAvailableServers());
1091             		} else if ("availableDevices".equals(name)) {
1092             			deviceNameModel.setElements(getSelector().getAvailableDevices());
1093             		} else if ("availableProperties".equals(name)) {
1094             			propertyNameModel.setElements(getSelector().getAvailableProperties());
1095             		} else if ("showStockProperties".equals(name)) {
1096             			getShowStockPropertiesCheckBox().setSelected(getSelector().isShowStockProperties());
1097             		}
1098             		refreshSelectionLabel();
1099 	                
1100                     if (!Beans.isDesignTime()) {
1101 		        		if ("selectedProperty".equals(evt.getPropertyName())) {
1102 		        			if (evt.getNewValue() == null) {
1103 		        				getDescriptionLabel().setText("");
1104 	                            getDescriptionLabel().setToolTipText("");
1105 	                            return;
1106 		        			}
1107 		        			if (evt.getNewValue() != evt.getOldValue()) {
1108 		        				if (SelectorUtilities.isConnectionParametersValid(connectionParameters)) {
1109 		        					String text = SelectorUtilities.getInfo(connectionParameters);
1110 		        			        getDescriptionLabel().setText(text);
1111 		        			        getDescriptionLabel().setToolTipText(text);
1112 		        			        updateArraySizeCombo(connectionParameters);
1113 		        				}
1114 		        			}
1115 		        		}
1116                     }
1117 
1118 	        	}
1119 	        };
1120     	} 
1121     	return selectorPropertyListener;
1122     }
1123 	
1124 	private void fillAndSelectValue() {
1125 		settingFromSelector = true;
1126 		getShowStockPropertiesCheckBox().setSelected(getSelector().isShowStockProperties());
1127 		accessProtocolModel.setSelectedItem(getSelector().getSelectedProtocol());
1128 		deviceContextModel.setElements(getSelector().getAvailableContexts());
1129 		deviceContextModel.setSelectedItem(getSelector().getSelectedContext());
1130 		subSystemModel.setElements(getSelector().getAvailableSubsystems());
1131 		subSystemModel.setSelectedItem(getSelector().getSelectedSubSystem());
1132 		deviceServerModel.setElements(getSelector().getAvailableServers());
1133 		deviceServerModel.setSelectedItem(getSelector().getSelectedServer());
1134 		deviceNameModel.setElements(getSelector().getAvailableDevices());
1135 		deviceNameModel.setSelectedItem(getSelector().getSelectedDevice());
1136 		propertyNameModel.setElements(getSelector().getAvailableProperties());
1137 		propertyNameModel.setSelectedItem(getSelector().getSelectedProperty());
1138 		getAccessRateField().setValue(getSelector().getAccessRate());
1139 		getAccessModeCombo().setSelectedItem(getSelector().getAccessMode());
1140 		settingFromSelector = false;
1141 	}
1142     
1143     private QueryListener getSelectorQueryListener() {
1144     	if (selectorQueryListener == null) {
1145     		selectorQueryListener = new QueryListener() {
1146 				public void queryFinished(QueryEvent e) {
1147 					if (getSelector() == null) return;
1148 					synchronized(selector) {
1149 						fillAndSelectValue();
1150 						refreshSelectionLabel();
1151 						setCombosEnabled(true);
1152 						if (SelectorUtilities.isConnectionParametersValid(connectionParameters)) {
1153 							String text = SelectorUtilities.getInfo(connectionParameters);
1154 					        getDescriptionLabel().setText(text);
1155 					        getDescriptionLabel().setToolTipText(text);
1156 					        updateArraySizeCombo(connectionParameters);
1157 						} else {
1158 							getDescriptionLabel().setText("");
1159 					        getDescriptionLabel().setToolTipText("");
1160 					        updateArraySizeCombo(null);
1161 						}
1162 					}
1163 				}
1164 				public void queryStarted(QueryEvent e) {
1165 					if (getSelector() == null) return;
1166 					synchronized (selector) {
1167 						setCombosEnabled(false);
1168 					}
1169 				    
1170 				}
1171     		};
1172     	}
1173     	return selectorQueryListener;
1174     }
1175 	
1176     private boolean combosEnabled = true; 
1177 	private void setCombosEnabled(boolean enabled) {
1178 		
1179 		if (enabled && getSelector().isBusy()) {
1180 			enabled = false;
1181 		}
1182 		if (this.combosEnabled == enabled) return;
1183 		this.combosEnabled = enabled;
1184 		SwingUtilities.invokeLater(new Runnable() {
1185 			
1186 			@Override
1187 			public void run() {
1188 				getAccessProtocolCombo().setEnabled(combosEnabled);
1189 			    getDeviceContextCombo().setEnabled(combosEnabled);
1190 			    getSubSystemCombo().setEnabled(combosEnabled);
1191 			    getDeviceServerCombo().setEnabled(combosEnabled);
1192 			    getDeviceNameCombo().setEnabled(combosEnabled);
1193 			    getPropertyNameCombo().setEnabled(combosEnabled);
1194 			
1195 			}
1196 		});
1197 		
1198 	}
1199 	
1200 	/**
1201 	 * Adds a SelectorGUIListener.
1202 	 * 
1203 	 * @param l listener to be added
1204 	 */
1205 	public void addSelectorGUIListener(SelectorGUIListener l) {
1206 		selectorGUIListeners.add(l);
1207 	}
1208 	
1209 	/**
1210 	 * Removes SelectorGUIListener.
1211 	 * 
1212 	 * @param l listener to be removed
1213 	 */
1214 	public void removeSelectorGUIListener(SelectorGUIListener l) {
1215 		selectorGUIListeners.remove(l);
1216 	}
1217 	
1218 	protected void fireSelectorGUIEvent(boolean selectionComplete) {
1219 		SelectorGUIListener[] listeners = (SelectorGUIListener[]) selectorGUIListeners.toArray();
1220 		SelectorGUIEvent e = new SelectorGUIEvent(this, selectionComplete);
1221 		for (SelectorGUIListener listener : listeners) {
1222 			listener.selectionChanged(e);
1223 		}
1224 	}
1225 	
1226 	private int getActualSize(ConnectionParameters param) {
1227 		return SelectorUtilities.getSequenceLength(param);
1228 	}
1229 	
1230 	private JButton getAdvancedSelectorButton() {
1231 		if (advancedSelectorButton == null) {
1232 			advancedSelectorButton = new JButton("Advanced browsing",IconHelper.createIcon("icons/navigation/ArrowRightRight16.gif"));
1233 			advancedSelectorButton.addActionListener(new ActionListener(){
1234 				public void actionPerformed(ActionEvent e) {
1235 					getAdvancedSelector().setVisible(true);					
1236 				}
1237 			});
1238 		}
1239 		return advancedSelectorButton;
1240 	}
1241 	
1242 	private JDialog getAdvancedSelector() {
1243 		if (advancedSelectorDialog == null) {
1244 			advancedSelectorDialog = new JDialog();
1245 			advancedSelectorDialog.setSize(800,600);
1246 			ComponentPositioner.centerOnScreen(advancedSelectorDialog);
1247 			advancedSelectorDialog.setTitle("Advanced browsing");
1248 			advancedSelectorDialog.setContentPane(getListSelector());
1249 			advancedSelectorDialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
1250 			
1251 		}
1252 		return advancedSelectorDialog;
1253 	}
1254 	
1255 	private SelectorListGUI getListSelector() {
1256 		if (listSelector == null) {
1257 			listSelector = new SelectorListGUI();
1258 			listSelector.setSelector(selector);
1259 			listSelector.setExecutorService(getExecutorService());
1260 		}
1261 		return listSelector;
1262 	}
1263 	
1264 	public static void main(String[] args) {
1265 		try {
1266 			
1267 			SelectorGUI c= new SelectorGUI();
1268 			RunnerHelper.runComponent(c,300,370);
1269 		} catch (Exception e) {
1270 			e.printStackTrace();
1271 		}
1272 		
1273 	}
1274 	
1275 	private ThreadPoolExecutor executorService;
1276 	private ThreadPoolExecutor getExecutorService() {
1277 		if (executorService == null) {
1278 			executorService = new  ThreadPoolExecutor(1, 1, 0, TimeUnit.NANOSECONDS,
1279 		              new LinkedBlockingQueue<Runnable>()){
1280 				@Override
1281 				protected void afterExecute(Runnable r, Throwable t) {
1282 					super.afterExecute(r, t);
1283 					if (t != null) {
1284 						t.printStackTrace();
1285 					}
1286 				}
1287 			};
1288 			executorService.setRejectedExecutionHandler(new RejectedExecutionHandler(){
1289 				public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
1290 					//ignore
1291 				}
1292 			});
1293 //			Executors.newSingleThreadExecutor();
1294 			
1295         }
1296         return executorService;
1297 	}
1298 	
1299 	/**
1300 	 * Flag indicating whether array size choosing should also be available or only
1301 	 * the remote name and access paramters should be available.
1302 	 * 
1303 	 * @param onlyCP if true only the remote name and access parameters can be selected
1304 	 */
1305 	public void setOnlyConnectionParametersMode(boolean onlyCP) {
1306 		this.onlyConnectionParametersMode = onlyCP;
1307 		arraySizeLabel.setVisible(!onlyConnectionParametersMode);
1308 		getArraySizeCombo().setVisible(!onlyConnectionParametersMode);
1309 	}
1310 	
1311 	/**
1312 	 * Returns true if only remote name and access parameters can be selected.
1313 	 * @return true if only remote name and access parameters can be selected
1314 	 */
1315 	public boolean getOnlyConnectionParametersMode() {
1316 		return this.onlyConnectionParametersMode;
1317 	}
1318 
1319 }
1320 /* __oOo__ */