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> 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 tasks, boolean firstTime) { @@ -331,8 +337,19 @@ public class LeftTasksTree extends HtmlMacroComponent { 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 (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 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> 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> 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 dependencies) { - List 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 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() {