/*
* 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.resources.criterion;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.libreplan.business.common.exceptions.InstanceNotFoundException;
import org.libreplan.business.common.exceptions.ValidationException;
import org.libreplan.business.resources.entities.Criterion;
import org.libreplan.business.resources.entities.CriterionType;
import org.libreplan.business.resources.entities.ICriterionType;
import org.libreplan.business.resources.entities.ResourceEnum;
import org.libreplan.web.common.BaseCRUDController;
import org.libreplan.web.common.Level;
import org.libreplan.web.common.Util;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.CheckEvent;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Tree;
import org.zkoss.zkplus.spring.SpringUtil;
import java.util.ConcurrentModificationException;
import java.util.List;
import static org.libreplan.web.I18nHelper._;
/**
* Controller for Criterions.
* <br />
*/
public class CriterionAdminController extends BaseCRUDController<CriterionType> {
private static final Log LOG = LogFactory.getLog(CriterionAdminController.class);
private ICriterionsModel criterionsModel;
private Checkbox cbHierarchy;
private CriterionTreeController editionTree;
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
if ( criterionsModel == null ) {
criterionsModel = (ICriterionsModel) SpringUtil.getBean("criterionsModel");
}
cbHierarchy = (Checkbox) editWindow.getFellow("cbHierarchy");
setupResourceCombobox((Combobox) editWindow.getFellowIfAny("resourceCombobox"));
}
public void confirmDisabledHierarchy() {
if (!cbHierarchy.isChecked()){
showConfirmingHierarchyWindow();
}
}
public boolean allowRemove(CriterionType criterionType){
return criterionType.getCriterions().size() <= 0;
}
public boolean notAllowRemove(CriterionType criterionType){
return !allowRemove(criterionType);
}
public boolean isActivo(){
return true;
}
private void showConfirmingHierarchyWindow() {
int status = Messagebox.show(
_("Disable hierarchy will cause criteria tree to be flattened. Are you sure?"),
_("Question"), Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION);
if (Messagebox.OK == status) {
disableHierarchy();
editionTree.reloadTree();
} else {
cbHierarchy.setChecked(true);
}
}
public void disableHierarchy() {
editionTree.disabledHierarchy();
messagesForUser.showMessage(
Level.INFO,
_("Tree {0} sucessfully flattened", criterionsModel.getCriterionType().getName()));
Util.reloadBindings(listWindow);
}
public void changeEnabled(Checkbox checkbox) {
editionTree.updateEnabledCriterions(checkbox.isChecked());
}
public CriterionTreeController getEdition() {
return editionTree;
}
private void reloadCriterionType() {
Tree tree = (Tree) editWindow.getFellowIfAny("tree");
criterionsModel.reloadCriterionType();
Util.reloadBindings(tree);
}
public List<CriterionType> getCriterionTypes() {
return criterionsModel.getTypes();
}
public ICriterionType<?> getCriterionType() {
return criterionsModel.getCriterionType();
}
public ICriterionTreeModel getCriterionTreeModel() {
return criterionsModel.getCriterionTreeModel();
}
public Criterion getCriterion() {
return criterionsModel.getCriterion();
}
private void setupResourceCombobox(Combobox combo) {
for (ResourceEnum resource : ResourceEnum.values()) {
Comboitem item = combo.appendItem(_(resource.getDisplayName()));
item.setValue(resource);
}
}
private void setResourceComboboxValue(Combobox combo) {
CriterionType criterionType = (CriterionType) getCriterionType();
for (Object object : combo.getItems()) {
Comboitem item = (Comboitem) object;
if (criterionType != null && item.getValue().equals(criterionType.getResource())) {
combo.setSelectedItem(item);
}
}
}
public void setResource(Comboitem item) {
if (item != null) {
((CriterionType)getCriterionType()).setResource(item.getValue());
}
}
private void setupCriterionTreeController(Component comp) throws Exception {
editionTree = new CriterionTreeController(criterionsModel);
editionTree.setCriterionCodeEditionDisabled(
((CriterionType) criterionsModel.getCriterionType()).isCodeAutogenerated());
editionTree.doAfterCompose(comp.getFellow("criterionsTree"));
}
public void onCheckGenerateCode(Event e) {
CheckEvent ce = (CheckEvent) e;
if (ce.isChecked()) {
try {
// We have to auto-generate the code for new objects
criterionsModel.setCodeAutogenerated(ce.isChecked());
} catch (ConcurrentModificationException err) {
messagesForUser.showMessage(Level.ERROR, err.getMessage());
}
Util.reloadBindings(editWindow);
}
// Disable code field in criterion tree controller
editionTree.setCriterionCodeEditionDisabled(ce.isChecked());
editionTree.reloadTree();
}
@Override
protected String getEntityType() {
return _("Criterion Type");
}
@Override
protected String getPluralEntityType() {
return _("Criterion Types");
}
@Override
protected void initCreate() {
criterionsModel.prepareForCreate();
try {
setupCriterionTreeController(editWindow);
} catch (Exception e) {
LOG.error("Error setting up creating form for Criterion Type", e);
}
setResourceComboboxValue((Combobox) editWindow.getFellowIfAny("resourceCombobox"));
}
@Override
protected void initEdit(CriterionType criterionType) {
criterionsModel.prepareForEdit(criterionType);
try {
setupCriterionTreeController(editWindow);
} catch (Exception e) {
LOG.error("Error setting up edition form for Criterion Type with id: " + criterionType.getId(), e);
}
setResourceComboboxValue((Combobox) editWindow.getFellowIfAny("resourceCombobox"));
}
@Override
protected void save() throws ValidationException {
criterionsModel.saveCriterionType();
reloadCriterionType();
}
@Override
protected CriterionType getEntityBeingEdited() {
return (CriterionType) criterionsModel.getCriterionType();
}
@Override
protected void delete(CriterionType criterionType) throws InstanceNotFoundException {
criterionsModel.confirmRemove(criterionType);
}
@Override
protected boolean beforeDeleting(CriterionType criterionType) {
if (!criterionsModel.canRemove(criterionType)) {
messagesForUser.showMessage(
Level.WARNING,
_("This criterion type cannot be deleted because it is assigned to projects or resources"));
return false;
}
return true;
}
}