/******************************************************************************* * Copyright (c) 2011 Tasktop Technologies and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Tasktop Technologies - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.internal.tasks.ui.views; 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.ScheduledTaskContainer; import org.eclipse.mylyn.internal.tasks.core.TaskTask; import org.eclipse.mylyn.internal.tasks.ui.AbstractTaskListFilter; import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.tasks.core.IRepositoryQuery; import org.eclipse.mylyn.tasks.core.ITask; /** * @author Steffen Pingel */ public class PresentationFilter extends AbstractTaskListFilter { private static PresentationFilter instance = new PresentationFilter(); public static PresentationFilter getInstance() { return instance; } private boolean filterHiddenQueries; private boolean filterNonMatching; /** * @noreference This method is not intended to be referenced by clients. */ PresentationFilter() { updateSettings(); } public boolean isFilterHiddenQueries() { return filterHiddenQueries; } public boolean isFilterNonMatching() { return filterNonMatching; } @Override public boolean select(Object parent, Object element) { if (element instanceof IRepositoryQuery) { return selectQuery((IRepositoryQuery) element); } // only filter repository tasks if (element instanceof TaskTask) { return selectTask(parent, (TaskTask) element); } return true; } private boolean selectQuery(IRepositoryQuery query) { if (!filterHiddenQueries) { return true; } return !Boolean.parseBoolean(query.getAttribute(ITasksCoreConstants.ATTRIBUTE_HIDDEN)); } private boolean selectTask(Object parent, TaskTask task) { if (!filterNonMatching) { return true; } // tasks matching a query or category should be included if (isInVisibleQuery(task)) { return true; } // explicitly scheduled subtasks should be shown in those containers if (parent != null && parent.getClass().equals(ScheduledTaskContainer.class)) { return true; } return false; } public void setFilterHiddenQueries(boolean enabled) { this.filterHiddenQueries = enabled; } public void setFilterNonMatching(boolean filterSubtasks) { this.filterNonMatching = filterSubtasks; } public void updateSettings() { setFilterHiddenQueries( TasksUiPlugin.getDefault().getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.FILTER_HIDDEN)); setFilterNonMatching(TasksUiPlugin.getDefault() .getPreferenceStore() .getBoolean(ITasksUiPreferenceConstants.FILTER_NON_MATCHING)); } public boolean isInVisibleQuery(ITask task) { for (AbstractTaskContainer container : ((AbstractTask) task).getParentContainers()) { // categories and local subtasks are always visible if (container instanceof AbstractTaskCategory) { return true; } // show task if is contained in a query if (container instanceof IRepositoryQuery && selectQuery((IRepositoryQuery) container)) { return true; } } return false; } }