diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/FilterAndParentExpandedPredicates.java b/ganttzk/src/main/java/org/zkoss/ganttz/FilterAndParentExpandedPredicates.java
new file mode 100644
index 000000000..37e8f6d78
--- /dev/null
+++ b/ganttzk/src/main/java/org/zkoss/ganttz/FilterAndParentExpandedPredicates.java
@@ -0,0 +1,80 @@
+/*
+ * This file is part of NavalPlan
+ *
+ * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
+ * Desenvolvemento Tecnolóxico de Galicia
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package org.zkoss.ganttz;
+
+import org.zkoss.ganttz.data.Position;
+import org.zkoss.ganttz.data.Task;
+import org.zkoss.ganttz.data.TaskContainer;
+import org.zkoss.ganttz.extensions.IContext;
+
+/**
+ * A predicate over {@link Task} elements checking if it is visible. A
+ * {@link Task} should visible if it fulfill a filter and its parent (if any) is
+ * expanded.
+ *
+ * @author Manuel Rego Casasnovas
+ */
+public abstract class FilterAndParentExpandedPredicates implements IPredicate {
+
+ private final IContext> context;
+
+ public FilterAndParentExpandedPredicates(IContext> context) {
+ this.context = context;
+ }
+
+ @Override
+ public boolean accepts(Object object) {
+ return accepts((Task) object);
+ }
+
+ private boolean accepts(Task task) {
+ return accpetsFilterPredicate(task)
+ && getParentExpandedPredicate().accepts(task);
+ }
+
+ public abstract boolean accpetsFilterPredicate(Task task);
+
+ private IPredicate getParentExpandedPredicate() {
+ return new IPredicate() {
+
+ @Override
+ public boolean accepts(Object object) {
+ return accepts((Task) object);
+ }
+
+ private boolean accepts(Task task) {
+ Position position = context.getMapper().findPositionFor(task);
+ if (position.isAtTop()) {
+ return true;
+ } else {
+ for (TaskContainer taskContainer : position.getAncestors()) {
+ if (!taskContainer.isExpanded()) {
+ return false;
+ }
+ }
+ return true;
+ }
+ }
+
+ };
+ }
+
+}
diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/GanttPanel.java b/ganttzk/src/main/java/org/zkoss/ganttz/GanttPanel.java
index 2ef063c0b..185316733 100644
--- a/ganttzk/src/main/java/org/zkoss/ganttz/GanttPanel.java
+++ b/ganttzk/src/main/java/org/zkoss/ganttz/GanttPanel.java
@@ -45,14 +45,16 @@ public class GanttPanel extends XulElement implements AfterCompose {
FunctionalityExposedForExtensions> context,
List extends CommandOnTaskContextualized>> commandsOnTasksContextualized,
CommandOnTaskContextualized> doubleClickCommand,
- IDisabilityConfiguration disabilityConfiguration) {
+ IDisabilityConfiguration disabilityConfiguration,
+ FilterAndParentExpandedPredicates predicate) {
this.diagramGraph = context.getDiagramGraph();
timeTrackerComponent = timeTrackerForGanttPanel(context
.getTimeTracker());
appendChild(timeTrackerComponent);
dependencyList = new DependencyList(context);
tasksLists = TaskList.createFor(context, doubleClickCommand,
- commandsOnTasksContextualized, disabilityConfiguration);
+ commandsOnTasksContextualized, disabilityConfiguration,
+ predicate);
appendChild(tasksLists);
appendChild(dependencyList);
}
diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/LeftPane.java b/ganttzk/src/main/java/org/zkoss/ganttz/LeftPane.java
index f3a074fae..32df77f67 100644
--- a/ganttzk/src/main/java/org/zkoss/ganttz/LeftPane.java
+++ b/ganttzk/src/main/java/org/zkoss/ganttz/LeftPane.java
@@ -42,6 +42,8 @@ public class LeftPane extends HtmlMacroComponent {
private final IDisabilityConfiguration disabilityConfiguration;
+ private FilterAndParentExpandedPredicates predicate;
+
public void setGoingDownInLastArrowCommand(
CommandContextualized> goingDownInLastArrowCommand) {
this.leftTasksTree
@@ -49,16 +51,18 @@ public class LeftPane extends HtmlMacroComponent {
}
public LeftPane(IDisabilityConfiguration disabilityConfiguration,
- List topLevelTasks) {
+ List topLevelTasks,
+ FilterAndParentExpandedPredicates predicate) {
this.topLevelTasks = topLevelTasks;
this.disabilityConfiguration = disabilityConfiguration;
+ this.predicate = predicate;
}
@Override
public void afterCompose() {
super.afterCompose();
leftTasksTree = new LeftTasksTree(disabilityConfiguration,
- topLevelTasks);
+ topLevelTasks, predicate);
getContainer().appendChild(leftTasksTree);
leftTasksTree.afterCompose();
}
@@ -80,4 +84,9 @@ public class LeftPane extends HtmlMacroComponent {
leftTasksTree.addTasks(position, newTasks);
}
+ public void setPredicate(FilterAndParentExpandedPredicates predicate) {
+ this.predicate = predicate;
+ leftTasksTree.setPredicate(predicate);
+ }
+
}
diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTree.java b/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTree.java
index 6cb65a177..6dfd5ef5e 100644
--- a/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTree.java
+++ b/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTree.java
@@ -318,10 +318,16 @@ public class LeftTasksTree extends HtmlMacroComponent {
private final IDisabilityConfiguration disabilityConfiguration;
+ private FilterAndParentExpandedPredicates predicate;
+
+ private final List visibleTasks = new ArrayList();
+
public LeftTasksTree(IDisabilityConfiguration disabilityConfiguration,
- List tasks) {
+ List tasks,
+ FilterAndParentExpandedPredicates predicate) {
this.disabilityConfiguration = disabilityConfiguration;
this.tasks = tasks;
+ this.predicate = predicate;
}
private void fillModel(Collection extends Task> tasks, boolean firstTime) {
@@ -331,8 +337,19 @@ public class LeftTasksTree extends HtmlMacroComponent {
private void fillModel(Task parent, Integer insertionPosition,
Collection extends Task> children, final boolean firstTime) {
if (firstTime) {
- this.tasksTreeModel.add(parent, insertionPosition, children);
for (Task node : children) {
+ if (predicate.accpetsFilterPredicate(node)) {
+ if (!visibleTasks.contains(node)) {
+ this.tasksTreeModel.add(parent, node);
+ visibleTasks.add(node);
+ }
+ } else {
+ if (visibleTasks.contains(node)) {
+ this.tasksTreeModel.remove(node);
+ visibleTasks.remove(node);
+ }
+ }
+
if (node.isContainer()) {
fillModel(node, 0, node.getTasks(), firstTime);
}
@@ -341,12 +358,48 @@ public class LeftTasksTree extends HtmlMacroComponent {
} else {
for (Task node : children) {
if (node.isContainer()) {
- this.deferredFiller.addParentOfPendingToAdd(node);
+ if (predicate.accpetsFilterPredicate(node)) {
+ if (!visibleTasks.contains(node)) {
+ this.deferredFiller.addParentOfPendingToAdd(node);
+ }
+ }
}
}
// the node must be added after, so the multistepTreeFiller is
// ready
- this.tasksTreeModel.add(parent, insertionPosition, children);
+ for (Task node : children) {
+ if (predicate.accpetsFilterPredicate(node)) {
+ if (!visibleTasks.contains(node)) {
+ // this.tasksTreeModel.add(parent, node);
+ this.tasksTreeModel.add(parent, insertionPosition,
+ Arrays.asList(node));
+ visibleTasks.add(node);
+ }
+ } else {
+ if (visibleTasks.contains(node)) {
+ this.tasksTreeModel.remove(node);
+ removeTaskAndAllChildren(visibleTasks, node);
+ }
+ }
+
+ if (node.isContainer()) {
+ fillModel(node, 0, node.getTasks(), firstTime);
+ }
+
+ if (visibleTasks.contains(node)) {
+ insertionPosition++;
+ }
+ }
+ }
+ }
+
+ private void removeTaskAndAllChildren(List visibleTasks, Task task) {
+ visibleTasks.remove(task);
+
+ if (task.isContainer()) {
+ for (Task node : task.getTasks()) {
+ removeTaskAndAllChildren(visibleTasks, node);
+ }
}
}
@@ -398,4 +451,9 @@ public class LeftTasksTree extends HtmlMacroComponent {
this.goingDownInLastArrowCommand = goingDownInLastArrowCommand;
}
+ public void setPredicate(FilterAndParentExpandedPredicates predicate) {
+ this.predicate = predicate;
+ fillModel(tasks, false);
+ }
+
}
diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java b/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java
index 1cf193250..48634d413 100644
--- a/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java
+++ b/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java
@@ -338,10 +338,24 @@ public class Planner extends HtmlMacroComponent {
private void setupComponents() {
insertGlobalCommands();
this.leftPane = new LeftPane(disabilityConfiguration, this.diagramGraph
- .getTopLevelTasks());
+ .getTopLevelTasks(),
+ new FilterAndParentExpandedPredicates(context) {
+
+ @Override
+ public boolean accpetsFilterPredicate(Task task) {
+ return true;
+ }
+ });
this.ganttPanel = new GanttPanel(this.context,
commandsOnTasksContextualized, doubleClickCommand,
- disabilityConfiguration);
+ disabilityConfiguration,
+ new FilterAndParentExpandedPredicates(
+ context) {
+ @Override
+ public boolean accpetsFilterPredicate(Task task) {
+ return true;
+ }
+ });
Button button = (Button) getFellow("btnPrint");
button.setDisabled(!context.isPrintEnabled());
}
@@ -510,4 +524,20 @@ public class Planner extends HtmlMacroComponent {
listZoomLevels.invalidate();
}
}
+
+ public IContext> getContext() {
+ return context;
+ }
+
+ public void setTaskListPredicate(FilterAndParentExpandedPredicates predicate) {
+ leftPane.setPredicate(predicate);
+ getTaskList().setPredicate(predicate);
+ getDependencyList().redrawDependencies();
+
+ // TODO Call invalidate() should not be needed in the future if we
+ // change Task and TaskContainer DSPs in order to use the UUID component
+ // in a div tag that wraps the component
+ ganttPanel.invalidate();
+ }
+
}
diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java b/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java
index b2d709988..7a9ef0813 100644
--- a/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java
+++ b/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java
@@ -527,4 +527,9 @@ public class TaskComponent extends Div implements AfterCompose {
return task.isSubcontracted();
}
+ @Override
+ public String toString() {
+ return task.toString();
+ }
+
}
diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/TaskContainerComponent.java b/ganttzk/src/main/java/org/zkoss/ganttz/TaskContainerComponent.java
index d73d1984a..e558221d2 100644
--- a/ganttzk/src/main/java/org/zkoss/ganttz/TaskContainerComponent.java
+++ b/ganttzk/src/main/java/org/zkoss/ganttz/TaskContainerComponent.java
@@ -53,25 +53,22 @@ public class TaskContainerComponent extends TaskComponent implements
private transient IExpandListener expandListener;
- public TaskContainerComponent(TaskContainer taskContainer, TaskList taskList) {
+ public TaskContainerComponent(final TaskContainer taskContainer,
+ final TaskList taskList) {
super(taskContainer, taskList.getDisabilityConfiguration());
if (!taskContainer.isContainer()) {
throw new IllegalArgumentException();
}
+ this.taskList = taskList;
this.expandListener = new IExpandListener() {
@Override
public void expandStateChanged(boolean isNowExpanded) {
- if (isNowExpanded) {
- open();
- } else {
- close();
- }
+ taskList.reload(true);
updateClass();
}
};
taskContainer.addExpandListener(expandListener);
- this.taskList = taskList;
for (Task task : taskContainer.getTasks()) {
getCurrentComponents().add(createChild(task));
}
@@ -118,16 +115,6 @@ public class TaskContainerComponent extends TaskComponent implements
}
}
- public void open() {
- open(true);
- }
-
- public void open(boolean recolocate) {
- Component previous = this;
- List toAdd = getCurrentComponents();
- addAllAt(previous, toAdd, recolocate);
- }
-
private void addAllAt(Component previous, List toAdd,
boolean recolate) {
for (TaskComponent subtaskComponent : toAdd) {
@@ -175,17 +162,6 @@ public class TaskContainerComponent extends TaskComponent implements
+ (getTaskContainer().isExpanded() ? "expanded" : "closed");
}
- private void close() {
- for (TaskComponent subtaskComponent : getCurrentComponents()) {
- if (subtaskComponent instanceof TaskContainerComponent) {
- TaskContainerComponent container = (TaskContainerComponent) subtaskComponent;
- container.close();
- }
- taskList.hideTaskComponent(subtaskComponent);
- taskList.redrawDependencies();
- }
- }
-
public void insert(Position position, Collection extends Task> newTasks) {
if (position.getParent().equals(getTask())) {
add(position.getInsertionPosition(), newTasks);
diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java b/ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java
index 0e62a6e6f..5076e7df7 100644
--- a/ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java
+++ b/ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java
@@ -32,11 +32,11 @@ import org.zkoss.ganttz.data.Dependency;
import org.zkoss.ganttz.data.DependencyType;
import org.zkoss.ganttz.data.Position;
import org.zkoss.ganttz.data.Task;
+import org.zkoss.ganttz.data.TaskContainer;
import org.zkoss.ganttz.timetracker.TimeTracker;
import org.zkoss.ganttz.timetracker.TimeTrackerComponent;
import org.zkoss.ganttz.timetracker.zoom.IZoomLevelChangedListener;
import org.zkoss.ganttz.timetracker.zoom.ZoomLevel;
-import org.zkoss.ganttz.util.ComponentsFinder;
import org.zkoss.ganttz.util.MenuBuilder;
import org.zkoss.ganttz.util.MenuBuilder.ItemAction;
import org.zkoss.zk.au.out.AuInvoke;
@@ -67,39 +67,42 @@ public class TaskList extends XulElement implements AfterCompose {
private final IDisabilityConfiguration disabilityConfiguration;
+ private FilterAndParentExpandedPredicates predicate;
+
+ private List visibleTasks = new ArrayList();
+
+ private Map taskComponentByTask;
+
public TaskList(
FunctionalityExposedForExtensions> context,
CommandOnTaskContextualized> doubleClickCommand,
List tasks,
List extends CommandOnTaskContextualized>> commandsOnTasksContextualized,
- IDisabilityConfiguration disabilityConfiguration) {
+ IDisabilityConfiguration disabilityConfiguration,
+ FilterAndParentExpandedPredicates predicate) {
this.context = context;
this.doubleClickCommand = doubleClickCommand;
this.originalTasks = tasks;
this.commandsOnTasksContextualized = commandsOnTasksContextualized;
this.disabilityConfiguration = disabilityConfiguration;
+ this.predicate = predicate;
}
public static TaskList createFor(
FunctionalityExposedForExtensions> context,
CommandOnTaskContextualized> doubleClickCommand,
List extends CommandOnTaskContextualized>> commandsOnTasksContextualized,
- IDisabilityConfiguration disabilityConfiguration) {
+ IDisabilityConfiguration disabilityConfiguration,
+ FilterAndParentExpandedPredicates predicate) {
TaskList result = new TaskList(context, doubleClickCommand, context
.getDiagramGraph().getTopLevelTasks(),
- commandsOnTasksContextualized, disabilityConfiguration);
+ commandsOnTasksContextualized, disabilityConfiguration,
+ predicate);
return result;
}
public List asDependencyComponents(
Collection extends Dependency> dependencies) {
- List extends Object> children = getChildren();
- List taskComponents = ComponentsFinder.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
@@ -118,7 +121,6 @@ public class TaskList extends XulElement implements AfterCompose {
final boolean isFirst = getFirstTopTaskComponent() == null
|| getFirstTopTaskComponent().equals(beforeThis);
insertBefore(taskComponent, beforeThis);
-
addContextMenu(taskComponent);
addListenerForTaskComponentEditForm(taskComponent);
taskComponent.afterCompose();
@@ -130,13 +132,6 @@ public class TaskList extends XulElement implements AfterCompose {
adjustZoomColumnsHeight();
getGanttPanel().getDependencyList().redrawDependencies();
}
- if (taskComponent instanceof TaskContainerComponent) {
- TaskContainerComponent container = (TaskContainerComponent) taskComponent;
- if (container.isExpanded()) {
- container.open(relocate);
- }
- }
-
}
public synchronized void addTaskComponent(
@@ -155,7 +150,10 @@ public class TaskList extends XulElement implements AfterCompose {
public void addTasks(Position position, Collection extends Task> newTasks) {
if (position.isAppendToTop()) {
for (Task t : newTasks) {
- addTaskComponent(TaskComponent.asTaskComponent(t, this), true);
+ TaskComponent taskComponent = TaskComponent.asTaskComponent(t,
+ this);
+ addTaskComponent(taskComponent, true);
+ taskComponent.publishTaskComponents(taskComponentByTask);
}
} else if (position.isAtTop()) {
final int insertionPosition = position.getInsertionPosition();
@@ -166,6 +164,7 @@ public class TaskList extends XulElement implements AfterCompose {
for (Task t : newTasks) {
TaskComponent toAdd = TaskComponent.asTaskComponent(t, this);
addTaskComponent(beforeThis, toAdd, true);
+ toAdd.publishTaskComponents(taskComponentByTask);
beforeThis = toAdd.getNextSibling();
}
} else {
@@ -262,9 +261,15 @@ public class TaskList extends XulElement implements AfterCompose {
@Override
public void afterCompose() {
+ List taskComponents = new ArrayList();
for (Task task : originalTasks) {
- addTaskComponent(TaskComponent.asTaskComponent(task, this), false);
+ TaskComponent taskComponent = TaskComponent.asTaskComponent(task,
+ this);
+ addTaskComponent(taskComponent, false);
+ taskComponents.add(taskComponent);
+ visibleTasks.add(task);
}
+
if (zoomLevelChangedListener == null) {
zoomLevelChangedListener = new IZoomLevelChangedListener() {
@Override
@@ -277,6 +282,11 @@ public class TaskList extends XulElement implements AfterCompose {
};
getTimeTracker().addZoomListener(zoomLevelChangedListener);
}
+
+ taskComponentByTask = new HashMap();
+ for (TaskComponent taskComponent : taskComponents) {
+ taskComponent.publishTaskComponents(taskComponentByTask);
+ }
}
private Map contextMenus = new HashMap();
@@ -344,4 +354,62 @@ public class TaskList extends XulElement implements AfterCompose {
public IDisabilityConfiguration getDisabilityConfiguration() {
return disabilityConfiguration;
}
+
+ public void reload(boolean relocate) {
+ ArrayList tasksPendingToAdd = new ArrayList();
+ reload(originalTasks, tasksPendingToAdd, relocate);
+ addPendingTasks(tasksPendingToAdd, null, relocate);
+ }
+
+ private void reload(List tasks, List tasksPendingToAdd,
+ boolean relocate) {
+ for (Task task : tasks) {
+ if (visibleTasks.contains(task)) {
+ addPendingTasks(tasksPendingToAdd, find(task), relocate);
+ }
+
+ if (predicate.accepts(task)) {
+ if (!visibleTasks.contains(task)) {
+ tasksPendingToAdd.add(task);
+ }
+ } else {
+ if (visibleTasks.contains(task)) {
+ TaskComponent taskComponent = find(task);
+ hideTaskComponent(taskComponent);
+
+ visibleTasks.remove(task);
+ task.setVisible(false);
+ }
+ }
+
+ if (task instanceof TaskContainer) {
+ reload(task.getTasks(), tasksPendingToAdd, relocate);
+ }
+ }
+ }
+
+ private void addPendingTasks(List tasksPendingToAdd,
+ TaskComponent insertBefore, boolean relocate) {
+ if (tasksPendingToAdd.isEmpty()) {
+ return;
+ }
+
+ for (Task taskToAdd : tasksPendingToAdd) {
+ TaskComponent taskComponent = taskComponentByTask.get(taskToAdd);
+ if (taskComponent == null) {
+ taskComponent = TaskComponent.asTaskComponent(taskToAdd, this);
+ taskComponent.publishTaskComponents(taskComponentByTask);
+ }
+ addTaskComponent(insertBefore, taskComponent, relocate);
+ visibleTasks.add(taskToAdd);
+ taskToAdd.setVisible(true);
+ }
+ tasksPendingToAdd.clear();
+ }
+
+ public void setPredicate(FilterAndParentExpandedPredicates predicate) {
+ this.predicate = predicate;
+ reload(false);
+ }
+
}
diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/Milestone.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/Milestone.java
index da1a24646..5e24d20c3 100644
--- a/ganttzk/src/main/java/org/zkoss/ganttz/data/Milestone.java
+++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/Milestone.java
@@ -51,7 +51,7 @@ public class Milestone extends Task {
}
@Override
- protected void setVisible(boolean visible) {
+ public void setVisible(boolean visible) {
super.setVisible(visible);
if (!this.expanded) {
return;
diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java
index b09460b93..9dcf00668 100644
--- a/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java
+++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java
@@ -110,7 +110,7 @@ public abstract class Task implements ITaskFundamentalProperties {
return visible;
}
- protected void setVisible(boolean visible) {
+ public void setVisible(boolean visible) {
boolean previousValue = this.visible;
this.visible = visible;
visibilityProperties.firePropertyChange("visible", previousValue,
@@ -315,4 +315,10 @@ public abstract class Task implements ITaskFundamentalProperties {
}
public abstract boolean canBeExplicitlyMoved();
+
+ @Override
+ public String toString() {
+ return fundamentalProperties.getName();
+ }
+
}
diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/TaskContainer.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/TaskContainer.java
index 2aaf9c9ba..eb07fecd2 100644
--- a/ganttzk/src/main/java/org/zkoss/ganttz/data/TaskContainer.java
+++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/TaskContainer.java
@@ -150,7 +150,7 @@ public class TaskContainer extends Task {
}
@Override
- protected void setVisible(boolean visible) {
+ public void setVisible(boolean visible) {
super.setVisible(visible);
if (!this.expanded) {
return;
@@ -163,9 +163,6 @@ public class TaskContainer extends Task {
public void setExpanded(boolean expanded) {
boolean valueChanged = expanded != this.expanded;
this.expanded = expanded;
- for (Task task : tasks) {
- task.setVisible(this.expanded);
- }
if (valueChanged) {
expandListeners
.fireEvent(new IListenerNotification() {
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningController.java
index f6eb5ae4f..6dddc5ed9 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningController.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningController.java
@@ -43,8 +43,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
+import org.zkoss.ganttz.FilterAndParentExpandedPredicates;
import org.zkoss.ganttz.Planner;
+import org.zkoss.ganttz.data.Task;
import org.zkoss.ganttz.extensions.ICommand;
+import org.zkoss.ganttz.extensions.IContext;
import org.zkoss.ganttz.resourceload.ScriptsRequiredByResourceLoadPanel;
import org.zkoss.ganttz.timetracker.zoom.ZoomLevel;
import org.zkoss.ganttz.util.OnZKDesktopRegistry;
@@ -54,7 +57,6 @@ import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.util.Composer;
import org.zkoss.zul.Constraint;
import org.zkoss.zul.Datebox;
-import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Vbox;
@@ -194,13 +196,20 @@ public class OrderPlanningController implements Composer {
name);
}
- private void filterByPredicate(OrderElementPredicate predicate) {
- // TODO
- try {
- Messagebox.show("TODO");
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
+ private void filterByPredicate(final OrderElementPredicate predicate) {
+ final IContext> context = planner.getContext();
+ planner.setTaskListPredicate(new FilterAndParentExpandedPredicates(context) {
+ @Override
+ public boolean accpetsFilterPredicate(Task task) {
+ if (predicate == null) {
+ return true;
+ }
+ TaskElement taskElement = (TaskElement) context.getMapper()
+ .findAssociatedDomainObject(task);
+ return predicate.accepts(taskElement.getOrderElement());
+ }
+
+ });
}
public Constraint checkConstraintFinishDate() {