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  
31  import java.awt.event.ActionEvent;
32  import java.awt.event.ActionListener;
33  import java.awt.event.ItemEvent;
34  import java.awt.event.ItemListener;
35  import java.beans.PropertyChangeEvent;
36  import java.beans.PropertyChangeListener;
37  import java.util.concurrent.LinkedBlockingQueue;
38  import java.util.concurrent.RejectedExecutionHandler;
39  import java.util.concurrent.ThreadPoolExecutor;
40  import java.util.concurrent.TimeUnit;
41  
42  import javax.swing.DefaultListCellRenderer;
43  import javax.swing.JCheckBox;
44  import javax.swing.JComboBox;
45  import javax.swing.JLabel;
46  import javax.swing.JList;
47  import javax.swing.JPanel;
48  import javax.swing.SwingUtilities;
49  
50  import com.cosylab.gui.components.util.RunnerHelper;
51  
52  import de.desy.acop.displayers.chart.HistoryParameters;
53  import de.desy.acop.displayers.tools.ConnectionParametersReceiver;
54  
55  /**
56   * 
57   * <code>TrendHistorySelectorGUI</code> is a selector for 
58   * history parameters.
59   *
60   * @author <a href="mailto:jaka.bobnar@cosylab.com">Jaka Bobnar</a>
61   * @depreacated TINE doesn't allow duplicated TQuery use
62   */
63  @Deprecated
64  public class TrendHistorySelectorGUI extends JPanel {
65  		
66  	private class ComboRenderer extends DefaultListCellRenderer {
67  		
68  		private static final long serialVersionUID = 1L;
69  
70  		@Override
71  		public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
72  		
73  			Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
74  			if (value != null && c instanceof JLabel) {
75  				((JLabel)c).setToolTipText(String.valueOf(value));
76  			}
77  			return c;
78  		}
79  	}
80  		
81  	private class IndexModel extends AcopComboBoxModel<Integer> {
82  
83  		private static final long serialVersionUID = 1L;
84  		public IndexModel() {
85  			super(Integer.class);
86  		}
87  		
88  		public void setMaxIndex(int maxIndex) {
89  			removeAllElements();
90  			Integer[] values = new Integer[maxIndex+1];
91  			for (int i = 0; i <= maxIndex; i++) {
92  				values[i] = i;
93  			}
94  			setElements(values);
95  			if (values.length > 0) {
96  				setSelectedItem(values[0]);
97  			}
98  		}
99  	}
100 	
101 	
102 	private static final long serialVersionUID = 1647591422586736408L;
103 		
104 	private JPanel commandPanel;
105 	private JComboBox deviceContextCombo;
106 	private JComboBox subSystemCombo;
107 	private JComboBox deviceServerCombo;
108 	private JComboBox deviceNameCombo;
109 	private JComboBox propertyNameCombo;
110 	private AcopComboBoxModel<String> deviceContextModel;
111 	private AcopComboBoxModel<String> subSystemModel;
112 	private AcopComboBoxModel<String> deviceServerModel;
113 	private AcopComboBoxModel<String> deviceNameModel;
114 	private AcopComboBoxModel<String> propertyNameModel;
115 	private JLabel deviceContextLabel;
116 	private JLabel subSystemLabel;
117 	private JLabel deviceServerLabel;
118 	private JLabel deviceNameLabel;
119 	private JLabel propertyNameLabel;
120 	private JLabel indexLabel;
121 	private JComboBox indexCombo;
122 	private JCheckBox enableHistoryBox;
123 	private IndexModel indexModel;
124 	
125 	private HistoryParameters historyParameters;
126 	private volatile Selector selector; 
127 	
128 	private PropertyChangeListener selectorPropertyListener;
129 	private QueryListener selectorQueryListener;
130 	private ExceptionListener exceptionListener;
131 	private boolean settingFromSelector = false;
132 	private Dimension comboDim = new Dimension(170,21);
133 	
134 	private boolean historyEnabled = false;
135 	
136 	/**
137 	 * Constructs a new SelectorGUI.
138 	 *
139 	 */
140 	public TrendHistorySelectorGUI() {
141 		super();
142 		initialize();
143 	}
144 	
145 	private void initialize() {
146 		deviceContextModel= new AcopComboBoxModel<String>(String.class);
147 		subSystemModel = new AcopComboBoxModel<String>(String.class);
148 		deviceServerModel= new AcopComboBoxModel<String>(String.class);
149 		deviceNameModel= new AcopComboBoxModel<String>(String.class);
150 		propertyNameModel= new AcopComboBoxModel<String>(String.class);
151 		setSelector(new Selector());
152 		
153 		this.setLayout(new GridBagLayout());
154 		this.add(getCommandPanel(), new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0));
155 	}
156 	
157 	private void applySettings() {
158 		
159 		try {
160 			int idx = 0;
161 			HistoryParameters old = historyParameters;
162 			historyParameters = new HistoryParameters(getSelector().getSelectedContext(), getSelector().getSelectedServer(), getSelector().getSelectedDevice(), getSelector().getSelectedProperty(), idx);
163 			firePropertyChange(ConnectionParametersReceiver.CONNECTION_PARAMETERS_PROPERTY,old,getHistoryParameters());
164         } catch (Exception e) {
165             e.printStackTrace();
166         } 
167 	}
168 	
169 	private JPanel getCommandPanel() {
170 		if (commandPanel == null) {
171 			commandPanel = new JPanel(new GridBagLayout());
172 			
173 			commandPanel.add(getEnableHistoryBox(), new GridBagConstraints(0,0,2,1,1,1,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
174 			deviceContextLabel = new JLabel("Device context");
175 			deviceContextLabel.setPreferredSize(new Dimension(120,21));
176 			deviceContextLabel.setMinimumSize(new Dimension(120,21));
177 			deviceContextLabel.setMaximumSize(new Dimension(120,21));
178 			commandPanel.add(deviceContextLabel, new GridBagConstraints(0,1,1,1,1,1,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
179 			commandPanel.add(getDeviceContextCombo(), new GridBagConstraints(1,1,2,1,1,1,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
180 			
181 			subSystemLabel = new JLabel("Device subsystem");
182 			subSystemLabel.setPreferredSize(new Dimension(120,21));
183 			subSystemLabel.setMinimumSize(new Dimension(120,21));
184 			subSystemLabel.setMaximumSize(new Dimension(120,21));
185 			commandPanel.add(subSystemLabel, new GridBagConstraints(0,2,1,1,1,1,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
186 			commandPanel.add(getSubSystemCombo(), new GridBagConstraints(1,2,2,1,1,1,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
187 						
188 			deviceServerLabel = new JLabel("Device server");
189 			deviceServerLabel.setPreferredSize(new Dimension(120,21));
190 			deviceServerLabel.setMinimumSize(new Dimension(120,21));
191 			deviceServerLabel.setMaximumSize(new Dimension(120,21));
192 			commandPanel.add(deviceServerLabel, new GridBagConstraints(0,3,1,1,1,1,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
193 			commandPanel.add(getDeviceServerCombo(), new GridBagConstraints(1,3,2,1,1,1,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
194 			
195 			deviceNameLabel = new JLabel("Device name");
196 			deviceNameLabel.setPreferredSize(new Dimension(120,21));
197 			deviceNameLabel.setMinimumSize(new Dimension(120,21));
198 			deviceNameLabel.setMaximumSize(new Dimension(120,21));
199 			commandPanel.add(deviceNameLabel, new GridBagConstraints(0,4,1,1,1,1,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
200 			commandPanel.add(getDeviceNameCombo(), new GridBagConstraints(1,4,2,1,1,1,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
201 			
202 			propertyNameLabel = new JLabel("Property name");
203 			propertyNameLabel.setPreferredSize(new Dimension(120,21));
204 			propertyNameLabel.setMinimumSize(new Dimension(120,21));
205 			propertyNameLabel.setMaximumSize(new Dimension(120,21));
206 			commandPanel.add(propertyNameLabel, new GridBagConstraints(0,5,1,1,1,1,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
207 			commandPanel.add(getPropertyNameCombo(), new GridBagConstraints(1,5,2,1,1,1,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
208 									
209 			indexLabel = new JLabel("Index");
210 			indexLabel.setPreferredSize(new Dimension(120,21));
211 			indexLabel.setMinimumSize(new Dimension(120,21));
212 			indexLabel.setMaximumSize(new Dimension(120,21));
213 			commandPanel.add(indexLabel, new GridBagConstraints(0,6,1,1,1,1,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
214 			commandPanel.add(getIndexCombo(), new GridBagConstraints(1,6,2,1,1,1,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,1,1,1), 0,0));
215 			
216 			setCombosEnabled(true);
217 		}
218 		return commandPanel;
219 	}
220 	
221 	private JCheckBox getEnableHistoryBox() {
222 		if (enableHistoryBox == null) {
223 			enableHistoryBox = new JCheckBox("History Enabled");
224 			enableHistoryBox.addItemListener(new ItemListener() {
225 				public void itemStateChanged(ItemEvent e) {
226 					setHistoryEnabled(enableHistoryBox.isSelected());
227 				}
228 			});
229 			enableHistoryBox.setSelected(true);
230 		}
231 
232 		return enableHistoryBox;
233 	}
234 		
235 	/**
236 	 * Returns true if history selection is enabled.
237 	 * 
238 	 * @return the historyEnabled
239 	 */
240 	public boolean isHistoryEnabled() {
241 		return historyEnabled;
242 	}
243 
244 	/**
245 	 * Enables/disables history selection.
246 	 * 
247 	 * @param historyEnabled the historyEnabled to set
248 	 */
249 	public void setHistoryEnabled(boolean historyEnabled) {
250 		this.historyEnabled = historyEnabled;
251 		getEnableHistoryBox().setSelected(historyEnabled);
252 		setCombosEnabled(combosEnabled);
253 	}
254 		
255 	private JComboBox getIndexCombo() {
256 		if (indexCombo == null) {
257 			indexCombo = new JComboBox();
258 			indexCombo.setModel(getIndexModel());
259 			indexCombo.setPreferredSize(new Dimension(120,21));
260 			indexCombo.setMinimumSize(new Dimension(120,21));
261 			indexCombo.setMaximumSize(new Dimension(120,21));
262 		}
263 
264 		return indexCombo;
265 	}
266 	
267 	private IndexModel getIndexModel() {
268 		if (indexModel == null) {
269 			indexModel = new IndexModel();
270 			indexModel.setMaxIndex(0);
271 		}
272 
273 		return indexModel;
274 	}
275 		
276 	private JComboBox getSubSystemCombo() {
277 		if (subSystemCombo == null) {
278 			subSystemCombo = new JComboBox();
279 //			Set<String> subSysName = Selector.SUB_SYSTEM.keySet();
280 //			String[] subSys = new String[subSysName.size()];
281 //			subSys = subSysName.toArray(subSys);
282 //			subSystemModel.setElements(subSys);
283 			subSystemCombo.setModel(subSystemModel);
284 			subSystemCombo.setPreferredSize(comboDim);
285 			subSystemCombo.setMinimumSize(comboDim);
286 			subSystemCombo.setMaximumSize(comboDim);
287 			subSystemCombo.setRenderer(new ComboRenderer());
288 			subSystemCombo.addActionListener(new ActionListener() {
289 				public void actionPerformed(ActionEvent e) {
290 					if (settingFromSelector) return;
291 					getExecutorService().execute(new Runnable() {
292 						public void run() {
293 							getSelector().setSelectedSubSystem(subSystemModel.getSelectedItem());							
294 						}
295 					});
296                 }
297 			});
298 		}
299 		return subSystemCombo;
300 	}
301 	
302 	private JComboBox getDeviceContextCombo() {
303 		if (deviceContextCombo == null) {
304 			deviceContextCombo = new JComboBox();
305 			deviceContextCombo.setModel(deviceContextModel);
306 			deviceContextCombo.setPreferredSize(comboDim);
307 			deviceContextCombo.setMinimumSize(comboDim);
308 			deviceContextCombo.setMaximumSize(comboDim);
309 			deviceContextCombo.setRenderer(new ComboRenderer());
310 			deviceContextCombo.addActionListener(new ActionListener() {
311 				public void actionPerformed(ActionEvent e) {
312 					if (settingFromSelector) return;
313 					getExecutorService().execute(new Runnable() {
314 						public void run() {
315 							getSelector().setSelectedContext(deviceContextModel.getSelectedItem());
316 						}
317 					});
318 					
319                 }
320 			});
321 		}
322 		return deviceContextCombo;
323 	}
324 	
325 	private JComboBox getDeviceServerCombo() {
326 		if (deviceServerCombo == null) {
327 			deviceServerCombo = new JComboBox();
328 			deviceServerCombo.setModel(deviceServerModel);
329 			deviceServerCombo.setPreferredSize(comboDim);
330 			deviceServerCombo.setMinimumSize(comboDim);
331 			deviceServerCombo.setMaximumSize(comboDim);
332 			deviceServerCombo.setRenderer(new ComboRenderer());
333 			deviceServerCombo.addActionListener(new ActionListener() {
334 				public void actionPerformed(ActionEvent e) {
335 					if (settingFromSelector) return;
336 					getExecutorService().execute(new Runnable() {
337 						public void run() {
338 							getSelector().setSelectedServer(deviceServerModel.getSelectedItem());
339 						}
340 					});
341                 }
342 			});
343 		}
344 		return deviceServerCombo;
345 	}
346 	
347 	private JComboBox getDeviceNameCombo() {
348 		if (deviceNameCombo == null) {
349 			deviceNameCombo = new JComboBox();
350 			deviceNameCombo.setModel(deviceNameModel);
351 			deviceNameCombo.setPreferredSize(comboDim);
352 			deviceNameCombo.setMinimumSize(comboDim);
353 			deviceNameCombo.setMaximumSize(comboDim);
354 			deviceNameCombo.setRenderer(new ComboRenderer());
355 			deviceNameCombo.setEditable(true);
356 			deviceNameCombo.addActionListener(new ActionListener() {
357 				public void actionPerformed(ActionEvent e) {
358 					if (settingFromSelector) return;
359 					getExecutorService().execute(new Runnable(){
360 						public void run() {
361 							getSelector().setSelectedDevice(deviceNameModel.getSelectedItem());
362 						}
363 					});
364                 }
365 			});
366 		}
367 		return deviceNameCombo;
368 	}
369 	
370 	private JComboBox getPropertyNameCombo() {
371 		if (propertyNameCombo == null) {
372 			propertyNameCombo = new JComboBox();
373 			propertyNameCombo.setModel(propertyNameModel);
374 			propertyNameCombo.setPreferredSize(comboDim);
375 			propertyNameCombo.setMinimumSize(comboDim);
376 			propertyNameCombo.setMaximumSize(comboDim);
377 			propertyNameCombo.setRenderer(new ComboRenderer());
378 			propertyNameCombo.setEditable(true);
379 			propertyNameCombo.addActionListener(new ActionListener() {
380 				public void actionPerformed(ActionEvent e) {
381 					if (settingFromSelector) return;
382 					getExecutorService().execute(new Runnable() {
383 						public void run() {
384 							String obj = ((String)propertyNameCombo.getEditor().getItem());
385 							if (obj != null) {
386 								getSelector().setSelectedProperty(obj);
387 							} else if (propertyNameCombo.getSelectedIndex() < 0 || propertyNameCombo.getSelectedItem() == null) {
388 								getSelector().setSelectedProperty(null);
389 							} else {
390 								getSelector().setSelectedProperty(propertyNameModel.getSelectedItem());
391 							}
392 						}
393 					});
394                 }
395 			});
396 		}
397 		return propertyNameCombo;
398 	}
399 	
400 	private void update(final HistoryParameters params) {
401 		if (params == null || params.equals(historyParameters)) return;
402 		HistoryParameters old = historyParameters;
403 		historyParameters = params;
404 		getExecutorService().execute(new Runnable() {
405 			public void run() {
406 				getSelector().setSelectedProtocol("TINE");
407 				getSelector().setSelectedContext(params.getHistoryContext());
408 				getSelector().setSelectedServer(params.getHistoryServer());
409 				getSelector().setSelectedDevice(params.getHistoryDevice());
410 				getSelector().setSelectedProperty(params.getHistoryProperty());
411                 // due to device query precedence device has to be reselected
412 				getSelector().setSelectedDevice(params.getHistoryDevice());
413 				getIndexCombo().setSelectedItem(new Integer(params.getHistoryIndex()));
414 			}
415 		});
416 		
417         firePropertyChange(ConnectionParametersReceiver.CONNECTION_PARAMETERS_PROPERTY,old,historyParameters);
418 	}
419 
420 	/**
421 	 * Returns the selected HistoryParameters.
422 	 * 
423      * @return the parameters
424      */
425     public HistoryParameters getHistoryParameters() {
426     	if (!enableHistoryBox.isSelected()) return null;
427     	return historyParameters;
428     }
429 
430 	/**
431 	 * Sets the HistoryParameters and applies the values to the UI.
432 	 * 
433      * @param parameters the parameters to set
434      */
435     public void setHistoryParameters(HistoryParameters parameters) {
436     	if (this.historyParameters != null && this.historyParameters.equals(parameters)) return;
437 		update(parameters);
438     }
439     
440 	public void setHistoryParameters(String context, String server, String device, String property) {
441 		HistoryParameters hp = new HistoryParameters(context,server,device,property,0);
442 		update(hp);
443 	}
444     
445 	/**
446 	 * Sets the selected index.
447 	 * 
448 	 * @param index
449 	 */
450 	public void setSelectedIndex(int index) {
451 		getIndexCombo().setSelectedItem(new Integer(index));
452 	}
453 	
454 	/**
455 	 * Sets the maximum value for the index selector.
456 	 * 
457 	 * @param max new maximum value
458 	 */
459 	public void setIndexMax(int max) {
460 		getIndexModel().setMaxIndex(max);
461 	}
462 	
463 	/**
464 	 * Returns the selected index.
465 	 * 
466 	 * @return the index
467 	 */
468 	public int getSelectedIndex() {
469 		return getIndexCombo().getSelectedIndex();
470 	}
471     
472     private void setSelector(Selector selector) {
473     	if (this.selector != null && this.selector.equals(selector)) return;
474     	if (this.selector != null) {
475 	    	this.selector.removePropertyChangeListener(getSelectorPropertyListener());
476 	    	this.selector.removeQueryListener(getSelectorQueryListener());
477 	    	this.selector.removeExceptionListener(getExceptionListener());
478     	}
479     	Selector old = this.selector;
480     	this.selector = selector;
481     	if (this.selector != null) {
482 	    	this.selector.addPropertyChangeListener(getSelectorPropertyListener());
483 	    	this.selector.addQueryListener(getSelectorQueryListener());
484 	    	this.selector.addExceptionListener(getExceptionListener());
485     	}
486     	
487     	getExecutorService().execute(new Runnable() {
488 			public void run() {
489 		    	TrendHistorySelectorGUI.this.selector.setSelectedProtocol(Selector.PROTOCOL_TINE);
490 		    	fillAndSelectValue();
491 		    	applySettings();
492 			}
493     	});
494     	firePropertyChange("selector", old, this.selector);
495     }
496     
497 	protected Selector getSelector() {
498         return selector;
499     }
500 	
501 	private ExceptionListener getExceptionListener() {
502 		if (exceptionListener == null) {
503 			exceptionListener = new ExceptionListener() {
504 				public void exceptionReceived(ExceptionEvent e) {
505 					e.getThrowable().printStackTrace();
506 				}
507 			};
508 		}
509 		return exceptionListener;
510 	}
511 	
512 	private PropertyChangeListener getSelectorPropertyListener() {
513     	if (selectorPropertyListener == null) {
514     		selectorPropertyListener = new PropertyChangeListener(){
515 	        	public void propertyChange(PropertyChangeEvent evt) {
516 	        		if (getSelector() == null) return;
517 	        		if (!getPropertyNameCombo().isEnabled()) return;
518 	        		final String name = evt.getPropertyName();	        		
519             		if ("selectedContext".equals(name)) {
520             			deviceContextModel.setSelectedItem(getSelector().getSelectedContext());
521             		} else if ("selectedSubSystem".equals(name)) {
522             			subSystemModel.setSelectedItem(getSelector().getSelectedSubSystem());
523             		} else if ("selectedServer".equals(name)) {
524             			deviceServerModel.setSelectedItem(getSelector().getSelectedServer());
525             		} else if ("selectedDevice".equals(name)) {
526             			deviceNameModel.setSelectedItem(getSelector().getSelectedDevice());
527             		} else if ("selectedProperty".equals(name)) {
528             			propertyNameModel.setSelectedItem(getSelector().getSelectedProperty());
529             		} else if ("availableContexts".equals(name)) {
530             			deviceContextModel.setElements(getSelector().getAvailableContexts());
531             		} else if ("availableSubsystems".equals(name)) {
532             			subSystemModel.setElements(getSelector().getAvailableSubsystems());
533             		} else if ("availableServers".equals(name)) {
534             			deviceServerModel.setElements(getSelector().getAvailableServers());
535             		} else if ("availableDevices".equals(name)) {
536             			deviceNameModel.setElements(getSelector().getAvailableDevices());
537             		} else if ("availableProperties".equals(name)) {
538             			propertyNameModel.setElements(getSelector().getAvailableProperties());
539             		}   
540             		applySettings();
541 	        	}
542 	        };
543     	} 
544     	return selectorPropertyListener;
545     }
546 	
547 	private void fillAndSelectValue() {
548 		settingFromSelector = true;
549 		deviceContextModel.setElements(getSelector().getAvailableContexts());
550 		deviceContextModel.setSelectedItem(getSelector().getSelectedContext());
551 		subSystemModel.setElements(getSelector().getAvailableSubsystems());
552 		subSystemModel.setSelectedItem(getSelector().getSelectedSubSystem());
553 		deviceServerModel.setElements(getSelector().getAvailableServers());
554 		deviceServerModel.setSelectedItem(getSelector().getSelectedServer());
555 		deviceNameModel.setElements(getSelector().getAvailableDevices());
556 		deviceNameModel.setSelectedItem(getSelector().getSelectedDevice());
557 		propertyNameModel.setElements(getSelector().getAvailableProperties());
558 		propertyNameModel.setSelectedItem(getSelector().getSelectedProperty());
559 		settingFromSelector = false;
560 	}
561     
562     private QueryListener getSelectorQueryListener() {
563     	if (selectorQueryListener == null) {
564     		selectorQueryListener = new QueryListener() {
565 				public void queryFinished(QueryEvent e) {
566 					if (getSelector() == null) return;
567 					synchronized(selector) {
568 						fillAndSelectValue();
569 						applySettings();
570 						setCombosEnabled(true);
571 					}
572 				}
573 				public void queryStarted(QueryEvent e) {
574 					if (getSelector() == null) return;
575 					synchronized (selector) {
576 						setCombosEnabled(false);
577 					}
578 				    
579 				}
580     		};
581     	}
582     	return selectorQueryListener;
583     }
584 	
585     private boolean combosEnabled = true; 
586 	private void setCombosEnabled(boolean enabled) {
587 		
588 		if (enabled && getSelector().isBusy()) {
589 			enabled = false;
590 		}
591 //		if (this.combosEnabled == enabled) return;
592 		this.combosEnabled = enabled;
593 		SwingUtilities.invokeLater(new Runnable() {
594 			
595 			@Override
596 			public void run() {
597 				boolean b = combosEnabled && historyEnabled;
598 			    getDeviceContextCombo().setEnabled(b);
599 			    getSubSystemCombo().setEnabled(b);
600 			    getDeviceServerCombo().setEnabled(b);
601 			    getDeviceNameCombo().setEnabled(b);
602 			    getPropertyNameCombo().setEnabled(b);
603 			    getIndexCombo().setEnabled(b);
604 			
605 			}
606 		});
607 		
608 	}
609 	
610 	public static void main(String[] args) {
611 		try {
612 			
613 			TrendHistorySelectorGUI c= new TrendHistorySelectorGUI();
614 			RunnerHelper.runComponent(c,300,370);
615 		} catch (Exception e) {
616 			e.printStackTrace();
617 		}
618 		
619 	}
620 	
621 	private ThreadPoolExecutor executorService;
622 	private ThreadPoolExecutor getExecutorService() {
623 		if (executorService == null) {
624 			executorService = new  ThreadPoolExecutor(1, 1, 0, TimeUnit.NANOSECONDS,
625 		              new LinkedBlockingQueue<Runnable>()){
626 				@Override
627 				protected void afterExecute(Runnable r, Throwable t) {
628 					super.afterExecute(r, t);
629 					if (t != null) {
630 						t.printStackTrace();
631 					}
632 				}
633 			};
634 			executorService.setRejectedExecutionHandler(new RejectedExecutionHandler(){
635 				public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
636 					//ignore
637 				}
638 			});			
639         }
640         return executorService;
641 	}
642 
643 }
644 /* __oOo__ */