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 }