diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java index 2c82f1c8e..420045686 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java @@ -15,6 +15,7 @@ import org.zkoss.ganttz.adapters.PlannerConfiguration; import org.zkoss.ganttz.data.Dependency; import org.zkoss.ganttz.data.GanttDiagramGraph; import org.zkoss.ganttz.data.ITaskFundamentalProperties; +import org.zkoss.ganttz.data.Position; import org.zkoss.ganttz.data.Task; import org.zkoss.ganttz.data.TaskContainer; import org.zkoss.ganttz.data.TaskLeaf; @@ -30,6 +31,8 @@ public class FunctionalityExposedForExtensions implements IContext { private Map fromTaskToParent = new HashMap(); + private List topLevel = new ArrayList(); + @Override public Task findAssociatedBean(T domainObject) throws IllegalArgumentException { @@ -45,6 +48,8 @@ public class FunctionalityExposedForExtensions implements IContext { fromTaskToDomain.put(task, domainObject); if (parent != null) { fromTaskToParent.put(task, parent); + } else { + topLevel.add(task); } } @@ -57,6 +62,7 @@ public class FunctionalityExposedForExtensions implements IContext { parent.remove(toBeRemoved); } fromTaskToParent.remove(toBeRemoved); + topLevel.remove(toBeRemoved); } @Override @@ -69,6 +75,32 @@ public class FunctionalityExposedForExtensions implements IContext { return fromTaskToDomain.get(task); } + @Override + public Position findPositionFor(Task task) { + List ancestors = ancestorsOf(task); + if (ancestors.isEmpty()) { + return Position.createAtTopPosition(topLevel.indexOf(task)); + } + TaskContainer parent = ancestors.get(0); + return Position.createPosition(ancestors, parent.getTasks() + .indexOf(task)); + } + + @Override + public Position findPositionFor(T domainObject) { + return findPositionFor(findAssociatedBean(domainObject)); + } + + private List ancestorsOf(Task task) { + ArrayList result = new ArrayList(); + TaskContainer taskContainer = fromTaskToParent.get(task); + while (taskContainer != null) { + result.add(taskContainer); + taskContainer = fromTaskToParent.get(taskContainer); + } + return result; + } + } private final Planner planner; @@ -106,25 +138,43 @@ public class FunctionalityExposedForExtensions implements IContext { return result; } - public void add(Collection domainObjects) { + public void add(Position position, Collection domainObjects) { List> totalDependencies = new ArrayList>(); + List tasksCreated = new ArrayList(); for (T object : domainObjects) { Task task = extractTask(totalDependencies, object, null); - diagramGraph.addTopLevel(task); - this.planner.addTask(task); + tasksCreated.add(task); + } + if (position.isAppendToTop() || position.isAtTop()) { + this.diagramGraph.addTopLevel(tasksCreated); + } else { + this.diagramGraph.addTasks(tasksCreated); + TaskContainer parent = position.getParent(); + parent.addAll(position.getInsertionPosition(), tasksCreated); + this.diagramGraph.childrenAddedTo(parent); } for (Dependency dependency : DomainDependency.toDependencies(mapper, totalDependencies)) { this.diagramGraph.add(dependency); } this.diagramGraph.enforceAllRestrictions(); + this.planner.addTasks(position, tasksCreated); + } + + public void add(Collection domainObjects) { + add(Position.createAppendToTopPosition(), domainObjects); } @Override public void add(T domainObject) { + add(Position.createAppendToTopPosition(), domainObject); + } + + @Override + public void add(Position position, T domainObject) { LinkedList list = new LinkedList(); list.add(domainObject); - add(list); + add(position, list); } IDomainAndBeansMapper getMapper() { @@ -137,12 +187,14 @@ public class FunctionalityExposedForExtensions implements IContext { } @Override - public void remove(T domainObject) { + public Position remove(T domainObject) { Task task = mapper.findAssociatedBean(domainObject); + Position position = mapper.findPositionFor(task); diagramGraph.remove(task); task.removed(); planner.removeTask(task); mapper.remove(domainObject); + return position; } @Override @@ -152,10 +204,8 @@ public class FunctionalityExposedForExtensions implements IContext { @Override public void replace(T oldDomainObject, T newDomainObject) { - remove(oldDomainObject); - add(newDomainObject); - // FIXME if oldDomainObject was a child from other it adds it to the top - // level + Position position = remove(oldDomainObject); + add(position, newDomainObject); } } diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/LeftPane.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/LeftPane.java index b8774bdd0..f7f581ec0 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/LeftPane.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/LeftPane.java @@ -1,7 +1,9 @@ package org.zkoss.ganttz; +import java.util.Collection; import java.util.List; +import org.zkoss.ganttz.data.Position; import org.zkoss.ganttz.data.Task; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.HtmlMacroComponent; @@ -65,8 +67,12 @@ public class LeftPane extends HtmlMacroComponent { leftTasksTree.taskRemoved(task); } - public void addTask(Task newTask) { - leftTasksTree.addTask(newTask); + public void addTask(Position position, Task newTask) { + leftTasksTree.addTask(position, newTask); + } + + public void addTasks(Position position, Collection newTasks) { + leftTasksTree.addTasks(position, newTasks); } } 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 b88fdfc59..1c19d619c 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 @@ -4,6 +4,7 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; +import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -15,6 +16,7 @@ import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.zkoss.ganttz.LeftTasksTreeRow.ILeftTasksTreeNavigator; +import org.zkoss.ganttz.data.Position; import org.zkoss.ganttz.data.Task; import org.zkoss.ganttz.data.TaskContainer; import org.zkoss.ganttz.util.MutableTreeModel; @@ -233,7 +235,7 @@ public class LeftTasksTree extends HtmlMacroComponent { if (!pendingToAddChildren.contains(parent)) return; markLoaded(item); - fillModel(parent, parent.getTasks(), false); + fillModel(parent, 0, parent.getTasks(), false); pendingToAddChildren.remove(parent); } @@ -245,6 +247,7 @@ public class LeftTasksTree extends HtmlMacroComponent { throw new RuntimeException(e); } } + private Method setLoadedMethod = null; private Method getSetLoadedMethod() { @@ -277,26 +280,29 @@ public class LeftTasksTree extends HtmlMacroComponent { this.tasks = tasks; } - private void fillModel(List tasks, boolean firstTime) { - fillModel(this.tasksTreeModel.getRoot(), tasks, firstTime); + private void fillModel(Collection tasks, boolean firstTime) { + fillModel(this.tasksTreeModel.getRoot(), 0, tasks, firstTime); } - private void fillModel(Task parent, List children, - final boolean firstTime) { - for (Task node : children) { - if (firstTime) { - this.tasksTreeModel.add(parent, node); + private void fillModel(Task parent, Integer insertionPosition, + Collection children, final boolean firstTime) { + if (firstTime) { + this.tasksTreeModel.add(parent, insertionPosition, children); + for (Task node : children) { if (node.isContainer()) { - fillModel(node, node.getTasks(), firstTime); + fillModel(node, 0, node.getTasks(), firstTime); } - } else { + } + + } else { + for (Task node : children) { if (node.isContainer()) { this.deferredFiller.addParentOfPendingToAdd(node); } - // the node must be added after, so the multistepTreeFiller is - // ready - this.tasksTreeModel.add(parent, node); } + // the node must be added after, so the multistepTreeFiller is + // ready + this.tasksTreeModel.add(parent, insertionPosition, children); } } @@ -326,9 +332,28 @@ public class LeftTasksTree extends HtmlMacroComponent { tasksTree.setTreeitemRenderer(new TaskBeanRenderer()); } - void addTask(Task task) { - fillModel(Arrays.asList(task), false); - detailsForBeans.requestFocusFor(task); + void addTask(Position position, Task task) { + if (position.isAppendToTop()) { + fillModel(Arrays.asList(task), false); + detailsForBeans.requestFocusFor(task); + } else { + List toAdd = Arrays.asList(task); + fillModel(position.getParent(), position.getInsertionPosition(), + toAdd, false); + } + } + + public void addTasks(Position position, Collection newTasks) { + + if (position.isAppendToTop()) { + fillModel(newTasks, false); + } else if (position.isAtTop()) { + fillModel(tasksTreeModel.getRoot(), + position.getInsertionPosition(), newTasks, false); + } else { + fillModel(position.getParent(), position.getInsertionPosition(), + newTasks, false); + } } public CommandContextualized getGoingDownInLastArrowCommand() { 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 b35c916b1..ae938aeda 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 @@ -1,6 +1,7 @@ package org.zkoss.ganttz; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -12,6 +13,7 @@ import org.zkoss.ganttz.adapters.IDomainAndBeansMapper; import org.zkoss.ganttz.adapters.PlannerConfiguration; import org.zkoss.ganttz.data.Dependency; import org.zkoss.ganttz.data.GanttDiagramGraph; +import org.zkoss.ganttz.data.Position; import org.zkoss.ganttz.data.Task; import org.zkoss.ganttz.extensions.ICommand; import org.zkoss.ganttz.extensions.ICommandOnTask; @@ -105,14 +107,18 @@ public class Planner extends XulElement { dependencyRemovedListener); } - public void addTask(Task newTask) { + public void addTasks(Position position, Collection newTasks) { TaskList taskList = getTaskList(); if (taskList != null && leftPane != null) { - taskList.addTask(newTask); - leftPane.addTask(newTask); + taskList.addTasks(position, newTasks); + leftPane.addTasks(position, newTasks); } } + public void addTask(Position position, Task task) { + addTasks(position, Arrays.asList(task)); + } + void addDependencies(Collection dependencies) { DependencyList dependencyList = getDependencyList(); if (dependencyList == null) { 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 bb8a53df9..59435695a 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 @@ -1,10 +1,13 @@ package org.zkoss.ganttz; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.ListIterator; import java.util.Map; +import org.apache.commons.lang.Validate; +import org.zkoss.ganttz.data.Position; import org.zkoss.ganttz.data.Task; import org.zkoss.ganttz.data.TaskContainer; import org.zkoss.ganttz.data.TaskContainer.IExpandListener; @@ -17,7 +20,8 @@ import org.zkoss.zk.ui.ext.AfterCompose; * Created at Jul 1, 2009 * @author Lorenzo Tilve Álvaro */ -public class TaskContainerComponent extends TaskComponent implements AfterCompose { +public class TaskContainerComponent extends TaskComponent implements + AfterCompose { public static TaskContainerComponent asTask(Task taskContainerBean, TaskList taskList) { @@ -49,7 +53,8 @@ public class TaskContainerComponent extends TaskComponent implements AfterCompos taskContainer.addExpandListener(expandListener); this.taskList = taskList; for (Task task : taskContainer.getTasks()) { - getCurrentComponents().add(TaskComponent.asTaskComponent(task, taskList)); + getCurrentComponents().add( + TaskComponent.asTaskComponent(task, taskList)); } } @@ -70,9 +75,34 @@ public class TaskContainerComponent extends TaskComponent implements AfterCompos super.remove(); } + private void add(Integer insertionPosition, + Collection newTasks) { + List taskComponents = new ArrayList(); + for (Task task : newTasks) { + taskComponents.add(TaskComponent.asTaskComponent(task, taskList)); + } + + if (insertionPosition == null) { + subtaskComponents.addAll(taskComponents); + } else { + subtaskComponents.addAll(insertionPosition, taskComponents); + } + + if (isExpanded()) { + TaskComponent previous = insertionPosition == 0 ? this + : subtaskComponents.get(insertionPosition - 1); + addAllAt(previous, taskComponents); + } + } + public void open() { Component previous = this; - for (TaskComponent subtaskComponent : getCurrentComponents()) { + List toAdd = getCurrentComponents(); + addAllAt(previous, toAdd); + } + + private void addAllAt(Component previous, List toAdd) { + for (TaskComponent subtaskComponent : toAdd) { taskList.addTaskComponent(previous, subtaskComponent, true); previous = subtaskComponent; } @@ -91,6 +121,17 @@ public class TaskContainerComponent extends TaskComponent implements AfterCompos return subtaskComponents; } + private static int find(List currentComponents, Task task) { + int i = 0; + for (TaskComponent t : currentComponents) { + if (t.getTask().equals(task)) { + return i; + } + i++; + } + return -1; + } + public boolean isExpanded() { return getTaskContainer().isExpanded(); } @@ -101,12 +142,10 @@ public class TaskContainerComponent extends TaskComponent implements AfterCompos @Override protected String calculateClass() { - return super.calculateClass() +" "+ (getTaskContainer().isExpanded()? - "expanded":"closed"); + return super.calculateClass() + " " + + (getTaskContainer().isExpanded() ? "expanded" : "closed"); } - - private void close() { for (TaskComponent subtaskComponent : getCurrentComponents()) { if (subtaskComponent instanceof TaskContainerComponent) { @@ -117,4 +156,26 @@ public class TaskContainerComponent extends TaskComponent implements AfterCompos taskList.redrawDependencies(); } } + + public void insert(Position position, Collection newTasks) { + if (position.getParent().equals(getTask())) { + add(position.getInsertionPosition(), newTasks); + } else { + Task mostRemoteAncestor = position.getMostRemoteAncestor(); + Validate.isTrue(mostRemoteAncestor.equals(getTask())); + position = position.pop(); + Task next = position.getMostRemoteAncestor(); + List currentComponents = getCurrentComponents(); + int find = find(currentComponents, next); + TaskComponent taskComponent = currentComponents.get(find); + if (taskComponent instanceof TaskContainerComponent) { + TaskContainerComponent container = (TaskContainerComponent) taskComponent; + container.insert(position, newTasks); + } else { + // TODO turn TaskComponent into container + } + } + + } + } \ No newline at end of file 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 49da5fe86..c47c15f82 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 @@ -15,6 +15,7 @@ import java.util.ListIterator; import java.util.Map; import org.zkoss.ganttz.data.Dependency; +import org.zkoss.ganttz.data.Position; import org.zkoss.ganttz.data.Task; import org.zkoss.ganttz.util.MenuBuilder; import org.zkoss.ganttz.util.MenuBuilder.ItemAction; @@ -68,28 +69,31 @@ public class TaskList extends XulElement implements AfterCompose { public List asDependencyComponents( Collection dependencies) { List children = getChildren(); - List taskComponents = Planner.findComponentsOfType(TaskComponent.class, children); + List taskComponents = Planner.findComponentsOfType( + TaskComponent.class, children); Map taskComponentByTask = new HashMap(); for (TaskComponent taskComponent : taskComponents) { taskComponent.publishTaskComponents(taskComponentByTask); } List result = new ArrayList(); for (Dependency dependency : dependencies) { - result.add(new DependencyComponent(taskComponentByTask.get(dependency - .getSource()), taskComponentByTask.get(dependency - .getDestination()))); + result.add(new DependencyComponent(taskComponentByTask + .get(dependency.getSource()), taskComponentByTask + .get(dependency.getDestination()))); } return result; } - public void addTask(Task newTask) { - addTaskComponent(TaskComponent.asTaskComponent(newTask, this), true); - } - - public synchronized void addTaskComponent(Component afterThis, final TaskComponent taskComponent, - boolean relocate) { - insertBefore(taskComponent, afterThis == null ? null : afterThis - .getNextSibling()); + public synchronized void addTaskComponent(Component afterThis, + final TaskComponent taskComponent, boolean relocate) { + boolean isFirst = false; + if (afterThis == null) { + insertBefore(taskComponent, getFirstTaskComponent()); + isFirst = true; + } else { + insertBefore(taskComponent, afterThis == null ? null : afterThis + .getNextSibling()); + } addContextMenu(taskComponent); addListenerForTaskComponentEditForm(taskComponent); ListIterator> iterator = listeners @@ -104,7 +108,9 @@ public class TaskList extends XulElement implements AfterCompose { } taskComponent.afterCompose(); if (relocate) { - response(null, new AuInvoke(taskComponent, "relocateAfterAdding")); + response(null, new AuInvoke(taskComponent, + isFirst ? "relocateFirstAfterAdding" + : "relocateAfterAdding")); setHeight(getHeight());// forcing smart update adjustZoomColumnsHeight(); getGanttPanel().getDependencyList().redrawDependencies(); @@ -118,10 +124,65 @@ public class TaskList extends XulElement implements AfterCompose { } - public synchronized void addTaskComponent(final TaskComponent taskComponent, boolean relocate) { - addTaskComponent(null, taskComponent, relocate); + public synchronized void addTaskComponent( + final TaskComponent taskComponent, boolean relocate) { + addTaskComponent(getLastTaskComponent(), 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(); + if (taskComponents.isEmpty()) + return null; + return taskComponents.get(0); + } + + public void addTasks(Position position, Collection newTasks) { + if (position.isAppendToTop()) { + for (Task t : newTasks) { + 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); + for (Task t : newTasks) { + TaskComponent toAdd = TaskComponent.asTaskComponent(t, this); + addTaskComponent(afterThis, toAdd, true); + afterThis = toAdd; + } + } else { + Task mostRemoteAncestor = position.getMostRemoteAncestor(); + TaskComponent taskComponent = find(mostRemoteAncestor); + if (taskComponent instanceof TaskContainerComponent) { + TaskContainerComponent container = (TaskContainerComponent) taskComponent; + container.insert(position, newTasks); + } else { + // TODO turn taskComponent into container + } + + } + } + + TaskComponent find(Task task) { + List taskComponents = getTaskComponents(); + for (TaskComponent taskComponent : taskComponents) { + if (taskComponent.getTask().equals(task)) { + return taskComponent; + } + } + return null; + } + + private void addListenerForTaskComponentEditForm(final TaskComponent taskComponent) { if (editTaskCommand == null) return; @@ -203,16 +264,16 @@ public class TaskList extends XulElement implements AfterCompose { private Menupopup getContextMenuForTasks() { if (contextMenu == null) { - MenuBuilder menuBuilder = MenuBuilder.on(getPage(), getTaskComponents()); - menuBuilder.item( - "Add Dependency", new ItemAction() { + MenuBuilder menuBuilder = MenuBuilder.on(getPage(), + getTaskComponents()); + menuBuilder.item("Add Dependency", new ItemAction() { - @Override - public void onEvent(TaskComponent choosen, Event event) { - choosen.addDependency(); - } + @Override + public void onEvent(TaskComponent choosen, Event event) { + choosen.addDependency(); + } }); - for (CommandOnTaskContextualized command : commandsOnTasksContextualized) { + for (CommandOnTaskContextualized command : commandsOnTasksContextualized) { menuBuilder.item(command.getName(), command.toItemAction()); } contextMenu = menuBuilder.createWithoutSettingContext(); diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/adapters/IDomainAndBeansMapper.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/adapters/IDomainAndBeansMapper.java index eb96bd132..3e3b78c46 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/adapters/IDomainAndBeansMapper.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/adapters/IDomainAndBeansMapper.java @@ -1,5 +1,6 @@ package org.zkoss.ganttz.adapters; +import org.zkoss.ganttz.data.Position; import org.zkoss.ganttz.data.Task; /** @@ -7,6 +8,20 @@ import org.zkoss.ganttz.data.Task; */ public interface IDomainAndBeansMapper { + /** + * @param task + * @return the {@link Position} that specifies the path to reach the task + */ + Position findPositionFor(Task task); + + /** + * @param domainObject + * @return the {@link Position} that specifies the path to reach the task + * associated to the domain object + * @see findPositionFor + */ + Position findPositionFor(T domainObject); + /** * @param task * @return the associated domain object diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java index 3e8dda38b..a21e27ea1 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java @@ -3,6 +3,7 @@ package org.zkoss.ganttz.data; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; @@ -45,11 +46,19 @@ public class GanttDiagramGraph { private final TaskContainer container; + private final Map alreadyRegistered = new WeakHashMap(); + private ParentShrinkingEnforcer(final TaskContainer container) { if (container == null) throw new IllegalArgumentException("container cannot be null"); this.container = container; + registerListeners(); + } + + void registerListeners() { for (Task subtask : this.container.getTasks()) { + if (alreadyRegistered.containsKey(subtask)) + continue; subtask .addFundamentalPropertiesChangeListener(new PropertyChangeListener() { @@ -120,7 +129,19 @@ public class GanttDiagramGraph { addTask(task); } - private void addTask(Task task) { + public void addTopLevel(Collection tasks) { + for (Task task : tasks) { + addTopLevel(task); + } + } + + public void addTasks(Collection tasks) { + for (Task t : tasks) { + addTask(t); + } + } + + public void addTask(Task task) { graph.addVertex(task); rulesEnforcersByTask.put(task, new DependencyRulesEnforcer(task)); if (task.isContainer()) { @@ -193,4 +214,11 @@ public class GanttDiagramGraph { return Collections.unmodifiableList(topLevelTasks); } + public void childrenAddedTo(TaskContainer task) { + ParentShrinkingEnforcer parentShrinkingEnforcer = parentShrinkingEnforcerByTask + .get(task); + parentShrinkingEnforcer.registerListeners(); + parentShrinkingEnforcer.enforce(); + } + } diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/data/TaskContainer.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/data/TaskContainer.java index bfa2efd8a..21da25131 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/data/TaskContainer.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/data/TaskContainer.java @@ -171,4 +171,8 @@ public class TaskContainer extends Task { return tasks.contains(task); } + public void addAll(int position, Collection tasksCreated) { + tasks.addAll(position, tasksCreated); + } + } \ No newline at end of file diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/extensions/ContextRelativeToOtherComponent.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/extensions/ContextRelativeToOtherComponent.java index 2f068b3b8..933ef4a15 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/extensions/ContextRelativeToOtherComponent.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/extensions/ContextRelativeToOtherComponent.java @@ -1,6 +1,7 @@ package org.zkoss.ganttz.extensions; import org.zkoss.ganttz.adapters.PlannerConfiguration; +import org.zkoss.ganttz.data.Position; import org.zkoss.zk.ui.Component; /** @@ -40,10 +41,14 @@ public class ContextRelativeToOtherComponent implements IContext { context.reload(configuration); } - public void remove(T domainObject) { - context.remove(domainObject); + public Position remove(T domainObject) { + return context.remove(domainObject); } + public void add(Position position, T domainObject) { + context.add(position, domainObject); + }; + public void replace(T oldDomainObject, T newDomainObject) { context.replace(oldDomainObject, newDomainObject); }; diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/extensions/ContextWithPlannerTask.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/extensions/ContextWithPlannerTask.java index 2a7e580a9..cb277363d 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/extensions/ContextWithPlannerTask.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/extensions/ContextWithPlannerTask.java @@ -2,6 +2,7 @@ package org.zkoss.ganttz.extensions; import org.zkoss.ganttz.adapters.PlannerConfiguration; import org.zkoss.ganttz.data.Task; +import org.zkoss.ganttz.data.Position; import org.zkoss.zk.ui.Component; /** @@ -34,10 +35,14 @@ public class ContextWithPlannerTask implements IContextWithPlannerTask { context.reload(configuration); } - public void remove(T domainObject) { - context.remove(domainObject); + public Position remove(T domainObject) { + return context.remove(domainObject); } + public void add(Position position, T domainObject) { + context.add(position, domainObject); + }; + @Override public Component getRelativeTo() { return context.getRelativeTo(); @@ -53,6 +58,4 @@ public class ContextWithPlannerTask implements IContextWithPlannerTask { return task; } - - } diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/extensions/IContext.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/extensions/IContext.java index fdaa90e2e..96a363f5f 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/extensions/IContext.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/extensions/IContext.java @@ -7,6 +7,7 @@ import org.zkoss.ganttz.adapters.IStructureNavigator; import org.zkoss.ganttz.adapters.PlannerConfiguration; import org.zkoss.ganttz.data.Task; import org.zkoss.zk.ui.Component; +import org.zkoss.ganttz.data.Position; /** * A facade for operations allowed to extensions
@@ -31,9 +32,10 @@ public interface IContext { /** * Removing the tasks associated to the domainObject * @param domainObject + * @return the Position in which the domainObject's task was */ - void remove(T domainObject); + Position remove(T domainObject); /** * Retrieves the component associated to the action performed. Normally it @@ -46,4 +48,6 @@ public interface IContext { void replace(T oldDomainObject, T newDomainObject); + void add(Position position, T domainObject); + }