From 36e51de76cf50142faa7e1840c80bdb9cbf8a21b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Mon, 20 Jul 2009 15:37:41 +0200 Subject: [PATCH] ItEr17S10CUCreacionProxectoPlanificacionItEr16S12: Previous functionality of adding task is now set up using commands support. --- .../zkoss/ganttz/CommandContextualized.java | 14 +- .../FunctionalityExposedForExtensions.java | 108 +++++++++++++++- .../main/java/org/zkoss/ganttz/LeftPane.java | 13 +- .../java/org/zkoss/ganttz/LeftTasksTree.java | 21 +-- .../org/zkoss/ganttz/LeftTasksTreeRow.java | 2 +- .../main/java/org/zkoss/ganttz/Planner.java | 120 ++++-------------- .../ganttz/adapters/PlannerConfiguration.java | 6 +- .../org/zkoss/ganttz/extensions/ICommand.java | 5 +- .../org/zkoss/ganttz/extensions/IContext.java | 5 +- .../web/planner/DataForPlanner.java | 34 ++++- 10 files changed, 186 insertions(+), 142 deletions(-) diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/CommandContextualized.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/CommandContextualized.java index 4bc6a3b94..76dbfc6bf 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/CommandContextualized.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/CommandContextualized.java @@ -7,18 +7,18 @@ import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; import org.zkoss.zul.Button; -class CommandContextualized { +class CommandContextualized { - public static CommandContextualized create(ICommand command, - IContext context) { - return new CommandContextualized(command, context); + public static CommandContextualized create(ICommand command, + IContext context) { + return new CommandContextualized(command, context); } - private final ICommand command; + private final ICommand command; - private final IContext context; + private final IContext context; - private CommandContextualized(ICommand command, IContext context) { + private CommandContextualized(ICommand command, IContext context) { this.command = command; this.context = context; } 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 ff9fedb0f..a1cbdc683 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 @@ -1,13 +1,115 @@ package org.zkoss.ganttz; -import org.zkoss.ganttz.extensions.IContext; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; -public class FunctionalityExposedForExtensions implements IContext { +import org.zkoss.ganttz.adapters.DomainDependency; +import org.zkoss.ganttz.adapters.IAdapterToTaskFundamentalProperties; +import org.zkoss.ganttz.adapters.IDomainAndBeansMapper; +import org.zkoss.ganttz.adapters.IStructureNavigator; +import org.zkoss.ganttz.extensions.IContext; +import org.zkoss.ganttz.util.DependencyBean; +import org.zkoss.ganttz.util.GanttDiagramGraph; +import org.zkoss.ganttz.util.ITaskFundamentalProperties; +import org.zkoss.ganttz.util.TaskBean; +import org.zkoss.ganttz.util.TaskContainerBean; +import org.zkoss.ganttz.util.TaskLeafBean; + +public class FunctionalityExposedForExtensions implements IContext { + + private static class OneToOneMapper implements IDomainAndBeansMapper { + private Map fromDomainToTaskBean = new HashMap(); + + private Map fromTaskBeanToDomain = new HashMap(); + + @Override + public TaskBean findAssociatedBean(T domainObject) + throws IllegalArgumentException { + if (domainObject == null) + throw new IllegalArgumentException("domainObject is null"); + if (!fromDomainToTaskBean.containsKey(domainObject)) + throw new IllegalArgumentException("not found " + domainObject); + return fromDomainToTaskBean.get(domainObject); + } + + void register(TaskBean taskBean, T domainObject) { + fromDomainToTaskBean.put(domainObject, taskBean); + fromTaskBeanToDomain.put(taskBean, domainObject); + } + + @Override + public T findAssociatedDomainObject(TaskBean taskBean) + throws IllegalArgumentException { + if (taskBean == null) + throw new IllegalArgumentException("taskBean is null"); + if (!fromTaskBeanToDomain.containsKey(taskBean)) + throw new IllegalArgumentException(); + return fromTaskBeanToDomain.get(taskBean); + } + + } private final Planner planner; + private final IAdapterToTaskFundamentalProperties adapter; + private final IStructureNavigator navigator; + private final OneToOneMapper mapper = new OneToOneMapper(); + private final GanttDiagramGraph diagramGraph; - public FunctionalityExposedForExtensions(Planner planner) { + public FunctionalityExposedForExtensions(Planner planner, + IAdapterToTaskFundamentalProperties adapter, + IStructureNavigator navigator, GanttDiagramGraph diagramGraph) { this.planner = planner; + this.adapter = adapter; + this.navigator = navigator; + this.diagramGraph = diagramGraph; + } + + private TaskBean extractTaskBean( + List> accumulatedDependencies, T data) { + ITaskFundamentalProperties adapted = adapter.adapt(data); + accumulatedDependencies + .addAll(adapter.getDependenciesOriginating(data)); + final TaskBean result; + if (navigator.isLeaf(data)) { + result = new TaskLeafBean(adapted); + } else { + TaskContainerBean container = new TaskContainerBean(adapted); + for (T child : navigator.getChildren(data)) { + container.add(extractTaskBean(accumulatedDependencies, child)); + } + result = container; + } + mapper.register(result, data); + return result; + } + + public void add(Collection domainObjects) { + List> totalDependencies = new ArrayList>(); + for (T object : domainObjects) { + TaskBean taskBean = extractTaskBean(totalDependencies, object); + diagramGraph.addTopLevel(taskBean); + this.planner.addTask(taskBean); + } + for (DependencyBean dependencyBean : DomainDependency + .toDependencyBeans(mapper, totalDependencies)) { + this.diagramGraph.add(dependencyBean); + } + this.diagramGraph.applyAllRestrictions(); + } + + @Override + public void add(T domainObject) { + LinkedList list = new LinkedList(); + list.add(domainObject); + add(list); + } + + IDomainAndBeansMapper getMapper() { + return mapper; } } 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 6258639fc..51a94e491 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 @@ -16,13 +16,14 @@ public class LeftPane extends HtmlMacroComponent { private final List topLevelTasks; - private List commands; + private List> commands; private LeftTasksTree leftTasksTree; - public LeftPane(List commands, + public LeftPane( + List> contextualizedCommands, List topLevelTasks) { - this.commands = commands; + this.commands = contextualizedCommands; this.topLevelTasks = topLevelTasks; } @@ -37,7 +38,7 @@ public class LeftPane extends HtmlMacroComponent { private void addCommands() { Component commandsContainer = getCommandsContainer(); - for (CommandContextualized command : commands) { + for (CommandContextualized command : commands) { Button button = command.toButton(); commandsContainer.appendChild(button); } @@ -58,4 +59,8 @@ public class LeftPane extends HtmlMacroComponent { leftTasksTree.taskRemoved(taskBean); } + public void addTask(TaskBean newTask) { + leftTasksTree.addTask(newTask); + } + } 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 227eed2bf..c3d52e06c 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 @@ -16,7 +16,6 @@ import org.zkoss.ganttz.LeftTasksTreeRow.ILeftTasksTreeNavigator; 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; @@ -247,24 +246,6 @@ public class LeftTasksTree extends HtmlMacroComponent { tasksTreeModel.remove(taskRemoved); } - public void addTask() { - TaskBean newTask = new TaskLeafBean(); - newTask.setName("Nova Tarefa"); - newTask.setBeginDate(new Date()); - newTask.setEndDate(threeMonthsLater(newTask.getBeginDate())); - addTask(newTask); - getPlanner().addTask(newTask); - } - - public void addTaskContainer() { - TaskContainerBean newTask = new TaskContainerBean(); - newTask.setName("Novo Contedor de Tarefas"); - newTask.setBeginDate(new Date()); - newTask.setEndDate(threeMonthsLater(newTask.getBeginDate())); - addTask(newTask); - getPlanner().addTask(newTask); - } - private static Date threeMonthsLater(Date now) { Calendar calendar = Calendar.getInstance(); calendar.setTime(now); @@ -283,7 +264,7 @@ public class LeftTasksTree extends HtmlMacroComponent { tasksTree.setTreeitemRenderer(new TaskBeanRenderer()); } - private void addTask(TaskBean taskBean) { + void addTask(TaskBean taskBean) { detailsForBeans.requestFocusFor(taskBean); tasksTreeModel.add(tasksTreeModel.getRoot(), taskBean); } diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java index 8f88d9beb..b61d77976 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java @@ -144,7 +144,7 @@ public class LeftTasksTreeRow extends GenericForwardComposer { belowDetail.receiveFocus(position); } else { LeftTasksTree listDetails = getListDetails(); - listDetails.addTask(); + // TODO add comamnd for focus going down } } 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 b0d67b3a6..feb32cb65 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 @@ -2,25 +2,19 @@ package org.zkoss.ganttz; import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.zkoss.ganttz.adapters.DomainDependency; import org.zkoss.ganttz.adapters.IAdapterToTaskFundamentalProperties; import org.zkoss.ganttz.adapters.IDomainAndBeansMapper; -import org.zkoss.ganttz.adapters.IStructureNavigator; import org.zkoss.ganttz.adapters.PlannerConfiguration; import org.zkoss.ganttz.extensions.ICommand; import org.zkoss.ganttz.extensions.IContext; import org.zkoss.ganttz.util.DependencyBean; import org.zkoss.ganttz.util.GanttDiagramGraph; -import org.zkoss.ganttz.util.ITaskFundamentalProperties; 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.zul.impl.XulElement; @@ -39,17 +33,17 @@ public class Planner extends XulElement { private TaskEditFormComposer taskEditFormComposer = new TaskEditFormComposer(); - private OneToOneMapper domainObjectsMapper; - private DependencyAdderAdapter dependencyAdder; - private List contextualizedCommands; + private List> contextualizedCommands; public Planner() { } TaskList getTaskList() { - List children = findOneComponentOfType(GanttPanel.class) + if (ganttPanel == null) + return null; + List children = ganttPanel .getChildren(); return Planner.findComponentsOfType(TaskList.class, children).get(0); } @@ -113,8 +107,6 @@ public class Planner extends XulElement { } public void registerListeners() { - if (diagramGraph == null) - throw new IllegalStateException("dependencyRegistry must be set"); ganttPanel.afterCompose(); TaskList taskList = getTaskList(); dependencyAddedListener = new DependencyAddedListener() { @@ -122,7 +114,7 @@ public class Planner extends XulElement { @Override public void dependenceAdded(Dependency dependency) { getDependencyList().addDependency(dependency); - publishDependency(dependency); + diagramGraph.add(dependency.getDependencyBean()); dependencyAdder.addDependency(dependency.getDependencyBean()); } }; @@ -152,54 +144,21 @@ public class Planner extends XulElement { } public void addTask(TaskBean newTask) { - getTaskList().addTask(newTask); - diagramGraph.addTopLevel(newTask); - } - - private void publishDependency(Dependency dependency) { - diagramGraph.add(dependency.getDependencyBean()); - } - - private static class OneToOneMapper implements IDomainAndBeansMapper { - private Map fromDomainToTaskBean = new HashMap(); - - private Map fromTaskBeanToDomain = new HashMap(); - - @Override - public TaskBean findAssociatedBean(T domainObject) - throws IllegalArgumentException { - if (domainObject == null) - throw new IllegalArgumentException("domainObject is null"); - if (!fromDomainToTaskBean.containsKey(domainObject)) - throw new IllegalArgumentException("not found " + domainObject); - return fromDomainToTaskBean.get(domainObject); + TaskList taskList = getTaskList(); + if (taskList != null && leftPane != null) { + taskList.addTask(newTask); + leftPane.addTask(newTask); } - - void register(TaskBean taskBean, T domainObject) { - fromDomainToTaskBean.put(domainObject, taskBean); - fromTaskBeanToDomain.put(taskBean, domainObject); - } - - @Override - public T findAssociatedDomainObject(TaskBean taskBean) - throws IllegalArgumentException { - if (taskBean == null) - throw new IllegalArgumentException("taskBean is null"); - if (!fromTaskBeanToDomain.containsKey(taskBean)) - throw new IllegalArgumentException(); - return fromTaskBeanToDomain.get(taskBean); - } - } private static class DependencyAdderAdapter { private final IAdapterToTaskFundamentalProperties adapter; - private final OneToOneMapper mapper; + private final IDomainAndBeansMapper mapper; public DependencyAdderAdapter( IAdapterToTaskFundamentalProperties adapter, - OneToOneMapper mapper) { + IDomainAndBeansMapper mapper) { this.adapter = adapter; this.mapper = mapper; } @@ -227,59 +186,28 @@ public class Planner extends XulElement { if (configuration == null) return; this.diagramGraph = new GanttDiagramGraph(); - OneToOneMapper mapper = new OneToOneMapper(); - domainObjectsMapper = mapper; - List> dependencies = new ArrayList>(); - for (T domainObject : configuration.getData()) { - IAdapterToTaskFundamentalProperties adapter = configuration - .getAdapter(); - this.diagramGraph.addTopLevel(extractTaskBean(dependencies, mapper, - domainObject, configuration.getNavigator(), adapter)); - } - List dependencyBeans = DomainDependency - .toDependencyBeans(mapper, dependencies); - for (DependencyBean dependencyBean : dependencyBeans) { - this.diagramGraph.add(dependencyBean); - } - this.diagramGraph.applyAllRestrictions(); + FunctionalityExposedForExtensions context = new FunctionalityExposedForExtensions( + this, configuration.getAdapter(), configuration.getNavigator(), + diagramGraph); + context.add(configuration.getData()); dependencyAdder = new DependencyAdderAdapter(configuration - .getAdapter(), mapper); - contextualizedCommands = contextualize( - new FunctionalityExposedForExtensions(this), configuration - .getCommands()); + .getAdapter(), context.getMapper()); + this.contextualizedCommands = contextualize(context, + configuration + .getCommands()); recreate(); } - private List contextualize(IContext context, - Collection commands) { - ArrayList result = new ArrayList(); - for (ICommand command : commands) { + private List> contextualize( + IContext context, + Collection> commands) { + ArrayList> result = new ArrayList>(); + for (ICommand command : commands) { result.add(CommandContextualized.create(command, context)); } return result; } - private TaskBean extractTaskBean( - List> dependencies, OneToOneMapper mapper, - T data, IStructureNavigator navigator, - IAdapterToTaskFundamentalProperties adapter) { - ITaskFundamentalProperties adapted = adapter.adapt(data); - dependencies.addAll(adapter.getDependenciesOriginating(data)); - TaskBean result; - if (navigator.isLeaf(data)) { - result = new TaskLeafBean(adapted); - } else { - TaskContainerBean container = new TaskContainerBean(adapted); - for (T child : navigator.getChildren(data)) { - container.add(extractTaskBean(dependencies, mapper, child, - navigator, adapter)); - } - result = container; - } - mapper.register(result, data); - return result; - } - public GanttDiagramGraph getGanttDiagramGraph() { return diagramGraph; } diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java index 49ba8c46d..98f537937 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java @@ -18,7 +18,7 @@ public class PlannerConfiguration { private List data; - private List commands = new ArrayList(); + private List> commands = new ArrayList>(); public PlannerConfiguration(IAdapterToTaskFundamentalProperties adapter, IStructureNavigator navigator, List data) { @@ -39,11 +39,11 @@ public class PlannerConfiguration { return data; } - public void addCommand(ICommand command) { + public void addCommand(ICommand command) { this.commands.add(command); } - public List getCommands() { + public List> getCommands() { return Collections.unmodifiableList(commands); } diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/extensions/ICommand.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/extensions/ICommand.java index 20a3ca099..11f97b3df 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/extensions/ICommand.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/extensions/ICommand.java @@ -1,14 +1,15 @@ package org.zkoss.ganttz.extensions; + /** * An action that can be applied to the planner and it's wanted to be available * to the user
* @author Óscar González Fernández */ -public interface ICommand { +public interface ICommand { public String getName(); - public void doAction(IContext context); + public void doAction(IContext context); } 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 add8be07b..56ce8e74e 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 @@ -1,11 +1,12 @@ package org.zkoss.ganttz.extensions; + /** * A facade for operations allowed to extensions
* @author Óscar González Fernández */ -public interface IContext { +public interface IContext { - // TODO expose functionality as needed + void add(T domainObject); } 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 ea18d08bc..11e7263f4 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 @@ -9,11 +9,15 @@ import org.zkoss.ganttz.adapters.AutoAdapter; import org.zkoss.ganttz.adapters.DomainDependency; import org.zkoss.ganttz.adapters.IStructureNavigator; import org.zkoss.ganttz.adapters.PlannerConfiguration; +import org.zkoss.ganttz.extensions.ICommand; +import org.zkoss.ganttz.extensions.IContext; import org.zkoss.ganttz.util.DefaultFundamentalProperties; -import org.zkoss.ganttz.util.GanttDiagramGraph; import org.zkoss.ganttz.util.DependencyType; +import org.zkoss.ganttz.util.GanttDiagramGraph; import org.zkoss.ganttz.util.ITaskFundamentalProperties; +import org.zkoss.ganttz.util.TaskBean; import org.zkoss.ganttz.util.TaskContainerBean; +import org.zkoss.ganttz.util.TaskLeafBean; /** * Some test data for planner
@@ -28,16 +32,38 @@ public class DataForPlanner { return new GanttDiagramGraph(); } + private PlannerConfiguration addCommands( + PlannerConfiguration configuration) { + configuration.addCommand(new ICommand() { + + @Override + public String getName() { + return "Add Task"; + } + + @Override + public void doAction(IContext context) { + TaskBean newTask = new TaskLeafBean(); + newTask.setName("Nova Tarefa"); + newTask.setBeginDate(new Date()); + newTask.setEndDate(twoMonthsLater(newTask.getBeginDate())); + context.add(newTask); + + } + }); + return configuration; + } + public PlannerConfiguration getLightLoad() { - return getModelWith(20); + return addCommands(getModelWith(20)); } public PlannerConfiguration getMediumLoad() { - return getModelWith(300); + return addCommands(getModelWith(300)); } public PlannerConfiguration getHighLoad() { - return getModelWith(500); + return addCommands(getModelWith(500)); } private PlannerConfiguration getModelWith(