/*
* Copyright 2000-2016 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.server.VaadinSession;
import com.vaadin.shared.ui.ContentMode;
import com.vaadin.tests.util.SampleDirectory;
import com.vaadin.ui.Label;
import com.vaadin.ui.LegacyWindow;
import com.vaadin.ui.Panel;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.v7.data.Item;
import com.vaadin.v7.ui.Tree;
import com.vaadin.v7.ui.Tree.ExpandEvent;
/**
* 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.server.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.HTML));
// configure file structure panel
VerticalLayout explorerLayout = new VerticalLayout();
explorerLayout.setMargin(true);
explorerPanel.setContent(explorerLayout);
main.addComponent(explorerPanel);
explorerLayout.addComponent(tree);
explorerPanel.setHeight("400px");
// "this" handles tree's expand event
tree.addListener(this);
// Get sample directory
final File sampleDir = SampleDirectory
.getDirectory(VaadinSession.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);
}
}
}
}