diff --git a/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderLine.java b/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderLine.java index 89bc4c3cd..f463b36fc 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderLine.java +++ b/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderLine.java @@ -36,6 +36,7 @@ import org.libreplan.business.advance.entities.AdvanceAssignment; import org.libreplan.business.advance.entities.AdvanceType; import org.libreplan.business.advance.entities.DirectAdvanceAssignment; import org.libreplan.business.advance.entities.IndirectAdvanceAssignment; +import org.libreplan.business.planner.entities.DayAssignment.FilterType; import org.libreplan.business.requirements.entities.CriterionRequirement; import org.libreplan.business.templates.entities.OrderLineTemplate; @@ -98,6 +99,43 @@ public class OrderLine extends OrderElement { return true; } + @Override + public boolean isEmptyLeaf() { + if (getWorkHours() != 0) { + return false; + } + if (!getDirectCriterionRequirement().isEmpty()) { + return false; + } + if (!getDirectAdvanceAssignments().isEmpty()) { + for (DirectAdvanceAssignment each : getDirectAdvanceAssignments()) { + if (!each.getAdvanceMeasurements().isEmpty()) { + return false; + } + } + } + if (!getQualityForms().isEmpty()) { + return false; + } + if (!getLabels().isEmpty()) { + return false; + } + if (!getMaterialAssignments().isEmpty()) { + return false; + } + if (!getSumChargedEffort().getDirectChargedEffort().isZero()) { + return false; + } + if (!getTaskElements().isEmpty()) { + if (!getTaskElements().iterator().next() + .getDayAssignments(FilterType.KEEP_ALL).isEmpty()) { + return false; + } + } + + return true; + } + @Override public OrderLine toLeaf() { return this; diff --git a/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderLineGroup.java b/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderLineGroup.java index e7d283701..52d66e5b7 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderLineGroup.java +++ b/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderLineGroup.java @@ -131,6 +131,17 @@ public class OrderLineGroup extends OrderElement implements public OrderLineGroup getThis() { return OrderLineGroup.this; } + + @Override + public boolean isLeaf() { + return false; + } + + @Override + public boolean isEmptyLeaf() { + return false; + } + } public static OrderLineGroup create() { @@ -225,6 +236,11 @@ public class OrderLineGroup extends OrderElement implements return false; } + @Override + public boolean isEmptyLeaf() { + return false; + } + @Override public void remove(OrderElement child) { getManipulator().remove(child); diff --git a/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java b/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java index cef519900..fad73b9d9 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java +++ b/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java @@ -89,6 +89,16 @@ public class OrderLineGroupTemplate extends OrderElementTemplate implements getThis().getSchedulingState().add(newChildState); } + @Override + public boolean isLeaf() { + return false; + } + + @Override + public boolean isEmptyLeaf() { + return false; + } + } public static OrderLineGroupTemplate createNew() { @@ -218,6 +228,11 @@ public class OrderLineGroupTemplate extends OrderElementTemplate implements return false; } + @Override + public boolean isEmptyLeaf() { + return false; + } + private CriterionRequirementOrderElementHandler criterionRequirementOrderElementHandler = CriterionRequirementOrderElementHandler .getInstance(); diff --git a/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineTemplate.java b/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineTemplate.java index ab577b4ca..02e581513 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineTemplate.java +++ b/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineTemplate.java @@ -108,6 +108,30 @@ public class OrderLineTemplate extends OrderElementTemplate { return true; } + @Override + public boolean isEmptyLeaf() { + if (getWorkHours() != 0) { + return false; + } + if (!getDirectCriterionRequirements().isEmpty()) { + return false; + } + if (!getAdvanceAssignmentTemplates().isEmpty()) { + return false; + } + if (!getQualityForms().isEmpty()) { + return false; + } + if (!getLabels().isEmpty()) { + return false; + } + if (!getMaterialAssignments().isEmpty()) { + return false; + } + + return true; + } + @Override public OrderElement createElement(OrderLineGroup parent) { OrderLine line = setupSchedulingStateType(setupVersioningInfo(parent, diff --git a/libreplan-business/src/main/java/org/libreplan/business/trees/ITreeNode.java b/libreplan-business/src/main/java/org/libreplan/business/trees/ITreeNode.java index f15e57a9a..f27bb8d54 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/trees/ITreeNode.java +++ b/libreplan-business/src/main/java/org/libreplan/business/trees/ITreeNode.java @@ -43,4 +43,21 @@ public interface ITreeNode> { */ T getThis(); + boolean isLeaf(); + + /** + * Checks if a leaf is or not empty.
+ * An empty leaf is defined as: + * + */ + boolean isEmptyLeaf(); + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/tree/EntitiesTree.java b/libreplan-webapp/src/main/java/org/libreplan/web/tree/EntitiesTree.java index 35ad4fcd1..e991d2d6c 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/tree/EntitiesTree.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/tree/EntitiesTree.java @@ -108,8 +108,8 @@ public abstract class EntitiesTree> { addElementAtImpl(node); } - public void addElementAt(T node, String name, int hours) { - addElementAtImpl(node, name, hours); + public T addElementAt(T node, String name, int hours) { + return addElementAtImpl(node, name, hours); } protected abstract T createNewElement(); @@ -120,8 +120,10 @@ public abstract class EntitiesTree> { addOrderElementAt(parent, createNewElement()); } - private void addElementAtImpl(T parent, String name, int hours) { - addOrderElementAt(parent, createNewElement(name, hours)); + private T addElementAtImpl(T parent, String name, int hours) { + T newElement = createNewElement(name, hours); + addOrderElementAt(parent, newElement); + return newElement; } private void addToTree(ITreeNode parentNode, ITreeNode elementToAdd) { @@ -164,9 +166,11 @@ public abstract class EntitiesTree> { .toContainer(); parentContainer.replace(selectedForTurningIntoContainer.getThis(), asContainer.getThis()); - asContainer.add(selectedForTurningIntoContainer.getThis()); - tree.replace(selectedForTurningIntoContainer.getThis(), asContainer - .getThis(), childrenExtractor()); + if (!selectedForTurningIntoContainer.isEmptyLeaf()) { + asContainer.add(selectedForTurningIntoContainer.getThis()); + } + tree.replace(selectedForTurningIntoContainer.getThis(), + asContainer.getThis(), childrenExtractor()); return asContainer; } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java b/libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java index cdb3535f9..817c2ca5b 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java @@ -228,9 +228,9 @@ public abstract class TreeController> extends try { if (tree.getSelectedCount() == 1) { T node = getSelectedNode(); - getModel().addElementAt(node, name.getValue(), + T newNode = getModel().addElementAt(node, name.getValue(), hours.getValue()); - getRenderer().refreshHoursValueForThisNodeAndParents(node); + getRenderer().refreshHoursValueForThisNodeAndParents(newNode); } else { getModel().addElement(name.getValue(), hours.getValue()); } @@ -759,7 +759,7 @@ public abstract class TreeController> extends private void setReadOnlyHoursCell(T element, Intbox boxHours, Treecell tc) { - if (!readOnly && isLine(element)) { + if (!readOnly && element.isLeaf()) { if (getHoursGroupHandler().hasMoreThanOneHoursGroup(element)) { boxHours.setReadonly(true); tc.setTooltiptext(_("Not editable for containing more that an hours group.")); @@ -772,7 +772,7 @@ public abstract class TreeController> extends private Intbox buildHoursIntboxFor(final T element) { Intbox result = new IntboxDirectValue(); - if (isLine(element)) { + if (element.isLeaf()) { Util.bind(result, getHoursGetterFor(element), getHoursSetterFor(element)); result.setConstraint(getHoursConstraintFor(element)); @@ -832,7 +832,7 @@ public abstract class TreeController> extends } public void updateHoursFor(T element) { - if (!readOnly && isLine(element)) { + if (!readOnly && element.isLeaf()) { Intbox boxHours = (Intbox) hoursIntBoxByElement.get(element); Treecell tc = (Treecell) boxHours.getParent(); setReadOnlyHoursCell(element, boxHours, tc); @@ -874,10 +874,6 @@ public abstract class TreeController> extends }; } - private boolean isLine(T element) { - return element.getChildren().isEmpty(); - } - protected abstract void addOperationsCell(final Treeitem item, final T currentElement);