ItEr15S12RFComportamentoGraficoPlanificadorItEr14S13: Watermark current day hightlight for all zoom levels and column width fixes for DetailFour and DetailFive
This commit is contained in:
parent
dd7b7f1a11
commit
71f3dee511
13 changed files with 148 additions and 57 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -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(),
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 |
|
|
@ -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}">
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"; */
|
||||
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue