Package org.libreplan.web.workreports

Source Code of org.libreplan.web.workreports.WorkReportTypeCRUDController$OrderedFieldsAndLabelsRowRenderer

/*
* 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.workreports;

import static org.libreplan.web.I18nHelper._;

import java.util.ConcurrentModificationException;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.logging.LogFactory;
import org.libreplan.business.common.exceptions.InstanceNotFoundException;
import org.libreplan.business.common.exceptions.ValidationException;
import org.libreplan.business.labels.entities.Label;
import org.libreplan.business.labels.entities.LabelType;
import org.libreplan.business.workreports.entities.HoursManagementEnum;
import org.libreplan.business.workreports.entities.PositionInWorkReportEnum;
import org.libreplan.business.workreports.entities.WorkReportLabelTypeAssigment;
import org.libreplan.business.workreports.entities.WorkReportType;
import org.libreplan.business.workreports.valueobjects.DescriptionField;
import org.libreplan.web.common.BaseCRUDController;
import org.libreplan.web.common.EnumsListitemRenderer;
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.Autocomplete;
import org.libreplan.web.common.components.NewDataSortableGrid;
import org.libreplan.web.common.entrypoints.EntryPointsHandler;
import org.libreplan.web.common.entrypoints.IURLHandlerRegistry;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.CheckEvent;
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.Column;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Constraint;
import org.zkoss.zul.Grid;
import org.zkoss.zul.Hbox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Row;
import org.zkoss.zul.RowRenderer;
import org.zkoss.zul.Rows;
import org.zkoss.zul.SimpleListModel;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Vbox;
import org.zkoss.zul.api.Window;

/**
* Controller for CRUD actions over a {@link WorkReportType}
*
* @author Manuel Rego Casasnovas <mrego@igalia.com>
*/
public class WorkReportTypeCRUDController extends BaseCRUDController<WorkReportType>
        implements IWorkReportTypeCRUDControllerEntryPoints {

     private static final org.apache.commons.logging.Log LOG = LogFactory
     .getLog(WorkReportTypeCRUDController.class);

    private NewDataSortableGrid listDescriptionFields;

    private NewDataSortableGrid listWorkReportLabelTypeAssigments;

    private Textbox name;

    private Textbox code;

    private Vbox orderedListFieldsAndLabels;

    private Tab tabSortedLabelsAndFields;

    private Tab tabReportStructure;

    private Component containerMessageSortedLabelsAndFields;

    private IMessagesForUser messagesForUserSortedLabelsAndFields;

    private IWorkReportTypeModel workReportTypeModel;

    private IWorkReportCRUDControllerEntryPoints workReportCRUD;

    private IURLHandlerRegistry URLHandlerRegistry;

    private DescriptionFieldRowRenderer descriptionFieldRowRenderer = new DescriptionFieldRowRenderer();

    private WorkReportLabelTypeAssigmentRowRenderer workReportLabelTypeAssigmentRowRenderer = new WorkReportLabelTypeAssigmentRowRenderer();

    private OrderedFieldsAndLabelsRowRenderer orderedFieldsAndLabesRowRenderer = new OrderedFieldsAndLabelsRowRenderer();

    public List<WorkReportType> getWorkReportTypes() {
        return workReportTypeModel.getWorkReportTypesExceptPersonalAndJiraTimesheets();
    }

    public WorkReportType getWorkReportType() {
        return workReportTypeModel.getWorkReportType();
    }

    @Override
    public void doAfterCompose(Component comp) throws Exception {
        super.doAfterCompose(comp);
        final EntryPointsHandler<IWorkReportTypeCRUDControllerEntryPoints> handler = URLHandlerRegistry
                .getRedirectorFor(IWorkReportTypeCRUDControllerEntryPoints.class);
        handler.register(this, page);
    }

    @Override
    protected void save() throws ValidationException {
        workReportTypeModel.save();
    }

    @Override
    protected void beforeSaving() throws ValidationException {
        isAllValid();
    }

    private boolean thereAreWorkReportsFor(WorkReportType workReportType) {
        return workReportTypeModel.thereAreWorkReportsFor(workReportType);
    }

    public boolean isReadOnly() {
        return thereAreWorkReportsFor(getWorkReportType());
    }

    public boolean isEditable() {
        return (!thereAreWorkReportsFor(getWorkReportType()));
    }

    private void loadComponents(Window window) {
        if (!window.equals(listWindow)) {
            name = (Textbox) window.getFellow("name");
            code = (Textbox) window.getFellow("code");
            listDescriptionFields = (NewDataSortableGrid) window
                    .getFellow("listDescriptionFields");
            listWorkReportLabelTypeAssigments = (NewDataSortableGrid) window
                    .getFellow("listWorkReportLabelTypeAssigments");
            orderedListFieldsAndLabels = (Vbox) window
                    .getFellow("orderedListFieldsAndLabels");
            containerMessageSortedLabelsAndFields = (Vbox) window
                    .getFellow("containerMessageSortedLabelsAndFields");
            messagesForUserSortedLabelsAndFields = new MessagesForUser(
                    containerMessageSortedLabelsAndFields);
            tabSortedLabelsAndFields = (Tab) window
                    .getFellow("tabSortedLabelsAndFields");
            tabReportStructure = (Tab) window.getFellow("tabReportStructure");
        }
    }

    public void goToEditNewWorkReportForm(WorkReportType workReportType) {
        workReportCRUD.goToCreateForm(workReportType);
    }

    /* Operations to manage the description fiels of the edited workReportType */

    public List<DescriptionField> getDescriptionFields() {
        return workReportTypeModel.getDescriptionFields();
    }

    public void addNewDescriptionField() {
        workReportTypeModel.addNewDescriptionField();
        Util.reloadBindings(listDescriptionFields);
    }

    private void removeDescriptionField(DescriptionField descriptionField) {
        workReportTypeModel.removeDescriptionField(descriptionField);
        Util.reloadBindings(listDescriptionFields);
    }

    public DescriptionFieldRowRenderer getDescriptionFieldsRowRender() {
        return descriptionFieldRowRenderer;
    }

    public class DescriptionFieldRowRenderer implements RowRenderer {

        @Override
        public void render(Row row, Object data) {

            final DescriptionField descriptionField = (DescriptionField) data;
            row.setValue(descriptionField);

            if (isReadOnly()) {
                appendLabelNameDescriptionField(row);
                appendLabelLengthDescriptionField(row);
                appendLabelPositionDescriptionField(row);
            } else {
                appendTextboBoxNameDescriptionField(row);
                appendIntBoxLengthDescriptionField(row);
                appendListboxPositionDescriptionField(row);
                appendRemoveButtonDescriptionField(row);
            }
        }
    }

    private void appendLabelNameDescriptionField(Row row) {
        org.zkoss.zul.Label labelName = new org.zkoss.zul.Label();
        labelName.setValue(((DescriptionField) row.getValue()).getFieldName());
        labelName.setParent(row);
    }

    private void appendLabelLengthDescriptionField(Row row) {
        org.zkoss.zul.Label labelLength = new org.zkoss.zul.Label();
        labelLength.setValue(((DescriptionField) row.getValue()).getLength()
                .toString());
        labelLength.setParent(row);
    }

    private void appendLabelPositionDescriptionField(Row row) {
        org.zkoss.zul.Label labelPosition = new org.zkoss.zul.Label();
        labelPosition.setParent(row);

        if (workReportTypeModel
                .isHeadingDescriptionField((DescriptionField) row.getValue())) {
            labelPosition.setValue(_(PositionInWorkReportEnum.HEADING
                    .toString()));
        } else {
            labelPosition.setValue(_(PositionInWorkReportEnum.LINE.toString()));
        }
    }

    private void appendTextboBoxNameDescriptionField(final Row row) {
        Textbox boxName = new Textbox();
        boxName.setHflex("1");
        boxName.setParent(row);
        boxName
                .setConstraint(validateIfExistTheSameFieldName((DescriptionField) row
                        .getValue()));

        Util.bind(boxName, new Util.Getter<String>() {
            @Override
            public String get() {
                return ((DescriptionField) row.getValue()).getFieldName();
            }
        }, new Util.Setter<String>() {

            @Override
            public void set(String value) {
                ((DescriptionField) row.getValue()).setFieldName(value);
            }
        });
    }

    private void appendIntBoxLengthDescriptionField(final Row row) {
        Intbox boxLength = new Intbox();
        boxLength.setHflex("1");
        boxLength.setReadonly(isReadOnly());
        boxLength.setParent(row);
        boxLength.setConstraint("no negative, no zero");

        Util.bind(boxLength, new Util.Getter<Integer>() {
            @Override
            public Integer get() {
                return ((DescriptionField) row.getValue()).getLength();
            }
        }, new Util.Setter<Integer>() {

            @Override
            public void set(Integer value) {
                ((DescriptionField) row.getValue()).setLength(value);
            }
        });
    }

    private void appendListboxPositionDescriptionField(final Row row) {
        final DescriptionField descriptionField = (DescriptionField) row
                .getValue();
        final Listbox listPosition = createListPosition();
        listPosition.setParent(row);

        if (workReportTypeModel.isHeadingDescriptionField(descriptionField)) {
            listPosition.setSelectedItem(listPosition.getItemAtIndex(0));
        } else {
            listPosition.setSelectedItem(listPosition.getItemAtIndex(1));
        }

        listPosition.addEventListener(Events.ON_SELECT, new EventListener() {
            @Override
            public void onEvent(Event event) {
                changePositionDescriptionField(listPosition
                            .getSelectedItem(), descriptionField);
                Util.reloadBindings(listDescriptionFields);
            }
        });
    }

    private void appendRemoveButtonDescriptionField(final Row row) {
        final DescriptionField descriptionField = (DescriptionField) row
                .getValue();
        final Button removeButton = createRemoveButton();
        removeButton.setParent(row);

        removeButton.addEventListener(Events.ON_CLICK, new EventListener() {
            @Override
            public void onEvent(Event event) {
                removeDescriptionField(descriptionField);
            }
        });
    }

    private Listbox createListPosition() {
        final Listbox listPosition = new Listbox();
        listPosition.setMold("select");

        listPosition.setModel(new SimpleListModel(
                getPositionInWorkReportEnums()));
        listPosition.setItemRenderer(new EnumsListitemRenderer());
        return listPosition;
    }

    private Button createRemoveButton() {
        Button removeButton = new Button();
        removeButton.setSclass("icono");
        removeButton.setImage("/common/img/ico_borrar1.png");
        removeButton.setHoverImage("/common/img/ico_borrar.png");
        removeButton.setTooltiptext(_("Delete"));
        return removeButton;
    }

    private void changePositionDescriptionField(Listitem selectedItem,
            DescriptionField descriptionField) {
        PositionInWorkReportEnum newPosition = (PositionInWorkReportEnum) selectedItem
                .getValue();
        workReportTypeModel.changePositionDescriptionField(newPosition,
                descriptionField);
    }

    /* Operations to manage the label of the edited workReportType */

    private Map<LabelType, List<Label>> getMapLabelTypes() {
        return workReportTypeModel.getMapLabelTypes();
    }

    public Set<WorkReportLabelTypeAssigment> getWorkReportLabelTypeAssigments() {
        return workReportTypeModel.getWorkReportLabelTypeAssigments();
    }

    public void addNewWorkReportLabelTypeAssigment() {
        workReportTypeModel.addNewWorkReportLabelTypeAssigment();
        Util.reloadBindings(listWorkReportLabelTypeAssigments);
    }

    private void removeWorkReportLabelTypeAssigment(
            WorkReportLabelTypeAssigment workReportLabelTypeAssigment) {
        workReportTypeModel
                .removeWorkReportLabelTypeAssigment(workReportLabelTypeAssigment);
        Util.reloadBindings(listWorkReportLabelTypeAssigments);
    }

    public WorkReportLabelTypeAssigmentRowRenderer getWorkReportLabelTypeAssigmentRowRender() {
        return workReportLabelTypeAssigmentRowRenderer;
    }

    public class WorkReportLabelTypeAssigmentRowRenderer implements RowRenderer {

        @Override
        public void render(Row row, Object data) {

            final WorkReportLabelTypeAssigment workReportLabelTypeAssigment = (WorkReportLabelTypeAssigment) data;
            row.setValue(workReportLabelTypeAssigment);

            if (isReadOnly()) {
                appendLabelType(row);
                appendLabelPosition(row);
                appendLabel(row);
            } else {
                appendComboboxLabelTypes(row);
                appendComboboxPositionLabel(row);
                appendComboboxLabels(row);
                appendRemoveButtonWorkReportLabelTypeAssigment(row);
            }
        }
    }

    private void appendLabelType(Row row) {
        org.zkoss.zul.Label labelType = new org.zkoss.zul.Label();
        labelType.setParent(row);
        labelType.setValue(((WorkReportLabelTypeAssigment) row.getValue())
                .getLabelType().getName());
    }

    private void appendLabelPosition(Row row) {
        org.zkoss.zul.Label labelPosition = new org.zkoss.zul.Label();
        labelPosition.setParent(row);
        labelPosition.setValue(_(workReportTypeModel.getLabelAssigmentPosition(
                (WorkReportLabelTypeAssigment) row.getValue()).toString()));
    }

    private void appendLabel(Row row) {
        org.zkoss.zul.Label label = new org.zkoss.zul.Label();
        label.setParent(row);
        label.setValue(((WorkReportLabelTypeAssigment) row.getValue())
                .getDefaultLabel().getName());
    }

    private void appendComboboxLabelTypes(final Row row) {
        final WorkReportLabelTypeAssigment workReportLabelTypeAssigment = (WorkReportLabelTypeAssigment) row
                .getValue();

        final Combobox comboLabelTypes = createComboboxLabelTypes(workReportLabelTypeAssigment);
        comboLabelTypes.setParent(row);

        comboLabelTypes.addEventListener(Events.ON_CHANGE, new EventListener() {
            @Override
            public void onEvent(Event event) {
                changeLabelType(comboLabelTypes.getSelectedItem(),
                        workReportLabelTypeAssigment);
                validateIfExistTheSameLabelType(comboLabelTypes,
                        workReportLabelTypeAssigment);
                Util.reloadBindings(listWorkReportLabelTypeAssigments);
            }
        });

    }

    private void appendComboboxLabels(final Row row) {
        final WorkReportLabelTypeAssigment workReportLabelTypeAssigment = (WorkReportLabelTypeAssigment) row
                .getValue();
        Comboitem selectedItemType = ((Autocomplete) row.getFirstChild())
                .getSelectedItem();

        LabelType selectedLabelType = null;
        if (selectedItemType != null) {
            selectedLabelType = (LabelType) selectedItemType.getValue();
        }

        final Combobox comboLabels = createComboboxLabels(selectedLabelType,
                workReportLabelTypeAssigment);
        comboLabels.setParent(row);

        comboLabels.addEventListener(Events.ON_CHANGE, new EventListener() {
            @Override
            public void onEvent(Event event) {
                changeLabel(comboLabels.getSelectedItem(),
                        workReportLabelTypeAssigment);
                Util.reloadBindings(listWorkReportLabelTypeAssigments);
            }
        });
    }

    private void appendComboboxPositionLabel(final Row row) {
        final WorkReportLabelTypeAssigment workReportLabelTypeAssigment = (WorkReportLabelTypeAssigment) row
                .getValue();

        final Listbox listPosition = this.createListPosition();
        listPosition.setParent(row);

        if (workReportLabelTypeAssigment.getLabelsSharedByLines()) {
            listPosition.setSelectedItem(listPosition.getItemAtIndex(0));
        } else {
            listPosition.setSelectedItem(listPosition.getItemAtIndex(1));
        }

        listPosition.addEventListener(Events.ON_SELECT, new EventListener() {
            @Override
            public void onEvent(Event event) {
                changePositionLabel(listPosition.getSelectedItem(),
                            workReportLabelTypeAssigment);
                Util.reloadBindings(listWorkReportLabelTypeAssigments);
            }
        });

    }

    private void appendRemoveButtonWorkReportLabelTypeAssigment(final Row row) {
        final WorkReportLabelTypeAssigment workReportLabelTypeAssigment = (WorkReportLabelTypeAssigment) row
                .getValue();
        final Button removeButton = createRemoveButton();
        removeButton.setParent(row);

        removeButton.addEventListener(Events.ON_CLICK, new EventListener() {
            @Override
            public void onEvent(Event event) {
                removeWorkReportLabelTypeAssigment(workReportLabelTypeAssigment);
            }
        });
    }

    private Autocomplete createComboboxLabelTypes(
            WorkReportLabelTypeAssigment workReportLabelTypeAssigment) {
        Autocomplete comboLabelTypes = new Autocomplete();
        comboLabelTypes.setButtonVisible(true);

        final Set<LabelType> listLabelType = getMapLabelTypes().keySet();
        for (LabelType labelType : listLabelType) {
            Comboitem comboItem = new Comboitem();
            comboItem.setValue(labelType);
            comboItem.setLabel(labelType.getName());
            comboItem.setParent(comboLabelTypes);

            if ((workReportLabelTypeAssigment.getLabelType() != null)
                    && (workReportLabelTypeAssigment.getLabelType()
                            .equals(labelType))) {
                comboLabelTypes.setSelectedItem(comboItem);
            }
        }
        return comboLabelTypes;
    }

    private Autocomplete createComboboxLabels(LabelType labelType,
            WorkReportLabelTypeAssigment workReportLabelTypeAssigment) {
        Autocomplete comboLabels = new Autocomplete();
        comboLabels.setButtonVisible(true);

        if (labelType != null) {
            final List<Label> listLabel = this.getMapLabelTypes()
                    .get(labelType);
            for (Label label : listLabel) {
                Comboitem comboItem = new Comboitem();
                comboItem.setValue(label);
                comboItem.setLabel(label.getName());
                comboItem.setParent(comboLabels);

                if ((workReportLabelTypeAssigment.getDefaultLabel() != null)
                        && (workReportLabelTypeAssigment.getDefaultLabel()
                                .equals(label))) {
                    comboLabels.setSelectedItem(comboItem);
                }
            }
        }
        return comboLabels;
    }

    private void changePositionLabel(Listitem selectedItem,
            WorkReportLabelTypeAssigment workReportLabelTypeAssigment) {
        PositionInWorkReportEnum newPosition = (PositionInWorkReportEnum) selectedItem
                .getValue();
        workReportTypeModel.setLabelAssigmentPosition(
                workReportLabelTypeAssigment, newPosition);
    }

    private void changeLabelType(Comboitem selectedItem,
            WorkReportLabelTypeAssigment workReportLabelTypeAssigment) {
        LabelType labelType = null;
        if (selectedItem != null) {
            labelType = (LabelType) selectedItem.getValue();
        }
        workReportLabelTypeAssigment.setLabelType(labelType);
        workReportLabelTypeAssigment.setDefaultLabel(null);
    }

    private void changeLabel(Comboitem selectedItem,
            WorkReportLabelTypeAssigment workReportLabelTypeAssigment) {
        Label defaultLabel = null;
        if (selectedItem != null) {
            defaultLabel = (Label) selectedItem.getValue();
        }
        workReportLabelTypeAssigment.setDefaultLabel(defaultLabel);
    }

    /* Operations to manage the requiremts fields */

    public HoursManagementEnum[] getHoursManagementEnums() {
        return HoursManagementEnum.values();
    }

    public PositionInWorkReportEnum[] getPositionInWorkReportEnums() {
        return PositionInWorkReportEnum.values();
    }

    public PositionInWorkReportEnum getDatePosition() {
        return workReportTypeModel.getDatePosition();
    }

    public void setDatePosition(PositionInWorkReportEnum position) {
        workReportTypeModel.setDatePosition(position);
    }

    public PositionInWorkReportEnum getResourcePosition() {
        return workReportTypeModel.getResourcePosition();
    }

    public void setResourcePosition(PositionInWorkReportEnum position) {
        workReportTypeModel.setResourcePosition(position);
    }

    public PositionInWorkReportEnum getOrderElementPosition() {
        return workReportTypeModel.getOrderElementPosition();
     }

    public void setOrderElementPosition(PositionInWorkReportEnum position) {
        workReportTypeModel.setOrderElementPosition(position);
    }

    /* Operations to the data validations */

    public Constraint validateWorkReportTypeName() {
        return new Constraint() {
            @Override
            public void validate(Component comp, Object value)
                    throws WrongValueException {
                try {
                    workReportTypeModel
                            .validateWorkReportTypeName((String) value);
                } catch (IllegalArgumentException e) {
                    throw new WrongValueException(comp, _(e.getMessage()));
                }
            }
        };
    }

    public Constraint validateWorkReportTypeCode() {
        return new Constraint() {
            @Override
            public void validate(Component comp, Object value)
                    throws WrongValueException {
                try {
                    workReportTypeModel
                            .validateWorkReportTypeCode((String) value);
                } catch (IllegalArgumentException e) {
                    throw new WrongValueException(comp, _(e.getMessage()));
                }
            }
        };
    }

    public void validateIfExistTheSameLabelType(final Combobox comboLabelTypes,
            final WorkReportLabelTypeAssigment workReportLabelTypeAssigment)
            throws WrongValueException {
        if ((getWorkReportType() != null)
                && (getWorkReportType()
                        .existRepeatedLabelType(workReportLabelTypeAssigment))) {
            workReportLabelTypeAssigment.setLabelType(null);
            throw new WrongValueException(
                    comboLabelTypes,
                    _("Label type already assigned"));
        }
    }

    public Constraint validateIfExistTheSameFieldName(
            final DescriptionField descriptionField) {
        return new Constraint() {
            @Override
            public void validate(Component comp, Object value)
                    throws WrongValueException {
                descriptionField.setFieldName((String) value);
                if ((getWorkReportType() != null)
                        && (getWorkReportType()
                                .existSameFieldName(descriptionField))) {
                    descriptionField.setFieldName(null);
                    throw new WrongValueException(
                            comp,
                            _("A description field with the same name already exists."));
                }
            }
        };
    }

    private boolean isAllValid() {
        // validate workReportType name
        if (!name.isValid()) {
            selectTab(tabReportStructure);
            showInvalidWorkReportTypeName();
            return false;
        }

        if (!code.isValid()) {
            selectTab(tabReportStructure);
            showInvalidWorkReportTypeCode();
            return false;
        }

        // validate the descriptionFields and the WorkReportLabelTypeAssigments
        if (!((validateDescriptionFields()) && (validateWorkReportLabelTypeAssigments()))) {
            return false;
        }
        return validateIndexLabelsAndFields();
    }

    private boolean validateDescriptionFields() {
        DescriptionField descriptionField = workReportTypeModel
                .validateFieldNameLineFields();
        if (descriptionField != null) {
            selectTab(tabReportStructure);
            showInvalidDescriptionFieldName(descriptionField);
            return false;
        }

        descriptionField = workReportTypeModel.validateLengthLineFields();
        if (descriptionField != null) {
            selectTab(tabReportStructure);
            showInvalidDescriptionFieldLength(descriptionField);
            return false;
        }
        return true;
    }

    private boolean validateWorkReportLabelTypeAssigments() {
        WorkReportLabelTypeAssigment labelTypeAssigment = workReportTypeModel
                .validateLabelTypes();
        if (labelTypeAssigment != null) {
            selectTab(tabReportStructure);
            String errorMessage = "The label type must unique and not null.";
            showInvalidWorkReportLabelTypeAssigment(0, errorMessage,
                    labelTypeAssigment);
            return false;
        }

        WorkReportLabelTypeAssigment labelAssigment = workReportTypeModel
                .validateLabels();
        if (labelAssigment != null) {
            selectTab(tabReportStructure);
            String errorMessage = "The label must not null.";
            showInvalidWorkReportLabelTypeAssigment(2, errorMessage,
                    labelAssigment);
            return false;
        }
        return true;
    }

    private boolean validateIndexLabelsAndFields() {
        if (!workReportTypeModel.validateTheIndexFieldsAndLabels()) {
            selectTab(tabSortedLabelsAndFields);
            showMessageSortedLabelsAndFields();
            return false;
        }
        return true;
    }

    private void showInvalidWorkReportTypeName() {
        try {
            workReportTypeModel.validateWorkReportTypeName(name.getValue());
        } catch (IllegalArgumentException e) {
            throw new WrongValueException(name, _(e.getMessage()));
        }
    }

    private void showInvalidWorkReportTypeCode() {
        try {
            workReportTypeModel.validateWorkReportTypeCode(code.getValue());
        } catch (IllegalArgumentException e) {
            throw new WrongValueException(code, _(e.getMessage()));
        }
    }

    private void showInvalidDescriptionFieldName(DescriptionField field) {
        // Find which row contains the description field inside grid
        Row row = findRowByValue(listDescriptionFields.getRows(), field);
            Textbox fieldName = (Textbox) row.getFirstChild();
        throw new WrongValueException(fieldName,
                _("The field name must be unique and not empty"));
    }

    private void showInvalidDescriptionFieldLength(DescriptionField field) {
        // Find which row contains the description field inside grid
        Row row = findRowByValue(listDescriptionFields.getRows(), field);
        Intbox fieldName = (Intbox) row.getChildren().get(1);
        throw new WrongValueException(fieldName,
                _("The length must be greater than 0 and not empty"));
    }

    private void showInvalidWorkReportLabelTypeAssigment(int combo,
            String message, WorkReportLabelTypeAssigment labelType) {
        Row row = findRowByValue(listWorkReportLabelTypeAssigments.getRows(),
                labelType);
        Combobox comboLabelType = (Combobox) row.getChildren().get(combo);
        throw new WrongValueException(comboLabelType, _(message));
    }

    private Row findRowByValue(Rows rows, Object value) {
        List<Row> listRows = (List<Row>) rows.getChildren();
        for (Row row : listRows) {
            if (value.equals(row.getValue())) {
                return row;
            }
        }
        return null;
    }

    /* Operations to manage the ordered list of fields and labels */

    public void reloadOrderedListFieldsAndLabels() {
        Util.reloadBindings(orderedListFieldsAndLabels);
    }

    public List<Object> headingFieldsAndLabels(){
        return workReportTypeModel.getOrderedListHeading();
    }

    public List<Object> linesFieldsAndLabels() {
        return workReportTypeModel.getOrderedListLines();
    }

    public OrderedFieldsAndLabelsRowRenderer getOrderedFieldsAndLabelsRowRenderer() {
        return orderedFieldsAndLabesRowRenderer;
    }

    public class OrderedFieldsAndLabelsRowRenderer implements RowRenderer {

        @Override
        public void render(Row row, Object data) {
            row.setValue(data);

            String name = _("Unallocated name");
            String type;
            if (data instanceof DescriptionField) {
                if ((((DescriptionField) data).getFieldName() != null)
                        || (!((DescriptionField) data).getFieldName().isEmpty())) {
                    name = ((DescriptionField) data).getFieldName();
                }
                type = _("Text field");
            } else {
                if((((WorkReportLabelTypeAssigment) data)
                        .getLabelType() != null)
                        && (((WorkReportLabelTypeAssigment) data)
                                .getDefaultLabel() != null)) {
                    String labelType = ((WorkReportLabelTypeAssigment) data)
                        .getLabelType().getName();
                    String label = ((WorkReportLabelTypeAssigment) data)
                        .getDefaultLabel().getName();
                    name = labelType + " :: " + label;
                }
                type = _("Label");
            }

            appendNewLabel(row, name);
            appendNewLabel(row, type);
            appendOperationsFieldOrLabel(row);
        }
    }

    private void appendNewLabel(Row row, String label) {
        org.zkoss.zul.Label labelName = new org.zkoss.zul.Label();
        labelName.setParent(row);
        labelName.setValue(label);
    }

    private void appendOperationsFieldOrLabel(final Row row) {
        Hbox hbox = new Hbox();
        hbox.setParent(row);

        Button downbutton = new Button("", "/common/img/ico_subir1.png");
        downbutton.setHoverImage("/common/img/ico_subir.png");
        downbutton.setParent(hbox);
        downbutton.setSclass("icono");
        downbutton.addEventListener(Events.ON_CLICK, new EventListener() {
            @Override
            public void onEvent(Event event) {
                boolean intoHeading = intoHeading(row.getGrid());
                workReportTypeModel.upFieldOrLabel(row.getValue(), intoHeading);
                Util.reloadBindings(row.getGrid());
            }
        });

        Button upbutton = new Button("", "/common/img/ico_bajar1.png");
        upbutton.setHoverImage("/common/img/ico_bajar.png");
        upbutton.setParent(hbox);
        upbutton.setSclass("icono");
        upbutton.addEventListener(Events.ON_CLICK, new EventListener() {
            @Override
            public void onEvent(Event event) {
                boolean intoHeading = intoHeading(row.getGrid());
                workReportTypeModel.downFieldOrLabel(row.getValue(),
                        intoHeading);
                Util.reloadBindings(row.getGrid());
            }
        });

    }

    private boolean intoHeading(Grid grid) {
        if (grid.getId().equals("linesFieldsAndLabels")) {
            return false;
        } else {
            return true;
        }
    }

    private void showMessageSortedLabelsAndFields() {
        reloadOrderedListFieldsAndLabels();
        if (messagesForUserSortedLabelsAndFields != null) {
            messagesForUserSortedLabelsAndFields
                    .showMessage(
                            Level.ERROR,
                            _("Index fields and labels must be unique and consecutive"));
        }
    }

    private void selectTab(Tab tab) {
        if (tab != null) {
            tab.setSelected(true);
        }
    }

    public void sortWorkReportTypes() {
        Column columnName = (Column) listWindow
                .getFellow("workReportTypeName");
        if (columnName != null) {
            if (columnName.getSortDirection().equals("ascending")) {
                columnName.sort(false, false);
                columnName.setSortDirection("ascending");
            } else if (columnName.getSortDirection().equals("descending")) {
                columnName.sort(true, false);
                columnName.setSortDirection("descending");
            }
        }
    }

    public void onCheckGenerateCode(Event e) {
        CheckEvent ce = (CheckEvent) e;
        if (ce.isChecked()) {
            // we have to auto-generate the code for new objects
            try {
                workReportTypeModel.setCodeAutogenerated(ce.isChecked());
            } catch (ConcurrentModificationException err) {
                messagesForUser.showMessage(Level.ERROR, err.getMessage());
            }
        }
        Util.reloadBindings(code);
    }

    @Override
    protected String getEntityType() {
        return _("Timesheets Template");
    }

    @Override
    protected String getPluralEntityType() {
        return _("Timesheets Templates");
    }

    @Override
    protected void initCreate() {
        workReportTypeModel.prepareForCreate();
        loadComponents(editWindow);
    }

    @Override
    protected void initEdit(WorkReportType workReportType) {
        workReportTypeModel.initEdit(workReportType);
        loadComponents(editWindow);
    }

    @Override
    protected WorkReportType getEntityBeingEdited() {
        return workReportTypeModel.getWorkReportType();
    }

    @Override
    protected boolean beforeDeleting(WorkReportType workReportType) {
        if (thereAreWorkReportsFor(workReportType)) {
            try {
                Messagebox
                        .show(_("Cannot delete timesheet template. There are some timesheets bound to it."),
                                _("Warning"), Messagebox.OK, Messagebox.EXCLAMATION);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            return false;
        }
        return true;
    }

    @Override
    protected void delete(WorkReportType workReportType)
            throws InstanceNotFoundException {
        workReportTypeModel.confirmRemove(workReportType);
        final Grid workReportTypes = (Grid) listWindow.getFellowIfAny("listing");
        if (workReportTypes != null) {
            Util.reloadBindings(workReportTypes);
        }
    }
}
TOP

Related Classes of org.libreplan.web.workreports.WorkReportTypeCRUDController$OrderedFieldsAndLabelsRowRenderer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.