001package org.gwtbootstrap3.client.ui; 002 003/* 004 * #%L 005 * GwtBootstrap3 006 * %% 007 * Copyright (C) 2013 - 2015 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.AbstractTextWidget; 024import org.gwtbootstrap3.client.ui.constants.Attributes; 025import org.gwtbootstrap3.client.ui.constants.ElementTags; 026import org.gwtbootstrap3.client.ui.constants.IconType; 027import org.gwtbootstrap3.client.ui.constants.Styles; 028 029import com.google.gwt.dom.client.Document; 030import com.google.gwt.dom.client.Element; 031import com.google.gwt.dom.client.Style; 032import com.google.gwt.dom.client.Style.Unit; 033import com.google.gwt.event.dom.client.ChangeEvent; 034import com.google.gwt.event.dom.client.ChangeHandler; 035import com.google.gwt.event.dom.client.DomEvent; 036 037/** 038 * @author Sven Jacobs 039 * @author Steven Jardine 040 */ 041public class FormLabel extends AbstractTextWidget { 042 043 private Element iconElement = null; 044 045 private boolean showRequiredIndicator = false; 046 047 /** 048 * Constructor. 049 */ 050 public FormLabel() { 051 super(Document.get().createLabelElement()); 052 setStyleName(Styles.CONTROL_LABEL); 053 addHandler(new ChangeHandler() { 054 @Override 055 public void onChange(ChangeEvent event) { 056 if (iconElement != null) { 057 iconElement.removeFromParent(); 058 } 059 String html = getHTML(); 060 if (showRequiredIndicator && html != null && !"".equals(html)) { 061 iconElement = createIconElement(); 062 getElement().appendChild(iconElement); 063 } 064 } 065 }, ChangeEvent.getType()); 066 } 067 068 /** 069 * @return a new icon element. We only create this when {@link #iconElement} is null or the 070 * {@link #showRequiredIndicator} has changed. 071 */ 072 protected Element createIconElement() { 073 Element e = Document.get().createElement(ElementTags.I); 074 e.addClassName(Styles.FONT_AWESOME_BASE); 075 e.addClassName(IconType.STAR.getCssName()); 076 Style s = e.getStyle(); 077 s.setFontSize(6, Unit.PX); 078 s.setPaddingLeft(2, Unit.PX); 079 s.setPaddingRight(5, Unit.PX); 080 s.setColor("#b94a48"); 081 Element sup = Document.get().createElement("sup"); 082 sup.appendChild(e); 083 return sup; 084 } 085 086 /** 087 * @return does this label show required? 088 */ 089 public boolean getShowRequiredIndicator() { 090 return showRequiredIndicator; 091 } 092 093 public void setFor(final String f) { 094 if (f != null) { 095 getElement().setAttribute(Attributes.FOR, f); 096 } else { 097 getElement().removeAttribute(Attributes.FOR); 098 } 099 } 100 101 /** {@inheritDoc} */ 102 @Override 103 public void setHTML(final String html) { 104 super.setHTML(html); 105 DomEvent.fireNativeEvent(Document.get().createChangeEvent(), this); 106 } 107 108 /** 109 * @param should this label show as required? 110 */ 111 public void setShowRequiredIndicator(boolean required) { 112 this.showRequiredIndicator = required; 113 DomEvent.fireNativeEvent(Document.get().createChangeEvent(), this); 114 } 115 116 /** {@inheritDoc} */ 117 @Override 118 public void setText(String text) { 119 super.setText(text); 120 DomEvent.fireNativeEvent(Document.get().createChangeEvent(), this); 121 } 122 123}