Selecting Tree Nodes Individually In Eclipse Tree Viewer
===

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):

    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()>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();
    	}

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. 

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. Perhaps that is the solution.

Thanks for any help