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 }