blob: dbc0dc54610dc0e8fc987dd51c2a996dd02287d3 [file] [log] [blame]
/**********************************************************************
Copyright (c) 2000, 2002 IBM Corp. and others.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Common Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/cpl-v10.html
Contributors:
IBM Corporation - Initial implementation
**********************************************************************/
package org.eclipse.jface.viewers;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.TreeListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.jface.util.Assert;
/**
* A concrete viewer based on an SWT <code>Tree</code> control.
* <p>
* This class is not intended to be subclassed outside the viewer framework.
* It is designed to be instantiated with a pre-existing SWT tree control and configured
* with a domain-specific content provider, label provider, element filter (optional),
* and element sorter (optional).
* </p>
* <p>
* Content providers for tree viewers must implement the <code>ITreeContentProvider</code>
* interface.
* </p>
*/
public class TreeViewer extends AbstractTreeViewer {
/**
* This viewer's control.
*/
private Tree tree;
/**
* Creates a tree viewer on a newly-created tree control under the given parent.
* The tree control is created using the SWT style bits <code>MULTI, H_SCROLL, V_SCROLL,</code> and <code>BORDER</code>.
* The viewer has no input, no content provider, a default label provider,
* no sorter, and no filters.
*
* @param parent the parent control
*/
public TreeViewer(Composite parent) {
this(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
}
/**
* Creates a tree viewer on a newly-created tree control under the given parent.
* The tree control is created using the given SWT style bits.
* The viewer has no input, no content provider, a default label provider,
* no sorter, and no filters.
* The tree control has the MULTI, H_SCROLL, V_SCROLL and BORDER style bits set.
*
* @param parent the parent control
* @param style the SWT style bits
*/
public TreeViewer(Composite parent, int style) {
this(new Tree(parent, style));
}
/**
* Creates a tree viewer on the given tree control.
* The viewer has no input, no content provider, a default label provider,
* no sorter, and no filters.
*
* @param tree the tree control
*/
public TreeViewer(Tree tree) {
super();
this.tree = tree;
hookControl(tree);
}
/* (non-Javadoc)
* Method declared in AbstractTreeViewer.
*/
protected void addTreeListener(Control c, TreeListener listener) {
((Tree)c).addTreeListener(listener);
}
/* (non-Javadoc)
* Method declared in AbstractTreeViewer.
*/
protected void doUpdateItem(Item item, Object element) {
// update icon and label
ILabelProvider provider = (ILabelProvider) getLabelProvider();
item.setText(provider.getText(element));
Image image = provider.getImage(element);
if (image != null || item.getImage() != null) {
item.setImage(image);
}
if (provider instanceof IColorProvider) {
IColorProvider cp = (IColorProvider) provider;
TreeItem treeItem = (TreeItem) item;
treeItem.setForeground(cp.getForeground(element));
treeItem.setBackground(cp.getBackground(element));
}
}
/* (non-Javadoc)
* Method declared in AbstractTreeViewer.
*/
protected Item[] getChildren(Widget o) {
if (o instanceof TreeItem)
return ((TreeItem) o).getItems();
if (o instanceof Tree)
return ((Tree) o).getItems();
return null;
}
/* (non-Javadoc)
* Method declared in Viewer.
*/
public Control getControl() {
return tree;
}
/* (non-Javadoc)
* Method declared in AbstractTreeViewer.
*/
protected boolean getExpanded(Item item) {
return ((TreeItem) item).getExpanded();
}
/* (non-Javadoc)
* Method declared in StructuredViewer.
*/
protected Item getItem(int x, int y) {
return getTree().getItem(getTree().toControl(new Point(x, y)));
}
/* (non-Javadoc)
* Method declared in AbstractTreeViewer.
*/
protected int getItemCount(Control widget) {
return ((Tree) widget).getItemCount();
}
/* (non-Javadoc)
* Method declared in AbstractTreeViewer.
*/
protected int getItemCount(Item item) {
return ((TreeItem) item).getItemCount();
}
/* (non-Javadoc)
* Method declared in AbstractTreeViewer.
*/
protected Item[] getItems(Item item) {
return ((TreeItem) item).getItems();
}
/**
* The tree viewer implementation of this <code>Viewer</code> framework
* method returns the label provider, which in the case of tree
* viewers will be an instance of <code>ILabelProvider</code>.
*/
public IBaseLabelProvider getLabelProvider() {
return super.getLabelProvider();
}
/* (non-Javadoc)
* Method declared in AbstractTreeViewer.
*/
protected Item getParentItem(Item item) {
return ((TreeItem)item).getParentItem();
}
/* (non-Javadoc)
* Method declared in AbstractTreeViewer.
*/
protected Item[] getSelection(Control widget) {
return ((Tree) widget).getSelection();
}
/**
* Returns this tree viewer's tree control.
*
* @return the tree control
*/
public Tree getTree() {
return tree;
}
/* (non-Javadoc)
* Method declared in AbstractTreeViewer.
*/
protected Item newItem(Widget parent, int flags, int ix) {
TreeItem item;
if (ix >= 0) {
if (parent instanceof TreeItem)
item = new TreeItem((TreeItem) parent, flags, ix);
else
item = new TreeItem((Tree) parent, flags, ix);
} else {
if (parent instanceof TreeItem)
item = new TreeItem((TreeItem) parent, flags);
else
item = new TreeItem((Tree) parent, flags);
}
return item;
}
/* (non-Javadoc)
* Method declared in AbstractTreeViewer.
*/
protected void removeAll(Control widget) {
((Tree) widget).removeAll();
}
/* (non-Javadoc)
* Method declared in AbstractTreeViewer.
*/
protected void setExpanded(Item node, boolean expand) {
((TreeItem) node).setExpanded(expand);
}
/**
* The tree viewer implementation of this <code>Viewer</code> framework
* method ensures that the given label provider is an instance
* of <code>ILabelProvider</code>.
*/
public void setLabelProvider(IBaseLabelProvider labelProvider) {
Assert.isTrue(labelProvider instanceof ILabelProvider);
super.setLabelProvider(labelProvider);
}
/* (non-Javadoc)
* Method declared in AbstractTreeViewer.
*/
protected void setSelection(List items) {
TreeItem[] newItems = new TreeItem[items.size()];
items.toArray(newItems);
getTree().setSelection(newItems);
}
/* (non-Javadoc)
* Method declared in AbstractTreeViewer.
*/
protected void showItem(Item item) {
getTree().showItem((TreeItem)item);
}
}