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