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:
parent
062852d51f
commit
2eaf3de5cd
7 changed files with 126 additions and 16 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue