package org.sigmah.client.ui.presenter.orgunit;
/*
* #%L
* Sigmah
* %%
* Copyright (C) 2010 - 2016 URD
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import org.sigmah.client.dispatch.CommandResultHandler;
import org.sigmah.client.inject.Injector;
import org.sigmah.client.page.Page;
import org.sigmah.client.page.PageRequest;
import org.sigmah.client.page.RequestParameter;
import org.sigmah.client.page.event.PageRequestEvent;
import org.sigmah.client.ui.presenter.base.AbstractPagePresenter;
import org.sigmah.client.ui.presenter.base.HasSubPresenter.SubPresenter;
import org.sigmah.client.ui.view.base.ViewInterface;
import org.sigmah.client.ui.zone.Zone;
import org.sigmah.shared.command.GetOrgUnit;
import org.sigmah.shared.dto.orgunit.OrgUnitDTO;
import com.allen_sauer.gwt.log.client.Log;
/**
* Abstract layer for OrgUnit presenters.
*
* @author Mehdi Benabdeslam (mehdi.benabdeslam@netapsys.fr)
* @author Denis Colliot (dcolliot@ideia.fr)
* @param <V>
* The view type.
*/
public abstract class AbstractOrgUnitPresenter<V extends AbstractOrgUnitPresenter.View> extends AbstractPagePresenter<V> implements
SubPresenter<OrgUnitPresenter> {
/**
* Description of the view managed by this presenter.
*/
public static interface View extends ViewInterface {
// No methods yet.
}
/**
* Presenters's initialization.
*
* @param view
* Presenter's view interface.
* @param injector
* Injected client injector.
*/
protected AbstractOrgUnitPresenter(final V view, final Injector injector) {
super(view, injector);
}
/**
* {@inheritDoc}
*/
@Override
public OrgUnitPresenter getParentPresenter() {
return injector.getOrgUnitPresenter();
}
/**
* {@inheritDoc}
*/
@Override
protected final void executeOnPageRequest(final PageRequestEvent event, final Page page) {
final PageRequest request = event.getRequest();
final Integer orgUnitId = request.getParameterInteger(RequestParameter.ID);
final OrgUnitDTO currentOrgUnit = getParentPresenter().getCurrentOrgUnit();
if (currentOrgUnit != null && orgUnitId.equals(currentOrgUnit.getId())) {
if (Log.isDebugEnabled()) {
Log.debug("OrgUnit #" + orgUnitId + " has already been loaded. No need to load it again.");
}
onOrgUnitLoaded(currentOrgUnit, event, page);
return;
}
dispatch.execute(new GetOrgUnit(orgUnitId, null), new CommandResultHandler<OrgUnitDTO>() {
@Override
public void onCommandSuccess(final OrgUnitDTO result) {
if (Log.isDebugEnabled()) {
Log.debug("OrgUnit #" + orgUnitId + " is not the current loaded OrgUnit. Loading it from server.");
}
onOrgUnitLoaded(result, event, page);
}
});
}
/**
* Method executed once OrgUnit has been loaded.
*
* @param loadedOrgUnit
* The loaded OrgUnit.
* @param event
* The page request event.
* @param page
* The accessed page.
*/
private void onOrgUnitLoaded(final OrgUnitDTO loadedOrgUnit, final PageRequestEvent event, final Page page) {
// Stores project instance into local attribute AND parent presenter.
getParentPresenter().setCurrentOrgUnit(loadedOrgUnit);
final PageRequest request = event.getRequest();
// Updates the tab title.
eventBus.updateZoneRequest(Zone.MENU_BANNER.requestWith(RequestParameter.REQUEST, request).addData(RequestParameter.HEADER, loadedOrgUnit.getName()));
// Executes child page 'onPageRequest()'.
afterOnPageRequest(event, page);
}
/**
* Returns the current {@link OrgUnitDTO}.
*
* @return The current {@link OrgUnitDTO}.
*/
protected final OrgUnitDTO getOrgUnit() {
return getParentPresenter().getCurrentOrgUnit();
}
}