forked from nus-cs2103-AY2122S2/ip
-
Notifications
You must be signed in to change notification settings - Fork 0
/
DukeWindow.java
114 lines (100 loc) · 3.48 KB
/
DukeWindow.java
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
package duke.gui;
import java.io.IOException;
import java.util.Objects;
import duke.Duke;
import duke.DukeException;
import duke.utils.DukeResponse;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;
public class DukeWindow extends AnchorPane {
@FXML
private ScrollPane scrollPane;
@FXML
private VBox dialogContainer;
@FXML
private TextField userInput;
@FXML
private Button sendButton;
private Duke duke;
private final Image dukeImage = new Image(
Objects.requireNonNull(this.getClass().getResourceAsStream("/images/red_default.png"))
);
private final Image dukeImageError = new Image(
Objects.requireNonNull(this.getClass().getResourceAsStream("/images/red_shocked.png"))
);
private final Image userImage = new Image(
Objects.requireNonNull(this.getClass().getResourceAsStream("/images/user.png"))
);
private final Image exitImage = new Image(
Objects.requireNonNull(this.getClass().getResourceAsStream("/images/exit_image.jpg"))
);
/**
* MainWindow is the window in which all Duke related GUI will exist and operate.
*/
public DukeWindow() {
try {
FXMLLoader fxmlLoader = new FXMLLoader(duke.gui.MainWindow.class.getResource("/view/DukeWindow.fxml"));
fxmlLoader.setController(this);
fxmlLoader.setRoot(this);
fxmlLoader.load();
} catch (IOException e) {
e.printStackTrace();
}
}
@FXML
public void initialize() {
scrollPane.vvalueProperty().bind(dialogContainer.heightProperty());
}
public void setDuke(Duke d) {
duke = d;
sendOutput(d.getGreeting());
}
private void sendOutput(String out) {
dialogContainer.getChildren().add(DialogBox.getDukeDialog(out, dukeImage));
}
/**
* Creates two dialog boxes, one echoing user input and the other containing Duke's reply and then appends them to
* the dialog container. Clears the user input after processing.
*/
@FXML
private void handleUserInput() {
String input = userInput.getText();
if (input.isBlank()) {
return;
}
try {
DukeResponse response = duke.getResponse(input);
if (response.getStatus() == DukeResponse.ResponseStatus.EXIT) {
handleExit();
userInput.clear();
return;
}
dialogContainer.getChildren().addAll(
DialogBox.getUserDialog(input, userImage),
DialogBox.getDukeDialog(response.getMessage(), dukeImage)
);
} catch (DukeException e) {
dialogContainer.getChildren().addAll(
DialogBox.getUserDialog(input, userImage),
DialogBox.getDukeDialog("Oops: " + e.getMessage(), dukeImageError)
);
}
userInput.clear();
}
private void handleExit() {
ImageView iv = new ImageView(exitImage);
iv.setFitHeight(200);
iv.setFitWidth(200);
dialogContainer.getChildren().add(iv);
userInput.setDisable(true);
sendButton.setText("Exit");
sendButton.setOnAction(event -> System.exit(0));
}
}