package fr.lteconsulting.hexa.client.application.archi; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.AcceptsOneWidget; /** * Associates a view, a place controller and an activity filter. * * <p> * The activity manager receives Places through its 'setPlace' method and * executes required checks before initializing the new activity. * * <p> * The activity manager is responsible of a part of the screen materialized * as the 'viewPlaceholder' field. */ public class ActivityManager<Place> { AcceptsOneWidget viewPlaceholder = null; Activity<Place> currentActivity = null; ActivityMapper<Place> activityMapper = null; ActivityFilter<Place> activityFilter = null; public void init( AcceptsOneWidget viewPlaceholder, ActivityMapper<Place> activityMapper ) { init( viewPlaceholder, activityMapper, null ); } public void init( AcceptsOneWidget viewPlaceholder, ActivityMapper<Place> activityMapper, ActivityFilter<Place> activityFilter ) { this.viewPlaceholder = viewPlaceholder; this.activityMapper = activityMapper; this.activityFilter = activityFilter; } public boolean mayStop() { if( currentActivity == null ) return true; String res = currentActivity.mayStop(); if( res != null ) { Window.alert( res ); return false; } return true; } public void setPlace( Place place, PlaceController<Place> placeController ) { Activity<Place> activity = activityMapper.getActivityForPlace( place ); Activity<Place> activityToStart = null; if( activityFilter != null ) activityToStart = activityFilter.canEnter( activity, place ); if( activityToStart == null ) activityToStart = activity; currentActivity = activityToStart; currentActivity.start( viewPlaceholder, placeController ); } }