139 lines
3.9 KiB
Java
139 lines
3.9 KiB
Java
package app.service;
|
|
|
|
import java.io.File;
|
|
import java.io.FileNotFoundException;
|
|
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 {
|
|
|
|
private static int iconSize = 20;
|
|
|
|
private FiletreeOperations() {}
|
|
|
|
/**
|
|
* 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()) {
|
|
ImageView icon = new ImageView(folder);
|
|
icon.setFitHeight(iconSize);
|
|
icon.setFitWidth(iconSize);
|
|
|
|
CheckBoxTreeItem<String> element = new CheckBoxTreeItem<>(file.getName(), icon);
|
|
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 {
|
|
|
|
try {
|
|
ImageView icon = new ImageView(getIconForFile(file));
|
|
icon.setFitHeight(iconSize);
|
|
icon.setFitWidth(iconSize);
|
|
|
|
CheckBoxTreeItem<String> element = new CheckBoxTreeItem<>(file.getName(), icon);
|
|
parent.getChildren().add(element);
|
|
|
|
} catch (Exception e) {
|
|
System.err.println("[ERROR] Default file icon not found");
|
|
System.err.println(e);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* A helping function to sort the files/directories 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);
|
|
|
|
}
|
|
|
|
private static Image getIconForFile(File file) throws IOException {
|
|
Image icon;
|
|
|
|
try {
|
|
String mimeType = Files.probeContentType(file.toPath());
|
|
if (mimeType == null) throw new IOException();
|
|
|
|
String iconPath = "/graphics/filetreeicons/" + mimeType.replace('/', '-') + ".png";
|
|
InputStream imageData = FiletreeOperations.class.getResourceAsStream(iconPath);
|
|
if (imageData == null) throw new IOException();
|
|
|
|
icon = new Image(imageData);
|
|
|
|
} catch (IOException e) {
|
|
System.err.println("[WARNING] Icon not found: " + file.getPath());
|
|
|
|
// String iconPath = "/graphics/filetreeicons/file.png";
|
|
String iconPath = "/graphics/filetreeicons/unknown.png";
|
|
|
|
InputStream imageData = FileOperations.class.getResourceAsStream(iconPath);
|
|
if (imageData == null) throw new IOException();
|
|
|
|
icon = new Image(imageData);
|
|
}
|
|
|
|
return icon;
|
|
}
|
|
|
|
public static Path getPathOfTreeItem(TreeItem<String> item) throws FileNotFoundException {
|
|
Path projectPath =
|
|
Model
|
|
.getProjectPath()
|
|
.orElseThrow(() -> new IllegalStateException());
|
|
|
|
final String rootDirName =
|
|
projectPath
|
|
.getFileName()
|
|
.toString();
|
|
|
|
String path = "";
|
|
while (!rootDirName.equals(item.getValue())) {
|
|
path = File.separator + item.getValue() + path;
|
|
item = item.getParent();
|
|
if (item == null)
|
|
throw new FileNotFoundException();
|
|
}
|
|
|
|
path = projectPath.toString() + path;
|
|
|
|
Path pathToString = Paths.get(path);
|
|
|
|
return pathToString;
|
|
}
|
|
}
|