aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/itmill/toolkit/demo/TreeFilesystem.java
blob: d13fe49f767610851c955439e10c512e3ae9b26b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package com.itmill.toolkit.demo;

import java.io.File;
import com.itmill.toolkit.data.Item;
import com.itmill.toolkit.demo.util.SampleDirectory;
import com.itmill.toolkit.ui.*;
import com.itmill.toolkit.ui.Tree.ExpandEvent;

/**
 * Browsable file explorer using Toolkit Tree component. Demonstrates: how to
 * add items hierarchially into
 * <code>com.itmill.toolkit.ui.Component.Tree</code>, how to receive
 * ExpandEvent and implement
 * <code>com.itmill.toolkit.ui.Tree.ExpandListener</code>.
 * 
 * @since 4.0.0
 * 
 */
public class TreeFilesystem extends com.itmill.toolkit.Application implements
		Tree.ExpandListener {

	// Filesystem explorer panel and it's components
	private Panel explorerPanel = new Panel("Filesystem explorer");

	private Tree tree = new Tree();

	public void init() {
		Window main = new Window("Tree filesystem demo");
		setMainWindow(main);

		// set the application to use Corporate -theme
		setTheme("corporate");

		// Main window contains heading and panel
		main.addComponent(new Label("<h2>Tree demo</h2>", Label.CONTENT_XHTML));

		// configure file structure panel
		main.addComponent(explorerPanel);
		explorerPanel.addComponent(tree);
		explorerPanel.setHeight(400);

		// "this" handles tree's expand event
		tree.addListener((Tree.ExpandListener) this);

		// Get sample directory
		File sampleDir = SampleDirectory.getDirectory(this);
		// populate tree's root node with example directory
		if (sampleDir != null)
			populateNode(sampleDir.getAbsolutePath(), null);
	}

	/**
	 * Handle tree expand event, populate expanded node's childs with new files
	 * and directories.
	 */
	public void nodeExpand(ExpandEvent event) {
		Item i = tree.getItem(event.getItemId());
		if (!tree.hasChildren(i)) {
			// populate tree's node which was expanded
			populateNode(event.getItemId().toString(), event.getItemId());
		}
	}

	/**
	 * Populates files to tree as items. In this example items are of String
	 * type that consist of file path. New items are added to tree and item's
	 * parent and children properties are updated.
	 * 
	 * @param file
	 *            path which contents are added to tree
	 * @param parent
	 *            for added nodes, if null then new nodes are added to root node
	 */
	private void populateNode(String file, Object parent) {
		File subdir = new File(file);
		File[] files = subdir.listFiles();
		for (int x = 0; x < files.length; x++) {
			try {
				// add new item (String) to tree
				String path = files[x].getCanonicalPath().toString();
				tree.addItem(path);
				// set parent if this item has one
				if (parent != null)
					tree.setParent(path, parent);
				// check if item is a directory and read access exists
				if (files[x].isDirectory() && files[x].canRead())
					// yes, childrens therefore exists
					tree.setChildrenAllowed(path, true);
				else
					// no, childrens therefore do not exists
					tree.setChildrenAllowed(path, false);
			} catch (Exception e) {
				throw new RuntimeException(e);
			}
		}
	}

}