/*******************************************************************************
* Copyright (c) 2010, 2013 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 java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.mylyn.commons.repositories.core.RepositoryCategory;
import org.eclipse.mylyn.internal.tasks.core.IRepositoryChangeListener;
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryAdapter;
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryChangeEvent;
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryDelta;
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryDelta.Type;
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.swt.widgets.Display;
/**
* @author Robert Elves
* @author Steffen Pingel
*/
public class TaskRepositoriesNavigatorContentProvider implements ITreeContentProvider {
private static final Object[] EMPTY_ARRAY = new Object[0];
private final TaskRepositoryManager manager;
private Viewer viewer;
private Listener listener;
private class Listener extends TaskRepositoryAdapter implements IRepositoryChangeListener {
@Override
public void repositoryAdded(TaskRepository repository) {
refresh(repository);
}
protected void refresh(TaskRepository repository) {
if (viewer != null) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if (viewer != null && viewer.getControl() != null && !viewer.getControl().isDisposed()) {
viewer.refresh();
}
}
});
}
}
@Override
public void repositoryRemoved(TaskRepository repository) {
refresh(repository);
}
@Override
public void repositoryUrlChanged(TaskRepository repository, String oldUrl) {
refresh(repository);
}
public void repositoryChanged(TaskRepositoryChangeEvent event) {
Type type = event.getDelta().getType();
if (type == TaskRepositoryDelta.Type.ALL || type == TaskRepositoryDelta.Type.PROPERTY
|| type == TaskRepositoryDelta.Type.OFFLINE) {
refresh(event.getRepository());
}
}
}
public TaskRepositoriesNavigatorContentProvider() {
manager = ((TaskRepositoryManager) TasksUi.getRepositoryManager());
}
public void dispose() {
if (listener != null) {
manager.removeListener(listener);
listener = null;
}
}
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof RepositoryCategory) {
List<TaskRepository> repositories = TasksUi.getRepositoryManager().getAllRepositories();
RepositoryCategory category = (RepositoryCategory) parentElement;
if (RepositoryCategory.ID_CATEGORY_ALL.equals(category.getId())) {
return repositories.toArray();
} else if (RepositoryCategory.ID_CATEGORY_OTHER.equals(category.getId())) {
Set<Object> items = new HashSet<Object>();
for (TaskRepository repository : repositories) {
if (repository.getCategory() == null) {
items.add(repository);
}
}
return items.toArray();
} else {
Set<Object> items = new HashSet<Object>();
for (TaskRepository repository : repositories) {
if (category.getId().equals(repository.getCategory())) {
items.add(repository);
}
}
return items.toArray();
}
}
return EMPTY_ARRAY;
}
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
public Object getParent(Object element) {
return null;
}
public boolean hasChildren(Object element) {
return getChildren(element).length > 0;
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
if (listener != null) {
manager.removeListener(listener);
listener = null;
}
this.viewer = viewer;
if (newInput != null) {
listener = new Listener();
manager.addListener(listener);
}
}
}