From 761f61a09085eaf445a83543c6b8856456786e09 Mon Sep 17 00:00:00 2001 From: Brian Patino Date: Tue, 16 Feb 2016 15:07:14 -0500 Subject: [PATCH] Create Proper File Browser * create FileTreeItem to handle dynamic file views * misc code cleanup --- src/main/java/Controller.java | 8 +-- src/main/java/FileTreeItem.java | 54 +++++++++++++++++ src/main/java/FolderViewManager.java | 88 ++++++---------------------- 3 files changed, 77 insertions(+), 73 deletions(-) create mode 100644 src/main/java/FileTreeItem.java diff --git a/src/main/java/Controller.java b/src/main/java/Controller.java index f8b6505..f9da16a 100644 --- a/src/main/java/Controller.java +++ b/src/main/java/Controller.java @@ -30,10 +30,10 @@ public class Controller{ @FXML private void initialize() { FolderViewManager manager = new FolderViewManager(dirTree); // 2 statements in 1 line is best -// IronFile[] hardDrives = IronFile.listRoots(); // an array of hard drives -// manager.setRootDirectory(hardDrives); - IronFile homeDir = new IronFile(System.getProperty("user.home")); // use this for specific directory - manager.setRootDirectory(homeDir); + IronFile[] hardDrives = IronFile.listRoots(); // an array of hard drives + manager.setRootDirectory(hardDrives); +// IronFile homeDir = new IronFile(System.getProperty("user.home")); // use this for specific directory +// manager.setRootDirectory(homeDir); } } diff --git a/src/main/java/FileTreeItem.java b/src/main/java/FileTreeItem.java new file mode 100644 index 0000000..4b9eaa5 --- /dev/null +++ b/src/main/java/FileTreeItem.java @@ -0,0 +1,54 @@ +package main.java; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.scene.control.TreeItem; + +/** + * This class extends TreeItem and generates child files dynamically for the file browser. + * + * @author Brian Patino patinobrian@gmail.com + * @see Tree Item + */ +public class FileTreeItem extends TreeItem { + private boolean isLeaf; + private boolean isFirstTimeChildren = true; + private boolean isFirstTimeLeaf = true; + + public FileTreeItem(IronFile rootFile) { + super(rootFile); + } + + @Override + public ObservableList> getChildren() { + if (isFirstTimeChildren) { + isFirstTimeChildren = false; + super.getChildren().setAll(buildChildren(this)); + } + return super.getChildren(); + } + + @Override + public boolean isLeaf() { + if (isFirstTimeLeaf) { + isFirstTimeLeaf = false; + IronFile f = getValue(); + isLeaf = f.isFile(); + } + return isLeaf; + } + private ObservableList buildChildren(TreeItem ironTreeItem) { + IronFile f = ironTreeItem.getValue(); + if (f != null && f.isDirectory()) { + IronFile[] files = f.listFiles(); + if (files != null) { + ObservableList children = FXCollections.observableArrayList(); + for (IronFile childFile : files) { + children.add(new FileTreeItem(childFile)); + } + return children; + } + } + return FXCollections.emptyObservableList(); + } +} diff --git a/src/main/java/FolderViewManager.java b/src/main/java/FolderViewManager.java index a8c43c9..962308c 100644 --- a/src/main/java/FolderViewManager.java +++ b/src/main/java/FolderViewManager.java @@ -1,18 +1,9 @@ package main.java; -import javafx.scene.Scene; -import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; import javafx.scene.image.Image; import javafx.scene.image.ImageView; -import java.io.File; -import java.io.IOException; -import java.nio.file.*; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.EnumSet; -import java.util.concurrent.ExecutionException; - /** This class handles manipulation of the Folder View. This includes directory searches, displaying directories, and all things directly changing @@ -21,81 +12,40 @@ Additionally, this class extends SimpleFileVisitor which uses java 8. @author kristopherguzman - @author Brian Patino + @author Brian Patino patinobrian@gmail.com */ public class FolderViewManager { private final Image hddIcon = new Image("/main/resources/icons/hdd.png"); - private int NEST_COUNT = 0; //tracks number of nested calls when searching through files, TEMPORARY - private IronFileVisitor ironVisitor; +// private IronFileVisitor ironVisitor; // might be used later private TreeView view; public FolderViewManager(TreeView dirTree) { - ironVisitor = new IronFileVisitor(); - ironVisitor.setRoot(new TreeItem<>()); + /*ironVisitor = new IronFileVisitor(); // save this for later + ironVisitor.setRoot(new TreeItem<>());*/ // save this for later view = dirTree; } /** - * Original method to set a specified directory as root. - * */ + * Sets the root directory of the file browser to the specified folder. + * + * @param file root folder/file to start browser view + **/ public void setRootDirectory(IronFile file) { - ironVisitor.setRoot(new TreeItem<>(file)); -// createCellsFromRoot(file, root); - createTree(new TreeItem<>(file)); + FileTreeItem rootItem = new FileTreeItem(file); + view.setRoot(rootItem); } /** - * Overloaded method to set multiple hard drives as root. + * Overloaded method that sets a collection of folders/files as file browser view. + * + * @param hardDrives a collection of hard drives to being from root * */ public void setRootDirectory(IronFile[] hardDrives) { - for (IronFile hdd : hardDrives) { // loop through all hard drives - TreeItem hddTreeItem = new TreeItem<>(hdd); - hddTreeItem.setGraphic(new ImageView(hddIcon)); - createTree(hddTreeItem); -// createCellsFromRoot(hdd, parentTreeItem); -// ironVisitor.getRoot().getChildren().add(parentTreeItem); // set hdd to root + view.setRoot(new FileTreeItem(new IronFile(""))); // needs a blank file as root + for (IronFile hdd : hardDrives) { + FileTreeItem diskTreeItem = new FileTreeItem(hdd); + diskTreeItem.setGraphic(new ImageView(hddIcon)); + view.getRoot().getChildren().add(diskTreeItem); } + view.setShowRoot(false); // hide the blank file } - - private void createCellsFromRoot(File rootFile, TreeItem rootNode) { - NEST_COUNT++; - if(NEST_COUNT <= 6000) { //fixed value, TEMPORARY optimization - for(IronFile file : IronFile.convertFiles(rootFile.listFiles())) { - if(!file.getName().startsWith(".") && !file.getName().startsWith("$")) { //don't show system files that start with dot (ex: .filename .pythonfile) - TreeItem fileNode = new TreeItem<>(file); - rootNode.getChildren().add(fileNode); - if (file.isDirectory()) { - createCellsFromRoot(file, fileNode); - } - } - } - } - } - - private void createTree(TreeItem rootItem) { - Path pathDir = Paths.get(rootItem.getValue().getAbsolutePath()); // get the path of the TreeItem - try { - Files.walkFileTree(pathDir, EnumSet.of(FileVisitOption.FOLLOW_LINKS), 2, ironVisitor); - } catch (IOException e) { - e.printStackTrace(); - } - view.setRoot(ironVisitor.getRoot()); // set multiple hard drives as root - view.setShowRoot(false); // do not show blank - } - /** - * Set the child of a given parent TreeItem - * - * @param parent file of the parent node - * @param parentTreeItem TreeItem of the parent node - * */ - /*@SuppressWarnings("ConstantConditions") - private void setChildOfParent(final File parent, TreeItem parentTreeItem) { - for (final IronFile file : IronFile.convertFiles(parent.listFiles())) { - if (file.isDirectory()) { - System.out.println("This is a directory"); - } else { - parentTreeItem.getChildren().add(new TreeItem<>(file)); - System.out.println(file.getName()); - } - } - }*/ }