Skip to content

Commit

Permalink
Create Proper File Browser
Browse files Browse the repository at this point in the history
* create FileTreeItem to handle dynamic file views
 * misc code cleanup
  • Loading branch information
brp14005 committed Feb 16, 2016
1 parent 51387bc commit 761f61a
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 73 deletions.
8 changes: 4 additions & 4 deletions src/main/java/Controller.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

54 changes: 54 additions & 0 deletions src/main/java/FileTreeItem.java
Original file line number Diff line number Diff line change
@@ -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 <a href="https://docs.oracle.com/javafx/2/api/javafx/scene/control/TreeItem.html">Tree Item</a>
*/
public class FileTreeItem extends TreeItem<IronFile> {
private boolean isLeaf;
private boolean isFirstTimeChildren = true;
private boolean isFirstTimeLeaf = true;

public FileTreeItem(IronFile rootFile) {
super(rootFile);
}

@Override
public ObservableList<TreeItem<IronFile>> 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<FileTreeItem> buildChildren(TreeItem<IronFile> ironTreeItem) {
IronFile f = ironTreeItem.getValue();
if (f != null && f.isDirectory()) {
IronFile[] files = f.listFiles();
if (files != null) {
ObservableList<FileTreeItem> children = FXCollections.observableArrayList();
for (IronFile childFile : files) {
children.add(new FileTreeItem(childFile));
}
return children;
}
}
return FXCollections.emptyObservableList();
}
}
88 changes: 19 additions & 69 deletions src/main/java/FolderViewManager.java
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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<IronFile> view;

public FolderViewManager(TreeView<IronFile> 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<IronFile> 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<IronFile> 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<IronFile> fileNode = new TreeItem<>(file);
rootNode.getChildren().add(fileNode);
if (file.isDirectory()) {
createCellsFromRoot(file, fileNode);
}
}
}
}
}

private void createTree(TreeItem<IronFile> 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<IronFile> 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());
}
}
}*/
}

0 comments on commit 761f61a

Please sign in to comment.