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.AbstractTypography;
019    import com.github.gwtbootstrap.client.ui.base.ComplexWidget;
020    import com.google.gwt.uibinder.client.UiConstructor;
021    import com.google.gwt.user.client.ui.HasText;
022    
023    //@formatter:off
024    /**
025     * Heading with optional subtext.
026     * 
027     * <p>
028     * <h3>UiBinder Usage:</h3>
029     * 
030     * <pre>
031     * {@code 
032     * <b:Heading size="2" text="And I'm the subtext">I'm the heading</b:Heading>}
033     * </pre>
034     * Specifying the <code>size</code> is mandatory.
035     * </p>
036     *
037     * @since 2.0.4.0
038     * 
039     * @author Carlos Alexandro Becker
040     * @author Dominik Mayer
041     * 
042     * @see <a href="http://twitter.github.com/bootstrap/base-css.html#typography">Bootstrap documentation</a>
043     */
044    //@formatter:on
045    public class Heading extends ComplexWidget implements HasText {
046    
047            private static final int HEADER_MINIMUM = 1;
048    
049            private static final int HEADER_MAXIMUM = 6;
050    
051            private Small small = new Small();
052    
053            private String text;
054    
055            /**
056             * Creates a new Heading of given size.
057             * 
058             * @param size
059             *            the size of the heading
060             */
061            public @UiConstructor
062            Heading(int size) {
063                    super("h" + size);
064                    if (size < HEADER_MINIMUM || size > HEADER_MAXIMUM)
065                            throw new IllegalArgumentException(
066                                            "The size of the header must be between 1 and 6.");
067    
068                    super.add(small);
069            }
070    
071            /**
072             * Creates a new Heading of given size and text.
073             * 
074             * @param size
075             *            size of the heading
076             * @param text
077             *            text of the heading
078             */
079            public Heading(int size, String text) {
080                    this(size);
081                    setText(text);
082            }
083    
084            /**
085             * Creates a new Heading of given size, text and subtext.
086             * 
087             * @param size
088             *            size of the heading
089             * @param text
090             *            text of the heading
091             * @param subtext
092             *            subtext of the heading
093             */
094            public Heading(int size, String text, String subtext) {
095                    this(size, text);
096                    setSubtext(subtext);
097            }
098    
099            /**
100             * Sets the heading's subtext.
101             * 
102             * @param subtext
103             *            the heading's subtext
104             */
105            public void setSubtext(String subtext) {
106                    small.setText(subtext);
107                    redraw();
108            }
109    
110            private void redraw() {
111                    setText(this.text);
112            }
113    
114            /**
115             * {@inheritDoc}
116             */
117            public void setText(String text) {
118                    this.text = text;
119    
120                // Add a space after the main heading text to get the same effect as Twitter Bootstrap.
121            // <h1>Some text <small>Some subtext</small></h1>
122            //              ^- Note the space
123                    getElement().setInnerHTML(text + " " + small.toString());
124            }
125    
126            /**
127             * {@inheritDoc}
128             */
129            public String getText() {
130                    return text;
131            }
132    
133            private class Small extends AbstractTypography {
134    
135                    public Small() {
136                            super("small");
137                    }
138            }
139    }