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;
017
018import java.util.Iterator;
019
020import com.github.gwtbootstrap.client.ui.base.HasIcon;
021import com.github.gwtbootstrap.client.ui.base.HasStyle;
022import com.github.gwtbootstrap.client.ui.base.IsResponsive;
023import com.github.gwtbootstrap.client.ui.base.Style;
024import com.github.gwtbootstrap.client.ui.constants.Device;
025import com.github.gwtbootstrap.client.ui.constants.IconSize;
026import com.github.gwtbootstrap.client.ui.constants.IconType;
027import com.google.gwt.event.dom.client.ClickHandler;
028import com.google.gwt.event.dom.client.HasClickHandlers;
029import com.google.gwt.event.shared.GwtEvent;
030import com.google.gwt.event.shared.HandlerRegistration;
031import com.google.gwt.uibinder.client.UiChild;
032import com.google.gwt.user.client.DOM;
033import com.google.gwt.user.client.ui.HasWidgets;
034import com.google.gwt.user.client.ui.IsWidget;
035import com.google.gwt.user.client.ui.Widget;
036
037/**
038 * The tab widget for {@link TabPanel}.
039 * 
040 * <p>
041 * It's for UiBinder.
042 * Tab class provide easy syntax on UiBinder.
043 * </p>
044 * Example:
045 * <pre>
046 * {@code
047 * <b:TabPanel>
048 *  <b:Tab heading="Typically">
049 *    <b:Heading size="3">Typically Tab</b:Heading>
050 *    <b:Paragraph>
051 *        huhuhu hahha
052 *    </b:Paragraph>
053 *  </b:Tab>
054 *  <b:Tab heading="Custom">
055 *    <b:customTab>
056 *      <b:Image resources="{res.logo}"/>
057 *    </b:customTab>
058 *    <b:Heading size="3">CustomTab Tab</b:Heading>
059 *  </b:Tab>
060 * </b:TabPanel>
061 * }
062 * </pre>
063 * }
064 * 
065 * </pre>
066 * @since 2.0.4.0
067 * @author ohashi keisuke
068 */
069public class Tab implements IsWidget, HasWidgets, HasClickHandlers, HasStyle, IsResponsive,HasIcon {
070    
071    TabLink link = new TabLink();
072
073    /**
074     * Create tmpy tab
075     */
076    public Tab() {
077        TabPane tabPane = new TabPane();
078        
079        tabPane.setHref(DOM.createUniqueId());
080        
081        link.setTablePane(tabPane);
082    }
083    
084    /**
085     * Tab as a TabLink
086     */
087    @Override
088    public Widget asWidget() {
089        return link;
090    }
091    
092    /**
093     * Get Container TabPane
094     * @return TabPane
095     */
096    protected TabPane getTabPane() {
097        return link.getTabPane();
098    }
099    
100    /**
101     * Return TabLink
102     * @return tabLink
103     */
104    public TabLink asTabLink() {
105        return link;
106    }
107    
108    /**
109     * Set tab active
110     * @param active
111     */
112    public void setActive(boolean active) {
113        link.setActive(active);
114    }
115    
116    /**
117     * has active style name
118     * @return true:active false:deactive
119     */
120    public boolean isActive() {
121        return link.isActive();
122    }
123    
124    /**
125     * Set tab text
126     * @param text tab text
127     */
128    public void setHeading(String text) {
129        link.setText(text);
130    }
131    
132    /**
133     * Get Tab text
134     * @return tab text
135     */
136    public String getHeading() {
137        return link.getText();
138    }
139    
140    /**
141     * Add widget to tab pane.
142     */
143    @Override
144    public void add(Widget w) {
145        link.getTabPane().add(w);
146    }
147
148    /**
149     * Clear tab pane children
150     */
151    @Override
152    public void clear() {
153        link.getTabPane().clear();
154    }
155
156    /**
157     * call {@link TabPane#iterator()}
158     */
159    @Override
160    public Iterator<Widget> iterator() {
161        return link.getTabPane().iterator();
162    }
163
164    /**
165     * call {@link TabPane#remove(Widget)}
166     * 
167     * @return {@link TabPane#remove(Widget)} result
168     */
169    @Override
170    public boolean remove(Widget w) {
171        return link.getTabPane().remove(w);
172    }
173
174    /**
175     * add ClickEventHandler to TabLink
176     * {@inheritDoc}
177     */
178    @Override
179    public HandlerRegistration addClickHandler(ClickHandler handler) {
180        return link.addClickHandler(handler);
181    }
182
183    /**
184     * set TabLink icon type.
185     * {@inheritDoc}
186     */
187    @Override
188    public void setIcon(IconType type) {
189        link.setIcon(type);
190    }
191
192    /**
193     * Set TabLink icon size
194     * {@inheritDoc}
195     */
196    @Override
197    public void setIconSize(IconSize size) {
198        link.setIconSize(size);
199    }
200
201    /**
202     * Set TabLink and TabPane show on device.
203     * {@inheritDoc}
204     */
205    @Override
206    public void setShowOn(Device device) {
207        link.setShowOn(device);
208        link.getTabPane().setShowOn(device);
209    }
210
211    /**
212     * Set TabLink and TabPane show on device.
213     * {@inheritDoc}
214     */
215    @Override
216    public void setHideOn(Device device) {
217        link.setHideOn(device);
218        link.getTabPane().setHideOn(device);
219    }
220
221    /**
222     * set TabLink style
223     * {@inheritDoc}
224     */
225    @Override
226    public void setStyle(Style style) {
227        link.setStyle(style);
228    }
229
230    /**
231     * add TabLink style
232     * {@inheritDoc}
233     */
234    @Override
235    public void addStyle(Style style) {
236        link.addStyle(style);
237    }
238
239    /**
240     * remove TabLink style
241     * {@inheritDoc}
242     */
243    @Override
244    public void removeStyle(Style style) {
245        link.removeStyle(style);
246    }
247
248    /**
249     * fire TabLink event
250     * {@inheritDoc}
251     */
252    @Override
253    public void fireEvent(GwtEvent<?> event) {
254        link.fireEvent(event);
255    }
256    
257    @UiChild(limit=1,tagname="customTab")
258    public void addDecorate(Widget w) {
259        link.add(w);
260    }
261
262    /**
263     * {@inheritDoc}
264     */
265    @Override
266    public void setCustomIconStyle(String customIconStyle) {
267        link.setCustomIconStyle(customIconStyle);
268    }
269}