/*
* 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-2013 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 org.libreplan.business.common.exceptions.InstanceNotFoundException;
import org.libreplan.business.orders.daos.IOrderDAO;
import org.libreplan.business.orders.entities.Order;
import org.libreplan.business.orders.entities.OrderElement;
import org.libreplan.business.planner.entities.TaskElement;
import org.libreplan.web.common.FilterUtils;
import org.libreplan.web.common.Util;
import org.libreplan.web.planner.company.CompanyPlanningController;
import org.libreplan.web.planner.order.OrderPlanningController;
import org.libreplan.web.planner.tabs.CreatedOnDemandTab.IComponentCreator;
import org.libreplan.web.security.SecurityUtils;
import org.zkoss.ganttz.extensions.ICommandOnTask;
import org.zkoss.ganttz.extensions.IContextWithPlannerTask;
import org.zkoss.ganttz.extensions.ITab;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zul.Image;
import org.zkoss.zul.Label;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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;
/**
* @author Óscar González Fernández <ogonzalez@igalia.com>
* @author Lorenzo Tilve Álvaro <ltilve@igalia.com>
*/
public class PlanningTabCreator {
public static final int MAX_ORDERNAME_LENGTH = 90;
private final Mode mode;
private final CompanyPlanningController companyPlanningController;
private final Component breadcrumbs;
private final OrderPlanningController orderPlanningController;
private final IOrderDAO orderDAO;
private final Map<String, String[]> parameters;
private MultipleTabsPlannerController tabsController;
public static ITab create(Mode mode,
CompanyPlanningController companyPlanningController,
OrderPlanningController orderPlanningController,
IOrderDAO orderDAO,
Component breadcrumbs,
Map<String, String[]> parameters,
MultipleTabsPlannerController tabsController) {
return new PlanningTabCreator(mode, companyPlanningController,
orderPlanningController, breadcrumbs, orderDAO, parameters,
tabsController).create();
}
private PlanningTabCreator(Mode mode,
CompanyPlanningController companyPlanningController,
OrderPlanningController orderPlanningController,
Component breadcrumbs,
IOrderDAO orderDAO,
Map<String, String[]> parameters,
MultipleTabsPlannerController tabsController) {
this.mode = mode;
this.companyPlanningController = companyPlanningController;
this.orderPlanningController = orderPlanningController;
this.breadcrumbs = breadcrumbs;
this.orderDAO = orderDAO;
this.parameters = parameters;
this.tabsController = tabsController;
}
private ITab create() {
return TabOnModeType.forMode(mode)
.forType(ModeType.GLOBAL, createGlobalPlanningTab())
.forType(ModeType.ORDER, createOrderPlanningTab())
.create();
}
private ITab createGlobalPlanningTab() {
final IComponentCreator componentCreator = new IComponentCreator() {
@Override
public org.zkoss.zk.ui.Component create(org.zkoss.zk.ui.Component parent) {
List<ICommandOnTask<TaskElement>> commands = new ArrayList<>();
ICommandOnTask<TaskElement> scheduleCommand = buildScheduleCommand();
commands.add(scheduleCommand);
ICommandOnTask<TaskElement> orderDetailsCommand = buildOrderDetailsCommand();
commands.add(orderDetailsCommand);
// TODO: Revert removal of ResourcesLoad and AdvancedAllocation
// context entries when save and cancel commands are refactored
companyPlanningController.setAdditional(commands);
companyPlanningController.setTabsController(tabsController);
companyPlanningController.setDoubleClickCommand(scheduleCommand);
HashMap<String, Object> args = new HashMap<>();
args.put("companyPlanningController", companyPlanningController);
companyPlanningController.setURLParameters(parameters);
return Executions.createComponents("/planner/_company.zul", parent, args);
}
private ICommandOnTask<TaskElement> buildScheduleCommand() {
return new ICommandOnTask<TaskElement>() {
@Override
public void doAction(IContextWithPlannerTask<TaskElement> context, TaskElement task) {
OrderElement orderElement = task.getOrderElement();
if (orderElement instanceof Order) {
Order order = (Order) orderElement;
mode.goToOrderMode(order);
}
}
@Override
public String getName() {
return _("Schedule");
}
@Override
public String getIcon() {
return "/common/img/ico_menu_scheduling.png";
}
@Override
public boolean isApplicableTo(TaskElement task) {
return true;
}
};
}
private ICommandOnTask<TaskElement> buildOrderDetailsCommand() {
return new ICommandOnTask<TaskElement>() {
@Override
public void doAction(IContextWithPlannerTask<TaskElement> context, TaskElement task) {
OrderElement orderElement = task.getOrderElement();
if (orderElement instanceof Order) {
Order order = (Order) orderElement;
tabsController.goToOrderDetails(order);
}
}
@Override
public String getName() {
return _("Project Details");
}
@Override
public String getIcon() {
return "/common/img/ico_menu_order-details.png";
}
@Override
public boolean isApplicableTo(TaskElement task) {
return true;
}
};
}
};
return new CreatedOnDemandTab(_("Projects Planning"), "company-scheduling", componentCreator) {
@Override
protected void beforeShowAction() {
if (!SecurityUtils.isSuperuserOrRolePlanningOrHasAnyAuthorization()) {
Util.sendForbiddenStatusCodeInHttpServletResponse();
}
}
private boolean checkFiltersChanged() {
return (FilterUtils.sessionExists() && FilterUtils.hasProjectFilterChanged());
}
private void setFiltersUnchanged() {
FilterUtils.writeProjectPlanningFilterChanged(false);
}
@Override
protected void afterShowAction() {
if (checkFiltersChanged()) {
companyPlanningController.readSessionVariablesIntoComponents();
setFiltersUnchanged();
}
companyPlanningController.setConfigurationForPlanner();
breadcrumbs.getChildren().clear();
breadcrumbs.appendChild(new Image(BREADCRUMBS_SEPARATOR));
breadcrumbs.appendChild(new Label(getSchedulingLabel()));
breadcrumbs.appendChild(new Image(BREADCRUMBS_SEPARATOR));
breadcrumbs.appendChild(new Label(_("Projects Planning")));
}
};
}
private ITab createOrderPlanningTab() {
final IComponentCreator componentCreator = parent -> {
Map<String, Object> arguments = new HashMap<>();
arguments.put("orderPlanningController", orderPlanningController);
orderPlanningController.setURLParameters(parameters);
Component result = Executions.createComponents("/planner/order.zul", parent, arguments);
Util.createBindingsFor(result);
return result;
};
return new CreatedOnDemandTab(_("Project Scheduling"), "order-scheduling", componentCreator) {
@Override
protected void afterShowAction() {
orderPlanningController.setOrder(reload(mode.getOrder()));
orderPlanningController.setShowedTask(null);
Order order = orderPlanningController.getOrder();
Map<String, Object> arguments = new HashMap<>();
arguments.put("orderPlanningController", orderPlanningController);
if (breadcrumbs.getChildren() != null) {
breadcrumbs.getChildren().clear();
}
breadcrumbs.appendChild(new Image(BREADCRUMBS_SEPARATOR));
breadcrumbs.appendChild(new Label(getSchedulingLabel()));
breadcrumbs.appendChild(new Image(BREADCRUMBS_SEPARATOR));
breadcrumbs.appendChild(new Label(_("Project Scheduling")));
if (mode.isOf(ModeType.ORDER)) {
orderPlanningController.getOrderCRUDController().checkUserCanRead(order);
Label nameLabel = new Label(order.getName());
nameLabel.setTooltiptext(order.getName() + "." + order.getDescription());
nameLabel.setMaxlength(MAX_ORDERNAME_LENGTH);
Label schedulingStateLabel = new Label(_(order.getState().toString()));
schedulingStateLabel.setSclass("scheduling-state " + order.getSchedulingState().getCssClass());
schedulingStateLabel.setTooltiptext(_(order.getSchedulingState().getStateName()));
breadcrumbs.appendChild(new Image(BREADCRUMBS_SEPARATOR));
breadcrumbs.appendChild(nameLabel);
breadcrumbs.appendChild(schedulingStateLabel);
}
}
};
}
protected Order reload(Order order) {
try {
return orderDAO.find(order.getId());
} catch (InstanceNotFoundException e) {
throw new RuntimeException(e);
}
}
}