All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jpattern.gwt.client.presenter.APresenter Maven / Gradle / Ivy

package com.jpattern.gwt.client.presenter;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.google.gwt.user.client.ui.HasWidgets;
import com.jpattern.gwt.client.navigationevent.INavigationEvent;
import com.jpattern.gwt.client.navigationevent.INavigationEventCallback;
import com.jpattern.gwt.client.navigationevent.INavigationEventData;
import com.jpattern.gwt.client.navigationevent.NullNavigationEventData;
import com.jpattern.gwt.client.view.IShowViewStrategy;
import com.jpattern.gwt.client.view.IView;
import com.jpattern.shared.result.IErrorMessage;

/**
 * 
 * @author Francesco Cina'
 *
 * 14 Apr 2011
 */

public abstract class APresenter implements IPresenter {
	
	private final IShowViewStrategy showViewStrategy;
	private IPresenter parentPresenter;
	private final INavigationEvent navigationEvent;
	private final Map registeredNavigationEvents = new HashMap();

	public APresenter(IShowViewStrategy showViewStrategy, INavigationEvent navigationEvent) {
		this.showViewStrategy = showViewStrategy;
		this.navigationEvent = navigationEvent;
		showViewStrategy.getView().visit(this);
	}
	
	@Override
	public final void onEventError(List errorMessages) {
		showViewStrategy.getView().getErrorArea().addErrorMessages(errorMessages);
	}
	
	@Override
	public final void onEventStart() {
		showViewStrategy.getView().getErrorArea().clear();
	}
	
	@Override
	public final T getView() {
		return showViewStrategy.getView();
	}
	
	/**
	 * This is the first step performed to a complete visualization of the associated IView.
	 * This is performed just before the IShowViewStrategy.onLoadStart() method.
	 * This method is called before the display of the IView.
	 * DO NOT perform asynchronous actions in this method.
	 */
	public abstract void preDisplay();
	
	/**
	 * This is the second step performed to a complete visualization of the associated IView
	 * This method is called just after the IShowViewStrategy.onLoadStart() method and before the
	 * IShowViewStrategy.onLoadCompleted() method.
	 * Here the asynchronous actions should be performed.
	 * Its VERY important to call the render() method when all the actions are performed otherwise
	 * the IView should not be completely rendered. 
	 */
	public abstract void postDisplay();

	/**
	 * This method must be called when all the necessary operations to load necessary data are ended.
	 * This causes the final rendering of the IView. 
	 */
	@Override
	public final void render() {
		showViewStrategy.onLoadCompleted();
	}
	
	@Override
	public final void render(IPresenter parentPresenter) {
		this.parentPresenter = parentPresenter;
		showViewStrategy.onLoadCompleted(getParentPresenter().getNavigationEventData(getNavigationEvent().getName()).getEventTarget());
	}

	@Override
	public void setParent(IPresenter parentPresenter) {
		this.parentPresenter = parentPresenter;
	}
	
	@Override
	public final void init() {
		preDisplay();
		showViewStrategy.onLoadStart(getParentPresenter().getNavigationEventData(getNavigationEvent().getName()).getEventTarget());
		postDisplay();
	}
	
	@Override
	public final void hierarchy(List hierarchyResult) {
		getParentPresenter().hierarchy(hierarchyResult);
		hierarchyResult.add(this);
	}
	
	@Override
	public final void registerNavigationEvent(INavigationEvent navigationEvent, HasWidgets eventTarget, INavigationEventCallback navigationEventCallback) {
		registeredNavigationEvents.put(navigationEvent.getName(), new NavigationEventData(navigationEvent, eventTarget, navigationEventCallback));
	}
	
	@Override
	public final IPresenter launchNavigationEvent(String navigationEventName, boolean registerHistory) {
		if (registeredNavigationEvents.containsKey(navigationEventName)) {
			return localLaunchNavigationEvent(navigationEventName, registerHistory);
		}
		return getParentPresenter().launchNavigationEvent(navigationEventName, registerHistory);
	}
	
	@Override
	public final IPresenter launchNavigationEvent(String navigationEventName, boolean registerHistory, String parentName) {
		if (getNavigationEvent().getName().equals(parentName)) {
			return localLaunchNavigationEvent(navigationEventName, registerHistory);
		}
		return getParentPresenter().launchNavigationEvent(navigationEventName, registerHistory, parentName);
	}
	
	private IPresenter localLaunchNavigationEvent(String navigationEventName, boolean registerHistory){
		if (registeredNavigationEvents.containsKey(navigationEventName)) {
			NavigationEventData eventData = registeredNavigationEvents.get(navigationEventName);
			IPresenter newPresenter = eventData.getNavigationEvent().launch(this, registerHistory);
			eventData.getNavigationEventCallback().callback();
			return newPresenter;
		}
		return new NullPresenter();
	}
	
	@Override
	public final INavigationEventData getNavigationEventData(String navigationEventName) {
		if (registeredNavigationEvents.containsKey(navigationEventName)) {
			return registeredNavigationEvents.get(navigationEventName);
		}
		return new NullNavigationEventData();
	}

	
	public IPresenter getParentPresenter() {
		if (parentPresenter==null) {
			parentPresenter = new NullPresenter();
		}
		return parentPresenter;
	}


	@Override
	public final INavigationEvent getNavigationEvent() {
		return navigationEvent;
	}


	class NavigationEventData implements INavigationEventData {
		
		private final INavigationEvent navigationEvent;
		private final INavigationEventCallback navigationEventCallback;
		private final HasWidgets eventTarget;

		NavigationEventData(INavigationEvent navigationEvent, HasWidgets eventTarget, INavigationEventCallback navigationEventCallback) {
			this.navigationEvent = navigationEvent;
			this.eventTarget = eventTarget;
			this.navigationEventCallback = navigationEventCallback;
		}

		@Override
		public INavigationEvent getNavigationEvent() {
			return navigationEvent;
		}

		@Override
		public INavigationEventCallback getNavigationEventCallback() {
			return navigationEventCallback;
		}

		@Override
		public HasWidgets getEventTarget() {
			return eventTarget;
		}
		
	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy