/*
* 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.scenarios;
import static org.libreplan.web.I18nHelper._;
import java.util.List;
import java.util.Set;
import org.libreplan.business.common.exceptions.ValidationException;
import org.libreplan.business.orders.entities.Order;
import org.libreplan.business.scenarios.entities.Scenario;
import org.libreplan.web.common.IMessagesForUser;
import org.libreplan.web.common.Level;
import org.libreplan.web.common.MessagesForUser;
import org.libreplan.web.common.Util;
import org.libreplan.web.common.components.bandboxsearch.BandboxSearch;
import org.springframework.beans.factory.annotation.Autowired;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.Button;
import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.ListitemRenderer;
import org.zkoss.zul.Listbox;
/**
* Controller for UI operations to transfer orders between scenarios.
*
* @author Manuel Rego Casasnovas <mrego@igalia.com>
*/
public class TransferOrdersController extends GenericForwardComposer {
@Autowired
private ITransferOrdersModel transferOrdersModel;
private IMessagesForUser messagesForUser;
private Component messagesContainer;
private BandboxSearch sourceScenarioBandboxSearch;
private Listbox sourceScenarioOrders;
private BandboxSearch destinationScenarioBandboxSearch;
private Listbox destinationScenarioOrders;
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
messagesForUser = new MessagesForUser(messagesContainer);
comp.setAttribute("transferOrdersController", this, true);
sourceScenarioBandboxSearch.setListboxEventListener(Events.ON_CLICK,
new EventListener() {
@Override
public void onEvent(Event event) {
setSourceScenario();
}
});
sourceScenarioBandboxSearch.setListboxEventListener(Events.ON_OK,
new EventListener() {
@Override
public void onEvent(Event event) {
setSourceScenario();
}
});
destinationScenarioBandboxSearch.setListboxEventListener(
Events.ON_CLICK, new EventListener() {
@Override
public void onEvent(Event event) {
setDestinationScenario();
}
});
destinationScenarioBandboxSearch.setListboxEventListener(Events.ON_OK,
new EventListener() {
@Override
public void onEvent(Event event) {
setDestinationScenario();
}
});
}
private void setSourceScenario() {
Scenario sourceScenario = (Scenario) sourceScenarioBandboxSearch.getSelectedElement();
transferOrdersModel.setSourceScenario(sourceScenario);
Util.reloadBindings(sourceScenarioOrders);
sourceScenarioBandboxSearch.close();
}
private void setDestinationScenario() {
Scenario destinationScenario = (Scenario) destinationScenarioBandboxSearch.getSelectedElement();
transferOrdersModel.setDestinationScenario(destinationScenario);
Util.reloadBindings(destinationScenarioOrders);
destinationScenarioBandboxSearch.close();
}
public List<Scenario> getScenarios() {
return transferOrdersModel.getScenarios();
}
public Scenario getSourceScenario() {
return transferOrdersModel.getSourceScenario();
}
public Set<Order> getSourceScenarioOrders() {
return transferOrdersModel.getSourceScenarioOrders();
}
public Scenario getDestinationScenario() {
return transferOrdersModel.getDestinationScenario();
}
public Set<Order> getDestinationScenarioOrders() {
return transferOrdersModel.getDestinationScenarioOrders();
}
public ListitemRenderer getSourceOrderRenderer() {
return new OrderRenderer(true);
}
public ListitemRenderer getDestinationOrderRenderer() {
return new OrderRenderer(false);
}
private class OrderRenderer implements ListitemRenderer {
private final boolean source;
OrderRenderer(boolean source) {
this.source = source;
}
@Override
public void render(Listitem listitem, Object o, int i) throws Exception {
Order order = (Order) o;
listitem.setValue(o);
listitem.appendChild(new Listcell(order.getCode()));
listitem.appendChild(new Listcell(order.getName()));
Scenario scenario = source
? transferOrdersModel.getSourceScenario()
: transferOrdersModel.getDestinationScenario();
listitem.appendChild(new Listcell(transferOrdersModel.getVersion(order,
scenario)));
if (source) {
Listcell cell = new Listcell();
cell.appendChild(getTransferButton(order));
listitem.appendChild(cell);
}
}
private Button getTransferButton(final Order order) {
Button transferButton = new Button(_("Transfer"));
transferButton.addEventListener(Events.ON_CLICK,
new EventListener() {
@Override
public void onEvent(Event event) {
try {
transferOrdersModel.transfer(order);
Util.reloadBindings(destinationScenarioOrders);
messagesForUser.showMessage(Level.INFO,
_("Project {0} transfered", order
.getName()));
} catch (ValidationException e) {
messagesForUser.showInvalidValues(e);
}
}
});
return transferButton;
}
}
}