From 101c7609fea419a9a0c5a6ecfabf2a35f7186f8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Wed, 1 Jul 2009 21:54:03 +0200 Subject: [PATCH] ItEr15S12RFComportamentoGraficoPlanificadorItEr14S13: Shrinking as required is implemented now. --- .../java/org/zkoss/ganttz/ListDetails.java | 6 -- .../zkoss/ganttz/util/DependencyRegistry.java | 54 +++++++++---- .../zkoss/ganttz/util/TaskContainerBean.java | 76 +++++++++++++++++++ 3 files changed, 117 insertions(+), 19 deletions(-) diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/ListDetails.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/ListDetails.java index d4030b83e..d6f9b6208 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/ListDetails.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/ListDetails.java @@ -86,12 +86,6 @@ public class ListDetails extends HtmlMacroComponent { private TaskDetail addTask(TaskBean taskBean) { TaskDetail taskDetail = TaskDetail.create(taskBean); getInsertionPoint().appendChild(taskDetail); - if (taskBean instanceof TaskContainerBean) { - TaskContainerBean container = (TaskContainerBean) taskBean; - for (TaskBean t : container.getTasks()) { - addTask(t); - } - } taskDetail.afterCompose(); return taskDetail; } diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/DependencyRegistry.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/DependencyRegistry.java index 27a69ee7e..29e548e2b 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/DependencyRegistry.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/DependencyRegistry.java @@ -25,10 +25,10 @@ public class DependencyRegistry { private final DirectedGraph graph = new SimpleDirectedGraph( DependencyBean.class); - private Map rulesEnforcersByTask = new HashMap(); + private Map rulesEnforcersByTask = new HashMap(); - private List getOutgoing(TaskBean task) { - ArrayList result = new ArrayList(); + private List getOutgoing(TaskBean task) { + ArrayList result = new ArrayList(); for (DependencyBean dependencyBean : graph.outgoingEdgesOf(task)) { result.add(rulesEnforcersByTask .get(dependencyBean.getDestination())); @@ -36,10 +36,36 @@ public class DependencyRegistry { return result; } - private class RulesEnforcer { + private class ParentShrinkingEnforcer { + + private final TaskContainerBean container; + + private ParentShrinkingEnforcer(final TaskContainerBean container) { + if (container == null) + throw new IllegalArgumentException("container cannot be null"); + this.container = container; + for (TaskBean subtask : this.container.getTasks()) { + subtask.addPropertyChangeListener(new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + Date newBeginDate = container + .getSmallestBeginDateFromChildren(); + container.setBeginDate(newBeginDate); + Date newEndDate = container + .getBiggestDateFromChildren(); + container.setEndDate(newEndDate); + } + }); + } + } + + } + + private class DependencyRulesEnforcer { private final TaskBean task; - private RulesEnforcer(TaskBean task) { + private DependencyRulesEnforcer(TaskBean task) { if (task == null) throw new IllegalArgumentException("task cannot be null"); this.task = task; @@ -47,8 +73,8 @@ public class DependencyRegistry { @Override public void propertyChange(PropertyChangeEvent evt) { - RulesEnforcer.this.update(); - updateOutgoing(RulesEnforcer.this.task); + DependencyRulesEnforcer.this.update(); + updateOutgoing(DependencyRulesEnforcer.this.task); } }); } @@ -69,16 +95,18 @@ public class DependencyRegistry { } public void applyAllRestrictions() { - for (RulesEnforcer rulesEnforcer : rulesEnforcersByTask.values()) { + for (DependencyRulesEnforcer rulesEnforcer : rulesEnforcersByTask + .values()) { rulesEnforcer.update(); } } public void add(TaskBean task) { graph.addVertex(task); - rulesEnforcersByTask.put(task, new RulesEnforcer(task)); + rulesEnforcersByTask.put(task, new DependencyRulesEnforcer(task)); if (task instanceof TaskContainerBean) { TaskContainerBean container = (TaskContainerBean) task; + new ParentShrinkingEnforcer(container); for (TaskBean child : container.getTasks()) { add(child); add(new DependencyBean(child, container, @@ -90,7 +118,7 @@ public class DependencyRegistry { } public void remove(TaskBean task) { - List outgoing = getOutgoing(task); + List outgoing = getOutgoing(task); graph.removeVertex(task); rulesEnforcersByTask.remove(task); update(outgoing); @@ -100,8 +128,8 @@ public class DependencyRegistry { update(getOutgoing(task)); } - private void update(List outgoing) { - for (RulesEnforcer rulesEnforcer : outgoing) { + private void update(List outgoing) { + for (DependencyRulesEnforcer rulesEnforcer : outgoing) { rulesEnforcer.update(); } } @@ -119,7 +147,7 @@ public class DependencyRegistry { getEnforcer(destination).update(); } - private RulesEnforcer getEnforcer(TaskBean destination) { + private DependencyRulesEnforcer getEnforcer(TaskBean destination) { return rulesEnforcersByTask.get(destination); } diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/TaskContainerBean.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/TaskContainerBean.java index fc4d9e0bc..6b672af79 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/TaskContainerBean.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/TaskContainerBean.java @@ -1,6 +1,9 @@ package org.zkoss.ganttz.util; import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.Date; import java.util.List; /** @@ -11,6 +14,51 @@ import java.util.List; */ public class TaskContainerBean extends TaskBean { + private static List removeNulls(Collection elements) { + ArrayList result = new ArrayList(); + for (T e : elements) { + if (e != null) { + result.add(e); + } + } + return result; + } + + private static T getSmallest(Collection elements, + Comparator comparator) { + List withoutNulls = removeNulls(elements); + if (withoutNulls.isEmpty()) + throw new IllegalArgumentException("at least one required"); + T result = null; + for (T element : withoutNulls) { + result = result == null ? element : (comparator.compare(result, + element) < 0 ? result : element); + } + return result; + } + + private static > T getSmallest( + Collection elements) { + return getSmallest(elements, new Comparator() { + + @Override + public int compare(T o1, T o2) { + return o1.compareTo(o2); + } + }); + } + + private static > T getBiggest( + Collection elements) { + return getSmallest(elements, new Comparator() { + + @Override + public int compare(T o1, T o2) { + return o2.compareTo(o1); + } + }); + } + private List tasks = new ArrayList(); public void add(TaskBean task) { @@ -21,4 +69,32 @@ public class TaskContainerBean extends TaskBean { return tasks; } + public Date getSmallestBeginDateFromChildren() { + if (tasks.isEmpty()) + return getBeginDate(); + return getSmallest(getStartDates()); + } + + private List getStartDates() { + ArrayList result = new ArrayList(); + for (TaskBean taskBean : tasks) { + result.add(taskBean.getBeginDate()); + } + return result; + } + + private List getEndDates() { + ArrayList result = new ArrayList(); + for (TaskBean taskBean : tasks) { + result.add(taskBean.getEndDate()); + } + return result; + } + + public Date getBiggestDateFromChildren() { + if (tasks.isEmpty()) + return getEndDate(); + return getBiggest(getEndDates()); + } + } \ No newline at end of file