Change leaf creation behavior when selected parent is an empty leaf

Now a new container is created, but the older leaf is not added again if it is
empty (wich means that it has zero hours, no criteria, no progresses, ...)

FEA: ItEr76S13WBSSettingUpBehavior
This commit is contained in:
Manuel Rego Casasnovas 2012-02-24 13:23:58 +01:00
parent 062852d51f
commit 2eaf3de5cd
7 changed files with 126 additions and 16 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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();

View file

@ -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,

View file

@ -43,4 +43,21 @@ public interface ITreeNode<T extends ITreeNode<T>> {
*/
T getThis();
boolean isLeaf();
/**
* Checks if a leaf is or not empty. <br />
* An empty leaf is defined as:
* <ul>
* <li>A leaf with number of hours zero</li>
* <li>A leaf without direct criteria assigned</li>
* <li>A leaf without progress</li>
* <li>A leaf without quality forms</li>
* <li>A leaf without labels</li>
* <li>A leaf without work report lines devoting time to it</li>
* <li>A leaf without resource allocations (not assigned yet)</li>
* </ul>
*/
boolean isEmptyLeaf();
}

View file

@ -108,8 +108,8 @@ public abstract class EntitiesTree<T extends ITreeNode<T>> {
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<T extends ITreeNode<T>> {
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<T> parentNode, ITreeNode<T> elementToAdd) {
@ -164,9 +166,11 @@ public abstract class EntitiesTree<T extends ITreeNode<T>> {
.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;
}

View file

@ -228,9 +228,9 @@ public abstract class TreeController<T extends ITreeNode<T>> 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<T extends ITreeNode<T>> 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<T extends ITreeNode<T>> 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<T extends ITreeNode<T>> 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<T extends ITreeNode<T>> extends
};
}
private boolean isLine(T element) {
return element.getChildren().isEmpty();
}
protected abstract void addOperationsCell(final Treeitem item,
final T currentElement);