| /******************************************************************************* |
| * Copyright (c) 2002, 2005 IBM Corporation 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: |
| * IBM - Initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.core.tools; |
| |
| import org.eclipse.jface.viewers.ITreeContentProvider; |
| import org.eclipse.jface.viewers.Viewer; |
| |
| /** |
| * An abstract base class for hierarchical content providers. Uses |
| * <code>TreeContentProviderNode</code> objects to keep a hierarchical |
| * data model. Subclasses must provide an implementation for the |
| * <code>#rebuild(Object)</code> operation in order to define how the data model |
| * will be built upon a given input provided by the viewer. |
| */ |
| |
| public abstract class AbstractTreeContentProvider implements ITreeContentProvider { |
| |
| /** |
| * Flag for omitting the root or not when providing the contents. |
| */ |
| private boolean omitRoot; |
| |
| /** |
| * The root node. |
| */ |
| private TreeContentProviderNode rootNode; |
| |
| /** |
| * Constructs a AbstractTreeContentProvider. |
| * |
| * @param omitRoot if true, the root node will be omitted when providing |
| * contents. |
| */ |
| protected AbstractTreeContentProvider(boolean omitRoot) { |
| this.omitRoot = omitRoot; |
| } |
| |
| /** |
| * Constructs a AbstractTreeContentProvider that will omit the root node when |
| * providing contents. |
| * |
| * @see #AbstractTreeContentProvider(boolean) |
| */ |
| protected AbstractTreeContentProvider() { |
| this(true); |
| } |
| |
| /** |
| * Returns the child elements of the given parent element. |
| * |
| * @return an array containing <code>parentElement</code>'s children. |
| * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren( |
| * java.lang.Object) |
| * @see org.eclipse.core.tools.TreeContentProviderNode#getChildren() |
| */ |
| public Object[] getChildren(Object parentElement) { |
| if (!(parentElement instanceof TreeContentProviderNode)) |
| return null; |
| |
| TreeContentProviderNode treeNode = (TreeContentProviderNode) parentElement; |
| return treeNode.getChildren(); |
| } |
| |
| /** |
| * Returns the parent for the given element, or <code>null</code> |
| * indicating that the parent can't be computed. |
| * |
| * @return <coded>element</code>'s parent node or null, if it is a root node |
| * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent( |
| * java.lang.Object) |
| * @see org.eclipse.core.tools.TreeContentProviderNode#getParent() |
| */ |
| public Object getParent(Object element) { |
| if (!(element instanceof TreeContentProviderNode)) |
| return null; |
| |
| TreeContentProviderNode treeNode = (TreeContentProviderNode) element; |
| return treeNode.getParent(); |
| } |
| |
| /** |
| * Returns whether the given element has children. |
| * |
| * @return true, if <code>element</code> has children, false otherwise |
| * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren( |
| * java.lang.Object) |
| * @see org.eclipse.core.tools.TreeContentProviderNode#hasChildren() * |
| */ |
| public boolean hasChildren(Object element) { |
| return element instanceof TreeContentProviderNode && ((TreeContentProviderNode) element).hasChildren(); |
| } |
| |
| /** |
| * Returns the elements to display in the viewer |
| * when its input is set to the given element. |
| * |
| * @return this content provider root element's children |
| * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements( |
| * java.lang.Object) |
| */ |
| public Object[] getElements(Object inputElement) { |
| if (rootNode == null) |
| return new Object[0]; |
| |
| return omitRoot ? rootNode.getChildren() : new Object[] {rootNode}; |
| } |
| |
| /** |
| * Disposes of this content provider. |
| * This is called by the viewer when it is disposed. |
| * |
| * @see org.eclipse.jface.viewers.IContentProvider#dispose() |
| */ |
| public void dispose() { |
| rootNode = null; |
| } |
| |
| /** |
| * Helper method that creates a root node given a node name and value. |
| * |
| * @param name the name of the node |
| * @param value the value of the node. May be null. |
| * @return the tree node created |
| * @see TreeContentProviderNode#TreeContentProviderNode(String, Object) |
| */ |
| protected TreeContentProviderNode createNode(String name, Object value) { |
| return new TreeContentProviderNode(name, value); |
| } |
| |
| /** |
| * Helper method that creates a root node given a node name and no value. |
| * |
| * @param name the name of the node |
| * @return the tree node created |
| * @see TreeContentProviderNode#TreeContentProviderNode(String) |
| */ |
| protected TreeContentProviderNode createNode(String name) { |
| return new TreeContentProviderNode(name); |
| } |
| |
| /** |
| * Notifies this content provider that the given viewer's input |
| * has been switched to a different element. |
| * Rebuilds this content provider's state from a given resource. |
| * |
| * @param viewer the viewer |
| * @param oldInput ignored |
| * @param input the new input. If null, clears this content provider. If not, |
| * is passed in a call to <code>rebuild(Object)</code>. |
| * @see |
| * org.eclipse.jface.viewers.IContentProvider#inputChanged( |
| * org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) |
| * @see #rebuild(Viewer, Object) |
| */ |
| public void inputChanged(Viewer viewer, Object oldInput, final Object input) { |
| if (input == null) { |
| rootNode = createNode("root"); //$NON-NLS-1$ |
| return; |
| } |
| |
| if (!acceptInput(input)) |
| return; |
| |
| rootNode = createNode("root"); //$NON-NLS-1$ |
| rebuild(viewer, input); |
| } |
| |
| /** |
| * Reconstructs this content provider data model upon the provided input object. |
| * |
| * @param input the new input object - must not be null |
| * @param viewer the corresponding viewer |
| */ |
| protected abstract void rebuild(Viewer viewer, Object input); |
| |
| /** |
| * Returns true if the provided input is accepted by this content provider. |
| * |
| * @param input an input object |
| * @return boolean true if the provided object is accepted, false otherwise |
| */ |
| protected abstract boolean acceptInput(Object input); |
| |
| /** |
| * Returns the rootNode. |
| * |
| * @return this content provider root node |
| */ |
| protected TreeContentProviderNode getRootNode() { |
| return rootNode; |
| } |
| |
| } |