package org.bundlemaker.core.ui.projecteditor;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.bundlemaker.core.project.BundleMakerProjectDescriptionChangedEvent;
import org.bundlemaker.core.project.IBundleMakerProjectChangedListener;
import org.bundlemaker.core.project.IProjectContentProvider;
import org.bundlemaker.core.project.IProjectDescriptionAwareBundleMakerProject;
import org.bundlemaker.core.ui.projecteditor.provider.IProjectContentProviderEditor;
import org.bundlemaker.core.ui.projecteditor.provider.internal.ProjectEditorContributionRegistry;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Display;
/**
* <p>
* </p>
*
* @author Nils Hartmann (nils@nilshartmann.net)
* @author Gerd Wütherich (gerd@gerd-wuetherich.de)
*/
public class ProjectEditorTreeViewerContentProvider implements ITreeContentProvider {
/** - */
private final static Object[] EMPTY_RESULT = new Object[0];
/** - */
private final ProjectEditorContributionRegistry _projectEditorContributionRegistry;
/** - */
private Viewer _viewer;
/** - */
private IBundleMakerProjectChangedListener _listener;
/**
* <p>
* Creates a new instance of type {@link ProjectEditorTreeViewerContentProvider}.
* </p>
*
* @param projectContentProviderEditorRegistry
*/
public ProjectEditorTreeViewerContentProvider(
ProjectEditorContributionRegistry projectContentProviderEditorRegistry) {
//
Assert.isNotNull(projectContentProviderEditorRegistry);
//
_projectEditorContributionRegistry = projectContentProviderEditorRegistry;
//
_listener = new IBundleMakerProjectChangedListener.Adapter() {
/**
* {@inheritDoc}
*/
@Override
public void projectDescriptionChanged(BundleMakerProjectDescriptionChangedEvent event) {
if (event.getType().equals(BundleMakerProjectDescriptionChangedEvent.Type.PROJECT_DESCRIPTION_RECOMPUTED) && _viewer != null) {
// async refresh
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
if (!(_viewer instanceof ColumnViewer) || !((ColumnViewer) _viewer).isBusy()) {
_viewer.refresh();
}
}
});
}
}
};
}
/**
* {@inheritDoc}
*/
@Override
public void dispose() {
//
}
/**
* {@inheritDoc}
*/
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// the viewer
_viewer = viewer;
//
if (newInput != null) {
((IProjectDescriptionAwareBundleMakerProject) newInput).addBundleMakerProjectChangedListener(_listener);
}
//
if (oldInput != null) {
((IProjectDescriptionAwareBundleMakerProject) oldInput).removeBundleMakerProjectChangedListener(_listener);
}
}
/**
* {@inheritDoc}
*/
@Override
public Object[] getElements(Object inputElement) {
// cast to IBundleMakerProject
IProjectDescriptionAwareBundleMakerProject bundleMakerProject = (IProjectDescriptionAwareBundleMakerProject) inputElement;
// create the result
List<Object> result = new LinkedList<Object>();
List<? extends IProjectContentProvider> contentProviders = bundleMakerProject.getModifiableProjectDescription()
.getContentProviders();
for (IProjectContentProvider iProjectContentProvider : contentProviders) {
Set<IProjectContentProviderEditor> projectContentProviderEditors = _projectEditorContributionRegistry
.getContentProviderEditors();
for (IProjectContentProviderEditor iProjectContentProviderEditor : projectContentProviderEditors) {
if (iProjectContentProviderEditor.canHandle(iProjectContentProvider)) {
Object rootElement = iProjectContentProviderEditor
.getRootElement(bundleMakerProject, iProjectContentProvider);
if (rootElement != null) {
ProjectEditorTreeViewerElement treeViewerElement = new ProjectEditorTreeViewerElement(bundleMakerProject,
iProjectContentProvider, rootElement, iProjectContentProviderEditor);
result.add(treeViewerElement);
break;
}
}
}
}
return result.toArray();
}
/**
* {@inheritDoc}
*/
@Override
public Object[] getChildren(Object parent) {
if (!(parent instanceof ProjectEditorTreeViewerElement)) {
// should not happen. in case it does, simply ignore the entry
return EMPTY_RESULT;
}
ProjectEditorTreeViewerElement parentElement = (ProjectEditorTreeViewerElement) parent;
List<? extends Object> children = null;
// Ask provider for children
try {
children = parentElement.getProvidingEditor().getChildren(parentElement.getBundleMakerProject(),
parentElement.getProjectContentProvider(), parentElement.getElement());
} catch (Exception ex) {
Activator.logError("Error while retrieving children for project editor: " + ex, ex);
}
if (children == null || children.isEmpty()) {
return EMPTY_RESULT;
}
// Wrap returned elements in TreeViewerElement objects
List<Object> result = new LinkedList<Object>();
for (Object child : children) {
result.add(parentElement.deriveChild(child));
}
return result.toArray();
}
/**
* {@inheritDoc}
*/
@Override
public boolean hasChildren(Object element) {
if (!(element instanceof ProjectEditorTreeViewerElement)) {
// should not happen. in case it does, simply ignore the entry
return false;
}
ProjectEditorTreeViewerElement parentElement = (ProjectEditorTreeViewerElement) element;
Object candidate = parentElement.getElement();
if (candidate instanceof IProjectContentProvider) {
// Project content provider should always have childs. Don't ask to save performance
// in cases where getting the actual content is expensive
return true;
}
return getChildren(element).length > 0;
}
/**
* {@inheritDoc}
*/
@Override
public Object getParent(Object element) {
return null;
}
}