package com.google.collide.client.history;
import com.google.gwt.event.shared.EventHandler;
/**
* Handles navigating to a {@link Place}.
*
* Child {@link Place}s should be wired up when this handler is invoked.
*/
public abstract class PlaceNavigationHandler<E extends PlaceNavigationEvent<?>>
implements EventHandler {
/**
* Invoked when we navigate away from a particular Place. Logically equivalent
* to popping a Place off the Place stack.
*
* Subclasses should implement cleanup if any state leaks outside of the
* {@link Place}'s scope.
*/
protected void cleanup() {
// Empty default implementation.
}
/**
* Invoked when we navigate to a particular place that ALREADY IS ACTIVE on
* the Place stack. For example, if the current Place stack is "A/B/C" and we
* dispatch "B" on Place "A" then this method will be called. It is subtly
* different from {@link #enterPlace(PlaceNavigationEvent)} in that we have an
* opportunity to skip heavy weight setup code here that was run when
* {@link #enterPlace(PlaceNavigationEvent)} first navigated us to this place.
*
* <p>Note that the associated Place's scope is NOT RESET before invoking
* reEnterPlace by the Place framework.
*
* <p>reEnterPlace can be called any number of times and is NOT matched by calls
* to {@link #cleanup()} in the framework.
*
* <p>The Default implementation simply simulates a regular non-re-entrant
* dispatch. That is, a cleanup/enter pair with a call to reset the scope in
* between them. Concrete implementations have the opportunity to override
* this if they choose to short circuit expensive work done in
* {@link #enterPlace(PlaceNavigationEvent)}.
*
* @param navigationEvent the PlaceNavigationEvent associated with the
* navigation to the new {@link Place}.
* @param hasNewState whether or not the navigationEvent has new bookmarkable
* state.
*/
protected void reEnterPlace(E navigationEvent, boolean hasNewState) {
cleanup();
navigationEvent.getPlace().resetScope();
enterPlace(navigationEvent);
}
/**
* Invoked when we navigate to a particular place. Logically equivalent to
* pushing onto the Place stack. Code that runs within this method receives a
* {@link PlaceNavigationEvent} whose associated {@link Place} has a clean
* scope.
*
* All calls to enterPlace are matched by a call to {@link #cleanup()} before
* subsequent invocations if enterPlace.
*
* @param navigationEvent the PlaceNavigationEvent associated with the
* navigation to the new {@link Place}.
*/
protected abstract void enterPlace(E navigationEvent);
}