To test I created a new view for Address without presenter injected into
constructor.
And the Address View is not injected into the TerceroEditor view.

And things are just fine.

This works well:

   @UiField
  AddressEditor2 address;  *//AddressEditor is a concrete class.*

  private final TerceroNewView.Presenter presenter;

  @Inject
  public TerceroEditor(  *//Note: not inject sub-view AddressView, UiBinder
make a implementation*
      @Named(Constans.TerceroNewPresenter) TerceroNewView.Presenter
presenter) {

    this.presenter = presenter;
    ini();
  }

  private void ini(){
    root = uiBinder.createAndBindUi(this);
    res.erpLgkStyle().ensureInjected();
    presenter.onCreate(this);
  }


TerceroNewEditor.ui.xml part:
   ...
   ...
   <l:AddressEditor2 ui:field="address"></l:AddressEditor2>
   ...
   ...

//AddressView implements Editor<AddressProxy>

public class AddressEditor2 extends Composite implements AddressView {

  private static AddressEditor2UiBinder uiBinder =
GWT.create(AddressEditor2UiBinder.class);

  interface AddressEditor2UiBinder extends UiBinder<Widget, AddressEditor2>
{
  }

  private HTMLPanel root;

  private AddressView.Presenter presenter;

  @UiField
  ValueBoxEditorDecorator<String> address;

  @UiField
  ValueBoxEditorDecorator<Integer> number;

  @UiField
  ValueBoxEditorDecorator<String> code;

  public AddressEditor2() {
    initWidget(uiBinder.createAndBindUi(this));
  }
}

*
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*
*
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*
*
*
If you inject the View with a Provider or AsyncProvider or directly not send
the information of Address.
This does not work:

   @ UiField (provided = true)
   AddressView address *//AddressView is a interface that
Implements Editor<AddressProxy>*

   private final TerceroNewView.Presenter presenter;

@Inject
public TerceroEditor(
      *Provider<AddressView> addressView,*
      @Named(Constans.TerceroNewPresenter) TerceroNewView.Presenter
presenter) {

   * this.address = addressView.get();*
    this.presenter = presenter;
    ini();
 }

private void ini(){
    root = uiBinder.createAndBindUi(this);
    res.erpLgkStyle().ensureInjected();
    presenter.onCreate(this);
}


  TerceroNewEditor.ui.xml part:
   ...
   ...
   <l:AddressView ui:field="address"></l:AddressView>
   ...
   ...

//AddressView implemens Editor<AddressProxy>
public class AddressEditor implements AddressView {

  interface AddressWidgetUiBinder extends UiBinder<HTMLPanel, AddressView> {
  }

  private static AddressWidgetUiBinder uiBinder =
GWT.create(AddressWidgetUiBinder.class);

  private HTMLPanel root;

  private AddressView.Presenter presenter;

  @UiField
  ValueBoxEditorDecorator<String> address;

  @UiField
  ValueBoxEditorDecorator<Integer> number;

  @UiField
  ValueBoxEditorDecorator<String> code;

  @Inject
  public AddressEditor(
      @Named(Constans.AddressNewPresenter) AddressView.Presenter presenter)
{

    this.presenter = presenter;
    init();
  }

  private void init(){
    root = uiBinder.createAndBindUi(this);
    presenter.onCreate(this);
  }

  @Override
  public Widget asWidget() {
    return root;
  }
}

*Gin Module*
*
*
public class ViewModule extends AbstractGinModule {

  @Override
  protected void configure() {
    ....
    ....

    *bind(AddressView.class).to(AddressEditor.class).in(Singleton.class);*
   * bind(TerceroNewView.class).to(TerceroEditor.class).in(Singleton.class);
*

    .....
    .....

 *
bind(TerceroNewView.Presenter.class).annotatedWith(Names.named(Constans.TerceroNewPresenter)).to(TerceroNewEditorPresenter.class);
*
*
bind(AddressView.Presenter.class).annotatedWith(Names.named(Constans.AddressNewPresenter)).to(AddressNewPresenter.class);
*

  }
}



A.U.S Cristian Rinaldi

Teléfono Móvil: (0342) 155 238 083

www.logikas.com

Lisandro de la Torre 2643 Of 5 - 3000 - Santa Fe

Teléfono Fijo: (0342) 483 5138







2011/10/26 Cristian Rinaldi <[email protected]>

