package org.pixelgaffer.turnierserver.codr.view; import java.io.File; import java.io.FileWriter; import java.io.IOException; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.control.ContextMenu; import javafx.scene.control.MenuItem; import javafx.scene.control.TextField; import javafx.scene.control.TreeCell; import org.apache.commons.io.FileUtils; import org.pixelgaffer.turnierserver.codr.utilities.Dialog; import org.pixelgaffer.turnierserver.codr.utilities.ErrorLog; public class TreeFileCell extends TreeCell<File> { private TextField tbEdit; private ContextMenu fileMenu = new ContextMenu(); private ContextMenu folderMenu = new ContextMenu(); private MenuItem addFileItem = new MenuItem("Neue Datei"); private MenuItem addFolderItem = new MenuItem("Neuer Ordner"); private MenuItem renameItem = new MenuItem("Umbenennen"); private MenuItem deleteItem = new MenuItem("Löschen"); private MenuItem renameItem2 = new MenuItem("Umbenennen"); private MenuItem deleteItem2 = new MenuItem("Löschen"); public TreeFileCell() { treeViewProperty().addListener((observableValue, oldValue, newValue) -> { if (newValue != null && !newValue.editableProperty().get()) { addFileItem.setDisable(true); addFolderItem.setDisable(true); renameItem.setDisable(true); deleteItem.setDisable(true); renameItem2.setDisable(true); deleteItem2.setDisable(true); } else { addFileItem.setDisable(false); addFolderItem.setDisable(false); renameItem.setDisable(false); deleteItem.setDisable(false); renameItem2.setDisable(false); deleteItem2.setDisable(false); } }); folderMenu.getItems().add(addFileItem); addFileItem.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent t) { addFile(); } }); folderMenu.getItems().add(addFolderItem); addFolderItem.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent t) { addFolder(); } }); folderMenu.getItems().add(renameItem); renameItem.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent t) { rename(); } }); folderMenu.getItems().add(deleteItem); deleteItem.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent t) { delete(); } }); fileMenu.getItems().add(renameItem2); renameItem2.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent t) { rename(); } }); fileMenu.getItems().add(deleteItem2); deleteItem2.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent t) { delete(); } }); } public void addFile() { startEdit(); String result = Dialog.textInput("Bitte den Dateinamen eingeben (mit Endung)", "Neue Datei"); File file = new File(getItem().getPath() + "/" + result); if (file.exists()) { Dialog.error("Diese Datei existiert schon."); return; } try { FileWriter writer = new FileWriter(file, false); writer.write(""); writer.flush(); writer.close(); } catch (IOException e) { ErrorLog.write("Fehler beim anlegen einer neuen Datei: " + e); } commitEdit(new File("")); } public void addFolder() { startEdit(); String result = Dialog.textInput("Bitte den Namen eingeben", "Neuer Ordner"); File dir = new File(getItem().getPath() + "/" + result); if (dir.exists()) { Dialog.error("Dieser Ordner existiert schon."); return; } dir.mkdir(); commitEdit(new File("")); } public void rename() { startEdit(); String result = Dialog.textInput("Bitte den neuen Dateinamen eingeben", "Umbenennen", getItem().getName()); File file = new File(getItem().getParent() + "/" + result); if (result.equals(getItem().getName())) { return; } if (file.exists()) { Dialog.error("Diese Datei existiert schon."); return; } if (result != null) { getItem().renameTo(file); } commitEdit(file); } public void delete() { startEdit(); String elementText = "die Datei"; if (getItem().isDirectory()) elementText = "den Ordner"; if (Dialog.okAbort("Wollen Sie " + elementText + " wirklich löschen?", "Löschen")) { if (getItem().isDirectory()) { try { FileUtils.deleteDirectory(getItem()); } catch (IOException e) { Dialog.error("Fehler beim löschen des Ordners"); } } else { getItem().delete(); } } commitEdit(new File("")); } @Override public void updateItem(File item, boolean empty) { super.updateItem(item, empty); if (empty) { setText(null); setGraphic(null); } else { if (isEditing()) { if (tbEdit != null) { tbEdit.setText(getItem().getName()); } setText(null); setGraphic(tbEdit); } else { setText(getItem().getName()); setGraphic(getTreeItem().getGraphic()); } if (getItem().isDirectory()) { setContextMenu(folderMenu); } else { setContextMenu(fileMenu); } } } public String getString() { return getItem() == null ? "" : getItem().getName(); } }