001 package echopoint;
002
003 /*
004 * This file is part of the Echo Point Project. This project is a collection
005 * of Components that have extended the Echo Web Application Framework.
006 *
007 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
008 *
009 * The contents of this file are subject to the Mozilla Public License Version
010 * 1.1 (the "License"); you may not use this file except in compliance with
011 * the License. You may obtain a copy of the License at
012 * http://www.mozilla.org/MPL/
013 *
014 * Software distributed under the License is distributed on an "AS IS" basis,
015 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
016 * for the specific language governing rights and limitations under the
017 * License.
018 *
019 * Alternatively, the contents of this file may be used under the terms of
020 * either the GNU General Public License Version 2 or later (the "GPL"), or
021 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
022 * in which case the provisions of the GPL or the LGPL are applicable instead
023 * of those above. If you wish to allow use of your version of this file only
024 * under the terms of either the GPL or the LGPL, and not to allow others to
025 * use your version of this file under the terms of the MPL, indicate your
026 * decision by deleting the provisions above and replace them with the notice
027 * and other provisions required by the GPL or the LGPL. If you do not delete
028 * the provisions above, a recipient may use your version of this file under
029 * the terms of any one of the MPL, the GPL or the LGPL.
030 */
031
032 import java.util.HashMap;
033 import java.util.Iterator;
034 import java.util.Map;
035
036 import nextapp.echo.app.Component;
037 import echopoint.able.Attributeable;
038
039 /**
040 * <code>ComponentEx</code> is an abstract component that offers helper
041 * methods for getting and setting properties, beyond what the base
042 * <code>nextapp.echo2.app.Component</code> does.
043 * <p>
044 * The <code>hidden</code> property is an interesting one. This is a different
045 * visual property to <code>visible</code>.
046 * <p>
047 * In Echo2 components that are not <code>visible</code> do not exist at all
048 * as far as rendering is concerned. They get no property updates and will not
049 * exist in the client. The <code>hidden</code> flag simple makes the
050 * component "not shown" on the client. It still exists and can/will receive
051 * property updates.
052 * <p>
053 * The use of this flag can help the application become more efficient because
054 * server to client messaging is reduced when a parent component is hidden and
055 * then shown, as it may not redraw all sub components.
056 * <p>
057 * In CSS/XHTML terms, hidden is equivalent to display:none.
058 *
059 * @author Brad Baker
060 * @version $Id$
061 */
062 public abstract class ComponentEx extends Component implements Attributeable {
063
064 public static final String PROPERTY_HIDDEN = "hidden";
065
066 /**
067 * <code>ComponentEx</code> does not participate in focus traversal by
068 * default.
069 */
070 public ComponentEx() {
071 setFocusTraversalParticipant(false);
072 }
073
074 /**
075 * @return true if the <code>ComponentEx</code> is currently hidden
076 */
077 public boolean isHidden() {
078 return get(PROPERTY_HIDDEN, false);
079 }
080
081 /**
082 * Sets whether this ComponentEx (and its content) is hidden on the client.
083 * <p>
084 * This is a different visual property to <code>visible</code>. In Echo2
085 * components that are not <code>visible</code> do not exist at all as far
086 * as rendering is concerned. They get no property updates and will not
087 * exist in the client. The <code>hidden</code> flag simple makes the
088 * component "not shown" on the client. It still exists and can receive
089 * property updates.
090 * <p>
091 * The use of this flag can help the application become more efficient
092 * because server to client messaging is reduced when a parent component is
093 * hidden and then shown, as it may not redraw all sub components.
094 * <p>
095 * In CSS/XHTML terms, hidden is equivalent to display:none.
096 *
097 * @param newValue -
098 * the new value of the hidden flag
099 */
100 public void setHidden(boolean newValue) {
101 set(PROPERTY_HIDDEN, newValue);
102 }
103
104 /**
105 * Helper method to get 'Object' properties. Placed there for completeness
106 * since Component.getProperty() does exactly the same thing.
107 *
108 * @return - the 'Object' property
109 * @see Component#get(String)
110 */
111 public static Object get(Component c, String propertyName) {
112 return c.get(propertyName);
113 }
114
115 /**
116 * Helper method to get 'Object' properties, with a default value.
117 * @param c
118 * @param propertyName
119 * @param defaultValue
120 * @return - the 'Object' property
121 */
122 public static Object get(Component c, String propertyName, Object defaultValue) {
123 Object obj = c.get(propertyName);
124 return (obj == null ? defaultValue : obj);
125 }
126
127 /**
128 * Helper method to get 'boolean' properties, with a default value.
129 *
130 * @return - the 'boolean' property or the default value if its null
131 * @see Component#get(String)
132 */
133 public static boolean get(Component c, String propertyName, boolean defaultValue) {
134 Boolean obj = (Boolean) c.get(propertyName);
135 return (obj == null ? defaultValue : obj.booleanValue());
136 }
137
138 /**
139 * Helper method to get 'byte' properties, with a default value.
140 *
141 * @return - the 'byte' property or the default value if its null
142 * @see Component#get(String)
143 */
144 public static byte get(Component c, String propertyName, byte defaultValue) {
145 Byte obj = (Byte) c.get(propertyName);
146 return (obj == null ? defaultValue : obj.byteValue());
147 }
148
149 /**
150 * Helper method to get 'char' properties, with a default value.
151 *
152 * @return - the 'char' property or the default value if its null
153 * @see Component#get(String)
154 */
155 public static char get(Component c, String propertyName, char defaultValue) {
156 Character obj = (Character) c.get(propertyName);
157 return (obj == null ? defaultValue : obj.charValue());
158 }
159
160 /**
161 * Helper method to get 'double' properties, with a default value.
162 *
163 * @return - the 'double' property or the default value if its null
164 * @see Component#get(String)
165 */
166 public static double get(Component c, String propertyName, double defaultValue) {
167 Double obj = (Double) c.get(propertyName);
168 return (obj == null ? defaultValue : obj.doubleValue());
169 }
170
171 /**
172 * Helper method to get 'float' properties, with a default value.
173 *
174 * @return - the 'float' property or the default value if its null
175 * @see Component#get(String)
176 */
177 public static float get(Component c, String propertyName, float defaultValue) {
178 Float obj = (Float) c.get(propertyName);
179 return (obj == null ? defaultValue : obj.floatValue());
180 }
181
182 /**
183 * Helper method to get 'int' properties, with a default value.
184 *
185 * @return - the 'int' property or the default value if its null
186 * @see Component#get(String)
187 */
188 public static int get(Component c, String propertyName, int defaultValue) {
189 Integer obj = (Integer) c.get(propertyName);
190 return (obj == null ? defaultValue : obj.intValue());
191 }
192
193 /**
194 * Helper method to get 'long' properties, with a default value.
195 *
196 * @return - the 'long' property or the default value if its null
197 * @see Component#get(String)
198 */
199 public static long get(Component c, String propertyName, long defaultValue) {
200 Long obj = (Long) c.get(propertyName);
201 return (obj == null ? defaultValue : obj.longValue());
202 }
203
204 /**
205 * Helper method to get 'short' properties, with a default value.
206 *
207 * @return - the 'short' property or the default value if its null
208 * @see Component#get(String)
209 */
210 public static short get(Component c, String propertyName, short defaultValue) {
211 Short obj = (Short) c.get(propertyName);
212 return (obj == null ? defaultValue : obj.shortValue());
213 }
214
215 /**
216 * Helper method to get 'Object' render properties. Placed there for
217 * completeness since Component.getRenderProperty() does exactly the same
218 * thing.
219 *
220 * @return - the 'Object' render property
221 * @see Component#getRenderProperty(String, Object)
222 */
223 public static Object getRenderProperty(Component c, String propertyName) {
224 return c.getRenderProperty(propertyName);
225 }
226
227 /**
228 * Helper method to get 'boolean' render properties, with a default value.
229 *
230 * @return - the 'boolean' render property or the default value if its null
231 * @see Component#getRenderProperty(String, Object)
232 */
233 public static boolean getRenderProperty(Component c, String propertyName, boolean defaultValue) {
234 Boolean obj = (Boolean) c.getRenderProperty(propertyName);
235 return (obj == null ? defaultValue : obj.booleanValue());
236 }
237
238 /**
239 * Helper method to get 'byte' render properties, with a default value.
240 *
241 * @return - the 'byte' render property or the default value if its null
242 * @see Component#getRenderProperty(String, Object)
243 */
244 public static byte getRenderProperty(Component c, String propertyName, byte defaultValue) {
245 Byte obj = (Byte) c.getRenderProperty(propertyName);
246 return (obj == null ? defaultValue : obj.byteValue());
247 }
248
249 /**
250 * Helper method to get 'char' render properties, with a default value.
251 *
252 * @return - the 'char' render property or the default value if its null
253 * @see Component#getRenderProperty(String, Object)
254 */
255 public static char getRenderProperty(Component c, String propertyName, char defaultValue) {
256 Character obj = (Character) c.getRenderProperty(propertyName);
257 return (obj == null ? defaultValue : obj.charValue());
258 }
259
260 /**
261 * Helper method to get 'double' render properties, with a default value.
262 *
263 * @return - the 'double' render property or the default value if its null
264 * @see Component#getRenderProperty(String, Object)
265 */
266 public static double getRenderProperty(Component c, String propertyName, double defaultValue) {
267 Double obj = (Double) c.getRenderProperty(propertyName);
268 return (obj == null ? defaultValue : obj.doubleValue());
269 }
270
271 /**
272 * Helper method to get 'float' render properties, with a default value.
273 *
274 * @return - the 'float' render property or the default value if its null
275 * @see Component#getRenderProperty(String, Object)
276 */
277 public static float getRenderProperty(Component c, String propertyName, float defaultValue) {
278 Float obj = (Float) c.getRenderProperty(propertyName);
279 return (obj == null ? defaultValue : obj.floatValue());
280 }
281
282 /**
283 * Helper method to get 'int' render properties, with a default value.
284 *
285 * @return - the 'int' render property or the default value if its null
286 * @see Component#getRenderProperty(String, Object)
287 */
288 public static int getRenderProperty(Component c, String propertyName, int defaultValue) {
289 Integer obj = (Integer) c.getRenderProperty(propertyName);
290 return (obj == null ? defaultValue : obj.intValue());
291 }
292
293 /**
294 * Helper method to get 'long' render properties, with a default value.
295 *
296 * @return - the 'long' render property or the default value if its null
297 * @see Component#getRenderProperty(String, Object)
298 */
299 public static long getRenderProperty(Component c, String propertyName, long defaultValue) {
300 Long obj = (Long) c.getRenderProperty(propertyName);
301 return (obj == null ? defaultValue : obj.longValue());
302 }
303
304 /**
305 * Helper method to get 'Object' render properties. Placed there for
306 * completeness since Component.getRenderProperty() does exactly the same
307 * thing.
308 *
309 * @return - the 'Object' render property
310 * @see Component#getRenderProperty(String, Object)
311 */
312 public static Object getRenderProperty(Component c, String propertyName, Object defaultValue) {
313 return c.getRenderProperty(propertyName, defaultValue);
314 }
315
316 /**
317 * Helper method to get 'short' render properties, with a default value.
318 *
319 * @return - the 'short' render property or the default value if its null
320 * @see Component#getRenderProperty(String, Object)
321 */
322 public static short getRenderProperty(Component c, String propertyName, short defaultValue) {
323 Short obj = (Short) c.getRenderProperty(propertyName);
324 return (obj == null ? defaultValue : obj.shortValue());
325 }
326
327 /**
328 * Helper method to set 'boolean' property values
329 *
330 * @see Component#set(String, Object)
331 */
332 public static void set(Component c, String propertyName, boolean newValue) {
333 c.set(propertyName, newValue ? Boolean.TRUE : Boolean.FALSE);
334 }
335
336 /**
337 * Helper method to set 'byte' property values
338 *
339 * @see Component#set(String, Object)
340 */
341 public static void set(Component c, String propertyName, byte newValue) {
342 c.set(propertyName, new Byte(newValue));
343 }
344
345 /**
346 * Helper method to set 'char' property values
347 *
348 * @see Component#set(String, Object)
349 */
350 public static void set(Component c, String propertyName, char newValue) {
351 c.set(propertyName, new Character(newValue));
352 }
353
354 /**
355 * Helper method to set 'double' property values
356 *
357 * @see Component#set(String, Object)
358 */
359 public static void set(Component c, String propertyName, double newValue) {
360 c.set(propertyName, new Double(newValue));
361 }
362
363 /**
364 * Helper method to set 'float' property values
365 *
366 * @see Component#set(String, Object)
367 */
368 public static void set(Component c, String propertyName, float newValue) {
369 c.set(propertyName, new Float(newValue));
370 }
371
372 /**
373 * Helper method to set 'int' property values
374 *
375 * @see Component#set(String, Object)
376 */
377 public static void set(Component c, String propertyName, int newValue) {
378 c.set(propertyName, new Integer(newValue));
379 }
380
381 /**
382 * Helper method to set 'long' property values
383 *
384 * @see Component#set(String, Object)
385 */
386 public static void set(Component c, String propertyName, long newValue) {
387 c.set(propertyName, new Long(newValue));
388 }
389
390 /**
391 * Helper method to set 'Object' property values
392 *
393 * @see Component#set(String, Object)
394 */
395 public static void set(Component c, String propertyName, Object newValue) {
396 c.set(propertyName, newValue);
397 }
398
399 /**
400 * Helper method to set 'short' property values
401 *
402 * @see Component#set(String, Object)
403 */
404 public static void set(Component c, String propertyName, short newValue) {
405 c.set(propertyName, new Short(newValue));
406 }
407
408 private Map attributeMap;
409
410 /**
411 * @see echopoint.able.Attributeable#getAttribute(java.lang.String)
412 */
413 public Object getAttribute(String attributeName) {
414 if (attributeMap != null) {
415 return attributeMap.get(attributeName);
416 }
417 return null;
418 }
419
420 /**
421 * @see echopoint.able.Attributeable#getAttributeNames()
422 */
423 public String[] getAttributeNames() {
424 if (attributeMap == null) {
425 return new String[0];
426 }
427 int count = 0;
428 String[] attributeNames = new String[attributeMap.keySet().size()];
429 for (Iterator iter = attributeMap.keySet().iterator(); iter.hasNext();) {
430 attributeNames[count++] = (String) iter.next();
431 }
432 return attributeNames;
433 }
434
435 /**
436 * Helper method to get 'boolean' properties, with a default value.
437 *
438 * @return - the 'boolean' property or the default value if its null
439 * @see Component#get(String)
440 */
441 public boolean get(String propertyName, boolean defaultValue) {
442 Boolean obj = (Boolean) super.get(propertyName);
443 return (obj == null ? defaultValue : obj.booleanValue());
444 }
445
446 /**
447 * Helper method to get 'byte' properties, with a default value.
448 *
449 * @return - the 'byte' property or the default value if its null
450 * @see Component#get(String)
451 */
452 public byte get(String propertyName, byte defaultValue) {
453 Byte obj = (Byte) super.get(propertyName);
454 return (obj == null ? defaultValue : obj.byteValue());
455 }
456
457 /**
458 * Helper method to get 'char' properties, with a default value.
459 *
460 * @return - the 'char' property or the default value if its null
461 * @see Component#get(String)
462 */
463 public char get(String propertyName, char defaultValue) {
464 Character obj = (Character) super.get(propertyName);
465 return (obj == null ? defaultValue : obj.charValue());
466 }
467
468 /**
469 * Helper method to get 'double' properties, with a default value.
470 *
471 * @return - the 'double' property or the default value if its null
472 * @see Component#get(String)
473 */
474 public double get(String propertyName, double defaultValue) {
475 Double obj = (Double) super.get(propertyName);
476 return (obj == null ? defaultValue : obj.doubleValue());
477 }
478
479 /**
480 * Helper method to get 'float' properties, with a default value.
481 *
482 * @return - the 'float' property or the default value if its null
483 * @see Component#get(String)
484 */
485 public float get(String propertyName, float defaultValue) {
486 Float obj = (Float) super.get(propertyName);
487 return (obj == null ? defaultValue : obj.floatValue());
488 }
489
490 /**
491 * Helper method to get 'int' properties, with a default value.
492 *
493 * @return - the 'int' property or the default value if its null
494 * @see Component#get(String)
495 */
496 public int get(String propertyName, int defaultValue) {
497 Integer obj = (Integer) super.get(propertyName);
498 return (obj == null ? defaultValue : obj.intValue());
499 }
500
501 /**
502 * Helper method to get 'long' properties, with a default value.
503 *
504 * @return - the 'long' property or the default value if its null
505 * @see Component#get(String)
506 */
507 public long get(String propertyName, long defaultValue) {
508 Long obj = (Long) super.get(propertyName);
509 return (obj == null ? defaultValue : obj.longValue());
510 }
511
512 /**
513 * Helper method to get 'short' properties, with a default value.
514 *
515 * @return - the 'short' property or the default value if its null
516 * @see Component#get(String)
517 */
518 public short get(String propertyName, short defaultValue) {
519 Short obj = (Short) super.get(propertyName);
520 return (obj == null ? defaultValue : obj.shortValue());
521 }
522
523 /**
524 * Helper method to get 'boolean' render properties, with a default value.
525 *
526 * @return - the 'boolean' render property or the default value if its null
527 * @see Component#getRenderProperty(String, Object)
528 */
529 public boolean getRenderProperty(String propertyName, boolean defaultValue) {
530 Boolean obj = (Boolean) super.getRenderProperty(propertyName);
531 return (obj == null ? defaultValue : obj.booleanValue());
532 }
533
534 /**
535 * Helper method to get 'byte' render properties, with a default value.
536 *
537 * @return - the 'byte' render property or the default value if its null
538 * @see Component#getRenderProperty(String, Object)
539 */
540 public byte getRenderProperty(String propertyName, byte defaultValue) {
541 Byte obj = (Byte) super.getRenderProperty(propertyName);
542 return (obj == null ? defaultValue : obj.byteValue());
543 }
544
545 /**
546 * Helper method to get 'char' render properties, with a default value.
547 *
548 * @return - the 'char' render property or the default value if its null
549 * @see Component#getRenderProperty(String, Object)
550 */
551 public char getRenderProperty(String propertyName, char defaultValue) {
552 Character obj = (Character) super.getRenderProperty(propertyName);
553 return (obj == null ? defaultValue : obj.charValue());
554 }
555
556 /**
557 * Helper method to get 'double' render properties, with a default value.
558 *
559 * @return - the 'double' render property or the default value if its null
560 * @see Component#getRenderProperty(String, Object)
561 */
562 public double getRenderProperty(String propertyName, double defaultValue) {
563 Double obj = (Double) super.getRenderProperty(propertyName);
564 return (obj == null ? defaultValue : obj.doubleValue());
565 }
566
567 /**
568 * Helper method to get 'float' render properties, with a default value.
569 *
570 * @return - the 'float' render property or the default value if its null
571 * @see Component#getRenderProperty(String, Object)
572 */
573 public float getRenderProperty(String propertyName, float defaultValue) {
574 Float obj = (Float) super.getRenderProperty(propertyName);
575 return (obj == null ? defaultValue : obj.floatValue());
576 }
577
578 /**
579 * Helper method to get 'int' render properties, with a default value.
580 *
581 * @return - the 'int' render property or the default value if its null
582 * @see Component#getRenderProperty(String, Object)
583 */
584 public int getRenderProperty(String propertyName, int defaultValue) {
585 Integer obj = (Integer) super.getRenderProperty(propertyName);
586 return (obj == null ? defaultValue : obj.intValue());
587 }
588
589 /**
590 * Helper method to get 'long' render properties, with a default value.
591 *
592 * @return - the 'long' render property or the default value if its null
593 * @see Component#getRenderProperty(String, Object)
594 */
595 public long getRenderProperty(String propertyName, long defaultValue) {
596 Long obj = (Long) super.getRenderProperty(propertyName);
597 return (obj == null ? defaultValue : obj.longValue());
598 }
599
600 /**
601 * Helper method to get 'short' render properties, with a default value.
602 *
603 * @return - the 'short' render property or the default value if its null
604 * @see Component#getRenderProperty(String, Object)
605 */
606 public short getRenderProperty(String propertyName, short defaultValue) {
607 Short obj = (Short) super.getRenderProperty(propertyName);
608 return (obj == null ? defaultValue : obj.shortValue());
609 }
610
611 /**
612 * @see echopoint.able.Attributeable#setAttribute(java.lang.String,
613 * java.lang.Object)
614 */
615 public void setAttribute(String attributeName, Object attributeValue) {
616 if (attributeMap == null) {
617 attributeMap = new HashMap();
618 }
619 attributeMap.put(attributeName, attributeValue);
620 }
621
622 /**
623 * Helper method to set 'boolean' property values
624 *
625 * @see Component#set(String, Object)
626 */
627 public void set(String propertyName, boolean newValue) {
628 super.set(propertyName, Boolean.valueOf(newValue));
629 }
630
631 /**
632 * Helper method to set 'byte' property values
633 *
634 * @see Component#set(String, Object)
635 */
636 public void set(String propertyName, byte newValue) {
637 super.set(propertyName, new Byte(newValue));
638 }
639
640 /**
641 * Helper method to set 'char' property values
642 *
643 * @see Component#set(String, Object)
644 */
645 public void set(String propertyName, char newValue) {
646 super.set(propertyName, new Character(newValue));
647 }
648
649 /**
650 * Helper method to set 'double' property values
651 *
652 * @see Component#set(String, Object)
653 */
654 public void set(String propertyName, double newValue) {
655 super.set(propertyName, new Double(newValue));
656 }
657
658 /**
659 * Helper method to set 'float' property values
660 *
661 * @see Component#set(String, Object)
662 */
663 public void set(String propertyName, float newValue) {
664 super.set(propertyName, new Float(newValue));
665 }
666
667 /**
668 * Helper method to set 'int' property values
669 *
670 * @see Component#set(String, Object)
671 */
672 public void set(String propertyName, int newValue) {
673 super.set(propertyName, new Integer(newValue));
674 }
675
676 /**
677 * Helper method to set 'long' property values
678 *
679 * @see Component#set(String, Object)
680 */
681 public void set(String propertyName, long newValue) {
682 super.set(propertyName, new Long(newValue));
683 }
684
685 /**
686 * Helper method to set 'short' property values
687 *
688 * @see Component#set(String, Object)
689 */
690 public void set(String propertyName, short newValue) {
691 super.set(propertyName, new Short(newValue));
692 }
693
694 }