ItEr42S17CUGravacionModelosUnidadesTraballoItEr41S20: Extracting superclass for controller
This commit is contained in:
parent
770d087663
commit
3aac0cb353
2 changed files with 536 additions and 429 deletions
|
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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 <ogonzalez@igalia.com>
|
||||
*
|
||||
*/
|
||||
public abstract class AssignedMaterialsController<T, A> 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<T, A> 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<A> materials = getAssignedMaterials();
|
||||
gridMaterials.setModel(new SimpleListModel(materials));
|
||||
reloadGridMaterials();
|
||||
}
|
||||
|
||||
public List<A> getAssignedMaterials() {
|
||||
final Treeitem treeitem = categoriesTree.getSelectedItem();
|
||||
return getAssignedMaterials(treeitem);
|
||||
}
|
||||
|
||||
private List<A> getAssignedMaterials(Treeitem treeitem) {
|
||||
final MaterialCategory materialCategory = (treeitem != null) ? (MaterialCategory) treeitem.getValue() : null;
|
||||
return getAssignedMaterials(materialCategory);
|
||||
}
|
||||
|
||||
public List<A> 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<Material> getMatchingMaterials() {
|
||||
return getModel().getMatchingMaterials();
|
||||
}
|
||||
|
||||
/**
|
||||
* Assigns a list of selected {@link Material} to current {@link OrderElement}
|
||||
*/
|
||||
public void assignSelectedMaterials() {
|
||||
Set<Material> 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<Material> getSelectedMaterials() {
|
||||
Set<Material> result = new HashSet<Material>();
|
||||
|
||||
final Set<Listitem> 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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -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<OrderElement, MaterialAssignment> {
|
||||
|
||||
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<OrderElement, MaterialAssignment> getModel() {
|
||||
return assignedMaterialsToOrderElementModel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doAfterCompose(Component comp) throws Exception {
|
||||
super.doAfterCompose(comp);
|
||||
Executions.createComponents("/orders/_assignmentsBox.zul",
|
||||
assignmentsBox, new HashMap<String, String>());
|
||||
protected void createAssignmentsBoxComponent(Component parent) {
|
||||
Executions.createComponents("/orders/_assignmentsBox.zul", parent,
|
||||
new HashMap<String, String>());
|
||||
}
|
||||
|
||||
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<MaterialAssignment> materials = getAssignedMaterials();
|
||||
gridMaterials.setModel(new SimpleListModel(materials));
|
||||
Util.reloadBindings(gridMaterials);
|
||||
@Override
|
||||
protected MaterialAssignment copyFrom(MaterialAssignment assignment) {
|
||||
return MaterialAssignment.create(assignment);
|
||||
}
|
||||
|
||||
public List<MaterialAssignment> getAssignedMaterials() {
|
||||
final Treeitem treeitem = categoriesTree.getSelectedItem();
|
||||
return getAssignedMaterials(treeitem);
|
||||
@Override
|
||||
protected Material getMaterial(MaterialAssignment materialAssignment) {
|
||||
return materialAssignment.getMaterial();
|
||||
}
|
||||
|
||||
private List<MaterialAssignment> 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<MaterialAssignment> 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<Material> getMatchingMaterials() {
|
||||
return assignedMaterialsToOrderElementModel.getMatchingMaterials();
|
||||
}
|
||||
|
||||
/**
|
||||
* Assigns a list of selected {@link Material} to current {@link OrderElement}
|
||||
*/
|
||||
public void assignSelectedMaterials() {
|
||||
Set<Material> 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<Material> getSelectedMaterials() {
|
||||
Set<Material> result = new HashSet<Material>();
|
||||
|
||||
final Set<Listitem> 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue