001package com.github.gwtbootstrap.client.ui;
002
003import com.github.gwtbootstrap.client.ui.base.DivWidget;
004import com.github.gwtbootstrap.client.ui.base.HasIcon;
005import com.github.gwtbootstrap.client.ui.base.HasVisibility;
006import com.github.gwtbootstrap.client.ui.base.IconAnchor;
007import com.github.gwtbootstrap.client.ui.constants.BaseIconType;
008import com.github.gwtbootstrap.client.ui.constants.Constants;
009import com.github.gwtbootstrap.client.ui.constants.IconPosition;
010import com.github.gwtbootstrap.client.ui.constants.IconSize;
011import com.github.gwtbootstrap.client.ui.constants.IconType;
012import com.github.gwtbootstrap.client.ui.event.HasVisibleHandlers;
013import com.github.gwtbootstrap.client.ui.event.HiddenHandler;
014import com.github.gwtbootstrap.client.ui.event.HideHandler;
015import com.github.gwtbootstrap.client.ui.event.ShowHandler;
016import com.github.gwtbootstrap.client.ui.event.ShownHandler;
017import com.google.gwt.event.shared.HandlerRegistration;
018import com.google.gwt.uibinder.client.UiChild;
019import com.google.gwt.user.client.ui.Widget;
020
021/**
022 * Collapsible Widget like accordion.
023 * <p>
024 * Please see {@link Accordion}
025 * </p>
026 * @since 2.2.1.0
027 * @author ohashi keisuke
028 * @see Accordion
029 * @see Collapse
030 * @see CollapseTrigger
031 * @see <a href="http://twitter.github.com/bootstrap/javascript.html#collapse">Twitter Bootstrap document</a>
032 *
033 */
034public class AccordionGroup extends DivWidget implements HasIcon, HasVisibility, HasVisibleHandlers  {
035
036    private final DivWidget heading;
037
038    private DivWidget innerBody = new DivWidget(Constants.ACCORDION_INNER);
039    
040    private IconAnchor trigger = new IconAnchor();
041
042    private Collapse collapse;
043
044    private CollapseTrigger collapseTrigger;
045
046    private boolean defaultOpen;
047    
048    public AccordionGroup() {
049        super(Constants.ACCORDION_GROUP);
050        
051        DivWidget body = new DivWidget(Constants.ACCORDION_BODY);
052        
053        body.add(innerBody);
054
055        collapse = new Collapse();
056        
057        collapse.setWidget(body);
058        
059        collapse.setExistTrigger(true);
060        
061        trigger.addStyleName(Constants.ACCORDION_TOGGLE);
062
063        collapseTrigger = new CollapseTrigger("#" + collapse.getId());
064
065        collapseTrigger.setAccordionTrigger(true);
066
067        collapseTrigger.setWidget(trigger);
068
069        heading = new DivWidget(Constants.ACCORDION_HEADING);
070        
071        heading.add(collapseTrigger);
072
073        super.add(heading);
074        
075        super.add(collapse.asWidget());
076    }
077
078    public DivWidget getHeading() {
079        return heading;
080    }
081
082    public IconAnchor getTrigger() {
083        return trigger;
084    }
085    
086    /**
087     * {@inheritDoc}
088     */
089    @Override
090    public void setIcon(IconType type) {
091        setBaseIcon(type);
092    }
093
094    /**
095     * {@inheritDoc}
096     */
097    @Override
098    public void setBaseIcon(BaseIconType type) {
099        trigger.setBaseIcon(type);
100    }
101
102    /**
103     * {@inheritDoc}
104     */
105    @Override
106    public void setIconSize(IconSize size) {
107        trigger.setIconSize(size);
108    }
109
110    public void setParent(String parent) {
111        collapseTrigger.setParent(parent);
112    }
113
114    /**
115     * {@inheritDoc}
116     */
117    @Override
118    public HandlerRegistration addHideHandler(HideHandler handler) {
119        return collapse.addHideHandler(handler);
120    }
121
122    /**
123     * {@inheritDoc}
124     */
125    @Override
126    public HandlerRegistration addHiddenHandler(HiddenHandler handler) {
127        return collapse.addHiddenHandler(handler);
128    }
129
130    /**
131     * {@inheritDoc}
132     */
133    @Override
134    public HandlerRegistration addShowHandler(ShowHandler handler) {
135        return collapse.addShowHandler(handler);
136    }
137
138    /**
139     * {@inheritDoc}
140     */
141    @Override
142    public HandlerRegistration addShownHandler(ShownHandler handler) {
143        return collapse.addShownHandler(handler);
144    }
145
146    /**
147     * {@inheritDoc}
148     */
149    @Override
150    public void show() {
151        collapse.show();
152    }
153
154    /**
155     * {@inheritDoc}
156     */
157    @Override
158    public void hide() {
159        collapse.hide();
160    }
161
162    /**
163     * {@inheritDoc}
164     */
165    @Override
166    public void toggle() {
167        collapse.toggle();
168    }
169
170    /**
171     * {@inheritDoc}
172     */
173    @Override
174    public void add(Widget w) {
175        innerBody.add(w);
176    }
177    
178    /**
179     * {@inheritDoc}
180     */
181    @Override
182    public void clear() {
183        innerBody.clear();
184    }
185
186    /**
187     * {@inheritDoc}
188     */
189    @Override
190    public boolean remove(Widget w) {
191        return innerBody.remove(w);
192    }
193    
194    /**
195     * Add a widget to trigger anchor
196     * @param w added widget
197     */
198    @UiChild(limit=1,tagname="customTrigger")
199    public void addCustomTrigger(Widget w) {
200        trigger.insert(w, 0);
201    }
202
203    /**
204     * is opened on attached.
205     * @return defaultOpen true:open false:close
206     */
207    public boolean isDefaultOpen() {
208        return defaultOpen;
209    }
210
211    /**
212     * Set is opened on attached.
213     * @param defaultOpen true:open false:close
214     */
215    public void setDefaultOpen(boolean defaultOpen) {
216        this.defaultOpen = defaultOpen;
217        
218        if(!isAttached()) {
219            collapse.getWidget().setStyleName("in", defaultOpen);
220        }
221        
222    }
223    
224    public void setHeading(String heading) {
225        trigger.setText(heading);
226    }
227
228    /**
229     * {@inheritDoc}
230     */
231    @Override
232    public void setCustomIconStyle(String customIconStyle) {
233        trigger.setCustomIconStyle(customIconStyle);
234    }
235
236    /**
237     * {@inheritDoc}
238     */
239    @Override
240    public void setIconPosition(IconPosition position) {
241        trigger.setIconPosition(position);
242    }
243    
244}