What is the advantage of this practice to Thomas' proposal? DefaultUI.ui.xml is missing in your example.I've implemented the DefaultUI.ui.xml manually:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui" > <g:VerticalPanel> <g:SpanElement ui:field="_someLabel"/> <g:ButtonElement ui:field="_someButton"/> </g:VerticalPanel> </ui:UiBinder> SomeSubClass.ui.xml is missing in your example.I've implemented the DefaultUI.ui.xml manually: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui" > <g:VerticalPanel> <g:FormElement ui:field="_form"/> </g:VerticalPanel> </ui:UiBinder> ...didn't solve the problem: The example fails to compile => DEBUG: Rebinding dp.verp.planer.client.ExampleUiBinderWidget.DefaultUI.DefaultUIBinder. ERROR: Deferred binding failed for 'dp.verp.planer.client.ExampleUiBinderWidget.DefaultUI.DefaultUIBinder'; expect subsequent failures. I've changed @UiTemplate("com.tomaszgawel.example.client.ExampleUiBinderWidget.ui.xml") to @UiTemplate("dp.verp.planer.client.ExampleUiBinderWidget.ui.xml") and @UiTemplate("com.tomaszgawel.example.client.SomeSubClass.ui.xml") to @UiTemplate("dp.verp.planer.client.SomeSubClass.ui.xml") -Alex On Jul 22, 3:55 am, gawelt <[email protected]> wrote: > Hi, > I used to apply similar pattern as Thomas bt with some remarkable > difference. > here is the example to illustrate the differences and the concept > itself - it's quite simple and not show all possible combinations but > i think it's just enough for "getting started communication" - if you > were interested in it and need some hepl feel free to ask > > import com.google.gwt.core.client.GWT; > import com.google.gwt.dom.client.ButtonElement; > import com.google.gwt.dom.client.DivElement; > import com.google.gwt.dom.client.Document; > import com.google.gwt.dom.client.FormElement; > import com.google.gwt.user.client.Element; > import com.google.gwt.dom.client.SpanElement; > import com.google.gwt.uibinder.client.UiBinder; > import com.google.gwt.uibinder.client.UiField; > import com.google.gwt.uibinder.client.UiTemplate; > import com.google.gwt.user.client.DOM; > import com.google.gwt.user.client.Event; > import com.google.gwt.user.client.EventListener; > import com.google.gwt.user.client.ui.Widget; > > public class ExampleUiBinderWidget extends Widget { > > public static interface UI { > Element root(); > Element someButton(); > Element someLabel(); > } > > public static class DefaultUI implements UI { > > //different from thomas - I used to inject UiBinder interface > definition > //inside "the layout inner class" - why look below > > @UiTemplate("com.tomaszgawel.example.client.ExampleUiBinderWidget.ui.xml") > static interface DefaultUIBinder extends UiBinder<DivElement, > DefaultUI> {} > final static DefaultUIBinder uiBinder = > GWT.create(DefaultUIBinder.class); > > //i could have declared this fields the same as return types > from > //coresponding UI methods - so avoid necessity to cast later - > //but it is to show the flexibility of this approach > DivElement _root; > @UiField ButtonElement _someButton; > @UiField SpanElement _someLabel; > > public DefaultUI(){ > _root = uiBinder.createAndBindUi(this); > } > @Override public Element root() { > return _root.cast(); > } > @Override public Element someButton() { > return _someButton.cast(); > } > @Override public Element someLabel() { > return _someLabel.cast(); > } > } > > UI ui; > int counter; > > public ExampleUiBinderWidget(){ > this(new DefaultUI()); > } > > public ExampleUiBinderWidget(UI ui){ > assert ui != null : "Provide ui - widgets do not like to show > naked :P"; > > //move initailisation from constructor > //in case you want call setElement on something else than > ui.root() > this.ui = ui; > init(); > } > > protected void init() { > setElement(ui.root()); > someInitActions(); > } > > protected void someInitActions() { > DOM.sinkEvents(ui.someButton(), Event.ONCLICK); > DOM.setEventListener(ui.someButton(), new EventListener() { > @Override public void onBrowserEvent(Event event) { > counter++; > ui.someLabel().setInnerText("Button has been > clicked " + counter + > " times."); > } > }); > } > > } > > class SomeSubClass extends ExampleUiBinderWidget { > public static interface UI extends ExampleUiBinderWidget.UI { > //wrappingFormElement > FormElement form(); > } > > //could just implenet the UI - but we also inherit superclass > DefaultUI > //to save some lines of duplicate code > static class DefaultUI extends ExampleUiBinderWidget.DefaultUI > implements UI { > > @UiTemplate("com.tomaszgawel.example.client.SomeSubClass.ui.xml") > static interface DefaultUIBinder extends UiBinder<DivElement, > DefaultUI> {} > final static DefaultUIBinder uiBinder = > GWT.create(DefaultUIBinder.class); > @UiField FormElement _form; > public DefaultUI(){ > _root = uiBinder.createAndBindUi(this); > } > @Override public FormElement form() { > return _form; > } > } > > public SomeSubClass(){ > super(new DefaultUI()); > } > > public SomeSubClass(UI ui){ > super(ui); > } > > @Override > protected void init() { > //you must cast to subclasses UI to get to additional fields > //as member field ui is of type ExampleUiBinderWidget.UI > ((UI) ui).form().setAction("http://someserver.com"); > > //and you could do this before call to super.init > //as it is not a constructor > > super.init(); > > //if you wuld prefer to set ELement on form not root > //instead of calling super.init just insert lines like this: > //setElement(((UI) ui).form()); > //someInitActions(); > > } > > } > > class Test { > > public static void test(){ > //as we have constructor with UI as argument > //you can provide any UI defined outside the class > //only if it implements UI interface > //it can even not have anything to do with uibinder > //consider the UI that looks for ELement in html page > //(yes - that was why I extended Widget not Composite in that > example) > > SomeSubClass ssc = new SomeSubClass(new SomeSubClass.UI() { > FormElement _form; > Element _root; > Element _button; > Element _label; > > //initialisation block as anonymous class does not > //have a constructor > { > _root = Document.get().getBody().cast(); > _form = > _root.getElementsByTagName("form").getItem(0).cast(); > _label = > DOM.getElementById("someLabelOnThePage"); > _button = > _form.getElementsByTagName("button").getItem(0).cast(); > assert _form != null && _root != null && > _button != null && > _label != null; > } > > @Override public Element someLabel() { > return _label; > } > @Override public Element someButton() { > return _button; > } > @Override public Element root() { > return _root; > } > @Override public FormElement form() { > return _form; > } > }); > } > > > > > > > > } -- You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.
