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;
24  
25  import java.beans.PropertyVetoException;
26  import java.util.Map;
27  
28  import javax.swing.Action;
29  import javax.swing.JFrame;
30  
31  import com.cosylab.gui.InfoDialog;
32  import com.cosylab.gui.LabelDisplayer;
33  import com.cosylab.gui.adapters.Converter;
34  import com.cosylab.gui.displayers.DataState;
35  import com.cosylab.gui.util.UserSettingsProtection;
36  import com.cosylab.util.CommonException;
37  
38  import de.desy.acop.displayers.tools.AcopDisplayer;
39  import de.desy.acop.displayers.tools.AcopDisplayerTransferHandler;
40  import de.desy.acop.displayers.tools.AcopInfoDialog;
41  import de.desy.acop.transport.ConnectionParameters;
42  import de.desy.acop.transport.adapters.AcopTransportDataSource;
43  import de.desy.acop.transport.adapters.AdapterFactory;
44  import de.desy.acop.transport.adapters.AdapterFactoryService;
45  import de.desy.tine.definitions.TArrayType;
46  
47  /**
48   * <code>AcopLabel</code> is an <code>AcopDisplayer</code> which can
49   * show string or number values. In general this displayer can only
50   * show readable strings, which means that any other value that needs
51   * to be shown here has to be converted to string. If this displayer
52   * is used for presenting double values or double value arrays, those
53   * will be converted to a single line strings and then showed on the label.
54   * This displayer does not allow setting of any values.
55   * <p>
56   * The connection point for this displayer should be set using the 
57   * <i>connectionParameters</i> property, where the remote name of the 
58   * {@link ConnectionParameters} points to the desired property.
59   * </p>
60   * 
61   * 
62   * @author <a href="mailto:jaka.bobnar@cosylab.com">Jaka Bobnar</a>
63   * @version $Id: Templates.xml,v 1.10 2004/01/13 16:17:13 jbobnar Exp $
64   *
65   */
66  public class AcopLabel extends LabelDisplayer implements AcopDisplayer {
67  	private static final long serialVersionUID = 1L;
68   
69  
70  	public static void main(String[] s) {
71  		JFrame f= new JFrame();
72  		f.setContentPane(new AcopLabel());
73  		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
74  		f.pack();
75  		f.setVisible(true);
76  	}
77  	
78  	private ConnectionParameters connectionParameters;
79  
80  	private AcopInfoDialog dialog;
81  
82  	/**
83  	 * Constructs new AcopLabel.
84  	 *
85  	 */
86  	public AcopLabel() {
87  		super();
88  		
89  		new AcopDisplayerTransferHandler(this);
90  		UserSettingsProtection.setProtection(this,new String[]{"title"},false);
91  	}
92  
93  	/*
94  	 * (non-Javadoc)
95  	 * 
96  	 * @see de.desy.acop.displayers.AcopDisplayerConnector#getConnectionParameters()
97  	 */
98  	public ConnectionParameters getConnectionParameters() {
99  		return connectionParameters;
100 	}
101 
102 	/*
103 	 * (non-Javadoc)
104 	 * @see com.cosylab.gui.displayers.ConvertibleDisplayer#getConverter()
105 	 */
106 	public Converter getConverter() {
107 		return null;
108 	}
109 	
110 	/*
111 	 * (non-Javadoc)
112 	 * @see com.cosylab.gui.DialKnobDisplayer#setCharacteristics(java.util.Map)
113 	 */
114 	@Override
115 	public void setCharacteristics(Map characteristics) {
116 		super.setCharacteristics(characteristics);
117 		
118 		Object o  = characteristics.get("arrayType");
119 		if (o != null) {
120 			if (((TArrayType)o).isChannel()) {
121 				try {
122 					UserSettingsProtection.setUnprotected(this,"arrayIndex",0);
123 				} catch (Exception e) {
124 					e.printStackTrace();
125 				}
126 			}
127 		}
128 	}
129 
130 	/*
131 	 * (non-Javadoc)
132 	 * @see com.cosylab.gui.LabelDisplayer#getInfoDialog()
133 	 */
134 	@Override
135 	public InfoDialog getInfoDialog() {
136 		if (dialog == null) {
137 			dialog = new AcopInfoDialog(this);
138 		}
139 		return dialog;
140 	}
141 
142 	/*
143 	 * (non-Javadoc)
144 	 * 
145 	 * @see de.desy.acop.displayers.AcopDisplayerConnector#setConnectionParameters(de.desy.acop.transport.ConnectionParameters)
146 	 */
147 	public void setConnectionParameters(ConnectionParameters param)
148 			throws CommonException, PropertyVetoException {
149 	
150 		if (param != null && connectionParameters != null) {
151 			if (param.equals(connectionParameters))
152 				return;
153 		}
154 		updateDataState(new DataState(DataState.UNDEFINED));
155 		
156 		ConnectionParameters old = connectionParameters;
157 		this.connectionParameters = param;
158 		AdapterFactory factory = AdapterFactoryService.getInstance()
159 				.getAdapterFactory();
160 		if (getDataSource() != null)
161 			factory.releaseDataSource((AcopTransportDataSource) getDataSource());
162 		if (param == null) {
163 			setDataSource(null);
164 			setTitle("No Connection");
165 		} else {
166 			if (param.getPropertySize() == ConnectionParameters.AUTO_PROPERTY_SIZE) {
167 				param = param.deriveWithPropertySize(1);
168 			}
169 			AcopTransportDataSource ds = factory.createDataSource(param);
170 			setDataSource(ds);
171 		}
172 
173 		firePropertyChange(CONNECTION_PARAMETERS_PROPERTY, old,
174 				connectionParameters);
175 	}
176 
177 	/*
178 	 * (non-Javadoc)
179 	 * @see com.cosylab.gui.displayers.ConvertibleDisplayer#setConverter(com.cosylab.gui.adapters.Converter)
180 	 */
181 	public void setConverter(Converter converter) throws PropertyVetoException {
182 	}
183 
184 	/* (non-Javadoc)
185 	 * @see de.desy.acop.displayers.tools.AcopDisplayer#setArrayIndex(int)
186 	 */
187 	public void setArrayIndex(int index) {
188 	}
189 
190 	/* (non-Javadoc)
191 	 * @see de.desy.acop.displayers.tools.AcopDisplayer#getArrayIndex()
192 	 */
193 	public int getArrayIndex() {
194 		return 0;
195 	}
196 
197 	/* (non-Javadoc)
198 	 * @see com.cosylab.gui.displayers.DoubleSeqConsumer#updateValue(long, double[])
199 	 */
200 	public void updateValue(long timestamp, double[] value) throws CommonException {
201 		if (value==null) {
202 			updateValue(timestamp, "N/A");
203 			return;
204 		}
205 		StringBuilder s= new StringBuilder(16*value.length);
206 		s.append('[');
207 		if (value.length>0) {
208 			s.append(value[0]);
209 		}
210 		for (int i = 1; i < value.length; i++) {
211 			s.append(',');
212 			s.append(value[i]);
213 		}
214 		s.append(']');
215 		updateValue(timestamp, s.toString());
216 	}
217 	
218 	/**
219 	 * Enables/disables Properties item in the popup menu.
220 	 * @param enable
221 	 */
222 	public void setPropertiesPopupEnabled(boolean enable) {
223 		Action[] actions = getPopupManager().getActions();
224 		for (Action a : actions) {
225 			if (a != null && "Preferences...".equals(a.getValue(Action.NAME))) {
226 				a.setEnabled(enable);
227 				return;
228 			}
229 		}
230 	}
231 	
232 	/**
233 	 * Returns true if Properties item is enabled in the popup menu.
234 	 * @return
235 	 */
236 	public boolean isPropertiesPopupEnabled() {
237 		Action[] actions = getPopupManager().getActions();
238 		for (Action a : actions) {
239 			if (a != null && "Preferences...".equals(a.getValue(Action.NAME))) {
240 				return a.isEnabled();
241 			}
242 		}
243 		return false;
244 	}
245 
246 }