package rocks.inspectit.ui.rcp.view.tree;
import org.eclipse.core.runtime.jobs.IJobChangeListener;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.progress.DeferredTreeContentManager;
import rocks.inspectit.ui.rcp.model.Composite;
import rocks.inspectit.ui.rcp.model.TreeModelManager;
import rocks.inspectit.ui.rcp.util.ListenerList;
/**
* The content provider for the tree viewer used for every single available CMR.
*
* @author Patrice Bouillet
*
*/
public class TreeContentProvider implements ITreeContentProvider {
/**
* The manager is used to access the deferred objects.
*/
private DeferredTreeContentManager manager;
/**
* Listeners that will be passed to the {@link DeferredTreeContentManager}.
*/
private ListenerList<IJobChangeListener> updateCompleteListenerList;
/**
* {@inheritDoc}
*/
@Override
public Object[] getChildren(Object parentElement) {
if (manager.isDeferredAdapter(parentElement)) {
Object[] children = manager.getChildren(parentElement);
return children;
} else if (parentElement instanceof Composite) {
// direct access to the children
Composite composite = (Composite) parentElement;
return composite.getChildren().toArray();
}
return new Object[0];
}
/**
* {@inheritDoc}
*/
@Override
public Object getParent(Object element) {
if (element instanceof Composite) {
Composite composite = (Composite) element;
return composite.getParent();
}
return null;
}
/**
* {@inheritDoc}
*/
@Override
public boolean hasChildren(Object element) {
if (null == element) {
return false;
}
if (manager.isDeferredAdapter(element)) {
return manager.mayHaveChildren(element);
}
if (element instanceof Composite) {
Composite composite = (Composite) element;
return composite.hasChildren();
}
return false;
}
/**
* {@inheritDoc}
*/
@Override
public Object[] getElements(Object inputElement) {
TreeModelManager treeModelManager = (TreeModelManager) inputElement;
return treeModelManager.getRootElements();
}
/**
* {@inheritDoc}
*/
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
manager = new DeferredTreeContentManager((AbstractTreeViewer) viewer);
if (null != updateCompleteListenerList) {
for (IJobChangeListener iJobChangeListener : updateCompleteListenerList) {
manager.addUpdateCompleteListener(iJobChangeListener);
}
}
}
/**
* Adds the listener to the update job that updates the elements. The listener will be added to
* the {@link DeferredTreeContentManager} if one is initialized. In any case the listener will
* be added when the new manager is initialized in the future.
*
* @param listener
* {@link IJobChangeListener}
*/
public void addUpdateCompleteListener(IJobChangeListener listener) {
if (null == updateCompleteListenerList) {
updateCompleteListenerList = new ListenerList<>();
}
updateCompleteListenerList.add(listener);
if (null != manager) {
manager.addUpdateCompleteListener(listener);
}
}
/**
* Adds the listener to the update job that updates the elements. The listener will be removed
* from the {@link DeferredTreeContentManager} if one is initialized.
*
* @param listener
* {@link IJobChangeListener}
*/
public void removeUpdateCompleteListener(IJobChangeListener listener) {
if (null != updateCompleteListenerList) {
updateCompleteListenerList.remove(listener);
}
if (null != manager) {
manager.removeUpdateCompleteListener(listener);
}
}
/**
* {@inheritDoc}
*/
@Override
public void dispose() {
}
}