/*
* Copyright 2000-2016 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.ui;
import java.util.Collection;
import org.jsoup.nodes.Element;
import com.vaadin.shared.ui.ContentMode;
import com.vaadin.shared.ui.label.LabelState;
import com.vaadin.ui.declarative.DesignContext;
import com.vaadin.ui.declarative.DesignFormatter;
/**
* Label component for showing non-editable short texts.
* <p>
* The label content can be set to the modes specified by {@link ContentMode}.
* If content mode is set to HTML, any HTML content is allowed.
*
* @author Vaadin Ltd.
* @since 3.0
*/
@SuppressWarnings("serial")
public class Label extends AbstractComponent {
/**
* Creates an empty Label.
*/
public Label() {
this("");
}
/**
* Creates a new instance with text content mode and the given text.
*
* @param text
* the text to set
*/
public Label(String text) {
this(text, ContentMode.TEXT);
}
/**
* Creates a new instance with the given text and content mode.
*
* @param text
* the text to set
* @param contentMode
* the content mode to use
* @since 8.0
*/
public Label(String text, ContentMode contentMode) {
setValue(text);
setContentMode(contentMode);
}
@Override
protected LabelState getState() {
return (LabelState) super.getState();
}
@Override
protected LabelState getState(boolean markAsDirty) {
return (LabelState) super.getState(markAsDirty);
}
/**
* Gets the content mode of the label.
*
* @return the content mode of the label
*
* @see ContentMode
* @since 8.0
*/
public ContentMode getContentMode() {
return getState(false).contentMode;
}
/**
* Sets the content mode of the label.
*
* @param contentMode
* the content mode to set
*
* @see ContentMode
* @since 8.0
*/
public void setContentMode(ContentMode contentMode) {
if (contentMode == null) {
throw new IllegalArgumentException("Content mode can not be null");
}
getState().contentMode = contentMode;
}
/**
* Sets the text to be shown in the label.
*
* @param value
* the text to show in the label, null is converted to an empty
* string
*/
public void setValue(String value) {
if (value == null) {
getState().text = "";
} else {
getState().text = value;
}
}
/**
* Gets the text shown in the label.
*
* @return the text shown in the label, not null
*/
public String getValue() {
return getState(false).text;
}
@Override
public void readDesign(Element design, DesignContext designContext) {
super.readDesign(design, designContext);
String innerHtml = design.html();
boolean plainText = design.hasAttr(DESIGN_ATTR_PLAIN_TEXT);
if (plainText) {
setContentMode(ContentMode.TEXT);
} else {
setContentMode(ContentMode.HTML);
}
if (innerHtml != null && !"".equals(innerHtml)) {
if (plainText) {
innerHtml = DesignFormatter.decodeFromTextNode(innerHtml);
}
setValue(innerHtml);
}
}
@Override
protected Collection<String> getCustomAttributes() {
Collection<String> result = super.getCustomAttributes();
result.add("value");
result.add("content-mode");
result.add("plain-text");
return result;
}
@Override
public void writeDesign(Element design, DesignContext designContext) {
super.writeDesign(design, designContext);
String content = getValue();
if (content != null) {
switch (getContentMode()) {
case TEXT:
case PREFORMATTED: {
// FIXME This attribute is not enough to be able to restore the
// content mode in readDesign. The content mode should instead
// be written directly in the attribute and restored in
// readDesign. See ticket #19435
design.attr(DESIGN_ATTR_PLAIN_TEXT, true);
String encodeForTextNode = DesignFormatter
.encodeForTextNode(content);
if (encodeForTextNode != null) {
design.html(encodeForTextNode);
}
}
break;
case HTML:
design.html(content);
break;
}
}
}
}