Category Tree
/****************************************************************************** * 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; } } }