Skip to content

Commit

Permalink
Improve storage function
Browse files Browse the repository at this point in the history
Previously the program could not load stored information from hard disk

This has been corrected. Now the program can information the user has previously stored
  • Loading branch information
chenyixin0 committed Feb 26, 2024
1 parent 67996b1 commit d87e04e
Show file tree
Hide file tree
Showing 15 changed files with 128 additions and 69 deletions.
Binary file modified Ui.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 8 additions & 1 deletion src/main/java/duke/main/DialogBox.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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);

}

/**
Expand Down
5 changes: 4 additions & 1 deletion src/main/java/duke/main/MainConnector.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand All @@ -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);
Expand Down
14 changes: 7 additions & 7 deletions src/main/java/duke/main/MainWindow.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -27,16 +28,15 @@ 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;
}

@FXML
public void initialize() {
scrollPane.vvalueProperty().bind(dialogContainer.heightProperty());
dialogContainer.setBackground(new Background(new BackgroundFill(Color.rgb(235, 255, 255), null, null)));
showInit();
}

Expand All @@ -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)) {
Expand All @@ -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));
}
}

Expand Down
6 changes: 5 additions & 1 deletion src/main/java/duke/main/NotesList.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package duke.main;

import duke.exception.FileNotFoundException;

import java.util.ArrayList;

/**
Expand All @@ -8,7 +10,9 @@
public class NotesList {
private final ArrayList<String> notesList;
public NotesList() {
this.notesList = Storage.readNotes();
ArrayList<String> notesList1;
notesList1 = Storage.readNotes();
this.notesList = notesList1;
}
public void add(String note) {
assert !note.isEmpty();
Expand Down
13 changes: 9 additions & 4 deletions src/main/java/duke/main/Parser.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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());
}
}
}
Expand Down
114 changes: 66 additions & 48 deletions src/main/java/duke/main/Storage.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -51,71 +55,85 @@ public static void store() {
}
public static ArrayList<Task> readTasks() {
ArrayList<Task> 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<String> readNotes() {
Scanner file = new Scanner(PATH);
ArrayList<String> 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;
}

}
1 change: 1 addition & 0 deletions src/main/java/duke/main/TaskList.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package duke.main;
import java.util.ArrayList;

import duke.exception.FileNotFoundException;
import duke.task.Task;


Expand Down
15 changes: 15 additions & 0 deletions src/main/java/duke/main/Ui.java
Original file line number Diff line number Diff line change
Expand Up @@ -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";
}

}
3 changes: 2 additions & 1 deletion src/main/java/duke/task/TaskType.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,5 +45,6 @@ public enum TaskType {
notes,
remove,

bye;
bye,
help;
}
Binary file modified src/main/resources/images/bot.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/main/resources/images/user.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions src/main/resources/view/DialogBox.fxml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.HBox?>

<fx:root alignment="TOP_RIGHT" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefWidth="400.0" type="javafx.scene.layout.HBox" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1">
<fx:root alignment="TOP_RIGHT" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefWidth="400.0" type="javafx.scene.layout.HBox" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="duke.main.DialogBox">
<children>
<Label fx:id="dialog" text="Label" wrapText="true" />
<Label fx:id="dialog" wrapText="true" />
<ImageView fx:id="displayPicture" fitHeight="99.0" fitWidth="99.0" pickOnBounds="true" preserveRatio="true" />
</children>
<padding>
Expand Down
8 changes: 4 additions & 4 deletions src/main/resources/view/MainWindow.fxml
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.VBox?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="duke.main.MainWindow">
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="duke.main.MainWindow">
<children>
<TextField fx:id="userInput" layoutY="558.0" onAction="#handleUserInput" prefHeight="41.0" prefWidth="324.0" AnchorPane.bottomAnchor="1.0" />
<Button fx:id="sendButton" layoutX="324.0" layoutY="558.0" mnemonicParsing="false" onAction="#handleUserInput" prefHeight="41.0" prefWidth="76.0" text="Send" />
<ScrollPane fx:id="scrollPane" hbarPolicy="NEVER" hvalue="1.0" prefHeight="557.0" prefWidth="400.0" vvalue="1.0">
<TextField fx:id="userInput" layoutY="558.0" onAction="#handleUserInput" prefHeight="41.0" prefWidth="324.0" AnchorPane.bottomAnchor="1.0" AnchorPane.rightAnchor="76.0" />
<Button fx:id="sendButton" layoutX="324.0" layoutY="558.0" mnemonicParsing="false" onAction="#handleUserInput" prefHeight="41.0" prefWidth="76.0" text="Send" AnchorPane.bottomAnchor="0.6666666666666643" AnchorPane.rightAnchor="1.0" />
<ScrollPane fx:id="scrollPane" fitToHeight="true" fitToWidth="true" hbarPolicy="NEVER" hvalue="1.0" prefHeight="557.0" prefWidth="400.0" vvalue="1.0" AnchorPane.bottomAnchor="42.66666666666663" AnchorPane.leftAnchor="1.0" AnchorPane.rightAnchor="1.0" AnchorPane.topAnchor="1.0">
<content>
<VBox fx:id="dialogContainer" prefHeight="552.0" prefWidth="388.0" />
</content>
Expand Down
5 changes: 5 additions & 0 deletions src/test/java/duke/main/ParserTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,17 @@

import duke.task.ToDo;

import java.io.FileNotFoundException;

public class ParserTest {
private TaskList tempList = new TaskList();
private NotesList tempNotes = new NotesList();
private Ui tempUI = new Ui(tempList, tempNotes);
private Parser tempParse = new Parser(tempList, tempUI, tempNotes);

public ParserTest() throws FileNotFoundException {
}

@Test
public void task_parse_success() {
tempParse.parse("todo read book");
Expand Down

0 comments on commit d87e04e

Please sign in to comment.