View Javadoc

    1   /*
    2    * $Id: InputTransferSelect.java 502294 2007-02-01 17:28:00Z niallp $
    3    *
    4    * Licensed to the Apache Software Foundation (ASF) under one
    5    * or more contributor license agreements.  See the NOTICE file
    6    * distributed with this work for additional information
    7    * regarding copyright ownership.  The ASF licenses this file
    8    * to you under the Apache License, Version 2.0 (the
    9    * "License"); you may not use this file except in compliance
    10   * with the License.  You may obtain a copy of the License at
    11   *
    12   *  http://www.apache.org/licenses/LICENSE-2.0
    13   *
    14   * Unless required by applicable law or agreed to in writing,
    15   * software distributed under the License is distributed on an
    16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    17   * KIND, either express or implied.  See the License for the
    18   * specific language governing permissions and limitations
    19   * under the License.
    20   */
    21  package org.apache.struts2.components;
    22
    23  import org.apache.struts2.views.annotations.StrutsTag;
    24  import org.apache.struts2.views.annotations.StrutsTagAttribute;
    25  import org.apache.commons.logging.Log;
    26  import org.apache.commons.logging.LogFactory;
    27  import com.opensymphony.xwork2.util.ValueStack;
    28
    29  import javax.servlet.http.HttpServletRequest;
    30  import javax.servlet.http.HttpServletResponse;
    31  import java.util.Map;
    32  import java.util.LinkedHashMap;
    33
    34  /***
    35   * <!-- START SNIPPET: javadoc -->
    36   *
    37   * Create a input transfer select component which is basically an text input
    38   * and  &lt;select ...&gt; tag with buttons in the middle of them allowing text
    39   * to be added to the transfer select. Will auto-select all its
    40   * elements upon its containing form submision.
    41   *
    42   * <!-- END SNIPPET: javadoc -->
    43   *
    44   * <p/>
    45   *
    46   *
    47   * <!-- START SNIPPET: notice -->
    48   *
    49   * NOTE: The id and doubleId need not be supplied as they will generated provided
    50   * that the inputtransferselect tag is being used in a form tag. The generated id
    51   * and doubleId will be &lt;form_id&gt;_&lt;inputtransferselect_doubleName&gt; and
    52   * &lt;form_id&gt;_&lt;inputtransferselect_doubleName&gt; respectively.
    53   *
    54   * <!-- END SNIPPET: notice -->
    55   *
    56   * <p/>
    57   *
    58   * <pre>
    59   * <!-- START SNIPPET: example -->
    60   *
    61   * &lt;-- minimum configuration --&gt;
    62   * &lt;s:inputtransferselect
    63   *      label="Favourite Cartoons Characters"
    64   *      name="cartoons"
    65   *      list="{'Popeye', 'He-Man', 'Spiderman'}"
    66   *  /&gt;
    67   *
    68   * <!-- END SNIPPET: example -->
    69   * </pre>
    70   *
    71   */
    72  @StrutsTag(name="inputtransferselect", tldTagClass="org.apache.struts2.views.jsp.ui.InputTransferSelectTag", description="Renders an input form")
    73  public class InputTransferSelect extends ListUIBean {
    74
    75      private static final Log _log = LogFactory.getLog(InputTransferSelect.class);
    76
    77      private static final String TEMPLATE = "inputtransferselect";
    78
    79      protected String size;
    80      protected String multiple;
    81
    82      protected String allowRemoveAll;
    83      protected String allowUpDown;
    84
    85      protected String leftTitle;
    86      protected String rightTitle;
    87
    88      protected String buttonCssClass;
    89      protected String buttonCssStyle;
    90
    91      protected String addLabel;
    92      protected String removeLabel;
    93      protected String removeAllLabel;
    94      protected String upLabel;
    95      protected String downLabel;
    96
    97      protected String headerKey;
    98      protected String headerValue;
    99
    100
    101     public InputTransferSelect(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
    102         super(stack, request, response);
    103     }
    104
    105     protected String getDefaultTemplate() {
    106         return TEMPLATE;
    107     }
    108
    109
    110     public void evaluateExtraParams() {
    111         super.evaluateExtraParams();
    112
    113         if (size == null || size.trim().length() <= 0) {
    114             addParameter("size", "5");
    115         }
    116
    117         if (multiple == null || multiple.trim().length() <= 0) {
    118             addParameter("multiple", Boolean.TRUE);
    119         }
    120
    121         // allowUpDown
    122         addParameter("allowUpDown", allowUpDown != null ? findValue(allowUpDown, Boolean.class) : Boolean.TRUE);
    123
    124         // allowRemoveAll
    125         addParameter("allowRemoveAll", allowRemoveAll != null ? findValue(allowRemoveAll, Boolean.class) : Boolean.TRUE);
    126
    127
    128         // leftTitle
    129         if (leftTitle != null) {
    130             addParameter("leftTitle", findValue(leftTitle, String.class));
    131         }
    132
    133         // rightTitle
    134         if (rightTitle != null) {
    135             addParameter("rightTitle", findValue(rightTitle, String.class));
    136         }
    137
    138
    139         // buttonCssClass
    140         if (buttonCssClass != null && buttonCssClass.trim().length() > 0) {
    141             addParameter("buttonCssClass", buttonCssClass);
    142         }
    143
    144         // buttonCssStyle
    145         if (buttonCssStyle != null && buttonCssStyle.trim().length() > 0) {
    146             addParameter("buttonCssStyle", buttonCssStyle);
    147         }
    148
    149         // addLabel
    150         addParameter("addLabel", addLabel != null ? findValue(addLabel, String.class) : "->" );
    151
    152         // removeLabel
    153         addParameter("removeLabel", removeLabel != null ? findValue(removeLabel, String.class) : "<-");
    154
    155         // removeAllLabel
    156         addParameter("removeAllLabel", removeAllLabel != null ? findValue(removeAllLabel, String.class) : "<<--");
    157
    158
    159         // upLabel
    160         addParameter("upLabel", upLabel != null ? findValue(upLabel, String.class) : "^");
    161
    162
    163         // leftDownLabel
    164         addParameter("downLabel", downLabel != null ? findValue(downLabel, String.class) : "v");
    165
    166         if ((headerKey != null) && (headerValue != null)) {
    167             addParameter("headerKey", findString(headerKey));
    168             addParameter("headerValue", findString(headerValue));
    169         }
    170
    171
    172
    173         // inform the form component our select tag infos, so they know how to select
    174         // its elements upon onsubmit
    175         Form formAncestor = (Form) findAncestor(Form.class);
    176         if (formAncestor != null) {
    177
    178             // inform ancestor form that we are having a customOnsubmit (see form-close.ftl [simple theme])
    179             enableAncestorFormCustomOnsubmit();
    180
    181
    182             // key -> select tag id, value -> headerKey (if exists)
    183             Map formInputtransferselectIds = (Map) formAncestor.getParameters().get("inputtransferselectIds");
    184
    185             // init lists
    186             if (formInputtransferselectIds == null) {
    187                 formInputtransferselectIds = new LinkedHashMap();
    188             }
    189
    190             // id
    191             String tmpId = (String) getParameters().get("id");
    192             String tmpHeaderKey = (String) getParameters().get("headerKey");
    193             if (tmpId != null && (! formInputtransferselectIds.containsKey(tmpId))) {
    194                 formInputtransferselectIds.put(tmpId, tmpHeaderKey);
    195             }
    196
    197             formAncestor.getParameters().put("inputtransferselectIds", formInputtransferselectIds);
    198
    199         }
    200         else {
    201             _log.warn("form enclosing inputtransferselect "+this+" not found, auto select upon form submit of inputtransferselect will not work");
    202         }
    203     }
    204
    205     public String getSize() {
    206         return size;
    207     }
    208
    209     @StrutsTagAttribute(description="the size of the select box")
    210     public void setSize(String size) {
    211         this.size = size;
    212     }
    213
    214     public String getMultiple() {
    215         return multiple;
    216     }
    217
    218     @StrutsTagAttribute(description="Determine whether or not multiple entries are shown")
    219     public void setMultiple(String multiple) {
    220         this.multiple = multiple;
    221     }
    222
    223     public String getAllowRemoveAll() {
    224         return allowRemoveAll;
    225     }
    226
    227     @StrutsTagAttribute(description="Determine whether the remove all button will display")
    228     public void setAllowRemoveAll(String allowRemoveAll) {
    229         this.allowRemoveAll = allowRemoveAll;
    230     }
    231
    232     public String getAllowUpDown() {
    233         return allowUpDown;
    234     }
    235
    236     @StrutsTagAttribute(description="Determine whether items in the list can be reordered")
    237     public void setAllowUpDown(String allowUpDown) {
    238         this.allowUpDown = allowUpDown;
    239     }
    240
    241     public String getLeftTitle() {
    242         return leftTitle;
    243     }
    244
    245     @StrutsTagAttribute(description="the left hand title")
    246     public void setLeftTitle(String leftTitle) {
    247         this.leftTitle = leftTitle;
    248     }
    249
    250     public String getRightTitle() {
    251         return rightTitle;
    252     }
    253
    254     @StrutsTagAttribute(description="the right hand title")
    255     public void setRightTitle(String rightTitle) {
    256         this.rightTitle = rightTitle;
    257     }
    258
    259     public String getButtonCssClass() {
    260         return buttonCssClass;
    261     }
    262
    263     @StrutsTagAttribute(description="the css class used for rendering buttons")
    264     public void setButtonCssClass(String buttonCssClass) {
    265         this.buttonCssClass = buttonCssClass;
    266     }
    267
    268     public String getButtonCssStyle() {
    269         return buttonCssStyle;
    270     }
    271
    272     @StrutsTagAttribute(description="the css style used for rendering buttons")
    273     public void setButtonCssStyle(String buttonCssStyle) {
    274         this.buttonCssStyle = buttonCssStyle;
    275     }
    276
    277     public String getAddLabel() {
    278         return addLabel;
    279     }
    280
    281     @StrutsTagAttribute(description="the label used for the add button")
    282     public void setAddLabel(String addLabel) {
    283         this.addLabel = addLabel;
    284     }
    285
    286     public String getRemoveLabel() {
    287         return removeLabel;
    288     }
    289
    290     @StrutsTagAttribute(description="the label used for the remove button")
    291     public void setRemoveLabel(String removeLabel) {
    292         this.removeLabel = removeLabel;
    293     }
    294
    295     public String getRemoveAllLabel() {
    296         return removeAllLabel;
    297     }
    298
    299     @StrutsTagAttribute(description="the label used for the remove all button")
    300     public void setRemoveAllLabel(String removeAllLabel) {
    301         this.removeAllLabel = removeAllLabel;
    302     }
    303
    304     public String getUpLabel() {
    305         return upLabel;
    306     }
    307
    308     @StrutsTagAttribute(description="the label used for the up button")
    309     public void setUpLabel(String upLabel) {
    310         this.upLabel = upLabel;
    311     }
    312
    313     public String getDownLabel() {
    314         return downLabel;
    315     }
    316
    317     @StrutsTagAttribute(description="the label used for the down button")
    318     public void setDownLabel(String downLabel) {
    319         this.downLabel = downLabel;
    320     }
    321
    322     public String getHeaderKey() {
    323         return headerKey;
    324     }
    325
    326     @StrutsTagAttribute(description="the header key of the select box")
    327     public void setHeaderKey(String headerKey) {
    328         this.headerKey = headerKey;
    329     }
    330
    331     public String getHeaderValue() {
    332         return headerValue;
    333     }
    334
    335     @StrutsTagAttribute(description="the header value of the select box")
    336     public void setHeaderValue(String headerValue) {
    337         this.headerValue = headerValue;
    338     }
    339 }