From dcab89f93e910dbf9d91e7781a4aafe180b7b7e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Sat, 22 Aug 2009 16:08:28 +0200 Subject: [PATCH] ItEr22S12CUVistaRecursosTempoPorProxectoItEr21S07: Rendering the data to be shown --- .../resourceload/ResourceLoadComponent.java | 125 ++++++++++-------- .../resourceload/ResourceLoadLeftPane.java | 33 ++++- .../ganttz/resourceload/ResourceLoadList.java | 41 +++--- .../resourceload/ResourcesLoadPanel.java | 15 ++- .../web/ganttz/resourceload/resourceload.dsp | 7 +- .../web/planner/DataForPlanner.java | 62 ++++++++- .../src/main/webapp/planner/css/ganttzk.css | 11 +- 7 files changed, 192 insertions(+), 102 deletions(-) diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java b/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java index e17145ede..fd747dc8e 100755 --- a/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java @@ -2,77 +2,98 @@ package org.zkoss.ganttz.resourceload; import java.util.ArrayList; import java.util.List; -import java.util.UUID; -import org.zkoss.ganttz.data.resourceload.ResourceLoad; -import org.zkoss.ganttz.data.resourceload.ResourceLoadLevel; -import org.zkoss.zk.au.out.AuInvoke; -import org.zkoss.zk.ui.ext.AfterCompose; +import org.joda.time.LocalDate; +import org.zkoss.ganttz.IDatesMapper; +import org.zkoss.ganttz.TimeTracker; +import org.zkoss.ganttz.data.resourceload.LoadPeriod; +import org.zkoss.ganttz.data.resourceload.LoadTimeLine; +import org.zkoss.ganttz.util.zoom.IZoomLevelChangedListener; +import org.zkoss.ganttz.util.zoom.ZoomLevel; import org.zkoss.zul.Div; +import org.zkoss.zul.impl.XulElement; /** * This class wraps ResourceLoad data inside an specific HTML Div component. * @author Lorenzo Tilve Álvaro */ -public class ResourceLoadComponent extends Div implements AfterCompose { +public class ResourceLoadComponent extends XulElement { - private static final int HEIGHT_PER_ROW = 10; - private final ResourceLoad resourceLoad; - private List children; + public static ResourceLoadComponent create(TimeTracker timeTracker, + LoadTimeLine loadLine) { + return new ResourceLoadComponent(timeTracker, loadLine); + } - public class ResourceLoadInterval extends Div { + private final LoadTimeLine loadLine; + private final TimeTracker timeTracker; + private IZoomLevelChangedListener zoomChangedListener; - private int length; - private ResourceLoadLevel loadLevel; - private int loadPercentage; + private ResourceLoadComponent(final TimeTracker timeTracker, + final LoadTimeLine loadLine) { + this.loadLine = loadLine; + this.timeTracker = timeTracker; + createChildren(loadLine, timeTracker.getMapper()); + zoomChangedListener = new IZoomLevelChangedListener() { - public ResourceLoadInterval(int length, int loadPercentage) { - this.length = length; - this.loadPercentage = loadPercentage; - this.loadLevel= ResourceLoadLevel.getFromPercentage(loadPercentage); + @Override + public void zoomLevelChanged(ZoomLevel detailLevel) { + getChildren().clear(); + createChildren(loadLine, timeTracker.getMapper()); + } + }; + this.timeTracker.addZoomListener(zoomChangedListener); + } + + private void createChildren(LoadTimeLine loadLine, IDatesMapper mapper) { + List
divs = createDivsForPeriods(mapper, loadLine.getLoadPeriods()); + for (Div div : divs) { + appendChild(div); } - - public int getLenght() { - return this.length; - } - - public ResourceLoadLevel getLoadLevel() { - return this.loadLevel; - } - } - - public ResourceLoadComponent(ResourceLoad resourceLoad) { - setHeight(HEIGHT_PER_ROW + "px"); - setContext("idContextMenuTaskAssigment"); - this.resourceLoad = resourceLoad; - - // Added some example ResourceLoadIntervals - this.children = new ArrayList(); - setId(UUID.randomUUID().toString()); - } - - protected String calculateClass() { - return "box"; - } - - protected void updateClass() { - response(null, new AuInvoke(this, "setClass", - new Object[] { calculateClass() })); - } - - public void afterCompose() { } public String getResourceLoadName() { - return this.resourceLoad.getName(); + return loadLine.getConceptName(); } - public List getChildren() { - return this.children; + private static List
createDivsForPeriods(IDatesMapper datesMapper, + List loadPeriods) { + List
result = new ArrayList
(); + for (LoadPeriod loadPeriod : loadPeriods) { + result.add(createDivForPeriod(datesMapper, loadPeriod)); + } + return result; } - public void addInterval(int length, int plannificationPercentage) { - this.children.add(new ResourceLoadInterval(length, plannificationPercentage)); + private static Div createDivForPeriod(IDatesMapper datesMapper, + LoadPeriod loadPeriod) { + Div result = new Div(); + result.setClass(String.format("taskassignmentinterval %s", loadPeriod + .getLoadLevel().getCategory())); + result.setLeft(forCSS(getStartPixels(datesMapper, loadPeriod))); + result.setWidth(forCSS(getWidthPixels(datesMapper, loadPeriod))); + return result; + } + + private static int getWidthPixels(IDatesMapper datesMapper, + LoadPeriod loadPeriod) { + LocalDate start = loadPeriod.getStart(); + LocalDate end = loadPeriod.getEnd(); + return datesMapper + .toPixels(toMilliseconds(end) - toMilliseconds(start)); + } + + private static long toMilliseconds(LocalDate localDate) { + return localDate.toDateMidnight().getMillis(); + } + + private static String forCSS(int pixels) { + return String.format("%dpx", pixels); + } + + private static int getStartPixels(IDatesMapper datesMapper, + LoadPeriod loadPeriod) { + return datesMapper.toPixels(loadPeriod.getStart().toDateMidnight() + .toDate()); } } \ No newline at end of file diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadLeftPane.java b/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadLeftPane.java index 626df2f74..5b9beb1f9 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadLeftPane.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadLeftPane.java @@ -1,20 +1,43 @@ package org.zkoss.ganttz.resourceload; +import java.util.List; + +import org.zkoss.ganttz.data.resourceload.LoadTimeLine; +import org.zkoss.ganttz.data.resourceload.LoadTimelinesGroup; +import org.zkoss.zk.ui.Component; import org.zkoss.zul.Div; import org.zkoss.zul.Label; import org.zkoss.zul.impl.XulElement; public class ResourceLoadLeftPane extends XulElement { - public ResourceLoadLeftPane() { - appendChild(createFakeRow()); - appendChild(createFakeRow()); + public ResourceLoadLeftPane(List groups) { + for (LoadTimelinesGroup loadTimelinesGroup : groups) { + LoadTimeLine principal = loadTimelinesGroup.getPrincipal(); + appendChild(createFirstLevel(principal)); + for (LoadTimeLine loadTimeLine : loadTimelinesGroup.getChildren()) { + appendChild(createSecondLevel(loadTimeLine)); + } + } } - private Div createFakeRow() { + private Component createFirstLevel(LoadTimeLine principal) { + Div result = createLabelWithName(principal); + result.setSclass("firstlevel"); + return result; + } + + + private Component createSecondLevel(LoadTimeLine loadTimeLine) { + Div result = createLabelWithName(loadTimeLine); + result.setSclass("secondlevel"); + return result; + } + + private Div createLabelWithName(LoadTimeLine principal) { Div result = new Div(); Label label = new Label(); - label.setValue("test"); + label.setValue(principal.getConceptName()); result.appendChild(label); return result; } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadList.java b/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadList.java index 51f4930f1..815bb58ad 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadList.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadList.java @@ -1,8 +1,11 @@ package org.zkoss.ganttz.resourceload; +import java.util.ArrayList; import java.util.List; -import org.zkoss.ganttz.data.resourceload.ResourceLoad; +import org.zkoss.ganttz.TimeTracker; +import org.zkoss.ganttz.data.resourceload.LoadTimeLine; +import org.zkoss.ganttz.data.resourceload.LoadTimelinesGroup; import org.zkoss.zul.impl.XulElement; /** @@ -11,32 +14,22 @@ import org.zkoss.zul.impl.XulElement; */ public class ResourceLoadList extends XulElement { - private List resourceLoads; - public ResourceLoadList(List resourceLoads) { - this.resourceLoads = resourceLoads; - insertFakeData(); + public ResourceLoadList(TimeTracker timeTracker, + List groups) { + for (LoadTimelinesGroup l : groups) { + ArrayList toInsert = new ArrayList(); + toInsert.add(l.getPrincipal()); + toInsert.addAll(l.getChildren()); + insertAsComponents(timeTracker, toInsert); + } } - private void insertFakeData() { - ResourceLoadComponent rlc1 = new ResourceLoadComponent( - new ResourceLoad("ResourceLoad 1")); - ResourceLoadComponent rlc2 = new ResourceLoadComponent( - new ResourceLoad("ResourceLoad 1")); - - rlc1.addInterval(40, 100); - rlc1.addInterval(20, 80); - rlc1.addInterval(30, 150); - rlc1.addInterval(10, 0); - - rlc2.addInterval(10, 100); - rlc2.addInterval(20, 60); - rlc2.addInterval(30, 100); - rlc2.addInterval(20, 0); - rlc2.addInterval(20, 60); - appendChild(rlc1); - appendChild(rlc2); + private void insertAsComponents(TimeTracker timetracker, + List children) { + for (LoadTimeLine loadTimeLine : children) { + appendChild(ResourceLoadComponent.create(timetracker, loadTimeLine)); + } } - } 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 eef479134..284b20c70 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java @@ -1,11 +1,11 @@ package org.zkoss.ganttz.resourceload; -import java.util.Collections; +import java.util.List; import org.zkoss.ganttz.Planner; import org.zkoss.ganttz.TimeTracker; import org.zkoss.ganttz.TimeTrackerComponent; -import org.zkoss.ganttz.data.resourceload.ResourceLoad; +import org.zkoss.ganttz.data.resourceload.LoadTimelinesGroup; import org.zkoss.zk.ui.ext.AfterCompose; import org.zkoss.zul.impl.XulElement; @@ -17,11 +17,14 @@ public class ResourcesLoadPanel extends XulElement implements AfterCompose { private ResourceLoadList resourceLoadList; - public ResourcesLoadPanel(TimeTracker timeTracker) { + private final List groups; + + public ResourcesLoadPanel(List groups, + TimeTracker timeTracker) { + this.groups = groups; timeTrackerComponent = timeTrackerForResourcesLoadPanel(timeTracker); - resourceLoadList = new ResourceLoadList(Collections - . emptyList()); - leftPane = new ResourceLoadLeftPane(); + resourceLoadList = new ResourceLoadList(timeTracker, groups); + leftPane = new ResourceLoadLeftPane(groups); appendChild(timeTrackerComponent); appendChild(leftPane); appendChild(resourceLoadList); diff --git a/ganttzk/src/main/resources/web/ganttz/resourceload/resourceload.dsp b/ganttzk/src/main/resources/web/ganttz/resourceload/resourceload.dsp index 437f93ddc..23a1817c8 100755 --- a/ganttzk/src/main/resources/web/ganttz/resourceload/resourceload.dsp +++ b/ganttzk/src/main/resources/web/ganttz/resourceload/resourceload.dsp @@ -2,12 +2,11 @@ <%@ taglib uri="http://www.zkoss.org/dsp/zk/core" prefix="z" %> -
+ z.autoz="true" ${self.outerAttrs}"> ${self.resourceLoadName} -
+ ${z:redraw(child, null)}
+ diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/DataForPlanner.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/DataForPlanner.java index 0e563662a..0b0df4adb 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/DataForPlanner.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/DataForPlanner.java @@ -3,10 +3,14 @@ package org.navalplanner.web.planner; import static org.navalplanner.web.I18nHelper._; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.List; +import org.joda.time.DateTime; +import org.joda.time.Duration; +import org.joda.time.LocalDate; import org.zkoss.ganttz.TaskEditFormComposer; import org.zkoss.ganttz.adapters.AutoAdapter; import org.zkoss.ganttz.adapters.DomainDependency; @@ -18,6 +22,10 @@ import org.zkoss.ganttz.data.GanttDiagramGraph; import org.zkoss.ganttz.data.ITaskFundamentalProperties; import org.zkoss.ganttz.data.Task; import org.zkoss.ganttz.data.TaskLeaf; +import org.zkoss.ganttz.data.resourceload.LoadLevel; +import org.zkoss.ganttz.data.resourceload.LoadPeriod; +import org.zkoss.ganttz.data.resourceload.LoadTimeLine; +import org.zkoss.ganttz.data.resourceload.LoadTimelinesGroup; import org.zkoss.ganttz.extensions.ICommand; import org.zkoss.ganttz.extensions.ICommandOnTask; import org.zkoss.ganttz.extensions.IContext; @@ -65,8 +73,9 @@ public class DataForPlanner { @Override public void show() { - loadPanel = new ResourcesLoadPanel(context - .getTimeTracker()); + loadPanel = new ResourcesLoadPanel( + createFakeDataForResourcesLoad(), context + .getTimeTracker()); parent.appendChild(loadPanel); loadPanel.afterCompose(); } @@ -92,6 +101,45 @@ public class DataForPlanner { }); } + private List createFakeDataForResourcesLoad() { + List result = new ArrayList(); + LoadTimeLine resource1 = new LoadTimeLine("resource1", + createFakePeriodsStartingAt(new LocalDate(2009, 2, 3), Duration + .standardDays(20), Duration.standardDays(90), 3)); + LoadTimeLine task1 = new LoadTimeLine("task1", + createFakePeriodsStartingAt(new LocalDate(2009, 5, 4), Duration + .standardDays(20), Duration.standardDays(70), 3)); + LoadTimeLine task2 = new LoadTimeLine("task2", + createFakePeriodsStartingAt(new LocalDate(2009, 4, 1), Duration + .standardDays(20), Duration.standardDays(90), 3)); + LoadTimeLine task3 = new LoadTimeLine("task3", + createFakePeriodsStartingAt(new LocalDate(2009, 6, 1), Duration + .standardDays(20), Duration.standardDays(40), 4)); + LoadTimeLine resource2 = new LoadTimeLine( + "resource1", + createFakePeriodsStartingAt(new LocalDate(2009, 10, 1), + Duration.standardDays(20), Duration.standardDays(90), 2)); + result.add(new LoadTimelinesGroup(resource1, Arrays + .asList(task1, task2))); + result.add(new LoadTimelinesGroup(resource2, Arrays.asList(task3))); + return result; + } + + private List createFakePeriodsStartingAt(LocalDate start, + Duration separation, Duration periodLength, int numberOfPeriods) { + DateTime current = start.toDateMidnight().toDateTime(); + List result = new ArrayList(); + for (int i = 0; i < numberOfPeriods; i++) { + DateTime previous = current.plus(separation); + current = previous.plus(periodLength); + result + .add(new LoadPeriod(previous.toLocalDate(), current + .toLocalDate(), new LoadLevel( + (int) (Math.random() * 150)))); + } + return result; + } + private void addCommands( PlannerConfiguration configuration) { configuration @@ -137,7 +185,8 @@ public class DataForPlanner { } }); - configuration.setEditTaskCommand(new ICommandOnTask() { + configuration + .setEditTaskCommand(new ICommandOnTask() { @Override public void doAction( @@ -177,11 +226,12 @@ public class DataForPlanner { final ITaskFundamentalProperties child1 = createTask(_("child 1"), now, end); containerChildren.add(child1); - final DefaultFundamentalProperties child2 = createTask(_("another"), now, - end); + final DefaultFundamentalProperties child2 = createTask(_("another"), + now, end); containerChildren.add(child2); list.add(container); - final ITaskFundamentalProperties first = createTask(_("task1"), now, end); + final ITaskFundamentalProperties first = createTask(_("task1"), now, + end); final ITaskFundamentalProperties second = createTask(_("task2"), now, end); list.add(first); diff --git a/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css b/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css index ae991237a..023ff7f6f 100644 --- a/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css +++ b/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css @@ -343,24 +343,25 @@ tr.z-vbox-sep { .taskassignmentinterval { float:left; height:10px; - position:relative; + position:absolute; } -.FULL_PLANIFICATED { +.FULL_LOAD { background-color:green; } -.PLANIFICATED { +.SOME_LOAD { background-color:orange; } -.OVER_PLANIFICATED { +.OVERLOAD { background-color:red; } -.NOT_PLANIFICATED { +.NO_LOAD { background-color:#007bbe; } + .row_resourceload { height: 10px; border: solid 1px #000000;