001package org.gwtbootstrap3.client.ui; 002 003/* 004 * #%L 005 * GwtBootstrap3 006 * %% 007 * Copyright (C) 2013 GwtBootstrap3 008 * %% 009 * Licensed under the Apache License, Version 2.0 (the "License"); 010 * you may not use this file except in compliance with the License. 011 * You may obtain a copy of the License at 012 * 013 * http://www.apache.org/licenses/LICENSE-2.0 014 * 015 * Unless required by applicable law or agreed to in writing, software 016 * distributed under the License is distributed on an "AS IS" BASIS, 017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 018 * See the License for the specific language governing permissions and 019 * limitations under the License. 020 * #L% 021 */ 022 023import org.gwtbootstrap3.client.ui.base.ComplexWidget; 024import org.gwtbootstrap3.client.ui.base.HasAlignment; 025import org.gwtbootstrap3.client.ui.base.HasEmphasis; 026import org.gwtbootstrap3.client.ui.base.HasSubText; 027import org.gwtbootstrap3.client.ui.base.helper.StyleHelper; 028import org.gwtbootstrap3.client.ui.constants.Alignment; 029import org.gwtbootstrap3.client.ui.constants.Emphasis; 030import org.gwtbootstrap3.client.ui.constants.HeadingSize; 031import org.gwtbootstrap3.client.ui.constants.Styles; 032import org.gwtbootstrap3.client.ui.html.Small; 033import org.gwtbootstrap3.client.ui.html.Text; 034 035import com.google.gwt.dom.client.Document; 036import com.google.gwt.uibinder.client.UiConstructor; 037import com.google.gwt.user.client.ui.HasText; 038import com.google.gwt.user.client.ui.HasWidgets; 039 040/** 041 * Represents a Heading tag, has an optional subtext. 042 * <p/> 043 * <h3>Bootstrap's Documentation</h3> 044 * <a href="http://getbootstrap.com/css/#type">Typography</a> 045 * <p/> 046 * <h3>Usage in UiBinder</h3> 047 * <p/> 048 * <pre> 049 * {@code 050 * <b:Heading size="H1"> 051 * <b:Text text="Heading"/> 052 * <b:Small text=" subtext"/> 053 * </b:Heading> 054 * 055 * <b:Heading size="H1" text="Heading Text" subText="Subtext Text"/> 056 * <b:Heading size="H1" subText="Subtext Text" text="Heading Text"/> 057 * 058 * <b:Heading size="H1"> 059 * <b:Icon type="..."/> 060 * <b:Text text="Heading with icon"/> 061 * </b:Heading> 062 * 063 * <b:Heading size="H1"> 064 * <b:Icon type="..."/> 065 * <b:Text text="Heading with icon"/> 066 * <b:Small text=" subtext"/> 067 * </b:Heading> 068 * } 069 * </pre> 070 * <p/> 071 * <h3>Usage in Java</h3> 072 * <p/> 073 * <pre> 074 * Heading h1 = new Heading(1, "Heading Text"); 075 * h1.setSubText("Subtext Text"); // optional 076 * </pre> 077 * 078 * @author Sven Jacobs 079 * @author Joshua Godi 080 */ 081public class Heading extends ComplexWidget implements HasWidgets, HasText, HasEmphasis, HasAlignment, HasSubText { 082 083 private final Small subText = new Small(); 084 private final Text text = new Text(); 085 086 /** 087 * Creates a Heading with the passed in size. 088 * 089 * @param size size of the heading 090 */ 091 @UiConstructor 092 public Heading(final HeadingSize size) { 093 setElement(Document.get().createHElement(size.getHeadingSize())); 094 } 095 096 /** 097 * Creates a Heading with the passed in size and text. 098 * 099 * @param size size of the heading 100 * @param text text for the heading 101 */ 102 public Heading(final HeadingSize size, final String text) { 103 this(size); 104 setText(text); 105 } 106 107 /** 108 * Creates a Heading with the passed in size and text. 109 * 110 * @param size size of the heading 111 * @param text text for the heading 112 * @param subText subtext for the heading 113 */ 114 public Heading(final HeadingSize size, final String text, final String subText) { 115 this(size, text); 116 setSubText(subText); 117 } 118 119 /** 120 * Sets the subtext for the heading (wrapped in a Small tag). 121 * <p/> 122 * When using the setter for this, the subtext will be added after the text 123 * 124 * @param subText the subtext of the heading 125 */ 126 @Override 127 public void setSubText(final String subText) { 128 // Force a space between the heading and the subText 129 this.subText.setText(" " + subText); 130 add(this.subText); 131 } 132 133 /** 134 * Returns the subtext of the heading. 135 * 136 * @return subtext of the heading 137 */ 138 @Override 139 public String getSubText() { 140 return subText.getText(); 141 } 142 143 /** 144 * {@inheritDoc} 145 */ 146 @Override 147 public String getText() { 148 return text.getText(); 149 } 150 151 /** 152 * {@inheritDoc} 153 */ 154 @Override 155 public void setText(final String text) { 156 this.text.setText(text); 157 insert(this.text, 0); 158 } 159 160 /** 161 * {@inheritDoc} 162 */ 163 @Override 164 public void setEmphasis(final Emphasis emphasis) { 165 StyleHelper.addUniqueEnumStyleName(this, Emphasis.class, emphasis); 166 } 167 168 /** 169 * {@inheritDoc} 170 */ 171 @Override 172 public Emphasis getEmphasis() { 173 return Emphasis.fromStyleName(getStyleName()); 174 } 175 176 /** 177 * {@inheritDoc} 178 */ 179 @Override 180 public void setAlignment(final Alignment alignment) { 181 StyleHelper.addUniqueEnumStyleName(this, Alignment.class, alignment); 182 } 183 184 /** 185 * {@inheritDoc} 186 */ 187 @Override 188 public Alignment getAlignment() { 189 return Alignment.fromStyleName(getStyleName()); 190 } 191 192 /** 193 * {@inheritDoc} 194 */ 195 @Override 196 protected void onAttach() { 197 super.onAttach(); 198 199 // Adding styles to the heading depending on the parent 200 if (getParent() != null) { 201 if (getParent() instanceof LinkedGroupItem) { 202 addStyleName(Styles.LIST_GROUP_ITEM_HEADING); 203 } else if (getParent() instanceof PanelHeader) { 204 addStyleName(Styles.PANEL_TITLE); 205 } else if (getParent() instanceof MediaBody) { 206 addStyleName(Styles.MEDIA_HEADING); 207 } 208 } 209 } 210}