From 57cceb716df9d6373387c573607f84607e760047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Fri, 24 Jul 2009 17:48:46 +0200 Subject: [PATCH] ItEr19S08CUCreacionProxectoPlanificacionItEr18S08: Fixing problem in left tree. When adding a task that contained other children, only top node was added. --- .../java/org/zkoss/ganttz/LeftTasksTree.java | 92 ++++++++++++++++--- 1 file changed, 77 insertions(+), 15 deletions(-) diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/LeftTasksTree.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/LeftTasksTree.java index 5f72344d4..b88fdfc59 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/LeftTasksTree.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/LeftTasksTree.java @@ -1,6 +1,8 @@ package org.zkoss.ganttz; +import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.HashMap; @@ -52,6 +54,7 @@ public class LeftTasksTree extends HtmlMacroComponent { cell.setSclass(cssClass); } detailsForBeans.put(task, leftTasksTreeRow); + deferredFiller.isBeingRendered(task, item); } private void expandWhenOpened(final TaskContainer taskBean, @@ -142,8 +145,7 @@ public class LeftTasksTree extends HtmlMacroComponent { return null; } - public List group(Task origin, - List parents) { + public List group(Task origin, List parents) { ArrayList result = new ArrayList(); Task child = origin; Task parent; @@ -207,8 +209,62 @@ public class LeftTasksTree extends HtmlMacroComponent { } + /** + * This class is a workaround for an issue with zk {@link Tree}. Once the + * tree is created, a node with more children can't be added. Only the top + * element is added to the tree, although the element has children. The Tree + * discards the adding event for the children because the parent says it's + * not loaded. This is the condition that is not satisfied:
+ * if(parent != null && + (!(parent instanceof Treeitem) || ((Treeitem)parent).isLoaded())){
+ * This problem is present in zk 3.6.1 at least. + * @author Óscar González Fernández + * @see Tree#onTreeDataChange + */ + private class DeferredFiller { + + private Set pendingToAddChildren = new HashSet(); + + public void addParentOfPendingToAdd(Task parent) { + pendingToAddChildren.add(parent); + } + + public void isBeingRendered(final Task parent, final Treeitem item) { + if (!pendingToAddChildren.contains(parent)) + return; + markLoaded(item); + fillModel(parent, parent.getTasks(), false); + pendingToAddChildren.remove(parent); + } + + private void markLoaded(Treeitem item) { + try { + Method method = getSetLoadedMethod(); + method.invoke(item, true); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + private Method setLoadedMethod = null; + + private Method getSetLoadedMethod() { + if (setLoadedMethod != null) + return setLoadedMethod; + try { + Method method = Treeitem.class.getDeclaredMethod("setLoaded", + Boolean.TYPE); + method.setAccessible(true); + return setLoadedMethod = method; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + private static Log LOG = LogFactory.getLog(LeftTasksTree.class); + private final DeferredFiller deferredFiller = new DeferredFiller(); + private final List tasks; private MutableTreeModel tasksTreeModel; @@ -221,19 +277,25 @@ public class LeftTasksTree extends HtmlMacroComponent { this.tasks = tasks; } - private static void fillModel(MutableTreeModel treeModel, - List tasks) { - for (Task task : tasks) { - fillModel(treeModel, treeModel.getRoot(), task); - } + private void fillModel(List tasks, boolean firstTime) { + fillModel(this.tasksTreeModel.getRoot(), tasks, firstTime); } - private static void fillModel(MutableTreeModel treeModel, - Task parent, Task node) { - treeModel.add(parent, node); - if (node.isContainer()) { - for (Task child : node.getTasks()) { - fillModel(treeModel, node, child); + private void fillModel(Task parent, List children, + final boolean firstTime) { + for (Task node : children) { + if (firstTime) { + this.tasksTreeModel.add(parent, node); + if (node.isContainer()) { + fillModel(node, node.getTasks(), firstTime); + } + } else { + if (node.isContainer()) { + this.deferredFiller.addParentOfPendingToAdd(node); + } + // the node must be added after, so the multistepTreeFiller is + // ready + this.tasksTreeModel.add(parent, node); } } } @@ -259,14 +321,14 @@ public class LeftTasksTree extends HtmlMacroComponent { super.afterCompose(); tasksTree = (Tree) getFellow("tasksTree"); tasksTreeModel = MutableTreeModel.create(Task.class); - fillModel(tasksTreeModel, tasks); + fillModel(tasks, true); tasksTree.setModel(tasksTreeModel); tasksTree.setTreeitemRenderer(new TaskBeanRenderer()); } void addTask(Task task) { + fillModel(Arrays.asList(task), false); detailsForBeans.requestFocusFor(task); - tasksTreeModel.add(tasksTreeModel.getRoot(), task); } public CommandContextualized getGoingDownInLastArrowCommand() {