/*******************************************************************************
* Copyright (c) 2008
* The code, documentation and other materials contained herein have been
* licensed under the Eclipse Public License - v 1.0 by the individual
* copyright holders listed below, as Initial Contributors under such license.
* The text of such license is available at
* http://www.eclipse.org/legal/epl-v10.html.
*
* Contributors:
* Henrik Lindberg
*******************************************************************************/
package org.eclipse.buckminster.generic.ui.providers;
import org.eclipse.buckminster.generic.model.tree.ITreeDataListener;
import org.eclipse.buckminster.generic.model.tree.ITreeDataNode;
import org.eclipse.buckminster.generic.model.tree.ITreeParentDataNode;
import org.eclipse.buckminster.generic.model.tree.ITreeRootNode;
import org.eclipse.buckminster.generic.model.tree.TreeDataEvent;
import org.eclipse.buckminster.generic.ui.Messages;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
/**
* The TreeDataNodeContentProvider uses an ITreeRootNode to hold the tree's
* data.
*
* This content provider registers itself as a listener to change in the
* ITreeRootNode and refreshes the view when events occur. A UI safe
* implementation of ITreeRootNode must be used.
*
* @author Henrik Lindberg
*
*/
public abstract class TreeDataNodeContentProvider implements IStructuredContentProvider, ITreeContentProvider, ITreeDataListener {
private ITreeRootNode invisibleRoot;
private TreeViewer treeViewer;
@Override
public void dispose() {
invisibleRoot.removeTreeDataListener(this);
}
@Override
public Object[] getChildren(Object parent) {
if (parent instanceof ITreeParentDataNode) {
return ((ITreeParentDataNode) parent).getChildren();
}
return new Object[0];
}
@Override
public Object[] getElements(Object parent) {
// if asking for the data that was used to build a tree, then return the
// root holding the tree.
// the previous version used the ViewSite as this outermost parent
// but that only works for a content provider where the tree always
// shows the same content
//
if (!(parent instanceof ITreeDataNode)) // Was (parent instanceof
// IViewSite)
{
if (invisibleRoot == null)
initialize();
return getChildren(invisibleRoot);
}
return getChildren(parent);
}
@Override
public Object getParent(Object child) {
if (child instanceof ITreeDataNode) {
return ((ITreeDataNode) child).getParent();
}
return null;
}
@Override
public boolean hasChildren(Object parent) {
if (parent instanceof ITreeParentDataNode)
return ((ITreeParentDataNode) parent).hasChildren();
return false;
}
@Override
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
if (!(v instanceof TreeViewer))
throw new IllegalArgumentException(Messages.only_TreeView_accepted);
treeViewer = (TreeViewer) v;
}
@Override
public void treeNodeChanged(TreeDataEvent event) {
switch (event.getType()) {
case CHANGE:
// if the changed node is the root node - refresh the entire
// tree
if (event.getNode() instanceof ITreeRootNode)
treeViewer.refresh();
else
treeViewer.refresh(event.getNode());
break;
}
}
protected ITreeParentDataNode getHiddenRoot() {
return invisibleRoot;
}
/*
* Initialize the hidden root. Should call setHiddenRoot() with the root to
* use.
*/
protected abstract void initialize();
protected void setHiddenRoot(ITreeRootNode hiddenRoot) {
if (invisibleRoot != null)
invisibleRoot.removeTreeDataListener(this);
invisibleRoot = hiddenRoot;
invisibleRoot.addTreeDataListener(this);
}
}