diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java index 95f40835b..f1947fdba 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java @@ -691,18 +691,20 @@ public class GanttDiagramGraph { for (V each : tasks) { allRecalculations.addAll(getRecalculationsNeededFrom(each)); } - enforceRestrictionsOn(allRecalculations); + enforceRestrictionsOn(allRecalculations, tasks); } void enforceRestrictionsOn(V task) { - enforceRestrictionsOn(getRecalculationsNeededFrom(task)); + enforceRestrictionsOn(getRecalculationsNeededFrom(task), + Collections.singleton(task)); } - void enforceRestrictionsOn(final List recalculations) { + void enforceRestrictionsOn(final List recalculations, + final Collection initiallyModified) { executeWithPreAndPostActionsOnlyIfNewEntrance(new IAction() { @Override public void doAction() { - doRecalculations(recalculations); + doRecalculations(recalculations, initiallyModified); } }); } @@ -777,13 +779,16 @@ public class GanttDiagramGraph { @Override public void doAction() { List recalculationsNeededFrom = getRecalculationsNeededFrom(task); - doRecalculations(recalculationsNeededFrom); + doRecalculations(recalculationsNeededFrom, + Collections.singletonList(task)); } }); } - private void doRecalculations(List recalculationsNeeded) { + private void doRecalculations(List recalculationsNeeded, + Collection initiallyModified) { Set allModified = new HashSet(); + allModified.addAll(initiallyModified); for (Recalculation each : recalculationsNeeded) { boolean modified = each.doRecalculation(); if (modified) { @@ -792,7 +797,8 @@ public class GanttDiagramGraph { } List shrunkContainers = shrunkContainersOfModified(allModified); for (V each : getTaskAffectedByShrinking(shrunkContainers)) { - doRecalculations(getRecalculationsNeededFrom(each)); + doRecalculations(getRecalculationsNeededFrom(each), + Collections.singletonList(each)); } }