/* * 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.reassign; import org.joda.time.LocalDate; import org.libreplan.web.planner.reassign.ReassignCommand.IConfigurationResult; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import org.zkoss.ganttz.timetracker.ICellForDetailItemRenderer; import org.zkoss.ganttz.timetracker.OnColumnsRowRenderer; import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.WrongValueException; import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.util.GenericForwardComposer; import org.zkoss.zul.Datebox; import org.zkoss.zul.Grid; import org.zkoss.zul.Radio; import org.zkoss.zul.Radiogroup; import org.zkoss.zul.SimpleListModel; import org.zkoss.zul.Window; import java.util.Collections; import java.util.Date; import static org.libreplan.web.I18nHelper._; /** * When you are pushing reassign button ( green button on Project Scheduling page ), it will open Reassign window. * This controller handles that window. * * @author Óscar González Fernández <ogonzalez@igalia.com> */ @Component @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class ReassignController extends GenericForwardComposer { private Window window; private Radiogroup reassigningTypeSelector; private Grid reassigningTypesGrid; private Datebox associatedDate; private Type currentType = Type.ALL; private IConfigurationResult configurationResult; @Override public void doAfterCompose(org.zkoss.zk.ui.Component comp) throws Exception { super.doAfterCompose(comp); this.window = (Window) comp; comp.setAttribute("controller", this); associatedDate.setVisible(currentType.needsAssociatedDate()); fillGridWithRadios(); listenForTypeChange(); reassigningTypesGrid.invalidate(); } public static void openOn(org.zkoss.zk.ui.Component component, IConfigurationResult configurationResult) { Window result = (Window) Executions.createComponents("/planner/reassign.zul", component, Collections.emptyMap()); ReassignController controller = (ReassignController) result.getAttribute("controller"); controller.showWindow(configurationResult); } private void showWindow(IConfigurationResult configurationResult) { this.configurationResult = configurationResult; window.setMode("modal"); } private void fillGridWithRadios() { reassigningTypesGrid.setModel(new SimpleListModel(Type.values())); reassigningTypesGrid.setRowRenderer( OnColumnsRowRenderer.create(reassigningTypesRenderer(), Collections.singletonList(0))); } private ICellForDetailItemRenderer<Integer, Type> reassigningTypesRenderer() { return new ICellForDetailItemRenderer<Integer, Type>() { @Override public org.zkoss.zk.ui.Component cellFor(Integer column, Type type) { Radio radio = type.createRadio(); radio.setChecked(currentType == type); return radio; } }; } private void listenForTypeChange() { reassigningTypeSelector.addEventListener(Events.ON_CHECK, (event) -> { Radio selectedItem = reassigningTypeSelector.getSelectedItem(); newTypeChosen(Type.fromRadio(selectedItem)); associatedDate.setVisible(currentType.needsAssociatedDate()); }); } private void newTypeChosen(Type fromRadio) { this.currentType = fromRadio; associatedDate.setVisible(false); } public void confirm() { if (currentType.needsAssociatedDate()) { Date value = associatedDate.getValue(); if (value == null) { throw new WrongValueException(associatedDate, _("cannot be empty")); } } window.setVisible(false); final LocalDate associatedDate = this.associatedDate.getValue() != null ? LocalDate.fromDateFields(this.associatedDate.getValue()) : null; configurationResult.result(ReassignConfiguration.create(currentType, associatedDate)); } public void cancel() { window.setVisible(false); } }