View Javadoc

1   // ========================================================================
2   // $Id: TableForm.java,v 1.6 2004/05/09 20:31:28 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.Writer;
19  import java.util.Enumeration;
20  
21  // =======================================================================
22  /** A form laid out in a Table.
23   * <p> This class creates a form and lays out all the elements within a
24   * table. Each element added has a label part and a element part. The label
25   * is displayed in the form beside the element. All buttons are shown at the
26   * bottom.
27   */
28  public class TableForm extends Form
29  {
30  
31      /* ----------------------------------------------------------- */
32      private Table table = null;
33      private Table column = null;
34      private int columns = 1;
35      private Composite hidden = new Composite();
36      private Composite buttons = null;
37      private Composite bottomButtons = null;
38      private String fieldAttributes = null;
39      private boolean extendRow = false;
40      
41      /* ----------------------------------------------------------- */
42      /** Create a new TableForm.
43       * @param target The target url to send the form contents to
44       */
45      public TableForm(String target)
46      {
47          super(target);
48          newTable();
49          super.add(hidden);
50      }
51  
52      /* ----------------------------------------------------------- */
53      /** Add an informational section.
54       */
55      public void addText(String label,
56                          String value)
57      {
58          Composite c = new Composite();
59          c.add(value);
60          addField(label,c);
61      }
62  
63      /* ----------------------------------------------------------- */
64      /** Add a Text Entry Field.
65       * @param tag The form name of the element
66       * @param label The label for the element in the table.
67       */
68      public Input addTextField(String tag, 
69                                String label,
70                                int length,
71                                String value)
72      {
73          Input i = new Input(Input.Text,tag,value);
74          i.setSize(length);
75          addField(label,i);
76          return i;
77      }
78  
79      /* ----------------------------------------------------------- */
80      /** Add a Text Area.
81       * @param tag The form name of the element
82       * @param label The label for the element in the table.
83       */
84      public TextArea addTextArea(String tag, 
85                                  String label,
86                                  int width,
87                                  int height,
88                                  String value)
89      {
90          TextArea ta = new TextArea(tag,value);
91          ta.setSize(width,height);
92          addField(label,ta);
93          return ta;
94      }
95  
96      /* ----------------------------------------------------------- */
97      /** Add a File Entry Field.
98       * @param tag The form name of the element
99       * @param label The label for the element in the table.
100      */
101     public Input addFileField(String tag, 
102                               String label)
103     {
104         Input i = new Input(Input.File,tag);
105         addField(label,i);
106         return i;
107     }
108     
109     /* ----------------------------------------------------------- */
110     /** Add an informational field which also passes the data as hidden.
111      * @param tag The form name of the element
112      * @param label The label for the element in the table.
113      */
114     public void addInfoField(String tag, 
115                              String label,
116                              String value)
117     {
118         addText(label,value);
119         addHiddenField(tag,value);
120     }
121 
122     /* ----------------------------------------------------------- */
123     /** Add a hidden field.
124      * @param tag The form name of the element
125      */
126     public void addHiddenField(String tag, 
127                                String value)
128     {
129         Element e = new Input(Input.Hidden,tag,value);
130         hidden.add(e);
131     }
132 
133     /* ----------------------------------------------------------- */
134     /** Add a password field.
135      * @param tag The form name of the element
136      * @param label The label for the element in the table.
137      */
138     public void addPassword(String tag,
139                             String label,
140                             int length)
141     {
142         Input i = new Input(Input.Password,tag);
143         i.setSize(length);
144         addField(label,i);
145     }
146 
147     /* ----------------------------------------------------------- */
148     /**
149      * @param tag The form name of the element
150      * @param label The label for the element in the table.
151      */
152     public void addCheckbox(String tag,
153                             String label,
154                             boolean checked)
155     {
156         Input cb = new Input(Input.Checkbox,tag);
157         addField(label,cb);
158         if (checked)
159             cb.check();
160     }
161 
162     /* ----------------------------------------------------------- */
163     /** Add a Select field.
164      * @param tag The form name of the element
165      * @param label The label for the element in the table.
166      */
167     public Select addSelect(String tag,
168                             String label,
169                             boolean multiple,
170                             int size)
171     {
172         Select s = new Select(tag,multiple);
173         s.setSize(size);
174         addField(label,s);
175         return s;
176     }
177 
178     /* ----------------------------------------------------------- */
179     /** Add a Select field initialised with fields.
180      * @param tag The form name of the element
181      * @param label The label for the element in the table.
182      */
183     public Select addSelect(String tag,
184                             String label,
185                             boolean multiple,
186                             int size,
187                             Enumeration values)
188     {
189         Select s = addSelect(tag,label,multiple,size);
190         s.setSize(size);
191         while (values.hasMoreElements())
192             s.add(values.nextElement().toString());
193         return s;
194     }
195     
196     /* ----------------------------------------------------------- */
197     /* add a new button area.
198      * A button area is a line of a column in a table form where multiple
199      * buttons can be placed.  Subsequent calls to addButton will
200      * add buttons to this area.
201      */
202     public void addButtonArea(String label)
203     {
204         buttons=new Composite();
205         addField(label,buttons);
206     }
207     
208     /* ----------------------------------------------------------- */
209     /* add a new button area.
210      * A button area is a line of a column in a table form where multiple
211      * buttons can be placed.  Subsequent calls to addButton will
212      * add buttons to this area.
213      */
214     public void addButtonArea()
215     {
216         buttons=new Composite();
217         addField(null,buttons);
218     }
219     
220     /* ----------------------------------------------------------- */
221     /* add a new button row.
222      * A button row is a line of a column in a table form where multiple
223      * buttons can be placed, that is aligned with the left hand side of the
224      * TableForm Subsequent calls to addButton will
225      * add buttons to this area.
226      */
227     public void addButtonRow()
228     {
229         buttons=new Composite();
230         
231         if (!extendRow)
232         {
233             column.newRow();
234             column.addCell(buttons).left().middle();
235             column.cell().attribute("colspan","2");
236         }
237         extendRow=false;
238     }
239     
240     /* ----------------------------------------------------------- */
241     /* add a new button area to bottom of multicolumn form.
242      * A button area is a line of a table form where multiple
243      * buttons can be placed. Subsequent calls to addButton will
244      * add buttons to this area.
245      * This is the default if no call is made to newButtonArea.
246      */
247     public void buttonsAtBottom()
248     {
249         if (bottomButtons!=null)
250             buttons=bottomButtons;
251         else
252         {
253             buttons=new Composite();
254             bottomButtons=buttons;
255         }
256     }
257 
258     /* ----------------------------------------------------------- */
259     /** Add a Submit Button.
260      * @param tag The form name of the element
261      * @param label The label for the Button
262      */
263     public Input addButton(String tag,
264                            String label)
265     {
266         if (buttons==null)
267             buttonsAtBottom();
268         Input e = new Input(Input.Submit,tag,label);
269 
270         if (extendRow)
271             addField(null,e);
272         else
273             buttons.add(e);
274         return e;
275     }
276 
277     /* ----------------------------------------------------------- */
278     /** Add a reset button.
279      * @param label The label for the element in the table.
280      */
281     public void addReset(String label)
282     {
283         if (buttons==null)
284             buttonsAtBottom();
285         Element e = new Input(Input.Reset,"Reset",label);
286         if (extendRow)
287             addField(null,e);
288         else
289             buttons.add(e);
290     }
291 
292     // ------------------------------------------------------------
293     /** Use the given attributes on the next addXXX */
294     public void useAttributes(String attr){
295         fieldAttributes = attr;
296     }
297     
298     // ------------------------------------------------------------
299     /** Get the internal table */
300     public Table table(){
301         return column;
302     }
303     
304     // ------------------------------------------------------------
305     /** Get the internal table */
306     public Table outerTable(){
307         return table;
308     }
309 
310     /* ----------------------------------------------------------- */
311     /** Extend the usage of the current row in the form.  The next
312      * element added will be added to the same row as the form and
313      * not have a label of it's own.
314      * @return TableForm, the this pointer so that users can write:<pre>
315      *                    tableForm.extendRow().addField(...)</pre>
316      */
317     public TableForm extendRow()
318     {
319         extendRow=true;
320         return this;
321     }
322 
323     /* ----------------------------------------------------------- */
324     /** Add an arbitrary element to the table.
325      * @param label The label for the element in the table.
326      */
327     public void addField(String label,Element field)
328     {
329         if (label==null)
330             label="&nbsp;";
331         else
332             label="<b>"+label+":</b>";
333 
334         if (extendRow)
335         {
336             column.add(field);
337             extendRow=false;
338         }
339         else
340         {
341             column.newRow();
342             column.addCell(label);
343             column.cell().right();
344         
345             if (fieldAttributes != null)
346             {
347                 column.addCell(field,fieldAttributes);
348                 fieldAttributes = null;
349             }
350             else
351                 column.addCell(field);
352         }
353     }
354     
355     /* ----------------------------------------------------------- */
356     /** Create a new column in the form.
357      */
358     public void addColumn()
359     {
360         column = new Table(0);
361         table.addCell(column).top();
362         columns++;
363     }
364     
365     /* ----------------------------------------------------------- */
366     /** Create a new column in the form.
367      */
368     public void addColumn(int spacing)
369     {
370         table.addCell("&nbsp","width="+spacing);
371         column = new Table(0);
372         table.addCell(column);
373         table.cell().top();
374         columns++;
375     }
376     
377     /* ------------------------------------------------------------ */
378     /** Add a new sections of columns.
379      */
380     public void newColumns()
381     {
382         column = new Table(0);
383         columns = 1;
384         table.newRow();
385         table.addCell(column);
386         table.cell().top();
387     }
388 
389     /* ------------------------------------------------------------ */
390     /** Set the column span of the current column.
391      * This call is needed for forms that have varying numbers
392      * of columns in different sections. NB. and column spacing
393      * counts as a column.
394      * @param span 
395      */
396     public void setColumnSpan(int span)
397     {
398         table.cell().attribute("colspan",""+span);
399     }
400     
401     /* ----------------------------------------------------------- */
402     /** Start using a new Table.
403      * Anything added to the Composite parent of
404      * this object before this is called will be added between the two
405      * tables. */
406     public void newTable()
407     {
408         table = new Table(0);
409         column = new Table(0);
410         columns = 1;
411         super.add(table);
412         table.newRow();
413         table.addCell(column).top();    
414     }
415     
416     /* ----------------------------------------------------------- */
417     public void write(Writer out)
418         throws IOException
419     {
420         if (bottomButtons!=null)
421         {
422             table.newRow();
423             table.addCell(bottomButtons).attribute("colspan",columns);
424         }
425         super.write(out);
426     } 
427 }