TreeViewer

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.

.

You must be logged in to post a comment.