package view;
import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import model.IliasFile;
import model.IliasFolder;
import model.IliasForum;
import model.IliasTreeNode;
import model.persistance.Settings;
import utils.DesktopHelper;
import control.LocalFileStorage;
import download.DownloadMode;
import download.IliasFolderDownloaderTask;
import download.IliasPdfDownloadCaller;
public class FileContextMenu {
private final ContextMenu menu;
private final MenuItem downloadIliasFileItem;
private final MenuItem downloadIliasFolderItem;
private final MenuItem downloadIliasFoldersItem;
private final MenuItem ignoreItem;
private MenuItem ignoreItemCancel;
private MenuItem autoDownloadIliasPdfItem;
private MenuItem normalDownloadIliasPdfsItem;
private final MenuItem printItem;
private final MenuItem openParentFolderItem;
private final MenuItem openFileItem;
private final MenuItem openForumItem;
private IliasTreeNode selectedIliasTreeNode;
private List<IliasTreeNode> selectedIliasTreeNodes;
private final Dashboard dashboard;
public FileContextMenu(final Dashboard dashboard) {
this.dashboard = dashboard;
// FIXME add param Dashboard
menu = new ContextMenu();
menu.getScene().getRoot().getStyleClass().add("main-root");
downloadIliasFileItem = new MenuItem("Herunterladen");
downloadIliasFileItem.setGraphic(new ImageView("img/downloadArrow.png"));
downloadIliasFileItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
downloadIliasPdf(selectedIliasTreeNode);
}
});
downloadIliasFolderItem = new MenuItem("Ordner Herunterladen (AUTO)");
downloadIliasFolderItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
downloadIliasFolder((IliasFolder) selectedIliasTreeNode);
}
});
downloadIliasFoldersItem = new MenuItem("Ordner Herunterladen (AUTO)");
downloadIliasFoldersItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
downloadIliasFolders(selectedIliasTreeNodes);
}
});
autoDownloadIliasPdfItem = new MenuItem("PDF-Dateien Herunterladen (AUTO)");
autoDownloadIliasPdfItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
downloadIliasPdfs(selectedIliasTreeNodes, DownloadMode.AUTO);
}
});
normalDownloadIliasPdfsItem = new MenuItem("PDF-Dateien Herunterladen");
normalDownloadIliasPdfsItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
downloadIliasPdfs(selectedIliasTreeNodes, DownloadMode.NORMAL);
}
});
ignoreItem = new MenuItem("Ignorieren");
ignoreItem.setGraphic(new ImageView("img/ignore.png"));
ignoreItemCancel = new MenuItem("Ignorieren aufheben");
ignoreItemCancel = new MenuItem("Ignorieren für Auswahl aufheben");
ignoreItemCancel.setGraphic(new ImageView("img/check.png"));
final EventHandler<ActionEvent> pdfIgnorer = new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
final IliasFile file = (IliasFile) selectedIliasTreeNode;
Settings.getInstance().toggleFileIgnored(file);
dashboard.pdfIgnoredStateChanged(file);
dashboard.getResultList().pdfIgnoredStateChanged(file);
}
};
ignoreItem.setOnAction(pdfIgnorer);
ignoreItemCancel.setOnAction(pdfIgnorer);
printItem = new MenuItem("Drucken");
printItem.setGraphic(new ImageView("img/printer.png"));
printItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
DesktopHelper.print((IliasFile) selectedIliasTreeNode);
}
});
openParentFolderItem = new MenuItem("In Ordner öffnen");
openParentFolderItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
DesktopHelper.openLocalFolder((IliasFile) selectedIliasTreeNode);
}
});
openFileItem = new MenuItem("Datei öffnen");
openFileItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
DesktopHelper.openFile((IliasFile) selectedIliasTreeNode);
}
});
openForumItem = new MenuItem("Im Browser öffnen");
openForumItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
openForum();
}
});
}
public ContextMenu createMenu(List<IliasTreeNode> selectedNodes, MouseEvent event) {
menu.getItems().clear();
if (selectedNodes.size() == 1) {
return createMenu(selectedNodes.get(0), event);
}
if (Settings.getInstance().getFlags().isUserLoggedIn()) {
boolean selectedNodesContainsFiles = false;
boolean selectedNodesContainsFolder = false;
for (IliasTreeNode iliasTreeNode : selectedNodes) {
if (!selectedNodesContainsFiles && iliasTreeNode instanceof IliasFile) {
menu.getItems().addAll(autoDownloadIliasPdfItem, normalDownloadIliasPdfsItem);
selectedNodesContainsFiles = true;
}
if (!selectedNodesContainsFolder && iliasTreeNode instanceof IliasFolder) {
menu.getItems().add(downloadIliasFoldersItem);
selectedNodesContainsFolder = true;
}
if (iliasTreeNode instanceof IliasForum) {
selectedNodes.remove(iliasTreeNode);
}
}
selectedIliasTreeNodes = selectedNodes;
}
return menu;
}
private ContextMenu createMenu(final IliasTreeNode node, final MouseEvent event) {
menu.getItems().clear();
this.selectedIliasTreeNode = node;
if (node instanceof IliasFolder && Settings.getInstance().getFlags().isUserLoggedIn()) {
menu.getItems().add(0, downloadIliasFolderItem);
} else if (node instanceof IliasForum) {
menu.getItems().add(openForumItem);
return menu;
} else if (node instanceof IliasFile) {
IliasFile file = (IliasFile) node;
if (file.isIgnored()) {
menu.getItems().add(ignoreItemCancel);
} else {
menu.getItems().add(ignoreItem);
}
if (LocalFileStorage.getInstance().contains(file)) {
menu.getItems().add(printItem);
menu.getItems().add(openParentFolderItem);
menu.getItems().add(openFileItem);
}
}
if (Settings.getInstance().getFlags().isUserLoggedIn() && node instanceof IliasFile) {
menu.getItems().add(0, downloadIliasFileItem);
}
return menu;
}
private void downloadIliasPdf(IliasTreeNode selectediliasPdf) {
new Thread(new IliasPdfDownloadCaller(selectediliasPdf)).start();
}
private void downloadIliasFolder(IliasFolder selectedIliasFolder) {
new Thread(new IliasFolderDownloaderTask(selectedIliasFolder)).start();
}
private void downloadIliasPdfs(List<IliasTreeNode> selectedIliasTreeNodes, DownloadMode mode) {
for (IliasTreeNode iliasTreeNode : selectedIliasTreeNodes) {
new Thread(new IliasPdfDownloadCaller(iliasTreeNode, mode)).start();
}
}
private void downloadIliasFolders(List<IliasTreeNode> selectedIliasFolders) {
new Thread(new IliasFolderDownloaderTask(selectedIliasFolders)).start();
}
private void openForum() {
final IliasForum forum = (IliasForum) this.selectedIliasTreeNode;
if (Desktop.isDesktopSupported()) {
try {
Desktop.getDesktop().browse(new URI(forum.getUrl()));
} catch (IOException | URISyntaxException e) {
e.printStackTrace();
}
} else {
dashboard.browse(forum.getUrl());
}
}
}