diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/GanttPanel.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/GanttPanel.java index ea90507d2..23fa64d4b 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/GanttPanel.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/GanttPanel.java @@ -28,7 +28,7 @@ public class GanttPanel extends XulElement implements AfterCompose { public void afterCompose() { tasksLists.afterCompose(); dependencyList.setDependencies(tasksLists - .asDependencies(dependencyRegistry.getDependencies())); + .asDependencies(dependencyRegistry.getVisibleDependencies())); timeTracker.afterCompose(); dependencyList.afterCompose(); } 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 d6f9b6208..d4030b83e 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,6 +86,12 @@ 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/Planner.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/Planner.java index 08d1e9927..a2b647eba 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/Planner.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/Planner.java @@ -10,7 +10,6 @@ import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.ext.AfterCompose; import org.zkoss.zul.impl.XulElement; -import org.zkoss.zk.au.out.AuInvoke; public class Planner extends XulElement implements AfterCompose { @@ -129,7 +128,7 @@ public class Planner extends XulElement implements AfterCompose { } public void addTaskContainer(TaskContainerBean newTaskContainer) { - getTaskList().addTaskContainer(newTaskContainer); + getTaskList().addTask(newTaskContainer); dependencyRegistry.add(newTaskContainer); } diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/Task.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/Task.java index bd4900137..e22f8bf26 100755 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/Task.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/Task.java @@ -17,6 +17,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.zkoss.ganttz.util.TaskBean; +import org.zkoss.ganttz.util.TaskContainerBean; import org.zkoss.lang.Objects; import org.zkoss.xml.HTMLs; import org.zkoss.zk.au.AuRequest; @@ -127,11 +128,14 @@ public class Task extends Div implements AfterCompose { }; public static Task asTask(TaskBean taskBean) { + if (taskBean instanceof TaskContainerBean) { + return TaskContainer.asTask((TaskContainerBean) taskBean); + } return new Task(taskBean); } public Task(TaskBean taskBean) { - setHeight( HEIGHT_PER_TASK + "px"); + setHeight(HEIGHT_PER_TASK + "px"); setContext("idContextMenuTaskAssigment"); this.taskBean = taskBean; setColor(STANDARD_TASK_COLOR); 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 198a9cfe7..3c718e247 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 @@ -18,7 +18,6 @@ import org.zkoss.ganttz.util.MenuBuilder; import org.zkoss.ganttz.util.TaskBean; import org.zkoss.ganttz.util.WeakReferencedListeners; import org.zkoss.ganttz.util.MenuBuilder.ItemAction; -import org.zkoss.ganttz.util.TaskContainerBean; import org.zkoss.ganttz.util.WeakReferencedListeners.ListenerNotification; import org.zkoss.ganttz.util.zoom.ZoomLevel; import org.zkoss.ganttz.util.zoom.ZoomLevelChangedListener; @@ -36,7 +35,7 @@ import org.zkoss.zul.impl.XulElement; */ public class TaskList extends XulElement implements AfterCompose { - private static final int HEIGHT_PER_ROW = 20; /* 30 */ + private static final int HEIGHT_PER_ROW = 20; /* 30 */ private List> listeners = new LinkedList>(); @@ -80,10 +79,6 @@ public class TaskList extends XulElement implements AfterCompose { addTask(Task.asTask(newTask), true); } - public void addTaskContainer(TaskContainerBean newTaskContainer) { - addTask(TaskContainer.asTask(newTaskContainer), true); - } - public synchronized void addTask(final Task task, boolean relocate) { task.setParent(this); addContextMenu(task); diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/DependencyBean.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/DependencyBean.java index d61bee737..f0dc2dc68 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/DependencyBean.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/DependencyBean.java @@ -7,9 +7,7 @@ import java.util.Date; * This class represents a dependency. Contains the source and the destination. * It also specifies the type of the relationship.
* Created at Apr 24, 2009 - * * @author Óscar González Fernández - * */ public class DependencyBean { @@ -53,8 +51,10 @@ public class DependencyBean { private final DependencyType type; + private final boolean visible; + public DependencyBean(TaskBean source, TaskBean destination, - DependencyType type) { + DependencyType type, boolean visible) { if (source == null) throw new IllegalArgumentException("source cannot be null"); if (destination == null) @@ -64,6 +64,12 @@ public class DependencyBean { this.source = source; this.destination = destination; this.type = type; + this.visible = visible; + } + + public DependencyBean(TaskBean source, TaskBean destination, + DependencyType type) { + this(source, destination, type, true); } @Override @@ -110,4 +116,8 @@ public class DependencyBean { return type; } + public boolean isVisible() { + return visible; + } + } 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 e75cf664c..27a69ee7e 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 @@ -68,9 +68,25 @@ public class DependencyRegistry { } } + public void applyAllRestrictions() { + for (RulesEnforcer rulesEnforcer : rulesEnforcersByTask.values()) { + rulesEnforcer.update(); + } + } + public void add(TaskBean task) { graph.addVertex(task); rulesEnforcersByTask.put(task, new RulesEnforcer(task)); + if (task instanceof TaskContainerBean) { + TaskContainerBean container = (TaskContainerBean) task; + for (TaskBean child : container.getTasks()) { + add(child); + add(new DependencyBean(child, container, + DependencyType.END_END, false)); + add(new DependencyBean(container, child, + DependencyType.START_START, false)); + } + } } public void remove(TaskBean task) { @@ -111,9 +127,15 @@ public class DependencyRegistry { return new ArrayList(graph.vertexSet()); } - public List getDependencies() { + public List getVisibleDependencies() { Set edgeSet = graph.edgeSet(); - return new ArrayList(edgeSet); + ArrayList result = new ArrayList(); + for (DependencyBean dependencyBean : edgeSet) { + if (dependencyBean.isVisible()) { + result.add(dependencyBean); + } + } + return result; } } 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 f3dea9a73..fc4d9e0bc 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,13 +1,24 @@ package org.zkoss.ganttz.util; +import java.util.ArrayList; +import java.util.List; + /** - * This class contains the information of a task container. It can be modified and - * notifies of the changes to the interested parties.
+ * This class contains the information of a task container. It can be modified + * and notifies of the changes to the interested parties.
* Created at Jul 1, 2009 - * * @author Lorenzo Tilve Álvaro - * */ public class TaskContainerBean extends TaskBean { + private List tasks = new ArrayList(); + + public void add(TaskBean task) { + tasks.add(task); + } + + public List getTasks() { + return tasks; + } + } \ No newline at end of file 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 cbf135dc1..042f84b45 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 @@ -7,6 +7,7 @@ import org.zkoss.ganttz.util.DependencyBean; import org.zkoss.ganttz.util.DependencyRegistry; import org.zkoss.ganttz.util.DependencyType; import org.zkoss.ganttz.util.TaskBean; +import org.zkoss.ganttz.util.TaskContainerBean; /** * Some test data for planner
@@ -39,22 +40,40 @@ public class DataForPlanner { Date end = twoMonthsLater(now); TaskBean first = null; TaskBean second = null; - for (int i = 0; i < tasksToCreate; i++) { - TaskBean taskBean = new TaskBean(); + for (int i = 0; i < tasksToCreate - 3; i++) { + String name = "tarefa " + (i + 1); + TaskBean taskBean = createTaskBean(name, now, end); if (i == 0) first = taskBean; if (i == 1) second = taskBean; - taskBean.setName("tarefa " + (i + 1)); - taskBean.setBeginDate(now); - taskBean.setEndDate(end); dependencyRegistry.add(taskBean); } + TaskContainerBean container = new TaskContainerBean(); + container.setBeginDate(now); + container.setEndDate(end); + container.setName("container"); + TaskBean child1 = createTaskBean("child 1", now, end); + container.add(child1); + TaskBean child2 = createTaskBean("child 2", now, end); + container.add(child2); + dependencyRegistry.add(container); + dependencyRegistry.add(new DependencyBean(child1, child2, + DependencyType.END_START)); dependencyRegistry.add(new DependencyBean(first, second, DependencyType.END_START)); + dependencyRegistry.applyAllRestrictions(); return dependencyRegistry; } + private TaskBean createTaskBean(String name, Date now, Date end) { + TaskBean taskBean = new TaskBean(); + taskBean.setName(name); + taskBean.setBeginDate(now); + taskBean.setEndDate(end); + return taskBean; + } + private static Date twoMonthsLater(Date now) { Calendar calendar = Calendar.getInstance(); calendar.setTime(now); diff --git a/navalplanner-webapp/src/main/webapp/planner/main.zul b/navalplanner-webapp/src/main/webapp/planner/main.zul index 42736b5c5..a2b3a7ebe 100644 --- a/navalplanner-webapp/src/main/webapp/planner/main.zul +++ b/navalplanner-webapp/src/main/webapp/planner/main.zul @@ -12,7 +12,7 @@ - +