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.google.gwt.user.client.ui.Widget;
021    
022    //@formatter:off
023    /**
024     * Toolbar that places different Buttons in a horizontal line.
025     * 
026     * <p>
027     * <h3>UiBinder Usage:</h3>
028     * 
029     * <pre>
030     * {@code 
031     * <b:ButtonToolbar>
032     *     <b:ButtonGroup>
033     *         <b:Button>1</b:Button>
034     *         <b:Button>2</b:Button>
035     *         <b:Button>3</b:Button>
036     *     </b:ButtonGroup>
037     *     <b:Button>4</b:Button>
038     *     <b:Button>5</b:Button>
039     *     <b:DropdownButton text="6">
040     *         <b:NavLink>Some NavLink</b:NavLink>
041     *         <b:NavLink>Another NavLink</b:NavLink>
042     *     </b:DropdownButton>
043     *     <b:SplitDropdownButton text="7">
044     *         <b:NavLink>Some NavLink</b:NavLink>
045     *         <b:NavLink>Another NavLink</b:NavLink>
046     *     </b:SplitDropdownButton>
047     * </b:ButtonToolbar>
048     * }
049     * </pre>
050     * 
051     * @since 2.0.4.0
052     *
053     * @author Carlos Alexandro Becker
054     * 
055     * @author Dominik Mayer
056     * 
057     * @see <a href="http://twitter.github.com/bootstrap/components.html#buttonGroups">Bootstrap documentation</a>
058     * @see Button
059     * @see ButtonGroup
060     * @see DropdownButton
061     * @see SplitDropdownButton
062     */
063    //@formatter:on
064    public class ButtonToolbar extends DivWidget {
065    
066            /**
067             * Creates an empty toolbar.
068             */
069            public ButtonToolbar() {
070                    setStyleName(Constants.BTN_TOOLBAR);
071            }
072    
073            /**
074             * Adds a new widget to the toolbar.
075             * 
076             * @param widget
077             *            the widget to be added
078             */
079            @Override
080            public void add(Widget widget) {
081    
082                    Widget addingWidget = widget;
083    
084                    if (!canBeAdded(widget))
085                            throw new IllegalArgumentException("A widget of "
086                                            + widget.getClass() + " cannot be added to the toolbar.");
087    
088                    if (widget instanceof Button)
089                            addingWidget = new ButtonGroup((Button) widget);
090    
091                    super.add(addingWidget);
092            }
093    
094            /**
095             * This method decides whether a widget can be added to the toolbar or not.
096             * <p>
097             * Override it to allow other than the default widgets.
098             * 
099             * @param widget
100             *            the widget that should be added to the toolbar.
101             * @return <code>true</code> if the widget can be added to the toolbar.
102             */
103            protected boolean canBeAdded(Widget widget) {
104                    return (widget instanceof ButtonGroup) || (widget instanceof Button)
105                                    || (widget instanceof DropdownButton)
106                                    || (widget instanceof SplitDropdownButton);
107            }
108    
109    }