diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AssignedMaterialsToOrderElementController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AssignedMaterialsToOrderElementController.java index 7fab34b7b..3735ad9fa 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AssignedMaterialsToOrderElementController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AssignedMaterialsToOrderElementController.java @@ -394,8 +394,50 @@ public class AssignedMaterialsToOrderElementController extends private void removeMaterialAssignment(MaterialAssignment materialAssignment) { assignedMaterialsToOrderElementModel.removeMaterialAssignment(materialAssignment); Util.reloadBindings(gridMaterials); - // Reload categoriesTree - categoriesTree.setModel(getMaterialCategories()); + 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; } /** diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AssignedMaterialsToOrderElementModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AssignedMaterialsToOrderElementModel.java index 88a6a270d..dff40379a 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AssignedMaterialsToOrderElementModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AssignedMaterialsToOrderElementModel.java @@ -191,7 +191,7 @@ public class AssignedMaterialsToOrderElementModel implements .getMaterialAssignments()) { final Material material = materialAssigment.getMaterial(); if (materialCategory == null - || materialCategory.equals(material.getCategory())) { + || materialCategory.getId().equals(material.getCategory().getId())) { result.add(materialAssigment); } } @@ -231,8 +231,24 @@ public class AssignedMaterialsToOrderElementModel implements } @Override + @Transactional(readOnly = true) public void removeMaterialAssignment(MaterialAssignment materialAssignment) { orderElement.removeMaterialAssignment(materialAssignment); + // Remove material category from materialCategories tree + final MaterialCategory materialCategory = materialAssignment.getMaterial().getCategory(); + removeCategory(materialCategories, materialCategory); + } + + private void removeCategory( + MutableTreeModel materialCategories, + MaterialCategory materialCategory) { + + categoryDAO.reattach(materialCategory); + final boolean canDelete = materialCategory.getSubcategories().isEmpty() && getAssignedMaterials(materialCategory).isEmpty(); + if (canDelete) { + materialCategories.remove(materialCategory); + removeCategory(materialCategories, materialCategory.getParent()); + } } @Override