title: Selecting Tree Nodes Individually In Eclipse Tree Viewer
body: <p>I have a piece of code with a tree viewer as part of an eclipse plugin. The code is here (this is directly taken from the eclipse PDE sample tree view):</p>
  
  <pre><code>public class SampleView extends ViewPart {
  
      /**
       * The ID of the view as specified by the extension.
       */
      public static final String ID = "com.test2.views.SampleView";
  
      private TreeViewer viewer;
      private DrillDownAdapter drillDownAdapter;
      private Action action1;
      private Action action2;
      private Action doubleClickAction;
  
      /*
       * The content provider class is responsible for
       * providing objects to the view. It can wrap
       * existing objects in adapters or simply return
       * objects as-is. These objects may be sensitive
       * to the current input of the view, or ignore
       * it and always show the same content 
       * (like Task List, for example).
       */
  
      class TreeObject implements IAdaptable {
          private String name;
          private TreeParent parent;
  
          public TreeObject(String name) {
              this.name = name;
          }
          public String getName() {
              return name;
          }
          public void setParent(TreeParent parent) {
              this.parent = parent;
          }
          public TreeParent getParent() {
              return parent;
          }
          public String toString() {
              return getName();
          }
          public Object getAdapter(Class key) {
              return null;
          }
      }
  
      class TreeParent extends TreeObject {
          private ArrayList children;
          public TreeParent(String name) {
              super(name);
              children = new ArrayList();
          }
          public void addChild(TreeObject child) {
              children.add(child);
              child.setParent(this);
          }
          public void removeChild(TreeObject child) {
              children.remove(child);
              child.setParent(null);
          }
          public TreeObject [] getChildren() {
              return (TreeObject [])children.toArray(new TreeObject[children.size()]);
          }
          public boolean hasChildren() {
              return children.size()&gt;0;
          }
      }
  
      class ViewContentProvider implements IStructuredContentProvider, 
                                             ITreeContentProvider {
          private TreeParent invisibleRoot;
  
          public void inputChanged(Viewer v, Object oldInput, Object newInput) {
          }
          public void dispose() {
          }
          public Object[] getElements(Object parent) {
              if (parent.equals(getViewSite())) {
                  if (invisibleRoot==null) initialize();
                  return getChildren(invisibleRoot);
              }
              return getChildren(parent);
          }
          public Object getParent(Object child) {
              if (child instanceof TreeObject) {
                  return ((TreeObject)child).getParent();
              }
              return null;
          }
          public Object [] getChildren(Object parent) {
              if (parent instanceof TreeParent) {
                  return ((TreeParent)parent).getChildren();
              }
              return new Object[0];
          }
          public boolean hasChildren(Object parent) {
              if (parent instanceof TreeParent)
                  return ((TreeParent)parent).hasChildren();
              return false;
          }
  /*
   * We will set up a dummy model to initialize tree heararchy.
   * In a real code, you will connect to a real model and
   * expose its hierarchy.
   */
          private void initialize() {
              TreeObject to1 = new TreeObject("Leaf 1");
              TreeObject to2 = new TreeObject("Leaf 2");
              TreeObject to3 = new TreeObject("Leaf 3");
              TreeParent p1 = new TreeParent("Parent 1");
              p1.addChild(to1);
              p1.addChild(to2);
              p1.addChild(to3);
  
              TreeObject to4 = new TreeObject("Leaf 4");
              TreeParent p2 = new TreeParent("Parent 2");
              p2.addChild(to4);
  
              TreeParent root = new TreeParent("Root");
              root.addChild(p1);
              root.addChild(p2);
  
              invisibleRoot = new TreeParent("");
              invisibleRoot.addChild(root);
          }
      }
      class ViewLabelProvider extends LabelProvider {
  
          public String getText(Object obj) {
              return obj.toString();
          }
          public Image getImage(Object obj) {
              String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
              if (obj instanceof TreeParent)
                 imageKey = ISharedImages.IMG_OBJ_FOLDER;
              return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
          }
      }
      class NameSorter extends ViewerSorter {
      }
  
      /**
       * The constructor.
       */
      public SampleView() {
      }
  
      /**
       * This is a callback that will allow us
       * to create the viewer and initialize it.
       */
      public void createPartControl(Composite parent) {
          viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
          drillDownAdapter = new DrillDownAdapter(viewer);
          viewer.setContentProvider(new ViewContentProvider());
          viewer.setLabelProvider(new ViewLabelProvider());
          viewer.setSorter(new NameSorter());
          viewer.setInput(getViewSite());
  
          // Create the help context id for the viewer's control
          PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), "com.test2.viewer");
          makeActions();
          hookContextMenu();
          hookDoubleClickAction();
          contributeToActionBars();
      }
  </code></pre>
  
  <p>I want to somehow be able to individually go through all the nodes on the tree and control the way they are expanded or collapsed. Basically I just want to know how to be able to iterate through all the nodes on the tree to adjust settings individually. </p>
  
  <p>This should be a simple problem but I haven't seemed to find anything that works...
  I'm trying to figure out how exactly getItem() for TreeViewer objects works. But then the problem is even if I get the item, I can't (or am not sure about how to) modify it.</p>
  
  <p>Thanks for any help</p>