package org.peerbox.share;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Collection;
import javafx.application.Platform;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.image.Image;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import org.peerbox.ResultStatus;
import org.peerbox.utils.DialogUtils;
import org.peerbox.utils.IconUtils;
import org.peerbox.view.ViewNames;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
/**
* This class is responsible for initializing and loading the GUI where the user can specify details
* regarding sharing a folder (e.g. permissions, usernam, ...).
*
* @author albrecht
*
*/
public class ShareFolderUILoader {
private static final Logger logger = LoggerFactory.getLogger(ShareFolderUILoader.class);
private Path folderToShare;
private Stage stage;
private ShareFolderController controller;
@Inject
public ShareFolderUILoader(ShareFolderController controller) {
this.controller = controller;
}
/**
* Loads and shows the GUI.
*
* Precondition: folderToShare must be set.
*/
public void loadUi() {
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource(ViewNames.SHARE_FOLDER_VIEW));
// we set the controller manually because GuiceFxmlLoader would use parent injector
loader.setController(controller);
controller.setFolderToShare(folderToShare);
Parent root = loader.load();
// load UI on Application thread and show window
Runnable showStage = new Runnable() {
@Override
public void run() {
Scene scene = new Scene(root);
stage = new Stage();
stage.setTitle("Share Folder");
stage.setScene(scene);
Collection<Image> icons = IconUtils.createWindowIcons();
stage.getIcons().addAll(icons);
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
stage = null;
controller = null;
}
});
stage.show();
}
};
if (Platform.isFxApplicationThread()) {
showStage.run();
} else {
Platform.runLater(showStage);
}
} catch (IOException e) {
logger.error("Could not load share folder stage: {}", e.getMessage());
e.printStackTrace();
}
}
/**
* Shows an error dialog to the user informing that sharing the folder failed.
*
* @param res the error result status
*/
public static void showError(ResultStatus res) {
showError(res.getErrorMessage());
}
private static void showError(final String message) {
Runnable dialog = new Runnable() {
@Override
public void run() {
Alert dlg = DialogUtils.createAlert(AlertType.ERROR);
dlg.setTitle("Error Share Folder.");
dlg.setHeaderText("Could not share folder.");
dlg.setContentText(message);
dlg.showAndWait();
}
};
if (Platform.isFxApplicationThread()) {
dialog.run();
} else {
Platform.runLater(dialog);
}
}
/**
* Set the folder to share. Must be set before loading the GUI.
*
* @param folderToShare path to the folder
*/
public void setFolderToShare(Path folderToShare) {
this.folderToShare = folderToShare;
}
}