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  
30  import com.cosylab.gui.GaugerDisplayer;
31  import com.cosylab.gui.InfoDialog;
32  import com.cosylab.gui.displayers.DataConsumer;
33  import com.cosylab.gui.displayers.DataState;
34  import com.cosylab.gui.displayers.DisplayerUtilities;
35  import com.cosylab.gui.displayers.DoubleConsumer;
36  import com.cosylab.gui.displayers.DoubleConsumerMulticaster;
37  import com.cosylab.gui.displayers.DoubleSeqConsumer;
38  import com.cosylab.gui.util.UserSettingsProtection;
39  import com.cosylab.util.CommonException;
40  
41  import de.desy.acop.displayers.tools.AcopDisplayerTransferHandler;
42  import de.desy.acop.displayers.tools.AcopInfoDialog;
43  import de.desy.acop.displayers.tools.AcopDisplayer;
44  import de.desy.acop.transport.ConnectionParameters;
45  import de.desy.acop.transport.adapters.AcopTransportDataSource;
46  import de.desy.acop.transport.adapters.AdapterFactory;
47  import de.desy.acop.transport.adapters.AdapterFactoryService;
48  import de.desy.tine.definitions.TArrayType;
49   
50  /**
51   * <code>AcopGauger</code> is a single double value <code>AcopDisplayer</code>.
52   * It displays a round-shaped gauge meter with user defined minimum and maximum values.
53   * AcopGauger can only show readable values. The needle of the meter will show 
54   * the updated value on the linear or logarithmic scale and will notify the user
55   * of a possible out of bounds state through a change of the color.
56   * <p>
57   * The connection point for this displayer should be set using the 
58   * <i>connectionParameters</i> property, where the remote name of the 
59   * {@link ConnectionParameters} points to the desired property.
60   * </p>
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 AcopGauger extends GaugerDisplayer implements DoubleSeqConsumer,  
67  	AcopDisplayer {
68  
69  	private static final long serialVersionUID = 8380899036461858513L;
70  	private AcopInfoDialog dialog;
71  	private ConnectionParameters connectionParameters;
72  	private int arrayIndex=0;
73  	
74  	/**
75  	 * Constructs new AcopGauger.
76  	 *
77  	 */
78  	public AcopGauger() {
79  		super();      
80  		new AcopDisplayerTransferHandler(this);
81  		UserSettingsProtection.setProtection(this,DisplayerUtilities.COMMON_NUMERIC_DISPLAYER_PROPERTIES,false);
82  	}
83  
84  	/*
85  	 * (non-Javadoc)
86  	 * @see com.cosylab.gui.displayers.DoubleSeqConsumer#updateValue(long, double[])
87  	 */
88  	public void updateValue(long timestamp, double[] value) throws CommonException {
89  	    updateValue(timestamp, DisplayerUtilities.extract(arrayIndex,value));	
90      }
91  
92  	/* (non-Javadoc)
93  	 * @see com.cosylab.gui.displayers.DataConsumer#getDataConsumer(java.lang.Class)
94  	 */
95  	@Override
96  	public DataConsumer getDataConsumer(Class type)
97  	{
98  		if (type == DoubleConsumer.class || type == DoubleSeqConsumer.class) {
99  			return this;
100 		}
101 		
102 		return DoubleConsumerMulticaster.createDataConsumer(type, this);
103 	}
104 	
105 	/*
106 	 * (non-Javadoc)
107 	 * @see com.cosylab.gui.DialKnobDisplayer#setCharacteristics(java.util.Map)
108 	 */
109 	@Override
110 	public void setCharacteristics(Map characteristics) {
111 		super.setCharacteristics(characteristics);
112 		
113 		Object o  = characteristics.get("arrayType");
114 		if (o != null) {
115 			if (((TArrayType)o).isChannel()) {
116 				try {
117 					UserSettingsProtection.setUnprotected(this,"arrayIndex",0);
118 				} catch (Exception e) {
119 					e.printStackTrace();
120 				}
121 			}
122 		}
123 	}
124 	
125 	/*
126 	 * (non-Javadoc)
127 	 * @see de.desy.acop.displayers.AcopDisplayerConnector#getConnectionParameters()
128 	 */
129 	public ConnectionParameters getConnectionParameters() {
130 		return connectionParameters;
131 	}
132 	
133 	/*
134 	 * (non-Javadoc)
135 	 * @see de.desy.acop.displayers.AcopDisplayerConnector#setConnectionParameters(de.desy.acop.transport.ConnectionParameters)
136 	 */
137 	public void setConnectionParameters(ConnectionParameters param) throws CommonException, PropertyVetoException {
138 		if (param!=null && connectionParameters != null) {
139 			if(param.equals(connectionParameters)) return;
140 		}
141 		updateDataState(new DataState(DataState.UNDEFINED));
142 
143 		ConnectionParameters old = connectionParameters;
144 		this.connectionParameters = param;
145 		AdapterFactory factory = AdapterFactoryService.getInstance().getAdapterFactory();
146 		if (getDataSource() != null)
147 			factory.releaseDataSource((AcopTransportDataSource) getDataSource());
148 		if (param == null) {
149 			setDataSource(null);
150 			setTitle("No Connection");
151 		} else {
152 			if (param.getPropertySize() == ConnectionParameters.AUTO_PROPERTY_SIZE) {
153 				param = param.deriveWithPropertySize(1);
154 			}
155 			AcopTransportDataSource ds = factory.createDataSource(param);
156 			setDataSource(ds);
157 		}
158 
159 		firePropertyChange(CONNECTION_PARAMETERS_PROPERTY,old, connectionParameters);
160 	}
161 	
162 	/*
163 	 * (non-Javadoc)
164 	 * @see de.desy.acop.displayers.tools.AcopDisplayer#getArrayIndex()
165 	 */
166 	public int getArrayIndex() {
167 		return arrayIndex;
168 	}
169 
170 	/*
171 	 * (non-Javadoc)
172 	 * @see de.desy.acop.displayers.tools.AcopDisplayer#setArrayIndex(int)
173 	 */
174 	public void setArrayIndex(int arrayIndex) {
175 		if (this.arrayIndex == arrayIndex) return;
176 		int oldValue = this.arrayIndex;
177 		this.arrayIndex = arrayIndex;
178 		firePropertyChange("arrayIndex", oldValue, this.arrayIndex);
179 	}
180 
181 	/*
182 	 * (non-Javadoc)
183 	 * @see com.cosylab.gui.GaugerDisplayer#getInfoDialog()
184 	 */
185 	@Override
186 	public InfoDialog getInfoDialog() {
187 		if (dialog == null) {
188 			dialog = new AcopInfoDialog(this);
189 		}
190 		return dialog;
191 	}
192 	
193 	/**
194 	 * Enables/disables Properties item in the popup menu.
195 	 * @param enable
196 	 */
197 	public void setPropertiesPopupEnabled(boolean enable) {
198 		Action[] actions = getPopupManager().getActions();
199 		for (Action a : actions) {
200 			if (a != null && "Preferences...".equals(a.getValue(Action.NAME))) {
201 				a.setEnabled(enable);
202 				return;
203 			}
204 		}
205 	}
206 	
207 	/**
208 	 * Returns true if Properties item is enabled in the popup menu.
209 	 * @return
210 	 */
211 	public boolean isPropertiesPopupEnabled() {
212 		Action[] actions = getPopupManager().getActions();
213 		for (Action a : actions) {
214 			if (a != null && "Preferences...".equals(a.getValue(Action.NAME))) {
215 				return a.isEnabled();
216 			}
217 		}
218 		return false;
219 	}
220 	
221 }
222 /* __oOo__ */