/*
* 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.Collections;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.libreplan.business.common.exceptions.InstanceNotFoundException;
import org.libreplan.business.orders.entities.Order;
import org.libreplan.business.scenarios.IScenarioManager;
import org.libreplan.business.scenarios.bootstrap.PredefinedScenarios;
import org.libreplan.business.scenarios.entities.Scenario;
import org.libreplan.web.common.BaseCRUDController;
import org.libreplan.web.common.ITemplateModel;
import org.libreplan.web.common.ITemplateModel.IOnFinished;
import org.libreplan.web.common.Level;
import org.libreplan.web.common.Util;
import org.libreplan.web.security.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zul.Button;
import org.zkoss.zul.Label;
import org.zkoss.zul.DefaultTreeNode;
import org.zkoss.zul.Treecell;
import org.zkoss.zul.Treeitem;
import org.zkoss.zul.TreeitemRenderer;
import org.zkoss.zul.Treerow;
/**
* Controller for CRUD actions over a {@link Scenario}.
*
* @author Manuel Rego Casasnovas <mrego@igalia.com>
*/
public class ScenarioCRUDController extends BaseCRUDController<Scenario> {
private static final Log LOG = LogFactory.getLog(ScenarioCRUDController.class);
@Autowired
private IScenarioModel scenarioModel;
@Autowired
private ITemplateModel templateModel;
@Autowired
private IScenarioManager scenarioManager;
private ScenariosTreeitemRenderer scenariosTreeitemRenderer = new ScenariosTreeitemRenderer();
public Scenario getScenario() {
return scenarioModel.getScenario();
}
public void cancel() {
scenarioModel.cancel();
}
@Override
public void save() {
scenarioModel.confirmSave();
}
@Override
protected void initCreate() {
// Do nothing, direct scenario creation is not allowed it should be derived
}
private void goToCreateDerivedForm(Scenario scenario) {
state = CRUDControllerState.CREATE;
scenarioModel.initCreateDerived(scenario);
showEditWindow();
}
public ScenariosTreeModel getScenariosTreeModel() {
return new ScenariosTreeModel(new ScenarioTreeRoot(scenarioModel.getScenarios()));
}
public ScenariosTreeitemRenderer getScenariosTreeitemRenderer() {
return scenariosTreeitemRenderer;
}
public class ScenariosTreeitemRenderer implements TreeitemRenderer {
@Override
public void render(Treeitem treeitem, Object o, int i) throws Exception {
DefaultTreeNode simpleTreeNode = (DefaultTreeNode) o;
final Scenario scenario = (Scenario) simpleTreeNode.getData();
treeitem.setValue(o);
Scenario currentScenario = scenarioManager.getCurrent();
boolean isCurrentScenario = currentScenario.getId().equals(scenario.getId());
Treerow treerow = new Treerow();
Treecell nameTreecell = new Treecell();
Label nameLabel = new Label(scenario.getName());
nameTreecell.appendChild(nameLabel);
treerow.appendChild(nameTreecell);
Treecell operationsTreecell = new Treecell();
Button createDerivedButton = new Button();
createDerivedButton.setTooltiptext(_("Create derived"));
createDerivedButton.setSclass("icono");
createDerivedButton.setImage("/common/img/ico_derived1.png");
createDerivedButton.setHoverImage("/common/img/ico_derived.png");
createDerivedButton.addEventListener(Events.ON_CLICK,
new EventListener() {
@Override
public void onEvent(Event event) {
goToCreateDerivedForm(scenario);
}
});
operationsTreecell.appendChild(createDerivedButton);
Button editButton = Util.createEditButton(new EventListener() {
@Override
public void onEvent(Event event) {
goToEditForm(scenario);
}
});
operationsTreecell.appendChild(editButton);
Button removeButton = Util.createRemoveButton(new EventListener() {
@Override
public void onEvent(Event event) {
confirmDelete(scenario);
}
});
boolean isMainScenario = PredefinedScenarios.MASTER.getScenario().getId().equals(scenario.getId());
List<Scenario> derivedScenarios = scenarioModel.getDerivedScenarios(scenario);
if ( isCurrentScenario || isMainScenario || !derivedScenarios.isEmpty() ) {
removeButton.setDisabled(true);
}
operationsTreecell.appendChild(removeButton);
Button connectButton = new Button(_("Connect"));
connectButton.addEventListener(Events.ON_CLICK,
new EventListener() {
@Override
public void onEvent(Event event) {
connectTo(scenario);
}
private void connectTo(Scenario scenario) {
templateModel.setScenario(SecurityUtils.getSessionUserLoginName(), scenario,
new IOnFinished() {
@Override
public void onWithoutErrorFinish() {
Executions.sendRedirect("/scenarios/scenarios.zul");
}
@Override
public void errorHappened(
Exception exceptionHappened) {
errorHappenedDoingReassignation(exceptionHappened);
}
});
}
});
if ( isCurrentScenario ) {
connectButton.setDisabled(true);
}
operationsTreecell.appendChild(connectButton);
treerow.appendChild(operationsTreecell);
treeitem.appendChild(treerow);
// Show the tree expanded at start
treeitem.setOpen(true);
}
}
private void errorHappenedDoingReassignation(Exception exceptionHappened) {
LOG.error("error happened doing reassignation", exceptionHappened);
messagesForUser.showMessage(Level.ERROR, _("error doing reassignment: {0}", exceptionHappened));
}
public Set<Order> getOrders() {
Scenario scenario = scenarioModel.getScenario();
if ( scenario == null ) {
return Collections.emptySet();
}
return scenario.getOrders().keySet();
}
@Override
protected String getEntityType() {
return _("Scenario");
}
@Override
protected String getPluralEntityType() {
return _("Scenarios");
}
@Override
protected void initEdit(Scenario scenario) {
scenarioModel.initEdit(scenario);
}
@Override
protected Scenario getEntityBeingEdited() {
return scenarioModel.getScenario();
}
@Override
protected void delete(Scenario scenario) throws InstanceNotFoundException {
scenarioModel.remove(scenario);
}
}