diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TaskComponent.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TaskComponent.java index cf8f28231..72187e556 100755 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TaskComponent.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TaskComponent.java @@ -128,11 +128,21 @@ public class TaskComponent extends Div implements AfterCompose { } }; - public static TaskComponent asTaskComponent(Task task, TaskList taskList) { + public static TaskComponent asTaskComponent(Task task, TaskList taskList, + boolean isTopLevel) { + final TaskComponent result; if (task.isContainer()) { - return TaskContainerComponent.asTask((TaskContainer) task, taskList); + result = TaskContainerComponent + .asTask((TaskContainer) task, taskList); + } else { + result = new TaskComponent(task); } - return new TaskComponent(task); + result.isTopLevel = isTopLevel; + return result; + } + + public static TaskComponent asTaskComponent(Task task, TaskList taskList) { + return asTaskComponent(task, taskList, true); } public TaskComponent(Task task) { @@ -174,6 +184,8 @@ public class TaskComponent extends Div implements AfterCompose { private List> dependencyListeners = new LinkedList>(); + private boolean isTopLevel; + private final Task task; private PropertyChangeListener propertiesListener; @@ -344,4 +356,9 @@ public class TaskComponent extends Div implements AfterCompose { getDependencyList().taskRemoved(this.getTask()); this.detach(); } + + public boolean isTopLevel() { + return isTopLevel; + } + } diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TaskContainerComponent.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TaskContainerComponent.java index 59435695a..94ed84b9a 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TaskContainerComponent.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/TaskContainerComponent.java @@ -53,11 +53,14 @@ public class TaskContainerComponent extends TaskComponent implements taskContainer.addExpandListener(expandListener); this.taskList = taskList; for (Task task : taskContainer.getTasks()) { - getCurrentComponents().add( - TaskComponent.asTaskComponent(task, taskList)); + getCurrentComponents().add(createChild(task)); } } + private TaskComponent createChild(Task task) { + return TaskComponent.asTaskComponent(task, this.taskList, false); + } + @Override protected void publishDescendants(Map resultAccumulated) { for (TaskComponent taskComponent : getCurrentComponents()) { @@ -79,7 +82,7 @@ public class TaskContainerComponent extends TaskComponent implements Collection newTasks) { List taskComponents = new ArrayList(); for (Task task : newTasks) { - taskComponents.add(TaskComponent.asTaskComponent(task, taskList)); + taskComponents.add(createChild(task)); } if (insertionPosition == null) { @@ -103,7 +106,8 @@ public class TaskContainerComponent extends TaskComponent implements private void addAllAt(Component previous, List toAdd) { for (TaskComponent subtaskComponent : toAdd) { - taskList.addTaskComponent(previous, subtaskComponent, true); + taskList.addTaskComponent(previous.getNextSibling(), + subtaskComponent, true); previous = subtaskComponent; } } 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 c47c15f82..84f87f459 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 @@ -60,7 +60,8 @@ public class TaskList extends XulElement implements AfterCompose { public static TaskList createFor( CommandOnTaskContextualized editTaskCommand, - List tasks, List> commandsOnTasksContextualized) { + List tasks, + List> commandsOnTasksContextualized) { TaskList result = new TaskList(editTaskCommand, tasks, commandsOnTasksContextualized); return result; @@ -84,16 +85,12 @@ public class TaskList extends XulElement implements AfterCompose { return result; } - public synchronized void addTaskComponent(Component afterThis, + public synchronized void addTaskComponent(Component beforeThis, final TaskComponent taskComponent, boolean relocate) { - boolean isFirst = false; - if (afterThis == null) { - insertBefore(taskComponent, getFirstTaskComponent()); - isFirst = true; - } else { - insertBefore(taskComponent, afterThis == null ? null : afterThis - .getNextSibling()); - } + final boolean isFirst = getFirstTopTaskComponent() == null + || getFirstTopTaskComponent().equals(beforeThis); + insertBefore(taskComponent, beforeThis); + addContextMenu(taskComponent); addListenerForTaskComponentEditForm(taskComponent); ListIterator> iterator = listeners @@ -126,18 +123,11 @@ public class TaskList extends XulElement implements AfterCompose { public synchronized void addTaskComponent( final TaskComponent taskComponent, boolean relocate) { - addTaskComponent(getLastTaskComponent(), taskComponent, relocate); + addTaskComponent(null, taskComponent, relocate); } - private TaskComponent getLastTaskComponent() { - List taskComponents = getTaskComponents(); - if (taskComponents.isEmpty()) - return null; - return taskComponents.get(taskComponents.size() - 1); - } - - private TaskComponent getFirstTaskComponent() { - List taskComponents = getTaskComponents(); + private TaskComponent getFirstTopTaskComponent() { + List taskComponents = getTopLevelTaskComponents(); if (taskComponents.isEmpty()) return null; return taskComponents.get(0); @@ -149,15 +139,15 @@ public class TaskList extends XulElement implements AfterCompose { addTaskComponent(TaskComponent.asTaskComponent(t, this), true); } } else if (position.isAtTop()) { - int afterThisPosition = position.getInsertionPosition() - 1; - List taskComponents = getTaskComponents(); - TaskComponent afterThis = afterThisPosition < 0 ? null - : afterThisPosition >= taskComponents.size() ? getLastTaskComponent() - : getTaskComponents().get(afterThisPosition); + final int insertionPosition = position.getInsertionPosition(); + List topTaskComponents = getTopLevelTaskComponents(); + Component beforeThis = insertionPosition < topTaskComponents.size() ? topTaskComponents + .get(insertionPosition) + : null; for (Task t : newTasks) { TaskComponent toAdd = TaskComponent.asTaskComponent(t, this); - addTaskComponent(afterThis, toAdd, true); - afterThis = toAdd; + addTaskComponent(beforeThis, toAdd, true); + beforeThis = toAdd.getNextSibling(); } } else { Task mostRemoteAncestor = position.getMostRemoteAncestor(); @@ -182,8 +172,8 @@ public class TaskList extends XulElement implements AfterCompose { return null; } - - private void addListenerForTaskComponentEditForm(final TaskComponent taskComponent) { + private void addListenerForTaskComponentEditForm( + final TaskComponent taskComponent) { if (editTaskCommand == null) return; taskComponent.addEventListener("onDoubleClick", new EventListener() { @@ -222,6 +212,16 @@ public class TaskList extends XulElement implements AfterCompose { return getTimeTracker().getMapper(); } + private List getTopLevelTaskComponents() { + List result = new ArrayList(); + for (TaskComponent taskComponent : getTaskComponents()) { + if (taskComponent.isTopLevel()) { + result.add(taskComponent); + } + } + return result; + } + private List getTaskComponents() { ArrayList result = new ArrayList(); for (Object child : getChildren()) {