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 d2a5cebe2..54c67e4bb 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java @@ -1012,7 +1012,7 @@ public class GanttDiagramGraph> implements private boolean taskChangesPosition() { ChangeTracker tracker = trackTaskChanges(); Constraint.initialValue(noRestrictions()) - .withConstraints(new ForwardForces()) + .withConstraints(new BackwardsForces(), new ForwardForces()) .apply(); return tracker.taskHasChanged(); } @@ -1055,6 +1055,12 @@ public class GanttDiagramGraph> implements ComparisonType.BIGGER_OR_EQUAL_THAN, start, end); } + DatesBasedPositionRestrictions lessThan(GanttDate start, GanttDate end) { + return new DatesBasedPositionRestrictions( + ComparisonType.LESS_OR_EQUAL_THAN_RIGHT_FLOATING, start, + end); + } + class DatesBasedPositionRestrictions extends PositionRestrictions { private Constraint startConstraint; @@ -1270,6 +1276,28 @@ public class GanttDiagramGraph> implements } + class BackwardsForces extends Forces { + + @Override + PositionRestrictions enforceUsingPreviousRestrictions( + PositionRestrictions restrictions) { + GanttDate result = Constraint. initialValue(null) + .withConstraints(restrictions.getEndConstraints()) + .withConstraints(adapter.getEndConstraintsFor(task)) + .apply(); + if (result != null) { + return moveToEnd(result); + } + return restrictions; + } + + private PositionRestrictions moveToEnd(GanttDate newEnd) { + adapter.setEndDateFor(task, newEnd); + return lessThan(adapter.getStartDate(task), newEnd); + } + + } + @Override public int hashCode() { return new HashCodeBuilder() diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/constraint/ConstraintOnComparableValues.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/constraint/ConstraintOnComparableValues.java index 6a389dccc..23928ab07 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/constraint/ConstraintOnComparableValues.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/constraint/ConstraintOnComparableValues.java @@ -54,7 +54,7 @@ public class ConstraintOnComparableValues> extends } public enum ComparisonType { - LESS_OR_EQUAL_THAN, BIGGER_OR_EQUAL_THAN, EQUAL_TO; + LESS_OR_EQUAL_THAN, LESS_OR_EQUAL_THAN_RIGHT_FLOATING, BIGGER_OR_EQUAL_THAN, EQUAL_TO; } private final T comparisonValue; @@ -75,6 +75,8 @@ public class ConstraintOnComparableValues> extends switch (comparisonType) { case LESS_OR_EQUAL_THAN: return min(comparisonValue, value); + case LESS_OR_EQUAL_THAN_RIGHT_FLOATING: + return comparisonValue; case BIGGER_OR_EQUAL_THAN: return max(comparisonValue, value); case EQUAL_TO: @@ -96,6 +98,7 @@ public class ConstraintOnComparableValues> extends public boolean isSatisfiedBy(T value) { switch (comparisonType) { case LESS_OR_EQUAL_THAN: + case LESS_OR_EQUAL_THAN_RIGHT_FLOATING: return value.compareTo(comparisonValue) <= 0; case BIGGER_OR_EQUAL_THAN: return value.compareTo(comparisonValue) >= 0;