Search code examples
javagwtuibindergwt-mvp

How to I properly use ActivityMapper/ActivityManager in order to position views displayed on a main page layout?


This app attempts to display its 3 views on the main display page, as follows:

  1. the AAAView at the "top of page"
  2. the BBBView at the "middle of page"
  3. the CCCView at the "bottom of page"

PROBLEM: Though the app runs, it does NOT position the views (i.e., "AAAView", "BBBView", "CCCView") as described above.

(For example, the "AAAView" is displayed at the "bottom of page" and the "BBBView" and "CCCView" are displayed in the "middle of page"...--Why is this?)

I assume that the problem is a result of my mis-using (misunderstanding?) the ActivityMapper/ActivityManager classes to place (or position) the views/panels properly on the main page.

Unfortunately, I have not been able to locate any comprehensive documentation on how to use the ActivityMapper/ActivityManager classes properly/effectively. (The examples apps I've seen thus far have generally been too complex for me to isolate exactly how the ActivityMapper/ActivityManager classes work to specify where a panel/view displays on a main page)

The code used in the app is shown, below...

(any advice or explanation of what I am doing wrong would be very appreciated.... --And, I imagine that I am not the only person struggling with this concept)

Thankyou for any help!!

/src/aaa/bbb/ccc/app.gwt.xml

<?xml version="1.0" encoding="UTF-8"?>
<module rename-to='app'>
    <inherits name='com.google.gwt.user.User' />
    <inherits name='com.google.gwt.user.theme.standard.Standard' />
    <inherits name="com.google.gwt.activity.Activity" />
    <inherits name="com.google.gwt.place.Place" />
    <entry-point class='aaa.bbb.ccc.client.AppEntryPoint' />
    <source path='client' />
    <source path='shared' />
</module>

/src/aaa/bbb/ccc/client/AppEntryPoint

package aaa.bbb.ccc.client;

import com.google.gwt.activity.shared.ActivityManager;

public class AppEntryPoint extends LayoutPanel implements EntryPoint
{

    private LayoutPanel mainView = null;

    interface AppEntryPointUiBinder extends UiBinder<LayoutPanel, AppEntryPoint>
    {
    }

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

    @UiField
    SimplePanel topOfPage;

    @UiField
    SimplePanel middleOfPage;

    @UiField
    SimplePanel bottomOfPage;

    public AppEntryPoint()
    {
        super();
    }

    AcceptsOneWidget top = new AcceptsOneWidget()
    {
        public void setWidget(IsWidget activityWidget)
        {
            Widget widget = Widget.asWidgetOrNull(activityWidget);
            mainView.setWidgetVisible(topOfPage, widget != null);
            topOfPage.setWidget(widget);
        }
    };

    AcceptsOneWidget mid = new AcceptsOneWidget()
    {
        public void setWidget(IsWidget activityWidget)
        {
            Widget widget = Widget.asWidgetOrNull(activityWidget);
            mainView.setWidgetVisible(middleOfPage, widget != null);
            middleOfPage.setWidget(widget);
        }
    };    

    AcceptsOneWidget bot = new AcceptsOneWidget()
    {
        public void setWidget(IsWidget activityWidget)
        {
            Widget widget = Widget.asWidgetOrNull(activityWidget);
            mainView.setWidgetVisible(bottomOfPage, widget != null);
            bottomOfPage.setWidget(widget);
        }
    };

    public void onModuleLoad()
    {
        ClientFactory clientFactory = GWT.create(ClientFactory.class);
        mainView = uiBinder.createAndBindUi(this);
        EventBus eventBus = clientFactory.getEventBus();

        ActivityMapper aaaActivityMapper = new AAAActivityMapper(clientFactory);
        ActivityManager aaaActivityManager = new ActivityManager(aaaActivityMapper, eventBus);
        aaaActivityManager.setDisplay(top);

        ActivityMapper bbbActivityMapper = new BBBActivityMapper(clientFactory);
        ActivityManager bbbActivityManager = new ActivityManager(bbbActivityMapper, eventBus);
        bbbActivityManager.setDisplay(mid);

        ActivityMapper cccActivityMapper = new CCCActivityMapper(clientFactory);
        ActivityManager cccActivityManager = new ActivityManager(cccActivityMapper, eventBus);
        cccActivityManager.setDisplay(bot);

        AppPlaceHistoryMapper historyMapper = GWT.create(AppPlaceHistoryMapper.class);

        PlaceController placeController = clientFactory.getPlaceController();
        PlaceHistoryHandler historyHandler = new PlaceHistoryHandler(historyMapper);
        historyHandler.register(placeController, eventBus, new AAAPlace());

        RootLayoutPanel.get().add(mainView);
        historyHandler.handleCurrentHistory();
    }
}

/src/aaa/bbb/ccc/client/AppEntryPoint.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:h='urn:import:aaa.bbb.ccc.client'>
    <ui:style src="app.css" />
    <g:LayoutPanel width="800" height='600'>
        <g:layer left='10%' right='10%' top='4px' height='10em'>
            <g:SimplePanel ui:field="topOfPage"/>
        </g:layer>
        <g:layer left='10%' right='10%' top='204px' height='10em'>
            <g:SimplePanel ui:field="middleOfPage"/>
        </g:layer>
        <g:layer left='10%' right='10%' top='404px' height='10em'>
            <g:SimplePanel ui:field="bottomOfPage"/>
        </g:layer>
    </g:LayoutPanel>
</ui:UiBinder>

/src/aaa/bbb/ccc/client/ClientFactory.java

package aaa.bbb.ccc.client;

import com.google.gwt.event.shared.EventBus;
import com.google.gwt.event.shared.SimpleEventBus;
import com.google.gwt.place.shared.PlaceController;

public class ClientFactory
{
    public ClientFactory()
    {
    }

    private static final EventBus eventBus = new SimpleEventBus();
    private static final PlaceController placeController = new PlaceController(eventBus);
    private static final AAAView aaaView = new AAAView();
    private static final BBBView bbbView = new BBBView();
    private static final CCCView cccView = new CCCView();

    public EventBus getEventBus()
    {
        return eventBus;
    }

    public PlaceController getPlaceController()
    {
        return placeController;
    }

    public AAAView getAAAView()
    {
        return aaaView;
    }

    public BBBView getBBBView()
    {
        return bbbView;
    }

    public CCCView getCCCView()
    {
        return cccView;
    }
}

/src/aaa/bbb/ccc/client/AppPlaceHistoryMapper.java

package aaa.bbb.ccc.client;

import com.google.gwt.place.shared.PlaceHistoryMapper;
import com.google.gwt.place.shared.WithTokenizers;

@WithTokenizers({AAAPlace.Tokenizer.class, BBBPlace.Tokenizer.class })
public interface AppPlaceHistoryMapper extends PlaceHistoryMapper
{
}

/src/aaa/bbb/ccc/client/AAAView.java

package aaa.bbb.ccc.client;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;

public class AAAView extends SimplePanel implements IsWidget, AcceptsOneWidget
{
    private final HTMLPanel aaaView;
    private Presenter presenter;

    private static AAAViewUiBinder uiBinder = GWT.create(AAAViewUiBinder.class);   
    interface AAAViewUiBinder extends UiBinder<HTMLPanel, AAAView>
    {
    }

    public AAAView()
    {
        aaaView = uiBinder.createAndBindUi(this);
    }

    @UiField
    Label aaaViewLabel;

    @UiField
    Button bbbButton;

    @UiHandler("bbbButton")
    void onBBBButtonClicked(ClickEvent event)
    {
        presenter.gotoBBBPlace();
    }

    @UiField
    Button cccButton;

    @UiHandler("cccButton")
    void onCCCButtonClicked(ClickEvent event)
    {
        presenter.gotoCCCPlace();
    }

    public void setName(String name)
    {
        aaaViewLabel.setText(name);
    }

    public void setPresenter(Presenter presenter)
    {
        this.presenter = presenter;
    }    
    public interface Presenter
    {
        void gotoBBBPlace();
        void gotoCCCPlace();
    }

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

/src/aaa/bbb/ccc/client/AAAView.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">
    <ui:style src="app.css" />
    <g:HTMLPanel  ui:field="aaaView" styleName='{style.aaaView}'>
        <g:Label  ui:field="aaaViewLabel" text="AAAView" styleName='{style.viewLabel}'></g:Label>
        <g:Button ui:field="bbbButton" text="go to bbbView"></g:Button>
        <g:Button ui:field="cccButton" text="go to cccView"></g:Button>
    </g:HTMLPanel>
</ui:UiBinder>

/src/aaa/bbb/ccc/client/AAAActivity.java

package aaa.bbb.ccc.client;

import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.ui.AcceptsOneWidget;

public class AAAActivity extends AbstractActivity implements AAAView.Presenter
{
    private String name = "...the AAAView...";    
    private final AAAView aaaView;
    private final PlaceController placeController;

    public AAAActivity(ClientFactory clientFactory)
    {
        aaaView = clientFactory.getAAAView();
        placeController = clientFactory.getPlaceController();
    }

    @Override
    public void start(AcceptsOneWidget panel, EventBus eventBus)
    {
        aaaView.setPresenter(this);
        aaaView.setName(name);
        panel.setWidget(aaaView.asWidget());
    }    

    @Override
    public void gotoBBBPlace()
    {
        placeController.goTo(new BBBPlace());
    }

    @Override
    public void gotoCCCPlace()
    {
        placeController.goTo(new CCCPlace());
    }    
}

/src/aaa/bbb/ccc/client/AAAActivityMapper.java

package aaa.bbb.ccc.client;

import com.google.gwt.activity.shared.Activity;
import com.google.gwt.activity.shared.ActivityMapper;
import com.google.gwt.place.shared.Place;

public class AAAActivityMapper implements ActivityMapper
{
    private ClientFactory clientFactory;

    public AAAActivityMapper(ClientFactory clientFactory)
    {
        this.clientFactory = clientFactory;
    }

    @Override
    public Activity getActivity(Place place)
    {

        if (place instanceof BBBPlace)
        {
            return new BBBActivity(clientFactory);//return bbbActivityMapper.getActivity(place);
        }
        else
        if (place instanceof CCCPlace)
        {
            return new CCCActivity(clientFactory);//return cccActivityMapper.getActivity(place);
        }

        return null;
    }
}

/src/aaa/bbb/ccc/client/AAAPlace.java

package aaa.bbb.ccc.client;

import com.google.gwt.place.shared.Place;
import com.google.gwt.place.shared.PlaceTokenizer;
import com.google.gwt.place.shared.Prefix;

public class AAAPlace extends Place
{
    private String aaaName = "AAAPlace";

    public AAAPlace()
    {
    }

    public String getAAAName()
    {
        return aaaName;
    }

    @Prefix("AAAPlace")
    public static class Tokenizer implements PlaceTokenizer<AAAPlace>
    {
        @Override
        public String getToken(AAAPlace place)
        {
            return place.getAAAName(); //"AAAName"; //place.getAAAName();
        }

        @Override
        public AAAPlace getPlace(String token)
        {
            return new AAAPlace();
        }
    }
}

/src/aaa/bbb/ccc/client/BBBView.java

package aaa.bbb.ccc.client;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;

public class BBBView extends SimplePanel implements IsWidget, AcceptsOneWidget
{
    private final HTMLPanel bbbView;
    private Presenter presenter;

    private static BBBViewUiBinder uiBinder = GWT.create(BBBViewUiBinder.class);    
    interface BBBViewUiBinder extends UiBinder<HTMLPanel, BBBView>
    {
    }

    public BBBView()
    {
        bbbView = uiBinder.createAndBindUi(this);
    }

    @UiField
    Label bbbViewLabel;

    @UiField
    Button aaaButton; 

    @UiHandler("aaaButton")
    void onAAAButtonClicked(ClickEvent event)
    {
        presenter.gotoAAAPlace();
    }

    @UiField
    Button cccButton; 

    @UiHandler("cccButton")
    void onCCCButtonClicked(ClickEvent event)
    {
        presenter.gotoCCCPlace();
    }

    public void setName(String name)
    {
        bbbViewLabel.setText(name);
    }

    public void setPresenter(Presenter presenter)
    {
        this.presenter = presenter;
    }    
    public interface Presenter
    {
        void gotoAAAPlace();
        void gotoCCCPlace();
    }

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

/src/aaa/bbb/ccc/client/BBBView.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">
    <ui:style src="app.css" />
    <g:HTMLPanel  ui:field="bbbView" styleName='{style.bbbView}'>
        <g:Label  ui:field="bbbViewLabel" text="BBBView" styleName='{style.viewLabel}'></g:Label>
        <g:Button ui:field="aaaButton" text="go to aaaView"></g:Button>
        <g:Button ui:field="cccButton" text="go to cccView"></g:Button>
    </g:HTMLPanel>
</ui:UiBinder> 

/src/aaa/bbb/ccc/client/BBBActivity.java

package aaa.bbb.ccc.client;

import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.ui.AcceptsOneWidget;

public class BBBActivity extends AbstractActivity implements BBBView.Presenter
{
    private String name = "...the BBBView...";    
    private final BBBView bbbView;
    private final PlaceController placeController;

    public BBBActivity(ClientFactory clientFactory)
    {
        bbbView = clientFactory.getBBBView();
        placeController = clientFactory.getPlaceController();
    }

    @Override
    public void start(AcceptsOneWidget panel, EventBus eventBus)
    {
        bbbView.setPresenter(this);
        bbbView.setName(name);
        panel.setWidget(bbbView.asWidget());
    }    

    @Override
    public void gotoAAAPlace()
    {
        placeController.goTo(new AAAPlace());
    }

    @Override
    public void gotoCCCPlace()
    {
        placeController.goTo(new CCCPlace());
    }
}

/src/aaa/bbb/ccc/client/BBBActivityMapper.java

package aaa.bbb.ccc.client;

import com.google.gwt.activity.shared.Activity;
import com.google.gwt.activity.shared.ActivityMapper;
import com.google.gwt.place.shared.Place;

public class BBBActivityMapper implements ActivityMapper
{
    private ClientFactory clientFactory;

    public BBBActivityMapper(ClientFactory clientFactory)
    {
        this.clientFactory = clientFactory;
    }

    @Override
    public Activity getActivity(Place place)
    {
        if (place instanceof AAAPlace)
        {
            return new AAAActivity(clientFactory);//aaaActivityMapper.getActivity(place);
        }
        else
        if (place instanceof CCCPlace)
        {
            return new CCCActivity(clientFactory);//return cccActivityMapper.getActivity(place);
        }

        return null;
    }
}

/src/aaa/bbb/ccc/client/BBBPlace.java

package aaa.bbb.ccc.client;

import com.google.gwt.place.shared.Place;
import com.google.gwt.place.shared.PlaceTokenizer;
import com.google.gwt.place.shared.Prefix;

public class BBBPlace extends Place
{
    private String bbbName = "BBBPlace";

    public BBBPlace()
    {
    }

    public String getBBBName()
    {
        return bbbName;
    }

    @Prefix("BBBPlace")
    public static class Tokenizer implements PlaceTokenizer<BBBPlace>
    {
        @Override
        public String getToken(BBBPlace place)
        {
            return place.getBBBName(); //"BBBName"; //place.getBBBName();
        }

        @Override
        public BBBPlace getPlace(String token)
        {
            return new BBBPlace();
        }
    }
}

/src/aaa/bbb/ccc/client/CCCView.java

package aaa.bbb.ccc.client;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;

public class CCCView extends SimplePanel implements IsWidget, AcceptsOneWidget
{
    private final HTMLPanel cccView;
    private Presenter presenter;

    private static CCCViewUiBinder uiBinder = GWT.create(CCCViewUiBinder.class);   
    interface CCCViewUiBinder extends UiBinder<HTMLPanel, CCCView>
    {
    }

    public CCCView()
    {
        cccView = uiBinder.createAndBindUi(this);
    }

    @UiField
    Label cccViewLabel;

    @UiField
    Button aaaButton;

    @UiHandler("aaaButton")
    void onAAAButtonClicked(ClickEvent event)
    {
        presenter.gotoAAAPlace();
    }

    @UiField
    Button bbbButton;

    @UiHandler("bbbButton")
    void onBBBButtonClicked(ClickEvent event)
    {
        presenter.gotoBBBPlace();
    }

    public void setName(String name)
    {
        cccViewLabel.setText(name);
    }

    public void setPresenter(Presenter presenter)
    {
        this.presenter = presenter;
    }    
    public interface Presenter
    {
        void gotoAAAPlace();
        void gotoBBBPlace();
    }

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

/src/aaa/bbb/ccc/client/BBBView.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">
    <ui:style src="app.css" />
    <g:HTMLPanel  ui:field="cccView" styleName='{style.cccView}'>
        <g:Label  ui:field="cccViewLabel" text="CCCView" styleName='{style.viewLabel}'></g:Label>
        <g:Button ui:field="aaaButton" text="go to aaaView"></g:Button>
        <g:Button ui:field="bbbButton" text="go to bbbView"></g:Button>
    </g:HTMLPanel>
</ui:UiBinder>

/src/aaa/bbb/ccc/client/CCCActivity.java

package aaa.bbb.ccc.client;

import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.ui.AcceptsOneWidget;

public class CCCActivity extends AbstractActivity implements CCCView.Presenter
{
    private String name = "...the CCCView...";    
    private final CCCView cccView;
    private final PlaceController placeController;

    public CCCActivity(ClientFactory clientFactory)
    {
        cccView = clientFactory.getCCCView();
        placeController = clientFactory.getPlaceController();
    }

    @Override
    public void start(AcceptsOneWidget panel, EventBus eventBus)
    {
        cccView.setPresenter(this);
        cccView.setName(name);
        panel.setWidget(cccView.asWidget());
    }    

    @Override
    public void gotoAAAPlace()
    {
        placeController.goTo(new AAAPlace());
    }

    @Override
    public void gotoBBBPlace()
    {
        placeController.goTo(new BBBPlace());
    }    
}

/src/aaa/bbb/ccc/client/CCCActivityMapper.java

package aaa.bbb.ccc.client;

import com.google.gwt.activity.shared.Activity;
import com.google.gwt.activity.shared.ActivityMapper;
import com.google.gwt.place.shared.Place;

public class CCCActivityMapper implements ActivityMapper
{
    private ClientFactory clientFactory;

    public CCCActivityMapper(ClientFactory clientFactory)
    {
        this.clientFactory = clientFactory;
    }

    @Override
    public Activity getActivity(Place place)
    {
        if (place instanceof AAAPlace)
        {
            return new AAAActivity(clientFactory);//return aaaActivityMapper.getActivity(place);
        }
        else
        if (place instanceof BBBPlace)
        {
            return new BBBActivity(clientFactory);//return aaaActivityMapper.getActivity(place);
        }

        return null;
    }
}

/src/aaa/bbb/ccc/client/CCCPlace.java

package aaa.bbb.ccc.client;

import com.google.gwt.place.shared.Place;
import com.google.gwt.place.shared.PlaceTokenizer;
import com.google.gwt.place.shared.Prefix;

public class CCCPlace extends Place
{
    private String cccName = "CCCPlace";

    public CCCPlace()
    {
    }

    public String getCCCName()
    {
        return cccName;
    }

    @Prefix("CCCPlace")
    public static class Tokenizer implements PlaceTokenizer<CCCPlace>
    {
        @Override
        public String getToken(CCCPlace place)
        {
            return place.getCCCName(); //"CCCName"; //place.getCCCName();
        }

        @Override
        public CCCPlace getPlace(String token)
        {
            return new CCCPlace();
        }
    }
}

/src/aaa/bbb/ccc/client/app.css

h1 {
    font-size: 2em;
    font-weight: bold;
    color: #777777;
    margin: 40px 0px 70px;
    text-align: center;
}

.aaaView {
    border-color: black;
    border-width: 2 px;
    background-color: navy;
    width: 75%;
    height: 25%;
}

.viewLabel {
    color:white;
    font-size: 24px; 
    font-style: italic;
    font-weight: bolder; 
    border-width: 2 px;
}

.bbbView {
    border-color: black;
    border-width: 2 px;
    background-color: blue;
    width: 75%;
    height: 25%;
}

.cccView {
    border-color: black;
    border-width: 2 px;
    background-color: lightblue;
    width: 75%;
    height: 25%;
}


.layer1 {
    border-color: red;
    border-width: 2 px;
    background-color: yellow;
    width: 100%;
    height: 33%;
}

.layer2 {
    border-color: teal;
    border-width: 2 px;
    background-color: green;
    width: 100%;
    height: 33%;
}

.layer3 {
    border-color: grey;
    border-width: 2 px;
    background-color: aqua;
    width: 100%;
    height: 33%;
}

.gwt-layer {
    border-color: grey;
    border-width: 2 px;
    background-color: aqua;
    width: 100%;
    height: 33%;    
}

/war/app.html

<!doctype html>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>app</title>
    <script type="text/javascript" language="javascript" src="app/app.nocache.js"></script>
  </head>
  <body>
    <iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"></iframe>
    <noscript>
      <div style="width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif">
        Your web browser must have JavaScript enabled
        in order for this application to display correctly.
      </div>
    </noscript>
  </body>
</html>

/war/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>app</display-name>
  <welcome-file-list>
    <welcome-file>app.html</welcome-file>
  </welcome-file-list>
</web-app>

Solution

  • The problem is in your ActivityMappers.

    When you go to an AAAPlace (which is the default place, so the one used when you don't have any history token in the URL):

    • AAAActivityMapper returns null which (given the aaaActivityManager) will hide the topOfPage area
    • BBBActivityMapper returns an AAAActivity, which will display the (singleton) AAAView in the middleOfPage area
    • CCCActivityMapper returns another AAAActivity, which will display the (singleton) AAAView in the bottomOfPage area Because the AAAView is a widget, it can only be shown at a single place at a time. And because it's a singleton, the last setWidget will win (it'll remove the widget from it's previous parent before adding it to the new one). Because you initialized cccActivityManager after bbbActivityManager, and event handlers are called in registration order, the bot will win. That leaves you with a hidden topOfPage, an empty middleOfPage (not hidden because mid was called with a non-empty value, but just after that bot is called with the same widget, and therefore steals it from middleOfPage to put it into bottomOfPage), and an AAAView in the bottomOfPage.

    Shameless plug: have a look at http://blog.ltgt.net/gwt-21-activities/ (and sibling articles about places and activities). I hope it'll help you understand how it all works.