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 new file mode 100644 index 000000000..4bc6a3b94 --- /dev/null +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/CommandContextualized.java @@ -0,0 +1,43 @@ +package org.zkoss.ganttz; + +import org.zkoss.ganttz.extensions.ICommand; +import org.zkoss.ganttz.extensions.IContext; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zk.ui.event.Events; +import org.zkoss.zul.Button; + +class CommandContextualized { + + public static CommandContextualized create(ICommand command, + IContext context) { + return new CommandContextualized(command, context); + } + + private final ICommand command; + + private final IContext context; + + private CommandContextualized(ICommand command, IContext context) { + this.command = command; + this.context = context; + } + + public void doAction() { + command.doAction(context); + } + + Button toButton() { + Button result = new Button(); + result.setLabel(command.getName()); + result.addEventListener(Events.ON_CLICK, new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + doAction(); + } + }); + return result; + } + +} 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 new file mode 100644 index 000000000..ff9fedb0f --- /dev/null +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java @@ -0,0 +1,13 @@ +package org.zkoss.ganttz; + +import org.zkoss.ganttz.extensions.IContext; + +public class FunctionalityExposedForExtensions implements IContext { + + private final Planner planner; + + public FunctionalityExposedForExtensions(Planner planner) { + this.planner = planner; + } + +} 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 new file mode 100644 index 000000000..6258639fc --- /dev/null +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/LeftPane.java @@ -0,0 +1,61 @@ +package org.zkoss.ganttz; + +import java.util.List; + +import org.zkoss.ganttz.util.TaskBean; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.HtmlMacroComponent; +import org.zkoss.zul.Button; + +/** + * LeftPane of the planner. Responsible of showing global commands and the + * leftTasksTree
+ * @author Óscar González Fernández + */ +public class LeftPane extends HtmlMacroComponent { + + private final List topLevelTasks; + + private List commands; + + private LeftTasksTree leftTasksTree; + + public LeftPane(List commands, + List topLevelTasks) { + this.commands = commands; + this.topLevelTasks = topLevelTasks; + } + + @Override + public void afterCompose() { + super.afterCompose(); + leftTasksTree = new LeftTasksTree(topLevelTasks); + addCommands(); + getContainer().appendChild(leftTasksTree); + leftTasksTree.afterCompose(); + } + + private void addCommands() { + Component commandsContainer = getCommandsContainer(); + for (CommandContextualized command : commands) { + Button button = command.toButton(); + commandsContainer.appendChild(button); + } + } + + private Component getContainer() { + Component commandsContainer = getCommandsContainer(); + Component container = commandsContainer.getParent(); + return container; + } + + private Component getCommandsContainer() { + Component commandsContainer = getFellow("leftpane_commands"); + return commandsContainer; + } + + public void taskRemoved(TaskBean taskBean) { + leftTasksTree.taskRemoved(taskBean); + } + +} 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 5fbd3f095..b0d67b3a6 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.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -12,6 +13,8 @@ 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; @@ -30,7 +33,7 @@ public class Planner extends XulElement { private GanttDiagramGraph diagramGraph = new GanttDiagramGraph(); private DependencyRemovedListener dependencyRemovedListener; private TaskRemovedListener taskRemovedListener; - private LeftTasksTree leftTasksTree; + private LeftPane leftPane; private GanttPanel ganttPanel; @@ -40,6 +43,8 @@ public class Planner extends XulElement { private DependencyAdderAdapter dependencyAdder; + private List contextualizedCommands; + public Planner() { } @@ -93,8 +98,8 @@ public class Planner extends XulElement { private void removePreviousDetails() { List children = getChildren(); - for (LeftTasksTree l : Planner.findComponentsOfType(LeftTasksTree.class, - children)) { + for (LeftTasksTree l : Planner.findComponentsOfType( + LeftTasksTree.class, children)) { removeChild(l); } } @@ -127,7 +132,7 @@ public class Planner extends XulElement { @Override public void taskRemoved(Task taskRemoved) { diagramGraph.remove(taskRemoved.getTaskBean()); - leftTasksTree.taskRemoved(taskRemoved.getTaskBean()); + leftPane.taskRemoved(taskRemoved.getTaskBean()); TaskList taskList = getTaskList(); setHeight(getHeight());// forcing smart update taskList.adjustZoomColumnsHeight(); @@ -239,9 +244,21 @@ public class Planner extends XulElement { this.diagramGraph.applyAllRestrictions(); dependencyAdder = new DependencyAdderAdapter(configuration .getAdapter(), mapper); + contextualizedCommands = contextualize( + new FunctionalityExposedForExtensions(this), configuration + .getCommands()); recreate(); } + 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, @@ -257,7 +274,7 @@ public class Planner extends XulElement { container.add(extractTaskBean(dependencies, mapper, child, navigator, adapter)); } - return container; + result = container; } mapper.register(result, data); return result; @@ -269,12 +286,11 @@ public class Planner extends XulElement { private void recreate() { removePreviousDetails(); - this.leftTasksTree = new LeftTasksTree(this.diagramGraph + this.leftPane = new LeftPane(contextualizedCommands, this.diagramGraph .getTopLevelTasks()); - insertBefore(this.leftTasksTree, - (Component) (getChildren().isEmpty() ? null : getChildren() - .get(0))); - this.leftTasksTree.afterCompose(); + insertBefore(this.leftPane, (Component) (getChildren().isEmpty() ? null + : getChildren().get(0))); + this.leftPane.afterCompose(); removePreviousGanntPanel(); this.ganttPanel = new GanttPanel(this.diagramGraph, taskEditFormComposer); 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 7bdc26e4a..49ba8c46d 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 @@ -1,7 +1,11 @@ package org.zkoss.ganttz.adapters; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import org.zkoss.ganttz.extensions.ICommand; + /** * A object that defines several extension points for gantt planner * @author Óscar González Fernández @@ -14,6 +18,8 @@ public class PlannerConfiguration { private List data; + private List commands = new ArrayList(); + public PlannerConfiguration(IAdapterToTaskFundamentalProperties adapter, IStructureNavigator navigator, List data) { this.adapter = adapter; @@ -33,4 +39,12 @@ public class PlannerConfiguration { return data; } + public void addCommand(ICommand command) { + this.commands.add(command); + } + + 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 new file mode 100644 index 000000000..20a3ca099 --- /dev/null +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/extensions/ICommand.java @@ -0,0 +1,14 @@ +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 String getName(); + + 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 new file mode 100644 index 000000000..add8be07b --- /dev/null +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/extensions/IContext.java @@ -0,0 +1,11 @@ +package org.zkoss.ganttz.extensions; + +/** + * A facade for operations allowed to extensions
+ * @author Óscar González Fernández + */ +public interface IContext { + + // TODO expose functionality as needed + +} diff --git a/navalplanner-gantt-zk/src/main/resources/metainfo/zk/lang-addon.xml b/navalplanner-gantt-zk/src/main/resources/metainfo/zk/lang-addon.xml index c7d96c9a2..ad84f4b1d 100755 --- a/navalplanner-gantt-zk/src/main/resources/metainfo/zk/lang-addon.xml +++ b/navalplanner-gantt-zk/src/main/resources/metainfo/zk/lang-addon.xml @@ -19,6 +19,12 @@ ~./ganttz/planner.dsp + + + leftPane + org.zkoss.ganttz.LeftPane + ~./ganttz/zul/leftPane.zul + leftTasksTree diff --git a/navalplanner-gantt-zk/src/main/resources/web/ganttz/zul/leftPane.zul b/navalplanner-gantt-zk/src/main/resources/web/ganttz/zul/leftPane.zul new file mode 100644 index 000000000..62fafd06b --- /dev/null +++ b/navalplanner-gantt-zk/src/main/resources/web/ganttz/zul/leftPane.zul @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/navalplanner-gantt-zk/src/main/resources/web/ganttz/zul/leftTasksTree.zul b/navalplanner-gantt-zk/src/main/resources/web/ganttz/zul/leftTasksTree.zul index 3343777f4..f36745d3c 100644 --- a/navalplanner-gantt-zk/src/main/resources/web/ganttz/zul/leftTasksTree.zul +++ b/navalplanner-gantt-zk/src/main/resources/web/ganttz/zul/leftTasksTree.zul @@ -1,16 +1,7 @@ - - -