diff --git a/src/main/java/Controller.java b/src/main/java/Controller.java index 28264de..f8b6505 100644 --- a/src/main/java/Controller.java +++ b/src/main/java/Controller.java @@ -20,8 +20,6 @@ import java.util.ResourceBundle; public class Controller{ - private TreeItem root = new TreeItem<>(); - private final Image hddIcon = new Image("/main/resources/icons/hdd.png"); @FXML private MenuItem fileOpen; @FXML private MenuItem fileNew; @FXML private MenuItem fileTag; @@ -31,9 +29,10 @@ public class Controller{ @FXML private ResourceBundle resources; @FXML private void initialize() { - //createTree(); - FolderViewManager manager = new FolderViewManager(root, dirTree); - IronFile homeDir = new IronFile(System.getProperty("user.home")); + 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); } } diff --git a/src/main/java/FolderViewManager.java b/src/main/java/FolderViewManager.java index 885643c..a8c43c9 100644 --- a/src/main/java/FolderViewManager.java +++ b/src/main/java/FolderViewManager.java @@ -3,11 +3,14 @@ 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; /** @@ -21,37 +24,63 @@ @author Brian Patino */ public class FolderViewManager { - private TreeView view; - private TreeItem root; + 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 TreeView view; - public FolderViewManager(TreeItem root, TreeView dirTree) { - this.root = root; - this.view = dirTree; + public FolderViewManager(TreeView dirTree) { + ironVisitor = new IronFileVisitor(); + ironVisitor.setRoot(new TreeItem<>()); + view = dirTree; } + /** + * Original method to set a specified directory as root. + * */ public void setRootDirectory(IronFile file) { - root = new TreeItem<>(file); - view.setRoot(root); - createCellsFromRoot(file, root); + ironVisitor.setRoot(new TreeItem<>(file)); +// createCellsFromRoot(file, root); + createTree(new TreeItem<>(file)); + } + /** + * Overloaded method to set multiple hard drives as 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 + } } private void createCellsFromRoot(File rootFile, TreeItem rootNode) { NEST_COUNT++; - if(NEST_COUNT > 1000) { //fixed value, TEMPORARY optimization - return; - } - - for(IronFile file : IronFile.convertFiles(rootFile.listFiles())) { - if(!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); + 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 * diff --git a/src/main/java/IronFileVisitor.java b/src/main/java/IronFileVisitor.java index b8bbd0d..ddc9222 100644 --- a/src/main/java/IronFileVisitor.java +++ b/src/main/java/IronFileVisitor.java @@ -22,10 +22,13 @@ @author Brian Patino */ public class IronFileVisitor extends SimpleFileVisitor{ - + private TreeItem root; @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { -// System.out.printf("Visiting file %s\n", file); + public FileVisitResult visitFile(Path pathFile, BasicFileAttributes attrs) throws IOException { + IronFile current = new IronFile(pathFile.toFile()); +// System.out.println(current.getAbsolutePath()); +// root.getChildren().add(new TreeItem<>(new IronFile(current.getAbsolutePath()))); + System.out.printf("Visiting file %s\n", pathFile); return FileVisitResult.CONTINUE; } /** @@ -39,7 +42,22 @@ public FileVisitResult visitFileFailed(Path file, IOException e) throws IOExcept } @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { -// System.out.printf("About to visit directory %s\n", dir); - return FileVisitResult.CONTINUE; + IronFile currentFile = new IronFile(dir.toAbsolutePath().toString()); + if (currentFile.getName().startsWith(".")) { + System.out.printf("Skipped directory: %s\n", dir.getFileName()); + return FileVisitResult.SKIP_SUBTREE; + } else { + System.out.printf("About to visit directory: %s\n", dir.getFileName()); + root.getChildren().add(new TreeItem<>(currentFile)); + return FileVisitResult.CONTINUE; + } + } + + public TreeItem getRoot() { + return root; + } + + public void setRoot(TreeItem root) { + this.root = root; } }