/*
* This file is part of LibrePlan
*
* Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e
* Desenvolvemento Tecnolóxico de Galicia
* Copyright (C) 2010-2011 Igalia, S.L.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.libreplan.web.planner.tabs;
import static org.libreplan.web.I18nHelper._;
import static org.libreplan.web.planner.tabs.MultipleTabsPlannerController.BREADCRUMBS_SEPARATOR;
import static org.libreplan.web.planner.tabs.MultipleTabsPlannerController.getSchedulingLabel;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.Validate;
import org.libreplan.business.orders.entities.Order;
import org.libreplan.business.planner.entities.TaskElement;
import org.libreplan.business.resources.daos.IResourcesSearcher;
import org.libreplan.web.montecarlo.MonteCarloController;
import org.libreplan.web.planner.order.OrderPlanningController;
import org.libreplan.web.planner.order.PlanningStateCreator;
import org.libreplan.web.planner.tabs.CreatedOnDemandTab.IComponentCreator;
import org.zkoss.ganttz.extensions.ITab;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Desktop;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zul.Image;
import org.zkoss.zul.Label;
/**
* @author Diego Pino Garcia <dpino@igalia.com>
*/
public class MonteCarloTabCreator {
private String ORDER_LIMITING_RESOURCES_VIEW = _("MonteCarlo Method");
public static ITab create(Mode mode,
PlanningStateCreator planningStateCreator,
MonteCarloController monteCarloController,
OrderPlanningController orderPlanningController,
Component breadcrumbs, IResourcesSearcher resourcesSearcher) {
return new MonteCarloTabCreator(mode, planningStateCreator,
monteCarloController, orderPlanningController, breadcrumbs,
resourcesSearcher)
.build();
}
private final Mode mode;
private final MonteCarloController monteCarloController;
private final OrderPlanningController orderPlanningController;
private final Component breadcrumbs;
private final IResourcesSearcher resourcesSearcher;
private final PlanningStateCreator planningStateCreator;
private MonteCarloTabCreator(Mode mode,
PlanningStateCreator planningStateCreator,
MonteCarloController MonteCarloController,
OrderPlanningController orderPlanningController,
Component breadcrumbs, IResourcesSearcher resourcesSearcher) {
Validate.notNull(resourcesSearcher);
Validate.notNull(planningStateCreator);
this.planningStateCreator = planningStateCreator;
this.mode = mode;
this.monteCarloController = MonteCarloController;
this.orderPlanningController = orderPlanningController;
this.breadcrumbs = breadcrumbs;
this.resourcesSearcher = resourcesSearcher;
}
private ITab build() {
return TabOnModeType.forMode(mode)
.forType(ModeType.GLOBAL, createGlobalMonteCarloTab())
.forType(ModeType.ORDER, createOrderMonteCarloTab())
.create();
}
private ITab createOrderMonteCarloTab() {
IComponentCreator componentCreator = new IComponentCreator() {
@Override
public org.zkoss.zk.ui.Component create(
org.zkoss.zk.ui.Component parent) {
Map<String, Object> arguments = new HashMap<String, Object>();
arguments.put("monteCarloController",
monteCarloController);
return Executions.createComponents(
"/montecarlo/_montecarlo.zul", parent, arguments);
}
};
return new CreatedOnDemandTab(ORDER_LIMITING_RESOURCES_VIEW,
"order-limiting-resources", componentCreator) {
@Override
protected void afterShowAction() {
List<TaskElement> criticalPath = orderPlanningController.getCriticalPath();
if (criticalPath == null) {
criticalPath = getCriticalPath(mode.getOrder(),
getDesktop());
}
monteCarloController.setCriticalPath(criticalPath);
breadcrumbs.getChildren().clear();
breadcrumbs.appendChild(new Image(BREADCRUMBS_SEPARATOR));
breadcrumbs.appendChild(new Label(getSchedulingLabel()));
breadcrumbs.appendChild(new Image(BREADCRUMBS_SEPARATOR));
breadcrumbs
.appendChild(new Label(ORDER_LIMITING_RESOURCES_VIEW));
breadcrumbs.appendChild(new Image(BREADCRUMBS_SEPARATOR));
breadcrumbs.appendChild(new Label(mode.getOrder().getName()));
}
};
}
private List<TaskElement> getCriticalPath(final Order order, final Desktop desktop) {
CriticalPathBuilder builder = CriticalPathBuilder.create(
planningStateCreator, resourcesSearcher);
return builder.getCriticalPath(order, desktop);
}
private ITab createGlobalMonteCarloTab() {
final IComponentCreator componentCreator = new IComponentCreator() {
@Override
public org.zkoss.zk.ui.Component create(
org.zkoss.zk.ui.Component parent) {
// do nothing
return null;
}
};
return new CreatedOnDemandTab(_("MonteCarlo Method"),
"montecarlo-simulation", componentCreator) {
@Override
protected void afterShowAction() {
// do nothing
}
};
}
}