1) TreeNode
2) TreeLableProvider, TreeContentProvider
3) Create TreeViewer
4) Add init data
/**
* It's used by TreeViewer
* TreeNode root = new TreeNode("Root");
* treeViewer = new TreeViewer(container, SWT.BORDER);
* treeViewer.setLabelProvider(new TreeLableProvider());
* treeViewer.setContentProvider(new TreeContentProvider());
* treeViewer.setInput(root);
*
* The root node has no parent
*
* @author Louis
*/
public class TreeNode {
//Root has no parent
public TreeNode parent;
public String name;
public List<TreeNode> chidren = new ArrayList<TreeNode>();
public TreeNode(String name) {
this.name = name;
}
public TreeNode(String name, TreeNode parent) {
this.name = name;
this.parent = parent;
if (parent != null)
parent.chidren.add(this);
}
public TreeNode(String name, TreeNode parent, List<TreeNode> children) {
this.name = name;
this.parent = parent;
this.chidren = children;
if (parent != null)
parent.chidren.add(this);
}
public void addChild(String childName) {
new TreeNode(childName, this);
}
public TreeNode getParent() {
return parent;
}
public void setParent(TreeNode parent) {
this.parent = parent;
}
public void setChidren(List<TreeNode> chidren) {
this.chidren = chidren;
}
public TreeNode getChildNode(String nodeName) {
return getChild(this, nodeName);
}
public List<TreeNode> getChidren() {
return chidren;
}
public TreeNode getChild(String nodeName) {
for (TreeNode child : chidren) {
if (child.name.equals(nodeName)) {
return child;
}
}
return null;
}
public TreeNode getChild(TreeNode parent, String nodeName) {
for (TreeNode child : parent.chidren) {
if (child.name.equals(nodeName)) {
return child;
}
}
return null;
}
public boolean hasChild() {
return this.chidren.size() > 0;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return name == null ? "" : name;
}
public int hashCode() {
return (name == null) ? 0 : name.hashCode();
}
}
2) TreeLableProvider, TreeContentProvider
public class TreeLableProvider extends LabelProvider {
@Override
public String getText(Object element) {
if (element instanceof TreeNode)
return ((TreeNode) element).name;
else
return super.getText(element);
}
}
public class TreeContentProvider implements ITreeContentProvider {
//1)
public Object[] getElements(Object inputElement) {
Object[] elements = null;
if (inputElement instanceof TreeNode) {
TreeNode c = (TreeNode) inputElement;
elements = c.chidren.toArray();
} else
elements = new Object[0];
return elements;
}
//2) If has children, show +, click it to expand node
public boolean hasChildren(Object element) {
boolean hasChildren = false;
if (element instanceof TreeNode) {
TreeNode c = (TreeNode) element;
hasChildren = c.chidren.size() > 0;
}
return hasChildren;
}
//3) Click + to get children from this method
public Object[] getChildren(Object parentElement) {
Object[] children = null;
if (parentElement instanceof TreeNode) {
TreeNode c = (TreeNode) parentElement;
children = c.chidren.toArray();
} else
children = new Object[0];
return children;
}
public Object getParent(Object element) {
return null;
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
3) Create TreeViewer
//Must has a hidden root node, it's invisible, as ancestor of all other nodes
private TreeNode root = new TreeNode("Root");
private void createTreeViewer(Composite container) {
treeViewer = new TreeViewer(container, SWT.BORDER);
treeViewer.setLabelProvider(new TreeLableProvider());
treeViewer.setContentProvider(new TreeContentProvider());
treeViewer.setInput(root);
tree = treeViewer.getTree();
tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
}
4) Add init data
private void initData() {
root.getChidren().clear();
//Level 1 Node - China
TreeNode china = new TreeNode("China", root);
//Level 2 Node - Guangdong
TreeNode guangDong = new TreeNode("Guang Dong", china);
guangDong.addChild("Zhu Hai");
guangDong.addChild("Shen Zhen");
//Level 2 Node - Fujian
TreeNode fuJian = new TreeNode("Fu Jian", china);
fuJian.addChild("Xia Men");
fuJian.addChild("San Ming");
new TreeNode("Fu Zhou", fuJian);
//Level 1 - US
TreeNode us = new TreeNode("US", root);
TreeNode newYork = new TreeNode("New York", us);
newYork.addChild("Beacon");
newYork.addChild("Glen Cove");
new TreeNode("Rome", newYork);
us.addChild("Los Angeles");
new TreeNode("Pittsburgh", us);
}