blob: fd80d03b312564f32dd5abce6c805f7cb88cc5ed [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2010 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
* 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());
} else {
searchResult = null;
clear();
}
}
/**
* @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 inResult = false;
Object[] resultElements = searchResult.getElements();
for (Object resultObject : resultElements) {
if (resultObject.equals(object)) {
inResult = true;
}
}
if (inResult) {
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);
}
} else {
if (object instanceof ITask) {
AbstractTask task = ((AbstractTask) object);
elements.remove(task);
String owner = task.getOwner();
if (owner == null) {
owner = Messages.SearchResultTreeContentProvider__unknown_;
}
Person person = owners.get(owner);
person.internalRemoveChild(task);
TaskGroup completeIncomplete = null;
if (task.isCompleted()) {
completeIncomplete = completeState.get(Messages.SearchResultTreeContentProvider_Complete);
} else {
completeIncomplete = completeState.get(Messages.SearchResultTreeContentProvider_Incomplete);
}
completeIncomplete.internalRemoveChild(task);
}
}
}
}
@Override
public void clear() {
elements.clear();
owners.clear();
completeState.clear();
}
public GroupBy getSelectedGroup() {
return selectedGroup;
}
public void setSelectedGroup(GroupBy selectedGroup) {
this.selectedGroup = selectedGroup;
}
}