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.DivWidget;
019    import com.github.gwtbootstrap.client.ui.constants.Constants;
020    import com.github.gwtbootstrap.client.ui.constants.ToggleType;
021    import com.google.gwt.user.client.ui.Widget;
022    
023    //@formatter:off
024    /**
025     * ButtonGroups take buttons and combine them to one optically integrated
026     * widget.
027     * 
028     * <p>
029     * <h3>UiBinder Usage:</h3>
030     * 
031     * <pre>
032     * {@code 
033     * <b:ButtonGroup>
034     *     <b:Button>First Button</b:Button>
035     *     <b:Button>Second Button</b:Button>
036     *     <b:Button>Third Button</b:Button>
037     * </b:ButtonGroup>}
038     * </pre>
039     * 
040     * You can also use the buttons as checkboxes or radio buttons:
041     * 
042     * <pre>
043     * {@code
044     * <b:ButtonGroup toggle="radio">
045     *      <b:Button text="1" />
046     *              <b:Button text="2" />
047     *      <b:Button text="3" />
048     *      <b:Button text="4" />
049     * </b:ButtonGroup>
050     * }
051     * </pre>
052     * 
053     * @since 2.0.4.0
054     * 
055     * @author Carlos Alexandro Becker
056     * 
057     * @see <a
058     *      href="http://twitter.github.com/bootstrap/components.html#buttonGroups">Bootstrap
059     *      documentation</a>
060     * @see Button
061     * @see ButtonToolbar
062     */
063    // @formatter:on
064    public class ButtonGroup extends DivWidget {
065    
066            /**
067             * Creates an empty ButtonGroup.
068             */
069            public ButtonGroup() {
070                    setStyleName(Constants.BTN_GROUP);
071            }
072    
073            /**
074             * Creates a ButtonGroup containing the provided Buttons.
075             * 
076             * @param buttons
077             *            the widgets to be added to the ButtonGroup
078             */
079            public ButtonGroup(Button... buttons) {
080                    this();
081                    for (Button btn : buttons) {
082                            add(btn);
083                    }
084            }
085    
086            /**
087             * Adds a new {@link Button} to the group.
088             * 
089             * @param widget
090             *            the Button to be added.
091             */
092            @Override
093            public void add(Widget widget) {
094                    if (!(widget instanceof Button))
095                            throw new IllegalArgumentException(
096                                            "A ButtonGroup can only contain Buttons.");
097    
098                    super.add(widget);
099                    // super.add(widget);
100            }
101    
102            /**
103             * Set/unset the data-toggle behavior.
104             * 
105             * @param type
106             */
107            public void setToggle(ToggleType type) {
108                    if (type == null || type == ToggleType.NONE) {
109                            getElement().removeAttribute(Constants.DATA_TOGGLE);
110                            return;
111                    }
112                    getElement().setAttribute(Constants.DATA_TOGGLE, type.get());
113    
114            }
115    
116            /**
117             * Set/unset the data-toggle behavior.
118             * 
119             * @param toggle
120             */
121            public void setToggle(String toggle) {
122                    try {
123                            setToggle(ToggleType.valueOf(toggle.toUpperCase()));
124                    } catch (Exception e) {
125                            throw new IllegalArgumentException("Invalid toggle option.");
126                    }
127            }
128    }