Short summary:
I try to update a navigation bar after a place change event. To do so I created a GWTP Test*.java
that I try to render in a SLOT_NavBar
. However, this is not working. In order to see if I did something wrong I just made itself render in my SLOT_AdminToolMainContent
slot which is working perfectly fine. The question is why I can render TestView
in one slot but not in the other. GWTP is not giving me any clues about what I'm doing wrong here and I can't find anything in the documention that would help me out here.
I'm sure the problem must be either a misunderstanding from my side or something really stupid that I'm doing but I just fail to see the reason why this is not working.
I'm having here a "root" presenter:
AdminToolPresenter.java
public class AdminToolPresenter extends Presenter<AdminToolPresenter.MyView, AdminToolPresenter.MyProxy> {
public interface MyView extends View {
}
@ProxyStandard
@NameToken(AdminNameTokens.adminTool)
@UseGatekeeper(AdminGatekeeper.class)
public interface MyProxy extends ProxyPlace<AdminToolPresenter> {
}
/** */
public static final PermanentSlot<MenuPresenter> SLOT_Menu = new PermanentSlot<>();
/** */
public static final NestedSlot SLOT_AdminToolMainContent = new NestedSlot();
/** */
private MenuPresenter menuPresenter;
@Inject
public AdminToolPresenter(EventBus eventBus, MyView view, MyProxy proxy, MenuPresenter menuPresenter) {
super(eventBus, view, proxy, RevealType.RootLayout);
this.menuPresenter = menuPresenter;
}
@Override
protected void onBind() {
this.setInSlot(SLOT_Menu, this.menuPresenter);
}
@Override
protected void onReveal() {
LOGGER.fine("AdminToolPresenter.onReveal()");
}
}
and its view:
AdminToolView.java
public class AdminToolView extends ViewImpl implements AdminToolPresenter.MyView {
@SuppressWarnings("unused")
private final static Logger LOGGER = Logger.getLogger(AdminToolView.class.getName());
public interface Binder extends UiBinder<Widget, AdminToolView> {
}
@UiField HTMLPanel menuPanel;
@UiField SimplePanel adminMainContent;
@Inject
public AdminToolView(Binder uiBinder) {
this.initWidget(uiBinder.createAndBindUi(this));
this.bindSlot(AdminToolPresenter.SLOT_Menu, this.menuPanel);
this.bindSlot(AdminToolPresenter.SLOT_AdminToolMainContent, this.adminMainContent);
}
}
Everything I'm doing with this is working just fine for example:
TestPresenter.java
public class TestPresenter extends Presenter<TestPresenter.MyView, TestPresenter.MyProxy> implements TestUiHandlers {
private final static Logger LOGGER = Logger.getLogger(TestPresenter.class.getName());
interface MyView extends View , HasUiHandlers<TestUiHandlers> {
}
@NameToken(AdminNameTokens.test)
@ProxyStandard
interface MyProxy extends ProxyPlace<TestPresenter> {
}
@Inject
TestPresenter(EventBus eventBus, MyView view, MyProxy proxy) {
// This is working just fine. The content gets displayed correctly in the SLOT_AdminToolMainContent slot
super(eventBus, view, proxy, AdminToolPresenter.SLOT_AdminToolMainContent);
this.getView().setUiHandlers(this);
}
@Override
public void prepareFromRequest(PlaceRequest request) {
LOGGER.severe("prepareFromRequest");
super.prepareFromRequest(request);
}
}
TestView.java
class TestView extends ViewWithUiHandlers<TestUiHandlers> implements TestPresenter.MyView {
interface Binder extends UiBinder<Widget, TestView> {
}
@UiField SimplePanel main;
@Inject TestView(Binder uiBinder) {
this.initWidget(uiBinder.createAndBindUi(this));
}
}
No problem at all! However, if I try to bind this to another slot:
The issue
@Inject
TestPresenter(EventBus eventBus, MyView view, MyProxy proxy) {
// MenuPresenter.SLOT_NavBar instead of AdminToolPresenter.SLOT_AdminToolMainContent
super(eventBus, view, proxy, MenuPresenter.SLOT_NavBar);
this.getView().setUiHandlers(this);
}
Then it's simply doing nothing! I only changed the slot - so why is this not working? Here is the MenuPresenter
and related code:
MenuPresenter.java
public class MenuPresenter extends PresenterWidget<MenuPresenter.MyView> implements MenuUiHandlers {
private final static Logger LOGGER = Logger.getLogger(MenuPresenter.class.getName());
interface MyView extends View, HasUiHandlers<MenuUiHandlers> {
}
/** Slot for the navigation bar. */
public static final NestedSlot SLOT_NavBar = new NestedSlot();
@Inject
MenuPresenter(EventBus eventBus, MyView view) {
super(eventBus, view);
this.getView().setUiHandlers(this);
}
@Override
protected void onReveal() {
LOGGER.severe("onReveal()");
}
}
MenuView.java
class MenuView extends ViewWithUiHandlers<MenuUiHandlers> implements MenuPresenter.MyView {
interface Binder extends UiBinder<Widget, MenuView> {
}
@UiField HTMLPanel navBarPanel;
@UiField MaterialSideNav sideNav;
private PlaceManager placeManager;
@Inject MenuView(Binder uiBinder, PlaceManager placeManager) {
this.initWidget(uiBinder.createAndBindUi(this));
this.bindSlot(MenuPresenter.SLOT_NavBar, this.navBarPanel);
this.placeManager = placeManager;
}
}
MenuView.ui.xml
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui"
xmlns:m="urn:import:gwt.material.design.client.ui"
xmlns:m.addins="urn:import:gwt.material.design.addins.client.ui">
<ui:with field="tokens" type="com.mz.client.admin.place.AdminNameTokens"/>
<ui:style gss="true">
/* .. */
</ui:style>
<g:HTMLPanel ui:field="main">
<g:HTMLPanel addStyleNames="{style.navbar-wrapper}">
<g:SimplePanel ui:field="navBarPanel" />
</g:HTMLPanel>
<m:MaterialHeader>
<m:MaterialNavBar backgroundColor="white" activates="sideNav" layoutPosition="RELATIVE" addStyleNames="{style.nav-bar}">
<m:MaterialNavSection>
</m:MaterialNavSection>
</m:MaterialNavBar >
<m:MaterialSideNav ui:field="sideNav" m:id="sideNav" type="FIXED" alwaysShowActivator="true" width="280" addStyleNames="{style.side-nav}" >
<m:MaterialLink targetHistoryToken="{tokens.getHome}" iconType="HOME" iconPosition="LEFT" textColor="black" text="Home" />
</m:MaterialSideNav>
</m:MaterialHeader>
</g:HTMLPanel>
</ui:UiBinder>
Please explain to me why this is not working - it is driving me nuts. I'm not getting anything from GWTP like "dude, you're trying to do something strange here". No warning, error or info. Just nothing and I don't see what I do wrong here!
To give you an idea how this looks like: The blue bar is the <g:SimplePanel ui:field="navBarPanel"/>
which you see in MenuView: