Create a gist now

Instantly share code, notes, and snippets.

Before/after GWT 2.1 Editors
package net.ltgt.gwt.samples.editors.shared;
public class Address {
private String street;
private String city;
private String zip;
private String state;
public String getStreet() { return this.street; }
public void setStreet(String street) { this.street = street; }
public String getCity() { return this.city; }
public void setCity(String city) { this.city = city; }
public String getZip() { return this.zip; }
public void setZip(String zip) { this.zip = zip; }
public String getState() { return this.state; }
public void setState(String state) { this.state = state; }
}
package net.ltgt.gwt.samples.editors.client;
import net.ltgt.gwt.samples.editors.shared.Address;
public class AddressEditor extends Composite implements Editor<Address> {
interface Binder extends UiBinder<Widget, AddressEditor> {}
private static final Binder BINDER = GWT.create(Binder.class);
@UiField TextBox street;
@UiField TextBox city;
@UiField TextBox zip;
@UiField ValueListBox<String> state;
public AddressEditor() {
initWidget(BINDER.createAndBindUi(this));
}
}
package net.ltgt.gwt.samples.editors.shared;
public class Person {
private String id;
private String firstName;
private String lastName;
private final Address address = new Address();
public String getId() { return this.id; }
public void setId(String id) { this.id = id; }
public String getFirstName() { return this.firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }
public String getLastName() { return this.lastName; }
public void setLastName(String lastName) { this.lastName = lastName; }
public Address getAddress() { return this.address; }
}
package net.ltgt.gwt.samples.editors.client;
import net.ltgt.gwt.samples.editors.shared.Person;
public class PersonEditor extends Composite implements Editor<Person> {
interface Binder extends UiBinder<Widget, PersonEditor> {}
private static final Binder BINDER = GWT.create(Binder.class);
@UiField TextBox firstName;
@UiField TextBox lastName;
@UiField AddressEditor address;
public PersonEditor() {
initWidget(BINDER.createAndBindUi(this));
}
}
package net.ltgt.gwt.samples.editors.client;
import net.ltgt.gwt.samples.editors.shared.Person;
public class PersonView extends Composite {
interface Binder extends UiBinder<Widget, PersonView> {}
interface EditorDriver extends SimpleBeanEditorDriver<Person, PersonEditor> {}
private final Binder BINDER = GWT.Create(Binder.class);
private final PersonServiceAsync RPC = GWT.create(PersonService.class);
private final EditorDriver editorDriver = GWT.create(EditorDriver.class);
@UiField PersonEditor editor;
@UiField Button save;
@UiField Button cancel;
public PersonView() {
initWidget(BINDER.createAndBindUi(this));
}
public void edit(String id) {
RPC.getPerson(id, new AsyncCallback<Person>() {
@Override
public void onSuccess(Person person) {
editorDriver.edit(person);
}
@Override
public void onFailure(Throwable e) {
// ...handle failure...
}
});
}
@UiHandler("save")
void onSaveClick(ClickEvent event) {
Person person = editorDriver.flush();
RPC.savePerson(this.value, new AsyncCallback<Void>() {
@Override
public void onSuccess(Person person) {
// ...navigate... (e.g. back to list of persons)
}
@Override
public void onFailure(Throwable e) {
// ...handle failure...
}
});
}
@UiHandler("cancel")
void onCancelClick() {
// ...navigate... (e.g. back to list of persons)
}
}
@armhold
armhold commented Feb 24, 2011

Thomas, thanks for providing this; it's been helpful in understanding GWT Editors. Your example would be even more helpful if you could provide the corresponding *.ui.xml files.

@ychumak
ychumak commented Jun 15, 2011

Hello, is there an example of using the ListEditor or any kind editor intended for working with List data? Thank.

@saadp
saadp commented Aug 2, 2011

Simply amazing. Thanks for publishing this. It's pretty clear to me in how I can introduce Editors into my MVP implementation.

@slugmandrew

Thanks a lot for this. Really useful. I have one question though - is there a way of moving the RPC call part into the Presenter instead of having the logic in the View? I'm using GWTP and my action being there means I have to inject DispatchAsync and PlaceManager into the View as well as the Presenter - something I would rather not do. Is there a way around this?

@confile
confile commented Jan 29, 2016

The link is broken.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment