From e5f5a4621deb691ea4730a73816403ac5023839d Mon Sep 17 00:00:00 2001 From: Carsten Schumann Date: Wed, 16 Oct 2019 08:02:48 +0000 Subject: [PATCH] Bugfix: #1909 Changing zoom level in Gantt view did not affect timescale/background due to GC optimization of lambda functions. --- .../timetracker/TimeTrackerComponent.java | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) mode change 100644 => 100755 ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTrackerComponent.java diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTrackerComponent.java b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTrackerComponent.java old mode 100644 new mode 100755 index 9ae3d822d..f0059541a --- a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTrackerComponent.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTrackerComponent.java @@ -38,7 +38,7 @@ import org.zkoss.zk.ui.HtmlMacroComponent; * * @author Javier Moran Rua */ -public abstract class TimeTrackerComponent extends HtmlMacroComponent { +public abstract class TimeTrackerComponent extends HtmlMacroComponent implements IZoomLevelChangedListener { private final TimeTracker timeTracker; @@ -52,18 +52,29 @@ public abstract class TimeTrackerComponent extends HtmlMacroComponent { this(timeTracker, "~./ganttz/zul/timetracker/timetrackersecondlevel.zul", "timetracker"); } + /** Event handler when zoom level changes. + * + * Please do not refactor the .zoomLevelChanged method into a delta + * function since the GC will remove that function once it is only + * referenced by a WeakReference. In that case zoom events will + * not be propagated correctly. + * + * @param detailLevel requested zoom level. + */ + public void zoomLevelChanged(ZoomLevel detailLevel) + { + if ( isInPage() ) { + recreate(); + changeDetailLevel(getDaysFor(scrollLeft)); + } + } + TimeTrackerComponent(TimeTracker timeTracker, String secondLevelZul, String timetrackerId) { this.secondLevelZul = secondLevelZul; this.timeTracker = timeTracker; - IZoomLevelChangedListener zoomListener = detailLevel -> { - if ( isInPage() ) { - recreate(); - changeDetailLevel(getDaysFor(scrollLeft)); - } - }; - this.timeTracker.addZoomListener(zoomListener); + this.timeTracker.addZoomListener(this); timeTrackerElementId = timetrackerId; }