From 01b61c9e9e263240bac6d0e6497d4f80548aedf3 Mon Sep 17 00:00:00 2001 From: yuu <58155530+kagiura@users.noreply.github.com> Date: Fri, 7 Feb 2025 15:38:59 +0800 Subject: [PATCH 01/18] add basic initial greeting / terminating msgs --- src/main/java/Duke.java | 10 ---------- src/main/java/Wen.java | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 10 deletions(-) delete mode 100644 src/main/java/Duke.java create mode 100644 src/main/java/Wen.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java deleted file mode 100644 index 5d313334c..000000000 --- a/src/main/java/Duke.java +++ /dev/null @@ -1,10 +0,0 @@ -public class Duke { - public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - } -} diff --git a/src/main/java/Wen.java b/src/main/java/Wen.java new file mode 100644 index 000000000..dd120afef --- /dev/null +++ b/src/main/java/Wen.java @@ -0,0 +1,17 @@ +public class Wen { + public static void main(String[] args) { + initializeAndGreet(); + terminateAndGoodbye(); + } + + private static void initializeAndGreet() { + System.out.println("Hello, I'm Wen!"); + System.out.println("Let me know what I can help you with~☆"); + } + + private static void terminateAndGoodbye() { + System.out.println(); + System.out.println("Aw, you're already going?"); + System.out.println("It's okay, let's meet again soon!"); + } +} From 43d34ef9d071478cca6440b05af55de86b890cdd Mon Sep 17 00:00:00 2001 From: kagiura <58155530+kagiura@users.noreply.github.com> Date: Fri, 7 Feb 2025 15:52:36 +0800 Subject: [PATCH 02/18] setup basic command struct / echo --- src/main/java/Wen.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/Wen.java b/src/main/java/Wen.java index dd120afef..6e51cfa33 100644 --- a/src/main/java/Wen.java +++ b/src/main/java/Wen.java @@ -1,9 +1,27 @@ +import java.util.Scanner; + public class Wen { public static void main(String[] args) { initializeAndGreet(); + + String command = ""; + Scanner in = new Scanner(System.in); + + while (!command.equals("bye")) { + command = in.nextLine(); + switch (command) { + case "bye": + break; + default: + System.out.println(command); + break; + } + } + terminateAndGoodbye(); } + private static void initializeAndGreet() { System.out.println("Hello, I'm Wen!"); System.out.println("Let me know what I can help you with~☆"); @@ -13,5 +31,7 @@ private static void terminateAndGoodbye() { System.out.println(); System.out.println("Aw, you're already going?"); System.out.println("It's okay, let's meet again soon!"); + + System.exit(0); } } From 7796838a25f1c430b2e6135898374eeb96aa5193 Mon Sep 17 00:00:00 2001 From: kagiura <58155530+kagiura@users.noreply.github.com> Date: Thu, 13 Feb 2025 16:01:13 +0800 Subject: [PATCH 03/18] add tasks --- src/main/java/Task.java | 20 ++++++++++++++++++++ src/main/java/Wen.java | 39 +++++++++++++++++++++++++++++++++++---- 2 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 src/main/java/Task.java diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 000000000..486f0977d --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,20 @@ +public class Task { + protected String description; + protected boolean isDone; + + public Task(String description) { + this.description = description; + this.isDone = false; + } + + public String getStatusIcon() { + return (isDone ? "X" : " "); // mark done task with X + } + + public void print() { + System.out.print("[" + (isDone ? "X" : " ") + "] "); + System.out.println(description); + } + + //... +} diff --git a/src/main/java/Wen.java b/src/main/java/Wen.java index 6e51cfa33..68625ed96 100644 --- a/src/main/java/Wen.java +++ b/src/main/java/Wen.java @@ -1,19 +1,34 @@ import java.util.Scanner; public class Wen { + + private static int taskCount = 0; + private static Task[] tasks = new Task[100]; + public static void main(String[] args) { initializeAndGreet(); - String command = ""; + String input = ""; Scanner in = new Scanner(System.in); - while (!command.equals("bye")) { - command = in.nextLine(); + while (!input.equals("bye")) { + input = in.nextLine(); + final String command = input.split(" ", 2)[0]; + final String commandArgs = input.split(" ", 2).length > 1 ? input.split(" ", 2)[1] : ""; + switch (command) { case "bye": break; + + case "list": + printTasks(); + break; + + + default: - System.out.println(command); + addTask(input); +// System.out.println("Unknown command \""+command+"\"! Double check your message and try running again~"); break; } } @@ -34,4 +49,20 @@ private static void terminateAndGoodbye() { System.exit(0); } + + private static void printTasks() { + System.out.println("You currently have " + taskCount + " tasks!"); + for (int i=0; i Date: Fri, 14 Feb 2025 15:40:10 +0800 Subject: [PATCH 04/18] add complete/incomplete statuses --- src/main/java/Task.java | 8 +++++++- src/main/java/Wen.java | 24 ++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 486f0977d..36cec88ea 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -16,5 +16,11 @@ public void print() { System.out.println(description); } - //... + public String toString() { + return "[" + (isDone ? "X" : " ") + "] " + description; + } + + public void setDone(boolean done){ + isDone = done; + } } diff --git a/src/main/java/Wen.java b/src/main/java/Wen.java index 68625ed96..8e429aac6 100644 --- a/src/main/java/Wen.java +++ b/src/main/java/Wen.java @@ -17,6 +17,7 @@ public static void main(String[] args) { final String commandArgs = input.split(" ", 2).length > 1 ? input.split(" ", 2)[1] : ""; switch (command) { + case "": case "bye": break; @@ -24,7 +25,17 @@ public static void main(String[] args) { printTasks(); break; - + case "mark": + case "unmark": + try { + int taskIndex = Integer.parseInt(commandArgs); + markTask(tasks[taskIndex -1], command.equals("mark")); + } catch (NumberFormatException e) { + System.out.println("The task number is formatted incorrectly!"); + } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { + System.out.println("This task doesn't exist!"); + } + break; default: addTask(input); @@ -53,7 +64,7 @@ private static void terminateAndGoodbye() { private static void printTasks() { System.out.println("You currently have " + taskCount + " tasks!"); for (int i=0; i Date: Fri, 14 Feb 2025 15:59:16 +0800 Subject: [PATCH 05/18] add todos, deadlines, and events --- src/main/java/Deadline.java | 14 ++++++++++ src/main/java/Event.java | 16 ++++++++++++ src/main/java/Todo.java | 11 ++++++++ src/main/java/Wen.java | 52 ++++++++++++++++++++++++++++++++++--- 4 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 src/main/java/Deadline.java create mode 100644 src/main/java/Event.java create mode 100644 src/main/java/Todo.java diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java new file mode 100644 index 000000000..2de70b754 --- /dev/null +++ b/src/main/java/Deadline.java @@ -0,0 +1,14 @@ +public class Deadline extends Task { + + protected String by; + + public Deadline(String description, String by) { + super(description); + this.by = by; + } + + @Override + public String toString() { + return "[D]" + super.toString() + " (by: " + by + ")"; + } +} \ No newline at end of file diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 000000000..98fe58570 --- /dev/null +++ b/src/main/java/Event.java @@ -0,0 +1,16 @@ +public class Event extends Task { + + protected String from; + protected String by; + + public Event(String description, String from, String by) { + super(description); + this.from = from; + this.by = by; + } + + @Override + public String toString() { + return "[E]" + super.toString() + " (from: " + from + " to: " + by + ")"; + } +} \ No newline at end of file diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java new file mode 100644 index 000000000..60b62f05c --- /dev/null +++ b/src/main/java/Todo.java @@ -0,0 +1,11 @@ +public class Todo extends Task { + + public Todo(String description) { + super(description); + } + + @Override + public String toString() { + return "[T]" + super.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/Wen.java b/src/main/java/Wen.java index 8e429aac6..90ef94d06 100644 --- a/src/main/java/Wen.java +++ b/src/main/java/Wen.java @@ -37,9 +37,37 @@ public static void main(String[] args) { } break; + case "todo": + addTodo(commandArgs.trim()); + break; + + case "deadline": + if (!commandArgs.contains("/by")) { + System.out.println("Please specify a due date using /by!"); + break; + } + final String deadlineDesc = commandArgs.split("/by", 2)[0].trim(); + final String deadlineBy = commandArgs.split("/by", 2)[1].trim(); + + addDeadline(deadlineDesc, deadlineBy); + break; + + + case "event": + if (!commandArgs.contains("/from") || !commandArgs.contains("/to")) { + System.out.println("Please specify the event duration using /from and /to!"); + break; + } + final String eventDesc = commandArgs.split("/from", 2)[0].split("/to", 2)[0].trim(); + final String eventFrom = commandArgs.split("/from", 2)[1].split("/to", 2)[0].trim(); + final String eventTo = commandArgs.split("/to", 2)[1].split("/from", 2)[0].trim(); + + addEvent(eventDesc, eventFrom, eventTo); + break; + default: - addTask(input); -// System.out.println("Unknown command \""+command+"\"! Double check your message and try running again~"); +// addTask(input); + System.out.println("Unknown command \""+command+"\"! Double check your message and try running again~"); break; } } @@ -71,7 +99,7 @@ private static void printTasks() { private static void addTask(String description) { tasks[taskCount] = new Task(description); - System.out.println("Task added succesfully:"); + System.out.println("Task added successfully:"); tasks[taskCount].print(); taskCount++; @@ -85,4 +113,22 @@ private static void markTask(Task task, boolean done) { System.out.println("Task marked as incomplete: " + task); } } + + private static void addTodo(String description) { + tasks[taskCount] = new Todo(description); + System.out.println("Task added successfully:" + tasks[taskCount]); + taskCount++; + } + + private static void addDeadline(String desc, String by) { + tasks[taskCount] = new Deadline(desc, by); + System.out.println("Task added successfully:" + tasks[taskCount]); + taskCount++; + } + + private static void addEvent(String desc, String from, String to) { + tasks[taskCount] = new Event(desc, from, to); + System.out.println("Task added successfully:" + tasks[taskCount]); + taskCount++; + } } From e5d9ddf4999b6143911cd18b999a2d9826c515f2 Mon Sep 17 00:00:00 2001 From: kagiura <58155530+kagiura@users.noreply.github.com> Date: Thu, 20 Feb 2025 22:35:19 +0800 Subject: [PATCH 06/18] add basic text-based testing --- text-ui-test/EXPECTED.TXT | 15 ++++++++------- text-ui-test/input.txt | 4 ++++ text-ui-test/runtest.sh | 4 ++-- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 657e74f6e..218f4f337 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,7 +1,8 @@ -Hello from - ____ _ -| _ \ _ _| | _____ -| | | | | | | |/ / _ \ -| |_| | |_| | < __/ -|____/ \__,_|_|\_\___| - +Hello, I'm Wen! +Let me know what I can help you with~☆ +Unknown command "test"! Double check your message and try running again~ +Task added successfully:[E][ ] hello (from: today to: tomorrow) +Task added successfully:[T][ ] hi +You currently have 2 tasks! +1. [E][ ] hello (from: today to: tomorrow) +2. [T][ ] hi diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index e69de29bb..ebda8ae15 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -0,0 +1,4 @@ +test +event hello /to tomorrow /from today +todo hi +list diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh index c9ec87003..1a08892a4 100644 --- a/text-ui-test/runtest.sh +++ b/text-ui-test/runtest.sh @@ -13,14 +13,14 @@ then fi # compile the code into the bin folder, terminates if error occurred -if ! javac -cp ../src/main/java -Xlint:none -d ../bin ../src/main/java/*.java +if ! javac -cp ../src/main/java -Xlint:none -d ../bin ../src/main/java/Wen.java then echo "********** BUILD FAILURE **********" exit 1 fi # run the program, feed commands from input.txt file and redirect the output to the ACTUAL.TXT -java -classpath ../bin Duke < input.txt > ACTUAL.TXT +java -classpath ../bin Wen < input.txt > ACTUAL.TXT # convert to UNIX format cp EXPECTED.TXT EXPECTED-UNIX.TXT From 6a25e19ba061cd06c82f7dcd8ceeca6f499e4179 Mon Sep 17 00:00:00 2001 From: kagiura <58155530+kagiura@users.noreply.github.com> Date: Thu, 20 Feb 2025 22:44:54 +0800 Subject: [PATCH 07/18] clean up code + linted --- src/main/java/Wen.java | 108 +++++++++++++++++++---------------------- 1 file changed, 50 insertions(+), 58 deletions(-) diff --git a/src/main/java/Wen.java b/src/main/java/Wen.java index 90ef94d06..413f3db8f 100644 --- a/src/main/java/Wen.java +++ b/src/main/java/Wen.java @@ -2,8 +2,9 @@ public class Wen { + private static final int TASK_COUNT = 100; private static int taskCount = 0; - private static Task[] tasks = new Task[100]; + private static Task[] tasks = new Task[TASK_COUNT]; public static void main(String[] args) { initializeAndGreet(); @@ -11,65 +12,65 @@ public static void main(String[] args) { String input = ""; Scanner in = new Scanner(System.in); + while (!input.equals("bye")) { - input = in.nextLine(); final String command = input.split(" ", 2)[0]; final String commandArgs = input.split(" ", 2).length > 1 ? input.split(" ", 2)[1] : ""; switch (command) { - case "": - case "bye": + case "": + break; + + case "list": + printTasks(); + break; + + case "mark": + case "unmark": + try { + int taskIndex = Integer.parseInt(commandArgs); + markTask(tasks[taskIndex - 1], command.equals("mark")); + } catch (NumberFormatException e) { + System.out.println("The task number is formatted incorrectly!"); + } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { + System.out.println("This task doesn't exist!"); + } + break; + + case "todo": + addTodo(commandArgs.trim()); + break; + + case "deadline": + if (!commandArgs.contains("/by")) { + System.out.println("Please specify a due date using /by!"); break; + } + final String deadlineDesc = commandArgs.split("/by", 2)[0].trim(); + final String deadlineBy = commandArgs.split("/by", 2)[1].trim(); - case "list": - printTasks(); - break; + addDeadline(deadlineDesc, deadlineBy); + break; - case "mark": - case "unmark": - try { - int taskIndex = Integer.parseInt(commandArgs); - markTask(tasks[taskIndex -1], command.equals("mark")); - } catch (NumberFormatException e) { - System.out.println("The task number is formatted incorrectly!"); - } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { - System.out.println("This task doesn't exist!"); - } - break; - case "todo": - addTodo(commandArgs.trim()); + case "event": + if (!commandArgs.contains("/from") || !commandArgs.contains("/to")) { + System.out.println("Please specify the event duration using /from and /to!"); break; + } + final String eventDesc = commandArgs.split("/from", 2)[0].split("/to", 2)[0].trim(); + final String eventFrom = commandArgs.split("/from", 2)[1].split("/to", 2)[0].trim(); + final String eventTo = commandArgs.split("/to", 2)[1].split("/from", 2)[0].trim(); - case "deadline": - if (!commandArgs.contains("/by")) { - System.out.println("Please specify a due date using /by!"); - break; - } - final String deadlineDesc = commandArgs.split("/by", 2)[0].trim(); - final String deadlineBy = commandArgs.split("/by", 2)[1].trim(); - - addDeadline(deadlineDesc, deadlineBy); - break; - - - case "event": - if (!commandArgs.contains("/from") || !commandArgs.contains("/to")) { - System.out.println("Please specify the event duration using /from and /to!"); - break; - } - final String eventDesc = commandArgs.split("/from", 2)[0].split("/to", 2)[0].trim(); - final String eventFrom = commandArgs.split("/from", 2)[1].split("/to", 2)[0].trim(); - final String eventTo = commandArgs.split("/to", 2)[1].split("/from", 2)[0].trim(); - - addEvent(eventDesc, eventFrom, eventTo); - break; + addEvent(eventDesc, eventFrom, eventTo); + break; - default: -// addTask(input); - System.out.println("Unknown command \""+command+"\"! Double check your message and try running again~"); - break; + default: + System.out.println("Unknown command \"" + command + "\"! Double check your message and try running again~"); + break; } + + input = in.nextLine(); } terminateAndGoodbye(); @@ -91,20 +92,11 @@ private static void terminateAndGoodbye() { private static void printTasks() { System.out.println("You currently have " + taskCount + " tasks!"); - for (int i=0; i Date: Thu, 20 Feb 2025 22:48:34 +0800 Subject: [PATCH 08/18] add more description error messages --- src/main/java/Wen.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/Wen.java b/src/main/java/Wen.java index 413f3db8f..90cdafae0 100644 --- a/src/main/java/Wen.java +++ b/src/main/java/Wen.java @@ -56,6 +56,7 @@ public static void main(String[] args) { case "event": if (!commandArgs.contains("/from") || !commandArgs.contains("/to")) { System.out.println("Please specify the event duration using /from and /to!"); + System.out.println("Example: \"event Birthday party /from 6pm /to 8pm\""); break; } final String eventDesc = commandArgs.split("/from", 2)[0].split("/to", 2)[0].trim(); From a5aaf5d60a021bff4df266fc343054b965bd3b92 Mon Sep 17 00:00:00 2001 From: kagiura <58155530+kagiura@users.noreply.github.com> Date: Thu, 20 Feb 2025 23:02:26 +0800 Subject: [PATCH 09/18] switch to arraylist for dynamic task storage --- src/main/java/Wen.java | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/Wen.java b/src/main/java/Wen.java index 90cdafae0..cf6ed8b1a 100644 --- a/src/main/java/Wen.java +++ b/src/main/java/Wen.java @@ -1,10 +1,9 @@ +import java.util.ArrayList; import java.util.Scanner; public class Wen { - private static final int TASK_COUNT = 100; - private static int taskCount = 0; - private static Task[] tasks = new Task[TASK_COUNT]; + private static final ArrayList tasks = new ArrayList(); public static void main(String[] args) { initializeAndGreet(); @@ -29,7 +28,7 @@ public static void main(String[] args) { case "unmark": try { int taskIndex = Integer.parseInt(commandArgs); - markTask(tasks[taskIndex - 1], command.equals("mark")); + markTask(tasks.get(taskIndex - 1), command.equals("mark")); } catch (NumberFormatException e) { System.out.println("The task number is formatted incorrectly!"); } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { @@ -91,10 +90,14 @@ private static void terminateAndGoodbye() { System.exit(0); } + private static int taskCount() { + return tasks.size(); + } + private static void printTasks() { - System.out.println("You currently have " + taskCount + " tasks!"); - for (int i = 0; i < taskCount; i++) { - System.out.println(i + 1 + ". " + tasks[i]); + System.out.println("You currently have " + taskCount() + " tasks!"); + for (int i = 0; i < taskCount(); i++) { + System.out.println(i + 1 + ". " + tasks.get(i)); } } @@ -108,20 +111,17 @@ private static void markTask(Task task, boolean done) { } private static void addTodo(String description) { - tasks[taskCount] = new Todo(description); - System.out.println("Task added successfully:" + tasks[taskCount]); - taskCount++; + tasks.add(new Todo(description)); + System.out.println("Task added successfully:" + tasks.getLast()); } private static void addDeadline(String desc, String by) { - tasks[taskCount] = new Deadline(desc, by); - System.out.println("Task added successfully:" + tasks[taskCount]); - taskCount++; + tasks.add(new Deadline(desc, by)); + System.out.println("Task added successfully:" + tasks.getLast()); } private static void addEvent(String desc, String from, String to) { - tasks[taskCount] = new Event(desc, from, to); - System.out.println("Task added successfully:" + tasks[taskCount]); - taskCount++; + tasks.add(new Event(desc, from, to)); + System.out.println("Task added successfully:" + tasks.getLast()); } } From 41056b3cfa262e782a2cae167f4c4860c6d0f016 Mon Sep 17 00:00:00 2001 From: kagiura <58155530+kagiura@users.noreply.github.com> Date: Thu, 20 Feb 2025 23:07:44 +0800 Subject: [PATCH 10/18] add deletion function --- src/main/java/Wen.java | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/Wen.java b/src/main/java/Wen.java index cf6ed8b1a..3c13dcfef 100644 --- a/src/main/java/Wen.java +++ b/src/main/java/Wen.java @@ -3,7 +3,7 @@ public class Wen { - private static final ArrayList tasks = new ArrayList(); + private static final ArrayList tasks = new ArrayList<>(); public static void main(String[] args) { initializeAndGreet(); @@ -24,6 +24,17 @@ public static void main(String[] args) { printTasks(); break; + case "delete": + try { + int taskIndex = Integer.parseInt(commandArgs); + deleteTask(taskIndex -1); + } catch (NumberFormatException e) { + System.out.println("The task number is formatted incorrectly!"); + } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { + System.out.println("This task doesn't exist!"); + } + break; + case "mark": case "unmark": try { @@ -101,6 +112,14 @@ private static void printTasks() { } } + private static void deleteTask(int taskIndex) { + String taskToDelete = tasks.get(taskIndex - 1).toString(); + tasks.remove(taskIndex); + System.out.println("Task " + taskIndex + " has been deleted!"); + System.out.println("(" + taskToDelete + ")"); + System.out.println("You currently have " + taskCount() + " tasks!"); + } + private static void markTask(Task task, boolean done) { task.setDone(done); if (done) { From 2e25409db86b94c4e2d60bfdaed9e247ce8fa5f9 Mon Sep 17 00:00:00 2001 From: kagiura <58155530+kagiura@users.noreply.github.com> Date: Fri, 21 Feb 2025 00:19:30 +0800 Subject: [PATCH 11/18] add local saving --- .gitignore | 2 ++ src/main/java/Deadline.java | 6 ++++ src/main/java/Event.java | 7 +++++ src/main/java/Task.java | 36 ++++++++++++++++++++++ src/main/java/Todo.java | 5 +++ src/main/java/Wen.java | 24 +++++++++++++-- src/main/java/WenStorage.java | 57 +++++++++++++++++++++++++++++++++++ 7 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 src/main/java/WenStorage.java diff --git a/.gitignore b/.gitignore index 2873e189e..5d4449135 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ bin/ /text-ui-test/ACTUAL.TXT text-ui-test/EXPECTED-UNIX.TXT + +wen-storage.txt \ No newline at end of file diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 2de70b754..97f4ffb68 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -7,6 +7,12 @@ public Deadline(String description, String by) { this.by = by; } + public Deadline(String description, String by, boolean done) { + super(description); + this.by = by; + this.isDone = done; + } + @Override public String toString() { return "[D]" + super.toString() + " (by: " + by + ")"; diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 98fe58570..dcaf2e2f6 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -9,6 +9,13 @@ public Event(String description, String from, String by) { this.by = by; } + public Event(String description, String from, String by, boolean done) { + super(description); + this.from = from; + this.by = by; + this.isDone = done; + } + @Override public String toString() { return "[E]" + super.toString() + " (from: " + from + " to: " + by + ")"; diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 36cec88ea..9ed98ce0b 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -7,6 +7,42 @@ public Task(String description) { this.isDone = false; } + public Task fromString(String description) { + char taskType = description.charAt(1); + boolean taskDone = description.charAt(4) == 'X'; + + switch (taskType) { + case 'D': + String deadlineDesc = description.substring(7); + String deadline = ""; + int deadlineIndex = description.indexOf(" (by: ", 1); + if (deadlineIndex != -1) { + deadlineDesc = description.substring(7, deadlineIndex); + deadline = description.substring(deadlineIndex + 6, description.length() - 1); + } + return new Deadline(deadlineDesc, deadline, taskDone); + + case 'E': + String eventDesc = description.substring(7); + String from = ""; + String to = ""; + + int fromIndex = description.indexOf(" (from: ", 1); + int toIndex = description.indexOf(" to: ", 1); + if (fromIndex != -1 && toIndex != -1) { + eventDesc = description.substring(7, fromIndex); + from = description.substring(fromIndex + 8, toIndex); + to = description.substring(toIndex + 5, description.length() - 1); + } + + return new Event(eventDesc, from, to, taskDone); + + case 'T': // todo + default: // just in case ?? + return new Todo(description.substring(7), taskDone); + } + } + public String getStatusIcon() { return (isDone ? "X" : " "); // mark done task with X } diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java index 60b62f05c..a37b53317 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Todo.java @@ -4,6 +4,11 @@ public Todo(String description) { super(description); } + public Todo(String description, boolean done) { + super(description); + this.isDone = done; + } + @Override public String toString() { return "[T]" + super.toString(); diff --git a/src/main/java/Wen.java b/src/main/java/Wen.java index cf6ed8b1a..cb657d206 100644 --- a/src/main/java/Wen.java +++ b/src/main/java/Wen.java @@ -1,8 +1,9 @@ import java.util.ArrayList; +import java.util.Arrays; import java.util.Scanner; public class Wen { - + private static final WenStorage storage = new WenStorage(); private static final ArrayList tasks = new ArrayList(); public static void main(String[] args) { @@ -76,8 +77,19 @@ public static void main(String[] args) { terminateAndGoodbye(); } - private static void initializeAndGreet() { + if (!WenStorage.isFileExists()) { + WenStorage.writeToFile(new String[0]); + } + String[] data = WenStorage.readFromFile(); + if (data.length > 0) { + System.out.println("[I've loaded " + data.length + " tasks from your local storage!]"); + for (String datum : data) { + Task t = new Task("").fromString(datum); + tasks.add(t); + } + } + System.out.println("Hello, I'm Wen!"); System.out.println("Let me know what I can help you with~☆"); } @@ -90,6 +102,10 @@ private static void terminateAndGoodbye() { System.exit(0); } + private static void updateStorage() { + WenStorage.writeToFile(tasks.stream().map(Task::toString).toArray(String[]::new)); + } + private static int taskCount() { return tasks.size(); } @@ -103,6 +119,7 @@ private static void printTasks() { private static void markTask(Task task, boolean done) { task.setDone(done); + updateStorage(); if (done) { System.out.println("Task marked as done: " + task); } else { @@ -112,16 +129,19 @@ private static void markTask(Task task, boolean done) { private static void addTodo(String description) { tasks.add(new Todo(description)); + updateStorage(); System.out.println("Task added successfully:" + tasks.getLast()); } private static void addDeadline(String desc, String by) { tasks.add(new Deadline(desc, by)); + updateStorage(); System.out.println("Task added successfully:" + tasks.getLast()); } private static void addEvent(String desc, String from, String to) { tasks.add(new Event(desc, from, to)); + updateStorage(); System.out.println("Task added successfully:" + tasks.getLast()); } } diff --git a/src/main/java/WenStorage.java b/src/main/java/WenStorage.java new file mode 100644 index 000000000..c5074f6a5 --- /dev/null +++ b/src/main/java/WenStorage.java @@ -0,0 +1,57 @@ +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Scanner; + +public class WenStorage { + private static File storageFile; + private static final String filePath = "./wen-storage.txt"; + + WenStorage() { + storageFile = new File(filePath); + } + + public static boolean isFileExists() { + return storageFile.exists(); + } + + public static String getAbsolutePath() { + return storageFile.getAbsolutePath(); + } + + public static void writeToFile(String[] data) { + String dataString = ""; + for (String datum : data) { + dataString += datum; + dataString += System.lineSeparator(); + } + FileWriter fw = null; + try { + fw = new FileWriter(filePath); + fw.write( + dataString + ); + fw.close(); + } catch (IOException e) { + System.out.println("Error writing to file! This may be because your memory is full, or the file is corrupted :("); + } + } + + public static String[] readFromFile() { + ArrayList output = new ArrayList<>(); + Scanner s = null; // create a Scanner using the File as the source + try { + s = new Scanner(storageFile); + while (s.hasNext()) { +// System.out.println("|" + s.nextLine()); + output.add(s.nextLine()); + } + } catch (FileNotFoundException e) { + System.out.println("File not found!"); + } + return output.toArray(new String[0]); + } +} \ No newline at end of file From 6c436bffed5c51be844452c6f2e5a259cbcbe0eb Mon Sep 17 00:00:00 2001 From: kagiura <58155530+kagiura@users.noreply.github.com> Date: Fri, 14 Mar 2025 13:38:47 +0800 Subject: [PATCH 12/18] add tasklist --- src/main/java/TaskList.java | 81 +++++++++++++++++++++++++++++++++++ src/main/java/Wen.java | 81 ++++------------------------------- src/main/java/WenStorage.java | 6 +-- 3 files changed, 91 insertions(+), 77 deletions(-) create mode 100644 src/main/java/TaskList.java diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java new file mode 100644 index 000000000..722956c32 --- /dev/null +++ b/src/main/java/TaskList.java @@ -0,0 +1,81 @@ +import java.util.ArrayList; + +public class TaskList { + private final ArrayList tasks; + + public TaskList() { + tasks = new ArrayList<>(); + } + + private int count() { + return tasks.size(); + } + + public void print() { + System.out.println("You currently have " + count() + " tasks!"); + for (int i = 0; i < count(); i++) { + System.out.println(i + 1 + ". " + tasks.get(i)); + } + } + + + public void updateStorage() { + WenStorage.writeToFile(tasks.stream().map(Task::toString).toArray(String[]::new)); + } + + public Task getTask(int index) { + return tasks.get(index); + } + + public void deleteTask(int taskIndex) { + String taskToDelete = tasks.get(taskIndex - 1).toString(); + tasks.remove(taskIndex); + updateStorage(); + System.out.println("Task " + taskIndex + " has been deleted!"); + System.out.println("(" + taskToDelete + ")"); + System.out.println("You currently have " + count() + " tasks!"); + } + + public void markTask(int taskIndex, boolean done) { + Task task = tasks.get(taskIndex - 1); + task.setDone(done); + updateStorage(); + if (done) { + System.out.println("Task marked as done: " + task); + } else { + System.out.println("Task marked as incomplete: " + task); + } + } + + public void addTodo(String description) { + tasks.add(new Todo(description)); + updateStorage(); + System.out.println("Task added successfully:" + tasks.getLast()); + } + + public void addDeadline(String desc, String by) { + tasks.add(new Deadline(desc, by)); + updateStorage(); + System.out.println("Task added successfully:" + tasks.getLast()); + } + + public void addEvent(String desc, String from, String to) { + tasks.add(new Event(desc, from, to)); + updateStorage(); + System.out.println("Task added successfully:" + tasks.getLast()); + } + + public void initializeFromStorage(){ + if (!WenStorage.isFileExists()) { + WenStorage.writeToFile(new String[0]); + } + String[] data = WenStorage.readFromFile(); + if (data.length > 0) { + System.out.println("[I've loaded " + data.length + " tasks from your local storage!]"); + for (String datum : data) { + Task t = new Task("").fromString(datum); + tasks.add(t); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/Wen.java b/src/main/java/Wen.java index d4c670601..9932c8e39 100644 --- a/src/main/java/Wen.java +++ b/src/main/java/Wen.java @@ -3,8 +3,7 @@ import java.util.Scanner; public class Wen { - private static final WenStorage storage = new WenStorage(); - private static final ArrayList tasks = new ArrayList<>(); + private static TaskList tasks; public static void main(String[] args) { initializeAndGreet(); @@ -22,13 +21,13 @@ public static void main(String[] args) { break; case "list": - printTasks(); + tasks.print(); break; case "delete": try { int taskIndex = Integer.parseInt(commandArgs); - deleteTask(taskIndex -1); + tasks.deleteTask(taskIndex -1); } catch (NumberFormatException e) { System.out.println("The task number is formatted incorrectly!"); } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { @@ -40,7 +39,7 @@ public static void main(String[] args) { case "unmark": try { int taskIndex = Integer.parseInt(commandArgs); - markTask(tasks.get(taskIndex - 1), command.equals("mark")); + tasks.markTask(taskIndex - 1, command.equals("mark")); } catch (NumberFormatException e) { System.out.println("The task number is formatted incorrectly!"); } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { @@ -49,7 +48,7 @@ public static void main(String[] args) { break; case "todo": - addTodo(commandArgs.trim()); + tasks.addTodo(commandArgs.trim()); break; case "deadline": @@ -60,7 +59,7 @@ public static void main(String[] args) { final String deadlineDesc = commandArgs.split("/by", 2)[0].trim(); final String deadlineBy = commandArgs.split("/by", 2)[1].trim(); - addDeadline(deadlineDesc, deadlineBy); + tasks.addDeadline(deadlineDesc, deadlineBy); break; @@ -74,7 +73,7 @@ public static void main(String[] args) { final String eventFrom = commandArgs.split("/from", 2)[1].split("/to", 2)[0].trim(); final String eventTo = commandArgs.split("/to", 2)[1].split("/from", 2)[0].trim(); - addEvent(eventDesc, eventFrom, eventTo); + tasks.addEvent(eventDesc, eventFrom, eventTo); break; default: @@ -89,18 +88,8 @@ public static void main(String[] args) { } private static void initializeAndGreet() { - if (!WenStorage.isFileExists()) { - WenStorage.writeToFile(new String[0]); - } - String[] data = WenStorage.readFromFile(); - if (data.length > 0) { - System.out.println("[I've loaded " + data.length + " tasks from your local storage!]"); - for (String datum : data) { - Task t = new Task("").fromString(datum); - tasks.add(t); - } - } - + tasks = new TaskList(); + tasks.initializeFromStorage(); System.out.println("Hello, I'm Wen!"); System.out.println("Let me know what I can help you with~☆"); } @@ -112,56 +101,4 @@ private static void terminateAndGoodbye() { System.exit(0); } - - private static void updateStorage() { - WenStorage.writeToFile(tasks.stream().map(Task::toString).toArray(String[]::new)); - } - - private static int taskCount() { - return tasks.size(); - } - - private static void printTasks() { - System.out.println("You currently have " + taskCount() + " tasks!"); - for (int i = 0; i < taskCount(); i++) { - System.out.println(i + 1 + ". " + tasks.get(i)); - } - } - - private static void deleteTask(int taskIndex) { - String taskToDelete = tasks.get(taskIndex - 1).toString(); - tasks.remove(taskIndex); - updateStorage(); - System.out.println("Task " + taskIndex + " has been deleted!"); - System.out.println("(" + taskToDelete + ")"); - System.out.println("You currently have " + taskCount() + " tasks!"); - } - - private static void markTask(Task task, boolean done) { - task.setDone(done); - updateStorage(); - if (done) { - System.out.println("Task marked as done: " + task); - } else { - System.out.println("Task marked as incomplete: " + task); - } - } - - private static void addTodo(String description) { - tasks.add(new Todo(description)); - updateStorage(); - System.out.println("Task added successfully:" + tasks.getLast()); - } - - private static void addDeadline(String desc, String by) { - tasks.add(new Deadline(desc, by)); - updateStorage(); - System.out.println("Task added successfully:" + tasks.getLast()); - } - - private static void addEvent(String desc, String from, String to) { - tasks.add(new Event(desc, from, to)); - updateStorage(); - System.out.println("Task added successfully:" + tasks.getLast()); - } } diff --git a/src/main/java/WenStorage.java b/src/main/java/WenStorage.java index c5074f6a5..6ece435fa 100644 --- a/src/main/java/WenStorage.java +++ b/src/main/java/WenStorage.java @@ -7,12 +7,8 @@ import java.util.Scanner; public class WenStorage { - private static File storageFile; private static final String filePath = "./wen-storage.txt"; - - WenStorage() { - storageFile = new File(filePath); - } + private static final File storageFile = new File(filePath); public static boolean isFileExists() { return storageFile.exists(); From 682b7eaf673727b84a4f265672d090fcc212a262 Mon Sep 17 00:00:00 2001 From: kagiura <58155530+kagiura@users.noreply.github.com> Date: Fri, 14 Mar 2025 16:37:31 +0800 Subject: [PATCH 13/18] refactor main class --- src/main/java/TaskList.java | 10 +++++++++- src/main/java/Wen.java | 17 +++++++++++++---- src/main/java/WenStorage.java | 22 ++++++++++++++++------ 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 722956c32..44ebe0940 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -2,9 +2,17 @@ public class TaskList { private final ArrayList tasks; + private final WenStorage WenStorage; public TaskList() { tasks = new ArrayList<>(); + WenStorage = new WenStorage(); + } + + public TaskList(String filePath) { + tasks = new ArrayList<>(); + WenStorage = new WenStorage(filePath); + initializeFromStorage(filePath); } private int count() { @@ -65,7 +73,7 @@ public void addEvent(String desc, String from, String to) { System.out.println("Task added successfully:" + tasks.getLast()); } - public void initializeFromStorage(){ + public void initializeFromStorage(String filePath){ if (!WenStorage.isFileExists()) { WenStorage.writeToFile(new String[0]); } diff --git a/src/main/java/Wen.java b/src/main/java/Wen.java index 9932c8e39..ffd3804e0 100644 --- a/src/main/java/Wen.java +++ b/src/main/java/Wen.java @@ -3,9 +3,16 @@ import java.util.Scanner; public class Wen { - private static TaskList tasks; +// private static String storagePath = "./wen-storage.txt"; + private final TaskList tasks; + + private Wen(String storagePath) { + tasks = new TaskList(storagePath); + + } + + private void run() { - public static void main(String[] args) { initializeAndGreet(); String input = ""; @@ -87,9 +94,11 @@ public static void main(String[] args) { terminateAndGoodbye(); } + public static void main(String[] args) { + new Wen("./wen-storage.txt").run(); + } + private static void initializeAndGreet() { - tasks = new TaskList(); - tasks.initializeFromStorage(); System.out.println("Hello, I'm Wen!"); System.out.println("Let me know what I can help you with~☆"); } diff --git a/src/main/java/WenStorage.java b/src/main/java/WenStorage.java index 6ece435fa..6e941090d 100644 --- a/src/main/java/WenStorage.java +++ b/src/main/java/WenStorage.java @@ -7,18 +7,28 @@ import java.util.Scanner; public class WenStorage { - private static final String filePath = "./wen-storage.txt"; - private static final File storageFile = new File(filePath); + private final String filePath; + private final File storageFile; - public static boolean isFileExists() { + public WenStorage() { + filePath = "./wen-storage.txt"; + storageFile = new File(filePath); + } + + public WenStorage(String customFilePath) { + filePath = customFilePath; + storageFile = new File(filePath); + } + + public boolean isFileExists() { return storageFile.exists(); } - public static String getAbsolutePath() { + public String getAbsolutePath() { return storageFile.getAbsolutePath(); } - public static void writeToFile(String[] data) { + public void writeToFile(String[] data) { String dataString = ""; for (String datum : data) { dataString += datum; @@ -36,7 +46,7 @@ public static void writeToFile(String[] data) { } } - public static String[] readFromFile() { + public String[] readFromFile() { ArrayList output = new ArrayList<>(); Scanner s = null; // create a Scanner using the File as the source try { From f0cc6a0f903e8d7e8afb9f331d2573ecb09262ec Mon Sep 17 00:00:00 2001 From: kagiura <58155530+kagiura@users.noreply.github.com> Date: Fri, 14 Mar 2025 17:09:19 +0800 Subject: [PATCH 14/18] MORE OOP! --- src/main/java/Parser.java | 53 +++++++++++++++++++++++++++++++++++++++ src/main/java/Ui.java | 13 ++++++++++ src/main/java/Wen.java | 42 +++++++++---------------------- 3 files changed, 78 insertions(+), 30 deletions(-) create mode 100644 src/main/java/Parser.java create mode 100644 src/main/java/Ui.java diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java new file mode 100644 index 000000000..311647086 --- /dev/null +++ b/src/main/java/Parser.java @@ -0,0 +1,53 @@ +import java.util.HashMap; +import java.util.Map; + +public class Parser { + private String input; + private String commandName; + private String commandArgsString; + private Map commandArgs; + + + Parser(String input) { + this.input = input; + + commandName = input.split(" ", 2)[0]; + commandArgsString = input.split(" ", 2).length > 1 ? input.split(" ", 2)[1] : ""; + + commandArgs = new HashMap<>(); + + String[] commandParts = commandArgsString.split("/"); + if (commandParts.length > 1) { + commandArgs.put("", commandParts[0]); + for (int i = 1; i < commandParts.length; i++) { + String argName = commandParts[i].split(" ")[0].trim(); + String argValue = commandParts[i].split(" ").length > 1 ? commandParts[i].split(" ", 2)[1].trim() : ""; + commandArgs.put(argName, argValue); + } + } else { + commandArgs.put("", commandArgsString); + } + + } + + public boolean equals(String name) { + return commandName.equals(name); + } + + public String getName() { + return commandName; + } + + public String getArg(){ + return commandArgs.get(""); + } + + public String getArg(String arg) { + return commandArgs.get(arg); + } + + public boolean hasArg(String arg) { + return commandArgs.containsKey(arg); + } + +} \ No newline at end of file diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java new file mode 100644 index 000000000..af6fbdc49 --- /dev/null +++ b/src/main/java/Ui.java @@ -0,0 +1,13 @@ +public class Ui { + + public static void greet() { + System.out.println("Hello, I'm Wen!"); + System.out.println("Let me know what I can help you with~☆"); + } + + public static void goodbye() { + System.out.println(); + System.out.println("Aw, you're already going?"); + System.out.println("It's okay, let's meet again soon!"); + } +} \ No newline at end of file diff --git a/src/main/java/Wen.java b/src/main/java/Wen.java index ffd3804e0..8dc8a994f 100644 --- a/src/main/java/Wen.java +++ b/src/main/java/Wen.java @@ -8,22 +8,20 @@ public class Wen { private Wen(String storagePath) { tasks = new TaskList(storagePath); - } private void run() { - initializeAndGreet(); + Ui.greet(); String input = ""; Scanner in = new Scanner(System.in); while (!input.equals("bye")) { - final String command = input.split(" ", 2)[0]; - final String commandArgs = input.split(" ", 2).length > 1 ? input.split(" ", 2)[1] : ""; + Parser command = new Parser(input); - switch (command) { + switch (command.getName()) { case "": break; @@ -33,7 +31,7 @@ private void run() { case "delete": try { - int taskIndex = Integer.parseInt(commandArgs); + int taskIndex = Integer.parseInt(command.getArg()); tasks.deleteTask(taskIndex -1); } catch (NumberFormatException e) { System.out.println("The task number is formatted incorrectly!"); @@ -45,7 +43,7 @@ private void run() { case "mark": case "unmark": try { - int taskIndex = Integer.parseInt(commandArgs); + int taskIndex = Integer.parseInt(command.getArg()); tasks.markTask(taskIndex - 1, command.equals("mark")); } catch (NumberFormatException e) { System.out.println("The task number is formatted incorrectly!"); @@ -55,32 +53,27 @@ private void run() { break; case "todo": - tasks.addTodo(commandArgs.trim()); + tasks.addTodo(command.getArg()); break; case "deadline": - if (!commandArgs.contains("/by")) { + if (!command.hasArg("by")) { System.out.println("Please specify a due date using /by!"); break; } - final String deadlineDesc = commandArgs.split("/by", 2)[0].trim(); - final String deadlineBy = commandArgs.split("/by", 2)[1].trim(); - tasks.addDeadline(deadlineDesc, deadlineBy); + tasks.addDeadline(command.getArg(), command.getArg("by")); break; case "event": - if (!commandArgs.contains("/from") || !commandArgs.contains("/to")) { + if (!command.hasArg("from") || !command.hasArg("to")) { System.out.println("Please specify the event duration using /from and /to!"); System.out.println("Example: \"event Birthday party /from 6pm /to 8pm\""); break; } - final String eventDesc = commandArgs.split("/from", 2)[0].split("/to", 2)[0].trim(); - final String eventFrom = commandArgs.split("/from", 2)[1].split("/to", 2)[0].trim(); - final String eventTo = commandArgs.split("/to", 2)[1].split("/from", 2)[0].trim(); - tasks.addEvent(eventDesc, eventFrom, eventTo); + tasks.addEvent(command.getArg(), command.getArg("from"), command.getArg("to")); break; default: @@ -91,23 +84,12 @@ private void run() { input = in.nextLine(); } - terminateAndGoodbye(); + Ui.goodbye(); + System.exit(0); } public static void main(String[] args) { new Wen("./wen-storage.txt").run(); } - private static void initializeAndGreet() { - System.out.println("Hello, I'm Wen!"); - System.out.println("Let me know what I can help you with~☆"); - } - - private static void terminateAndGoodbye() { - System.out.println(); - System.out.println("Aw, you're already going?"); - System.out.println("It's okay, let's meet again soon!"); - - System.exit(0); - } } From 31b3d1abee0057e609d98b03e25f465717aa8d3f Mon Sep 17 00:00:00 2001 From: kagiura <58155530+kagiura@users.noreply.github.com> Date: Fri, 14 Mar 2025 17:25:44 +0800 Subject: [PATCH 15/18] implemented find command --- src/main/java/Parser.java | 9 +++------ src/main/java/Task.java | 4 ++++ src/main/java/TaskList.java | 20 ++++++++++++++++++++ src/main/java/Ui.java | 1 - src/main/java/Wen.java | 17 +++++++++++++++-- 5 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index 311647086..fecc38152 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -2,17 +2,14 @@ import java.util.Map; public class Parser { - private String input; - private String commandName; - private String commandArgsString; - private Map commandArgs; + private final String commandName; + private final Map commandArgs; Parser(String input) { - this.input = input; commandName = input.split(" ", 2)[0]; - commandArgsString = input.split(" ", 2).length > 1 ? input.split(" ", 2)[1] : ""; + String commandArgsString = input.split(" ", 2).length > 1 ? input.split(" ", 2)[1] : ""; commandArgs = new HashMap<>(); diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 9ed98ce0b..c99428938 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -52,6 +52,10 @@ public void print() { System.out.println(description); } + public String getDescription() { + return description; + } + public String toString() { return "[" + (isDone ? "X" : " ") + "] " + description; } diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 44ebe0940..bf696c1fe 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -1,3 +1,4 @@ +import java.lang.reflect.Array; import java.util.ArrayList; public class TaskList { @@ -35,6 +36,15 @@ public Task getTask(int index) { return tasks.get(index); } + public int getIndex(Task task) { + for (int i = 0; i < count(); i++) { + if (tasks.get(i).equals(task)) { + return i; + } + } + return -1; + } + public void deleteTask(int taskIndex) { String taskToDelete = tasks.get(taskIndex - 1).toString(); tasks.remove(taskIndex); @@ -55,6 +65,16 @@ public void markTask(int taskIndex, boolean done) { } } + public ArrayList findTask(String query) { + ArrayList foundTasks = new ArrayList<>(); + for (int i = 0; i < count(); i++) { + if (tasks.get(i).getDescription().contains(query)) { + foundTasks.add(tasks.get(i)); + } + } + return foundTasks; + } + public void addTodo(String description) { tasks.add(new Todo(description)); updateStorage(); diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index af6fbdc49..dfd5eddd5 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -1,5 +1,4 @@ public class Ui { - public static void greet() { System.out.println("Hello, I'm Wen!"); System.out.println("Let me know what I can help you with~☆"); diff --git a/src/main/java/Wen.java b/src/main/java/Wen.java index 8dc8a994f..7847b6742 100644 --- a/src/main/java/Wen.java +++ b/src/main/java/Wen.java @@ -40,6 +40,20 @@ private void run() { } break; + case "find": + ArrayList foundTasks = tasks.findTask(command.getArg()); + if (foundTasks.isEmpty()) { + System.out.println("There are no tasks found!"); + } else { + System.out.println("Found " + foundTasks.size() + " tasks!"); + for (Task task : foundTasks) { + System.out.print(tasks.getIndex(task)+1); + System.out.print(". "); + System.out.println(task); + } + } + break; + case "mark": case "unmark": try { @@ -65,7 +79,6 @@ private void run() { tasks.addDeadline(command.getArg(), command.getArg("by")); break; - case "event": if (!command.hasArg("from") || !command.hasArg("to")) { System.out.println("Please specify the event duration using /from and /to!"); @@ -77,7 +90,7 @@ private void run() { break; default: - System.out.println("Unknown command \"" + command + "\"! Double check your message and try running again~"); + System.out.println("Unknown command \"" + command.getName() + "\"! Double check your message and try running again~"); break; } From 028c81239ddd624a7c8d34575cdbbca5844e02d5 Mon Sep 17 00:00:00 2001 From: kagiura <58155530+kagiura@users.noreply.github.com> Date: Fri, 14 Mar 2025 17:44:15 +0800 Subject: [PATCH 16/18] added javadoc --- src/main/java/Task.java | 24 ++++++++++++++++++++ src/main/java/TaskList.java | 42 ++++++++++++++++++++++++++++++----- src/main/java/Ui.java | 6 +++++ src/main/java/WenStorage.java | 26 +++++++++++++++++----- 4 files changed, 86 insertions(+), 12 deletions(-) diff --git a/src/main/java/Task.java b/src/main/java/Task.java index c99428938..df32c760a 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,12 +1,24 @@ +/** + * A task where users can mark as done/undone, with different specific types + */ public class Task { protected String description; protected boolean isDone; + /** + * Create a new task + * @param description basic description + */ public Task(String description) { this.description = description; this.isDone = false; } + /** + * Parse the task from a string, usually for reading saved tasks. + * @param description The string to parse the task from + * @return a new task object, one of three types (Deadline, Event, Todo) + */ public Task fromString(String description) { char taskType = description.charAt(1); boolean taskDone = description.charAt(4) == 'X'; @@ -52,14 +64,26 @@ public void print() { System.out.println(description); } + /** + * Get the task description + * @return String form of task description + */ public String getDescription() { return description; } + /** + * Gets a simplified representation of the task + * @return A string form of the task, including its done state + */ public String toString() { return "[" + (isDone ? "X" : " ") + "] " + description; } + /** + * Set the task to be done or not + * @param done New state of task to be set + */ public void setDone(boolean done){ isDone = done; } diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index bf696c1fe..1805dfce3 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -5,21 +5,37 @@ public class TaskList { private final ArrayList tasks; private final WenStorage WenStorage; + /** + * Create a list of tasks, and initialize stored value from the default path + * @see Task + */ public TaskList() { tasks = new ArrayList<>(); WenStorage = new WenStorage(); } + /** + * Create a list of task, and initialize stored value from a custom path + * @param filePath path of storage file + * @see WenStorage + */ public TaskList(String filePath) { tasks = new ArrayList<>(); WenStorage = new WenStorage(filePath); initializeFromStorage(filePath); } + /** + * Return size of task list + * @return integer, size of list + */ private int count() { return tasks.size(); } + /** + * Prettifies and prints all tasks on the list + */ public void print() { System.out.println("You currently have " + count() + " tasks!"); for (int i = 0; i < count(); i++) { @@ -27,15 +43,15 @@ public void print() { } } - - public void updateStorage() { + private void updateStorage() { WenStorage.writeToFile(tasks.stream().map(Task::toString).toArray(String[]::new)); } - public Task getTask(int index) { - return tasks.get(index); - } - + /** + * Find index of task + * @param task task to locate + * @return integer index, -1 if not found + */ public int getIndex(Task task) { for (int i = 0; i < count(); i++) { if (tasks.get(i).equals(task)) { @@ -45,6 +61,10 @@ public int getIndex(Task task) { return -1; } + /** + * Remove task from list + * @param taskIndex index of task to be removed + */ public void deleteTask(int taskIndex) { String taskToDelete = tasks.get(taskIndex - 1).toString(); tasks.remove(taskIndex); @@ -54,6 +74,11 @@ public void deleteTask(int taskIndex) { System.out.println("You currently have " + count() + " tasks!"); } + /** + * Mark task as complete / incomplete + * @param taskIndex index of task to check + * @param done status to be set + */ public void markTask(int taskIndex, boolean done) { Task task = tasks.get(taskIndex - 1); task.setDone(done); @@ -65,6 +90,11 @@ public void markTask(int taskIndex, boolean done) { } } + /** + * Find task based on a string search query (has to be exact match) + * @param query string to search for in descriptions + * @return a list of tasks that match the query + */ public ArrayList findTask(String query) { ArrayList foundTasks = new ArrayList<>(); for (int i = 0; i < count(); i++) { diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index dfd5eddd5..77eeb9d8f 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -1,9 +1,15 @@ public class Ui { + /** + * Greet users when starting app + */ public static void greet() { System.out.println("Hello, I'm Wen!"); System.out.println("Let me know what I can help you with~☆"); } + /** + * Say goodbye to server when quitting app + */ public static void goodbye() { System.out.println(); System.out.println("Aw, you're already going?"); diff --git a/src/main/java/WenStorage.java b/src/main/java/WenStorage.java index 6e941090d..5166f0668 100644 --- a/src/main/java/WenStorage.java +++ b/src/main/java/WenStorage.java @@ -10,24 +10,35 @@ public class WenStorage { private final String filePath; private final File storageFile; + /** + * Create a new storage instance using the default file path + */ public WenStorage() { filePath = "./wen-storage.txt"; storageFile = new File(filePath); } + /** + * Create a new storage instance using a custom file path + * @param customFilePath path to save info to, relative to the main code + */ public WenStorage(String customFilePath) { filePath = customFilePath; storageFile = new File(filePath); } + /** + * Check if the storage file exists + * @return boolean to represent file state + */ public boolean isFileExists() { return storageFile.exists(); } - public String getAbsolutePath() { - return storageFile.getAbsolutePath(); - } - + /** + * Write any string to file + * @param data array of strings, to be joined in the saved file with newlines (\n) + */ public void writeToFile(String[] data) { String dataString = ""; for (String datum : data) { @@ -46,13 +57,16 @@ public void writeToFile(String[] data) { } } + /** + * Read from file and return as strings + * @return array of strings, delimited with newlines (\n) + */ public String[] readFromFile() { ArrayList output = new ArrayList<>(); - Scanner s = null; // create a Scanner using the File as the source + Scanner s = null; try { s = new Scanner(storageFile); while (s.hasNext()) { -// System.out.println("|" + s.nextLine()); output.add(s.nextLine()); } } catch (FileNotFoundException e) { From 3e40dd5d2c2b949dce0757ba7093aa141d2202c7 Mon Sep 17 00:00:00 2001 From: kagiura <58155530+kagiura@users.noreply.github.com> Date: Fri, 14 Mar 2025 17:57:27 +0800 Subject: [PATCH 17/18] add user guide --- README.md | 93 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 67 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index af0309a9e..8e472bdc2 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,67 @@ -# Duke project template - -This is a project template for a greenfield Java project. It's named after the Java mascot _Duke_. Given below are instructions on how to use it. - -## Setting up in Intellij - -Prerequisites: JDK 17, update Intellij to the most recent version. - -1. Open Intellij (if you are not in the welcome screen, click `File` > `Close Project` to close the existing project first) -1. Open the project into Intellij as follows: - 1. Click `Open`. - 1. Select the project directory, and click `OK`. - 1. If there are any further prompts, accept the defaults. -1. Configure the project to use **JDK 17** (not other versions) as explained in [here](https://www.jetbrains.com/help/idea/sdk.html#set-up-jdk).
- In the same dialog, set the **Project language level** field to the `SDK default` option. -1. After that, locate the `src/main/java/Duke.java` file, right-click it, and choose `Run Duke.main()` (if the code editor is showing compile errors, try restarting the IDE). If the setup is correct, you should see something like the below as the output: - ``` - Hello from - ____ _ - | _ \ _ _| | _____ - | | | | | | | |/ / _ \ - | |_| | |_| | < __/ - |____/ \__,_|_|\_\___| - ``` - -**Warning:** Keep the `src\main\java` folder as the root folder for Java files (i.e., don't rename those folders or move Java files to another folder outside of this folder path), as this is the default location some tools (e.g., Gradle) expect to find Java files. +# Wen: Your assistant chatbot! + +This is Wen, your personal assistant for school-related tasks. Keep track of all your scheduling needs here! + +## User Guide + +### `todo` +Create a new to-do list item. +#### Example +```sh +todo Get some milk +``` + +### `deadline` +Create a new deadline. +#### Parameters +- `/by` - The deadline to complete this task by. +#### Example +```sh +deadline Complete CS2113 weekly quiz /by 12pm +``` + +### `event` +Create a new event. +#### Parameters +- `/from` - The start time of the event. +- `/to` - The end time of the event. +#### Example +```sh +deadline Join group meeting /from 5pm /to 8pm +``` + +### `list` +Displays all of your tasks. +#### Example +```sh +list +``` + +### `find` +Find a task with the search query in the description. +#### Parameters +The word you want to search for +#### Example +```sh +find CS2113 +``` + +### `mark` & `unmark` +Mark one of your tasks as done. +#### Parameters +The index of the task; you can find the task index by using `list` or `find` +#### Example +```sh +mark 5 +unmark 3 +``` + +### `delete` +Deletes one of your tasks +#### Parameters +The index of the task; you can find the task index by using `list` or `find` +#### Example +```sh +delete 4 +``` + From bf20df95c6551535405c9c7d9104bf476bc454ef Mon Sep 17 00:00:00 2001 From: kagiura <58155530+kagiura@users.noreply.github.com> Date: Fri, 14 Mar 2025 20:12:28 +0800 Subject: [PATCH 18/18] bug-fixing --- src/main/java/META-INF/MANIFEST.MF | 3 +++ src/main/java/Parser.java | 10 ++++++---- src/main/java/TaskList.java | 8 ++++---- src/main/java/Wen.java | 20 ++++++++++++++++---- 4 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 src/main/java/META-INF/MANIFEST.MF diff --git a/src/main/java/META-INF/MANIFEST.MF b/src/main/java/META-INF/MANIFEST.MF new file mode 100644 index 000000000..de13cdae7 --- /dev/null +++ b/src/main/java/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: Wen + diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index fecc38152..a39f516fa 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -4,6 +4,7 @@ public class Parser { private final String commandName; private final Map commandArgs; + private final String commandMainArg; Parser(String input) { @@ -15,15 +16,13 @@ public class Parser { String[] commandParts = commandArgsString.split("/"); if (commandParts.length > 1) { - commandArgs.put("", commandParts[0]); for (int i = 1; i < commandParts.length; i++) { String argName = commandParts[i].split(" ")[0].trim(); String argValue = commandParts[i].split(" ").length > 1 ? commandParts[i].split(" ", 2)[1].trim() : ""; commandArgs.put(argName, argValue); } - } else { - commandArgs.put("", commandArgsString); } + commandMainArg = commandParts[0].trim().isEmpty() ? null : commandParts[0].trim(); } @@ -36,13 +35,16 @@ public String getName() { } public String getArg(){ - return commandArgs.get(""); + return commandMainArg; } public String getArg(String arg) { return commandArgs.get(arg); } + public boolean hasArg() { + return commandMainArg != null; + } public boolean hasArg(String arg) { return commandArgs.containsKey(arg); } diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 1805dfce3..60341f5a9 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -67,7 +67,7 @@ public int getIndex(Task task) { */ public void deleteTask(int taskIndex) { String taskToDelete = tasks.get(taskIndex - 1).toString(); - tasks.remove(taskIndex); + tasks.remove(taskIndex -1); updateStorage(); System.out.println("Task " + taskIndex + " has been deleted!"); System.out.println("(" + taskToDelete + ")"); @@ -108,19 +108,19 @@ public ArrayList findTask(String query) { public void addTodo(String description) { tasks.add(new Todo(description)); updateStorage(); - System.out.println("Task added successfully:" + tasks.getLast()); + System.out.println("Task added successfully:" + tasks.get(tasks.size() - 1)); } public void addDeadline(String desc, String by) { tasks.add(new Deadline(desc, by)); updateStorage(); - System.out.println("Task added successfully:" + tasks.getLast()); + System.out.println("Task added successfully:" + tasks.get(tasks.size() - 1)); } public void addEvent(String desc, String from, String to) { tasks.add(new Event(desc, from, to)); updateStorage(); - System.out.println("Task added successfully:" + tasks.getLast()); + System.out.println("Task added successfully:" + tasks.get(tasks.size() - 1)); } public void initializeFromStorage(String filePath){ diff --git a/src/main/java/Wen.java b/src/main/java/Wen.java index 7847b6742..760229b45 100644 --- a/src/main/java/Wen.java +++ b/src/main/java/Wen.java @@ -32,10 +32,10 @@ private void run() { case "delete": try { int taskIndex = Integer.parseInt(command.getArg()); - tasks.deleteTask(taskIndex -1); + tasks.deleteTask(taskIndex); } catch (NumberFormatException e) { System.out.println("The task number is formatted incorrectly!"); - } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { + } catch (NullPointerException | IndexOutOfBoundsException e) { System.out.println("This task doesn't exist!"); } break; @@ -58,19 +58,27 @@ private void run() { case "unmark": try { int taskIndex = Integer.parseInt(command.getArg()); - tasks.markTask(taskIndex - 1, command.equals("mark")); + tasks.markTask(taskIndex, command.equals("mark")); } catch (NumberFormatException e) { System.out.println("The task number is formatted incorrectly!"); - } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { + } catch (NullPointerException | IndexOutOfBoundsException e) { System.out.println("This task doesn't exist!"); } break; case "todo": + if (!command.hasArg()) { + System.out.println("Please specify a description for this todo!"); + break; + } tasks.addTodo(command.getArg()); break; case "deadline": + if (!command.hasArg()) { + System.out.println("Please specify a description for this deadline!"); + break; + } if (!command.hasArg("by")) { System.out.println("Please specify a due date using /by!"); break; @@ -80,6 +88,10 @@ private void run() { break; case "event": + if (!command.hasArg()) { + System.out.println("Please specify a description for this event!"); + break; + } if (!command.hasArg("from") || !command.hasArg("to")) { System.out.println("Please specify the event duration using /from and /to!"); System.out.println("Example: \"event Birthday party /from 6pm /to 8pm\"");