I don't know mvp4g but what you describe is pretty normal. If you expose 
your widget as feature interfaces you would need to add a method per 
feature like:

Focusable getNameFocusable();
HasText getNameHasText();

Technically you can define more interfaces as "return value" by using 
generics:

<T extends Focusable & HasText> T getTextBox() {
  return (T) textbox; *//unchecked cast!*
}

which will allow you to access methods from both interfaces when calling 
view.getTextBox().someMethod() but I dont recommend it because the 
downsides are:
- you don't get a compile time error if textbox does not implement the 
interfaces T extends from because its an unchecked cast to T.
- you don't get a compile time error if you assign the return type to 
something different like HasEnabled enabled = view.getTextBox(). You could 
even write something like Person p = view.getTextBox() which is plain 
wrong. Also because of the unchecked cast to T.

So I tend to not use feature interfaces in my views. Instead of 
view.getNameTextBox().get/setText(String) I simply use 
view.get/setName(String). Its shorter, more meaningful and you dont have to 
struggle with a good name for a HasXYZ getter method (adding the widget 
class name or the feature interface name to the getter method name seems 
silly and something like view.getName().getText() also looks kind of silly 
to me). If I need to make the name focusable I would add 
view.setNameFocused(boolean). So yes, I would add a new method to the view, 
like you would add a new getter now.
In some cases I push the model class to the view like view.display(person) 
/ view.getPerson(). This allows you to implement some minor logic into the 
view and can help to keep the presenter a bit more cleaner. Some people 
dont like it because the view knows about the model but I am fine with it 
as it can be more practical.
For events I also dont use feature interfaces (e.g. HasClickHandlers). I 
define my own Delegate interface that contains event callback methods, like 
"onNameChanged", and then call view.setDelegate(delegate). This works 
pretty well with UiBinder's @UiHandler and in general it saves you a lot of 
anonymous classes in your presenter.

So short story: Add a new method to your interface as its the safest thing 
to do. If you think your presenter looks a bit ugly because of lengthly 
view.getX().get/setY() method calls, don't use the feature interfaces in 
your view and instead define methods that work with the concrete values, 
e.g. String getName, Date getBirthday(), setAddressFocused(boolean), ... 

Hope that helps.

-- J.

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/google-web-toolkit/-/gSuWnKbKhcQJ.
To post to this group, send email to google-web-toolkit@googlegroups.com.
To unsubscribe from this group, send email to 
google-web-toolkit+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-web-toolkit?hl=en.

Reply via email to