aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/net/sowgro/npehero/main/ErrorDisplay.java
blob: d6eea26f89c1d3b3013115d75c034d6acdbf15e1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package net.sowgro.npehero.main;

import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ToggleButton;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import net.sowgro.npehero.Driver;

import java.io.PrintWriter;
import java.io.StringWriter;

public class ErrorDisplay extends Page {

    private final HBox content = new HBox();

    /**
     * Error display with a message and Back button
     * @param message The message to display
     * @param prev The destination of the close button
     */
    public ErrorDisplay(String message, Page prev) {
        Label main = new Label(message);
        main.getStyleClass().add("box");
        main.setPadding(new Insets(10));
        main.setWrapText(true);

        Button exit = new Button();
        exit.setText("Ok");
        exit.setOnAction(e -> {
            Sound.playSfx(Sound.BACKWARD);
            Driver.setMenu(prev);
        });

        VBox centerBox = new VBox();
        centerBox.getChildren().addAll(main, exit);
        centerBox.setSpacing(10);
        centerBox.setAlignment(Pos.CENTER);

        content.getChildren().add(centerBox);
        content.setAlignment(Pos.CENTER);
    }

    /**
     * Error display with a message, exception and Back button
     * @param message The message to display
     * @param e The exception that occurred
     * @param prev The destination of the close button
     */
    public ErrorDisplay(String message, Exception e, Page prev) {
        Label title = new Label(message);
        title.setWrapText(true);

        Label exView = new Label(e.toString());
        exView.getStyleClass().add("red");

        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        e.printStackTrace(pw);
        String sStackTrace = sw.toString(); // stack trace as a string

        Label stackTrace = new Label(sStackTrace);
        stackTrace.getStyleClass().addAll("red", "box");
        stackTrace.setVisible(false);
        stackTrace.setManaged(false);

        Button exit = new Button();
        exit.setText("Ok");
        exit.setOnAction(_ -> {
            Sound.playSfx(Sound.BACKWARD);
            Driver.setMenu(prev);
        });

        Button printStack = new Button("Print to console");
        printStack.setOnAction(_ -> {
            Sound.playSfx(Sound.FORWARD);
            e.printStackTrace();
        });

        ToggleButton showStack = new ToggleButton("Show Stack Trace");
        stackTrace.managedProperty().bind(showStack.selectedProperty());
        stackTrace.visibleProperty().bind(showStack.selectedProperty());

        HBox buttonBox = new HBox(exit, showStack, printStack);
        buttonBox.setSpacing(10);

        VBox main = new VBox(title, exView, stackTrace);
        main.getStyleClass().add("box");
        main.setPadding(new Insets(10));
        main.setSpacing(10);

        VBox centerBox = new VBox();
        centerBox.getChildren().addAll(main, buttonBox);
        centerBox.setSpacing(10);
        centerBox.setAlignment(Pos.CENTER);

        content.getChildren().add(centerBox);
        content.setAlignment(Pos.CENTER);
    }

    /**
     * Error display with a message and Cancel and Proceed buttons
     * @param message The message to display
     * @param prev The destination of the Cancel button
     * @param next The destination of the Proceed button
     */
    public ErrorDisplay(String message, Page prev, Page next) {
        Label main = new Label(message);
        main.getStyleClass().add("box");
        main.setPadding(new Insets(10));
        main.setWrapText(true);

        Button exit = new Button();
        exit.setText("Cancel");
        exit.setOnAction(_ -> {
            Sound.playSfx(Sound.BACKWARD);
            Driver.setMenu(prev);
        });

        Button nextButton = new Button();
        nextButton.setText("Proceed");
        nextButton.setOnAction(_ -> {
            Sound.playSfx(Sound.FORWARD);
            Driver.setMenu(next);
        });

        HBox bottom = new HBox(exit, nextButton);
        bottom.setAlignment(Pos.CENTER);
        bottom.setSpacing(10);

        VBox centerBox = new VBox();
        centerBox.getChildren().addAll(main, bottom);
        centerBox.setSpacing(10);
        centerBox.setAlignment(Pos.CENTER);

        content.getChildren().add(centerBox);
        content.setAlignment(Pos.CENTER);
    }

    @Override
    public Pane getContent() {
        return content;
    }
}