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 */
016package com.github.gwtbootstrap.client.ui.base;
017
018import com.github.gwtbootstrap.client.ui.Icon;
019import com.github.gwtbootstrap.client.ui.InputAddOn;
020import com.github.gwtbootstrap.client.ui.constants.Constants;
021import com.github.gwtbootstrap.client.ui.constants.IconSize;
022import com.github.gwtbootstrap.client.ui.constants.IconType;
023import com.google.gwt.uibinder.client.UiChild;
024import com.google.gwt.user.client.ui.HasText;
025import com.google.gwt.user.client.ui.IsWidget;
026
027/**
028 * Input add-on.
029 * <p>
030 * AddOn can set text or icon.
031 * <h3>UiBinder Usage:</h3>
032 * 
033 * <pre>
034 * {@code
035 * <!-- text addon -->
036 * <b:AddOn text="@"/>
037 * 
038 * <!-- text addon another usage -->
039 * <b:AddOn>@</b:AddOn>
040 * 
041 * <!-- icon addon -->
042 * <b:AddOn icon="STAR"/>
043 * 
044 * <!-- widget addon -->
045 * <b:Addon><b:widget><b:CheckBox/></b:widget></b:AddOn>
046 * }
047 * </pre>
048 * 
049 * </p>
050 * 
051 * @since 2.0.4.0
052 * 
053 * @author ohashi keisuke
054 * @see InputAddOn
055 * @see IconType
056 * @see <a
057 *      href="http://twitter.github.com/bootstrap/base-css.html#forms">Bootstrap
058 *      Docs</a>
059 */
060public class AddOn extends ComplexWidget implements HasText, HasIcon {
061
062    /** text */
063    private String text;
064
065    /** icon */
066    private Icon icon = new Icon();
067
068    /**
069     * Creates an empty widget.
070     */
071    public AddOn() {
072        super("span");
073        setStyleName(Constants.ADD_ON);
074    }
075
076    /**
077     * {@inheritDoc}
078     */
079    public String getText() {
080        return getElement().getInnerText();
081    }
082
083    /**
084     * {@inheritDoc}
085     */
086    public void setText(String text) {
087        this.text = text;
088
089        if (icon.isAttached()) {
090            icon.removeFromParent();
091        }
092        getElement().setInnerText(text);
093    }
094
095    /**
096     * {@inheritDoc}
097     */
098    public void setIcon(IconType iconType) {
099
100        if (text != null) {
101            getElement().setInnerHTML("");
102        }
103
104        icon.setType(iconType);
105
106        if (!icon.isAttached()) {
107            add(icon);
108        }
109    }
110
111    /**
112     * {@inheritDoc}
113     */
114    @Override
115    public void setIconSize(IconSize size) {
116        icon.setIconSize(size);
117    }
118
119    /**
120     * Add widget. Its method is for uibinder syntax.
121     * 
122     * @param w
123     *            added widget
124     */
125    @UiChild(tagname = "widget", limit = 1)
126    public void addWidget(IsWidget w) {
127        add(w);
128    }
129
130    /**
131     * {@inheritDoc}
132     */
133    @Override
134    public void setCustomIconStyle(String customIconStyle) {
135        icon.addStyleName(customIconStyle);
136    }
137
138}