blob: 0afc59d6fb11c7f468367a947ea1d5d7a524869a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2008 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
* Frank Becker - improvements
*******************************************************************************/
package org.eclipse.mylyn.internal.tasks.ui.search;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
import org.eclipse.mylyn.internal.tasks.core.Person;
import org.eclipse.mylyn.internal.tasks.core.TaskGroup;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.ITaskContainer;
/**
* This implementation of <code>SearchResultContentProvider</code> is used for the table view of a Bugzilla search
* result.
*
* @author Rob Elves (moved into task.ui)
* @author Mik Kersten
*/
public class SearchResultTreeContentProvider extends SearchResultContentProvider {
private final Set<Object> elements = new LinkedHashSet<Object>();
private final Map<String, Person> owners = new HashMap<String, Person>();
private final Map<String, TaskGroup> completeState = new HashMap<String, TaskGroup>();
public enum GroupBy {
NONE, OWNER, COMPLETION;
}
private GroupBy selectedGroup;
public SearchResultTreeContentProvider() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
if (newInput instanceof RepositorySearchResult) {
searchResult = (RepositorySearchResult) newInput;
clear();
elementsChanged(searchResult.getElements());
}
}
/**
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
public Object[] getElements(Object inputElement) {
if (inputElement == searchResult) {
if (selectedGroup == GroupBy.OWNER) {
return owners.values().toArray();
} else if (selectedGroup == GroupBy.COMPLETION) {
return completeState.values().toArray();
} else {
return elements.toArray();
}
} else {
return EMPTY_ARR;
}
}
public Object[] getChildren(Object parent) {
if (parent instanceof TaskGroup || parent instanceof Person) {
return ((ITaskContainer) parent).getChildren().toArray();
} else {
return EMPTY_ARR;
}
}
public Object getParent(Object element) {
return null;
}
public boolean hasChildren(Object element) {
return getChildren(element).length > 0;
}
@Override
public void elementsChanged(Object[] updatedElements) {
for (Object object : updatedElements) {
boolean added = elements.add(object);
if (added && object instanceof ITask) {
AbstractTask task = ((AbstractTask) object);
String owner = task.getOwner();
if (owner == null) {
owner = Messages.SearchResultTreeContentProvider__unknown_;
}
Person person = owners.get(owner);
if (person == null) {
person = new Person(owner, task.getConnectorKind(), task.getRepositoryUrl());
owners.put(owner, person);
}
person.internalAddChild(task);
TaskGroup completeIncomplete = null;
if (task.isCompleted()) {
completeIncomplete = completeState.get(Messages.SearchResultTreeContentProvider_Complete);
if (completeIncomplete == null) {
completeIncomplete = new TaskGroup("group-complete", Messages.SearchResultTreeContentProvider_Complete, GroupBy.COMPLETION.name()); //$NON-NLS-1$
completeState.put(Messages.SearchResultTreeContentProvider_Complete, completeIncomplete);
}
} else {
completeIncomplete = completeState.get(Messages.SearchResultTreeContentProvider_Incomplete);
if (completeIncomplete == null) {
completeIncomplete = new TaskGroup("group-incomplete", Messages.SearchResultTreeContentProvider_Incomplete, GroupBy.COMPLETION.name()); //$NON-NLS-1$
completeState.put(Messages.SearchResultTreeContentProvider_Incomplete, completeIncomplete);
}
}
completeIncomplete.internalAddChild(task);
}
}
}
@Override
public void clear() {
elements.clear();
owners.clear();
completeState.clear();
}
public GroupBy getSelectedGroup() {
return selectedGroup;
}
public void setSelectedGroup(GroupBy selectedGroup) {
this.selectedGroup = selectedGroup;
}
}