@HistoryName("multiview")
public interface IMultiViewModule extends Mvp4gModule {
}
@Events(startPresenter = MultiViewPresenter.class, module = IMultiViewModule.class)
public interface IMultiViewEventBus extends EventBus {
@Event(forwardToParent = true)
void changeBody(IsWidget body);
@Event(handlers = MultiViewPresenter.class, navigationEvent = true, bind = { LookupDummyPresenter.class })
void goToMultiView();
}
public interface ILookupDummyView extends IChameleonWidget, ReverseViewInterface<ILookupDummyView.ILookupDummyPresenter> {
public interface ILookupDummyPresenter {
}
}
@Presenter( view = LookupDummyView.class )
public class LookupDummyPresenter extends BasePresenter<ILookupDummyView, EventBus> implements ILookupDummyPresenter {
}
@Singleton
public class LookupDummyView extends ChameleonDialog implements ILookupDummyView {
private ILookupDummyPresenter presenter;
public LookupDummyView() {
// empty constructor
}
@Override
public void setPresenter(ILookupDummyPresenter presenter) {
this.presenter = presenter;
}
@Override
public ILookupDummyPresenter getPresenter() {
return this.presenter;
}
}
public interface IMultiViewView extends IsWidget, LazyView, ReverseViewInterface<IMultiViewView.IMultiViewPresenter> {
public interface IMultiViewPresenter {
public Integer getSecretNumber();
}
}
@Presenter(view = IMultiViewView.class)
public class MultiViewPresenter extends LazyPresenter<IMultiViewView, IMultiViewEventBus> implements IMultiViewPresenter {
private Integer secretNumber = 88;
public void onGoToMultiView() {
eventBus.changeBody(view);
}
@Override
public Integer getSecretNumber() {
return secretNumber;
}
}
public class MultiViewView extends Composite implements IMultiViewView {
private IMultiViewPresenter presenter;
@Inject
protected LookupDummyView lookupDummyView;
public MultiViewView() {
GWT.log("empty...");
}
@Inject
public MultiViewView(LookupDummyView lookupDummyView) {
this.lookupDummyView = lookupDummyView;
GWT.log("lookup="+lookupDummyView);
}
@Override
public void createView() {
FlowLayoutContainer fContainer = new FlowLayoutContainer();
TextButton btn = new TextButton("Desktop Web Button");
btn.addSelectHandler(new SelectHandler() {
@Override
public void onSelect(SelectEvent event) {
Window.alert("Greetings from desktop web! Here is our secret number: "+presenter.getSecretNumber());
}
});
fContainer.add(btn);
initWidget(fContainer);
GWT.log("lookupDummyView="+lookupDummyView);
}
@Override
public void setPresenter(IMultiViewPresenter presenter) {
this.presenter = presenter;
}
@Override
public IMultiViewPresenter getPresenter() {
return this.presenter;
}
}
public class MultiViewViewMobile extends Composite implements IMultiViewView {
private IMultiViewPresenter presenter;
@Inject
protected LookupDummyView lookupDummyView;
@Override
public void createView() {
FlowLayoutContainer fContainer = new FlowLayoutContainer();
TextButton btn = new TextButton("Mobile Web Button");
btn.addSelectHandler(new SelectHandler() {
@Override
public void onSelect(SelectEvent event) {
Window.alert("Greetings from mobile web! Here is our secret number: "+presenter.getSecretNumber());
}
});
fContainer.add(btn);
initWidget(fContainer);
GWT.log("lookupDummyView="+lookupDummyView);
}
@Override
public void setPresenter(IMultiViewPresenter presenter) {
this.presenter = presenter;
}
@Override
public IMultiViewPresenter getPresenter() {
return this.presenter;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<module rename-to='mysample'>
<!-- Inherit the core Web Toolkit stuff. -->
<inherits name='com.google.gwt.user.User' />
<!-- Other module inherits -->
...
<inherits name='app.chameleon.sample.DeviceDetector' />
<!-- Specify the app entry point class. -->
<entry-point class='app.research.sample.client.MySample' />
<replace-with class="app.chameleon.sample.client.module.multiview.view.MultiViewView">
<when-type-is class="app.chameleon.sample.client.module.multiview.presenter.view.interfaces.IMultiViewView"/>
</replace-with>
<replace-with class="app.chameleon.sample.client.module.multiview.view.MultiViewViewMobile">
<when-type-is class="app.chameleon.sample.client.module.multiview.presenter.view.interfaces.IMultiViewView"/>
<when-property-is name="deviceDetector" value="mobile"/>
</replace-with>
<replace-with class="app.chameleon.sample.client.module.multiview.view.MultiViewViewMobile">
<when-type-is class="app.chameleon.sample.client.module.multiview.presenter.view.interfaces.IMultiViewView"/>
<when-property-is name="deviceDetector" value="tablet"/>
</replace-with>
</module>
@Inject
protected LookupDummyView lookupDummyView;
to get an instance of a view with mvp4g.
View and presenter creation is handled by the framework. Trying to create or using views without a presenter may lead to unexpected results. Although, mvp4g respects replacements rules.
Depending on the requirements, there are several solutions.
For example: if you want to show a dialog box, you can inform the MultiViewPresenter, fire an event which will be catch by the LookupDummyPresenter, which shows your dialog box.
We can try to set up a project, that fit your requirements.
Btw, the current GWT version is 2.8.2, I suggest using this version with Java 1.8. Personally I prefer Thomas Broyers Maven plugin, which is in my opinion the better one.
Frank
Trying to create or using views without a presenter may lead to unexpected results.
@Event(handlers = SeesawPresenter.class, navigationEvent = true, bind = { LookupDummyPresenter.class })
void goToSeesaw();
Btw, the current GWT version is 2.8.2, I suggest using this version with Java 1.8. Personally I prefer Thomas Broyers Maven plugin, which is in my opinion the better one.
Hi Frank,Any news on this workaround? I really need a solution for my requirement :
- Switch view based on device detector (if desktop then desktopView, if mobile then mobileView). All view will be using the same presenter (only one presenter).
- Each view contains a nested view which is injected by mvp4g.