/*
* Copyright 2010 IT Mill 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.terminal.gwt.client.ui;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NodeList;
import com.google.gwt.dom.client.PreElement;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.HTML;
import com.vaadin.terminal.gwt.client.ApplicationConnection;
import com.vaadin.terminal.gwt.client.Paintable;
import com.vaadin.terminal.gwt.client.UIDL;
import com.vaadin.terminal.gwt.client.Util;
import com.vaadin.terminal.gwt.client.VTooltip;
public class VLabel extends HTML implements Paintable {
public static final String CLASSNAME = "v-label";
private static final String CLASSNAME_UNDEFINED_WIDTH = "v-label-undef-w";
private ApplicationConnection client;
private int verticalPaddingBorder = 0;
private int horizontalPaddingBorder = 0;
public VLabel() {
super();
setStyleName(CLASSNAME);
sinkEvents(VTooltip.TOOLTIP_EVENTS);
}
public VLabel(String text) {
super(text);
setStyleName(CLASSNAME);
sinkEvents(VTooltip.TOOLTIP_EVENTS);
}
@Override
public void onBrowserEvent(Event event) {
super.onBrowserEvent(event);
if (event.getTypeInt() == Event.ONLOAD) {
Util.notifyParentOfSizeChange(this, true);
event.cancelBubble(true);
return;
}
if (client != null) {
client.handleTooltipEvent(event, this);
}
}
public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
if (client.updateComponent(this, uidl, true)) {
return;
}
this.client = client;
boolean sinkOnloads = false;
final String mode = uidl.getStringAttribute("mode");
if (mode == null || "text".equals(mode)) {
setText(uidl.getChildString(0));
} else if ("pre".equals(mode)) {
PreElement preElement = Document.get().createPreElement();
preElement.setInnerText(uidl.getChildUIDL(0).getChildString(0));
// clear existing content
setHTML("");
// add preformatted text to dom
getElement().appendChild(preElement);
} else if ("uidl".equals(mode)) {
setHTML(uidl.getChildrenAsXML());
} else if ("xhtml".equals(mode)) {
UIDL content = uidl.getChildUIDL(0).getChildUIDL(0);
if (content.getChildCount() > 0) {
setHTML(content.getChildString(0));
} else {
setHTML("");
}
sinkOnloads = true;
} else if ("xml".equals(mode)) {
setHTML(uidl.getChildUIDL(0).getChildString(0));
} else if ("raw".equals(mode)) {
setHTML(uidl.getChildUIDL(0).getChildString(0));
sinkOnloads = true;
} else {
setText("");
}
if (sinkOnloads) {
sinkOnloadsForContainedImgs();
}
}
private void sinkOnloadsForContainedImgs() {
NodeList<Element> images = getElement().getElementsByTagName("img");
for (int i = 0; i < images.getLength(); i++) {
Element img = images.getItem(i);
DOM.sinkEvents((com.google.gwt.user.client.Element) img,
Event.ONLOAD);
}
}
@Override
public void setHeight(String height) {
verticalPaddingBorder = Util.setHeightExcludingPaddingAndBorder(this,
height, verticalPaddingBorder);
}
@Override
public void setWidth(String width) {
horizontalPaddingBorder = Util.setWidthExcludingPaddingAndBorder(this,
width, horizontalPaddingBorder);
if (width == null || width.equals("")) {
setStyleName(getElement(), CLASSNAME_UNDEFINED_WIDTH, true);
} else {
setStyleName(getElement(), CLASSNAME_UNDEFINED_WIDTH, false);
}
}
}