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    }