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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
/*
* Copyright 2011 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.tests;
import java.io.File;
import com.vaadin.Application;
import com.vaadin.data.Item;
import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.tests.util.SampleDirectory;
import com.vaadin.ui.Label;
import com.vaadin.ui.Panel;
import com.vaadin.ui.Tree;
import com.vaadin.ui.Tree.ExpandEvent;
import com.vaadin.ui.UI.LegacyWindow;
/**
* Browsable file explorer using Vaadin Tree component. Demonstrates: how to add
* items hierarchically into <code>com.vaadin.ui.Component.Tree</code>, how to
* receive ExpandEvent and implement
* <code>com.vaadin.ui.Tree.ExpandListener</code>.
*
* @since 4.0.0
*
*/
public class TreeFilesystem extends com.vaadin.Application.LegacyApplication
implements Tree.ExpandListener {
// Filesystem explorer panel and it's components
private final Panel explorerPanel = new Panel("Filesystem explorer");
private final Tree tree = new Tree();
@Override
public void init() {
final LegacyWindow main = new LegacyWindow("Tree filesystem demo");
setMainWindow(main);
// Main window contains heading and panel
main.addComponent(new Label("<h2>Tree demo</h2>", ContentMode.XHTML));
// configure file structure panel
main.addComponent(explorerPanel);
explorerPanel.addComponent(tree);
explorerPanel.setHeight("400px");
// "this" handles tree's expand event
tree.addListener(this);
// Get sample directory
final File sampleDir = SampleDirectory.getDirectory(
Application.getCurrent(), main);
// 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.
*/
@Override
public void nodeExpand(ExpandEvent event) {
final 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) {
final File subdir = new File(file);
final File[] files = subdir.listFiles();
for (int x = 0; x < files.length; x++) {
try {
// add new item (String) to tree
final 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 (final Exception e) {
throw new RuntimeException(e);
}
}
}
}
|