diff options
author | spingel | 2011-03-04 06:04:21 +0000 |
---|---|---|
committer | spingel | 2011-03-04 06:04:21 +0000 |
commit | 13dd0e7d1b317196eff0c49f09820e94043b4405 (patch) | |
tree | 4e80966d350b438777788a63b6412f33a7905ba8 /org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views | |
parent | 292318e092c256417a9203b841fd39f6ca70b386 (diff) | |
download | org.eclipse.mylyn.tasks-13dd0e7d1b317196eff0c49f09820e94043b4405.tar.gz org.eclipse.mylyn.tasks-13dd0e7d1b317196eff0c49f09820e94043b4405.tar.xz org.eclipse.mylyn.tasks-13dd0e7d1b317196eff0c49f09820e94043b4405.zip |
NEW - bug 334962: filter subtasks of tasks not matched by queries
https://bugs.eclipse.org/bugs/show_bug.cgi?id=334962
Diffstat (limited to 'org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views')
5 files changed, 80 insertions, 16 deletions
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractTaskListContentProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractTaskListContentProvider.java index 39c7bb3f3..113683bfb 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractTaskListContentProvider.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractTaskListContentProvider.java @@ -13,16 +13,18 @@ package org.eclipse.mylyn.internal.tasks.ui.views; import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.ITreePathContentProvider; /** * @author Eugene Kuleshov * @author Mik Kersten */ -public abstract class AbstractTaskListContentProvider implements ITreeContentProvider { +public abstract class AbstractTaskListContentProvider implements ITreeContentProvider, ITreePathContentProvider { protected TaskListView taskListView; public AbstractTaskListContentProvider(TaskListView view) { this.taskListView = view; } + } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/PresentationFilter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/PresentationFilter.java index 8dcee12f1..2a205ddfd 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/PresentationFilter.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/PresentationFilter.java @@ -15,6 +15,7 @@ import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory; import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer; import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants; +import org.eclipse.mylyn.internal.tasks.core.TaskTask; import org.eclipse.mylyn.internal.tasks.ui.AbstractTaskListFilter; import org.eclipse.mylyn.tasks.core.IAttributeContainer; import org.eclipse.mylyn.tasks.core.IRepositoryQuery; @@ -28,19 +29,19 @@ public class PresentationFilter extends AbstractTaskListFilter { private boolean filterHiddenQueries; - private boolean filterSubtasks; + private boolean filterNonMatching; private PresentationFilter() { setFilterHiddenQueries(true); - setFilterSubtasks(true); + setFilterNonMatching(true); } public static PresentationFilter getInstance() { return instance; } - public boolean isFilterSubtasks() { - return filterSubtasks; + public boolean isFilterNonMatching() { + return filterNonMatching; } public boolean isFilterHiddenQueries() { @@ -51,8 +52,8 @@ public class PresentationFilter extends AbstractTaskListFilter { this.filterHiddenQueries = enabled; } - public void setFilterSubtasks(boolean filterSubtasks) { - this.filterSubtasks = filterSubtasks; + public void setFilterNonMatching(boolean filterSubtasks) { + this.filterNonMatching = filterSubtasks; } @Override @@ -64,13 +65,13 @@ public class PresentationFilter extends AbstractTaskListFilter { } return isQueryVisible(element); } - // filter sub-tasks not connected to queries or categories - if (element instanceof AbstractTask) { - if (!filterSubtasks) { + // filter repository sub-tasks not connected to queries or categories + if (element instanceof TaskTask) { + if (!filterNonMatching) { return true; } for (AbstractTaskContainer container : ((AbstractTask) element).getParentContainers()) { - // categories are always visible + // categories and local subtasks are always visible if (container instanceof AbstractTaskCategory) { return true; } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListContentProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListContentProvider.java index f4c085888..d91128d80 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListContentProvider.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListContentProvider.java @@ -19,14 +19,18 @@ import java.util.Iterator; import java.util.List; import java.util.Set; +import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.Viewer; import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory; import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer; +import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery; import org.eclipse.mylyn.internal.tasks.core.TaskCategory; +import org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer; import org.eclipse.mylyn.internal.tasks.ui.AbstractTaskListFilter; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.tasks.core.IRepositoryElement; +import org.eclipse.mylyn.tasks.core.IRepositoryQuery; import org.eclipse.mylyn.tasks.core.ITask; import org.eclipse.mylyn.tasks.core.ITaskContainer; @@ -39,6 +43,8 @@ import org.eclipse.mylyn.tasks.core.ITaskContainer; */ public class TaskListContentProvider extends AbstractTaskListContentProvider { + protected static Object[] EMPTY_ARRRY = new Object[0]; + public TaskListContentProvider(TaskListView taskListView) { super(taskListView); } @@ -189,19 +195,69 @@ public class TaskListContentProvider extends AbstractTaskListContentProvider { protected boolean filter(Object parent, Object object) { boolean emptyFilterText = containsNoFilterText(this.taskListView.getFilteredTree().getFilterString()); for (AbstractTaskListFilter filter : this.taskListView.getFilters()) { - if (emptyFilterText) { + if (emptyFilterText || filter.applyToFilteredText()) { if (!filter.select(parent, object)) { return true; } - } else { - if (filter.applyToFilteredText()) { - if (!filter.select(parent, object)) { + } + } + return false; + } + + protected boolean filter(TreePath path, Object parent, Object object) { + boolean emptyFilterText = containsNoFilterText(this.taskListView.getFilteredTree().getFilterString()); + for (AbstractTaskListFilter filter : this.taskListView.getFilters()) { + if (emptyFilterText || filter.applyToFilteredText()) { + if (filter instanceof TaskListInterestFilter) { + if (!((TaskListInterestFilter) filter).select(path, object)) { return true; } + } else if (!filter.select(parent, object)) { + return true; } } } return false; } + public boolean isSearching() { + return !containsNoFilterText(this.taskListView.getFilteredTree().getFilterString()); + } + + public Object[] getChildren(TreePath parentPath) { + Object parent = parentPath.getLastSegment(); + if (PresentationFilter.getInstance().isFilterNonMatching()) { + ITaskContainer container = (ITaskContainer) parentPath.getFirstSegment(); + if (container instanceof IRepositoryQuery || container instanceof UnmatchedTaskContainer) { + if (parent instanceof ITask) { + if (container instanceof RepositoryQuery && !TasksUiPlugin.getDefault().groupSubtasks(container)) { + return EMPTY_ARRRY; + } + } + List<IRepositoryElement> children = getFilteredChildrenFor(parent); + if (!isSearching()) { + if (parent instanceof ITask) { + // scope subtasks by query results + for (Iterator<IRepositoryElement> it = children.iterator(); it.hasNext();) { + IRepositoryElement element = it.next(); + if (!container.getChildren().contains(element)) { + it.remove(); + } + } + } + } + return children.toArray(); + } + } + return getFilteredChildrenFor(parent).toArray(); + } + + public boolean hasChildren(TreePath path) { + return getChildren(path).length > 0; + } + + public TreePath[] getParents(Object element) { + return new TreePath[0]; + } + } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListInterestFilter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListInterestFilter.java index e33d43f71..c18eb27a7 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListInterestFilter.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListInterestFilter.java @@ -15,6 +15,7 @@ import java.util.Collection; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; +import org.eclipse.jface.viewers.TreePath; import org.eclipse.mylyn.commons.core.StatusHandler; import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants; @@ -39,6 +40,10 @@ import org.eclipse.mylyn.tasks.core.ITaskContainer; */ public class TaskListInterestFilter extends AbstractTaskListFilter { + public boolean select(TreePath path, Object child) { + return select(path.getLastSegment(), child); + } + @Override public boolean select(Object parent, Object child) { try { diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java index 46b820db2..804d190b6 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java @@ -702,7 +702,7 @@ public class TaskListView extends ViewPart implements IPropertyChangeListener, I filterPresentation.setFilterHiddenQueries(TasksUiPlugin.getDefault() .getPreferenceStore() .contains(ITasksUiPreferenceConstants.FILTER_HIDDEN)); - filterPresentation.setFilterSubtasks(TasksUiPlugin.getDefault() + filterPresentation.setFilterNonMatching(TasksUiPlugin.getDefault() .getPreferenceStore() .contains(ITasksUiPreferenceConstants.FILTER_NON_MATCHING)); } |