View Javadoc

1   /*
2    * Copyright (c) 2003-2008 by Cosylab d. d.
3    *
4    * This file is part of CosyBeans-Common.
5    *
6    * CosyBeans-Common is free software: you can redistribute it and/or modify
7    * it under the terms of the GNU General Public License as published by
8    * the Free Software Foundation, either version 3 of the License, or
9    * (at your option) any later version.
10   *
11   * CosyBeans-Common is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   * GNU General Public License for more details.
15   *
16   * You should have received a copy of the GNU General Public License
17   * along with CosyBeans-Common.  If not, see <http://www.gnu.org/licenses/>.
18   */
19  
20  package com.cosylab.gui.components.table.cells;
21  
22  import com.cosylab.util.NameValueList;
23  import com.cosylab.util.ObjectList;
24  
25  import java.util.Iterator;
26  import java.util.List;
27  import java.util.Map;
28  
29  
30  /**
31   * TableCell is most basic kind of table cells, which has own renderers and
32   * editors in <code>com.cosylab.gui.components.table.renderers</code>.
33   * 
34   * <p>
35   * This cell may contain arbitrary set of characteristics. They hint renderers,
36   * how to display particular cell. Consult JavaDoc of particular cell to see
37   * which characteristics are  supported and compatible with available
38   * renderers.
39   * </p>
40   * 
41   * <p>
42   * User of  this cell migth decide to define values for following
43   * characteristics: TIMEOUT, ERROR, SUSPENDED, OUT_OF_BOUNDS.
44   * </p>
45   * 
46   * <p>
47   * Note that characteristic map is optimized for number of characteristics up
48   * to 10 because is implemented around linear array.
49   * </p>
50   * 
51   * <p>
52   * Note that all characteristics are optional. If they are null, renderers will
53   * try best to use value without them.
54   * </p>
55   *
56   * @author <a href="mailto:igor.kriznar@cosylab.com">Igor Kriznar</a>
57   * @version $id$
58   */
59  public class TableCell implements Comparable
60  {
61  	/** Characteristic name for tooltip. */
62  	public static final String TOOLTIP = "tooltip";
63  
64  	/**
65  	 * Characteristic name for out of bouds value state, when cell value is out
66  	 * of designated value range, characteristic value must be Boolean.TRUE.
67  	 */
68  	public static final String OUT_OF_BOUNDS = "outOfBounds";
69  
70  	/**
71  	 * Characteristic name for timeout state, value must be Boolean.TRUE if
72  	 * data source in timeout.
73  	 */
74  	public static final String TIMEOUT = "timeout";
75  
76  	/**
77  	 * Characteristic name for error state, value must be Boolean.TRUE if data
78  	 * source is in error condition.
79  	 */
80  	public static final String ERROR = "error";
81  
82  	/**
83  	 * Characteristic name for alarm state, value must be Boolean.TRUE if data
84  	 * source is in alarm condition.
85  	 */
86  	public static final String ALARM = "alarm";
87  
88  	/**
89  	 * Characteristic name for warning state, value must be Boolean.TRUE if
90  	 * value is out of bounds or source is in warning condition.
91  	 */
92  	public static final String WARNING = "warning";
93  
94  	/**
95  	 * Characteristic name for severity of alarm or error state.
96  	 */
97  	public static final String SEVERITY = "severity";
98  
99  	/**
100 	 * Characteristic name for suspended state, value must be Boolean.TRUE if
101 	 * data source is in suspended condition (eg. not initialized).
102 	 */
103 	public static final String SUSPENDED = "suspended";
104 	protected Object value = null;
105 	protected Object dataSource;
106 	protected Command[] commands = null;
107 	protected String identifier = null;
108 	private Map<String, Object> characteristics;
109 	private List<String> supported = new ObjectList(String.class);
110 	protected long timestamp;
111 
112 	/**
113 	 * Creates new noninitialized instance of cell proxy.
114 	 */
115 	protected TableCell()
116 	{
117 		super();
118 	}
119 
120 	/**
121 	 * Creates a new TableCell object.
122 	 *
123 	 * @param identifier unique string within context of current table
124 	 * @param dataSource object which provides values for this cell
125 	 * @param value a cells value
126 	 * @param commands commands, which can be executed on this cell
127 	 */
128 	public TableCell(String identifier, Object dataSource, Object value,
129 	    Command[] commands)
130 	{
131 		this.identifier = identifier;
132 		this.dataSource = dataSource;
133 		this.value = value;
134 		this.commands = commands;
135 	}
136 
137 	/**
138 	 * Returns commands, which can be executed on this cell.
139 	 *
140 	 * @return commands, which can be executed on this cell
141 	 */
142 	public Command[] getCommands()
143 	{
144 		return commands;
145 	}
146 
147 	/**
148 	 * Object which deliveres values for this cell.
149 	 *
150 	 * @return objects which deliveres values to this cell
151 	 */
152 	public Object getDataSource()
153 	{
154 		return dataSource;
155 	}
156 
157 	/**
158 	 * Generally expected to be unique string within context of current table.
159 	 *
160 	 * @return unique string within context of current table
161 	 */
162 	public String getIdentifier()
163 	{
164 		return identifier;
165 	}
166 
167 	/**
168 	 * Return tooltip value or <code>null</code> if none is set.
169 	 *
170 	 * @return tooltip
171 	 */
172 	public String getTooltip()
173 	{
174 		return (String)characteristics.get(TOOLTIP);
175 	}
176 
177 	/**
178 	 * Return tooltip value or <code>null</code> if none is set.
179 	 *
180 	 * @return tooltip
181 	 */
182 	public Object getValue()
183 	{
184 		return value;
185 	}
186 
187 	/**
188 	 * Sets new value to this cell.
189 	 *
190 	 * @param newValue
191 	 */
192 	public void setValue(Object newValue)
193 	{
194 		value = newValue;
195 	}
196 
197 	/* (non-Javadoc)
198 	 * @see java.lang.Object#toString()
199 	 */
200 	public String toString()
201 	{
202 		return String.valueOf(value);
203 	}
204 
205 	/**
206 	 * Return scharacteristic value with specific name.
207 	 *
208 	 * @param name a name of requested characteristic
209 	 *
210 	 * @return characteristic value, or <code>null</code> if not defined
211 	 */
212 	public Object getCharacteristic(String name)
213 	{
214 		return getCharacteristics().get(name);
215 	}
216 
217 	/**
218 	 * Return scharacteristic value with specific name.
219 	 *
220 	 * @param name a name of requested characteristic
221 	 * @param defaultValue DOCUMENT ME!
222 	 *
223 	 * @return characteristic value, or <code>null</code> if not defined
224 	 */
225 	public Object getCharacteristic(String name, Object defaultValue)
226 	{
227 		Object o = getCharacteristics().get(name);
228 
229 		if (o == null) {
230 			o = defaultValue;
231 		}
232 
233 		return o;
234 	}
235 
236 	/**
237 	 * Puts new characteristic value with provided name.
238 	 *
239 	 * @param name characteristic name
240 	 * @param value new characteristic value
241 	 *
242 	 * @return old characteristic value, or <code>null</code> if none
243 	 */
244 	public Object putCharacteristic(String name, Object value)
245 	{
246 		return getCharacteristics().put(name, value);
247 	}
248 
249 	/**
250 	 * Puts all characteristics to this cell.
251 	 *
252 	 * @param characteristics Map with characteristics
253 	 */
254 	public void putAllCharacteristics(Map<String, Object> characteristics)
255 	{
256 		if (characteristics == null) return;
257 		Iterator<String> it = characteristics.keySet().iterator();
258 		while (it.hasNext()) {
259 			String key = it.next();
260 			Object val= characteristics.get(key);
261 			if (val!=null) {
262 				getCharacteristics().put(key,val);
263 			}
264 		}
265 	}
266 
267 	/**
268 	 * Return map with all characteristics.
269 	 *
270 	 * @return map with all characteristics
271 	 */
272 	public Map<String, Object> getCharacteristics()
273 	{
274 		if (characteristics == null) {
275 			characteristics = new NameValueList(12);
276 		}
277 
278 		return characteristics;
279 	}
280 
281 	/**
282 	 * Returns time of latest change of value.
283 	 *
284 	 * @return time of latest change of value
285 	 */
286 	public long getTimestamp()
287 	{
288 		return timestamp;
289 	}
290 
291 	/**
292 	 * Sets time of latest change of value.
293 	 *
294 	 * @param timestamp time of latest change
295 	 */
296 	public void setTimestamp(long timestamp)
297 	{
298 		this.timestamp = timestamp;
299 	}
300 
301 	/**
302 	 * Returns <code>true</code> if ERROR characteristic is true.
303 	 *
304 	 * @return <code>true</code> if ERROR characteristic is true
305 	 */
306 	public boolean isError()
307 	{
308 		return Boolean.TRUE.equals(getCharacteristic(ERROR));
309 	}
310 
311 	/**
312 	 * Returns <code>true</code> if ALARM characteristic is true.
313 	 *
314 	 * @return <code>true</code> if ALARM characteristic is true
315 	 */
316 	public boolean isAlarm()
317 	{
318 		return Boolean.TRUE.equals(getCharacteristic(ALARM));
319 	}
320 
321 	/**
322 	 * Returns <code>true</code> if WARNING characteristic is true.
323 	 *
324 	 * @return <code>true</code> if WARNING characteristic is true
325 	 */
326 	public boolean isWarning()
327 	{
328 		return Boolean.TRUE.equals(getCharacteristic(WARNING));
329 	}
330 
331 	/**
332 	 * Returns <code>true</code> if TIMEOUT characteristic is true.
333 	 *
334 	 * @return <code>true</code> if TIMEOUT characteristic is true
335 	 */
336 	public boolean isTimeout()
337 	{
338 		return Boolean.TRUE.equals(getCharacteristic(TIMEOUT));
339 	}
340 
341 	/**
342 	 * Returns <code>true</code> if SUSPENDED characteristic is true.
343 	 *
344 	 * @return <code>true</code> if SUSPENDED characteristic is true
345 	 */
346 	public boolean isSuspended()
347 	{
348 		return Boolean.TRUE.equals(getCharacteristic(SUSPENDED));
349 	}
350 
351 	/**
352 	 * Returns <code>true</code> if OUT_OF_BOUNDS characteristic is true.
353 	 *
354 	 * @return <code>true</code> if OUT_OF_BOUNDS characteristic is true
355 	 */
356 	public boolean isOutOfBounds()
357 	{
358 		return Boolean.TRUE.equals(getCharacteristic(OUT_OF_BOUNDS));
359 	}
360 
361 	/**
362 	 * DOCUMENT ME!
363 	 *
364 	 * @return DOCUMENT ME!
365 	 */
366 	public String[] getSupportedCharacteristics()
367 	{
368 		return (String[])supported.toArray(new String[supported.size()]);
369 	}
370 
371 	/**
372 	 * DOCUMENT ME!
373 	 *
374 	 * @param name DOCUMENT ME!
375 	 */
376 	public void addSupportedCharacteristic(String name)
377 	{
378 		if (!supported.contains(name)) {
379 			supported.add(name);
380 		}
381 	}
382 
383 	/**
384 	 * DOCUMENT ME!
385 	 *
386 	 * @param name DOCUMENT ME!
387 	 */
388 	public void removeSupportedCharacteristic(String name)
389 	{
390 		supported.remove(name);
391 	}
392 
393 	/* (non-Javadoc)
394 	 * @see java.lang.Comparable#compareTo(java.lang.Object)
395 	 */
396 	public int compareTo(Object o)
397 	{
398 		if (o instanceof TableCell) {
399 			TableCell tc = (TableCell)o;
400 
401 			if (getValue() != null && tc.getValue() != null) {
402 				if (getValue().getClass().equals(tc.getValue().getClass())
403 				    && (getValue() instanceof Comparable)) {
404 					return ((Comparable)value).compareTo(tc.getValue());
405 				} else if ((getValue() instanceof Number)
406 				    && (tc.getValue() instanceof Number)) {
407 					double d = ((Number)getValue()).doubleValue()
408 						- ((Number)tc.getValue()).doubleValue();
409 
410 					if (d < -0.00001) {
411 						return -1;
412 					}
413 
414 					if (d > 0.00001) {
415 						return 1;
416 					}
417 				}
418 			}
419 		}
420 
421 		return 0;
422 	}
423 }
424 
425 /* __oOo__ */