package com.googlecode.gwt.test.uibinder.widget;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NodeList;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.StackLayoutPanel;
import com.googlecode.gwt.test.uibinder.UiBinderXmlUtils;
import com.googlecode.gwt.test.uibinder.UiObjectTag;
import com.googlecode.gwt.test.uibinder.UiObjectTagFactory;
import java.util.List;
import java.util.Map;
/**
* Handles <g:StackLayoutPanel> tags.
*
* @author Gael Lazzari
*/
public class UiStackLayoutPanelTagFactory implements UiObjectTagFactory<StackLayoutPanel> {
private static class UiStackLayoutPanelTag extends UiObjectTag<StackLayoutPanel> {
@Override
protected void appendElement(StackLayoutPanel wrapped, Element element, String namespaceURI,
List<IsWidget> childWidgets) {
if (!UiBinderXmlUtils.CLIENTUI_NSURI.equals(namespaceURI)) {
super.appendElement(wrapped, element, namespaceURI, childWidgets);
} else {
handleStackLayoutPanelSpecifics(wrapped, element, childWidgets);
}
}
@Override
protected void finalizeObject(StackLayoutPanel widget) {
// nothing to do
}
@Override
protected void initializeObject(StackLayoutPanel wrapped, Map<String, Object> attributes,
Object owner) {
// nothing to do
}
@Override
protected StackLayoutPanel instanciate(Class<? extends StackLayoutPanel> clazz,
Map<String, Object> attributes, Object owner) {
if (clazz != StackLayoutPanel.class) {
// use default instanciation system
return super.instanciate(clazz, attributes, owner);
}
String unit = (String) attributes.get("unit");
Unit styleUnit = unit != null ? Unit.valueOf(unit) : Unit.PX;
return new StackLayoutPanel(styleUnit);
}
private void handleStackLayoutPanelSpecifics(StackLayoutPanel wrapped, Element element,
List<IsWidget> childWidgets) {
if ("stack".equals(element.getTagName())) {
NodeList<Element> headers = element.getElementsByTagName("header");
if (headers.getLength() == 1 && childWidgets.size() == 1) {
// case of "header"
String header = headers.getItem(0).getInnerHTML();
String headerSize = headers.getItem(0).getAttribute("size");
wrapped.add(childWidgets.get(0).asWidget(), header, Double.valueOf(headerSize));
} else {
NodeList<Element> customHeaders = element.getElementsByTagName("customHeader");
if (customHeaders.getLength() == 1 && childWidgets.size() == 1) {
// case of "customHeader"
List<IsWidget> customHeaderChilds = UiBinderXmlUtils.getChildWidgets(customHeaders.getItem(0));
if (customHeaderChilds.size() == 1) {
String customHeaderSize = customHeaders.getItem(0).getAttribute("size");
wrapped.add(childWidgets.get(0), customHeaderChilds.get(0),
Double.valueOf(customHeaderSize));
}
}
}
}
}
}
/*
* (non-Javadoc)
*
* @see com.googlecode.gwt.test.uibinder.UiWidgetTagFactory#createUiObjectTag( java.lang .Class,
* java.util.Map)
*/
public UiObjectTag<StackLayoutPanel> createUiObjectTag(Class<?> clazz,
Map<String, Object> attributes) {
if (StackLayoutPanel.class.isAssignableFrom(clazz)) {
return new UiStackLayoutPanelTag();
}
return null;
}
}