1 // ========================================================================
2 // $Id: Element.java,v 1.10 2005/08/13 00:01:23 gregwilkins Exp $
3 // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd.
4 // ------------------------------------------------------------------------
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 // http://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 // ========================================================================
15 
16 package org.mortbay.html;
17 import java.io.IOException;
18 import java.io.OutputStream;
19 import java.io.OutputStreamWriter;
20 import java.io.StringWriter;
21 import java.io.Writer;
22 import java.util.Enumeration;
23 import java.util.Hashtable;
24 
25 import org.mortbay.log.Log;
26 
27 
28 /* -------------------------------------------------------------------- */
29 /** HTML Element.
30  * <p>This abstract class is the base for all HTML Elements.
31  * The feature of an abstract HTML Element is that it can be added to
32  * HTML Pages, HTML Composites and several other HTML Elements derivations.
33  * Elements may also have attributes set, which are handled by the derived
34  * Element.
35  * @deprecated Unless somebody steps forward to update and maintain this package
36  * @see Page
37  * @see Composite
38  * @version $Id: Element.java,v 1.10 2005/08/13 00:01:23 gregwilkins Exp $
39  * @author Greg Wilkins
40 */
41 public abstract class Element
42 {
43 
44     /* ----------------------------------------------------------------- */
45     public static final String
46         noAttributes="",
47         ALIGN="align",
48         LEFT="left",
49         RIGHT="right",
50         CENTER="center",
51         VALIGN="valign",
52         TOP="top",
53         BOTTOM="bottom",
54         MIDDLE="middle",
55         WIDTH="width",
56         HEIGHT="height",
57         SIZE="size",
58         COLOR="color",
59         BGCOLOR="bgcolor",
60         STYLE="style",
61         CLASS="class",
62         ID="id";
63 
64 
65 
66     /* ----------------------------------------------------------------- */
67     /** Dimensions >=0 if set*/
68     private int width=-1;
69     private int height=-1;
70     private int size=-1;
71 
72     /* ----------------------------------------------------------------- */
73     /** The space separated string of HTML element attributes.
74      */
75     private String attributes=null;
76     protected Hashtable attributeMap=null;
77 
78     /* ----------------------------------------------------------------- */
79     /** Default constructor.
80      */
Element()81     public Element(){}
82 
83     /* ----------------------------------------------------------------- */
84     /** Construct with attributes.
85      * @param attributes The initial attributes of the element
86      */
Element(String attributes)87     public Element(String attributes)
88     {
89         attribute(attributes);
90     }
91 
92     /* ----------------------------------------------------------------- */
93     /** Write element to a Writer.
94      * This abstract method is called by the Page or other containing
95      * Element to write the HTML for this element. This must be implemented
96      * by the derived Element classes.
97      * @param out Writer to write the element to.
98      */
write(Writer out)99     public abstract void write(Writer out)
100          throws IOException;
101 
102     /* ----------------------------------------------------------------- */
103     /** Write Element to an OutputStream.
104      * Calls print(Writer) and checks errors
105      * Elements that override this method should also override
106      * write(Writer) to avoid infinite recursion.
107      * @param out OutputStream to write the element to.
108      */
write(OutputStream out)109     public void write(OutputStream out)
110          throws IOException
111     {
112         Writer writer = new OutputStreamWriter(out);
113         write(writer);
114         writer.flush();
115     }
116 
117     /* ----------------------------------------------------------------- */
118     /** Write Element to an OutputStream.
119      * Calls print(Writer) and checks errors
120      * Elements that override this method should also override
121      * write(Writer) to avoid infinite recursion.
122      * @param out OutputStream to write the element to.
123      */
write(OutputStream out, String encoding)124     public void write(OutputStream out, String encoding)
125          throws IOException
126     {
127         Writer writer = new OutputStreamWriter(out,encoding);
128         write(writer);
129         writer.flush();
130     }
131 
132     /* ----------------------------------------------------------------- */
attributes()133     public String attributes()
134     {
135         if (attributes==null && attributeMap==null)
136             return noAttributes;
137 
138         StringBuffer buf = new StringBuffer(128);
139         synchronized(buf)
140         {
141             if (attributeMap!=null)
142             {
143                 Enumeration e = attributeMap.keys();
144                 while (e.hasMoreElements())
145                 {
146                     buf.append(' ');
147                     String a = (String)e.nextElement();
148                     buf.append(a);
149                     buf.append('=');
150                     buf.append(attributeMap.get(a).toString());
151                 }
152             }
153 
154             if(attributes!=null && attributes.length()>0)
155             {
156                 if (!attributes.startsWith(" "))
157                     buf.append(' ');
158                 buf.append(attributes);
159             }
160         }
161 
162         return buf.toString();
163     }
164 
165     /* ----------------------------------------------------------------- */
166     /** Add element Attributes.
167      * The attributes are added to the Element attributes (separated with
168      * a space). The attributes are available to the derived class in the
169      * protected member String <I>attributes</I>
170      * @deprecated Use attribute(String).
171      * @param attributes String of HTML attributes to add to the element.
172      * @return This Element so calls can be chained.
173      */
attributes(String attributes)174     public Element attributes(String attributes)
175     {
176         if (attributes==null)
177         {
178             this.attributes=null;
179             return this;
180         }
181 
182         if (attributes==noAttributes)
183             return this;
184 
185         if (this.attributes==null)
186             this.attributes=attributes;
187         else
188             this.attributes += ' '+attributes;
189         return this;
190     }
191 
192     /* ------------------------------------------------------------ */
193     /** Set attributes from another Element.
194      * @param e Element
195      * @return This Element
196      */
setAttributesFrom(Element e)197     public Element setAttributesFrom(Element e)
198     {
199         attributes=e.attributes;
200         attributeMap=(Hashtable)e.attributeMap.clone();
201         return this;
202     }
203 
204 
205     /* ----------------------------------------------------------------- */
206     /** Add element Attributes.
207      * The attributes are added to the Element attributes (separated with
208      * a space). The attributes are available to the derived class in the
209      * protected member String <I>attributes</I>
210      * @param attributes String of HTML attributes to add to the element.
211      * A null attribute clears the current attributes.
212      * @return This Element so calls can be chained.
213      */
attribute(String attributes)214     public Element attribute(String attributes)
215     {
216         if (attributes==null ||
217             this.attributes==null ||
218             this.attributes==noAttributes ||
219             this.attributes.length()==0)
220             this.attributes=attributes;
221         else
222             this.attributes += ' '+attributes;
223         return this;
224     }
225 
226     /* ----------------------------------------------------------------- */
227     /** Add quoted element Attributes and value.
228      * @param attribute String of HTML attribute tag
229      * @param value String value of the attribute to be quoted
230      * @return This Element so calls can be chained.
231      */
attribute(String attribute, Object value)232     public Element attribute(String attribute, Object value)
233     {
234         if (attributeMap==null)
235             attributeMap=new Hashtable(10);
236 
237         if (value!=null)
238         {
239             if (value instanceof String && ((String)value).indexOf('"')!=-1)
240             {
241                 String s=(String)value;
242                 int q=0;
243                 while((q=s.indexOf('"',q))>=0)
244                 {
245                     s=s.substring(0,q)+"&quot;"+s.substring(++q);
246                     q+=6;
247                 }
248                 value=s;
249             }
250 
251             attributeMap.put(attribute,"\""+value+'"');
252         }
253         return this;
254     }
255 
256     /* ----------------------------------------------------------------- */
257     /** Add quoted element Attributes and value.
258      * @param attribute String of HTML attribute tag
259      * @param value String value of the attribute to be quoted
260      * @return This Element so calls can be chained.
261      */
attribute(String attribute, long value)262     public Element attribute(String attribute, long value)
263     {
264         if (attributeMap==null)
265             attributeMap=new Hashtable(10);
266 
267         attributeMap.put(attribute,Long.toString(value));
268         return this;
269     }
270 
271     /* ----------------------------------------------------------------- */
272     /** Convert Element to String.
273      * Uses write() to convert the HTML Element to a string.
274      * @return String of the HTML element
275      */
toString()276     public String toString()
277     {
278         try{
279             StringWriter out = new StringWriter();
280             write(out);
281             out.flush();
282             return out.toString();
283         }
284         catch(IOException e){
285             Log.ignore(e);
286         }
287         return null;
288     }
289 
290     /* ----------------------------------------------------------------- */
291     /** left justify.
292      * Convenience method equivalent to attribute("align","left"). Not
293      * applicable to all Elements.
294      */
left()295     public Element left()
296     {
297         return attribute(ALIGN,LEFT);
298     }
299 
300     /* ----------------------------------------------------------------- */
301     /** right justify.
302      * Convenience method equivalent to attribute("align","right"). Not
303      * applicable to all Elements.
304      */
right()305     public Element right()
306     {
307         return attribute(ALIGN,RIGHT);
308     }
309 
310     /* ----------------------------------------------------------------- */
311     /** Center.
312      * Convenience method equivalent to attribute("align","center"). Not
313      * applicable to all Elements.
314      */
center()315     public Element center()
316     {
317         return attribute(ALIGN,CENTER);
318     }
319 
320     /* ----------------------------------------------------------------- */
321     /** Top align.
322      * Convenience method equivalent to attribute("valign","top"). Not
323      * applicable to all Elements.
324      */
top()325     public Element top()
326     {
327         return attribute(VALIGN,TOP);
328     }
329 
330     /* ----------------------------------------------------------------- */
331     /** Bottom align.
332      * Convenience method equivalent to attribute("valign","bottom"). Not
333      * applicable to all Elements.
334      */
bottom()335     public Element bottom()
336     {
337         return attribute(VALIGN,BOTTOM);
338     }
339 
340     /* ----------------------------------------------------------------- */
341     /** Middle align.
342      * Convenience method equivalent to attribute("valign","middle"). Not
343      * applicable to all Elements.
344      */
middle()345     public Element middle()
346     {
347         return attribute(VALIGN,MIDDLE);
348     }
349 
350     /* ----------------------------------------------------------------- */
351     /** set width.
352      * Convenience method equivalent to attribute("width",w). Not
353      * applicable to all Elements.
354      */
width(int w)355     public Element width(int w)
356     {
357         width=w;
358         return attribute(WIDTH,w);
359     }
360 
361     /* ----------------------------------------------------------------- */
362     /** set width.
363      * Convenience method equivalent to attribute("width",w). Not
364      * applicable to all Elements.
365      */
width(String w)366     public Element width(String w)
367     {
368         width=-1;
369         return attribute(WIDTH,w);
370     }
371 
372     /* ----------------------------------------------------------------- */
width()373     public int width()
374     {
375         return width;
376     }
377 
378     /* ----------------------------------------------------------------- */
379     /** set height.
380      * Convenience method equivalent to attribute("height",h). Not
381      * applicable to all Elements.
382      */
height(int h)383     public Element height(int h)
384     {
385         height=h;
386         return attribute(HEIGHT,h);
387     }
388 
389     /* ----------------------------------------------------------------- */
390     /** set height.
391      * Convenience method equivalent to attribute("height",h). Not
392      * applicable to all Elements.
393      */
height(String h)394     public Element height(String h)
395     {
396         height=-1;
397         return attribute(HEIGHT,h);
398     }
399 
400     /* ----------------------------------------------------------------- */
height()401     public int height()
402     {
403         return height;
404     }
405 
406     /* ----------------------------------------------------------------- */
407     /** set size.
408      * Convenience method equivalent to attribute("size",s). Not
409      * applicable to all Elements.
410      */
size(int s)411     public Element size(int s)
412     {
413         size=s;
414         return attribute(SIZE,s);
415     }
416 
417     /* ----------------------------------------------------------------- */
418     /** set size.
419      * Convenience method equivalent to attribute("size",s). Not
420      * applicable to all Elements.
421      */
size(String s)422     public Element size(String s)
423     {
424         size=-1;
425         return attribute(SIZE,s);
426     }
427 
428     /* ----------------------------------------------------------------- */
size()429     public int size()
430     {
431         return size;
432     }
433 
434     /* ----------------------------------------------------------------- */
435     /** set color.
436      * Convenience method equivalent to attribute("color",color). Not
437      * applicable to all Elements.
438      */
color(String color)439     public Element color(String color)
440     {
441         return attribute(COLOR,color);
442     }
443 
444     /* ----------------------------------------------------------------- */
445     /** set BGCOLOR.
446      * Convenience method equivalent to attribute("bgcolor",color). Not
447      * applicable to all Elements.
448      */
bgColor(String color)449     public Element bgColor(String color)
450     {
451         return attribute(BGCOLOR,color);
452     }
453 
454     /* ----------------------------------------------------------------- */
455     /** set CSS CLASS.
456      */
cssClass(String c)457     public Element cssClass(String c)
458     {
459         return attribute(CLASS,c);
460     }
461 
462     /* ----------------------------------------------------------------- */
463     /** set CSS ID.
464      * Convenience method equivalent to attribute("id",id).
465      */
cssID(String id)466     public Element cssID(String id)
467     {
468         return attribute(ID,id);
469     }
470 
471     /* ----------------------------------------------------------------- */
472     /** set Style.
473      * Convenience method equivalent to attribute("style",style).
474      */
style(String style)475     public Element style(String style)
476     {
477         return attribute(STYLE,style);
478     }
479 }
480 
481 
482 
483 
484