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