> Tanks Thomas for response.
> The rare is that AddressView implements Editor<AddreessProxy>
>
> I put the codes below:
>
> *Extract for TerceroNewView*
>
> public interface TerceroNewView extends View, Editor<TercerosProxy> {
>   public interface Presenter extends MutablePresenter<TerceroNewView>{
>
>   }
>
>   RequestFactoryEditorDriver<TercerosProxy, ? extends
> Editor<TercerosProxy>> createEditorDriver(
>       RequestFactory rf);
> }
> *
> *
> *
> *
> *Extract for TerceroEditor*
>
> public class TerceroEditor implements TerceroNewView {
>
>   private static TerceroEditorUiBinder uiBinder =
> GWT.create(TerceroEditorUiBinder.class);
>
>   interface TerceroEditorUiBinder extends UiBinder<SimplePanel,
> TerceroEditor> {
>   }
>
>   interface Driver extends RequestFactoryEditorDriver<TercerosProxy,
> TerceroEditor> {
>   }
>
>   private SimplePanel root;
>
>   @UiField
>   ClientResource res;
>
>   @UiField
>   ValueBoxEditorDecorator<String> name;
>
>   @UiField
>   ValueBoxEditorDecorator<String> lastName;
>
>   @UiField(provided = true)
>   AddressView address;
>
>   private final TerceroNewView.Presenter presenter;
>
>   @Inject
>   public TerceroEditor(
>       AsyncProvider<AddressView> addressView,
>       @Named(Constans.TerceroNewPresenter) TerceroNewView.Presenter
> presenter) {
>
>     this.presenter = presenter;
>
>     addressView.get(new AsyncCallback<AddressView>() {
>       @Override
>       public void onSuccess(AddressView result) {
>         address = result;
>         ini();
>
>       }
>       @Override
>       public void onFailure(Throwable caught) {
>       }
>     });
>   }
>
>   private void ini(){
>     root = uiBinder.createAndBindUi(this);
>     res.erpLgkStyle().ensureInjected();
>     presenter.onCreate(this);
>   }
>
>   .....
>   .....
> }
>
> *Extract for AddressView:*
>
>   public interface AddressView extends View, Editor<AddressProxy>{
>
>      public interface Presenter extends MutablePresenter<AddressView>{
>
>      }
>
>      HasConstrainedValue<CityProxy> getCitys();
>   }
>
>  *Extract for AddressEditor:*
>
> public class AddressEditor implements AddressView {
>
>   interface AddressWidgetUiBinder extends UiBinder<HTMLPanel,
> AddressEditor> {
>   }
>
>   interface Driver extends RequestFactoryEditorDriver<AddressProxy,
> AddressEditor> {
>   }
>
>   private static AddressWidgetUiBinder uiBinder =
> GWT.create(AddressWidgetUiBinder.class);
>
>   private HTMLPanel root;
>
>   private AddressView.Presenter presenter;
>
>   @UiField
>   ValueBoxEditorDecorator<String> address;
>
>   @UiField
>   ValueBoxEditorDecorator<Integer> number;
>
>   @UiField
>   ValueBoxEditorDecorator<String> code;
>
>   @UiField(provided = true)
>   SelectorCityView city;
>
>
>   @Inject
>   public AddressEditor(
>       AsyncProvider<SelectorCityView> selectorCity,
>       @Named(Constans.AddressNewPresenter) AddressView.Presenter presenter)
> {
>
>     this.presenter = presenter;
>
>     // TODO ver si hay otra forma de inicializar las vistas
>     selectorCity.get(new AsyncCallback<SelectorCityView>() {
>       @Override
>       public void onSuccess(SelectorCityView result) {
>         city = result;
>         init();
>       }
>
>       @Override
>       public void onFailure(Throwable caught) {
>       }
>     });
>   }
>
>   private void init(){
>     root = uiBinder.createAndBindUi(this);
>     presenter.onCreate(this);
>   }
> ...
> ...
> }
>
> *Extract for TerceroNewPresenter*
>
> public class TerceroNewEditorPresenter implements TerceroNewView.Presenter
> {
>
>   private final PlaceController placeController;
>   private final ErpRequestFactory requestFactory;
>
>   private RequestFactoryEditorDriver<TercerosProxy, ? extends
> Editor<TercerosProxy>> terceroDriver;
>
>   @Inject
>   public TerceroNewEditorPresenter(final AddressNewPresenter
> addressPresenter,
>       final ErpRequestFactory requestFactory, final PlaceController
> placeController) {
>
>     this.placeController = placeController;
>     this.requestFactory = requestFactory;
>   }
>
>   @Override
>   public void goTo(Place place) {
>     placeController.goTo(place);
>   }
>
>   @Override
>   public void save() {
>
>     RequestContext context = terceroDriver.flush();
>
>     boolean hasClientErrors = terceroDriver.hasErrors();
>
>     if (!hasClientErrors) {
>
>       context.fire(new Receiver<Void>() {
>
>         @Override
>         public void onSuccess(Void response) {
>           placeController.goTo(new DefaultPlace());
>         }
>
>         @Override
>         public void onViolation(Set<Violation> errors) {
>           terceroDriver.setViolations(errors);
>         }
>
>         @Override
>         public void onConstraintViolation(Set<ConstraintViolation<?>>
> violations) {
>           terceroDriver.setConstraintViolations(violations);
>         }
>
>       });
>     }
>   }
>
>   @Override
>   public void onCreate(final TerceroNewView view) {
>
>     terceroDriver = view.createEditorDriver(requestFactory);
>
>     TercerosRequest context = requestFactory.getTercerosRequest();
>
>     TercerosProxy tercero = context.create(TercerosProxy.class);
>
>     AddressProxy address = context.create(AddressProxy.class);
>
>     tercero.setAddress(address);
>
>     context.persist(tercero).with(terceroDriver.getPaths());
>
>     terceroDriver.edit(tercero, context);
>   }
> ...
> ...
> }
>
>
> *Extract for GIN configurations:*
>
> bind(TerceroNewView.class).to(TerceroEditor.class).in(Singleton.class);
> bind(AddressView.class).to(AddressEditor.class).in(Singleton.class);
>
>
> Data sent by Client to Server
>
>
> {"F":"com.logikas.erp.shared.request.ErpRequestFactory","O":[{"T":"oNrI9YUtkvx6RRVjmYN2ooLeKvQ=","P":{"lastName":"Rinaldi","address":{"T":"jVTUhBxMFgABvM07abYHRgwY8ps=","R":"1","C":2},"name":"Cristian"},"C":1,"R":"1","O":"PERSIST"},{"T":"jVTUhBxMFgABvM07abYHRgwY8ps=","C":2,"R":"1","O":"PERSIST"}],"I":[{"P":[{"T":"oNrI9YUtkvx6RRVjmYN2ooLeKvQ=","R":"1","C":1}],"R":["address"],"O":"tNTGSDAwvU0DpOikzbM$SKIPFQw="}]}
>
> Data sent by Server to Client
>
> {"X":[{"T":"{javax.validation.constraints.NotNull.message}","P":"code","R":{"T":"jVTUhBxMFgABvM07abYHRgwY8ps=","R":"1","C":2},"L":{"T":"jVTUhBxMFgABvM07abYHRgwY8ps=","R":"1","C":2},"M":"no
> puede ser null"},
> {"T":"{javax.validation.constraints.NotNull.message}","P":"address","R":{"T":"jVTUhBxMFgABvM07abYHRgwY8ps=","R":"1","C":2},"L":{"T":"jVTUhBxMFgABvM07abYHRgwY8ps=","R":"1","C":2},"M":"no
> puede ser null"},
> {"T":"{javax.validation.constraints.NotNull.message}","P":"number","R":{"T":"jVTUhBxMFgABvM07abYHRgwY8ps=","R":"1","C":2},"L":{"T":"jVTUhBxMFgABvM07abYHRgwY8ps=","R":"1","C":2},"M":"no
> puede ser null"}]}
>
> About other question, tanks for sugestion.
>
> Regards
>
> A.U.S Cristian Rinaldi
>
> Teléfono Móvil: (0342) 155 238 083
>
> www.logikas.com
>
> Lisandro de la Torre 2643 Of 5 - 3000 - Santa Fe
>
> Teléfono Fijo: (0342) 483 5138
>
>
>
>
>
>
>
> 2011/10/26 Thomas Broyer <[email protected]>
>
>>
>>
>> On Tuesday, October 25, 2011 10:33:55 PM UTC+2, Cristian Rinaldi wrote:
>>>
>>> Thomas, thanks for the fast responce. I will see if this is causing the
>>> error.
>>>
>>> AddressWidget implements AddressView and Editor for AddressProxy, you say
>>> that the AddressView must be extend Editor?
>>>
>>
>> I'm saying that the type of the "address" field in type TerceroEditor does
>> not implement Editor (or IsEditor), so the Editor framework does not treat
>> it as an editor. You'll either have to change it to AddressWidget, or make
>> AddressView extend Editor.
>>
>> Now, one design question.
>>>
>>> I love MVP, this pattern is very powerfull but, with Activities and Place
>>> some thing are dificult.
>>>
>>> Activities are for when you need navigation, but if want each view has a
>>> Presenter, I thought the following:
>>>
>>>    One interface Presenter for each View, where "View" delegate the logic
>>> in the presenter implementation.
>>>    Now, presenter is not Activity. When I need navigation, I make a
>>> Activity that inject the presenter and delegate in this the logic of View.
>>>
>>>    I want keep separate in the best forms the concepts of view and
>>> presenter, but I want to know if inject the presenter in view is ok.
>>>   The presenter have a method called onCreate(T) where T is a View. That
>>> method is called when View is initialized after make UiBinder interface.
>>>   In the onCreate(T) I inicialize the editor driver, etc.
>>>
>>>   When I precise a Activity, in the start method I obtain the view, by
>>> example, with AsyncProvider, how the View inject Presenter, the Activity
>>> delegate logic to Presenter.
>>>
>>>  I started think this for nested complex widget, for example, load
>>> Employees associated with bank accounts, where the Widgets for list of
>>> selection and creation bank account is a widget that delegate logic in a
>>> presenter that is not Activity.
>>>  But, i can use this widget alone in other view where is necesary one
>>> Activity.
>>>
>>>   All this is fine or I've gone crazy?
>>>
>>
>> I'm not sure I understood what you're coming with. All I can say is that
>> my activities are presenters, and in a few cases where a complex "component"
>> is to be reused, I have a presenter and view for it that's not an activity.
>> I also inject my views within my presenters in their constructors, and the
>> presenters "inject themselves" into their view when needed (when the
>> activity starts, in my case); this allows the views to have longer lifetime
>> as the presenters, because I use short-lived presenters and singleton views.
>>
>
>

-- 
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.

Reply via email to