/* * 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.orders; import org.apache.commons.lang3.StringUtils; import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.orders.entities.OrderLine; import org.libreplan.business.orders.entities.OrderLineGroup; import org.libreplan.web.common.Util; import org.libreplan.web.orders.criterionrequirements.AssignedCriterionRequirementToOrderElementController; import org.libreplan.web.orders.criterionrequirements.OrderElementCriterionRequirementComponent; import org.libreplan.web.orders.labels.AssignedLabelsToOrderElementController; import org.libreplan.web.orders.labels.LabelsAssignmentToOrderElementComponent; import org.libreplan.web.orders.materials.AssignedMaterialsToOrderElementController; import org.libreplan.web.orders.materials.OrderElementMaterialAssignmentsComponent; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.SuspendNotAllowedException; import org.zkoss.zk.ui.WrongValueException; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.util.GenericForwardComposer; import org.zkoss.zkplus.spring.SpringUtil; import org.zkoss.zul.Tab; import org.zkoss.zul.Tabpanel; import org.zkoss.zul.Window; import static org.libreplan.web.I18nHelper._; /** * Controller for {@link OrderElement} view of {@link Order} entities. * <br /> * @author Manuel Rego Casasnovas <mrego@igalia.com> * @author Susana Montes Pedreira <smontes@wirelessgalicia.com> * @author Diego Pino Garcia <dpino@igalia.com> */ public class OrderElementController extends GenericForwardComposer { /** * {@link IOrderElementModel} with the data needed for this controller */ private IOrderElementModel orderElementModel; private Component orderElementDetails; private DetailsOrderElementController detailsController; private Component orderElementHours; private AssignedHoursToOrderElementController assignedHoursToOrderElementController; private Component orderElementAdvances; private ManageOrderElementAdvancesController manageOrderElementAdvancesController; private LabelsAssignmentToOrderElementComponent orderElementLabels; private AssignedLabelsToOrderElementController assignedLabelsController; private Component orderElementTaskQualityForms; private AssignedTaskQualityFormsToOrderElementController assignedTaskQualityFormsController; private OrderElementCriterionRequirementComponent orderElementCriterionRequirements; private AssignedCriterionRequirementToOrderElementController assignedCriterionRequirementController; private OrderElementMaterialAssignmentsComponent orderElementMaterials; private AssignedMaterialsToOrderElementController assignedMaterialsController; public OrderElementController() { orderElementModel = (IOrderElementModel) SpringUtil.getBean("orderElementModel"); assignedCriterionRequirementController = (AssignedCriterionRequirementToOrderElementController) SpringUtil.getBean("assignedCriterionRequirementToOrderElementController"); } @Override public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); comp.setAttribute("orderElementController", this, true); setupDetailsOrderElementController(); } private void setupDetailsOrderElementController() { detailsController = (DetailsOrderElementController) orderElementDetails.getAttribute("detailsController", true); } private void redraw(Component comp) { Util.createBindingsFor(comp); Util.reloadBindings(comp); } public void setupAssignedHoursToOrderElementController() { if (assignedHoursToOrderElementController == null) { assignedHoursToOrderElementController = (AssignedHoursToOrderElementController) orderElementHours.getAttribute("assignedHoursToOrderElementController", true); assignedHoursToOrderElementController.openWindow(orderElementModel); } else { redraw(orderElementHours); assignedHoursToOrderElementController.paintProgressBars(); } } private String getOrderElementName() { String name = ""; if ((getOrderElement() != null) && (!StringUtils.isBlank(getOrderElement().getName()))) { name = ": " + getOrderElement().getName(); } return _("Edit task {0}", name); } public void setupManageOrderElementAdvancesController() { if (manageOrderElementAdvancesController == null) { manageOrderElementAdvancesController = (ManageOrderElementAdvancesController) orderElementAdvances.getAttribute("manageOrderElementAdvancesController", true); manageOrderElementAdvancesController.openWindow(orderElementModel); } else { manageOrderElementAdvancesController.refreshChangesFromOrderElement(); manageOrderElementAdvancesController.createAndLoadBindings(); manageOrderElementAdvancesController.refreshSelectedAdvance(); } } public void setupAssignedLabelsToOrderElementController(){ if (assignedLabelsController == null) { assignedLabelsController = orderElementLabels.getController(); assignedLabelsController.openWindow(orderElementModel); } else { redraw(orderElementLabels); } } public void setupAssignedCriterionRequirementToOrderElementController() { if ( assignedCriterionRequirementController == null ) { assignedCriterionRequirementController = orderElementCriterionRequirements.getController(); assignedCriterionRequirementController.openWindow(orderElementModel); } else { redraw(orderElementCriterionRequirements); } } public void setupAssignedMaterialsToOrderElementController() { if (assignedMaterialsController == null) { assignedMaterialsController = orderElementMaterials.getController(); assignedMaterialsController.openWindow(getOrderElement()); } else { redraw(orderElementMaterials); } } public void setupAssignedTaskQualityFormsToOrderElementController() { if (assignedTaskQualityFormsController == null) { assignedTaskQualityFormsController = (AssignedTaskQualityFormsToOrderElementController) orderElementTaskQualityForms.getAttribute("assignedTaskQualityFormsController", true); assignedTaskQualityFormsController.openWindow(orderElementModel); } else { redraw(orderElementTaskQualityForms); } } public OrderElement getOrderElement() { return (orderElementModel == null) ? OrderLine.create() : orderElementModel.getOrderElement(); } /** * Open the window to edit a {@link OrderElement}. * If it's a {@link OrderLineGroup} less fields will be enabled. * @param model * The {@link OrderElement} to be edited */ public void openWindow(IOrderElementModel model) { clearAll(); setOrderElementModel(model); detailsController.openWindow(model); // Initialize the controllers manageOrderElementAdvancesController = null; assignedHoursToOrderElementController = null; assignedCriterionRequirementController = null; assignedLabelsController = null; assignedMaterialsController = null; assignedTaskQualityFormsController = null; try { ((Window) self).setTitle(getOrderElementName()); ((Window) self).doModal(); } catch (SuspendNotAllowedException e) { throw new RuntimeException(e); } } private void setOrderElementModel(IOrderElementModel orderElementModel) { this.orderElementModel = orderElementModel; } public void clearAll() { Tabpanel tabPanel = (Tabpanel) self.getFellow("tabPanelDetails"); Util.createBindingsFor(tabPanel); Util.reloadBindings(tabPanel); clear(); } private void clear() { selectDefaultTab(); } private void selectDefaultTab() { selectTab("tabDetails"); } private void selectTab(String str) { Tab tab = (Tab) self.getFellowIfAny(str); if (tab != null) { tab.setSelected(true); } } public void back() { close(); } private void close() { if (validateTabs()) { self.setVisible(false); Util.reloadBindings(self.getParent()); } } private boolean validateTabs() { return (validateProgressTab() && validateTaskQualityTab() && validateCriterionRequirementsTab()); } private boolean validateTaskQualityTab() { try { if (assignedTaskQualityFormsController != null) { assignedTaskQualityFormsController.confirm(); } } catch (WrongValueException e) { selectTab("tabTaskQualityForm"); throw e; } return true; } private boolean validateCriterionRequirementsTab() { try { if (assignedCriterionRequirementController != null) { assignedCriterionRequirementController.close(); } } catch (WrongValueException e) { selectTab("tabRequirements"); throw e; } return true; } private boolean validateProgressTab() { try { if ((manageOrderElementAdvancesController != null) && (!manageOrderElementAdvancesController.close())) { selectTab("tabAdvances"); return false; } } catch (WrongValueException e) { selectTab("tabAdvances"); throw e; } return true; } public void close(Event event) { close(); event.stopPropagation(); } }