diff --git a/Ui.png b/Ui.png index 4ad0bfda3b..3b33c839b6 100644 Binary files a/Ui.png and b/Ui.png differ diff --git a/src/main/java/duke/main/DialogBox.java b/src/main/java/duke/main/DialogBox.java index 9c3f5391bf..a3899d4aae 100644 --- a/src/main/java/duke/main/DialogBox.java +++ b/src/main/java/duke/main/DialogBox.java @@ -7,12 +7,17 @@ import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; +import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.control.Label; import javafx.scene.image.Image; import javafx.scene.image.ImageView; +import javafx.scene.layout.Background; +import javafx.scene.layout.BackgroundFill; +import javafx.scene.layout.CornerRadii; import javafx.scene.layout.HBox; +import javafx.scene.paint.Color; /** * An example of a custom control using FXML. @@ -34,9 +39,11 @@ private DialogBox(String text, Image img) { } catch (IOException e) { e.printStackTrace(); } - + this.setMinHeight(USE_PREF_SIZE); + this.setBackground(new Background(new BackgroundFill(Color.rgb(255, 252, 234), new CornerRadii(10), new Insets(5)))); dialog.setText(text); displayPicture.setImage(img); + } /** diff --git a/src/main/java/duke/main/MainConnector.java b/src/main/java/duke/main/MainConnector.java index a9682a9ae1..f391b86071 100644 --- a/src/main/java/duke/main/MainConnector.java +++ b/src/main/java/duke/main/MainConnector.java @@ -6,6 +6,9 @@ import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.Background; +import javafx.scene.layout.BackgroundFill; +import javafx.scene.paint.Color; import javafx.stage.Stage; /** @@ -18,7 +21,7 @@ public class MainConnector extends Application { @Override public void start(Stage stage) { try { - FXMLLoader fxmlLoader = new FXMLLoader(MainWindow.class.getResource("/view/MainWindow.fxml")); + FXMLLoader fxmlLoader = new FXMLLoader(MainWindow.class.getResource("/view/DialogBox.fxml")); AnchorPane ap = fxmlLoader.load(); Scene scene = new Scene(ap); stage.setScene(scene); diff --git a/src/main/java/duke/main/MainWindow.java b/src/main/java/duke/main/MainWindow.java index e58a8cc095..915809d4d5 100644 --- a/src/main/java/duke/main/MainWindow.java +++ b/src/main/java/duke/main/MainWindow.java @@ -3,12 +3,13 @@ import java.io.IOException; import javafx.fxml.FXML; +import javafx.geometry.Insets; import javafx.scene.control.Button; import javafx.scene.control.ScrollPane; import javafx.scene.control.TextField; import javafx.scene.image.Image; -import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.VBox; +import javafx.scene.layout.*; +import javafx.scene.paint.Color; /** * Controller for MainWindow. Provides the layout for the other controls. @@ -27,9 +28,7 @@ public class MainWindow extends AnchorPane { private Image userImage = new Image(this.getClass().getResourceAsStream("/images/user.jpg")); private Image dukeImage = new Image(this.getClass().getResourceAsStream("/images/bot.jpg")); - - - + public MainWindow() {} public void setProgramme(TalkingBox b) { main = b; } @@ -37,6 +36,7 @@ public void setProgramme(TalkingBox b) { @FXML public void initialize() { scrollPane.vvalueProperty().bind(dialogContainer.heightProperty()); + dialogContainer.setBackground(new Background(new BackgroundFill(Color.rgb(235, 255, 255), null, null))); showInit(); } @@ -45,7 +45,7 @@ public void initialize() { * the dialog container. Clears the user input after processing. */ @FXML - private void handleUserInput() throws IOException { + private void handleUserInput() { String input = userInput.getText(); String response; if (main.parser.isExit(input)) { @@ -65,7 +65,7 @@ private void handleUserInput() throws IOException { @FXML private void showInit() { dialogContainer.getChildren().addAll( - DialogBox.getDukeDialog("Hello! What tasks do you have?", dukeImage)); + DialogBox.getDukeDialog("Hello! What tasks do you have? (type 'help' for a list of available commands)", dukeImage)); } } diff --git a/src/main/java/duke/main/NotesList.java b/src/main/java/duke/main/NotesList.java index e0f318cc34..46562aba66 100644 --- a/src/main/java/duke/main/NotesList.java +++ b/src/main/java/duke/main/NotesList.java @@ -1,5 +1,7 @@ package duke.main; +import duke.exception.FileNotFoundException; + import java.util.ArrayList; /** @@ -8,7 +10,9 @@ public class NotesList { private final ArrayList notesList; public NotesList() { - this.notesList = Storage.readNotes(); + ArrayList notesList1; + notesList1 = Storage.readNotes(); + this.notesList = notesList1; } public void add(String note) { assert !note.isEmpty(); diff --git a/src/main/java/duke/main/Parser.java b/src/main/java/duke/main/Parser.java index ec6257a131..1e3564d45f 100644 --- a/src/main/java/duke/main/Parser.java +++ b/src/main/java/duke/main/Parser.java @@ -42,7 +42,6 @@ public String parse(String input) { try { TaskType type = TaskType.valueOf(commandType); String details = input.substring(taskEnd + 1); - switch (type) { case bye: return this.ui.printExitMessage(); @@ -104,13 +103,19 @@ public String parse(String input) { case notes: return this.ui.printAllNotes(); case remove: - this.notesList.remove(Integer.parseInt(details) - 1); - return this.ui.printOnDeleteNote(Integer.parseInt(details)); + try { + this.notesList.remove(Integer.parseInt(details)); + return this.ui.printOnDeleteNote(Integer.parseInt(details)); + } catch (ArrayIndexOutOfBoundsException e) { + return Ui.printException(e); + } + case help: + return this.ui.printHelp(); default: throw new UnknownInputException(); } } catch (IllegalArgumentException | InvalidIndexException | UnknownInputException e) { - return this.ui.printException(e); + return Ui.printException(new UnknownInputException()); } } } diff --git a/src/main/java/duke/main/Storage.java b/src/main/java/duke/main/Storage.java index 98e47a263d..be6d5fa3bf 100644 --- a/src/main/java/duke/main/Storage.java +++ b/src/main/java/duke/main/Storage.java @@ -18,6 +18,10 @@ import duke.task.Task; import duke.task.ToDo; +/** + * Class representing the storage system of the chatbot. + * Stores tasks entered by user on hard drive and loads them when the programme is started + */ public class Storage { private static TaskList taskList; @@ -51,71 +55,85 @@ public static void store() { } public static ArrayList readTasks() { ArrayList tasks = new ArrayList<>(); - Scanner file = new Scanner(PATH); - file.nextLine(); - while (file.hasNext()) { - String task = file.nextLine(); - String taskType = task.substring(4, 5); - System.out.println(taskType); - boolean isComplete = task.charAt(8) != ' '; - try { - switch (taskType) { - case "T": - String todoName = task.substring(11); - tasks.add(new ToDo(todoName)); - break; - case "D": - String deadlineName = task.substring(11, task.indexOf("(")); - String deadlineDueDate = timeParser(task.substring(task.indexOf("(" + 1), task.indexOf(")"))); - tasks.add(new Deadline(deadlineName, deadlineDueDate)); - break; - case "E": - String eventName = task.substring(11, task.indexOf("(")); - String eventStartTime = timeParser(task.substring(task.indexOf("(" + 1), task.indexOf(" to "))); - String eventEndTime = timeParser(task.split(" to ")[0].substring(0, task.split(" to ")[0].indexOf(")"))); - tasks.add(new Event(eventName, eventStartTime, eventEndTime)); - break; - default: - Ui.printException(new UnknownInputException()); - } - if (isComplete) { - tasks.get(tasks.size()).setComplete(); + try { + Scanner file = new Scanner(new File(PATH)); + file.nextLine(); + boolean endTasks = false; + while (file.hasNext() && !endTasks) { + String task = file.nextLine(); + if (!task.isEmpty() && !task.contains("NOTES")) { + String taskType = task.substring(4, 5); + System.out.println(taskType); + boolean isComplete = task.charAt(8) != ' '; + try { + switch (taskType) { + case "T": + String todoName = task.substring(11); + tasks.add(new ToDo(todoName)); + break; + case "D": + String deadlineName = task.substring(11, task.indexOf("(")); + String deadlineDueDate = timeParser(task.substring(task.indexOf("(") + 1, task.indexOf(")"))); + tasks.add(new Deadline(deadlineName, deadlineDueDate)); + break; + case "E": + String eventName = task.substring(11, task.indexOf("(")); + String eventStartTime = timeParser(task.substring(task.indexOf("(") + 1, task.indexOf(" to "))); + String eventEndTime = timeParser(task.split(" to ")[1].replace(")", "")); + tasks.add(new Event(eventName, eventStartTime, eventEndTime)); + break; + default: + Ui.printException(new UnknownInputException()); + } + if (isComplete) { + tasks.get(tasks.size() - 1).setComplete(); + } + } catch (DateFormatException d) { + Ui.printException(d); + } + } else { + endTasks = true; } - } catch (DateFormatException d) { - Ui.printException(d); } + file.close(); + } catch (java.io.FileNotFoundException e) { + Ui.printException(new FileNotFoundException()); } return tasks; } public static ArrayList readNotes() { - Scanner file = new Scanner(PATH); ArrayList notes = new ArrayList<>(); - boolean isNotes = false; - while (file.hasNext() && !isNotes) { - String curr = file.nextLine(); - if (curr.equals("-----NOTES-----")) { - isNotes = true; + try { + Scanner fileReader = new Scanner(new File(PATH)); + boolean isNotes = false; + while (fileReader.hasNext() && !isNotes) { + String curr = fileReader.nextLine(); + if (curr.contains("NOTES")) { + isNotes = true; + } } - } - while (file.hasNext()) { - String curr = file.nextLine(); - int start = curr.indexOf(" "); - notes.add(curr.substring(start)); + while (fileReader.hasNext()) { + String curr = fileReader.nextLine(); + int start = curr.indexOf(" "); + notes.add(curr.substring(start)); + } + fileReader.close(); + } catch (java.io.FileNotFoundException e) { + Ui.printException(new FileNotFoundException()); } return notes; } private static String timeParser(String date) { - String[] dateString = date.split(" "); + String[] input = date.split(", "); + String[] dateString = input[0].split(" "); DateTimeFormatter dtFormatter = DateTimeFormatter.ofPattern("MMM") .withLocale(Locale.ENGLISH); TemporalAccessor temporalAccessor = dtFormatter.parse(dateString[1]); int month = temporalAccessor.get(ChronoField.MONTH_OF_YEAR); - String[] timeString = dateString[3].split(":"); - int time = (Integer.parseInt(timeString[0]) + (dateString[3].contains("pm") ? 12 : 0)) * 100; - StringBuilder dueDate = new StringBuilder(); - dueDate.append(dateString[0] + '/' + month + '/' + dateString[2] + " " + time); - return dueDate.toString(); + String[] timeString = input[1].split(":"); + int time = (Integer.parseInt(timeString[0]) + (timeString[2].contains("pm") ? 12 : 0)) * 100; + return dateString[0] + '/' + month + '/' + dateString[2] + " " + time; } } diff --git a/src/main/java/duke/main/TaskList.java b/src/main/java/duke/main/TaskList.java index d1398bd8bb..9d0d2d2c6b 100644 --- a/src/main/java/duke/main/TaskList.java +++ b/src/main/java/duke/main/TaskList.java @@ -1,6 +1,7 @@ package duke.main; import java.util.ArrayList; +import duke.exception.FileNotFoundException; import duke.task.Task; diff --git a/src/main/java/duke/main/Ui.java b/src/main/java/duke/main/Ui.java index 6cc64c6d1c..b2b47d10ec 100644 --- a/src/main/java/duke/main/Ui.java +++ b/src/main/java/duke/main/Ui.java @@ -135,4 +135,19 @@ public String printOnDeleteNote(int i) { return "Removing note " + i + ". "; } + public String printHelp() { + return "List of available commands:" + + "\n\n list: view currently stored tasks " + + "\ntodo (task name): add a new todo task" + + "\ndeadline (task name) /by (due date): add a new deadline task" + + "\nevent (task name) /from (start time) /to (end time): add a new event task" + + "\nmark (index): mark a task as done" + + "\nunmark (index): mark a task as not done" + + "\ndelete (index): delete a task" + + "\nnotes: view currently stored notes" + + "\nwrite (note): add a new note" + + "\nremove (index): remove a note" + + "\nbye: close programme"; + } + } diff --git a/src/main/java/duke/task/TaskType.java b/src/main/java/duke/task/TaskType.java index a6b355d39b..e083bc724e 100644 --- a/src/main/java/duke/task/TaskType.java +++ b/src/main/java/duke/task/TaskType.java @@ -45,5 +45,6 @@ public enum TaskType { notes, remove, - bye; + bye, + help; } diff --git a/src/main/resources/images/bot.jpg b/src/main/resources/images/bot.jpg index f4e0b92a8d..d3b4decf85 100644 Binary files a/src/main/resources/images/bot.jpg and b/src/main/resources/images/bot.jpg differ diff --git a/src/main/resources/images/user.jpg b/src/main/resources/images/user.jpg index f4bb410b5c..95064a7512 100644 Binary files a/src/main/resources/images/user.jpg and b/src/main/resources/images/user.jpg differ diff --git a/src/main/resources/view/DialogBox.fxml b/src/main/resources/view/DialogBox.fxml index 59d16ac91a..98730bb429 100644 --- a/src/main/resources/view/DialogBox.fxml +++ b/src/main/resources/view/DialogBox.fxml @@ -5,9 +5,9 @@ - + - diff --git a/src/main/resources/view/MainWindow.fxml b/src/main/resources/view/MainWindow.fxml index 2e38327c99..33538f21a8 100644 --- a/src/main/resources/view/MainWindow.fxml +++ b/src/main/resources/view/MainWindow.fxml @@ -6,11 +6,11 @@ - + - -