ItEr15S12RFComportamentoGraficoPlanificadorItEr14S13: Watermark current day hightlight for all zoom levels and column width fixes for DetailFour and DetailFive

This commit is contained in:
Lorenzo Tilve 2009-07-07 14:32:07 +02:00 committed by Javier Moran Rua
parent dd7b7f1a11
commit 71f3dee511
13 changed files with 148 additions and 57 deletions

View file

@ -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);
}
}
}

View file

@ -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<WeakReference<ZoomLevelChangedListener>> zoomListeners = new LinkedList<WeakReference<ZoomLevelChangedListener>>();
@ -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(),

View file

@ -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));
}
};
}

View file

@ -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));
}
};
}

View file

@ -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<DetailItem> buildCollectionDetailsSecondLevel(
int initialYear, int endYear) {
Collection<DetailItem> detailsVector = new Vector<DetailItem>();
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;

View file

@ -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));
}
};
}

View file

@ -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<DetailItem> buildCollectionDetailsSecondLevel(
Date initialDate, Date endDate, int initialYear, int endYear) {
ArrayList<DetailItem> result = new ArrayList<DetailItem>();
DateTime beginInterval = new DateTime(initialDate);
DateTime endInterval = beginInterval.plusMonths(3);
int startDateQuarter = calculateInQuarterPeriodDateInYear(initialDate,
initialYear);
ArrayList<DetailItem> quarters = new ArrayList<DetailItem>();
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;
}

View file

@ -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<DetailItem> 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<DetailItem> markEvens(
Collection<? extends DetailItem> items) {
boolean even = false;
ArrayList<DetailItem> result = new ArrayList<DetailItem>();
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<DetailItem> getSecondLevelDetails(Interval interval) {
// Also mark holidays and current date
return markEvens(createDetailsForSecondLevel(interval));
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

View file

@ -32,7 +32,8 @@ var myLogReader = new YAHOO.widget.LogReader(myContainer);*/
<c:set var="self" value="${requestScope.arg.self}"/>
<div id="${self.uuid}" z.type="ganttz.tasklist.Tasklist" z.autoz="true"${self.outerAttrs}" sameHeightElementId="${self.sameHeightElementId}">
<div id="${self.uuid}" z.type="ganttz.tasklist.Tasklist" z.autoz="true"${self.outerAttrs}">
<div id="listtasks">
<c:forEach var="child" items="${self.children}">

View file

@ -27,13 +27,16 @@ top = self;
<n:table style="width: ${top.horizontalSize+2}px;" class="second_level_">
<n:tr class="z-columns">
<n:th class="z-column" forEach="${top.detailsSecondLevel}">
<n:th class="z-column" forEach="${top.detailsSecondLevel}"
style="width: ${each.size}px">
${each.name}
</n:th>
</n:tr>
<n:tr id="watermark" style="height:100px">
<n:td class="timetracker_column${(each.even?'_even':'')}"
forEach="${top.detailsSecondLevel}"></n:td>
<n:td class="timetracker_column${(each.even?'_even':'')}
${(each.currentPeriod?'timetracker_column_today':'')}"
forEach="${top.detailsSecondLevel}"
style="background-position: ${each.currentDayOffset}px"/>
</n:tr>
</n:table>
</n:div>

View file

@ -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"; */
}

View file

@ -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;