blob: c83347951359737e3ef1260e3cf6d24041285b29 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2009 Tasktop Technologies and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.tasks.ui;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
import org.eclipse.mylyn.internal.tasks.core.LocalTask;
import org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer;
import org.eclipse.mylyn.tasks.core.IRepositoryElement;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.ITaskContainer;
import org.eclipse.ui.IWorkingSet;
/**
* AbstractTaskListFilter for task working sets
*
* @author Eugene Kuleshov
* @author Rob Elves
* @author Steffen Pingel
*/
public class TaskWorkingSetFilter extends AbstractTaskListFilter {
private IAdaptable[] elements;
@Override
public boolean select(Object parent, Object element) {
if (parent instanceof ITask) {
return true;
}
if (parent == null && element instanceof ScheduledTaskContainer) {
return true;
}
if (parent == null && element instanceof IRepositoryElement) {
return isContainedInWorkingSet((IRepositoryElement) element);
}
if (parent instanceof ITaskContainer && !(parent instanceof ScheduledTaskContainer)) {
return isContainedInWorkingSet((IRepositoryElement) parent);
}
if (element instanceof LocalTask) {
for (IRepositoryElement container : ((LocalTask) element).getParentContainers()) {
return isContainedInWorkingSet(container);
}
}
if (parent instanceof ScheduledTaskContainer && element instanceof ITask) {
for (IRepositoryElement query : ((AbstractTask) element).getParentContainers()) {
if (isContainedInWorkingSet(query)) {
return true;
}
}
return false;
}
return true;
}
public boolean select(ITask task) {
for (IRepositoryElement query : ((AbstractTask) task).getParentContainers()) {
if (isContainedInWorkingSet(query)) {
return true;
}
}
return false;
}
@Override
public boolean applyToFilteredText() {
return true;
}
private boolean isContainedInWorkingSet(IRepositoryElement element) {
return isContainedInWorkingSet(element, new HashSet<IRepositoryElement>());
}
private boolean isContainedInWorkingSet(IRepositoryElement container, Set<IRepositoryElement> visited) {
if (elements == null) {
return true;
}
if (visited.contains(container)) {
return false;
}
visited.add(container);
boolean seenTaskWorkingSets = false;
String handleIdentifier = container.getHandleIdentifier();
for (IAdaptable adaptable : elements) {
if (adaptable instanceof IRepositoryElement) {
seenTaskWorkingSets = true;
if (handleIdentifier.equals(((IRepositoryElement) adaptable).getHandleIdentifier())) {
return true;
}
// handle case of sub tasks (not directly under a category/query)
if (container instanceof AbstractTask) {
for (AbstractTaskContainer parent : ((AbstractTask) container).getParentContainers()) {
if (visited.contains(parent)) {
continue;
}
if (isContainedInWorkingSet(parent, visited)) {
return true;
}
}
}
}
}
return !seenTaskWorkingSets;
}
public boolean updateWorkingSet(IWorkingSet currentWorkingSet) {
IAdaptable[] newElements = currentWorkingSet.getElements();
if (!Arrays.equals(this.elements, newElements)) {
this.elements = newElements;
return true;
}
return false;
}
public IAdaptable[] getElements() {
return elements;
}
}