Path: blob/aarch64-shenandoah-jdk8u272-b10/nashorn/samples/filebrowser.js
32278 views
#// Usage: jjs -fx filebrowser.js -- <start_dir>12/*3* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.4*5* Redistribution and use in source and binary forms, with or without6* modification, are permitted provided that the following conditions7* are met:8*9* - Redistributions of source code must retain the above copyright10* notice, this list of conditions and the following disclaimer.11*12* - Redistributions in binary form must reproduce the above copyright13* notice, this list of conditions and the following disclaimer in the14* documentation and/or other materials provided with the distribution.15*16* - Neither the name of Oracle nor the names of its17* contributors may be used to endorse or promote products derived18* from this software without specific prior written permission.19*20* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS21* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,22* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR23* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR24* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,25* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,26* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR27* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF28* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING29* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS30* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.31*/3233// Uses -fx and javafx TreeView to visualize directories34if (!$OPTIONS._fx) {35print("Usage: jjs -fx filebrowser.js -- <start_dir>");36exit(1);37}3839// Java classes used40var File = Java.type("java.io.File");41var Files = Java.type("java.nio.file.Files");4243// check directory argument, if passed44var dir = arguments.length > 0? new File(arguments[0]) : new File(".");45if (! dir.isDirectory()) {46print(dir + " is not a directory!");47exit(2);48}4950// JavaFX classes used51var FXCollections = Java.type("javafx.collections.FXCollections");52var Scene = Java.type("javafx.scene.Scene");53var TreeItem = Java.type("javafx.scene.control.TreeItem");54var TreeView = Java.type("javafx.scene.control.TreeView");5556// create a subclass of JavaFX TreeItem class57var LazyTreeItem = Java.extend(TreeItem);5859// lazily filling children of a directory LazyTreeItem60function buildChildren(dir) {61var children = FXCollections.observableArrayList();62var stream = Files.list(dir.toPath());63stream.forEach(function(path) {64var file = path.toFile();65var item = file.isDirectory()?66makeLazyTreeItem(file) : new TreeItem(file.name);67children.add(item);68});69stream.close();70return children;71}7273// create an instance LazyTreeItem with override methods74function makeLazyTreeItem(dir) {75var item = new LazyTreeItem(dir.name) {76expanded: false,77isLeaf: function() false,78getChildren: function() {79if (! this.expanded) {80// call super class (TreeItem) method81Java.super(item).getChildren().setAll(buildChildren(dir));82this.expanded = true;83}84// call super class (TreeItem) method85return Java.super(item).getChildren();86}87}88return item;89}9091// JavaFX start method92function start(stage) {93stage.title = dir.absolutePath;94var rootItem = makeLazyTreeItem(dir);95rootItem.expanded = true;96var tree = new TreeView(rootItem);97stage.scene = new Scene(tree, 300, 450);98stage.show();99}100101102