001    /*
002     *  Copyright 2012 GWT-Bootstrap
003     *
004     *  Licensed under the Apache License, Version 2.0 (the "License");
005     *  you may not use this file except in compliance with the License.
006     *  You may obtain a copy of the License at
007     *
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     *
010     *  Unless required by applicable law or agreed to in writing, software
011     *  distributed under the License is distributed on an "AS IS" BASIS,
012     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     *  See the License for the specific language governing permissions and
014     *  limitations under the License.
015     */
016    package com.github.gwtbootstrap.client.ui;
017    
018    import com.github.gwtbootstrap.client.ui.base.AddOn;
019    import com.github.gwtbootstrap.client.ui.base.DivWidget;
020    import com.github.gwtbootstrap.client.ui.constants.IconType;
021    import com.google.gwt.uibinder.client.UiChild;
022    import com.google.gwt.user.client.ui.IsWidget;
023    
024    /**
025     * append/prepend {@link AddOn} for input tags.
026     * <p>
027     * If you want to append/prepend add-on,<br/>
028     * Set appendText/prependText or appendIcon/prependIcon attribute.
029     * 
030     * <h3>UiBinder Usage:</h3>
031     * 
032     * <pre>
033     * {@code
034     * <!-- append text -->
035     * <b:InputAddOn appendText="@">
036     *   <g:TextBox/>
037     * </b:InputAddOn>
038     * 
039     * <!-- above setting is same as blow -->
040     * <div class="input-append">
041     *   <span class="add-on">@</span><input type="text">
042     * </div>
043     * 
044     * 
045     * <!-- prepend text-->
046     * <b:InputAddOn prependText="@">
047     *   <g:TextBox/>
048     * </b:InputAddOn>
049     * 
050     * <!-- above setting is same as blow -->
051     * <div class="input-prepend">
052     *   <input type="text"><span class="add-on">@</span>
053     * </div>
054     * 
055     * <!-- append icon and prepend text-->
056     * <b:InputAddOn appendIcon="STAR" prependText="@">
057     *   <g:TextBox/>
058     * </b:InputAddOn>
059     * 
060     * <!-- above setting is same as blow -->
061     * <div class="input-append input-prepend">
062     *   <span class="add-on"><i class="icon-star"></i></span><input type="text"><span class="add-on">@</span>
063     * </div>
064     * }
065     * </pre>
066     * 
067     * </p>
068     * 
069     * @since 2.0.4.0
070     * 
071     * @author ohashi keisuke
072     * @see AddOn
073     * @see http://twitter.github.com/bootstrap/base-css.html#forms
074     */
075    public class InputAddOn extends DivWidget {
076    
077        /** prepend add-on */
078        private AddOn prependAddOn = new AddOn();
079    
080        /** append-add-on */
081        private AddOn appendAddOn = new AddOn();
082    
083        /** set append add-on */
084        private boolean append = false;
085    
086        /**
087         * Creates an empty widget.
088         */
089        public InputAddOn() {
090            super();
091        }
092    
093        /**
094         * set prepend text
095         * 
096         * @param prependText
097         *            prepend text
098         */
099        public void setPrependText(String prependText) {
100            setPrependStyle();
101    
102            prependAddOn.setText(prependText);
103        }
104    
105        /**
106         * set prepend icon
107         * 
108         * @param prependIcon
109         *            IconType
110         */
111        public void setPrependIcon(IconType prependIcon) {
112            setPrependStyle();
113    
114            prependAddOn.setIcon(prependIcon);
115        }
116    
117        private void setPrependStyle() {
118            this.setStyleName("input-prepend", true);
119            if (!prependAddOn.isAttached()) {
120                insert(prependAddOn, 0);
121            }
122        }
123    
124        /**
125         * set append text
126         * 
127         * @param appendText
128         *            append text
129         */
130        public void setAppendText(String appendText) {
131            setAppendStyle();
132    
133            appendAddOn.setText(appendText);
134        }
135    
136        /**
137         * set append icon
138         * 
139         * @param appendIcon
140         *            append icon
141         */
142        public void setAppendIcon(IconType appendIcon) {
143            setAppendStyle();
144    
145            appendAddOn.setIcon(appendIcon);
146        }
147    
148        private void setAppendStyle() {
149            this.setStyleName("input-append", true);
150            append = true;
151    
152            if (isAttached() && !appendAddOn.isAttached()) {
153                add(appendAddOn);
154            }
155    
156        }
157    
158        /**
159         * Add prepend widget. its method is for uibinder syntax.
160         * @param w Addred widget to prepend addon.
161         */
162        @UiChild(limit = 1, tagname = "prependWidget")
163        public void addPrependWidget(IsWidget w) {
164            setPrependStyle();
165            prependAddOn.addWidget(w);
166        }
167        
168        /**
169         * Add append widget. its method is for uibinder syntax.
170         * @param w Addred widget to append addon.
171         */
172        @UiChild(limit = 1, tagname = "appendWidget")
173        public void addAppendWidget(IsWidget w) {
174            setAppendStyle();
175            appendAddOn.addWidget(w);
176        }
177        
178    
179        /**
180         * {@inheritDoc}
181         */
182        @Override
183        protected void onLoad() {
184    
185            // if setup append add-on and it is not attached,add as last child.
186            if (append && !appendAddOn.isAttached()) {
187                add(appendAddOn);
188            }
189            super.onLoad();
190        }
191    
192    }