SWT Jface Eclipse Java

/******************************************************************************
 * Copyright (c) 1998, 2004 Jackwind Li Guojie
 * All right reserved. 
 * 
 * Created on Dec 28, 2003 7:56:40 PM by JACK
 * $Id$
 * 
 * visit: http://www.asprise.com/swt
 *****************************************************************************/
import java.util.Vector;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
public class CategoryTree {
  Display display = new Display();
  Shell shell = new Shell(display);
  
  final Tree tree = new Tree(shell, SWT.BORDER);
  
  Vector categories = new Vector();
  
  public CategoryTree() {
    Category category = new Category("Java libraries", null);
    categories.add(category);
    
    category = new Category("UI Toolkits", category);
    new Category("AWT", category);
    new Category("Swing", category);
    new Category("SWT/JFace", category);
    
    category = new Category("Java IDEs", null);
    categories.add(category);
    
    new Category("Eclipse", category);
    new Category("JBuilder", category);
  }
  
  /**
   * Builds up the tree with traditional approach. 
   *
   */
  public void traditional() {
    for(int i=0; categories != null && i < categories.size(); i++) {
      Category category = (Category)categories.elementAt(i);
      addCategory(null, category);
    }
  }
  
  /**
   * Adds a category to the tree (recursively).
   * @param parentItem
   * @param category
   */
  private void addCategory(TreeItem parentItem, Category category) {
    TreeItem item = null;
    if(parentItem == null) 
      item = new TreeItem(tree, SWT.NONE);
    else
      item = new TreeItem(parentItem, SWT.NONE);
    
    item.setText(category.getName());
    
    Vector subs = category.getSubCategories();
    for(int i=0; subs != null && i < subs.size(); i++)
      addCategory(item, (Category)subs.elementAt(i));
  }
  
  /**
   * Builds up the tree with MVC approach. 
   *
   */
  public void MVC() {
    
    TreeViewer treeViewer = new TreeViewer(tree);
    
    treeViewer.setContentProvider(new ITreeContentProvider() {
      public Object[] getChildren(Object parentElement) {
        Vector subcats = ((Category)parentElement).getSubCategories();
        return subcats == null ? new Object[0] : subcats.toArray();
      }
      
      public Object getParent(Object element) {
        return ((Category)element).getParent();
      }
      
      public boolean hasChildren(Object element) {
        return ((Category)element).getSubCategories() != null;
      }
      
      public Object[] getElements(Object inputElement) {
        if(inputElement != null && inputElement instanceof Vector) {
          return ((Vector)inputElement).toArray();
        }
        return new Object[0];
      }
      
      public void dispose() {
        // 
      }
      
      public void inputChanged(Viewer viewer,
                   Object oldInput,
                   Object newInput) {
        // 
      }
    });
    
    treeViewer.setLabelProvider(new LabelProvider() {
      public String getText(Object element) {
        return ((Category)element).getName();
      }
    });
    
    treeViewer.setInput(categories);
    
  }
  
  public void show() {
    tree.setSize(300, 200);
    shell.setSize(300, 200);
    
    shell.open();
    
    // Set up the event loop.
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        // If no more entries in event queue
        display.sleep();
      }
    }
    display.dispose();
  }
  
  public static void main(String[] args) {
    CategoryTree tree = new CategoryTree();
    //tree.traditional();
    tree.MVC();
    tree.show();
  }
  /**
   * Represents a category of items. 
   * The max level of categories is 2 only.
   *
   */
  class Category {
    private String name;
    private Vector subCategories;
    private Category parent;
    
    public Category(String name, Category parent) {
      this.name = name;
      this.parent = parent;
      if(parent != null)
        parent.addSubCategory(this);
    }
    
    public Vector getSubCategories() {
      return subCategories;
    }
    
    private void addSubCategory(Category subcategory) {
      if(subCategories == null)
        subCategories = new Vector();
      if(! subCategories.contains(subcategory))
        subCategories.add(subcategory);
    }
    
    public String getName() {
      return name;
    }
    
    public Category getParent() {
      return parent;
    }
  }  
  
}