From 71f3dee5110245070c2a16caacef06b2b8b10b30 Mon Sep 17 00:00:00 2001 From: Lorenzo Tilve Date: Tue, 7 Jul 2009 14:32:07 +0200 Subject: [PATCH] ItEr15S12RFComportamentoGraficoPlanificadorItEr14S13: Watermark current day hightlight for all zoom levels and column width fixes for DetailFour and DetailFive --- .../main/java/org/zkoss/ganttz/TaskList.java | 10 +-- .../java/org/zkoss/ganttz/TimeTracker.java | 11 +-- .../util/zoom/DetailFiveTimeTrackerState.java | 2 +- .../util/zoom/DetailFourTimeTrackerState.java | 2 +- .../util/zoom/DetailOneTimeTrackerState.java | 20 ++++- .../zoom/DetailThreeTimeTrackerState.java | 3 +- .../util/zoom/DetailTwoTimeTrackerState.java | 29 ++++--- .../ganttz/util/zoom/TimeTrackerState.java | 80 +++++++++++++++--- .../web/ganttz/img/watermark_today.png | Bin 0 -> 186 bytes .../main/resources/web/ganttz/tasklist.dsp | 3 +- .../resources/web/ganttz/zul/timetracker.zul | 9 +- .../main/resources/web/js/ganttz/tasklist.js | 16 +++- .../src/main/webapp/planner/css/ganttzk.css | 20 ++++- 13 files changed, 148 insertions(+), 57 deletions(-) create mode 100644 navalplanner-gantt-zk/src/main/resources/web/ganttz/img/watermark_today.png diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TaskList.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TaskList.java index 02aef2613..5c3e7ced0 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TaskList.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TaskList.java @@ -161,14 +161,6 @@ public class TaskList extends XulElement implements AfterCompose { return getTasksNumber() * HEIGHT_PER_ROW + "px"; } - public String getSameHeightElementId() { - TimeTracker timeTracker = getTimeTracker(); - AbstractComponent fakeRow = timeTracker.getFakeRow(); - if (fakeRow == null) - return ""; - return fakeRow.getUuid(); - } - private TimeTracker getTimeTracker() { return getGanttPanel().getTimeTracker(); } @@ -261,4 +253,4 @@ public class TaskList extends XulElement implements AfterCompose { subtask.setParent(null); } -} +} \ No newline at end of file diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TimeTracker.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TimeTracker.java index 77c2055ac..271cec79e 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TimeTracker.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TimeTracker.java @@ -16,7 +16,6 @@ import org.zkoss.ganttz.util.zoom.TimeTrackerState; import org.zkoss.ganttz.util.zoom.ZoomLevel; import org.zkoss.ganttz.util.zoom.ZoomLevelChangedListener; import org.zkoss.ganttz.util.zoom.TimeTrackerState.DetailItem; -import org.zkoss.zk.ui.AbstractComponent; import org.zkoss.zk.ui.HtmlMacroComponent; /** @@ -30,7 +29,7 @@ public class TimeTracker extends HtmlMacroComponent { .year(2012)); } - private AbstractComponent fakeRow; +// private AbstractComponent fakeRow; private List> zoomListeners = new LinkedList>(); @@ -120,14 +119,6 @@ public class TimeTracker extends HtmlMacroComponent { return detailLevel; } - public AbstractComponent getFakeRow() { - return fakeRow; - } - - public void setFakeRow(AbstractComponent fakeRow) { - this.fakeRow = fakeRow; - } - public DatesMapper getMapper() { if (datesMapper == null) { datesMapper = new DatesMapperOnInterval(getHorizontalSize(), diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailFiveTimeTrackerState.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailFiveTimeTrackerState.java index f4680dcb3..cd5262509 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailFiveTimeTrackerState.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailFiveTimeTrackerState.java @@ -42,7 +42,7 @@ public class DetailFiveTimeTrackerState extends TimeTrackerStateUsingJodaTime { public DetailItem create(DateTime dateTime) { return new DetailItem(SECOND_LEVEL_SIZE, dateTime .getDayOfMonth() - + ""); + + "", dateTime, dateTime.plusDays(1)); } }; } diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailFourTimeTrackerState.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailFourTimeTrackerState.java index af5dea7ac..d565b635c 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailFourTimeTrackerState.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailFourTimeTrackerState.java @@ -37,7 +37,7 @@ public class DetailFourTimeTrackerState extends TimeTrackerStateUsingJodaTime { public DetailItem create(DateTime dateTime) { return new DetailItem(SECOND_LEVEL_SIZE, dateTime .getWeekOfWeekyear() - + ""); + + "",dateTime,dateTime.plusWeeks(1)); } }; } diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailOneTimeTrackerState.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailOneTimeTrackerState.java index 012a4a75f..4241126e1 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailOneTimeTrackerState.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailOneTimeTrackerState.java @@ -8,6 +8,8 @@ package org.zkoss.ganttz.util.zoom; import java.util.Collection; import java.util.Vector; +import org.joda.time.DateTime; +import org.joda.time.Days; import org.zkoss.ganttz.util.Interval; /** @@ -38,19 +40,31 @@ public class DetailOneTimeTrackerState extends TimeTrackerState { return detailsVector; } + /** + * Creates secondary level DetailItems, adding currentDay tag to the + * proper interval (Bank holidays function call pending). + */ private Collection buildCollectionDetailsSecondLevel( int initialYear, int endYear) { Collection detailsVector = new Vector(); + DateTime beginDate = new DateTime(initialYear, 1, 1, 0, 0, 0, 0); + DateTime endDate = new DateTime(initialYear, 6, 1, 0, 0, 0, 0); + for (int i = initialYear; i <= endYear; i++) { - DetailItem d1 = new DetailItem(SECOND_LEVEL_ITEM_SIZE, "H1"); - detailsVector.add(d1); + DetailItem d1 = new DetailItem(SECOND_LEVEL_ITEM_SIZE, "H1", + beginDate, endDate); + DetailItem d2 = new DetailItem(SECOND_LEVEL_ITEM_SIZE, "H2", + beginDate.plusMonths(6), endDate.plusMonths(6)); - DetailItem d2 = new DetailItem(SECOND_LEVEL_ITEM_SIZE, "H2"); + detailsVector.add(d1); detailsVector.add(d2); + beginDate = beginDate.plusYears(1); + endDate = endDate.plusYears(1); + } return detailsVector; diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailThreeTimeTrackerState.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailThreeTimeTrackerState.java index 19e9cdccd..a47dfba47 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailThreeTimeTrackerState.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailThreeTimeTrackerState.java @@ -37,7 +37,8 @@ public class DetailThreeTimeTrackerState extends TimeTrackerStateUsingJodaTime { @Override public DetailItem create(DateTime dateTime) { return new DetailItem(SECOND_LEVEL_SIZE, - getMonthString(dateTime)); + getMonthString(dateTime), + dateTime, dateTime.plusMonths(1)); } }; } diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailTwoTimeTrackerState.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailTwoTimeTrackerState.java index 19ae69ff4..4d3695c5a 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailTwoTimeTrackerState.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/DetailTwoTimeTrackerState.java @@ -11,6 +11,7 @@ import java.util.Collection; import java.util.Date; import java.util.Vector; +import org.joda.time.DateTime; import org.zkoss.ganttz.util.Interval; /** @@ -73,23 +74,29 @@ public class DetailTwoTimeTrackerState extends TimeTrackerState { } + private Collection buildCollectionDetailsSecondLevel( Date initialDate, Date endDate, int initialYear, int endYear) { + ArrayList result = new ArrayList(); + + DateTime beginInterval = new DateTime(initialDate); + DateTime endInterval = beginInterval.plusMonths(3); int startDateQuarter = calculateInQuarterPeriodDateInYear(initialDate, initialYear); - ArrayList quarters = new ArrayList(); - for (int i = 0; i < 4; i++) { - quarters.add(new DetailItem(SECOND_LEVEL_ITEM_SIZE, "Q" + (i + 1))); + int quarterEndDate = calculateInQuarterPeriodDateInYear(endDate,endYear); + + for (int j = initialYear; j <= endYear; j++) { + for (int i = (j == initialYear ? startDateQuarter : 0); + i < (j == endYear ? quarterEndDate : 4); i++) { + DetailItem quarter = + new DetailItem(SECOND_LEVEL_ITEM_SIZE, "Q" + (i + 1), + beginInterval, endInterval); + result.add(quarter); + beginInterval = beginInterval.plusMonths(3); + endInterval = endInterval.plusMonths(3); + } } - // DetailItem is an inmutable class so it can be safely shared - result.addAll(quarters.subList(startDateQuarter - 1, 4)); - for (int i = (initialYear + 1); i < endYear; i++) { - result.addAll(quarters); - } - int quarterEndDate = calculateInQuarterPeriodDateInYear(endDate, - endYear); - result.addAll(quarters.subList(0, quarterEndDate)); return result; } diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/TimeTrackerState.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/TimeTrackerState.java index 5efd85ece..a8e58a44b 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/TimeTrackerState.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/zoom/TimeTrackerState.java @@ -12,6 +12,9 @@ import java.util.Date; import java.util.GregorianCalendar; import java.util.List; +import org.joda.time.DateTime; +import org.joda.time.Days; +import org.joda.time.JodaTimePermission; import org.zkoss.ganttz.util.Interval; /** @@ -23,7 +26,8 @@ public abstract class TimeTrackerState { protected static final int NUMBER_OF_ITEMS_MINIMUM = 10; /** - * This class is conceived as an immutable class. + * This class was conceived as an immutable class but it required to + * procesate twice DetailItem collections so it has now proper setters * @author Francisco Javier Moran RĂșa */ public final static class DetailItem { @@ -31,52 +35,105 @@ public abstract class TimeTrackerState { private int size; private String name; - private final boolean even; + private boolean even; + private boolean currentPeriod; + private int currentDayOffset; + + private DateTime startDate; + private DateTime endDate; + public DetailItem(int size, String name) { this(size, name, false); } + public DetailItem(int size, String name, + DateTime startDate, DateTime endDate) { + this(size, name, false); + this.startDate = startDate; + this.endDate = endDate; + this.markCurrentDay(); + } + + public void markCurrentDay( ) { + if ( this.startDate.isBeforeNow() && this.endDate.isAfterNow() ) { + int offsetInPx = Math.round( + ( ( (float) Days.daysBetween(this.startDate, new DateTime() ).getDays() ) / + ( (float) Days.daysBetween(this.startDate, this.endDate).getDays() ) + ) * this.size); + this.markCurrentDay(offsetInPx); + } + } + + + public DetailItem(int size, String name, boolean even) { this.size = size; this.name = name; this.even = even; + this.currentPeriod = false; + this.currentDayOffset = 0; + } + + public DetailItem(int size, String name, int currentdayoffset) { + this.size = size; + this.name = name; + this.even = false; + this.currentPeriod = true; + this.currentDayOffset = currentdayoffset; } - /** - * @return the size - */ public int getSize() { return size; } - /** - * @return the name - */ public String getName() { return name; } - public DetailItem markEven(boolean even) { - return new DetailItem(size, name, even); + public void setEven(boolean even) { + this.even = even; } + public void markCurrentDay(int offset) { + this.currentPeriod = true; + this.currentDayOffset = offset; + } + +/* public DetailItem markEven(boolean even) { + return new DetailItem(size, name, even, + currentPeriod, currentDayOffset); + } */ + + public boolean isEven() { return even; } + public boolean isCurrentPeriod() { + return currentPeriod; + } + + public int getCurrentDayOffset() { + return currentDayOffset; + } + } public Collection getFirstLevelDetails(Interval interval) { return markEvens(createDetailsForFirstLevel(interval)); } + // When applied after setting current day, removes extra data as current day + // or bank holidays, and must proccess the array twice. May be refactorized private static List markEvens( Collection items) { boolean even = false; ArrayList result = new ArrayList(); + for (DetailItem detailItem : items) { - result.add(detailItem.markEven(even)); + detailItem.setEven(even); + result.add( detailItem ); even = !even; } return result; @@ -90,6 +147,7 @@ public abstract class TimeTrackerState { Interval interval); public Collection getSecondLevelDetails(Interval interval) { + // Also mark holidays and current date return markEvens(createDetailsForSecondLevel(interval)); } diff --git a/navalplanner-gantt-zk/src/main/resources/web/ganttz/img/watermark_today.png b/navalplanner-gantt-zk/src/main/resources/web/ganttz/img/watermark_today.png new file mode 100644 index 0000000000000000000000000000000000000000..6f5c27dd1378d23f2f5444193c26ddd899eeaef0 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrA!3HEtFPV6O1d4;)ofy`glX(f`uqAoByDx`7I;J!Gca%qgD@k*tT_@uLG}_)Usv{ -
+
+
diff --git a/navalplanner-gantt-zk/src/main/resources/web/ganttz/zul/timetracker.zul b/navalplanner-gantt-zk/src/main/resources/web/ganttz/zul/timetracker.zul index 340029161..d5608f37e 100644 --- a/navalplanner-gantt-zk/src/main/resources/web/ganttz/zul/timetracker.zul +++ b/navalplanner-gantt-zk/src/main/resources/web/ganttz/zul/timetracker.zul @@ -27,13 +27,16 @@ top = self; - + ${each.name} - + diff --git a/navalplanner-gantt-zk/src/main/resources/web/js/ganttz/tasklist.js b/navalplanner-gantt-zk/src/main/resources/web/js/ganttz/tasklist.js index 01f46a9d2..521375aa5 100644 --- a/navalplanner-gantt-zk/src/main/resources/web/js/ganttz/tasklist.js +++ b/navalplanner-gantt-zk/src/main/resources/web/js/ganttz/tasklist.js @@ -26,8 +26,8 @@ zkTasklist.init = function(cmp) { } zkTasklist.adjust_height = function(cmp) { - var height = cmp.style.height; - var component_to_adjust = document.getElementById(cmp +/* var height = cmp.style.height; + var component_to_adjust = document.getElementById(cmp .getAttribute('sameHeightElementId')); function setHeight(element, offset) { @@ -37,11 +37,14 @@ zkTasklist.adjust_height = function(cmp) { var newheigth = parseInt(height) + offset; element.style["height"] = document.getElementById('scroll_container').style["height"]; } - setHeight(document.getElementById('ganttpanel'), HEIGHT_TIME_TRACKER); + if (component_to_adjust) { setHeight(component_to_adjust); - } + } */ + + document.getElementById('ganttpanel').style["height"] + = document.getElementById('scroll_container').style["height"]; adjustScrollableDimensions(); } @@ -126,4 +129,9 @@ function adjustScrollableDimensions() { document.getElementById('ganttpanel_inner_scroller_y').style["height"] = document.getElementById('listdetails_container').scrollHeight + "px"; + // Inner divs need recalculation to adjust to new scroll displacement lenght +/* It must be recalculated matching taskdetails width + * document.getElementById('ganttpanel_inner_scroller_x').style["width"] + = timetracker.firstElementChild.clientWidth +"px"; */ + } \ No newline at end of file diff --git a/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css b/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css index 4be228847..f3c135aa2 100644 --- a/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css +++ b/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css @@ -176,17 +176,33 @@ zkTasklist.SCROLLBAR_WIDTH = 15 height: 80px; } +/* Forces every zoom level the same table width */ +#timetracker table { + border-collapse: collapse; +} + +#timetracker .second_level_ tr { + height:14px; +} + +/* Watermark alternate row color */ #watermark .timetracker_column_even { background-color: #EEEEEE; } -.z-columns,.z-column { +/* Background image for current day vertical line */ +#watermark .timetracker_column_today { + background-image: url("/navalplanner-webapp/zkau/web/ganttz/img/watermark_today.png"); + background-repeat: repeat-y; +} + +/* Reduce spacing and font-size for watermark legend */ +.z-columns, .z-column { font-size: 8px !important; text-align: center; padding:0 0 0 0 !important; } - table { margin:0px; padding:0px;