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 b713c39b8..6e1c398fe 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 @@ -16,13 +16,13 @@ import org.zkoss.ganttz.TaskDetail.ITaskDetailNavigator; import org.zkoss.ganttz.util.MutableTreeModel; import org.zkoss.ganttz.util.TaskBean; import org.zkoss.ganttz.util.TaskContainerBean; +import org.zkoss.ganttz.util.TaskLeafBean; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.HtmlMacroComponent; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.OpenEvent; -import org.zkoss.zul.SimpleTreeNode; import org.zkoss.zul.Tree; import org.zkoss.zul.TreeModel; import org.zkoss.zul.Treecell; @@ -40,7 +40,7 @@ public class ListDetails extends HtmlMacroComponent { String cssClass = "depth_" + path.length; TaskDetail taskDetail = TaskDetail.create(taskBean, new TreeNavigator(tasksTreeModel, taskBean)); - if (taskBean instanceof TaskContainerBean) { + if (taskBean.isContainer()) { expandWhenOpened((TaskContainerBean) taskBean, item); } Component row = Executions.getCurrent().createComponents( @@ -69,11 +69,7 @@ public class ListDetails extends HtmlMacroComponent { } public boolean isOpened(TaskBean taskBean) { - if (taskBean instanceof TaskContainerBean) { - TaskContainerBean container = (TaskContainerBean) taskBean; - return container.isExpanded(); - } - return true; + return taskBean.isLeaf() || taskBean.isExpanded(); } private final class DetailsForBeans { @@ -155,22 +151,20 @@ public class ListDetails extends HtmlMacroComponent { ListIterator listIterator = parents.listIterator(); while (listIterator.hasNext()) { parent = listIterator.next(); - result - .add(new ChildAndParent(child, - (TaskContainerBean) parent)); + result.add(new ChildAndParent(child, parent)); child = parent; } return result; } private class ChildAndParent { - private final TaskContainerBean parent; + private final TaskBean parent; private final TaskBean child; private Integer positionOfChildCached; - private ChildAndParent(TaskBean child, TaskContainerBean parent) { + private ChildAndParent(TaskBean child, TaskBean parent) { this.parent = parent; this.child = child; } @@ -197,15 +191,11 @@ public class ListDetails extends HtmlMacroComponent { } private boolean hasChildren() { - return task instanceof TaskContainerBean - && ((TaskContainerBean) task).getTasks().size() > 0; + return task.isContainer() && task.getTasks().size() > 0; } private boolean isExpanded() { - if (task instanceof TaskContainerBean) { - return ((TaskContainerBean) task).isExpanded(); - } - return false; + return task.isContainer() && task.isExpanded(); } private TaskBean getParent(int[] path) { @@ -232,10 +222,6 @@ public class ListDetails extends HtmlMacroComponent { this.taskBeans = taskBeans; } - private static TaskBean getTaskBean(SimpleTreeNode node) { - return (TaskBean) node.getData(); - } - private static void fillModel(MutableTreeModel treeModel, List taskBeans) { for (TaskBean taskBean : taskBeans) { @@ -246,10 +232,9 @@ public class ListDetails extends HtmlMacroComponent { private static void fillModel(MutableTreeModel treeModel, TaskBean parent, TaskBean node) { treeModel.add(parent, node); - if (node instanceof TaskContainerBean) { - TaskContainerBean container = (TaskContainerBean) node; - for (TaskBean child : container.getTasks()) { - fillModel(treeModel, container, child); + if (node.isContainer()) { + for (TaskBean child : node.getTasks()) { + fillModel(treeModel, node, child); } } } @@ -263,7 +248,7 @@ public class ListDetails extends HtmlMacroComponent { } public void addTask() { - TaskBean newTask = new TaskBean(); + TaskBean newTask = new TaskLeafBean(); newTask.setName("Nova Tarefa"); newTask.setBeginDate(new Date()); newTask.setEndDate(threeMonthsLater(newTask.getBeginDate())); 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 234c67413..b0032f169 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 @@ -129,7 +129,7 @@ public class Task extends Div implements AfterCompose { }; public static Task asTask(TaskBean taskBean, TaskList taskList) { - if (taskBean instanceof TaskContainerBean) { + if (taskBean.isContainer()) { return TaskContainer.asTask((TaskContainerBean) taskBean, taskList); } return new Task(taskBean); diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TaskContainer.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TaskContainer.java index 60cbcb29f..f89b5dfb2 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TaskContainer.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TaskContainer.java @@ -18,9 +18,10 @@ import org.zkoss.zk.ui.ext.AfterCompose; */ public class TaskContainer extends Task implements AfterCompose { - public static TaskContainer asTask(TaskContainerBean taskContainerBean, + public static TaskContainer asTask(TaskBean taskContainerBean, TaskList taskList) { - return new TaskContainer(taskContainerBean, taskList); + return new TaskContainer((TaskContainerBean) taskContainerBean, + taskList); } private List subtasks = new ArrayList(); @@ -30,6 +31,8 @@ public class TaskContainer extends Task implements AfterCompose { public TaskContainer(TaskContainerBean taskContainerBean, TaskList taskList) { super(taskContainerBean); + if (!taskContainerBean.isContainer()) + throw new IllegalArgumentException(); this.expandListener = new IExpandListener() { @Override 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 8fbb3e595..5af3b44f7 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 @@ -48,18 +48,19 @@ public class DependencyRegistry { throw new IllegalArgumentException("container cannot be null"); this.container = container; for (TaskBean subtask : this.container.getTasks()) { - subtask.addFundamentalPropertiesChangeListener(new PropertyChangeListener() { + subtask + .addFundamentalPropertiesChangeListener(new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - Date newBeginDate = container - .getSmallestBeginDateFromChildren(); - container.setBeginDate(newBeginDate); - Date newEndDate = container - .getBiggestDateFromChildren(); - container.setEndDate(newEndDate); - } - }); + @Override + public void propertyChange(PropertyChangeEvent evt) { + Date newBeginDate = container + .getSmallestBeginDateFromChildren(); + container.setBeginDate(newBeginDate); + Date newEndDate = container + .getBiggestDateFromChildren(); + container.setEndDate(newEndDate); + } + }); } } @@ -72,14 +73,15 @@ public class DependencyRegistry { if (task == null) throw new IllegalArgumentException("task cannot be null"); this.task = task; - this.task.addFundamentalPropertiesChangeListener(new PropertyChangeListener() { + this.task + .addFundamentalPropertiesChangeListener(new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - DependencyRulesEnforcer.this.update(); - updateOutgoing(DependencyRulesEnforcer.this.task); - } - }); + @Override + public void propertyChange(PropertyChangeEvent evt) { + DependencyRulesEnforcer.this.update(); + updateOutgoing(DependencyRulesEnforcer.this.task); + } + }); } void update() { @@ -112,15 +114,14 @@ public class DependencyRegistry { private void addTask(TaskBean task) { graph.addVertex(task); rulesEnforcersByTask.put(task, new DependencyRulesEnforcer(task)); - if (task instanceof TaskContainerBean) { - TaskContainerBean container = (TaskContainerBean) task; - new ParentShrinkingEnforcer(container); - for (TaskBean child : container.getTasks()) { + if (task.isContainer()) { + new ParentShrinkingEnforcer((TaskContainerBean) task); + for (TaskBean child : task.getTasks()) { addTask(child); - add(new DependencyBean(child, container, - DependencyType.END_END, false)); - add(new DependencyBean(container, child, - DependencyType.START_START, false)); + add(new DependencyBean(child, task, DependencyType.END_END, + false)); + add(new DependencyBean(task, child, DependencyType.START_START, + false)); } } } diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/TaskBean.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/TaskBean.java index b6715f3d1..6434d361c 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/TaskBean.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/TaskBean.java @@ -3,6 +3,7 @@ package org.zkoss.ganttz.util; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.Date; +import java.util.List; /** * This class contains the information of a task. It can be modified and @@ -10,7 +11,7 @@ import java.util.Date; * Created at Apr 24, 2009 * @author Óscar González Fernández */ -public class TaskBean { +public abstract class TaskBean { private PropertyChangeSupport fundamentalProperties = new PropertyChangeSupport( this); @@ -28,6 +29,17 @@ public class TaskBean { private boolean visible = true; + public abstract boolean isLeaf(); + + public boolean isContainer() { + return !isLeaf(); + } + + public abstract boolean isExpanded() throws UnsupportedOperationException; + + public abstract List getTasks() + throws UnsupportedOperationException; + public boolean isVisible() { return visible; } 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 58f7382fa..13549841e 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 @@ -81,6 +81,7 @@ public class TaskContainerBean extends TaskBean { task.setVisible(expanded); } + @Override public List getTasks() { return tasks; } @@ -113,6 +114,7 @@ public class TaskContainerBean extends TaskBean { return getBiggest(getEndDates()); } + @Override public boolean isExpanded() { return expanded; } @@ -134,8 +136,9 @@ public class TaskContainerBean extends TaskBean { for (TaskBean taskBean : tasks) { taskBean.setVisible(this.expanded); } - if(valueChanged){ - expandListeners.fireEvent(new ListenerNotification() { + if (valueChanged) { + expandListeners + .fireEvent(new ListenerNotification() { @Override public void doNotify(IExpandListener listener) { @@ -146,4 +149,9 @@ public class TaskContainerBean extends TaskBean { } } + @Override + public boolean isLeaf() { + return false; + } + } \ No newline at end of file diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/TaskLeafBean.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/TaskLeafBean.java new file mode 100644 index 000000000..0126d4160 --- /dev/null +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/TaskLeafBean.java @@ -0,0 +1,26 @@ +package org.zkoss.ganttz.util; + +import java.util.List; + +/** + * A {@link TaskBean} that does not have children + * @author Óscar González Fernández + */ +public class TaskLeafBean extends TaskBean { + + @Override + public List getTasks() throws UnsupportedOperationException { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isLeaf() { + return true; + } + + @Override + public boolean isExpanded() throws UnsupportedOperationException { + throw new UnsupportedOperationException(); + } + +} 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 997731672..6f46ffab8 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 @@ -8,6 +8,7 @@ import org.zkoss.ganttz.util.DependencyRegistry; import org.zkoss.ganttz.util.DependencyType; import org.zkoss.ganttz.util.TaskBean; import org.zkoss.ganttz.util.TaskContainerBean; +import org.zkoss.ganttz.util.TaskLeafBean; /** * Some test data for planner
@@ -74,7 +75,7 @@ public class DataForPlanner { } private TaskBean createTaskBean(String name, Date now, Date end) { - TaskBean taskBean = new TaskBean(); + TaskBean taskBean = new TaskLeafBean(); taskBean.setName(name); taskBean.setBeginDate(now); taskBean.setEndDate(end);