Files
TDT4100-project/src/main/java/app/service/FiletreeOperations.java

147 lines
4.7 KiB
Java

package app.service;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import app.model.Model;
import javafx.scene.control.CheckBoxTreeItem;
import javafx.scene.control.TreeItem;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
public class FiletreeOperations {
// FIXME: File specific icons not working properly
// TODO: Clean up code that is not in use
// Creating the images for the icons.
Image folder = new Image(getClass().getResourceAsStream("/graphics/folder.png"));
Image md = new Image(getClass().getResourceAsStream("/graphics/md.png"));
Image java = new Image(getClass().getResourceAsStream("/graphics/java.png"));
Image placeholder = new Image(getClass().getResourceAsStream("/graphics/placeholder.png"));
// TODO: Error check for recursiveness, and files without icons
/**
* The method to generate the fileTree recursively. If it is a directory a
* CheckBoxStringItem is created and the method is called again. It goes through
* all until every directory or file inside the orginal CheckBoxItem is made. If
* the item is a file it sends it to the help function checkExtension which is
* described below.
*/
public static void generateTree(File file, CheckBoxTreeItem<String> parent) {
Image folder = new Image(FiletreeOperations.class.getResourceAsStream("/graphics/folder.png"));
if (file.isDirectory()) {
CheckBoxTreeItem<String> element = new CheckBoxTreeItem<>(file.getName(), new ImageView(folder));
parent.getChildren().add(element);
List<File> dirList = new ArrayList<>();
List<File> fileList = new ArrayList<>();
sortFiles(dirList, fileList, file);
for (File f : dirList) {
generateTree(f, element);
}
} else {
checkExtensions(file, parent);
}
}
/**
* A helping function to sort the files/folders in the fileTree so that it shows
* in the correct order.
*/
private static void sortFiles(List<File> dirList, List<File> fileList, File file) {
for (File f : file.listFiles()) {
if (f.isDirectory())
dirList.add(f);
else
fileList.add(f);
}
dirList.addAll(fileList);
}
/**
* A help function to check if the extensions match .java or .md to insert the
* specific icons and sending it to another help funtion createExtension to
* create the new CheckboxTreeItem<String> that will add to the parent.
*/
private static void checkExtensions(File file, CheckBoxTreeItem<String> parent) {
String name = file.getName();
String ext = (name.substring(file.getName().lastIndexOf(".") + 1, file.getName().length()));
try {
createExtension(name, getIconForFile(file), parent);
} catch (Exception e) {
System.err.println("[ERROR]: DEFAULT FILE ICON NOT FOUND");
}
// if ("java".equals(ext))
// createExtension(name, java, parent);
// else if ("md".equals(ext))
// createExtension(name, md, parent);
// else
// createExtension(name, placeholder, parent);
}
private static Image getIconForFile(File file) throws IOException {
Image icon;
try {
String mimeType = Files.probeContentType(file.toPath()).replace('/', '-');
String iconPath = "/graphics/filetreeicons/" + mimeType + ".png";
if (mimeType == null) throw new IOException();
InputStream imageData = FiletreeOperations.class.getResourceAsStream(iconPath);
if (imageData == null) throw new IOException();
icon = new Image(imageData);
} catch (IOException e) {
System.err.println("[ERROR]: ICON NOT FOUND: " + file.getPath());
// String iconPath = "/graphics/filetreeicons/file.png";
String iconPath = "/graphics/placeholder.png";
InputStream imageData = FileOperations.class.getResourceAsStream(iconPath);
if (imageData == null) throw new IOException();
icon = new Image(imageData);
}
return icon;
}
private static void createExtension(String name, Image image, CheckBoxTreeItem<String> parent) {
CheckBoxTreeItem<String> element = new CheckBoxTreeItem<>(name, new ImageView(image));
parent.getChildren().add(element);
}
public static Path getPathOfTreeItem(TreeItem<String> item) {
String root = Model.getProjectPath().getFileName().toString();
String path = "";
while (!root.equals(item.getValue())) {
path = File.separator + item.getValue() + path;
item = item.getParent();
}
path = Model.getProjectPath().toString() + path;
Path pathToString = Paths.get(path);
return pathToString;
}
}