diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/DependencyComponent.java b/ganttzk/src/main/java/org/zkoss/ganttz/DependencyComponent.java index 7641298af..24a02c272 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/DependencyComponent.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/DependencyComponent.java @@ -56,6 +56,8 @@ public class DependencyComponent extends XulElement implements AfterCompose { private IConstraintViolationListener violationListener; + private PropertyChangeListener visibilityChangeListener; + private boolean violated = false; public DependencyComponent(TaskComponent source, TaskComponent destination, @@ -192,4 +194,12 @@ public class DependencyComponent extends XulElement implements AfterCompose { return (source.isLimiting() || destination.isLimiting()); } + public PropertyChangeListener getVisibilityChangeListener() { + return visibilityChangeListener; + } + + public void setVisibilityChangeListener(PropertyChangeListener visibilityChangeListener) { + this.visibilityChangeListener = visibilityChangeListener; + } + } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java b/ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java index 7b38a5f9a..c564afeae 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java @@ -149,6 +149,7 @@ public class DependencyList extends XulElement implements AfterCompose { visibilityToggler); destination.getTask().addVisibilityPropertiesChangeListener( visibilityToggler); + dependencyComponent.setVisibilityChangeListener(visibilityToggler); boolean dependencyMustBeVisible = visibilityToggler .dependencyMustBeVisible(); visibilityToggler.toggleDependencyExistence(dependencyMustBeVisible); @@ -280,7 +281,7 @@ public class DependencyList extends XulElement implements AfterCompose { for (DependencyComponent dependencyComponent : DependencyList.this .getDependencyComponents()) { if (dependencyComponent.contains(task)) { - this.removeChild(dependencyComponent); + removeDependencyComponent(dependencyComponent); } } } @@ -289,8 +290,21 @@ public class DependencyList extends XulElement implements AfterCompose { for (DependencyComponent dependencyComponent : DependencyList.this .getDependencyComponents()) { if (dependencyComponent.hasSameSourceAndDestination(dependency)) { - this.removeChild(dependencyComponent); + removeDependencyComponent(dependencyComponent); } } } + + private void removeDependencyComponent(DependencyComponent dependencyComponent) { + //remove the visibility listener attached to the tasks + TaskComponent source = dependencyComponent.getSource(); + TaskComponent destination = dependencyComponent.getDestination(); + PropertyChangeListener listener = + dependencyComponent.getVisibilityChangeListener(); + source.getTask().removeVisibilityPropertiesChangeListener(listener); + destination.getTask().removeVisibilityPropertiesChangeListener(listener); + + //remove the dependency itself + this.removeChild(dependencyComponent); + } } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java index d61a6cfe7..2600fcf15 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java @@ -309,6 +309,11 @@ public abstract class Task implements ITaskFundamentalProperties { .removePropertyChangeListener(listener); } + public void removeVisibilityPropertiesChangeListener( + PropertyChangeListener listener) { + this.visibilityProperties.removePropertyChangeListener(listener); + } + @Override public GanttDate getEndDate() { return fundamentalProperties.getEndDate();