From 6b16b19327dfbeb6ac97e845f0bec5c38619a020 Mon Sep 17 00:00:00 2001 From: Susana Montes Pedreira Date: Wed, 19 Jan 2011 10:04:58 +0100 Subject: [PATCH] [Bug #765] Fixes the position of the scroll bar in the gantt. it calculates the new position of the scrollbar when the zoom is changed. FEA : ItEr68S04BugFixing --- .../zkoss/ganttz/DatesMapperOnInterval.java | 14 ++++- .../java/org/zkoss/ganttz/GanttPanel.java | 56 ++++++++++++++++++- .../java/org/zkoss/ganttz/IDatesMapper.java | 5 ++ .../main/java/org/zkoss/ganttz/TaskList.java | 14 +++++ .../resourceload/ResourcesLoadPanel.java | 24 ++++++++ .../zkoss/ganttz/timetracker/TimeTracker.java | 2 +- .../timetracker/TimeTrackerComponent.java | 31 +++++++++- .../TimeTrackerComponentWithoutColumns.java | 12 ++++ .../web/ganttz/zul/plannerLayout.zul | 4 +- .../resources/web/js/ganttz/ganttpanel.js | 53 +++++++++++++++++- .../main/resources/web/js/ganttz/tasklist.js | 2 +- .../LimitingResourcesPanel.java | 26 ++++++++- 12 files changed, 227 insertions(+), 16 deletions(-) diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/DatesMapperOnInterval.java b/ganttzk/src/main/java/org/zkoss/ganttz/DatesMapperOnInterval.java index 695c54e87..4e7ace12e 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/DatesMapperOnInterval.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/DatesMapperOnInterval.java @@ -49,7 +49,7 @@ public class DatesMapperOnInterval implements IDatesMapper { public LocalDate toDate(int pixels) { int daysInto = Fraction.getFraction(pixels, 1).divideBy(pixelsPerDay) .intValue(); - return interval.getStart().plusDays(daysInto); + return getInterval().getStart().plusDays(daysInto); } @Override @@ -62,7 +62,7 @@ public class DatesMapperOnInterval implements IDatesMapper { } private Fraction getProportion(DateTime dateTime) { - return interval.getProportion(dateTime); + return getInterval().getProportion(dateTime); } private int toPixels(Fraction proportion) { @@ -72,7 +72,7 @@ public class DatesMapperOnInterval implements IDatesMapper { @Override public int toPixels(ReadableDuration duration) { - DateTime end = interval.getStart().toDateTimeAtStartOfDay() + DateTime end = getInterval().getStart().toDateTimeAtStartOfDay() .plus(duration); return toPixels(getProportion(end)); } @@ -98,4 +98,12 @@ public class DatesMapperOnInterval implements IDatesMapper { return this.horizontalSize; } + public Fraction getPixelsPerDay() { + return pixelsPerDay; + } + + public Interval getInterval() { + return interval; + } + } \ No newline at end of file diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/GanttPanel.java b/ganttzk/src/main/java/org/zkoss/ganttz/GanttPanel.java index 31a86b69b..df1d009e2 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/GanttPanel.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/GanttPanel.java @@ -22,11 +22,13 @@ package org.zkoss.ganttz; import java.util.List; +import org.joda.time.LocalDate; import org.zkoss.ganttz.adapters.IDisabilityConfiguration; import org.zkoss.ganttz.data.GanttDiagramGraph; import org.zkoss.ganttz.timetracker.TimeTracker; import org.zkoss.ganttz.timetracker.TimeTrackerComponent; import org.zkoss.ganttz.timetracker.zoom.ZoomLevel; +import org.zkoss.ganttz.util.Interval; import org.zkoss.zk.au.out.AuInvoke; import org.zkoss.zk.ui.ext.AfterCompose; import org.zkoss.zul.impl.XulElement; @@ -43,6 +45,10 @@ public class GanttPanel extends XulElement implements AfterCompose { private final Planner planner; + private LocalDate previousStart; + + private Interval previousInterval; + public GanttPanel( Planner planner, List> commandsOnTasksContextualized, @@ -71,10 +77,36 @@ public class GanttPanel extends XulElement implements AfterCompose { TimeTracker timeTracker) { return new TimeTrackerComponent(timeTracker) { @Override - protected void scrollHorizontalPercentage(int pixelsDisplacement) { + protected void scrollHorizontalPercentage(int daysDisplacement) { response("scroll_horizontal", new AuInvoke(GanttPanel.this, - "scroll_horizontal", "" + pixelsDisplacement)); + "scroll_horizontal", "" + daysDisplacement)); + moveCurrentPositionScroll(); } + + @Override + protected void moveCurrentPositionScroll() { + // get the previous data. + LocalDate previousStart = getPreviousStart(); + + // get the current data + int diffDays = getTimeTrackerComponent().getDiffDays( + previousStart); + double pixelPerDay = getTimeTrackerComponent().getPixelPerDay(); + + response("move_scroll", new AuInvoke(GanttPanel.this, + "move_scroll", "" + diffDays, "" + pixelPerDay)); + } + + protected void updateCurrentDayScroll() { + double previousPixelPerDay = getTimeTracker().getMapper() + .getPixelsPerDay() + .doubleValue(); + + response("update_day_scroll", new AuInvoke(GanttPanel.this, + "update_day_scroll", "" + previousPixelPerDay)); + + } + }; } @@ -85,7 +117,7 @@ public class GanttPanel extends XulElement implements AfterCompose { .asDependencyComponents(diagramGraph.getVisibleDependencies())); timeTrackerComponent.afterCompose(); dependencyList.afterCompose(); - + savePreviousData(); if (planner.isExpandAll()) { FunctionalityExposedForExtensions context = (FunctionalityExposedForExtensions) planner .getContext(); @@ -115,10 +147,14 @@ public class GanttPanel extends XulElement implements AfterCompose { } public void zoomIncrease() { + savePreviousData(); + getTimeTrackerComponent().updateDayScroll(); getTimeTracker().zoomIncrease(); } public void zoomDecrease() { + savePreviousData(); + getTimeTrackerComponent().updateDayScroll(); getTimeTracker().zoomDecrease(); } @@ -127,11 +163,25 @@ public class GanttPanel extends XulElement implements AfterCompose { } public void setZoomLevel(ZoomLevel zoomLevel) { + savePreviousData(); + getTimeTrackerComponent().updateDayScroll(); getTimeTracker().setZoomLevel(zoomLevel); } + private void savePreviousData() { + this.previousStart = getTimeTracker().getRealInterval().getStart(); + this.previousInterval = getTimeTracker().getMapper().getInterval(); + } + public Planner getPlanner() { return planner; } + public LocalDate getPreviousStart() { + return previousStart; + } + + public Interval getPreviousInterval() { + return previousInterval; + } } \ No newline at end of file diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/IDatesMapper.java b/ganttzk/src/main/java/org/zkoss/ganttz/IDatesMapper.java index b96733c9c..cb8811cb2 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/IDatesMapper.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/IDatesMapper.java @@ -20,8 +20,10 @@ package org.zkoss.ganttz; +import org.apache.commons.lang.math.Fraction; import org.joda.time.LocalDate; import org.joda.time.ReadableDuration; +import org.zkoss.ganttz.util.Interval; public interface IDatesMapper { @@ -41,4 +43,7 @@ public interface IDatesMapper { int getHorizontalSize(); + Fraction getPixelsPerDay(); + + Interval getInterval(); } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java b/ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java index 8d012baa0..610ed458b 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java @@ -32,6 +32,8 @@ import java.util.Map; import java.util.Set; import java.util.WeakHashMap; +import org.apache.commons.lang.math.Fraction; +import org.joda.time.LocalDate; import org.zkoss.ganttz.adapters.IDisabilityConfiguration; import org.zkoss.ganttz.data.Dependency; import org.zkoss.ganttz.data.DependencyType; @@ -43,6 +45,7 @@ import org.zkoss.ganttz.timetracker.TimeTracker; import org.zkoss.ganttz.timetracker.TimeTrackerComponent; import org.zkoss.ganttz.timetracker.zoom.IZoomLevelChangedListener; import org.zkoss.ganttz.timetracker.zoom.ZoomLevel; +import org.zkoss.ganttz.util.Interval; import org.zkoss.ganttz.util.MenuBuilder; import org.zkoss.ganttz.util.MenuBuilder.ItemAction; import org.zkoss.zk.au.out.AuInvoke; @@ -292,12 +295,19 @@ public class TaskList extends XulElement implements AfterCompose { taskComponent.zoomChanged(); } adjustZoomColumnsHeight(); + adjustZoomPositionScroll(); } }; getTimeTracker().addZoomListener(zoomLevelChangedListener); } } + public LocalDate toDate(int pixels, Fraction pixelsPerDay, Interval interval) { + int daysInto = Fraction.getFraction(pixels, 1).divideBy(pixelsPerDay) + .intValue(); + return interval.getStart().plusDays(daysInto); + } + private Map contextMenus = new HashMap(); private Menupopup getContextMenuFor(TaskComponent taskComponent) { @@ -337,6 +347,10 @@ public class TaskList extends XulElement implements AfterCompose { response("adjust_height", new AuInvoke(TaskList.this, "adjust_height")); } + private void adjustZoomPositionScroll() { + getTimeTrackerComponent().movePositionScroll(); + } + public void redrawDependencies() { getGanttPanel().getDependencyList().redrawDependencies(); } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java b/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java index 65ce4bbb3..8014f5fcc 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java @@ -287,6 +287,18 @@ public class ResourcesLoadPanel extends HtmlMacroComponent { "adjustScrollHorizontalPosition", pixelsDisplacement + "")); } + + @Override + protected void moveCurrentPositionScroll() { + // TODO Auto-generated method stub + + } + + @Override + protected void updateCurrentDayScroll() { + // TODO Auto-generated method stub + + } }; } @@ -345,6 +357,18 @@ public class ResourcesLoadPanel extends HtmlMacroComponent { @Override protected void scrollHorizontalPercentage(int pixelsDisplacement) { } + + @Override + protected void moveCurrentPositionScroll() { + // TODO Auto-generated method stub + + } + + @Override + protected void updateCurrentDayScroll() { + // TODO Auto-generated method stub + + } }; } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTracker.java b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTracker.java index b0206a004..249dcfd29 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTracker.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTracker.java @@ -40,8 +40,8 @@ import org.zkoss.ganttz.timetracker.zoom.TimeTrackerState; import org.zkoss.ganttz.timetracker.zoom.ZoomLevel; import org.zkoss.ganttz.util.Interval; import org.zkoss.ganttz.util.LongOperationFeedback; -import org.zkoss.ganttz.util.LongOperationFeedback.ILongOperation; import org.zkoss.ganttz.util.WeakReferencedListeners; +import org.zkoss.ganttz.util.LongOperationFeedback.ILongOperation; import org.zkoss.ganttz.util.WeakReferencedListeners.IListenerNotification; import org.zkoss.zk.ui.Component; diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTrackerComponent.java b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTrackerComponent.java index 64f424767..1e31bc18a 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTrackerComponent.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTrackerComponent.java @@ -22,6 +22,9 @@ package org.zkoss.ganttz.timetracker; import java.util.Collection; +import org.joda.time.Days; +import org.joda.time.LocalDate; +import org.zkoss.ganttz.IDatesMapper; import org.zkoss.ganttz.timetracker.zoom.DetailItem; import org.zkoss.ganttz.timetracker.zoom.IZoomLevelChangedListener; import org.zkoss.ganttz.timetracker.zoom.TimeTrackerState; @@ -94,7 +97,11 @@ public abstract class TimeTrackerComponent extends HtmlMacroComponent { return this.getTimeTracker().getDetailLevel(); } - protected abstract void scrollHorizontalPercentage(int pixelsDisplacement); + protected abstract void scrollHorizontalPercentage(int daysDisplacement); + + protected abstract void moveCurrentPositionScroll(); + + protected abstract void updateCurrentDayScroll(); public Collection getDetailsFirstLevel() { return timeTracker.getDetailsFirstLevel(); @@ -164,8 +171,26 @@ public abstract class TimeTrackerComponent extends HtmlMacroComponent { } private void changeDetailLevel(double days) { - scrollHorizontalPercentage((int) Math.floor(days - / getTimeTrackerState().daysPerPixel())); + scrollHorizontalPercentage((int) Math.floor(days)); + } + + public void movePositionScroll() { + moveCurrentPositionScroll(); + } + + public void updateDayScroll() { + updateCurrentDayScroll(); + } + + public int getDiffDays(LocalDate previousStart) { + // get the current data + IDatesMapper mapper = getTimeTracker().getMapper(); + LocalDate start = getTimeTracker().getRealInterval().getStart(); + return Days.daysBetween(start, previousStart).getDays(); + } + + public double getPixelPerDay() { + return getTimeTracker().getMapper().getPixelsPerDay().doubleValue(); } } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTrackerComponentWithoutColumns.java b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTrackerComponentWithoutColumns.java index d896d5bcd..1d5e8c879 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTrackerComponentWithoutColumns.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTrackerComponentWithoutColumns.java @@ -35,4 +35,16 @@ public class TimeTrackerComponentWithoutColumns extends TimeTrackerComponent { @Override protected void scrollHorizontalPercentage(int pixelsDisplacement) { } + + @Override + protected void moveCurrentPositionScroll() { + // TODO Auto-generated method stub + + } + + @Override + protected void updateCurrentDayScroll() { + // TODO Auto-generated method stub + + } } diff --git a/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul b/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul index dbc1deb00..657b79457 100644 --- a/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul +++ b/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul @@ -97,10 +97,10 @@ planner = self; id="taskdetailsContainer" sclass="taskdetailsContainer">
-
+
-
+
diff --git a/ganttzk/src/main/resources/web/js/ganttz/ganttpanel.js b/ganttzk/src/main/resources/web/js/ganttz/ganttpanel.js index a591aeac8..b6ea4ec31 100644 --- a/ganttzk/src/main/resources/web/js/ganttz/ganttpanel.js +++ b/ganttzk/src/main/resources/web/js/ganttz/ganttpanel.js @@ -24,13 +24,62 @@ */ zkGanttPanel = {}; +SCROLL_DAY = 0; + zkGanttPanel.init = function(cmp){ } +zkGanttPanel.update_day_scroll = function(cmp,previousPixelPerDay) { + fromPixelToDay(previousPixelPerDay); +} + /** * Scrolls horizontally the ganttpanel when the zoom has resized the component * width. */ -zkGanttPanel.scroll_horizontal = function(cmp, offsetInPx) { - document.getElementById('ganttpanel_scroller_x').scrollLeft = offsetInPx; +zkGanttPanel.scroll_horizontal = function(cmp,daysDisplacement) { + SCROLL_DAY = daysDisplacement; +} + +zkGanttPanel.move_scroll = function(cmp,diffDays,pixelPerDay) { + fromDayToPixel(diffDays,pixelPerDay); +} + +function fromPixelToDay(previousPixelPerDay){ + var div1 = document.getElementById ("ganttpanel").parentNode; + var div2 = div1.parentNode; + var div3 = div2.parentNode; + + var maxHPosition = div3.scrollWidth - div3.clientWidth; + if( maxHPosition > 0 ){ + var proportion = div3.scrollWidth / maxHPosition; + var positionInScroll = div3.scrollLeft; + var positionInPx = positionInScroll * proportion; + if(positionInPx > 0){ + var position = positionInPx / previousPixelPerDay; + var day = position; + SCROLL_DAY = position; + } + } +} + +function fromDayToPixel(diffDays,pixelPerDay){ + var div1 = document.getElementById ("ganttpanel").parentNode; + var div2 = div1.parentNode; + var div3 = div2.parentNode; + + var day = SCROLL_DAY; + day += parseInt(diffDays); + var newPosInPx = parseInt(day * pixelPerDay); + var maxHPosition = div3.scrollWidth - div3.clientWidth; + var newProportion = div3.scrollWidth / maxHPosition; + if( newProportion > 0){ + var newPosInScroll = newPosInPx / newProportion; + if(newPosInScroll < 0){ + newPosInScroll = 0; + } + div1.scrollLeft = newPosInScroll; + div2.scrollLeft = newPosInScroll; + div3.scrollLeft = newPosInScroll; + } } \ No newline at end of file diff --git a/ganttzk/src/main/resources/web/js/ganttz/tasklist.js b/ganttzk/src/main/resources/web/js/ganttz/tasklist.js index 3a76630df..e2601e389 100644 --- a/ganttzk/src/main/resources/web/js/ganttz/tasklist.js +++ b/ganttzk/src/main/resources/web/js/ganttz/tasklist.js @@ -285,8 +285,8 @@ function adjustScrollableDimensions() { // Inner divs need recalculation to adjust to new scroll displacement lenght document.getElementById('ganttpanel_inner_scroller_x').style["width"] = watermark.offsetWidth + "px"; -} +} /** * diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesPanel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesPanel.java index 363c82966..8841c3eac 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesPanel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesPanel.java @@ -35,8 +35,8 @@ import org.navalplanner.business.planner.limiting.entities.LimitingResourceQueue import org.navalplanner.business.resources.entities.LimitingResourceQueue; import org.zkoss.ganttz.DependencyList; import org.zkoss.ganttz.timetracker.TimeTracker; -import org.zkoss.ganttz.timetracker.TimeTracker.IDetailItemFilter; import org.zkoss.ganttz.timetracker.TimeTrackerComponent; +import org.zkoss.ganttz.timetracker.TimeTracker.IDetailItemFilter; import org.zkoss.ganttz.timetracker.zoom.DetailItem; import org.zkoss.ganttz.timetracker.zoom.IZoomLevelChangedListener; import org.zkoss.ganttz.timetracker.zoom.ZoomLevel; @@ -305,6 +305,16 @@ public class LimitingResourcesPanel extends HtmlMacroComponent { protected void scrollHorizontalPercentage(int pixelsDisplacement) { } + + @Override + protected void moveCurrentPositionScroll() { + // TODO Auto-generated method stub + } + + @Override + protected void updateCurrentDayScroll() { + // TODO Auto-generated method stub + } }; } @@ -317,6 +327,16 @@ public class LimitingResourcesPanel extends HtmlMacroComponent { "adjustScrollHorizontalPosition", pixelsDisplacement + "")); } + + @Override + protected void moveCurrentPositionScroll() { + // TODO Auto-generated method stub + } + + @Override + protected void updateCurrentDayScroll() { + // TODO Auto-generated method stub + } }; } @@ -351,6 +371,10 @@ public class LimitingResourcesPanel extends HtmlMacroComponent { getFellow("insertionPointTimetracker").getChildren().clear(); } + public TimeTrackerComponent getTimeTrackerComponent() { + return timeTrackerComponent; + } + public void unschedule(QueueTask task) { LimitingResourceQueueElement queueElement = task.getLimitingResourceQueueElement(); LimitingResourceQueue queue = queueElement.getLimitingResourceQueue();