javagwtwidgetgwt-placesgwt-activities

Adding to GWT RootPanel or just setting the default view?


I have the following GWT classes:

public class MyDefaultView extends Composite {
    // Uses UiBinder and just contains all the widgets for this view.
}

public class MyDefaultActivity extends AbstractActivity {
    @Inject
    private MyDefaultView myDefView;

    @Override
    public void start(AcceptsOneWidget panel, EventBus eventBus) {
        panel.setWidget(myDefView);
    }
}

public class MyActivityMapper implements ActivityMapper {
    @Override
    public Activity getActivity(Place place) {
        if(place instanceof MyDefaultPlace)
            return new MyDefaultActivity();
        else
            return null;
    }
}

public class MyAppModule implements EntryPoint {
    @Override
    public void onModuleLoad() {
        // Lots of initialization and wiring...

        // Why do I need this?!?
        MyDefaultView myDefaultView = GWT.create(MyDefaultView.class);
        RootPanel.add(myDefaultView);

        Place myDefaultPlace = GWT.create(MyDefaultPlace.class);

        PlaceHistoryHandler historyHandler = getHistoryHandler();
        historyHandler.register(myPlaceController, myEventBus, myDefaultPlace);
        historyHandler.handleCurrentHistory();
    }
}
  1. Why do I need to add MyDefaultView to RootPanel, if I'm just going to call PlaceHistoryHandler#handleCurrentHistory() and display MyDefaultView when the module loads?
  2. If I shouldn't be adding MyDefaultView directly to RootPanel, then what should I be adding?

Thanks in advance!


Solution

  • 1) You don't need to add MyDefaultView, but you need to a panel that implements AcceptsOneWidget and set that panel on the activity manager. This will take care of having your views made visible.

    2) In most applications you have a part of the application that is always visible. For example a bar at the top showing among other things the user name. This kind panel needs to be added to the root panel. In that panel on the position where your views should be visible a widget/panel that implements AcceptsOneWidget should be used. This widget should be set as display in your activityManager, via setDisplay. That widget will be passed to the start method in your activity. Here is how the code to use with the ActivityManager and RootPanel could look like:

    final ActivityManager activityManager = new ActivityManager(myActivityMapper, eventBus);
    
    activityManager.setDisplay(rootView.getViewPanel());
    Rootpanel.add(rootView);