Package org.libreplan.web.orders

Source Code of org.libreplan.web.orders.OrderElementOperations

/*
* 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) 2011-2012 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.orders;

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

import org.libreplan.business.orders.entities.OrderElement;
import org.libreplan.web.templates.IOrderTemplatesControllerEntryPoints;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Tree;
import org.zkoss.zul.Treeitem;

/**
*
* @author Diego Pino García <dpino@igalia.com>
*
*         Encapsulates the operations (up, down, indent, unindent, etc) for an
*         element of the tree. The element can be an OrderElement or a
*         TemplateElement
*/
public abstract class TreeElementOperationsController<T> {

    protected Tree tree;

    public void editSelectedElement() {
        if (tree.getSelectedCount() == 1) {
            showEditElement(tree.getSelectedItem());
        } else {
            showSelectAnElementError();
        }
    }

    protected void showSelectAnElementError() {
        try {
            Messagebox.show(_("Please select a task"));
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    protected abstract void showEditElement(Treeitem treeitem);

    public void moveSelectedElementUp() {
        if (tree.getSelectedCount() == 1) {
            Treeitem item =  tree.getSelectedItem();
            up((T)item.getValue());
            Treeitem brother = (Treeitem) item.getPreviousSibling();
            if (brother != null) {
                brother.setSelected(true);
            }
        } else {
            showSelectAnElementError();
        }
    }

    protected abstract void up(T element);

    public void moveSelectedElementDown() {
        if (tree.getSelectedCount() == 1) {
            Treeitem item =  tree.getSelectedItem();
            down((T)item.getValue());
            Treeitem brother = (Treeitem) item.getNextSibling();
            if (brother != null) {
                brother.setSelected(true);
            }
        } else {
            showSelectAnElementError();
        }
    }

    protected abstract void down(T element);

    public void indentSelectedElement() {
        if (tree.getSelectedCount() == 1) {
            int page = tree.getActivePage();
            indent(getSelectedElement());
            if (tree.getPageCount() > page) {
                tree.setActivePage(page);
            }
        } else {
            showSelectAnElementError();
        }
    }

    protected abstract T getSelectedElement();

    protected abstract void indent(T element);

    public void unindentSelectedElement() {
        if (tree.getSelectedCount() == 1) {
            unindent(getSelectedElement());
        } else {
            showSelectAnElementError();
        }
    }

    protected abstract void unindent(T element);

    public void deleteSelectedElement() {
        if (tree.getSelectedCount() == 1) {
            remove(getSelectedElement());
        } else {
            showSelectAnElementError();
        }
    }

    protected abstract void remove(T element);

}

/**
*
* @author Diego Pino García <dpino@igalia.com>
*
*      Implements tree operations for an {@link OrderElement}
*
*/
class OrderElementOperations extends TreeElementOperationsController<OrderElement> {

    private OrderElementTreeController treeController;

    private IOrderModel orderModel;

    private OrderElementController orderElementController;

    private IOrderTemplatesControllerEntryPoints orderTemplates;

    public static OrderElementOperations build() {
        return new OrderElementOperations();
    }

    private OrderElementOperations() {

    }

    public OrderElementOperations tree(Tree tree) {
        super.tree = tree;
        return this;
    }

    public OrderElementOperations treeController(OrderElementTreeController treeController) {
        this.treeController = treeController;
        return this;
    }

    public OrderElementOperations orderModel(IOrderModel orderModel) {
        this.orderModel = orderModel;
        return this;
    }

    public OrderElementOperations orderElementController(OrderElementController orderElementController) {
        this.orderElementController = orderElementController;
        return this;
    }

    public OrderElementOperations orderTemplates(
            IOrderTemplatesControllerEntryPoints orderTemplates) {
        this.orderTemplates = orderTemplates;
        return this;
    }

    @Override
    protected OrderElement getSelectedElement() {
        return treeController.getSelectedNode();
    }

    @Override
    protected void up(OrderElement element) {
        treeController.up(element);
    }

    @Override
    protected void down(OrderElement element) {
        treeController.down(element);
    }

    @Override
    protected void indent(OrderElement element) {
        treeController.indent(element);
    }

    @Override
    protected void unindent(OrderElement element) {
        treeController.unindent(element);
    }

    @Override
    protected void remove(OrderElement element) {
        treeController.remove(element);
    }

    @Override
    protected void showEditElement(Treeitem item) {
        OrderElement orderElement = (OrderElement) item.getValue();
        treeController.markModifiedTreeitem(item.getTreerow());
        IOrderElementModel model = orderModel
                .getOrderElementModel(orderElement);
        orderElementController.openWindow(model);
        treeController.refreshRow(item);
    }

    public void createTemplateFromSelectedElement() {
        if (tree.getSelectedCount() == 1) {
            createTemplate(getSelectedElement());
        } else {
            showSelectAnElementError();
        }
    }

    private void createTemplate(OrderElement element) {
        if (element.isNewObject()) {
            notifyTemplateCantBeCreated();
            return;
        }
        if (showConfirmCreateTemplateDialog() == Messagebox.OK) {
            orderTemplates.goToCreateTemplateFrom(element);
        }
    }

    private int showConfirmCreateTemplateDialog() {
        try {
            return Messagebox
                    .show(_("Unsaved changes will be lost. Would you like to continue?"),
                            _("Confirm create template"), Messagebox.OK
                                    | Messagebox.CANCEL, Messagebox.QUESTION);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    private void notifyTemplateCantBeCreated() {
        try {
            Messagebox.show(
                    _("Templates can only be created out of existent tasks."
                            + "You are trying to create a template out of a new task.\n"
                            + "Please save your project before proceeding."),
                    _("Operation cannot be done"), Messagebox.OK,
                    Messagebox.INFORMATION);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

}
TOP

Related Classes of org.libreplan.web.orders.OrderElementOperations

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.