package com.googlecode.gwt.test.uibinder.widget; import com.google.gwt.dom.client.Element; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.user.client.ui.DisclosurePanel; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Widget; import com.googlecode.gwt.test.exceptions.GwtTestUiBinderException; import com.googlecode.gwt.test.uibinder.UiBinderXmlUtils; import com.googlecode.gwt.test.uibinder.UiObjectTag; import com.googlecode.gwt.test.uibinder.UiObjectTagFactory; import com.googlecode.gwt.test.utils.GwtReflectionUtils; import java.lang.reflect.Constructor; import java.util.List; import java.util.Map; public class UiDisclosurePanelTagFactory implements UiObjectTagFactory<DisclosurePanel> { private static class UiDisclosurePanelTag extends UiObjectTag<DisclosurePanel> { private static ClientBundle DEFAULT_IMAGES = GwtReflectionUtils.getStaticFieldValue( DisclosurePanel.class, "DEFAULT_IMAGES"); @Override protected void appendElement(DisclosurePanel wrapped, Element element, String namespaceURI, List<IsWidget> childWidgets) { if ("header".equals(element.getTagName()) && UiBinderXmlUtils.CLIENTUI_NSURI.equals(namespaceURI)) { Widget headerWidget = getTextHeaderWidget(element, wrapped); wrapped.setHeader(headerWidget); } else if ("customHeader".equals(element.getTagName()) && UiBinderXmlUtils.CLIENTUI_NSURI.equals(namespaceURI)) { Widget headerWidget = getCustomHeaderWidget(childWidgets); wrapped.setHeader(headerWidget); } else { // delegate to the default implementation, which should throw an // "unexpected element" exception super.appendElement(wrapped, element, namespaceURI, childWidgets); } } @Override protected void finalizeObject(DisclosurePanel uiObject) { // nothing to do } @Override protected void initializeObject(DisclosurePanel wrapped, Map<String, Object> attributes, Object owner) { // nothing to do } private Widget getCustomHeaderWidget(List<IsWidget> childWidgets) { switch (childWidgets.size()) { case 0: throw new GwtTestUiBinderException( "Error while setting a customHeader to a UiBinder DisclosurePanel : no widget added"); case 1: return childWidgets.get(0).asWidget(); default: throw new GwtTestUiBinderException( "Error while setting a customHeader to a UiBinder DisclosurePanel : too many widgets (" + childWidgets.size() + ")"); } } @SuppressWarnings("unchecked") private Widget getTextHeaderWidget(Element textHeaderElement, DisclosurePanel parent) { try { Class<Widget> disclosurePanelClass = (Class<Widget>) Class.forName("com.google.gwt.user.client.ui.DisclosurePanel$DefaultHeader"); ImageResource disclosurePanelOpen = GwtReflectionUtils.callPrivateMethod( DEFAULT_IMAGES, "disclosurePanelOpen"); ImageResource disclosurePanelClosed = GwtReflectionUtils.callPrivateMethod( DEFAULT_IMAGES, "disclosurePanelClosed"); String text = textHeaderElement.getInnerText(); Constructor<Widget> ctr = disclosurePanelClass.getDeclaredConstructor( DisclosurePanel.class, ImageResource.class, ImageResource.class, String.class); return GwtReflectionUtils.instantiateClass(ctr, parent, disclosurePanelOpen, disclosurePanelClosed, text); } catch (Exception e) { // should never happen throw new GwtTestUiBinderException( "Error while instanciating DisclosurePanel.DefaultHeader to handle <header> tag", e); } } } /* * (non-Javadoc) * * @see com.googlecode.gwt.test.uibinder.UiObjectTagFactory#createUiObjectTag(java .lang.Class, * java.util.Map) */ public UiObjectTag<DisclosurePanel> createUiObjectTag(Class<?> clazz, Map<String, Object> attributes) { if (!DisclosurePanel.class.isAssignableFrom(clazz)) { return null; } return new UiDisclosurePanelTag(); } }