I just wasted a whole day at work trying to figure out how to create my own container widget that will work with in GWT's UiBinder. In the end, I was forced to dig through the source to find the solution. If you take a look at the UIBinderClass.registerParsers(), you'll see that it has a list of hard coded ElementParsers. If you take a close look, you'll notice that google has registered 4 generic parsers: HasText,HasHTML,HasTreeItems,HasWidgets. So if you're Composite class implements any one of these interfaces then it will you're widget will support having some child element's within it's XML.
In my case, I just wanted to create a custom decorated panel. So I simple created a class that extended the HasWidget interface.
public class Decorated extends Composite implements HasWidgets { private static DecoratedUiBinder uiBinder = GWT.create(DecoratedUiBinder.class); interface DecoratedUiBinder extends UiBinder{ } public Decorated() { initWidget(uiBinder.createAndBindUi(this)); } @UiField SimplePanel placeholder; @Override protected Widget getWidget() { return placeholder.getWidget(); } @Override protected void setWidget(Widget widget) { placeholder.setWidget(widget); } @Override public void add(Widget w) { setWidget(w); } @Override public void clear() { setWidget(null); } @Override public Iterator iterator() { return Arrays.asList( getWidget() ).iterator(); } @Override public boolean remove(Widget w) { if ( getWidget() == w ) { clear(); return true; } return false; } }
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"> <g:HTMLPanel> <div> <div> <g:SimplePanel ui:field="placeholder" /> </div> </div> </g:HTMLPanel> </ui:UiBinder>
1 comment:
Thanks, exactly what I was looking for :)
Post a Comment