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.GridBagConstraints;
26  import java.awt.GridBagLayout;
27  import java.awt.Insets;
28  import java.awt.event.ActionEvent;
29  import java.awt.event.ActionListener;
30  import java.beans.Beans;
31  import java.beans.Customizer;
32  import java.beans.PropertyChangeEvent;
33  import java.beans.PropertyChangeListener;
34  import java.beans.PropertyVetoException;
35  
36  import javax.swing.JButton;
37  import javax.swing.JPanel;
38  
39  import com.cosylab.gui.components.util.RunnerHelper;
40  import com.cosylab.util.CommonException;
41  
42  import de.desy.acop.displayers.tools.ConnectionParametersReceiver;
43  import de.desy.acop.displayers.tools.MultipleAcopDisplayer;
44  import de.desy.acop.transport.ConnectionParameters;
45  
46  /**
47   * <code>ConnectionCustomizer</code> enables device and property selection
48   * through the custumizer of the displayer. The Customizer supports Drag and Drop
49   * of the selected property.
50   * <p>
51   * This customizer allow selection of a single <code>ConnectionParameters</code>
52   * </p>
53   * 
54   * @author Jaka Bobnar, Cosylab
55   * @see ConnectionParameters
56   */
57  public class ConnectionCustomizer extends JPanel implements Customizer {
58  	
59  	private static final long serialVersionUID = -4511139029213172995L;
60  
61  	private Object bean;
62  	
63  	private JPanel commandPanel;
64  	private SelectorGUI selectorGUI;
65  	
66  	private JButton connectButton;
67  	private boolean connectButtonVisible = true;
68  	
69  	private ConnectionParameters connectionParameters;
70  	
71  	/**
72  	 * Constructs a new ConnectionCustomizer.
73  	 *
74  	 */
75  	public ConnectionCustomizer() {
76  		super();
77  		initialize();
78  	}
79  	
80  	private void initialize() {
81  		
82  		this.setLayout(new GridBagLayout());
83  		this.add(getCommandPanel(), new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(11,11,11,11),0,0));
84  	}
85  	
86  	private JButton getConnectButton() {
87  		if (connectButton == null) {
88  			connectButton = new JButton("Connect");
89  			connectButton.addActionListener(new ActionListener() {
90  
91  				public void actionPerformed(ActionEvent e) {
92  					try {
93  						if (bean instanceof ConnectionParametersReceiver) {
94  							((ConnectionParametersReceiver)bean).setConnectionParameters(getSelectorGUI().getConnectionParameters());
95  						}
96  					} catch (CommonException e1) {
97  						e1.printStackTrace();
98  					} catch (PropertyVetoException e1) {
99  						e1.printStackTrace();
100 					}
101                 }
102 				
103 			});
104 			connectButton.setVisible(connectButtonVisible);
105 			connectButton.setEnabled(false);
106 		}
107 		return connectButton;
108 	}
109 	
110 	private SelectorGUI getSelectorGUI() {
111 		if (selectorGUI == null) {
112 			selectorGUI = new SelectorGUI();
113 			selectorGUI.addSelectorGUIListener(new SelectorGUIListener() {
114 				public void selectionChanged(SelectorGUIEvent e) {
115 					setButtonsEnabled(e.isSelectionComplete());
116 				}
117 			});
118 			selectorGUI.addPropertyChangeListener(ConnectionParametersReceiver.CONNECTION_PARAMETERS_PROPERTY, new PropertyChangeListener() {
119 				public void propertyChange(PropertyChangeEvent evt) {
120 				    if (!ConnectionParametersReceiver.CONNECTION_PARAMETERS_PROPERTY.equals(evt.getPropertyName())) return;
121 				    setConnectionParameters((ConnectionParameters) evt.getNewValue());
122 				}
123 			});
124 			if (bean != null)
125 				selectorGUI.setObject(bean);
126 		}
127 		return selectorGUI;
128 	}
129 	
130 	private JPanel getCommandPanel() {
131 		if (commandPanel == null) {
132 			commandPanel = new JPanel(new GridBagLayout());
133 			commandPanel.add(getSelectorGUI(), new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0));
134 			
135 			if (!Beans.isDesignTime()) {
136 				commandPanel.add(getConnectButton(), new GridBagConstraints(0,1,2,1,1,0,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0,0,0,0),0,0));
137 			}			
138 		}
139 		return commandPanel;
140 	}
141 	
142 	
143 	/*
144 	 * (non-Javadoc)
145 	 * @see java.beans.Customizer#setObject(java.lang.Object)
146 	 */
147 	public void setObject(Object bean) {
148 		if (bean instanceof MultipleAcopDisplayer) {
149 			this.bean = bean;
150 		} else if (bean instanceof ConnectionParametersReceiver) {
151 			this.bean = bean;
152 			((ConnectionParametersReceiver)this.bean).addPropertyChangeListener(ConnectionParametersReceiver.CONNECTION_PARAMETERS_PROPERTY,
153 					new PropertyChangeListener(){
154 				public void propertyChange(PropertyChangeEvent evt) {
155 					setConnectionParameters(((ConnectionParametersReceiver)ConnectionCustomizer.this.bean).getConnectionParameters());				
156 				}
157 			});
158 		} else {
159 			throw new IllegalArgumentException("Only ConnectionParametersReceiver and" +
160 					" MultipleAcopDisplayer can use this Customizer.");
161 		}
162 	
163 		getSelectorGUI().setObject(bean);
164 //		setConnectionParameters(getSelectorGUI().getConnectionParameters());
165     }
166 
167 	/**
168 	 * Returns the selected ConnectionParameters.
169 	 * 
170      * @return the parameters
171      */
172     public ConnectionParameters getConnectionParameters() {
173     	return connectionParameters;
174     }
175 
176 	/**
177 	 * Sets the ConnectionParameters and applies values to the selector.
178 	 *  
179      * @param parameters the parameters to set
180      */
181     public void setConnectionParameters(ConnectionParameters parameters) {
182     	if (parameters != null && parameters.equals(connectionParameters)) return;
183     	ConnectionParameters old = connectionParameters;
184     	connectionParameters = parameters;
185     	if (Beans.isDesignTime() && bean != null && bean instanceof ConnectionParametersReceiver && SelectorUtilities.isConnectionParametersValid(connectionParameters)) {
186 			try {
187 				((ConnectionParametersReceiver)bean).setConnectionParameters(parameters);
188             } catch (CommonException e) {
189                  e.printStackTrace();
190             } catch (PropertyVetoException e) {
191                  e.printStackTrace();
192             }
193 		}
194     	getSelectorGUI().setConnectionParameters(parameters);
195     	if (SelectorUtilities.isConnectionParametersValid(connectionParameters)) 
196     		setButtonsEnabled(true);
197     	firePropertyChange(ConnectionParametersReceiver.CONNECTION_PARAMETERS_PROPERTY, old, parameters);
198     }
199     
200 	/**
201 	 * Returns true if connect button is visible.
202 	 * @return true if connect button is visible
203 	 */
204 	public boolean isConnectButtonVisible() {
205 		return connectButtonVisible;
206 	}
207 
208 	
209 	/**
210 	 * Set the connect button visible/invisible.
211 	 * .
212 	 * @param connectButtonVisible true if connect button should be visible
213 	 */
214 	public void setConnectButtonVisible(boolean connectButtonVisible) {
215 		this.connectButtonVisible = connectButtonVisible;
216 		if (connectButton!=null) {
217 			connectButton.setVisible(connectButtonVisible);
218 		}
219 	}
220 	
221 	private void setButtonsEnabled(boolean enabled) {
222 		getConnectButton().setEnabled(enabled);
223 	}
224 	
225 	/**
226 	 * Flag indicating whether array size choosing should also be available or only
227 	 * the remote name and access paramters should be available.
228 	 * 
229 	 * @param onlyCP if true only the remote name and access parameters can be selected
230 	 */
231 	public void setOnlyConnectionParametersMode(boolean onlyCP) {
232 		getSelectorGUI().setOnlyConnectionParametersMode(onlyCP);
233 	}
234 	
235 	/**
236 	 * Returns true if only remote name and access parameters can be selected.
237 	 * @return true if only remote name and access parameters can be selected
238 	 */
239 	public boolean getOnlyConnectionParametersMode() {
240 		return getSelectorGUI().getOnlyConnectionParametersMode();
241 	}
242 		
243 	public static void main(String[] args) {
244 		try {
245 			
246 			ConnectionCustomizer c= new ConnectionCustomizer();
247 			RunnerHelper.runComponent(c,300,300);
248 			
249 //			c.addPropertyChangeListener(new PropertyChangeListener() {
250 //			
251 //				public void propertyChange(PropertyChangeEvent evt) {
252 //					System.out.println("E: " + evt);
253 //				}
254 //			
255 //			});
256 			
257 		} catch (Exception e) {
258 			e.printStackTrace();
259 		}
260 	}
261 	
262 	
263 
264 }
265 /* __oOo__ */