Creating a TreeViewer
The following shows the steps involved in creating a TreeViewer. The order of these steps after instantiation doesn’t matter:
- Instantiate
- Layout
- Add listeners
- Set providers and sorter
// Instantiate and set expand level
treeViewer = new TreeViewer(this, SWT.BORDER);
treeViewer.setAutoExpandLevel(TreeViewer.ALL_LEVELS);
// set layout data
Tree tree = treeViewer.getTree();
tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));// Add a SelectionChangedListener
treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection sel = (IStructuredSelection) event.getSelection();
// do something with the selection here
}
});//Set the providers and sorter
treeViewer.setLabelProvider(new ViewerLabelProvider());
treeViewer.setContentProvider(new TreeContentProvider());
treeViewer.setSorter(new Sorter());
Setting Providers and Sorter
Implement Provider and Sorter through inner-classes.
- Sorter extends ViewerSorter
- ViewerLabelProvider extends LabelProvider
- TreeContentProvider implements ITreeContentProvider
private static class Sorter extends ViewerSorter {
public int compare(Viewer viewer, Object e1, Object e2) {
Workgroup item1 = (Workgroup) e1;
Workgroup item2 = (Workgroup) e2;
return item1.getName().compareTo(item2.getName());
}
}
private static class ViewerLabelProvider extends LabelProvider {
public Image getImage(Object element) {
return super.getImage(element);
}public String getText(Object element) {
Workgroup w = (Workgroup) element;
return w.getName();
}
}private static class TreeContentProvider implements ITreeContentProvider {
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}public void dispose() {
}public Object[] getElements(Object inputElement) {
Location location = (Location) inputElement;
Set<Workgroup> set = location.getWorkgroupSet();
return set.toArray();
}public Object[] getChildren(Object parentElement) {
Object[] result = new Object[0];
if (parentElement instanceof Location) {
Location location = (Location) parentElement;
Set<Workgroup> set = location.getWorkgroupSet();
result = set.toArray();
}
if (parentElement instanceof Workgroup) {
Workgroup workgroup = (Workgroup) parentElement;
Set<Workgroup> set = workgroup.getWorkgroupSet();
result = set.toArray();
}
return result;
}public Object getParent(Object element) {
Object result = null;
if (element instanceof Workgroup) {
Workgroup workgroup = (Workgroup) element;
if (workgroup.getParent() == null) {
result = workgroup.getLocation();
}
else {
result = workgroup.getParent();
}
}
return result;
}public boolean hasChildren(Object element) {
boolean result = false;
if (element instanceof Location) {
Location location = (Location) element;
Set<Workgroup> set = location.getWorkgroupSet();
result = set.size() > 0;
}
if (element instanceof Workgroup) {
Workgroup workgroup = (Workgroup) element;
Set<Workgroup> set = workgroup.getWorkgroupSet();
result = set.size() > 0;
}
return result;
}
}
Input object
The input object is set like any other viewer, using setInput:
this.treeViewer.setInput(location);
Updating the TreeViewer
The TreeViewer, like any other viewer, has to be updated manually. Whenever there is a change in the model, you should also change the viewer by using the add, remove and expand methods as shown in the following example.
protected void add(Workgroup workgroup) {
Workgroup parent = getSelectedWorkgroup(); // gets a reference to the parent node in the tree
parent.add(workgroup); // updates the model
this.treeViewer.add(parent, workgroup); // updates the viewer
this.treeViewer.expandAll(); // expands the tree
}
Removing nodes would follow the same logic through the remove() methods in the TreeViewer.
.