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 87d2c9760..c4351b7f4 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java @@ -1930,6 +1930,23 @@ public class GanttDiagramGraph> implements return result; } + public boolean hasVisibleIncomingDependencies(V task) { + return isSomeVisible(graph.incomingEdgesOf(task)); + } + + public boolean hasVisibleOutcomingDependencies(V task) { + return isSomeVisible(graph.outgoingEdgesOf(task)); + } + + private boolean isSomeVisible(Set dependencies) { + for (D each : dependencies) { + if (adapter.isVisible(each)) { + return true; + } + } + return false; + } + public List getLatestTasks() { List tasks = new ArrayList(); diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculator.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculator.java index fb3d9e292..039df8897 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculator.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculator.java @@ -121,13 +121,37 @@ public class CriticalPathCalculator> { } private InitialNode createBeginningOfProjectNode() { - return new InitialNode(new HashSet(removeContainers(graph + return new InitialNode( + removeWithVisibleIncomingDependencies(removeContainers(graph .getInitialTasks()))); } + + private Set removeWithVisibleIncomingDependencies(Collection tasks) { + Set result = new HashSet(); + for (T each : tasks) { + if (!graph.hasVisibleIncomingDependencies(each)) { + result.add(each); + } + } + return result; + } + private LastNode createEndOfProjectNode() { - return new LastNode(new HashSet(removeContainers(graph - .getLatestTasks()))); + return new LastNode( + removeWithVisibleOutcomingDependencies(removeContainers(graph + .getLatestTasks()))); + } + + private Set removeWithVisibleOutcomingDependencies( + Collection removeContainers) { + Set result = new HashSet(); + for (T each : removeContainers) { + if (!graph.hasVisibleOutcomingDependencies(each)) { + result.add(each); + } + } + return result; } private Map> createGraphNodes() { diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/ICriticalPathCalculable.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/ICriticalPathCalculable.java index 6d979ed35..b2899977c 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/ICriticalPathCalculable.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/ICriticalPathCalculable.java @@ -42,6 +42,10 @@ public interface ICriticalPathCalculable { List getLatestTasks(); + boolean hasVisibleIncomingDependencies(T task); + + boolean hasVisibleOutcomingDependencies(T task); + Set getIncomingTasksFor(T task); Set getOutgoingTasksFor(T task);