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}