From 3aac0cb3537eaa40d04e5c7c2df2393569a31aed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Thu, 7 Jan 2010 20:33:34 +0100 Subject: [PATCH] ItEr42S17CUGravacionModelosUnidadesTraballoItEr41S20: Extracting superclass for controller --- .../AssignedMaterialsController.java | 511 ++++++++++++++++++ ...gnedMaterialsToOrderElementController.java | 454 +--------------- 2 files changed, 536 insertions(+), 429 deletions(-) create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsController.java diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsController.java new file mode 100644 index 000000000..5e2cf0296 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsController.java @@ -0,0 +1,511 @@ +/* + * This file is part of ###PROJECT_NAME### + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * + * 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 . + */ +package org.navalplanner.web.orders.materials; + +import static org.navalplanner.web.I18nHelper._; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.logging.LogFactory; +import org.navalplanner.business.materials.entities.Material; +import org.navalplanner.business.materials.entities.MaterialAssignment; +import org.navalplanner.business.materials.entities.MaterialCategory; +import org.navalplanner.business.orders.entities.OrderElement; +import org.navalplanner.web.common.Util; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.Executions; +import org.zkoss.zk.ui.SuspendNotAllowedException; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zk.ui.util.GenericForwardComposer; +import org.zkoss.zul.Doublebox; +import org.zkoss.zul.Grid; +import org.zkoss.zul.Label; +import org.zkoss.zul.Listbox; +import org.zkoss.zul.Listitem; +import org.zkoss.zul.Messagebox; +import org.zkoss.zul.Row; +import org.zkoss.zul.SimpleListModel; +import org.zkoss.zul.Tab; +import org.zkoss.zul.Tree; +import org.zkoss.zul.TreeModel; +import org.zkoss.zul.Treecell; +import org.zkoss.zul.Treeitem; +import org.zkoss.zul.TreeitemRenderer; +import org.zkoss.zul.Treerow; +import org.zkoss.zul.Vbox; +import org.zkoss.zul.api.Textbox; +import org.zkoss.zul.impl.MessageboxDlg; + +/** + * @author Óscar González Fernández + * + */ +public abstract class AssignedMaterialsController extends GenericForwardComposer { + + private static final org.apache.commons.logging.Log LOG = LogFactory + .getLog(AssignedMaterialsController.class); + + private Tree categoriesTree; + + private Tree allCategoriesTree; + + private Grid gridMaterials; + + private Listbox lbFoundMaterials; + + private Textbox txtSearchMaterial; + + private Tab tbAssignedMaterials; + + private Vbox assignmentsBox; + + protected abstract IAssignedMaterialsModel getModel(); + + @Override + public void doAfterCompose(Component comp) throws Exception { + super.doAfterCompose(comp); + createAssignmentsBoxComponent(assignmentsBox); + } + + protected abstract void createAssignmentsBoxComponent(Component parent); + + public void openWindow(T element) { + initializeEdition(element); + prepareCategoriesTree(); + prepareAllCategoriesTree(); + reloadGridMaterials(); + } + + protected abstract void initializeEdition(T orderElement); + + /** + * Delay initialization of categories tree till user clicks on Materials tab + * + * Initializing model and renderer properties directly in ZUL resulted in calling the renderer + * more times than actually needed, resulting in noticeable lack of performance + */ + private void prepareCategoriesTree() { + if (categoriesTree.getTreeitemRenderer() == null) { + categoriesTree.setTreeitemRenderer(getMaterialCategoryWithUnitsAndPriceRenderer()); + } + categoriesTree.setModel(getMaterialCategories()); + } + + public abstract TreeModel getMaterialCategories(); + + private void prepareAllCategoriesTree() { + if (allCategoriesTree.getTreeitemRenderer() == null) { + allCategoriesTree.setTreeitemRenderer(getMaterialCategoryRenderer()); + } + allCategoriesTree.setModel(getAllMaterialCategories()); + } + + public abstract TreeModel getAllMaterialCategories(); + + public abstract double getTotalUnits(); + + public abstract BigDecimal getTotalPrice(); + + /** + * On selecting category, refresh {@link MaterialAssignment} associated with + * selected {@link MaterialCategory} + */ + public void refreshMaterialAssigments() { + final List materials = getAssignedMaterials(); + gridMaterials.setModel(new SimpleListModel(materials)); + reloadGridMaterials(); + } + + public List getAssignedMaterials() { + final Treeitem treeitem = categoriesTree.getSelectedItem(); + return getAssignedMaterials(treeitem); + } + + private List getAssignedMaterials(Treeitem treeitem) { + final MaterialCategory materialCategory = (treeitem != null) ? (MaterialCategory) treeitem.getValue() : null; + return getAssignedMaterials(materialCategory); + } + + public List getAssignedMaterials(MaterialCategory materialCategory) { + return getModel().getAssignedMaterials(materialCategory); + } + + /** + * On changing total price, recalculate unit price and refresh categories tree + * + * @param row + */ + public void updateTotalPrice(Row row) { + final A materialAssignment = (A) row.getValue(); + reloadGridMaterials(); + refreshTotalPriceAndTotalUnits(materialAssignment); + } + + protected abstract Double getTotalPrice(A materialAssignment); + + /** + * Refresh categoriesTree since it shows totalUnits and totalPrice as well + */ + private void refreshTotalPriceAndTotalUnits(A materialAssignment) { + final Treeitem item = findMaterialCategoryInTree(getCategory(materialAssignment), categoriesTree); + if (item != null) { + // Reload categoriesTree + categoriesTree.setModel(getMaterialCategories()); + } + } + + private Treeitem findMaterialCategoryInTree(MaterialCategory category, Tree tree) { + for (Iterator i = tree.getItems().iterator(); i.hasNext();) { + Treeitem treeitem = (Treeitem) i.next(); + final MaterialCategory materialCategory = (MaterialCategory) treeitem + .getValue(); + if (category.equals(materialCategory)) { + return treeitem; + } + } + return null; + } + + private MaterialCategory getCategory(A assignment) { + return getMaterial(assignment).getCategory(); + } + + /** + * Search materials on pressing search button + */ + public void searchMaterials() { + final String text = txtSearchMaterial.getValue(); + final MaterialCategory materialCategory = getSelectedCategory(allCategoriesTree); + getModel().searchMaterials(text, materialCategory); + Util.reloadBindings(lbFoundMaterials); + } + + /** + * Returns {@link MaterialCategory} associated with selected {@link Treeitem} in {@link Tree} + * + * @param tree + * @return + */ + private MaterialCategory getSelectedCategory(Tree tree) { + final Treeitem treeitem = tree.getSelectedItem(); + return (treeitem != null) ? (MaterialCategory) treeitem.getValue() : null; + } + + /** + * Get materials found on latest search + * + * @return + */ + public List getMatchingMaterials() { + return getModel().getMatchingMaterials(); + } + + /** + * Assigns a list of selected {@link Material} to current {@link OrderElement} + */ + public void assignSelectedMaterials() { + Set materials = getSelectedMaterials(); + if (materials.isEmpty()) { + return; + } + + for(Material each: materials) { + getModel().addMaterialAssignment(each); + } + + categoriesTree.clearSelection(); + tbAssignedMaterials.setSelected(true); + lbFoundMaterials.clearSelection(); + Util.reloadBindings(categoriesTree); + reloadGridMaterials(); + } + + private Set getSelectedMaterials() { + Set result = new HashSet(); + + final Set listitems = lbFoundMaterials.getSelectedItems(); + for (Listitem each: listitems) { + final Material material = (Material) each.getValue(); + result.add(material); + } + return result; + } + + public void clearSelectionCategoriesTree() { + categoriesTree.clearSelection(); + reloadGridMaterials(); + } + + private void reloadGridMaterials() { + if (gridMaterials != null) { + Util.reloadBindings(gridMaterials); + } + } + + public void clearSelectionAllCategoriesTree() { + allCategoriesTree.clearSelection(); + retrieveAllMaterials(); + Util.reloadBindings(lbFoundMaterials); + } + + private void retrieveAllMaterials() { + getModel().searchMaterials("", null); + } + + public MaterialCategoryRenderer getMaterialCategoryRenderer() { + return new MaterialCategoryRenderer(); + } + + private class MaterialCategoryRenderer implements TreeitemRenderer { + + /** + * Copied verbatim from org.zkoss.zul.Tree; + */ + @Override + public void render(Treeitem ti, Object node) throws Exception { + final MaterialCategory materialCategory = (MaterialCategory) node; + + Label lblName = new Label(materialCategory.getName()); + + Treerow tr = null; + ti.setValue(node); + if (ti.getTreerow() == null) { + tr = new Treerow(); + tr.setParent(ti); + ti.setOpen(true); // Expand node + } else { + tr = ti.getTreerow(); + tr.getChildren().clear(); + } + // Add category name + Treecell cellName = new Treecell(); + cellName.addEventListener("onClick", new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + getModel().searchMaterials("", materialCategory); + Util.reloadBindings(lbFoundMaterials); + } + }); + lblName.setParent(cellName); + cellName.setParent(tr); + } + } + + public MaterialCategoryWithUnitsAndPriceRenderer getMaterialCategoryWithUnitsAndPriceRenderer() { + return new MaterialCategoryWithUnitsAndPriceRenderer(); + } + + private class MaterialCategoryWithUnitsAndPriceRenderer implements TreeitemRenderer { + + /** + * Copied verbatim from org.zkoss.zul.Tree; + */ + @Override + public void render(Treeitem ti, Object node) throws Exception { + final MaterialCategory materialCategory = (MaterialCategory) node; + + Label lblName = new Label(materialCategory.getName()); + Label lblUnits = new Label(new Double(getUnits(materialCategory)).toString()); + Label lblPrice = new Label(getPrice(materialCategory).toString()); + + Treerow tr = null; + ti.setValue(node); + if (ti.getTreerow() == null) { + tr = new Treerow(); + tr.setParent(ti); + ti.setOpen(true); // Expand node + } else { + tr = ti.getTreerow(); + tr.getChildren().clear(); + } + // Add category name + Treecell cellName = new Treecell(); + lblName.setParent(cellName); + cellName.setParent(tr); + + // Add total assigned material units in category + Treecell cellUnits = new Treecell(); + lblUnits.setParent(cellUnits); + cellUnits.setParent(tr); + + // Add total price for assigned materials in category + Treecell cellPrice = new Treecell(); + lblPrice.setParent(cellPrice); + cellPrice.setParent(tr); + } + + private double getUnits(MaterialCategory materialCategory) { + return getModel().getUnits(materialCategory); + } + + private BigDecimal getPrice(MaterialCategory materialCategory) { + return getModel().getPrice(materialCategory); + } + + } + + /** + * On clicking remove {@link MaterialAssignment}, shows dialog for + * confirming removing selected element + * + * @param materialAssignment + */ + public void showRemoveMaterialAssignmentDlg(A materialAssignment) { + try { + int status = Messagebox.show(_("Delete item {0}. Are you sure?", getMaterial(materialAssignment).getCode()), + _("Delete"), Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION); + if (Messagebox.OK == status) { + removeMaterialAssignment(materialAssignment); + } + } catch (InterruptedException e) { + LOG.error(_("Error on showing delete confirm"), e); + } + } + + protected abstract Material getMaterial(A materialAssignment); + + private void removeMaterialAssignment(A materialAssignment) { + getModel().removeMaterialAssignment(materialAssignment); + reloadGridMaterials(); + reloadTree(categoriesTree); + } + + private void reloadTree(Tree tree) { + final Treeitem treeitem = tree.getSelectedItem(); + + if (treeitem != null) { + final MaterialCategory materialCategory = (MaterialCategory) treeitem.getValue(); + tree.setModel(getMaterialCategories()); + locateAndSelectMaterialCategory(tree, materialCategory); + } else { + tree.setModel(getMaterialCategories()); + reloadGridMaterials(); + } + } + + private boolean locateAndSelectMaterialCategory(Tree tree, MaterialCategory materialCategory) { + Treeitem treeitem = findTreeItemByMaterialCategory(tree.getRoot(), materialCategory); + if (treeitem != null) { + treeitem.setSelected(true); + return true; + } + return false; + } + + @SuppressWarnings("unchecked") + private Treeitem findTreeItemByMaterialCategory(Component node, MaterialCategory materialCategory) { + if (node instanceof Treeitem) { + final Treeitem treeitem = (Treeitem) node; + final MaterialCategory _materialCategory = (MaterialCategory) treeitem.getValue(); + if (_materialCategory.getId().equals(materialCategory.getId())) { + return treeitem; + } + } + for (Iterator i = node.getChildren().iterator(); i.hasNext(); ) { + Object obj = i.next(); + if (obj instanceof Component) { + Treeitem treeitem = findTreeItemByMaterialCategory((Component) obj, materialCategory); + if (treeitem != null) { + return treeitem; + } + } + } + return null; + } + + /** + * On clicking Split button, shows dialog for splitting selected + * {@link MaterialAssignment} into two + * + * @param materialAssignment + */ + @SuppressWarnings("unchecked") + public void showSplitMaterialAssignmentDlg(A materialAssignment) { + MessageboxDlg dialogSplitAssignment; + + final String message = _("Create new material assignment out of material assignment {0}. Are you sure?", + getMaterial(materialAssignment).getCode()); + + Map args = new HashMap(); + args.put("message", message); + args.put("title", _("Split new assignment")); + args.put("OK", Messagebox.OK); + args.put("CANCEL", Messagebox.CANCEL); + args.put("icon", Messagebox.QUESTION); + + dialogSplitAssignment = (MessageboxDlg) Executions + .createComponents("/orders/_splitMaterialAssignmentDlg.zul", + self, args); + Doublebox dbUnits = (Doublebox) dialogSplitAssignment.getFellowIfAny("dbUnits"); + dbUnits.setValue(getUnits(materialAssignment)); + try { + dialogSplitAssignment.doModal(); + int status = dialogSplitAssignment.getResult(); + if (Messagebox.OK == status) { + splitMaterialAssignment(materialAssignment, dbUnits.getValue()); + } + } catch (SuspendNotAllowedException e) { + LOG.error(_("Error on splitting"), e); + } catch (InterruptedException e) { + LOG.error(_("Error on splitting"), e); + } + } + + /** + * Creates a new {@link MaterialAssignment} out of materialAssignment, but + * setting its units attribute to units. + * + * materialAssignment passed as parameter decreases its units attribute in units + * + * @param materialAssignment + * @param units + */ + private void splitMaterialAssignment(A materialAssignment, double units) { + A newAssignment = copyFrom(materialAssignment); + double currentUnits = getUnits(materialAssignment); + if (units > currentUnits) { + units = currentUnits; + currentUnits = 0; + } else { + currentUnits -= units; + } + setUnits(newAssignment, units); + setUnits(materialAssignment, currentUnits); + getModel().addMaterialAssignment(newAssignment); + reloadGridMaterials(); + } + + protected abstract void setUnits(A assignment, double units); + + protected abstract A copyFrom(A assignment); + + protected abstract double getUnits(A assignment); + +} + + diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsToOrderElementController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsToOrderElementController.java index 3d72e3285..43f525eb8 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsToOrderElementController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsToOrderElementController.java @@ -20,47 +20,16 @@ package org.navalplanner.web.orders.materials; -import static org.navalplanner.web.I18nHelper._; - import java.math.BigDecimal; import java.math.RoundingMode; import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import org.apache.commons.logging.LogFactory; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialAssignment; -import org.navalplanner.business.materials.entities.MaterialCategory; import org.navalplanner.business.orders.entities.OrderElement; -import org.navalplanner.web.common.Util; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Executions; -import org.zkoss.zk.ui.SuspendNotAllowedException; -import org.zkoss.zk.ui.event.Event; -import org.zkoss.zk.ui.event.EventListener; -import org.zkoss.zk.ui.util.GenericForwardComposer; -import org.zkoss.zul.Doublebox; -import org.zkoss.zul.Grid; -import org.zkoss.zul.Label; -import org.zkoss.zul.Listbox; -import org.zkoss.zul.Listitem; -import org.zkoss.zul.Messagebox; -import org.zkoss.zul.Row; -import org.zkoss.zul.SimpleListModel; -import org.zkoss.zul.Tab; -import org.zkoss.zul.Tree; import org.zkoss.zul.TreeModel; -import org.zkoss.zul.Treecell; -import org.zkoss.zul.Treeitem; -import org.zkoss.zul.TreeitemRenderer; -import org.zkoss.zul.Treerow; -import org.zkoss.zul.Vbox; -import org.zkoss.zul.api.Textbox; -import org.zkoss.zul.impl.MessageboxDlg; /** * Controller for showing {@link OrderElement} assigned {@link Material} @@ -69,63 +38,30 @@ import org.zkoss.zul.impl.MessageboxDlg; * */ public class AssignedMaterialsToOrderElementController extends - GenericForwardComposer { - - private static final org.apache.commons.logging.Log LOG = LogFactory.getLog(AssignedMaterialsToOrderElementController.class); + AssignedMaterialsController { private IAssignedMaterialsToOrderElementModel assignedMaterialsToOrderElementModel; - private Tree categoriesTree; - - private Tree allCategoriesTree; - - private Grid gridMaterials; - - private Listbox lbFoundMaterials; - - private Textbox txtSearchMaterial; - - private Tab tbAssignedMaterials; - - private Vbox assignmentsBox; + @Override + protected IAssignedMaterialsModel getModel() { + return assignedMaterialsToOrderElementModel; + } @Override - public void doAfterCompose(Component comp) throws Exception { - super.doAfterCompose(comp); - Executions.createComponents("/orders/_assignmentsBox.zul", - assignmentsBox, new HashMap()); + protected void createAssignmentsBoxComponent(Component parent) { + Executions.createComponents("/orders/_assignmentsBox.zul", parent, + new HashMap()); } - public void openWindow(OrderElement orderElement) { + @Override + protected void initializeEdition(OrderElement orderElement) { assignedMaterialsToOrderElementModel.initEdit(orderElement); - prepareCategoriesTree(); - prepareAllCategoriesTree(); - } - - /** - * Delay initialization of categories tree till user clicks on Materials tab - * - * Initializing model and renderer properties directly in ZUL resulted in calling the renderer - * more times than actually needed, resulting in noticeable lack of performance - */ - private void prepareCategoriesTree() { - if (categoriesTree.getTreeitemRenderer() == null) { - categoriesTree.setTreeitemRenderer(getMaterialCategoryWithUnitsAndPriceRenderer()); - } - categoriesTree.setModel(getMaterialCategories()); } public TreeModel getMaterialCategories() { return assignedMaterialsToOrderElementModel.getMaterialCategories(); } - private void prepareAllCategoriesTree() { - if (allCategoriesTree.getTreeitemRenderer() == null) { - allCategoriesTree.setTreeitemRenderer(getMaterialCategoryRenderer()); - } - allCategoriesTree.setModel(getAllMaterialCategories()); - } - public TreeModel getAllMaterialCategories() { return assignedMaterialsToOrderElementModel.getAllMaterialCategories(); } @@ -154,369 +90,29 @@ public class AssignedMaterialsToOrderElementController extends return assignedMaterialsToOrderElementModel.getOrderElement(); } - /** - * On selecting category, refresh {@link MaterialAssignment} associated with - * selected {@link MaterialCategory} - */ - public void refreshMaterialAssigments() { - final List materials = getAssignedMaterials(); - gridMaterials.setModel(new SimpleListModel(materials)); - Util.reloadBindings(gridMaterials); + @Override + protected MaterialAssignment copyFrom(MaterialAssignment assignment) { + return MaterialAssignment.create(assignment); } - public List getAssignedMaterials() { - final Treeitem treeitem = categoriesTree.getSelectedItem(); - return getAssignedMaterials(treeitem); + @Override + protected Material getMaterial(MaterialAssignment materialAssignment) { + return materialAssignment.getMaterial(); } - private List getAssignedMaterials(Treeitem treeitem) { - final MaterialCategory materialCategory = (treeitem != null) ? (MaterialCategory) treeitem.getValue() : null; - return getAssignedMaterials(materialCategory); + @Override + protected Double getTotalPrice(MaterialAssignment materialAssignment) { + return materialAssignment.getTotalPrice().doubleValue(); } - private List getAssignedMaterials(MaterialCategory materialCategory) { - return assignedMaterialsToOrderElementModel.getAssignedMaterials(materialCategory); + @Override + protected double getUnits(MaterialAssignment assignment) { + return assignment.getUnits(); } - /** - * On changing total price, recalculate unit price and refresh categories tree - * - * @param row - */ - public void updateTotalPrice(Row row) { - final MaterialAssignment materialAssignment = (MaterialAssignment) row - .getValue(); - Doublebox totalPrice = (Doublebox) row.getChildren().get(5); - totalPrice.setValue(materialAssignment.getTotalPrice().doubleValue()); - refreshTotalPriceAndTotalUnits(materialAssignment); - } - - /** - * Refresh categoriesTree since it shows totalUnits and totalPrice as well - */ - private void refreshTotalPriceAndTotalUnits(MaterialAssignment materialAssignment) { - final Treeitem item = findMaterialCategoryInTree(materialAssignment - .getMaterial().getCategory(), categoriesTree); - if (item != null) { - // Reload categoriesTree - categoriesTree.setModel(getMaterialCategories()); - } - } - - /** - * Finds which {@link Treeitem} in tree is associated with category - * - * @param category - * @param tree - * @return - */ - private Treeitem findMaterialCategoryInTree(MaterialCategory category, Tree tree) { - for (Iterator i = tree.getItems().iterator(); i.hasNext(); ) { - Treeitem treeitem = (Treeitem) i.next(); - final MaterialCategory materialCategory = (MaterialCategory) treeitem.getValue(); - if (category.equals(materialCategory)) { - return treeitem; - } - } - return null; - } - - /** - * Search materials on pressing search button - */ - public void searchMaterials() { - final String text = txtSearchMaterial.getValue(); - final MaterialCategory materialCategory = getSelectedCategory(allCategoriesTree); - assignedMaterialsToOrderElementModel.searchMaterials(text, materialCategory); - Util.reloadBindings(lbFoundMaterials); - } - - /** - * Returns {@link MaterialCategory} associated with selected {@link Treeitem} in {@link Tree} - * - * @param tree - * @return - */ - private MaterialCategory getSelectedCategory(Tree tree) { - final Treeitem treeitem = tree.getSelectedItem(); - return (treeitem != null) ? (MaterialCategory) treeitem.getValue() : null; - } - - /** - * Get materials found on latest search - * - * @return - */ - public List getMatchingMaterials() { - return assignedMaterialsToOrderElementModel.getMatchingMaterials(); - } - - /** - * Assigns a list of selected {@link Material} to current {@link OrderElement} - */ - public void assignSelectedMaterials() { - Set materials = getSelectedMaterials(); - if (materials.isEmpty()) { - return; - } - - for(Material each: materials) { - assignedMaterialsToOrderElementModel.addMaterialAssignment(each); - } - - categoriesTree.clearSelection(); - tbAssignedMaterials.setSelected(true); - lbFoundMaterials.clearSelection(); - Util.reloadBindings(categoriesTree); - Util.reloadBindings(gridMaterials); - } - - private Set getSelectedMaterials() { - Set result = new HashSet(); - - final Set listitems = lbFoundMaterials.getSelectedItems(); - for (Listitem each: listitems) { - final Material material = (Material) each.getValue(); - result.add(material); - } - return result; - } - - public void clearSelectionCategoriesTree() { - categoriesTree.clearSelection(); - Util.reloadBindings(gridMaterials); - } - - public void clearSelectionAllCategoriesTree() { - allCategoriesTree.clearSelection(); - retrieveAllMaterials(); - Util.reloadBindings(lbFoundMaterials); - } - - private void retrieveAllMaterials() { - assignedMaterialsToOrderElementModel.searchMaterials("", null); - } - - public MaterialCategoryRenderer getMaterialCategoryRenderer() { - return new MaterialCategoryRenderer(); - } - - private class MaterialCategoryRenderer implements TreeitemRenderer { - - /** - * Copied verbatim from org.zkoss.zul.Tree; - */ - @Override - public void render(Treeitem ti, Object node) throws Exception { - final MaterialCategory materialCategory = (MaterialCategory) node; - - Label lblName = new Label(materialCategory.getName()); - - Treerow tr = null; - ti.setValue(node); - if (ti.getTreerow() == null) { - tr = new Treerow(); - tr.setParent(ti); - ti.setOpen(true); // Expand node - } else { - tr = ti.getTreerow(); - tr.getChildren().clear(); - } - // Add category name - Treecell cellName = new Treecell(); - cellName.addEventListener("onClick", new EventListener() { - - @Override - public void onEvent(Event event) throws Exception { - assignedMaterialsToOrderElementModel.searchMaterials("", materialCategory); - Util.reloadBindings(lbFoundMaterials); - } - }); - lblName.setParent(cellName); - cellName.setParent(tr); - } - } - - public MaterialCategoryWithUnitsAndPriceRenderer getMaterialCategoryWithUnitsAndPriceRenderer() { - return new MaterialCategoryWithUnitsAndPriceRenderer(); - } - - private class MaterialCategoryWithUnitsAndPriceRenderer implements TreeitemRenderer { - - /** - * Copied verbatim from org.zkoss.zul.Tree; - */ - @Override - public void render(Treeitem ti, Object node) throws Exception { - final MaterialCategory materialCategory = (MaterialCategory) node; - - Label lblName = new Label(materialCategory.getName()); - Label lblUnits = new Label(new Double(getUnits(materialCategory)).toString()); - Label lblPrice = new Label(getPrice(materialCategory).toString()); - - Treerow tr = null; - ti.setValue(node); - if (ti.getTreerow() == null) { - tr = new Treerow(); - tr.setParent(ti); - ti.setOpen(true); // Expand node - } else { - tr = ti.getTreerow(); - tr.getChildren().clear(); - } - // Add category name - Treecell cellName = new Treecell(); - lblName.setParent(cellName); - cellName.setParent(tr); - - // Add total assigned material units in category - Treecell cellUnits = new Treecell(); - lblUnits.setParent(cellUnits); - cellUnits.setParent(tr); - - // Add total price for assigned materials in category - Treecell cellPrice = new Treecell(); - lblPrice.setParent(cellPrice); - cellPrice.setParent(tr); - } - - private double getUnits(MaterialCategory materialCategory) { - return assignedMaterialsToOrderElementModel.getUnits(materialCategory); - } - - private BigDecimal getPrice(MaterialCategory materialCategory) { - return assignedMaterialsToOrderElementModel.getPrice(materialCategory); - } - - } - - /** - * On clicking remove {@link MaterialAssignment}, shows dialog for - * confirming removing selected element - * - * @param materialAssignment - */ - public void showRemoveMaterialAssignmentDlg(MaterialAssignment materialAssignment) { - try { - int status = Messagebox.show(_("Delete item {0}. Are you sure?", materialAssignment.getMaterial().getCode()), - _("Delete"), Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION); - if (Messagebox.OK == status) { - removeMaterialAssignment(materialAssignment); - } - } catch (InterruptedException e) { - LOG.error(_("Error on showing delete materialAssignment: ", materialAssignment.getId()), e); - } - } - - private void removeMaterialAssignment(MaterialAssignment materialAssignment) { - assignedMaterialsToOrderElementModel.removeMaterialAssignment(materialAssignment); - Util.reloadBindings(gridMaterials); - reloadTree(categoriesTree); - } - - private void reloadTree(Tree tree) { - final Treeitem treeitem = tree.getSelectedItem(); - - if (treeitem != null) { - final MaterialCategory materialCategory = (MaterialCategory) treeitem.getValue(); - tree.setModel(getMaterialCategories()); - locateAndSelectMaterialCategory(tree, materialCategory); - } else { - tree.setModel(getMaterialCategories()); - Util.reloadBindings(gridMaterials); - } - } - - private boolean locateAndSelectMaterialCategory(Tree tree, MaterialCategory materialCategory) { - Treeitem treeitem = findTreeItemByMaterialCategory(tree.getRoot(), materialCategory); - if (treeitem != null) { - treeitem.setSelected(true); - return true; - } - return false; - } - - @SuppressWarnings("unchecked") - private Treeitem findTreeItemByMaterialCategory(Component node, MaterialCategory materialCategory) { - if (node instanceof Treeitem) { - final Treeitem treeitem = (Treeitem) node; - final MaterialCategory _materialCategory = (MaterialCategory) treeitem.getValue(); - if (_materialCategory.getId().equals(materialCategory.getId())) { - return treeitem; - } - } - for (Iterator i = node.getChildren().iterator(); i.hasNext(); ) { - Object obj = i.next(); - if (obj instanceof Component) { - Treeitem treeitem = findTreeItemByMaterialCategory((Component) obj, materialCategory); - if (treeitem != null) { - return treeitem; - } - } - } - return null; - } - - /** - * On clicking Split button, shows dialog for splitting selected - * {@link MaterialAssignment} into two - * - * @param materialAssignment - */ - @SuppressWarnings("unchecked") - public void showSplitMaterialAssignmentDlg(MaterialAssignment materialAssignment) { - MessageboxDlg dialogSplitAssignment; - - final String message = _("Create new material assignment out of material assignment {0}. Are you sure?", - materialAssignment.getMaterial().getCode()); - - Map args = new HashMap(); - args.put("message", message); - args.put("title", _("Split new assignment")); - args.put("OK", Messagebox.OK); - args.put("CANCEL", Messagebox.CANCEL); - args.put("icon", Messagebox.QUESTION); - - dialogSplitAssignment = (MessageboxDlg) Executions - .createComponents("/orders/_splitMaterialAssignmentDlg.zul", - self, args); - Doublebox dbUnits = (Doublebox) dialogSplitAssignment.getFellowIfAny("dbUnits"); - dbUnits.setValue(materialAssignment.getUnits()); - try { - dialogSplitAssignment.doModal(); - int status = dialogSplitAssignment.getResult(); - if (Messagebox.OK == status) { - splitMaterialAssignment(materialAssignment, dbUnits.getValue()); - } - } catch (SuspendNotAllowedException e) { - LOG.error(_("Error on splitting element: ", materialAssignment.getId()), e); - } catch (InterruptedException e) { - LOG.error(_("Error on splitting element: ", materialAssignment.getId()), e); - } - } - - /** - * Creates a new {@link MaterialAssignment} out of materialAssignment, but - * setting its units attribute to units. - * - * materialAssignment passed as parameter decreases its units attribute in units - * - * @param materialAssignment - * @param units - */ - private void splitMaterialAssignment(MaterialAssignment materialAssignment, double units) { - MaterialAssignment newMaterialAssignment = MaterialAssignment.create(materialAssignment); - double currentUnits = materialAssignment.getUnits(); - if (units > currentUnits) { - units = currentUnits; - currentUnits = 0; - } else { - currentUnits -= units; - } - newMaterialAssignment.setUnits(units); - materialAssignment.setUnits(currentUnits); - assignedMaterialsToOrderElementModel.addMaterialAssignment(newMaterialAssignment); - Util.reloadBindings(gridMaterials); + @Override + protected void setUnits(MaterialAssignment assignment, double units) { + assignment.setUnits(units); } }