I am using gwt editor framework to bind form in gwt. I was able to bind form successfully, but my problem is I need to write too many code. I think using generic will shorten my code but I couldn't do it.
The code for EditVendorWorkflow
is almost same, the only difference is this two line
interface Driver extends SimpleBeanEditorDriver<Vendor, VendorEditor>{}
private VendorEditor editor;
Example, If I write a PersonEditor
the corresponding EditPersonWorkflow
code will have
interface Driver extends SimpleBeanEditorDriver<Person, PersonEditor>{}
private PersonEditor editor;
So basically there is a repetition.
Any Help is appreciable.
public class EditVendorWorkflow{
interface Driver extends SimpleBeanEditorDriver<Vendor, VendorEditor>{}
Driver driver = GWT.create(Driver.class);
private VendorEditor editor;
void edit(Vendor p) {
driver.initialize(editor);
driver.edit(p);
}
void save() {
Vendor edited = driver.flush();
//doSomethingWithEditedVendor(edited);
}
public void initialize(VendorEditor editor) {
this.editor = editor;
}
}
public class VendorEditor extends Composite implements Editor<Vendor> {
private static VendorEditorUiBinder uiBinder = GWT
.create(VendorEditorUiBinder.class);
@UiField Button save;
@UiField TextBox address;
@UiField TextBox contactName;
@UiField ValueBoxEditorDecorator<String> contactMobileNo;
@Path("department.name")
@UiField TextBox deptName;
interface VendorEditorUiBinder extends UiBinder<Widget, VendorEditor> {
}
private final EditVendorWorkflow vendorDriver;
public VendorEditor(Vendor p) {
initWidget(uiBinder.createAndBindUi(this));
vendorDriver = GWT.create(EditVendorWorkflow.class);
vendorDriver.initialize(this);
vendorDriver.edit(p);
}
@UiHandler("save")
void onSaveClick(ClickEvent event) {
vendorDriver.save();
}
}
Something along the following lines should do the job:
public class EditWorkflow<O, E extends Editor<O>> {
SimpleBeanEditorDriver<O, E> driver;
private E editor;
void edit(O p) {
driver.initialize(editor);
driver.edit(p);
}
void save() {
O edited = driver.flush();
//doSomethingWithEditedObject(edited);
}
public void initialize(E editor, SimpleBeanEditorDriver<O, E> driver) {
this.editor = editor;
this.driver = driver;
}
}
But unfortunately, GWT.create()
can only accept a class literal, which cannot be generic. So, I guess still you have to create your Driver
interfaces somewhere. I added a driver
parameter to initialize()
so that you can call GWT.create()
outside and pass the result in.
If you have some codes that specific to Vendor
or Person
, you can abstract them in abstract methods like
protected abstract void doSomethingWithEditedObject(O object);
and implement them in subclasses of EditWorkflow
.
If you go on to create subclasses of EditWorkflow
, you can put Driver
interfaces inside their respective EditWorkflow
class
public class EditVendorWorkflow extends EditWorkflow<Vendor, VendorEditor> {
interface Driver extends SimpleBeanEditorDriver<Vendor, VendorEditor>{}
public void initialize(VendorEditor editor) {
super.initialize(editor, GWT.create(Driver.class));
}
@Override
protected void doSomethingWithEditedObject(Vendor object) {
// Code specific to class Vendor...
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With