package net.krazyweb.starmodmanager.dialogue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import net.krazyweb.helpers.CSSHelper;
import net.krazyweb.helpers.FXHelper;
import net.krazyweb.starmodmanager.data.LocalizerModelFactory;
import net.krazyweb.starmodmanager.data.LocalizerModelInterface;
import net.krazyweb.starmodmanager.data.SettingsFactory;
import net.krazyweb.starmodmanager.data.SettingsModelInterface;
public class MessageDialogue {
//TODO
//An application close request MUST close all other dialogues
//Otherwise the program doesn't actually close
public static enum MessageType {
INFO, ERROR, CONFIRM
}
public static enum DialogueAction {
YES, NO, CANCEL, OK, CLOSED
}
protected Stage stage;
protected GridPane root;
protected String title;
protected Text messageText;
protected Button confirmButton;
protected ImageView icon;
protected DialogueAction actionPerformed;
protected SettingsModelInterface settings;
protected LocalizerModelInterface localizer;
public MessageDialogue(final String message, final String title, final MessageType messageType, final LocalizerModelInterface localizer) {
settings = new SettingsFactory().getInstance();
this.localizer = localizer;
build(message, title, messageType);
show();
}
public MessageDialogue(final String message, final String title, final MessageType messageType, final LocalizerModelFactory localizerFactory) {
settings = new SettingsFactory().getInstance();
localizer = localizerFactory.getInstance();
build(message, title, messageType);
show();
}
protected void build(final String message, final String title, final MessageType messageType) {
this.title = title;
root = new GridPane();
root.setPadding(new Insets(43, 50, 30, 20));
root.setHgap(25);
if (messageType == MessageType.CONFIRM) {
icon = new ImageView(new Image(MessageDialogueConfirm.class.getClassLoader().getResourceAsStream("delete-file-icon.png")));
Color color = CSSHelper.getColor("message-dialogue-confirm-warning-color", settings.getPropertyString("theme"));
FXHelper.setColor(icon, color);
} else if (messageType == MessageType.ERROR) {
icon = new ImageView(new Image(MessageDialogueConfirm.class.getClassLoader().getResourceAsStream("error-icon.png")));
Color color = CSSHelper.getColor("message-dialogue-confirm-error-color", settings.getPropertyString("theme"));
FXHelper.setColor(icon, color);
} else {
icon = new ImageView(new Image(MessageDialogueConfirm.class.getClassLoader().getResourceAsStream("delete-file-icon.png")));
Color color = CSSHelper.getColor("message-dialogue-confirm-info-color", settings.getPropertyString("theme"));
FXHelper.setColor(icon, color);
}
messageText = new Text(message);
messageText.setId("message-dialogue-text");
messageText.setWrappingWidth(285);
confirmButton = new Button(localizer.getMessage("messagedialogue.okay"));
confirmButton.setId("message-dialogue-button");
confirmButton.setPrefWidth(120);
confirmButton.setPrefHeight(40);
confirmButton.setAlignment(Pos.CENTER);
confirmButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
actionPerformed = DialogueAction.OK;
stage.close();
}
});
HBox buttonBox = new HBox();
buttonBox.getChildren().addAll(confirmButton);
buttonBox.setSpacing(30);
buttonBox.setAlignment(Pos.CENTER);
root.add(icon, 1, 1);
root.add(messageText, 2, 1);
root.add(buttonBox, 2, 2);
}
protected void show() {
Scene scene = new Scene(root);
scene.getStylesheets().add(MessageDialogue.class.getClassLoader().getResource("theme_base.css").toExternalForm());
scene.getStylesheets().add(MessageDialogue.class.getClassLoader().getResource(settings.getPropertyString("theme")).toExternalForm());
stage = new Stage();
stage.setScene(scene);
stage.setTitle(title);
stage.initModality(Modality.APPLICATION_MODAL);
stage.setResizable(false);
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
if (event.getEventType() == WindowEvent.WINDOW_CLOSE_REQUEST) {
actionPerformed = DialogueAction.CLOSED;
stage.close();
}
}
});
stage.showAndWait();
}
public DialogueAction getResult() {
return actionPerformed;
}
}