From c1037daab0d828117e0cc3ae902d1d08c1f0d3bb Mon Sep 17 00:00:00 2001 From: paulktham <134585908+paulktham@users.noreply.github.com> Date: Wed, 21 Aug 2024 04:41:31 +0000 Subject: [PATCH 01/22] Level-0-a --- src/main/java/Tyrone.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/Tyrone.java diff --git a/src/main/java/Tyrone.java b/src/main/java/Tyrone.java new file mode 100644 index 000000000..44996e78a --- /dev/null +++ b/src/main/java/Tyrone.java @@ -0,0 +1,15 @@ +public class Tyrone { + public class Constants{ + public static final String line = "___________________________________"; + public static final String Whatcanido ="What can I do for you?"; + } + public static void main(String[] args) { + String logo = "tyrone"; + System.out.println(Constants.line); + System.out.println("Hello from\n" + logo); + System.out.println(Constants.Whatcanido); + System.out.println(Constants.line); + System.out.println("see you brother"); + System.out.println(Constants.line); + } +} From 3b4fe69c95b2de08ddaa9cd307ff7ea441989a6e Mon Sep 17 00:00:00 2001 From: paulktham <134585908+paulktham@users.noreply.github.com> Date: Wed, 21 Aug 2024 04:41:42 +0000 Subject: [PATCH 02/22] Level-0-b --- src/main/java/Duke.java | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 src/main/java/Duke.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); - } -} From 22faae3215db92299cdf57016165ccd1b1e7d769 Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 26 Aug 2024 19:47:02 +0800 Subject: [PATCH 03/22] Level-1 --- .gitignore | 3 +++ src/main/java/Tyrone.java | 26 ++++++++++++++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 2873e189e..2daefce85 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ bin/ /text-ui-test/ACTUAL.TXT text-ui-test/EXPECTED-UNIX.TXT + +src/main/java/Tyrone.class +src/main/java/Tyrone$Constants.class \ No newline at end of file diff --git a/src/main/java/Tyrone.java b/src/main/java/Tyrone.java index 44996e78a..60462c0fe 100644 --- a/src/main/java/Tyrone.java +++ b/src/main/java/Tyrone.java @@ -1,15 +1,29 @@ +import java.util.Scanner; + public class Tyrone { public class Constants{ - public static final String line = "___________________________________"; - public static final String Whatcanido ="What can I do for you?"; + public static final String line = " ___________________________________"; + public static final String Whatcanido =" What can I do for you cuh?"; + public static void goodbye(){ + System.out.println(Constants.line); + System.out.println(" see you brother"); + System.out.println(Constants.line); + } } public static void main(String[] args) { - String logo = "tyrone"; + String logo = " tyrone"; + Scanner in = new Scanner(System.in); System.out.println(Constants.line); - System.out.println("Hello from\n" + logo); + System.out.println(" Hello from\n" + logo); System.out.println(Constants.Whatcanido); System.out.println(Constants.line); - System.out.println("see you brother"); - System.out.println(Constants.line); + String input = in.nextLine(); + while (!input.equals("bye")){ + System.out.println(Constants.line); + System.out.println(" " + input); + System.out.println(Constants.line); + input = in.nextLine(); + } + Constants.goodbye(); } } From db2344bd741af8188b4efebfad16d7d10e93e561 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 28 Aug 2024 15:43:46 +0800 Subject: [PATCH 04/22] level 2 --- src/main/java/Tyrone.java | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/src/main/java/Tyrone.java b/src/main/java/Tyrone.java index 60462c0fe..64d90a654 100644 --- a/src/main/java/Tyrone.java +++ b/src/main/java/Tyrone.java @@ -2,26 +2,44 @@ public class Tyrone { public class Constants{ - public static final String line = " ___________________________________"; - public static final String Whatcanido =" What can I do for you cuh?"; + private static int listCount = 0; + private static String[] toDoList = new String[100]; + public static final String LINE = " ___________________________________"; public static void goodbye(){ - System.out.println(Constants.line); + System.out.println(Constants.LINE); System.out.println(" see you brother"); - System.out.println(Constants.line); + System.out.println(Constants.LINE); + } + public static void getUserInput(String userInput){ + switch (userInput){ + case "list": + System.out.println(Constants.LINE); + for (int i=1; i Date: Wed, 28 Aug 2024 15:56:54 +0800 Subject: [PATCH 05/22] Level 3.1 --- src/main/java/Tyrone.java | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/main/java/Tyrone.java b/src/main/java/Tyrone.java index 64d90a654..8696ddb68 100644 --- a/src/main/java/Tyrone.java +++ b/src/main/java/Tyrone.java @@ -4,6 +4,7 @@ public class Tyrone { public class Constants{ private static int listCount = 0; private static String[] toDoList = new String[100]; + private static boolean[] isDone = new boolean[100]; public static final String LINE = " ___________________________________"; public static void goodbye(){ System.out.println(Constants.LINE); @@ -11,11 +12,41 @@ public static void goodbye(){ System.out.println(Constants.LINE); } public static void getUserInput(String userInput){ + if (userInput.startsWith("mark ")){ + int index = Integer.parseInt(userInput.substring(5)) - 1; + if (index >= 0 && index < listCount) { + isDone[index] = true; + System.out.println(Constants.LINE); + System.out.println(" TIGHT! I've marked this task as done:"); + System.out.println(" [X] " + toDoList[index]); + System.out.println(Constants.LINE); + } else { + System.out.println(Constants.LINE); + System.out.println(" Invalid task number bro."); + System.out.println(Constants.LINE); + } + return; + } else if (userInput.startsWith("unmark ")) { + int index = Integer.parseInt(userInput.substring(7)) - 1; + if (index >= 0 && index < listCount) { + isDone[index] = false; + System.out.println(Constants.LINE); + System.out.println(" alright cuh, I've marked this task as unfinished:"); + System.out.println(" [ ] " + toDoList[index]); + System.out.println(Constants.LINE); + } else { + System.out.println(Constants.LINE); + System.out.println(" Invalid task number bro."); + System.out.println(Constants.LINE); + } + return; + } else { switch (userInput){ case "list": System.out.println(Constants.LINE); for (int i=1; i Date: Thu, 5 Sep 2024 11:52:09 +0800 Subject: [PATCH 06/22] Level-4 --- .gitignore | 3 +- src/main/java/Constants.java | 48 +++++++++++++++ src/main/java/Deadline.java | 22 +++++++ src/main/java/Event.java | 21 +++++++ src/main/java/Task.java | 14 +++++ src/main/java/ToDo.java | 18 ++++++ src/main/java/Tyrone.java | 111 ++++++++++++++--------------------- text-ui-test/input.txt | 1 + text-ui-test/runtest.bat | 4 +- 9 files changed, 171 insertions(+), 71 deletions(-) create mode 100644 src/main/java/Constants.java create mode 100644 src/main/java/Deadline.java create mode 100644 src/main/java/Event.java create mode 100644 src/main/java/Task.java create mode 100644 src/main/java/ToDo.java diff --git a/.gitignore b/.gitignore index 2daefce85..ca4a28b20 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,5 @@ bin/ text-ui-test/EXPECTED-UNIX.TXT src/main/java/Tyrone.class -src/main/java/Tyrone$Constants.class \ No newline at end of file +src/main/java/Tyrone$Constants.class +src/main/java/*class \ No newline at end of file diff --git a/src/main/java/Constants.java b/src/main/java/Constants.java new file mode 100644 index 000000000..4922e6d22 --- /dev/null +++ b/src/main/java/Constants.java @@ -0,0 +1,48 @@ +public class Constants { + public static Task[] toDoList = new Task[100]; + public static final String LINE = " ___________________________________"; + + public static String logo = " _____ \n" + // + "|_ _| _ _ __ ___ _ __ ___ \n" + // + " | || | | | '__/ _ \\| '_ \\ / _ \\\n" + // + " | || |_| | | | (_) | | | | __/\n" + // + " |_| \\__, |_| \\___/|_| |_|\\___|\n" + // + " |___/ "; + + public static void goodbye() { + System.out.println(Constants.LINE); + System.out.println(" see you brother"); + System.out.println(Constants.LINE); + } + + public static void markAsDone(int index){ + Constants.toDoList[index].isDone = true; + System.out.println(Constants.LINE); + System.out.println(" TIGHT! I've marked this task as done:"); + System.out.println(" [X] " + Constants.toDoList[index].description); + System.out.println(Constants.LINE); + } + + public static void unmarkAsUndone(int index){ + Constants.toDoList[index].isDone = false; + System.out.println(Constants.LINE); + System.out.println(" alright cuh, I've marked this task as unfinished:"); + System.out.println(" [ ] " + Constants.toDoList[index].description); + System.out.println(Constants.LINE); + } + + public static void getList(){ + System.out.println(Constants.LINE); + for (int i = 0; i < Task.listCount; i++) { + String status = Constants.toDoList[i].getStatusIcon(); + if (Constants.toDoList[i] instanceof Deadline) { + System.out.println(" " + (i + 1) + ". [D][" + status + "] " + Constants.toDoList[i].description + " (by: " + ((Deadline) Constants.toDoList[i]).doBy + ")"); + } else if (Constants.toDoList[i] instanceof Event) { + System.out.println(" " + (i + 1) + ". [E][" + status + "] " + Constants.toDoList[i].description + " (" + ((Event) Constants.toDoList[i]).timing + ")"); + } else { + System.out.println(" " + (i + 1) + ". [T][" + status + "] " + Constants.toDoList[i].description); + } + } + System.out.println(Constants.LINE); + } +} \ No newline at end of file diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java new file mode 100644 index 000000000..197c42925 --- /dev/null +++ b/src/main/java/Deadline.java @@ -0,0 +1,22 @@ +public class Deadline extends Task { + protected String doBy; + + + public Deadline(String description, String by) { + super(description); + doBy = by; + //TODO Auto-generated constructor stub + } + + public static void createDeadline(String userInput){ + String[] parts = userInput.split(" /by "); + Constants.toDoList[Task.listCount] = new Deadline(parts[0].substring(9), parts[1]); + Task.listCount++; + System.out.println(Constants.LINE); + System.out.println(" Got it. I've added this task:"); + System.out.println(" [D][ ] " + Constants.toDoList[Task.listCount - 1].description + " (by: " + ((Deadline) Constants.toDoList[Task.listCount - 1]).doBy + ")"); + System.out.println(" Now you have " + Task.listCount + " tasks in the list."); + System.out.println(Constants.LINE); + } + +} diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 000000000..63eef4b8a --- /dev/null +++ b/src/main/java/Event.java @@ -0,0 +1,21 @@ +public class Event extends Task { + protected String timing; + + public Event(String description, String time) { + super(description); + timing = time; + //TODO Auto-generated constructor stub + } + + public static void createEvent(String userInput) { + String[] parts = userInput.split(" /from | /to "); + Constants.toDoList[Task.listCount] = new Event(parts[0].substring(6), "from: " + parts[1] + " to: " + parts[2]); + Task.listCount++; + System.out.println(Constants.LINE); + System.out.println(" Got it. I've added this task cuh:"); + System.out.println(" [E][ ] " + Constants.toDoList[Task.listCount - 1].description + " (" + ((Event) Constants.toDoList[Task.listCount - 1]).timing + ")"); + System.out.println(" Now you have " + Task.listCount + " tasks in the list."); + System.out.println(Constants.LINE); + } + +} diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 000000000..0fefc87d4 --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,14 @@ +public class Task { + protected String description; + protected boolean isDone; + public static int listCount = 0; + + public Task(String description) { + this.description = description; + this.isDone = false; + } + + public String getStatusIcon() { + return (isDone ? "X" : " "); // mark done task with X + } +} \ 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..8aa0b8bcb --- /dev/null +++ b/src/main/java/ToDo.java @@ -0,0 +1,18 @@ +public class ToDo extends Task { + + public ToDo(String description) { + super(description); + //TODO Auto-generated constructor stub + } + + public static void createToDo(String userInput){ + Constants.toDoList[Task.listCount] = new ToDo(userInput.substring(5)); + Task.listCount++; + System.out.println(Constants.LINE); + System.out.println(" Got it. I've added this task:"); + System.out.println(" [T][ ] " + Constants.toDoList[Task.listCount - 1].description); + System.out.println(" Now you have " + Task.listCount + " tasks in the list."); + System.out.println(Constants.LINE); + } + +} diff --git a/src/main/java/Tyrone.java b/src/main/java/Tyrone.java index 8696ddb68..ba1d92f81 100644 --- a/src/main/java/Tyrone.java +++ b/src/main/java/Tyrone.java @@ -1,79 +1,54 @@ import java.util.Scanner; public class Tyrone { - public class Constants{ - private static int listCount = 0; - private static String[] toDoList = new String[100]; - private static boolean[] isDone = new boolean[100]; - public static final String LINE = " ___________________________________"; - public static void goodbye(){ - System.out.println(Constants.LINE); - System.out.println(" see you brother"); - System.out.println(Constants.LINE); - } - public static void getUserInput(String userInput){ - if (userInput.startsWith("mark ")){ - int index = Integer.parseInt(userInput.substring(5)) - 1; - if (index >= 0 && index < listCount) { - isDone[index] = true; - System.out.println(Constants.LINE); - System.out.println(" TIGHT! I've marked this task as done:"); - System.out.println(" [X] " + toDoList[index]); - System.out.println(Constants.LINE); - } else { - System.out.println(Constants.LINE); - System.out.println(" Invalid task number bro."); - System.out.println(Constants.LINE); - } - return; - } else if (userInput.startsWith("unmark ")) { - int index = Integer.parseInt(userInput.substring(7)) - 1; - if (index >= 0 && index < listCount) { - isDone[index] = false; - System.out.println(Constants.LINE); - System.out.println(" alright cuh, I've marked this task as unfinished:"); - System.out.println(" [ ] " + toDoList[index]); - System.out.println(Constants.LINE); - } else { - System.out.println(Constants.LINE); - System.out.println(" Invalid task number bro."); - System.out.println(Constants.LINE); - } - return; + public static void getUserInput(String userInput) { + if (userInput.startsWith("mark ")) { + int index = Integer.parseInt(userInput.substring(5)) - 1; + if (index >= 0 && index < Task.listCount) { + Constants.markAsDone(index); } else { - switch (userInput){ - case "list": - System.out.println(Constants.LINE); - for (int i=1; i= 0 && index < Task.listCount) { + Constants.unmarkAsUndone(index); + } else { + System.out.println(Constants.LINE); + System.out.println(" Invalid task number bro."); + System.out.println(Constants.LINE); + } + return; + } else if (userInput.startsWith("todo ")) { + ToDo.createToDo(userInput); + } else if (userInput.startsWith("deadline ")) { + Deadline.createDeadline(userInput); + } else if (userInput.startsWith("event ")) { + Event.createEvent(userInput); + } else if (userInput.equals("list")) { + Constants.getList(); + } else { + System.out.println(Constants.LINE); + System.out.println(" Invalid command my brother."); + System.out.println(Constants.LINE); } } + public static void main(String[] args) { - String logo = " tyrone"; - Scanner in = new Scanner(System.in); - System.out.println(Constants.LINE); - System.out.println(" Hello from\n" + logo); - System.out.println(" What can I do for you cuh?"); - System.out.println(Constants.LINE); - String input = in.nextLine(); - while (!input.equals("bye")){ - Constants.getUserInput(input); - input = in.nextLine(); + try (Scanner in = new Scanner(System.in)) { + System.out.println(Constants.LINE); + System.out.println(" Hello from\n" + Constants.logo + "\n"); + System.out.println(" What can I do for you cuh?\n"); + System.out.println(Constants.LINE); + String input = in.nextLine(); + while (!input.equals("bye")) { + getUserInput(input); + input = in.nextLine(); + } } Constants.goodbye(); } -} +} \ No newline at end of file diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index e69de29bb..7e568f5e3 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -0,0 +1 @@ +waddup dog \ No newline at end of file diff --git a/text-ui-test/runtest.bat b/text-ui-test/runtest.bat index 087374464..dfcb53438 100644 --- a/text-ui-test/runtest.bat +++ b/text-ui-test/runtest.bat @@ -7,7 +7,7 @@ REM delete output from previous run if exist ACTUAL.TXT del ACTUAL.TXT REM compile the code into the bin folder -javac -cp ..\src\main\java -Xlint:none -d ..\bin ..\src\main\java\*.java +javac -cp ..\src\main\java -Xlint:none -d ..\bin ..\src\main\java\*.java IF ERRORLEVEL 1 ( echo ********** BUILD FAILURE ********** exit /b 1 @@ -15,7 +15,7 @@ IF ERRORLEVEL 1 ( REM no error here, errorlevel == 0 REM 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 Tyrone < input.txt > ACTUAL.TXT REM compare the output to the expected output FC ACTUAL.TXT EXPECTED.TXT From 05e4753ad8c9b3fba6dd39366281eec364dc30cd Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 9 Sep 2024 12:39:02 +0800 Subject: [PATCH 07/22] exception handling --- src/main/java/Constants.java | 6 ++++ src/main/java/Deadline.java | 11 ++++++- src/main/java/Event.java | 13 ++++++++- src/main/java/MissingTimeInfoException.java | 5 ++++ src/main/java/Tyrone.java | 29 ++++++++++++++++--- src/main/java/TyroneException.java | 5 ++++ .../java/WrongDeadlineFormatException.java | 5 ++++ src/main/java/WrongEventFormatException.java | 5 ++++ 8 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 src/main/java/MissingTimeInfoException.java create mode 100644 src/main/java/TyroneException.java create mode 100644 src/main/java/WrongDeadlineFormatException.java create mode 100644 src/main/java/WrongEventFormatException.java diff --git a/src/main/java/Constants.java b/src/main/java/Constants.java index 4922e6d22..6cd7f16c3 100644 --- a/src/main/java/Constants.java +++ b/src/main/java/Constants.java @@ -45,4 +45,10 @@ public static void getList(){ } System.out.println(Constants.LINE); } + + public static void missingTimeInfo(){ + System.out.println(Constants.LINE); + System.out.println(" YOURE Missing time info BRUTHA"); + System.out.println(Constants.LINE); + } } \ No newline at end of file diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 197c42925..fd9a0e19f 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -8,8 +8,17 @@ public Deadline(String description, String by) { //TODO Auto-generated constructor stub } - public static void createDeadline(String userInput){ + public static void createDeadline(String userInput) throws TyroneException { + if (!userInput.contains("/by")){ + throw new WrongDeadlineFormatException(); + } + String[] parts = userInput.split(" /by "); + + if (parts.length < 2) { + throw new MissingTimeInfoException(); + } + Constants.toDoList[Task.listCount] = new Deadline(parts[0].substring(9), parts[1]); Task.listCount++; System.out.println(Constants.LINE); diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 63eef4b8a..33477ed9b 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -7,8 +7,19 @@ public Event(String description, String time) { //TODO Auto-generated constructor stub } - public static void createEvent(String userInput) { + public static void createEvent(String userInput) throws TyroneException { + // Throw WrongEventFormatException for invalid format + if (!userInput.contains("/from") || !userInput.contains("/to")) { + throw new WrongEventFormatException(); + } + String[] parts = userInput.split(" /from | /to "); + + // Throw MissingTimeInfoException if time info is missing + if (parts.length < 3) { + throw new MissingTimeInfoException(); + } + Constants.toDoList[Task.listCount] = new Event(parts[0].substring(6), "from: " + parts[1] + " to: " + parts[2]); Task.listCount++; System.out.println(Constants.LINE); diff --git a/src/main/java/MissingTimeInfoException.java b/src/main/java/MissingTimeInfoException.java new file mode 100644 index 000000000..94d61bc2e --- /dev/null +++ b/src/main/java/MissingTimeInfoException.java @@ -0,0 +1,5 @@ +public class MissingTimeInfoException extends TyroneException { + public MissingTimeInfoException() { + super("Missing time information for event."); + } +} \ No newline at end of file diff --git a/src/main/java/Tyrone.java b/src/main/java/Tyrone.java index ba1d92f81..a84b58ffb 100644 --- a/src/main/java/Tyrone.java +++ b/src/main/java/Tyrone.java @@ -1,7 +1,7 @@ import java.util.Scanner; public class Tyrone { - public static void getUserInput(String userInput) { + public static void getUserInput(String userInput) throws TyroneException { if (userInput.startsWith("mark ")) { int index = Integer.parseInt(userInput.substring(5)) - 1; if (index >= 0 && index < Task.listCount) { @@ -25,9 +25,25 @@ public static void getUserInput(String userInput) { } else if (userInput.startsWith("todo ")) { ToDo.createToDo(userInput); } else if (userInput.startsWith("deadline ")) { - Deadline.createDeadline(userInput); + try{ + Deadline.createDeadline(userInput); + }catch (WrongDeadlineFormatException e){ + System.out.println(Constants.LINE); + System.out.println(" WRONG WAY CUH!! Use: the format: deadline /by "); + System.out.println(Constants.LINE); + } catch (MissingTimeInfoException e) { + Constants.missingTimeInfo(); + } } else if (userInput.startsWith("event ")) { - Event.createEvent(userInput); + try{ + Event.createEvent(userInput); + } catch (WrongEventFormatException e){ + System.out.println(Constants.LINE); + System.out.println(" WRONG WAY CUH!! Use: event /from /to "); + System.out.println(Constants.LINE); + } catch (MissingTimeInfoException e) { + Constants.missingTimeInfo(); + } } else if (userInput.equals("list")) { Constants.getList(); } else { @@ -45,7 +61,12 @@ public static void main(String[] args) { System.out.println(Constants.LINE); String input = in.nextLine(); while (!input.equals("bye")) { - getUserInput(input); + try { + getUserInput(input); + } catch (TyroneException e) { + // General exception handling for TyroneException + System.out.println("An error occurred: " + e.getMessage()); + } input = in.nextLine(); } } diff --git a/src/main/java/TyroneException.java b/src/main/java/TyroneException.java new file mode 100644 index 000000000..85d6b9d9d --- /dev/null +++ b/src/main/java/TyroneException.java @@ -0,0 +1,5 @@ +public class TyroneException extends Exception { + public TyroneException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/src/main/java/WrongDeadlineFormatException.java b/src/main/java/WrongDeadlineFormatException.java new file mode 100644 index 000000000..65343f3d6 --- /dev/null +++ b/src/main/java/WrongDeadlineFormatException.java @@ -0,0 +1,5 @@ +public class WrongDeadlineFormatException extends TyroneException{ + public WrongDeadlineFormatException(){ + super("WrongDeadlineFormat"); + } +} diff --git a/src/main/java/WrongEventFormatException.java b/src/main/java/WrongEventFormatException.java new file mode 100644 index 000000000..1daae96e3 --- /dev/null +++ b/src/main/java/WrongEventFormatException.java @@ -0,0 +1,5 @@ +public class WrongEventFormatException extends TyroneException { + public WrongEventFormatException() { + super("WrongEventFormat"); + } +} \ No newline at end of file From 3d8be8034f5ddf7ff669b154dc5cf0636b27abc1 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 11 Sep 2024 12:28:43 +0800 Subject: [PATCH 08/22] package control --- src/main/java/Constants.java | 54 ------------------ src/main/java/Event.java | 32 ----------- src/main/java/Tyrone.java | 10 ++++ .../java/tyrone/constants/Constants.class | Bin 0 -> 2699 bytes .../exceptions/MissingTimeInfoException.class | Bin 0 -> 328 bytes .../exceptions}/MissingTimeInfoException.java | 1 + .../tyrone/exceptions/TyroneException.class | Bin 0 -> 248 bytes .../exceptions}/TyroneException.java | 1 + .../WrongDeadlineFormatException.class | Bin 0 -> 320 bytes .../WrongDeadlineFormatException.java | 1 + .../WrongEventFormatException.class | Bin 0 -> 311 bytes .../WrongEventFormatException.java | 1 + src/main/java/tyrone/task/Deadline.class | Bin 0 -> 2027 bytes src/main/java/{ => tyrone/task}/Deadline.java | 23 +++++--- src/main/java/tyrone/task/Event.class | Bin 0 -> 2030 bytes src/main/java/tyrone/task/Event.java | 39 +++++++++++++ src/main/java/tyrone/task/Task.class | Bin 0 -> 743 bytes src/main/java/{ => tyrone/task}/Task.java | 16 +++++- src/main/java/tyrone/task/ToDo.class | Bin 0 -> 1314 bytes src/main/java/{ => tyrone/task}/ToDo.java | 4 ++ 20 files changed, 87 insertions(+), 95 deletions(-) delete mode 100644 src/main/java/Constants.java delete mode 100644 src/main/java/Event.java create mode 100644 src/main/java/tyrone/constants/Constants.class create mode 100644 src/main/java/tyrone/exceptions/MissingTimeInfoException.class rename src/main/java/{ => tyrone/exceptions}/MissingTimeInfoException.java (83%) create mode 100644 src/main/java/tyrone/exceptions/TyroneException.class rename src/main/java/{ => tyrone/exceptions}/TyroneException.java (79%) create mode 100644 src/main/java/tyrone/exceptions/WrongDeadlineFormatException.class rename src/main/java/{ => tyrone/exceptions}/WrongDeadlineFormatException.java (82%) create mode 100644 src/main/java/tyrone/exceptions/WrongEventFormatException.class rename src/main/java/{ => tyrone/exceptions}/WrongEventFormatException.java (82%) create mode 100644 src/main/java/tyrone/task/Deadline.class rename src/main/java/{ => tyrone/task}/Deadline.java (60%) create mode 100644 src/main/java/tyrone/task/Event.class create mode 100644 src/main/java/tyrone/task/Event.java create mode 100644 src/main/java/tyrone/task/Task.class rename src/main/java/{ => tyrone/task}/Task.java (56%) create mode 100644 src/main/java/tyrone/task/ToDo.class rename src/main/java/{ => tyrone/task}/ToDo.java (89%) diff --git a/src/main/java/Constants.java b/src/main/java/Constants.java deleted file mode 100644 index 6cd7f16c3..000000000 --- a/src/main/java/Constants.java +++ /dev/null @@ -1,54 +0,0 @@ -public class Constants { - public static Task[] toDoList = new Task[100]; - public static final String LINE = " ___________________________________"; - - public static String logo = " _____ \n" + // - "|_ _| _ _ __ ___ _ __ ___ \n" + // - " | || | | | '__/ _ \\| '_ \\ / _ \\\n" + // - " | || |_| | | | (_) | | | | __/\n" + // - " |_| \\__, |_| \\___/|_| |_|\\___|\n" + // - " |___/ "; - - public static void goodbye() { - System.out.println(Constants.LINE); - System.out.println(" see you brother"); - System.out.println(Constants.LINE); - } - - public static void markAsDone(int index){ - Constants.toDoList[index].isDone = true; - System.out.println(Constants.LINE); - System.out.println(" TIGHT! I've marked this task as done:"); - System.out.println(" [X] " + Constants.toDoList[index].description); - System.out.println(Constants.LINE); - } - - public static void unmarkAsUndone(int index){ - Constants.toDoList[index].isDone = false; - System.out.println(Constants.LINE); - System.out.println(" alright cuh, I've marked this task as unfinished:"); - System.out.println(" [ ] " + Constants.toDoList[index].description); - System.out.println(Constants.LINE); - } - - public static void getList(){ - System.out.println(Constants.LINE); - for (int i = 0; i < Task.listCount; i++) { - String status = Constants.toDoList[i].getStatusIcon(); - if (Constants.toDoList[i] instanceof Deadline) { - System.out.println(" " + (i + 1) + ". [D][" + status + "] " + Constants.toDoList[i].description + " (by: " + ((Deadline) Constants.toDoList[i]).doBy + ")"); - } else if (Constants.toDoList[i] instanceof Event) { - System.out.println(" " + (i + 1) + ". [E][" + status + "] " + Constants.toDoList[i].description + " (" + ((Event) Constants.toDoList[i]).timing + ")"); - } else { - System.out.println(" " + (i + 1) + ". [T][" + status + "] " + Constants.toDoList[i].description); - } - } - System.out.println(Constants.LINE); - } - - public static void missingTimeInfo(){ - System.out.println(Constants.LINE); - System.out.println(" YOURE Missing time info BRUTHA"); - System.out.println(Constants.LINE); - } -} \ No newline at end of file diff --git a/src/main/java/Event.java b/src/main/java/Event.java deleted file mode 100644 index 33477ed9b..000000000 --- a/src/main/java/Event.java +++ /dev/null @@ -1,32 +0,0 @@ -public class Event extends Task { - protected String timing; - - public Event(String description, String time) { - super(description); - timing = time; - //TODO Auto-generated constructor stub - } - - public static void createEvent(String userInput) throws TyroneException { - // Throw WrongEventFormatException for invalid format - if (!userInput.contains("/from") || !userInput.contains("/to")) { - throw new WrongEventFormatException(); - } - - String[] parts = userInput.split(" /from | /to "); - - // Throw MissingTimeInfoException if time info is missing - if (parts.length < 3) { - throw new MissingTimeInfoException(); - } - - Constants.toDoList[Task.listCount] = new Event(parts[0].substring(6), "from: " + parts[1] + " to: " + parts[2]); - Task.listCount++; - System.out.println(Constants.LINE); - System.out.println(" Got it. I've added this task cuh:"); - System.out.println(" [E][ ] " + Constants.toDoList[Task.listCount - 1].description + " (" + ((Event) Constants.toDoList[Task.listCount - 1]).timing + ")"); - System.out.println(" Now you have " + Task.listCount + " tasks in the list."); - System.out.println(Constants.LINE); - } - -} diff --git a/src/main/java/Tyrone.java b/src/main/java/Tyrone.java index a84b58ffb..ca54524ab 100644 --- a/src/main/java/Tyrone.java +++ b/src/main/java/Tyrone.java @@ -1,5 +1,15 @@ import java.util.Scanner; +import tyrone.constants.Constants; +import tyrone.exceptions.MissingTimeInfoException; +import tyrone.exceptions.TyroneException; +import tyrone.exceptions.WrongDeadlineFormatException; +import tyrone.exceptions.WrongEventFormatException; +import tyrone.task.Deadline; +import tyrone.task.Event; +import tyrone.task.Task; +import tyrone.task.ToDo; + public class Tyrone { public static void getUserInput(String userInput) throws TyroneException { if (userInput.startsWith("mark ")) { diff --git a/src/main/java/tyrone/constants/Constants.class b/src/main/java/tyrone/constants/Constants.class new file mode 100644 index 0000000000000000000000000000000000000000..0d2df52db6a221b1ce2a9892b06f89da2153c19f GIT binary patch literal 2699 zcma)8-E$IG6#v~Mx`3EO;#aWRjYb18hH6dKpiRw(1|`NC5=o#JuB~XXl4j;(^O@&*))Cly)i4d`V}Z^{bjc4N{0ag=>_c#i_(I)w^fINa z8aEwEx{3@dcDHJn&Vp0bwQ^iRw?NpbS1nVIWi8WoG}EzTQ!UJgUV$N%Px}9#07B?f za4?8NI4scD#-M;wk>*P#J&JfPxv|k7!_3E{OFkUsR%y}Jb+vBQ)J)ZK3VPL#{Rjtf z4DSi}9BbN28aCtVTTV9JcQm^gOA*8aIDz*Ss6hoJ|d=iJ=u;Eo;@Ho>QHIVXIQPs@ZCeo5rR7GeHa?BG8?uCf&|fjf!Jf4C`Pd zx-+g2&vrP7vltOLQr3z(Go00&`-W3k&$Ymrb{W~J%!g5dG3l*Vsv7x%qh@P`k==c+ zna@}-c0tdLhafQQr~BuFxPT7@{3T{_%Bq=6rAWxY#)9}r2DYDpEjXG}vlA=~1(zAx z=0r~GTCQZ6dH|O&9z(M>0S z2}}ktC0+2-g_KcdF@?~HYaw*uhVWu45&|b>#vjfv-kVY94BMs!)iKJt zYM9R~b@JX~YWBJhw*~(4dPPd_@&p=ba?%Y6t|A4?TSuNdMQE_>9S{paPw;p+F|KA=tnSnd zELgQ_R=;6LN4i@c+oN(^QQM?tIkr>PDs#G1uyVE!8G(IXVwN8~QH2k=4T9Ol7>eZ=|X4|^0z!o^YBc^t)DyRvZc)KWXLoY52uv9xZ zW;@}RmjtnX+{HWx-lxPn&_g=wn7Be3?^eQl{B@kG;JRn{7l@yU2rLjvwuFA9)XA* zou@pVE^ig5*ANBTnhDc4P`RJM9zdAz7)BWUMTX_a{aws;ZZmgoySdm~&8bv9KyxQ) z?i9@p(%fm%9;_$oZ({N+eryHR84th22S4HKW=I#4F7gL1eUAu*!d*|#wxV^{-*IUb zSJrUV_2dO^HRUIEm7iF}^)*a41jm9Sw7&pvY*Uv2 literal 0 HcmV?d00001 diff --git a/src/main/java/MissingTimeInfoException.java b/src/main/java/tyrone/exceptions/MissingTimeInfoException.java similarity index 83% rename from src/main/java/MissingTimeInfoException.java rename to src/main/java/tyrone/exceptions/MissingTimeInfoException.java index 94d61bc2e..23042707a 100644 --- a/src/main/java/MissingTimeInfoException.java +++ b/src/main/java/tyrone/exceptions/MissingTimeInfoException.java @@ -1,3 +1,4 @@ +package tyrone.exceptions; public class MissingTimeInfoException extends TyroneException { public MissingTimeInfoException() { super("Missing time information for event."); diff --git a/src/main/java/tyrone/exceptions/TyroneException.class b/src/main/java/tyrone/exceptions/TyroneException.class new file mode 100644 index 0000000000000000000000000000000000000000..35559c3444efcf43f4d806c1f83a4abdf4d6efd9 GIT binary patch literal 248 zcmX^0Z`VEs1_mbvUM>bE24;2!79Ivx1~x_p;jF~6ME#t^ymWonisaOSlFa-(Mg}&U z%)HDJJ4Oak4IhMp;F6-uymV{LFm?tGMh3-_%A)+dRQ*(#wqpGdun3YlEYA5Usf-N# zKACx`exKBP2lS(g zS)m|Unm|ZiUS5*#pWPn76WR>~gxi_3rg&CzS!$y)>sHdosG%+pH6hR-B!0sjm8#E$ zdh^me=I){4ZFRZP#fB% zBDBVQ-^+S6S8gijB_r{~uH8aqx+;?Yr25rKNN~ZARYvRrmmHg1-67x%5cfCqg>ZW$ STyc!K0Un7^XTmk-0a^#I%25LV literal 0 HcmV?d00001 diff --git a/src/main/java/WrongDeadlineFormatException.java b/src/main/java/tyrone/exceptions/WrongDeadlineFormatException.java similarity index 82% rename from src/main/java/WrongDeadlineFormatException.java rename to src/main/java/tyrone/exceptions/WrongDeadlineFormatException.java index 65343f3d6..47538dc07 100644 --- a/src/main/java/WrongDeadlineFormatException.java +++ b/src/main/java/tyrone/exceptions/WrongDeadlineFormatException.java @@ -1,3 +1,4 @@ +package tyrone.exceptions; public class WrongDeadlineFormatException extends TyroneException{ public WrongDeadlineFormatException(){ super("WrongDeadlineFormat"); diff --git a/src/main/java/tyrone/exceptions/WrongEventFormatException.class b/src/main/java/tyrone/exceptions/WrongEventFormatException.class new file mode 100644 index 0000000000000000000000000000000000000000..4aafe95e61af30baf4a8eb2ffee8b2c1ccbe3fd1 GIT binary patch literal 311 zcmZ`!!D<3Q41HO3N4K^vf>%MjXoc(P)rj7RRgj#E`kXxB7rAd>aciN<{?Xf^a==|5Y-TX%}*J_Um`L3NSLS>+h z`rNFh%8lf7$w)M`8#hyZofY-FIxpEVXrRO|Wk&1*4;;%}H4$(Ii03N(Ah*8|9yvzb O0FQ(yFyV>w0F^WBI!(R+ literal 0 HcmV?d00001 diff --git a/src/main/java/WrongEventFormatException.java b/src/main/java/tyrone/exceptions/WrongEventFormatException.java similarity index 82% rename from src/main/java/WrongEventFormatException.java rename to src/main/java/tyrone/exceptions/WrongEventFormatException.java index 1daae96e3..fea5ef676 100644 --- a/src/main/java/WrongEventFormatException.java +++ b/src/main/java/tyrone/exceptions/WrongEventFormatException.java @@ -1,3 +1,4 @@ +package tyrone.exceptions; public class WrongEventFormatException extends TyroneException { public WrongEventFormatException() { super("WrongEventFormat"); diff --git a/src/main/java/tyrone/task/Deadline.class b/src/main/java/tyrone/task/Deadline.class new file mode 100644 index 0000000000000000000000000000000000000000..bcd77a4dd404ef9d80879a6861962f54cec1e16f GIT binary patch literal 2027 zcmah~ZC4vb6n=&THVMmHfR=)77X`^nC4yQjsZ|Nk#s*qV1Zl)}lT2YrvXf>fXnumf zz?U!TKTy9*=i635F&|lXG@v?%aFl-se7d=8wNmp8;5f6F?t48oWCC zF~Be?>s4X%m^7VYEJGiLft!|X$y*GQq12&yWX4LSy&p@H&;mOhZt|I3_5P7tdnw<%KOx%XS!MI%7#3 znAJ3YQsZ`>$HNaaTwqvi#lgSK^NO^D?ZkE{v;B5R8=_h^<$8NJfJsa#3@%YHq42g3 zGYtI(g=MI?F6+30t0ZwMB}+0abROS^BHNvuvYplOGF~AF2(dB&6bkp&o7eFw78o?k zSua;4p+$jEGGT^DcQTun<4^%IR+%U5$D$*V5T^XNhSxMK>WJZWhUu0$!RJWRmQF0u zo)M^0tcjH6P*&sFRA=>6`Qv`#$Fhz$@Fs)5L~039vq_gFRc_aHyp0>Q$s!ZVB96&d52V)igI7FefW@JR(ZZHq+!WLBe`(I4YN?-1w$TK zj-lFTMYUE+$EGU&@IIGo+{srhmy7{wntM9#t1V4!QFjEXAwSlUMuy>H*(`D@Qr?t1 zmOSVv*Nq;`>w#UjCb~ z8;ZV*BLg@Hz`~)1qJpEuF!yghmVG3Oymh-Z3$S74rKnOne$xqkOR*W-9n&t9xHFd$ zqFAfMyTR{}oHNYSE4+t#=S^}icgXWH-q}(u7YVaeN?Vc>`g+o~c{Nco9fuSCg23p? zsaL2Po-kbbZ&i8$nt5TCSldS|B?76-o@O4JQ%lo#hgMPbme4pDiJpK(uKfn>XIK4G z`VKd@NL@z&Lu5kiZy8>uk&#Y+9?> zl6oKgf~8~J46Zh?rp9D*Y}$AWu;;m-XyXWw)7+2{WL*U2*g^LP?Q2Yed*Iyw?WhDAp{Z95Z2KJouR)O zVDW%Ek`Sa_B4dU~D?kuE44sLciYSHAhkgwa9RnDoP+q)@A!rFlnzrLIj5P<7Dwvfl ze^TX+#goxTL0n+)C8W^s5<|QZ5&zucWoZk?O{`IlyIychqEa&D;^|Qs!x&Xmj1jK_V6{8`%j42J%I--a%j5gef3RjwrbQ7u584)DKg2>n|#Wb*yX)cATWimv?zOLgH z%rJzCWR?7-2;||_AFP=kJ@)FfkR4LV=y0a}34@kh0 zip9-RGKlx+Duceq|Nn)N!h(iH9ZRZZ20Wdf2V~I73clzBagSkAA>S3!u;q-Ao;u)$ zna}gQAq%!^s8%zqYGF>b;`=&2K!%}bm&*n2S{2)qEW_aRzYw*enbK%?)FdPNrEjh(Cms2fB<&!NrwF^~) zV7UC>ru1&t^TIgwV+XZ7DM>x@H1pA%+LOjCt>Sd*qkmT{ehe17{wuVfJo6llJ>HS( z=5B;(#gtqdj+f}q$fh&)3$!24Tms%^KSKBz0m4>y{Mm@%hghV$hTgBC$09>C`37B2 zF}!|^k>|0<#TqVW;?Dx#sm-gjIr01mlSha@MQ}ato9zqKkcj(dtKLuKCqmHkc18W=(Z z7chzuqH+vVxQGO<5Q2e+w6le)DBv2t#00*@B)+Eyf0ew#@I|ygFsNY->$LV0Esu!J fPiWqOO?*oKL0WU#f9#E>H(J>DycvpcP{zpLu9^*j literal 0 HcmV?d00001 diff --git a/src/main/java/tyrone/task/Event.java b/src/main/java/tyrone/task/Event.java new file mode 100644 index 000000000..fab4e1397 --- /dev/null +++ b/src/main/java/tyrone/task/Event.java @@ -0,0 +1,39 @@ +package tyrone.task; + +import tyrone.constants.Constants; +import tyrone.exceptions.MissingTimeInfoException; +import tyrone.exceptions.TyroneException; +import tyrone.exceptions.WrongEventFormatException; + +public class Event extends Task { + protected String timing; + + public Event(String description, String time) { + super(description); + this.timing = time; + } + + public String getTiming() { + return timing; + } + + public static void createEvent(String userInput) throws TyroneException { + if (!userInput.contains("/from") || !userInput.contains("/to")) { + throw new WrongEventFormatException(); + } + + String[] parts = userInput.split(" /from | /to "); + + if (parts.length < 3) { + throw new MissingTimeInfoException(); + } + + Constants.toDoList[Task.listCount] = new Event(parts[0].substring(6), "from: " + parts[1] + " to: " + parts[2]); + Task.listCount++; + System.out.println(Constants.LINE); + System.out.println(" Got it. I've added this task cuh:"); + System.out.println(" [E][ ] " + Constants.toDoList[Task.listCount - 1].getDescription() + " (" + ((Event) Constants.toDoList[Task.listCount - 1]).getTiming() + ")"); + System.out.println(" Now you have " + Task.listCount + " tasks in the list."); + System.out.println(Constants.LINE); + } +} diff --git a/src/main/java/tyrone/task/Task.class b/src/main/java/tyrone/task/Task.class new file mode 100644 index 0000000000000000000000000000000000000000..3feb50cff947be703ac737ba5ca171973e37de0b GIT binary patch literal 743 zcmZXS%Wl(95QhKbOKhi3(weqh%B3wg$4F!WJ1Qh-g;c4)B2|U5b6hKOo7$Cqg2bcn z1Z-GA><~qoFW=5WkOm<2WDn z-VP7aL@P8lvOLqz70j@^=fQ>Npy^`{KIQsDS>$O?$JJqPmqB4}Kdq87JJwl|D+D`d zz`icCeDq8ZZ66)Xlbuyt>{n0&7Xi~d7mG}*B3kxw71tEJaaQTgVv=(hwXLueUWRt} z6s*l+pQz4GmZxtfN5iz-jfZ1aTBB6=b*v}Vb|OP9hTY2q%BV>WU&qIFn}gL0c1)*N zXcM+|enr|cP;e@i>s739Ak(-T$#`a5vtLZgBz=|1FrL`-SX{vxmo#_{CM>a&PnOui z?8)ZL4Jh8rb;cWfdqTD7JJENj=+P;h$UH^sD@zJ1i~#{4)FQw`6K!G@ZsOJq@RV8A zfD^Pn!VMNa!49r`Vaccg@;$KaHlqW>f8pQ`OKblKLK2A`oxqX4>4&F%0pB`UXOwBr zOIx4+lP*(q7x!k;_1R*LXyw8_@^gYPo5Q)dU)%8)%>&rxH!Pj4Kb=D210EW9_yDVu{le zgI9_*k+K}g5Xq)4J{9*7mY|Lh1{r*1GE0cMO|~qlA$$=VdGg~DhBaK)F@h`f{~|i_ z;?#3a6RCoqobL|6k0H2xxQc5UuIm`bjq{Egj^q^vm#7nv;nsai#I`AVNgQyq68B<) zVb-AU!~Z`&ZemKqw2m3Ycch8=yh8@9s@#`tFXk8~l;;g04NFFi@A%tC<|3|X`s zL*;2%@wT925w{oy3f#%ptg5tx%@FPmI81qu>WJYE!$`#}amr8Ll>A9A6^3c0*%F_OhNv4wlL%o=9vs86i4|_B(usyV zc;?4*ywLDcAzWpcIx7&%J`g3|uHqI0>tQ(OPjDMJRR>OR_f%?L zI)gAt&jSHO5TsrXQIic)KMc`?3uBwK?`c%H@Q`f!@Cc7-57Ox=1@NS~#*rYMpX4>H IV-ur)0D>n^#sB~S literal 0 HcmV?d00001 diff --git a/src/main/java/ToDo.java b/src/main/java/tyrone/task/ToDo.java similarity index 89% rename from src/main/java/ToDo.java rename to src/main/java/tyrone/task/ToDo.java index 8aa0b8bcb..1bac5203b 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/tyrone/task/ToDo.java @@ -1,3 +1,7 @@ +package tyrone.task; + +import tyrone.constants.Constants; + public class ToDo extends Task { public ToDo(String description) { From 88f05d45d90125b683c7d0795e34f555c8d04c0b Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 16 Sep 2024 11:18:15 +0800 Subject: [PATCH 09/22] delete function and arraylist --- src/main/java/Tyrone.java | 7 +- .../java/tyrone/constants/Constants.class | Bin 2699 -> 3659 bytes src/main/java/tyrone/constants/Constants.java | 87 ++++++++++++++++++ src/main/java/tyrone/task/Deadline.class | Bin 2027 -> 2069 bytes src/main/java/tyrone/task/Deadline.java | 15 +-- src/main/java/tyrone/task/Event.class | Bin 2030 -> 2072 bytes src/main/java/tyrone/task/Event.java | 12 ++- src/main/java/tyrone/task/ToDo.class | Bin 1314 -> 1372 bytes src/main/java/tyrone/task/ToDo.java | 20 ++-- 9 files changed, 119 insertions(+), 22 deletions(-) create mode 100644 src/main/java/tyrone/constants/Constants.java diff --git a/src/main/java/Tyrone.java b/src/main/java/Tyrone.java index ca54524ab..df4a96031 100644 --- a/src/main/java/Tyrone.java +++ b/src/main/java/Tyrone.java @@ -44,7 +44,12 @@ public static void getUserInput(String userInput) throws TyroneException { } catch (MissingTimeInfoException e) { Constants.missingTimeInfo(); } - } else if (userInput.startsWith("event ")) { + } + else if (userInput.startsWith("delete ")) { + int index = Integer.parseInt(userInput.substring(7)) - 1; + Constants.deleteTask(index); + } + else if (userInput.startsWith("event ")) { try{ Event.createEvent(userInput); } catch (WrongEventFormatException e){ diff --git a/src/main/java/tyrone/constants/Constants.class b/src/main/java/tyrone/constants/Constants.class index 0d2df52db6a221b1ce2a9892b06f89da2153c19f..f26b73b333d1f59c7b9067660900b9b563bb4632 100644 GIT binary patch literal 3659 zcmbVP`*Ryt75=X6c-M+zC(6^0hIO38a_m?kB_*-*sAD^^V%aIN;x=)Dx|VLNjip^z zyK+%6P@q707TQ9amPZK8n1P>YX51NfhA9I-!9N5{3w(E1lI2(p9VGeOyXT&J&bi-t z-1Xo7z5XWv7xCK=8qlbrDU5As7T9^$TsC7l(_V;Ooxdy7oi-U+^Q_P zQW_lgmLe>qxB~2oz+^PO6@*X2sS^kd34vX;UW_kG+Y4b5(_vgyF0{~vq?Knz zN6?6P1WmZ6Jed(V^XWXPV^_y@fkQsBSFc|iH>NDtr3J&Y^3t&EJC1Sj+V$kbh=TRm zFrHJ1-&~M+XIbjFS>8JBcrr5>1Ugu&$<84iw*MG(~hQCP6=y7}5%vtnV6_Z`e&&z_!CqI`Ob+Fz2J!n-* z_!B;%l@wP}D~hPE`jO+${6=Sl3}eMu;m`l}rcyDk-dZtwNezEqm7tp78%_0V)0MSS16%AD~caXAEm12Ibkf}1y)GTS#Sg*Tj6HD%~%UItE9jZ zDre5-W_LDGo3E;s4WDP7HYMWI(+lX6ffbqUr_OYTJaIf2{#|4!bbm<)|;`HK_x#TO-@U_i1mEZhnFdw8eOGn0; z&@_{gIq6B|FuVTQG;7_z`9d>nE@^qmQeL%I+;<1nl|$7R9mjLMg1Iy$y{waQb$mx) zdw}lTbGHql_+hM%jl`GvsYjkg5LUUn8`ET|kJ!#m=Vnf9Cl8}!??k8P>=IS%FUtaM2DAFYvkOKeut6RmZtb9$&;rm-*Dq zQE=RL?0twoaw6~|sd{Gv+SulIa^sh(;^%xm(Ec8@NZT5Asd0aKRL>hK)ExorroBB> zvKI%ikE%*|scdTLfVu`d=p{WvD>`VZ zlb1#pp28Enjt|oCmmg=i@e#vM)-`8_z(^E(A;4fK0?DsX?Udqp4d*@8|mVM zjWf2d;i-FQRg59pT*b?c!yP>D8qPj|w{h@9{~Dg2>i;uF@4=vSN7M5IWcBxdh|x8S zuVcdZZ52b5ncN~XxrV8AJX4n0SEFDZU+}rFK&<}f)rw;(iVc1u4DnPzAES5-yUmvy9G0th|(eTxter~$Twc}m{Uam-8p?1?f$qR@oM6b?3t&(Z5hF-J3>Noz&8Qs}{1fxp%TVP& zHQaoQd2JpCYT@Nx(|P9OOQ!auN2R>=4m98tgSrq+7~S#Zn8Cn$1!I!~r{QKeFdH$3 zjj*wt=$($o6tplD{#ijV5}sLz#v&S;(dIxv#3&RKjCZX%VM2%CJ;TuN?j4v5uY~;z z;n=Ky*x+&V8FrSxHWycQqRWA95vWq&NOUn8n{~pB4ks+QAmT4FwDL)F70Llj6ts3%J_TQ#px+RsigT*=lYW@(bk^dX1r8d{l$daI>rda0{A^ub4q^W!1v z@sxbesM{B4!VN+fz`6~MZKG4cxPJ@9Td*c+5;rsFK!^@G2D-B>q0l}5TxRBGTBv|l zx|udwYk=&D->E$EVt|8rGw)FL2BprvHyGGG22D~aK?>67yl% toDoList = new ArrayList<>(); + + public static final String LINE = " ___________________________________"; + public static String logo = " _____ \n|_ _| _ _ __ ___ _ __ ___ \n | || | | | '__/ _ \\| '_ \\ / _ \\\n | || |_| | | | (_) | | | | __/\n |_| \\__, |_| \\___/|_| |_|\\___|\n |___/ "; + + public Constants() { + } + + public static void goodbye() { + System.out.println(LINE); + System.out.println(" see you brother"); + System.out.println(LINE); + } + + public static void markAsDone(int index) { + toDoList.get(index).setDone(true); + System.out.println(LINE); + System.out.println(" TIGHT! I've marked this task as done:"); + System.out.println(" [X] " + toDoList.get(index).getDescription()); + System.out.println(LINE); + } + + public static void unmarkAsUndone(int index) { + toDoList.get(index).setDone(false); + System.out.println(LINE); + System.out.println(" alright cuh, I've marked this task as unfinished:"); + System.out.println(" [ ] " + toDoList.get(index).getDescription()); + System.out.println(LINE); + } + + public static void getList() { + System.out.println(LINE); + if (toDoList.isEmpty()) { + System.out.println(" Your task list is empty, brother."); + } else { + for (int i = 0; i < toDoList.size(); i++) { + Task task = toDoList.get(i); + String statusIcon = task.getStatusIcon(); + if (task instanceof Deadline) { + System.out.println(" " + (i + 1) + ". [D][" + statusIcon + "] " + task.getDescription() + " (by: " + ((Deadline) task).getDoBy() + ")"); + } else if (task instanceof Event) { + System.out.println(" " + (i + 1) + ". [E][" + statusIcon + "] " + task.getDescription() + " (" + ((Event) task).getTiming() + ")"); + } else { + System.out.println(" " + (i + 1) + ". [T][" + statusIcon + "] " + task.getDescription()); + } + } + } + System.out.println(LINE); + } + + public static void missingTimeInfo() { + System.out.println(LINE); + System.out.println(" YOURE Missing time info BRUTHA"); + System.out.println(LINE); + } + + public static void deleteTask(int index) { + if (index >= 0 && index < toDoList.size()) { + Task removedTask = toDoList.remove(index); + System.out.println(LINE); + System.out.println(" Noted. I've removed this task:"); + String taskType = removedTask instanceof Deadline ? "D" : removedTask instanceof Event ? "E" : "T"; + String statusIcon = removedTask.getStatusIcon(); + System.out.println(" [" + taskType + "][" + statusIcon + "] " + removedTask.getDescription()); + if (removedTask instanceof Deadline) { + System.out.println(" (by: " + ((Deadline) removedTask).getDoBy() + ")"); + } else if (removedTask instanceof Event) { + System.out.println(" (" + ((Event) removedTask).getTiming() + ")"); + } + System.out.println(" Now you have " + toDoList.size() + " tasks in the list."); + System.out.println(LINE); + } else { + System.out.println(LINE); + System.out.println(" Invalid task number bro."); + System.out.println(LINE); + } + } +} diff --git a/src/main/java/tyrone/task/Deadline.class b/src/main/java/tyrone/task/Deadline.class index bcd77a4dd404ef9d80879a6861962f54cec1e16f..df9c5b406b9d81e724c9c67322cd71926e7afa33 100644 GIT binary patch delta 765 zcmZuuOHUI~6#mXUI%PVPwuYC28I(tvRw`9d0Z|ZCl!uCdfVB)zvB`_B2!yKM7oX; z;s%bPNeoC)-*E#fnneediDfk)UP^($37ph$%0LTFi*ICYl=jWp>vm$z$<8M_S6A(P zUpD8o={Sp44Q&S6agK1{KOBN=&&&`?qx%)+?Zw%|;M81Z+G%SXFT#0T(9mhHwTpz1 zSHPnT<#SGEfz?ZE4ncgBD*Qc!29uZgE}6k}I<4a}u4w2ra8*>vwbUm%<$9kV0|o}g zf?R&^hJl+nO3-FAPWMt*KEhXU%fK*3#4CBY#&v(&z!=5}N-q02!`-5dy%7-ZxU44e zQ*Ngz(W=x@MocOr)pLY0*MVtHbf+fFlu2fED&J~SqaX8PPl*K=bu3|7!-`vART%0X zt%=X7r931Y7AtDG7*sV8_Z``2<~Aud6oUkrW59}SgRJ;lXq%i8?(!b=e!0(644pG_ z2l^wd=19y@tvAqK|C9JUFpMIk;p5tFk1t%n?eWZt6c})0`_j*$mHd ckIxcjai3$5PYaA^z5M}lo{r#P9gk4?8^YR=lK=n! delta 709 zcmX|-OHY$g5Qd-A+t=^oYbiw$HDE9>M1VAkbB*vYITjS0@VEh9vjB#3obCP*y-Z?XK-gzDPRcd|xyZs61A-iFHS3Z+Q zP8poGY2u6?c7)r@<3qWXOgfcl%1vh%n?}XNOdLdQS~#mPmy+3BZ~9p(r%(eH0a|U^ zXxBegy{E&*O-y&I3ccP_MbhtL79Hq2h`6O~yl$Ar-2hS?LI=1}~3vxjW*2Y>{Na zV6o6(Ne{Wdsk9Dx!mg)^YQ5n;q+huWz2vD`jmelhGC3l9aSE1%BU`9&<424Q2^Dw6 z`gc>Z5E~1hu=4Z&g;jz|-nhdbFxK}=JVi2q$pjwhU6}D3Lp)du2Yq=;-%_%peMbH2 zCXr2=ckoU`oY8=p=Ul`U-QxU+u&$~1G;h)w?8(ztz=2)dt#Qpo^9=6$pYi4y-sTqU zy=vZOY%ePID5!E2Rkex|IKXq0gOpJz_XuH*5~Z3!j>+mm#5v9^HM|tTZ>Z%Rb=;FO s3uoCMDh=WWlM=f`?*m!Wl=u#&nGy7hH!u8b(I$8zoF#FJWilN82N$h@-~a#s diff --git a/src/main/java/tyrone/task/Deadline.java b/src/main/java/tyrone/task/Deadline.java index 6ec3aab99..9f1f4fb30 100644 --- a/src/main/java/tyrone/task/Deadline.java +++ b/src/main/java/tyrone/task/Deadline.java @@ -1,4 +1,5 @@ package tyrone.task; + import tyrone.constants.Constants; import tyrone.exceptions.MissingTimeInfoException; import tyrone.exceptions.TyroneException; @@ -27,12 +28,14 @@ public static void createDeadline(String userInput) throws TyroneException { throw new MissingTimeInfoException(); } - Constants.toDoList[Task.listCount] = new Deadline(parts[0].substring(9), parts[1]); - Task.listCount++; + // Add the new Deadline to the ArrayList + Deadline newDeadline = new Deadline(parts[0].substring(9), parts[1]); + Constants.toDoList.add(newDeadline); + System.out.println(Constants.LINE); - System.out.println(" Got it. I've added this task:"); - System.out.println(" [D][ ] " + Constants.toDoList[Task.listCount - 1].getDescription() + " (by: " + ((Deadline) Constants.toDoList[Task.listCount - 1]).getDoBy() + ")"); - System.out.println(" Now you have " + Task.listCount + " tasks in the list."); + System.out.println(" You better finish this deadline:"); + System.out.println(" [D][ ] " + newDeadline.getDescription() + " (by: " + newDeadline.getDoBy() + ")"); + System.out.println(" Now you have " + Constants.toDoList.size() + " tasks in the list."); System.out.println(Constants.LINE); } -} \ No newline at end of file +} diff --git a/src/main/java/tyrone/task/Event.class b/src/main/java/tyrone/task/Event.class index 97ae0cff6e7083440f8581f02d39b81b57d99335..4badc4ddb8a60dd09fd6f3ef00e9104a455b8eab 100644 GIT binary patch delta 733 zcmZuvOHUJF6g}TO%P?TAV1iUKXj`Taomv!u`T|8M6i}!lRMeK1+S-TqfzgdSm%8{i z?o3>{6k=*Di9bM>{s5P5jK9Db?+kJ0By-Qb=R5b#xijdciG_0g$x>!JW3`&avNct& zXPzdDjb>cKS&XZg&@qWP!=e9Z7{p92$Ix%?Pbg=q1#2l=%5OH~!Sybj#|0G^bzH&} z|1ONWE;Ec6bn#))%cG*&tziaNRb10C%V$L&o8uKRaYV*!i&jTjlfuHyz48M+Gj zW~x{zRtp|5glu;y9XD}{L24AA<;jZ~On4yRw!O5;e~J_AE)Ph4mf=ZhC9=iPvsJHE zCJkmZYZP60z~Hg{7)E+#BW-NZiOGU4l=xRE+*{UAK~+V~p7)4L@;9l$;O9}z0Uh$^Z>0|Ulq-ekI9%xiCdjnfR>`_8SD2F~keNPF4-J&?;L3ANa zx!_2DP-YK$#rG8J`5s(rVKL@b+VF>^SXhpA5ClHr#KJD3kv7IwcX7@$-NqFg6Z=T~ zJl#tjECc%#soPlTVD%s2^z6`s1jou4xd!^-!C@T10ERJ0|5MEi3kK$>T*h${`jCYm zEd=m_j$gvW9ct4cdeq1wIJJ$j&}`dD-+TC|EBs2%m_q1WMr&q+>c*JxK~bgz-}`WbK-^f{|njAnIS zzc7++gbO|w8P;EoRO4lzD-6rrxtUTnzmzY`#ZYv_WTorXX&Id|yVRJTH4`eQpP3`6 zNkz@V4Z35e z%k)+G+$L|*pz$SlIOS`Hk#m$aJ|GclD`|`REYOk2&)x~6j)~0 EKcFjl4gdfE diff --git a/src/main/java/tyrone/task/Event.java b/src/main/java/tyrone/task/Event.java index fab4e1397..32dfbd33b 100644 --- a/src/main/java/tyrone/task/Event.java +++ b/src/main/java/tyrone/task/Event.java @@ -28,12 +28,14 @@ public static void createEvent(String userInput) throws TyroneException { throw new MissingTimeInfoException(); } - Constants.toDoList[Task.listCount] = new Event(parts[0].substring(6), "from: " + parts[1] + " to: " + parts[2]); - Task.listCount++; + // Add the new Event to the ArrayList + Event newEvent = new Event(parts[0].substring(6), "from: " + parts[1] + " to: " + parts[2]); + Constants.toDoList.add(newEvent); + System.out.println(Constants.LINE); - System.out.println(" Got it. I've added this task cuh:"); - System.out.println(" [E][ ] " + Constants.toDoList[Task.listCount - 1].getDescription() + " (" + ((Event) Constants.toDoList[Task.listCount - 1]).getTiming() + ")"); - System.out.println(" Now you have " + Task.listCount + " tasks in the list."); + System.out.println(" Crazy event cuh:"); + System.out.println(" [E][ ] " + newEvent.getDescription() + " (" + newEvent.getTiming() + ")"); + System.out.println(" Now you have " + Constants.toDoList.size() + " tasks in the list."); System.out.println(Constants.LINE); } } diff --git a/src/main/java/tyrone/task/ToDo.class b/src/main/java/tyrone/task/ToDo.class index 81e735b8f1d830fd7efc42ccfd6402affaab24e9..6f550d9775e927728e67961f0cae20aee043cee4 100644 GIT binary patch delta 638 zcmZvaOHUI~7>1uSy-Yg}we+H*SliNSFX*V?1&d;#UeE$Yn|L8CDs7qp(jo0&f*TSO ze?T+;z@R5qRp2h9I6huCP^aw~Upy8_jjQlz$WCJPDNxI!RK_ zxR??X&NDF?%yLoXl1|R~C^Dkpd={Bm4V6iq%UltJT1~ss?5=mrZQHckf>fU+H(2D2!h)#E95*^YVrHBdUCi{Yip~? zwWJ6z?;I+{P(|Yb4^ zcqH8?YuW6o#J*V~4q&p)go&{iq|NRZ!8QR>ZHCR&COSrYt0+QDU10Z3Y9QiL1sR z-~wmi-XCBhnv!7R4{+P9zr}b4Q;m1=p7Wl(=bo>h`lHrAeht3^i>&nYf@6`uGSN2U z*u6piQKqpPyy>+4&0^5(z9`lNDi$%4HWQ>2)^@8KRNJroK%rJlTt(`?g!WQfbC5}s zLpFz*>iOkVnz+SLj+q>{nc+mZtV)TKidj!y_*P}@Cz?~_OitUJ2|uZvIveh(+`>fM?8MNBI!d-pdeBCT=H~p>RTF`0vTNPKvx@c46Qdo*rwTogdqEq3A zSZ(r#A{mwQyhd%k;jMcr!Oi#aLh`oe4tGr!BJE;Wj_;}E&@uAHeZ@?eGG@ZMVeh1+ zljz0d*8_|RmV{-6NAah)8~lm?UIe`>>t}_Cz2Z*b6+_(CdIoY6O>0-p*osGvBW)t2TcD4rU+i1 diff --git a/src/main/java/tyrone/task/ToDo.java b/src/main/java/tyrone/task/ToDo.java index 1bac5203b..bd9b2b501 100644 --- a/src/main/java/tyrone/task/ToDo.java +++ b/src/main/java/tyrone/task/ToDo.java @@ -6,17 +6,17 @@ public class ToDo extends Task { public ToDo(String description) { super(description); - //TODO Auto-generated constructor stub } - public static void createToDo(String userInput){ - Constants.toDoList[Task.listCount] = new ToDo(userInput.substring(5)); - Task.listCount++; - System.out.println(Constants.LINE); - System.out.println(" Got it. I've added this task:"); - System.out.println(" [T][ ] " + Constants.toDoList[Task.listCount - 1].description); - System.out.println(" Now you have " + Task.listCount + " tasks in the list."); - System.out.println(Constants.LINE); + public static void createToDo(String userInput) { + // Add the new ToDo to the ArrayList + ToDo newToDo = new ToDo(userInput.substring(5)); + Constants.toDoList.add(newToDo); + + System.out.println(Constants.LINE); + System.out.println(" yeye. I've added this task:"); + System.out.println(" [T][ ] " + newToDo.getDescription()); + System.out.println(" Now you have " + Constants.toDoList.size() + " tasks in the list."); + System.out.println(Constants.LINE); } - } From c53d15fff2383c4e9b14b5e5a29495c511735b9a Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 16 Sep 2024 16:15:55 +0800 Subject: [PATCH 10/22] save function --- src/main/java/Tyrone.java | 2 + src/main/java/tyrone/constants/Constants.java | 68 +++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 src/main/java/tyrone/constants/Constants.java diff --git a/src/main/java/Tyrone.java b/src/main/java/Tyrone.java index ca54524ab..74b8dc73b 100644 --- a/src/main/java/Tyrone.java +++ b/src/main/java/Tyrone.java @@ -56,6 +56,8 @@ public static void getUserInput(String userInput) throws TyroneException { } } else if (userInput.equals("list")) { Constants.getList(); + } else if (userInput.equals("save")) { + Constants.saveTasks(); // Call save function } else { System.out.println(Constants.LINE); System.out.println(" Invalid command my brother."); diff --git a/src/main/java/tyrone/constants/Constants.java b/src/main/java/tyrone/constants/Constants.java new file mode 100644 index 000000000..c132cdd86 --- /dev/null +++ b/src/main/java/tyrone/constants/Constants.java @@ -0,0 +1,68 @@ +package tyrone.constants; + +import tyrone.task.Deadline; +import tyrone.task.Event; +import tyrone.task.Task; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +public class Constants { + public static final String LINE = " ___________________________________"; + public static String logo = " _____ \n|_ _| _ _ __ ___ _ __ ___ \n | || | | | '__/ _ \\| '_ \\ / _ \\\n | || |_| | | | (_) | | | | __/\n |_| \\__, |_| \\___/|_| |_|\\___|\n |___/ "; + + public static java.util.List toDoList = new java.util.ArrayList<>(); + + public Constants() { + } + + public static void goodbye() { + System.out.println(LINE); + System.out.println(" see you brother"); + System.out.println(LINE); + } + + // Save tasks to ./data/Tasks.txt + public static void saveTasks() { + try { + // Check if ./data directory exists, if not, create it + File directory = new File("./data"); + if (!directory.exists()) { + directory.mkdir(); + } + + // Create or open Tasks.txt file + FileWriter writer = new FileWriter("./data/Tasks.txt"); + + // Write all tasks to the file + for (int i = 0; i < toDoList.size(); i++) { + Task task = toDoList.get(i); + String taskType = task instanceof Deadline ? "D" : (task instanceof Event ? "E" : "T"); + String statusIcon = task.getStatusIcon(); + String taskDescription = task.getDescription(); + + // Write task details based on its type + if (task instanceof Deadline) { + String doBy = ((Deadline) task).getDoBy(); + writer.write(taskType + " | " + statusIcon + " | " + taskDescription + " | by: " + doBy + "\n"); + } else if (task instanceof Event) { + String timing = ((Event) task).getTiming(); + writer.write(taskType + " | " + statusIcon + " | " + taskDescription + " | " + timing + "\n"); + } else { + writer.write(taskType + " | " + statusIcon + " | " + taskDescription + "\n"); + } + } + + writer.close(); + System.out.println(LINE); + System.out.println(" Tasks have been saved to ./data/Tasks.txt"); + System.out.println(LINE); + + } catch (IOException e) { + System.out.println(LINE); + System.out.println(" An error occurred while saving tasks."); + System.out.println(LINE); + } + } +} From 2509408b4100f2309cae664bee6e972bbf468d12 Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 16 Sep 2024 16:25:34 +0800 Subject: [PATCH 11/22] fix bugs from level 6 --- src/main/java/tyrone/task/Deadline.class | Bin 2069 -> 2240 bytes src/main/java/tyrone/task/Deadline.java | 31 ++++++++++++++++------- src/main/java/tyrone/task/Event.class | Bin 2072 -> 2209 bytes src/main/java/tyrone/task/Event.java | 18 ++++++++----- src/main/java/tyrone/task/ToDo.class | Bin 1372 -> 1370 bytes 5 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/main/java/tyrone/task/Deadline.class b/src/main/java/tyrone/task/Deadline.class index df9c5b406b9d81e724c9c67322cd71926e7afa33..43317332d81149bb4da574ba2aa970155b06e872 100644 GIT binary patch delta 908 zcmYL{-BS~16vlt=W;dIJ1(Q_3bfl9~sQJPu6tzKYjifCVuvNh#q5{U4Gz1FK7F$cb z@XncDyzPZ;FWTOB254Poa7O5ro!<7=f5892aXd?$>CVpic%Em^dH1~M$M8-h^zVzU z$3ULD>!FHj_g9OxQvHU)mq-qW2-EHGHV5>Q>Wn2FQlu4jdATsZSYO!{U9{=Zf2eG8 zhJBv?ki%hm^)uDg9ONDPZH_n`<(M8b@__(32a5rHLbd5NtEuf=eW_e44J0Q*406Ke zJ%{%>sed+(j2fJB7^0vER?ExvQwuk1b%l~c4f3JGM+{5^QMn5(B)TcV^%LLDH-e%lkLKl2p>N8#OCHgNqOmRTbBK3xf z%X3TR#d>+679zm3!)1@MJ!&Dp5|v?Hb(mpRKkOTKyX+rH`+8mC;o$H8GwH|HZ|q5% zLUg$#9(YVtfHcS8S{N zZyOO}>|;M~(IIn;%No5&fi78(ZpKN-ERxKV;SN3A;~@9R@&kwXMHYIUUbgAu3H{uV zitSjD=frHv5&H#qZNlE0ldhi&Ys!?Xa!)mh4Hj4w-y+dX!N1tG%X}?ZNb+y^mhXtY E1dyJvZphI1_TWG2U#^%VnD> zrUgbZ|19S_8Hpjd>ap77s?jfQ%Pk`za`KlkA?9RXph4W1lL0596c#C%JoKnb@^#>c z@ko%6p92Zq4CYShI zkC0S^)b=KoQ;wdA23;J5Z_qxrPA2VgaB`h&Y{=!f7f*X}g{%U`)H+w@BK*S?-DR@O zmH!uhk!MNsEp;m^P@@K}Rb$svM*}Gu$35Zgllwuc_0*Xt2fWFfmRPGs#@4u*@I^f^h{6e1}C`^{6yCAq`>Z++YE@Nkat9{1+Q{IS@sQf>sTe(8hO! znA46c8f<81l+J|uvI!NP=u&W1!!=yz--I^5fEyb1?_qFc(i?@I{ARAez~T<{puOktXT7xkJ48fGy~Z7F3eolWOb9xya{h&5;Kq;p+rXG?rZ^0PF5 zEsg3q2G`PhKHK4AzCxa)9jgo;pY_f3&Cd8{DH32oJJz|=7A`BO*u<8CZL{7J-fR0Q zJ!A0mRhwT{@PeV5%xbz3cad5CjU2k;(;k4{iMp}=uijJjn5 z!J)7e4cnq6Gy=o>xOfQrl-_uN%LY0o_t7oQeMI*@dOf!d44V4xi6*KUT{JNI8G-@g z{^zh44a}7A5IALbm+gcmiaf=-*a!iNq*F?yl{@M97U zNFjhcg4jj~MS7O+iD}OM1x;9_Do#iq@@FlX Sx8xe0QbZ;14xZyBy#D|TS(g?7 delta 672 zcmXw%OHWf#5XXO~_x9fQa!a5=6A(!)4@+CE7Uij;C@QF+JVXRUQNXID$U_rj;?B6z z#o4&kxKLL@Oi4^2)HO z*IH#FacUeYXmZ(4LT{^tm2^pw)_>Hf;}GJYOOTBI5J*PC942ei;&OzedOFZk)<(Nc zhf612`e&fE>^LWEx?N6kN_QD8>a;Ex>2NP+ZO*xz*YAu5)vv!A$xw)kE|(b4^=7*L zvda|)6yf>Vm62RNw=f??k#uNd#ATGL3UfL4WL9A$n){*zxaKvP(2Hh=x}iUsjp~;E zZVspC6p^{5LcTMmVk-raA?_-oG5<{TPEEw7#FJ3XA@1qHV5&=*zX<+N z%X-pEnyZRBJ#E$L_f|ZZk#5HIwpBZFT~=6*A<|n*1V=38HSa|TyH`*N29uw$KZ&C7 zQY@dWB+P{90YCJYXkMXLy4#LF+p^wLwn=<^gN84ggvL`ww!$jXm@>1eV75dvY;fSx zI)~ClTF2Ho7VRl=#>2iH6#jzT!4gBTLrHXz;Syv22|s5|UJdwtwaN&vi|A8!Q$scT z*drgImJBia#Tues0vnj2kyV;_F5Z_Un3OaJBWnMq%4Ujbu}vBBri?V>m%q&&!78!u V3qR}2d0*yu=w~aISm6=X{{Zq@by@%b diff --git a/src/main/java/tyrone/task/Event.java b/src/main/java/tyrone/task/Event.java index 32dfbd33b..97ccc3128 100644 --- a/src/main/java/tyrone/task/Event.java +++ b/src/main/java/tyrone/task/Event.java @@ -24,18 +24,24 @@ public static void createEvent(String userInput) throws TyroneException { String[] parts = userInput.split(" /from | /to "); + // Check if the description part exists and is long enough + if (parts[0].length() < 6) { // "event " is 6 characters long + throw new WrongEventFormatException(); + } + if (parts.length < 3) { throw new MissingTimeInfoException(); } - // Add the new Event to the ArrayList - Event newEvent = new Event(parts[0].substring(6), "from: " + parts[1] + " to: " + parts[2]); - Constants.toDoList.add(newEvent); + String description = parts[0].substring(6); // Extracting description after "event " + String timing = "from: " + parts[1] + " to: " + parts[2]; + Constants.toDoList.add(new Event(description, timing)); + Task.listCount++; System.out.println(Constants.LINE); - System.out.println(" Crazy event cuh:"); - System.out.println(" [E][ ] " + newEvent.getDescription() + " (" + newEvent.getTiming() + ")"); - System.out.println(" Now you have " + Constants.toDoList.size() + " tasks in the list."); + System.out.println(" Got it. I've added this task cuh:"); + System.out.println(" [E][ ] " + Constants.toDoList.get(Task.listCount - 1).getDescription() + " (" + ((Event) Constants.toDoList.get(Task.listCount - 1)).getTiming() + ")"); + System.out.println(" Now you have " + Task.listCount + " tasks in the list."); System.out.println(Constants.LINE); } } diff --git a/src/main/java/tyrone/task/ToDo.class b/src/main/java/tyrone/task/ToDo.class index 6f550d9775e927728e67961f0cae20aee043cee4..45954962ec1ab6c4bd57f17210aafbd2c9d51957 100644 GIT binary patch delta 22 ccmcb^b&G4mRYp#E1t6$QtxVngfU$-d09`i+$N&HU delta 24 ecmcb`b%$%iRYq<_1t4(GFHy)W*?f<&h8X~AR|qu# From a7bf5e108e8a9855e18d1f6921009e590a3b0d20 Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 27 Sep 2024 19:48:31 +0800 Subject: [PATCH 12/22] A-MoreOOP --- .gitignore | 9 +- src/main/java/Tyrone.java | 110 ++++++------------ .../java/tyrone/constants/Constants.class | Bin 4629 -> 3831 bytes src/main/java/tyrone/constants/Constants.java | 48 ++------ src/main/java/tyrone/parser/Parser.java | 68 +++++++++++ src/main/java/tyrone/storage/Storage.java | 91 +++++++++++++++ src/main/java/tyrone/tasklist/TaskList.java | 36 ++++++ src/main/java/tyrone/ui/Ui.java | 43 +++++++ 8 files changed, 281 insertions(+), 124 deletions(-) create mode 100644 src/main/java/tyrone/parser/Parser.java create mode 100644 src/main/java/tyrone/storage/Storage.java create mode 100644 src/main/java/tyrone/tasklist/TaskList.java create mode 100644 src/main/java/tyrone/ui/Ui.java diff --git a/.gitignore b/.gitignore index 8286bb757..974aa27fc 100644 --- a/.gitignore +++ b/.gitignore @@ -16,9 +16,6 @@ bin/ /text-ui-test/ACTUAL.TXT text-ui-test/EXPECTED-UNIX.TXT -src/main/java/Tyrone.class -src/main/java/*class -src/main/java/tyrone/task/*class -src/main/java/tyrone/constants/*class - -src/main/java/data/Tasks.txt \ No newline at end of file +*.class +*.txt +*.jar \ No newline at end of file diff --git a/src/main/java/Tyrone.java b/src/main/java/Tyrone.java index 492f7e1b5..474d3625a 100644 --- a/src/main/java/Tyrone.java +++ b/src/main/java/Tyrone.java @@ -1,90 +1,46 @@ import java.util.Scanner; import tyrone.constants.Constants; -import tyrone.exceptions.MissingTimeInfoException; -import tyrone.exceptions.TyroneException; -import tyrone.exceptions.WrongDeadlineFormatException; -import tyrone.exceptions.WrongEventFormatException; -import tyrone.task.Deadline; -import tyrone.task.Event; -import tyrone.task.Task; -import tyrone.task.ToDo; +import tyrone.exceptions.*; +import tyrone.parser.Parser; +import tyrone.storage.Storage; +import tyrone.task.*; +import tyrone.tasklist.TaskList; +import tyrone.ui.Ui; public class Tyrone { - public static void getUserInput(String userInput) throws TyroneException { - if (userInput.startsWith("mark ")) { - int index = Integer.parseInt(userInput.substring(5)) - 1; - if (index >= 0 && index < Constants.toDoList.size()) { - Constants.markAsDone(index); - } else { - System.out.println(Constants.LINE); - System.out.println(" Invalid task number bro."); - System.out.println(Constants.LINE); - } - } else if (userInput.startsWith("unmark ")) { - int index = Integer.parseInt(userInput.substring(7)) - 1; - if (index >= 0 && index < Constants.toDoList.size()) { - Constants.unmarkAsUndone(index); - } else { - System.out.println(Constants.LINE); - System.out.println(" Invalid task number bro."); - System.out.println(Constants.LINE); - } - } else if (userInput.startsWith("todo ")) { - ToDo.createToDo(userInput); - } else if (userInput.startsWith("deadline ")) { - try{ - Deadline.createDeadline(userInput); - }catch (WrongDeadlineFormatException e){ - System.out.println(Constants.LINE); - System.out.println(" WRONG WAY CUH!! Use: the format: deadline /by "); - System.out.println(Constants.LINE); - } catch (MissingTimeInfoException e) { - Constants.missingTimeInfo(); - } + private Storage storage; + private Ui ui; + private TaskList tasks; + + public Tyrone(String filePath) { + ui = new Ui(); + storage = new Storage(filePath); + try { + tasks = new TaskList(storage.loadTasks()); // Now loadTasks() returns a list of tasks + } catch (Exception e) { + ui.showLoadingError(); + tasks = new TaskList(); } - else if (userInput.startsWith("delete ")) { - int index = Integer.parseInt(userInput.substring(7)) - 1; - Constants.deleteTask(index); - } - else if (userInput.startsWith("event ")) { - try{ - Event.createEvent(userInput); - } catch (WrongEventFormatException e){ - System.out.println(Constants.LINE); - System.out.println(" WRONG WAY CUH!! Use: event /from /to "); - System.out.println(Constants.LINE); - } catch (MissingTimeInfoException e) { - Constants.missingTimeInfo(); + } + + public void run() { + ui.showWelcome(); + boolean isExit = false; + while (!isExit) { + try { + String fullCommand = ui.readCommand(); + isExit = Parser.handleUserInput(fullCommand, tasks); + } catch (TyroneException e) { + ui.showError(e.getMessage()); + } finally { + ui.showLine(); } - } else if (userInput.equals("list")) { - Constants.getList(); - } else if (userInput.equals("save")) { - Constants.saveTasks(); // Call save function - } else { - System.out.println(Constants.LINE); - System.out.println(" Invalid command my brother."); - System.out.println(Constants.LINE); } + ui.showGoodbye(); } public static void main(String[] args) { - try (Scanner in = new Scanner(System.in)) { - System.out.println(Constants.LINE); - System.out.println(" Hello from\n" + Constants.logo + "\n"); - System.out.println(" What can I do for you cuh?\n"); - System.out.println(Constants.LINE); - String input = in.nextLine(); - while (!input.equals("bye")) { - try { - getUserInput(input); - } catch (TyroneException e) { - // General exception handling for TyroneException - System.out.println("An error occurred: " + e.getMessage()); - } - input = in.nextLine(); - } - } - Constants.goodbye(); + new Tyrone("data/tasks.txt").run(); } } \ No newline at end of file diff --git a/src/main/java/tyrone/constants/Constants.class b/src/main/java/tyrone/constants/Constants.class index 1d9c51659d34a315dbb3e79b3491844d2205160e..25e8825b7a8306c09b077291f1c08c3210f0d989 100644 GIT binary patch literal 3831 zcmbVP`%@d&75*+@w8%2pYa47#?Im`MhymqA8Ux1RiA`iPr89QQ$*{#1L0%#fK*I_*#GKh$=Tw%^@dfv^e9bS3UyoqO(ieCKg5 zfBX0Pp8yQv{V1wX9YIYDyHG2z_lCZ#C-S_DYUz8HtQ-xt?x$ZeplB zQ?OT{P2-dP-%k`O_D66ahJ$Dn*uRZJfyk0npSNgHJTS@kjrN$j`(Bh2lT{6AghV23;x6|;TFa?^xG3n%`obG8E-O`d; z*4D1uj#jdZTBevg8&&WSU6M?$Vff^E$M$lDBMm+g!^1c!pm_GMJ#M<2co#i0pBQi) zy(G!KQN+<6!6Px8LPr^*tvn3af*}ROlkF9@2Ek{*x)|gzV4m(SCQ=-t=)|KjJch>! zuxoh33@71>UumCJ@T5Syv^$l2b~M$hCEJz_t)M%LMppB3rmIOQn(oqL%jl7ko{Hh~ zcv_&Ib_^SC#xa*X(`LjD#49ZdL#9HYMM1AXx74EN9djW^6pOizPuEqnt}}<-oRRHO zneQzUm;M;e;u$(%x+8@pujJ?V6$OI=4@=3H?V=MHnC$KnN$Juax-{+SUeQf5+aownrz*i5HuP-Xw2UamFcHI~+!K*7*n=e% z)wn2g?m2<;@nl78LL@#5Wg7q^m=@SqX~oF0VR=zZVJ3!IX+j-MNSOszh>99qRM{FX zOG~Z@oc?Tr#W}nFT{Lt?RZnI5m?R9gwiT5JOrfY^`Gy z>}5lN9&VkqJtNx{1Ugu&$f_O%838e@fT0j03KsZEsi=i1t-m2KwoQfppD?P3phaaj zkGwGw3(&zJ}>|&F5h<{|kwzKmkQlhfw47lailx&}6hbdYC zb;gq2C#bccf9_$KW)>&(C0}3!U*CGR`Nstn7lNc^aTrOaEY)Ocq=?ao#NzkQ>#lY~FBBjNA5N zajAF5V&1YbRa!E(VV|pz5T1dRy(|-d#AalUD-LU-Ic+ap-G zS2qPVQYX;Fws;7QwCpHtJIP&jSlJMMCKP_SLb%$xtvGr7fI<`;!(M0<+DcKc;LD*~ ziv&cvb@ncfH?N`XBXriRAyFy#i9qls!y3BRaeBj#t@bz5O5gW1?W*I!On*dkS#51jNH9?p7s z4eP^IoI!@(-o!I_i_}{f#=E>*eU&?#P}}k`g!lw!BIu0ZYsdcy^tx>jwfP;qzk%fK0Lg32vGKBx^8F%p1fVMF z{Hi}Ec#4``#V+;wgamz(d>x$<>viOOsDcfLNZ&wzF+{c{K>uK{7NDN@*GLJ%x{gAb z;8*7=j&QA9sOr*vUI$SaN<9%J(dT*E!QfDd^s`wO{bRE{9>F}fL$-2)8CCwQDAzlZ*TBeMR#xe=L;Ffw~p z=N_6qMEvpx@b2OGX4eSXPy-{nkIDTSg;(Kqyuo)rThuRE;@|Se@A%{Q{PFw#_(OmE dkw5;#AK&)JpZVj@@f*sBa{q6!ir?e#e*tYujVb^D literal 4629 zcmbVQX>b(B75+xoj8@CFT#}ISa7scK#s(XSBSI2p(E&k1SR4_f-9Z}m7|8*yB*JlU>?96Os`ArS&d>bJ&!j3zfyviByV45D#N|DDdSAbO z$M;^p*V4`RCtnA!3x5e95BVwzf+$3hf`uoI5u+h)BnKPz4V*M1o`RxnR?_lzD9Ep> z?k$FfVikcPN)VjE-aY1eW`bOHikp^pNI{m}u-~zgUbp9%Mxsf@d z9cM^%B47%(+H64Ug^=w*?7&W9=vt=A$yP=Eu%l5PcCKb$3V=+$sg!D@-@zJmwa^iIolsX_OwgsEG} z6SltVz`>q9%>vd#K|CfBzsNBY_K2zBaAs?l?U~VfKhXYKPIfkGII2Kt)$j>E+B6*J zqbI~dG$5>xDA+qkdVNF~Lny+=5L7W}7!(SIW}U{VbUmq{Lbx7Iju>%^HjBfQOeF?P zN90qzinxMcw&Luz;`Es(si?joYIsHfF${}>x=hTRAY75SMdm3crYlIPAVvhKFcFJd zj*3$XLb<{YIhJQS8cwq)_#$OJaO=HO4E!jDLny`>;ln2t9Q}wO%?5IgED+kx2JtCT zVGBovSs?^)CdBeTAl5z;#Aij{D2&8ymmoZ?piTfM%9pDT87xWzrkT`T&IqHe-|dcy zXR`&9%_6+7?Nr2+bxFe)G8L{lshf^tJGvc-q#TEGMu&*FkSP;VsH)fSB?a&JeM1=V z0k6P#KUez4#US3|LyDZquA>KZeOw>sN4_ij`y04=bX>3GsLS~j2gUgBs{ZQCjDopC zaB%Txe}Ao17n;8M6YRfvn?rH-OJ9BO8V4;Nzrxu+UWPqc`U1uSf?>81*v#x=G{TIV=7Ge zMTW)9470>gP1KB=o+&J&J0go@X0a!4i?9;Qdr6?1r9WbdQ%D=K5V-Z?L{ZHy+xA?~ zF@`%$Z^(|i8eUOQ;=_I9v17WT;m6YiT@rrErYAU*di_Z2u_FqJdey*KqpnnI_<82W zAQs!Qi(=slJ;?6r@fS4wf;MH8DOp;Yq4H@{LVrc~G9)2tGSk(%>`{3ukta!!b;xD) zWs5g;(dU@=udzvu)4u7iG&G>$b$UNdl^mqrVCBl81{M_IcLBVKw^aOIl$1XxSSyQ> zyeV195j$o!_?3~^@(!@uh$3%9COALEd8|qjA$++hN*d_3w5QQIiTxR#WjO*S@o`B#2W8^U(^X!#VshxZERPuM#aT7|3T=#1fm$1vcQmC zWZPX?)iY<1{j6%HJ-e7yEzGJ`iuztQxJom#PUPKNb_wzp-LD;rxC!GRjRx zO5=uqT}P}hl(+`FeM1_LzW|L7@6dIO_Jzi-;fap??G@RyJ2-cOH>x#d1!aY0MP=$F#syqYPGF0_U+@TEXYf3g;R$8-P2$s% zaxRZqZ83P~axwl~4#pFxXwO~ye9qcsS)bm;dw3>u8XV?7(9iOCoTtIyX*XG9hENNO z`G1nA$Iyp3Ic$b`nB(I-6%L-|{rfyT0-M4Fqm<^J*Kis)@C4qbhks?%-lfg&;Ys|B zJO0k=?mzGp{)uxkUM(oOg=H#Yw^5>ERJjE`8@%`NfFC@LYwj>Z_^*_h-~o8d?ywlK zrmJ|SlyUq)Hm)?-KXD5~U%ZOvu4852HJrbSvgz{ecYp7DC=$9#Gg_2Kavb;!~g&Q diff --git a/src/main/java/tyrone/constants/Constants.java b/src/main/java/tyrone/constants/Constants.java index 54d07290a..7ab0b74f4 100644 --- a/src/main/java/tyrone/constants/Constants.java +++ b/src/main/java/tyrone/constants/Constants.java @@ -19,6 +19,13 @@ public class Constants { public Constants() { } + public static void intro(){ + System.out.println(LINE); + System.out.println(" Hello from\n" + Constants.logo + "\n"); + System.out.println(" What can I do for you cuh?\n"); + System.out.println(LINE); + } + public static void goodbye() { System.out.println(LINE); System.out.println(" see you brother"); @@ -88,46 +95,5 @@ public static void deleteTask(int index) { System.out.println(LINE); } } - // Save tasks - public static void saveTasks() { - try { - // Check if ./data directory exists, if not, create it - File directory = new File("./data"); - if (!directory.exists()) { - directory.mkdir(); - } - - // Create or open Tasks.txt file - FileWriter writer = new FileWriter("./data/Tasks.txt"); - // Write all tasks to the file - for (int i = 0; i < toDoList.size(); i++) { - Task task = toDoList.get(i); - String taskType = task instanceof Deadline ? "D" : (task instanceof Event ? "E" : "T"); - String statusIcon = task.getStatusIcon(); - String taskDescription = task.getDescription(); - - // Write task details based on its type - if (task instanceof Deadline) { - String doBy = ((Deadline) task).getDoBy(); - writer.write("| " + taskType + " | " + statusIcon + " | " + taskDescription + " | by: " + doBy + "\n"); - } else if (task instanceof Event) { - String timing = ((Event) task).getTiming(); - writer.write("| " + taskType + " | " + statusIcon + " | " + taskDescription + " | " + timing + "\n"); - } else { - writer.write("| " + taskType + " | " + statusIcon + " | " + taskDescription + "\n"); - } - } - - writer.close(); - System.out.println(LINE); - System.out.println(" Tasks have been saved to ./data/Tasks.txt"); - System.out.println(LINE); - - } catch (IOException e) { - System.out.println(LINE); - System.out.println(" An error occurred while saving tasks."); - System.out.println(LINE); - } - } } diff --git a/src/main/java/tyrone/parser/Parser.java b/src/main/java/tyrone/parser/Parser.java new file mode 100644 index 000000000..4a4e7640f --- /dev/null +++ b/src/main/java/tyrone/parser/Parser.java @@ -0,0 +1,68 @@ +package tyrone.parser; + +import tyrone.constants.Constants; +import tyrone.exceptions.*; +import tyrone.storage.Storage; +import tyrone.task.*; +import tyrone.tasklist.TaskList; + +public class Parser { + public static boolean handleUserInput(String userInput, TaskList tasks) throws TyroneException { + if (userInput.equals("bye")) { + return true; // Exit the program when "bye" is typed + } else if (userInput.startsWith("mark ")) { + int index = Integer.parseInt(userInput.substring(5)) - 1; + if (index >= 0 && index < Constants.toDoList.size()) { + Constants.markAsDone(index); + } else { + System.out.println(Constants.LINE); + System.out.println(" Invalid task number bro."); + System.out.println(Constants.LINE); + } + } else if (userInput.startsWith("unmark ")) { + int index = Integer.parseInt(userInput.substring(7)) - 1; + if (index >= 0 && index < Constants.toDoList.size()) { + Constants.unmarkAsUndone(index); + } else { + System.out.println(Constants.LINE); + System.out.println(" Invalid task number bro."); + System.out.println(Constants.LINE); + } + } else if (userInput.startsWith("todo ")) { + ToDo.createToDo(userInput); + } else if (userInput.startsWith("deadline ")) { + try{ + Deadline.createDeadline(userInput); + }catch (WrongDeadlineFormatException e){ + System.out.println(Constants.LINE); + System.out.println(" WRONG WAY CUH!! Use: the format: deadline /by "); + System.out.println(Constants.LINE); + } catch (MissingTimeInfoException e) { + Constants.missingTimeInfo(); + } + } + else if (userInput.startsWith("delete ")) { + int index = Integer.parseInt(userInput.substring(7)) - 1; + Constants.deleteTask(index); + } + else if (userInput.startsWith("event ")) { + try{ + Event.createEvent(userInput); + } catch (WrongEventFormatException e){ + System.out.println(Constants.LINE); + System.out.println(" WRONG WAY CUH!! Use: event /from /to "); + System.out.println(Constants.LINE); + } catch (MissingTimeInfoException e) { + Constants.missingTimeInfo(); + } + } else if (userInput.equals("list")) { + Constants.getList(); + } else { + System.out.println(Constants.LINE); + System.out.println(" Invalid command my brother."); + System.out.println(Constants.LINE); + } + Storage.saveTasks(tasks.getTasks()); // Call save function + return false; + } +} diff --git a/src/main/java/tyrone/storage/Storage.java b/src/main/java/tyrone/storage/Storage.java new file mode 100644 index 000000000..097909bf2 --- /dev/null +++ b/src/main/java/tyrone/storage/Storage.java @@ -0,0 +1,91 @@ +package tyrone.storage; + +import tyrone.task.*; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Scanner; + +public class Storage { + private String filePath; + + // Constructor that accepts a file path + public Storage(String filePath) { + this.filePath = filePath; + } + + // Modify loadTasks to return a list of tasks + public ArrayList loadTasks() { + ArrayList tasks = new ArrayList<>(); + try { + // Open Tasks.txt file + File file = new File(filePath); + Scanner scanner = new Scanner(file); + + // Read each line and parse the task details + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + String[] parts = line.split("\\|"); + + if (parts.length >= 4) { + String taskType = parts[1].trim(); // T, D, E + boolean isDone = parts[2].trim().equals("X"); // X means done, " " means not done + String description = parts[3].trim(); // Task description + + if (taskType.equals("T")) { + ToDo todo = new ToDo(description); + todo.setDone(isDone); + tasks.add(todo); // Add to task list + } else if (taskType.equals("D") && parts.length == 5) { + String by = parts[4].trim().replace("by:", "").trim(); + Deadline deadline = new Deadline(description, by); + deadline.setDone(isDone); + tasks.add(deadline); // Add to task list + } else if (taskType.equals("E") && parts.length == 5) { + String timing = parts[4].trim(); + Event event = new Event(description, timing); + event.setDone(isDone); + tasks.add(event); // Add to task list + } + } + } + scanner.close(); + } catch (FileNotFoundException e) { + System.out.println(" Tasks.txt file not found."); + } + return tasks; // Return the list of tasks + } + + // Save the tasks to the file + public static void saveTasks(ArrayList tasks) { + try { + File directory = new File("./data"); + if (!directory.exists()) { + directory.mkdir(); + } + + FileWriter writer = new FileWriter("./data/Tasks.txt"); + + for (Task task : tasks) { + String taskType = task instanceof Deadline ? "D" : (task instanceof Event ? "E" : "T"); + String statusIcon = task.getStatusIcon(); + String taskDescription = task.getDescription(); + + if (task instanceof Deadline) { + String doBy = ((Deadline) task).getDoBy(); + writer.write("| " + taskType + " | " + statusIcon + " | " + taskDescription + " | by: " + doBy + "\n"); + } else if (task instanceof Event) { + String timing = ((Event) task).getTiming(); + writer.write("| " + taskType + " | " + statusIcon + " | " + taskDescription + " | " + timing + "\n"); + } else { + writer.write("| " + taskType + " | " + statusIcon + " | " + taskDescription + "\n"); + } + } + writer.close(); + } catch (IOException e) { + System.out.println(" An error occurred while saving tasks."); + } + } +} diff --git a/src/main/java/tyrone/tasklist/TaskList.java b/src/main/java/tyrone/tasklist/TaskList.java new file mode 100644 index 000000000..88621b199 --- /dev/null +++ b/src/main/java/tyrone/tasklist/TaskList.java @@ -0,0 +1,36 @@ +package tyrone.tasklist; + +import java.util.ArrayList; +import tyrone.task.Task; + +public class TaskList { + private ArrayList tasks; + + public TaskList(ArrayList tasks) { + this.tasks = tasks; + } + + public TaskList() { + tasks = new ArrayList<>(); + } + + public void addTask(Task task) { + tasks.add(task); + } + + public void deleteTask(int index) { + tasks.remove(index); + } + + public Task getTask(int index) { + return tasks.get(index); + } + + public int getSize() { + return tasks.size(); + } + + public ArrayList getTasks() { + return tasks; + } +} diff --git a/src/main/java/tyrone/ui/Ui.java b/src/main/java/tyrone/ui/Ui.java new file mode 100644 index 000000000..4697f3069 --- /dev/null +++ b/src/main/java/tyrone/ui/Ui.java @@ -0,0 +1,43 @@ +package tyrone.ui; + +import java.util.Scanner; +import tyrone.constants.Constants; + +public class Ui { + private Scanner scanner; + + public Ui() { + scanner = new Scanner(System.in); + } + + public String readCommand() { + return scanner.nextLine(); + } + + public void showLine() { + System.out.println(Constants.LINE); + } + + public void showWelcome() { + System.out.println(Constants.LINE); + System.out.println(" Hello from\n" + Constants.logo + "\n"); + System.out.println(" What can I do for you cuh?\n"); + System.out.println(Constants.LINE); + } + + public void showGoodbye() { + System.out.println(Constants.LINE); + System.out.println(" see you brother"); + System.out.println(Constants.LINE); + } + + public void showError(String message) { + System.out.println("Error: " + message); + } + + public void showLoadingError() { + System.out.println(Constants.LINE); + System.out.println(" Tasks.txt file not found."); + System.out.println(Constants.LINE); + } +} From 2591f717ef4f7870e693c37bec43a9abba42c266 Mon Sep 17 00:00:00 2001 From: Paul Date: Sat, 28 Sep 2024 11:37:44 +0800 Subject: [PATCH 13/22] A-MoreOOP-V2 --- .gitignore | 1 + src/main/java/Tyrone.java | 77 ++----------- .../java/tyrone/constants/Constants.class | Bin 4629 -> 0 bytes src/main/java/tyrone/constants/Constants.java | 60 +++-------- .../exceptions/MissingTimeInfoException.class | Bin 328 -> 0 bytes .../tyrone/exceptions/TyroneException.class | Bin 248 -> 0 bytes .../WrongDeadlineFormatException.class | Bin 320 -> 0 bytes .../WrongEventFormatException.class | Bin 311 -> 0 bytes src/main/java/tyrone/parser/Parser.java | 69 ++++++++++++ src/main/java/tyrone/storage/Storage.java | 101 ++++++++++++++++++ src/main/java/tyrone/task/Deadline.class | Bin 2153 -> 0 bytes src/main/java/tyrone/task/Event.class | Bin 2153 -> 0 bytes src/main/java/tyrone/task/Task.class | Bin 743 -> 0 bytes src/main/java/tyrone/task/ToDo.class | Bin 1370 -> 0 bytes 14 files changed, 195 insertions(+), 113 deletions(-) delete mode 100644 src/main/java/tyrone/constants/Constants.class delete mode 100644 src/main/java/tyrone/exceptions/MissingTimeInfoException.class delete mode 100644 src/main/java/tyrone/exceptions/TyroneException.class delete mode 100644 src/main/java/tyrone/exceptions/WrongDeadlineFormatException.class delete mode 100644 src/main/java/tyrone/exceptions/WrongEventFormatException.class create mode 100644 src/main/java/tyrone/parser/Parser.java create mode 100644 src/main/java/tyrone/storage/Storage.java delete mode 100644 src/main/java/tyrone/task/Deadline.class delete mode 100644 src/main/java/tyrone/task/Event.class delete mode 100644 src/main/java/tyrone/task/Task.class delete mode 100644 src/main/java/tyrone/task/ToDo.class diff --git a/.gitignore b/.gitignore index 8286bb757..c803baa5e 100644 --- a/.gitignore +++ b/.gitignore @@ -20,5 +20,6 @@ src/main/java/Tyrone.class src/main/java/*class src/main/java/tyrone/task/*class src/main/java/tyrone/constants/*class +*.class src/main/java/data/Tasks.txt \ No newline at end of file diff --git a/src/main/java/Tyrone.java b/src/main/java/Tyrone.java index 492f7e1b5..01ec05ed5 100644 --- a/src/main/java/Tyrone.java +++ b/src/main/java/Tyrone.java @@ -1,83 +1,20 @@ import java.util.Scanner; import tyrone.constants.Constants; -import tyrone.exceptions.MissingTimeInfoException; import tyrone.exceptions.TyroneException; -import tyrone.exceptions.WrongDeadlineFormatException; -import tyrone.exceptions.WrongEventFormatException; -import tyrone.task.Deadline; -import tyrone.task.Event; -import tyrone.task.Task; -import tyrone.task.ToDo; +import tyrone.storage.Storage; +import tyrone.parser.Parser; public class Tyrone { - public static void getUserInput(String userInput) throws TyroneException { - if (userInput.startsWith("mark ")) { - int index = Integer.parseInt(userInput.substring(5)) - 1; - if (index >= 0 && index < Constants.toDoList.size()) { - Constants.markAsDone(index); - } else { - System.out.println(Constants.LINE); - System.out.println(" Invalid task number bro."); - System.out.println(Constants.LINE); - } - } else if (userInput.startsWith("unmark ")) { - int index = Integer.parseInt(userInput.substring(7)) - 1; - if (index >= 0 && index < Constants.toDoList.size()) { - Constants.unmarkAsUndone(index); - } else { - System.out.println(Constants.LINE); - System.out.println(" Invalid task number bro."); - System.out.println(Constants.LINE); - } - } else if (userInput.startsWith("todo ")) { - ToDo.createToDo(userInput); - } else if (userInput.startsWith("deadline ")) { - try{ - Deadline.createDeadline(userInput); - }catch (WrongDeadlineFormatException e){ - System.out.println(Constants.LINE); - System.out.println(" WRONG WAY CUH!! Use: the format: deadline /by "); - System.out.println(Constants.LINE); - } catch (MissingTimeInfoException e) { - Constants.missingTimeInfo(); - } - } - else if (userInput.startsWith("delete ")) { - int index = Integer.parseInt(userInput.substring(7)) - 1; - Constants.deleteTask(index); - } - else if (userInput.startsWith("event ")) { - try{ - Event.createEvent(userInput); - } catch (WrongEventFormatException e){ - System.out.println(Constants.LINE); - System.out.println(" WRONG WAY CUH!! Use: event /from /to "); - System.out.println(Constants.LINE); - } catch (MissingTimeInfoException e) { - Constants.missingTimeInfo(); - } - } else if (userInput.equals("list")) { - Constants.getList(); - } else if (userInput.equals("save")) { - Constants.saveTasks(); // Call save function - } else { - System.out.println(Constants.LINE); - System.out.println(" Invalid command my brother."); - System.out.println(Constants.LINE); - } - } - - public static void main(String[] args) { + public static void main(String[] args) { + Constants.toDoList = Storage.loadTasks(); try (Scanner in = new Scanner(System.in)) { - System.out.println(Constants.LINE); - System.out.println(" Hello from\n" + Constants.logo + "\n"); - System.out.println(" What can I do for you cuh?\n"); - System.out.println(Constants.LINE); + // Constants acts as my ui package + Constants.intro(); String input = in.nextLine(); while (!input.equals("bye")) { try { - getUserInput(input); + Parser.getUserInput(input); } catch (TyroneException e) { // General exception handling for TyroneException System.out.println("An error occurred: " + e.getMessage()); diff --git a/src/main/java/tyrone/constants/Constants.class b/src/main/java/tyrone/constants/Constants.class deleted file mode 100644 index 1d9c51659d34a315dbb3e79b3491844d2205160e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4629 zcmbVQX>b(B75+xoj8@CFT#}ISa7scK#s(XSBSI2p(E&k1SR4_f-9Z}m7|8*yB*JlU>?96Os`ArS&d>bJ&!j3zfyviByV45D#N|DDdSAbO z$M;^p*V4`RCtnA!3x5e95BVwzf+$3hf`uoI5u+h)BnKPz4V*M1o`RxnR?_lzD9Ep> z?k$FfVikcPN)VjE-aY1eW`bOHikp^pNI{m}u-~zgUbp9%Mxsf@d z9cM^%B47%(+H64Ug^=w*?7&W9=vt=A$yP=Eu%l5PcCKb$3V=+$sg!D@-@zJmwa^iIolsX_OwgsEG} z6SltVz`>q9%>vd#K|CfBzsNBY_K2zBaAs?l?U~VfKhXYKPIfkGII2Kt)$j>E+B6*J zqbI~dG$5>xDA+qkdVNF~Lny+=5L7W}7!(SIW}U{VbUmq{Lbx7Iju>%^HjBfQOeF?P zN90qzinxMcw&Luz;`Es(si?joYIsHfF${}>x=hTRAY75SMdm3crYlIPAVvhKFcFJd zj*3$XLb<{YIhJQS8cwq)_#$OJaO=HO4E!jDLny`>;ln2t9Q}wO%?5IgED+kx2JtCT zVGBovSs?^)CdBeTAl5z;#Aij{D2&8ymmoZ?piTfM%9pDT87xWzrkT`T&IqHe-|dcy zXR`&9%_6+7?Nr2+bxFe)G8L{lshf^tJGvc-q#TEGMu&*FkSP;VsH)fSB?a&JeM1=V z0k6P#KUez4#US3|LyDZquA>KZeOw>sN4_ij`y04=bX>3GsLS~j2gUgBs{ZQCjDopC zaB%Txe}Ao17n;8M6YRfvn?rH-OJ9BO8V4;Nzrxu+UWPqc`U1uSf?>81*v#x=G{TIV=7Ge zMTW)9470>gP1KB=o+&J&J0go@X0a!4i?9;Qdr6?1r9WbdQ%D=K5V-Z?L{ZHy+xA?~ zF@`%$Z^(|i8eUOQ;=_I9v17WT;m6YiT@rrErYAU*di_Z2u_FqJdey*KqpnnI_<82W zAQs!Qi(=slJ;?6r@fS4wf;MH8DOp;Yq4H@{LVrc~G9)2tGSk(%>`{3ukta!!b;xD) zWs5g;(dU@=udzvu)4u7iG&G>$b$UNdl^mqrVCBl81{M_IcLBVKw^aOIl$1XxSSyQ> zyeV195j$o!_?3~^@(!@uh$3%9COALEd8|qjA$++hN*d_3w5QQIiTxR#WjO*S@o`B#2W8^U(^X!#VshxZERPuM#aT7|3T=#1fm$1vcQmC zWZPX?)iY<1{j6%HJ-e7yEzGJ`iuztQxJom#PUPKNb_wzp-LD;rxC!GRjRx zO5=uqT}P}hl(+`FeM1_LzW|L7@6dIO_Jzi-;fap??G@RyJ2-cOH>x#d1!aY0MP=$F#syqYPGF0_U+@TEXYf3g;R$8-P2$s% zaxRZqZ83P~axwl~4#pFxXwO~ye9qcsS)bm;dw3>u8XV?7(9iOCoTtIyX*XG9hENNO z`G1nA$Iyp3Ic$b`nB(I-6%L-|{rfyT0-M4Fqm<^J*Kis)@C4qbhks?%-lfg&;Ys|B zJO0k=?mzGp{)uxkUM(oOg=H#Yw^5>ERJjE`8@%`NfFC@LYwj>Z_^*_h-~o8d?ywlK zrmJ|SlyUq)Hm)?-KXD5~U%ZOvu4852HJrbSvgz{ecYp7DC=$9#Gg_2Kavb;!~g&Q diff --git a/src/main/java/tyrone/constants/Constants.java b/src/main/java/tyrone/constants/Constants.java index 54d07290a..d4336c8c4 100644 --- a/src/main/java/tyrone/constants/Constants.java +++ b/src/main/java/tyrone/constants/Constants.java @@ -8,15 +8,31 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.util.Scanner; public class Constants { + + private Scanner scanner; + + public Constants() { + scanner = new Scanner(System.in); + } + + public String readCommand() { + return scanner.nextLine(); + } + public static final String LINE = " ___________________________________"; public static String logo = " _____ \n|_ _| _ _ __ ___ _ __ ___ \n | || | | | '__/ _ \\| '_ \\ / _ \\\n | || |_| | | | (_) | | | | __/\n |_| \\__, |_| \\___/|_| |_|\\___|\n |___/ "; public static ArrayList toDoList = new ArrayList<>(); - public Constants() { + public static void intro() { + System.out.println(Constants.LINE); + System.out.println(" Hello from\n" + Constants.logo + "\n"); + System.out.println(" What can I do for you cuh?\n"); + System.out.println(Constants.LINE); } public static void goodbye() { @@ -88,46 +104,4 @@ public static void deleteTask(int index) { System.out.println(LINE); } } - // Save tasks - public static void saveTasks() { - try { - // Check if ./data directory exists, if not, create it - File directory = new File("./data"); - if (!directory.exists()) { - directory.mkdir(); - } - - // Create or open Tasks.txt file - FileWriter writer = new FileWriter("./data/Tasks.txt"); - - // Write all tasks to the file - for (int i = 0; i < toDoList.size(); i++) { - Task task = toDoList.get(i); - String taskType = task instanceof Deadline ? "D" : (task instanceof Event ? "E" : "T"); - String statusIcon = task.getStatusIcon(); - String taskDescription = task.getDescription(); - - // Write task details based on its type - if (task instanceof Deadline) { - String doBy = ((Deadline) task).getDoBy(); - writer.write("| " + taskType + " | " + statusIcon + " | " + taskDescription + " | by: " + doBy + "\n"); - } else if (task instanceof Event) { - String timing = ((Event) task).getTiming(); - writer.write("| " + taskType + " | " + statusIcon + " | " + taskDescription + " | " + timing + "\n"); - } else { - writer.write("| " + taskType + " | " + statusIcon + " | " + taskDescription + "\n"); - } - } - - writer.close(); - System.out.println(LINE); - System.out.println(" Tasks have been saved to ./data/Tasks.txt"); - System.out.println(LINE); - - } catch (IOException e) { - System.out.println(LINE); - System.out.println(" An error occurred while saving tasks."); - System.out.println(LINE); - } - } } diff --git a/src/main/java/tyrone/exceptions/MissingTimeInfoException.class b/src/main/java/tyrone/exceptions/MissingTimeInfoException.class deleted file mode 100644 index 158f13acabfb1cbbb8ebd6cb3ef66292ca14f11d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 328 zcmZ`!!Ab)$5PjLUo4Qsjf=6LXFKrLq4^TWP3WeHBm)_GlmXU5E*|g|qc`A7D1N^As zY*7%z3=D5xUS8gO?%qEDT;rsPNTGYrWyyA#1}-RN`{;aO0y~=uN@+tj3=`DR(1=^m zXexBVt9O<%dRfqOB`vdj&)ohH3h^ad4p$0iz44RTm~3V2GMff3UtRQP8i~T-ug`aw zT(XQL$}huOuRl|$-?#@-Xph;_WL?b3=VrbVCYidmU(g*_!})(U!zv0oIFN;^qogzr irMG12A`%4X!KvD!_O=%sNl)Yg@+3w>1jm9Sw7&pvY*Uv2 diff --git a/src/main/java/tyrone/exceptions/TyroneException.class b/src/main/java/tyrone/exceptions/TyroneException.class deleted file mode 100644 index 35559c3444efcf43f4d806c1f83a4abdf4d6efd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 248 zcmX^0Z`VEs1_mbvUM>bE24;2!79Ivx1~x_p;jF~6ME#t^ymWonisaOSlFa-(Mg}&U z%)HDJJ4Oak4IhMp;F6-uymV{LFm?tGMh3-_%A)+dRQ*(#wqpGdun3YlEYA5Usf-N# zKACx`exKBP2lS(g zS)m|Unm|ZiUS5*#pWPn76WR>~gxi_3rg&CzS!$y)>sHdosG%+pH6hR-B!0sjm8#E$ zdh^me=I){4ZFRZP#fB% zBDBVQ-^+S6S8gijB_r{~uH8aqx+;?Yr25rKNN~ZARYvRrmmHg1-67x%5cfCqg>ZW$ STyc!K0Un7^XTmk-0a^#I%25LV diff --git a/src/main/java/tyrone/exceptions/WrongEventFormatException.class b/src/main/java/tyrone/exceptions/WrongEventFormatException.class deleted file mode 100644 index 4aafe95e61af30baf4a8eb2ffee8b2c1ccbe3fd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311 zcmZ`!!D<3Q41HO3N4K^vf>%MjXoc(P)rj7RRgj#E`kXxB7rAd>aciN<{?Xf^a==|5Y-TX%}*J_Um`L3NSLS>+h z`rNFh%8lf7$w)M`8#hyZofY-FIxpEVXrRO|Wk&1*4;;%}H4$(Ii03N(Ah*8|9yvzb O0FQ(yFyV>w0F^WBI!(R+ diff --git a/src/main/java/tyrone/parser/Parser.java b/src/main/java/tyrone/parser/Parser.java new file mode 100644 index 000000000..12a5a198d --- /dev/null +++ b/src/main/java/tyrone/parser/Parser.java @@ -0,0 +1,69 @@ +package tyrone.parser; + +import tyrone.constants.Constants; +import tyrone.exceptions.MissingTimeInfoException; +import tyrone.exceptions.TyroneException; +import tyrone.exceptions.WrongDeadlineFormatException; +import tyrone.exceptions.WrongEventFormatException; +import tyrone.storage.Storage; +import tyrone.task.Deadline; +import tyrone.task.Event; +import tyrone.task.ToDo; + +public class Parser { + public static void getUserInput(String userInput) throws TyroneException { + if (userInput.startsWith("mark ")) { + int index = Integer.parseInt(userInput.substring(5)) - 1; + if (index >= 0 && index < Constants.toDoList.size()) { + Constants.markAsDone(index); + } else { + System.out.println(Constants.LINE); + System.out.println(" Invalid task number bro."); + System.out.println(Constants.LINE); + } + } else if (userInput.startsWith("unmark ")) { + int index = Integer.parseInt(userInput.substring(7)) - 1; + if (index >= 0 && index < Constants.toDoList.size()) { + Constants.unmarkAsUndone(index); + } else { + System.out.println(Constants.LINE); + System.out.println(" Invalid task number bro."); + System.out.println(Constants.LINE); + } + } else if (userInput.startsWith("todo ")) { + ToDo.createToDo(userInput); + } else if (userInput.startsWith("deadline ")) { + try{ + Deadline.createDeadline(userInput); + }catch (WrongDeadlineFormatException e){ + System.out.println(Constants.LINE); + System.out.println(" WRONG WAY CUH!! Use: the format: deadline /by "); + System.out.println(Constants.LINE); + } catch (MissingTimeInfoException e) { + Constants.missingTimeInfo(); + } + } + else if (userInput.startsWith("delete ")) { + int index = Integer.parseInt(userInput.substring(7)) - 1; + Constants.deleteTask(index); + } + else if (userInput.startsWith("event ")) { + try{ + Event.createEvent(userInput); + } catch (WrongEventFormatException e){ + System.out.println(Constants.LINE); + System.out.println(" WRONG WAY CUH!! Use: event /from /to "); + System.out.println(Constants.LINE); + } catch (MissingTimeInfoException e) { + Constants.missingTimeInfo(); + } + } else if (userInput.equals("list")) { + Constants.getList(); + } else { + System.out.println(Constants.LINE); + System.out.println(" Invalid command my brother."); + System.out.println(Constants.LINE); + } + Storage.saveTasks();// Call save function + } +} diff --git a/src/main/java/tyrone/storage/Storage.java b/src/main/java/tyrone/storage/Storage.java new file mode 100644 index 000000000..4a0fed4ac --- /dev/null +++ b/src/main/java/tyrone/storage/Storage.java @@ -0,0 +1,101 @@ +package tyrone.storage; + +import tyrone.constants.Constants; +import tyrone.task.Deadline; +import tyrone.task.Event; +import tyrone.task.Task; +import tyrone.task.ToDo; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Scanner; + + +public class Storage { + public static void saveTasks() { + try { + // Check if ./data directory exists, if not, create it + File directory = new File("./data"); + if (!directory.exists()) { + directory.mkdir(); + } + + // Create or open Tasks.txt file + FileWriter writer = new FileWriter("./data/Tasks.txt"); + + // Write all tasks to the file + for (int i = 0; i < Constants.toDoList.size(); i++) { + Task task = Constants.toDoList.get(i); + String taskType = task instanceof Deadline ? "D" : (task instanceof Event ? "E" : "T"); + String statusIcon = task.getStatusIcon(); + String taskDescription = task.getDescription(); + + // Write task details based on its type + if (task instanceof Deadline) { + String doBy = ((Deadline) task).getDoBy(); + writer.write("| " + taskType + " | " + statusIcon + " | " + taskDescription + " | by: " + doBy + "\n"); + } else if (task instanceof Event) { + String timing = ((Event) task).getTiming(); + writer.write("| " + taskType + " | " + statusIcon + " | " + taskDescription + " | " + timing + "\n"); + } else { + writer.write("| " + taskType + " | " + statusIcon + " | " + taskDescription + "\n"); + } + } + + writer.close(); + } catch (IOException e) { + System.out.println(Constants.LINE); + System.out.println(" An error occurred while saving tasks."); + System.out.println(Constants.LINE); + } + } + + //loading task + public static ArrayList loadTasks() { + System.out.println("loading list"); + + ArrayList tasks = new ArrayList<>(); + + try { + // Open Tasks.txt file + File file = new File("data/Tasks.txt"); + Scanner scanner = new Scanner(file); + + // Read each line and parse the task details + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + String[] parts = line.split("\\|"); + + if (parts.length >= 4) { + String taskType = parts[1].trim(); // Task type, T (ToDo), D (Deadline), or E (Event) + boolean isDone = parts[2].trim().equals("X"); // Marked as done if 'X', otherwise not done + String description = parts[3].trim(); // Task description + + // Handle different task types + if (taskType.equals("T")) { + ToDo todo = new ToDo(description); + todo.setDone(isDone); + tasks.add(todo); + } else if (taskType.equals("D") && parts.length == 5) { + String by = parts[4].trim(); // Deadline date or time + Deadline deadline = new Deadline(description, by); // Deadline constructor expected to accept a String for date + deadline.setDone(isDone); + tasks.add(deadline); + } else if (taskType.equals("E") && parts.length == 5) { + String timing = parts[4].trim(); // Event timing + Event event = new Event(description, timing); // Event constructor expected to accept a String for timing + event.setDone(isDone); + tasks.add(event); + } + } + } + scanner.close(); // Close scanner after reading + } catch (FileNotFoundException e) { + System.out.println(" Tasks.txt file not found."); + } + return tasks; // Return the list of tasks + } +} diff --git a/src/main/java/tyrone/task/Deadline.class b/src/main/java/tyrone/task/Deadline.class deleted file mode 100644 index a6bc4c10a2af5261a84c05d795d264faf946725a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2153 zcmah~ZBrXn6n-uQHVMmHS}4#`7YmXXNNRnnq*hCSHZ{;{Qjj8+O>&zo+3bew4Q+h+ z;Gb~RZ#sU|8AS~=URrEn+ zIN$1EiR)R@usDM&YcEzAeC;0G7+~m*q^n*GVOW7r#W|d(NM62+!JV-!p&ORNaIrO( zSY9tD`Cf%v86FKhR4~dAK8}Mw&G3>iY|DvkP-eMiNGo=^sEg&M){7C0Nesp*7=K{h zjf)ID8il3FxF%Ix#w#RoN~R$gW?QdsLb27JoIE?F;#FKB98GTJM857nE)_E>Uc)S5 zLr@k8Ie(zDgMf-4LJW%GEEh|HV5A5s%Xx-idzPz)<4|Q%Mv=#@$97AGa~PA?URCir zt}%F=O4_McQIE5*5NHI)F&$n%%86vF3XZN{AIr6L~@`j_y z)?DyX*R8AAko+0Qak0dmOxdUtU8*)!Jd`R$s;KjP)a;+C*v4lJ7m9j;Qx!70*f2!C zr5@Kiu)0Hy+eJPw>`3=SD_6|UQo|1>sPES*#WXLc^t4Hmfeb+>c(VZ+`jbM>6jt?8 z-9W)(!lpwHF?df%>?kk@o_5x!>d)4R9i2(qm2!r!81m}==A~iDAgcDFZ42VQURvcM zZ)Y7hEQV2ux~6R{ZEtDY8q@sg>Vn1sZj=~iq-M>2qE+pRme;8wtX>F5Gb}0#*Ce^Z zgS{ww;Xo*;NI3Qxrca+S!`inC{P^W;6ktWq2)j%j{cS7s$A*pA?&wz5p5w$(e(xYKeC+Z$-G-C+#j`x@jg2!KsDSxMlHj%+wu+6aEzJOj}N!LRIhu!{z@r zrB|_$7p91{UBpr%ko=L*s+-pI^w6l&E+qd`H1`EVhhV|EKcW0qH&4?zP*=&9svln3 zG0FbpgOfBfvgrx_0p-_|BfWLuFg(bhmweM5Y=Z9YA&XyvzWy2pzenFQjBFm_!i%79 zqJ~R}Q1`VOv?0%rr<&07o*yt6a*<-X2LE?bGe>8_FUWYvQ$u96pLSU z9pLS8R}D8d4zTFj`5lV~Sn(xlSd(+IF-wC7a`@y3TR=ld_D6Ws+|`dr6uKZ$xC`0l zBb3r8hB1yYT*4Jh5_B59qf=PMG}bVK2ZYTI{4fx}9%-wX!`GO{Hwfb=MDR1NB1@k7 v;2QoL;|e(amUAR<5oURUdY9H+D8Qt7fL41XFV;sJPe|sa{Zo97FERcvX>=-< diff --git a/src/main/java/tyrone/task/Event.class b/src/main/java/tyrone/task/Event.class deleted file mode 100644 index 4a24c217ae226021c347e2b4292c915dd1306558..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2153 zcmah~TUQ%Z6#fo`OcI7$3PmW?sY1zxk`}90Qfo_qHZ9O<5TuChkQ~U6WKKGBLW}jy zKT&=3!ACEsuohjbefKxHT<$Xo5Spm-aIX7&XYcQPd(WSLAHD)Gjpre>pjCrUM;rVM z-E!9vHcv>?EhLtxVentKY)jr?=!?v6n>%KrXxdwejC3q}D;Zr5B7mTVkdAif3_bM# zvpd|DgdnXF88d_%0Rre`XiIE5q7*_mdNhP}oIx+S^5$g>fvm8lY1uBrxq4?(dDF@8 zClzjIc{2JifU^v(2`MzZ#SpJ~#Ghq(Sz5w&6Dt(smgn4@a7w0}J=zMPAA^dDa|95H zE(b8o&|!G)8Q&NLX(%t>)?wfR`R$gA76mv~@5~W1YmLFGv+wE{!6=bZL^7CE%)Qr~jwT=^o%iv9h7WaI!$%B*wfO0g ztL`M~91BP>Bjzoa*zT)hRisr++;SXqS1l()NaDJNk9FL@Ck$si^_;dLuFYKT4I$s( z*ydSDstHmi+|ns0QbcEwAXB2E)XUOA%wkT%Z5?-zJ}t~$SMn0!ipq&&mPkCHdqg^-jNW_f|jyvVr$Y*Rw3YBOap zLkemGC{kroEE>kz?E0FqPCF464ZyCkyC|L-yP{&`O=6c$5vi_W*+elnlu#zR{3wU; z1daw*@j_Y{IjLTjy(0>|RxzttH)m$0aCRA9)aP5xuCqC;qBByGVAC*JRM`-$!&I?wgFaO&;PBu=o;z)$vOQxH9G2 z!_@)bKBiXoaMSnrH{9IAO!)3T=2ib`wO0li)vO%iAy8c;`$Mc9&AcOuhZZOv?m|`f zK5EZm5CcT&5XLc#tMr?iqS-Y4a_(UiD~MnNQ4|n^OBT<`y>Bsr7o^!AaT!113LXA><~qoFW=5WkOm<2WDn z-VP7aL@P8lvOLqz70j@^=fQ>Npy^`{KIQsDS>$O?$JJqPmqB4}Kdq87JJwl|D+D`d zz`icCeDq8ZZ66)Xlbuyt>{n0&7Xi~d7mG}*B3kxw71tEJaaQTgVv=(hwXLueUWRt} z6s*l+pQz4GmZxtfN5iz-jfZ1aTBB6=b*v}Vb|OP9hTY2q%BV>WU&qIFn}gL0c1)*N zXcM+|enr|cP;e@i>s739Ak(-T$#`a5vtLZgBz=|1FrL`-SX{vxmo#_{CM>a&PnOui z?8)ZL4Jh8rb;cWfdqTD7JJENj=+P;h$UH^sD@zJ1i~#{4)FQw`6K!G@ZsOJq@RV8A zfD^Pn!VMNa!49r`Vaccg@;$KaHlqW>f8pQ`OKblKLK2A`oxqX4>4&F%0pB`UXOwBr zOIx4+lP*(q7x!k;_1R*LXyw8_@^gYPo5Q)dU)%8)%>&rxH!Pj4Kb=D210EW9_yrN9v6#j-{w_R5*1w>F`L2d=5Uhqco0!5@+iV2NG2{A)Ep$p4SvpdDqpFV}J zAwM9�T)9jAz;+1sdH==JL&%bNSAh^XvEVPXG&8HPM2QfmREb5N7C56<>NHp?I*H z$kD(Mo^w1$J!j~d$n5Zao^ZLhomf-8<83G7?+rxGUz3Z{go(=rEDKlAM(5`*GDL&& zR!~)xn(ZkSR_b)HKKygn6iPXu8A)?4~#t9T@tf?z2$4$)p zKCfsvX`&a`4D?y($90CTs#j-a7(%>II2Y{d){e-lWc*_kH!)yf(1MMjvtd;NCHCmH zET5WpWa1ssq=+oR_mUCZVi>pS`}F_M#3;rLj9Zw{iK+Q|Rw08?(&}9=f=Px!t+^s9 zV%koR?+csa5CvNmoxs-VoYj2Zwr~g23~k#&Es7xTJ0;~vkD+^_Nd{t6BX=#_!+nO{ zJ-#c5>^xWNjw&|LKGv)*nx(TBGZr4=5kqU>d=W&}L_8e>!xL?T%A_?V3k0`k98YA+ zdt1WK@hz7SGfxC6k)!<5W=)p;yjXJdNmOIgI+2u)1t}HP6fdm^Rg{Gwf|nGkrp2~5 za+@3Wrp+Q)U>Ma%R(`fCvTPSQk;SSU1-9c6W5RZ+T&CN@STykpO9ozR50@E6P7B%b z_T{dqKZF`FOFXZnUt##xNJ(9==F>9w3a$u7GE(lAOUa8gH6Uj$<|-x8M0}$`{-jJB zpt_0_cilBdi6n!S_B`RITpk1>Fz}YhxDZn_R}HK%4E$S^nnf)x3{kDMQ1yUDrdtb* zPiZ$ydyR)Dr;fnB(~4o1M%{*h2uViiPyUtviq`5$_6Lj)laWJ2kElEj&@pw0tLq22 z5gR_lh@RuMneeG&B!JqMBoFc67>`eYs{EAmEqI3KG`G Date: Sat, 28 Sep 2024 15:05:56 +0800 Subject: [PATCH 14/22] DateTime and priority list implemented --- src/main/java/tyrone/constants/Constants.java | 43 ++++++++++-------- src/main/java/tyrone/parser/Parser.java | 2 + src/main/java/tyrone/storage/Storage.java | 25 ++++++++--- src/main/java/tyrone/task/Deadline.java | 45 ++++++++++++++----- src/main/java/tyrone/task/Event.java | 2 +- src/main/java/tyrone/task/Task.java | 4 +- 6 files changed, 84 insertions(+), 37 deletions(-) diff --git a/src/main/java/tyrone/constants/Constants.java b/src/main/java/tyrone/constants/Constants.java index 5028fb86f..a98374110 100644 --- a/src/main/java/tyrone/constants/Constants.java +++ b/src/main/java/tyrone/constants/Constants.java @@ -1,5 +1,7 @@ package tyrone.constants; +import java.util.List; +import java.util.Comparator; import java.util.ArrayList; import tyrone.task.Deadline; import tyrone.task.Event; @@ -12,29 +14,11 @@ public class Constants { - - private Scanner scanner; - - public Constants() { - scanner = new Scanner(System.in); - } - - public String readCommand() { - return scanner.nextLine(); - } - public static final String LINE = " ___________________________________"; public static String logo = " _____ \n|_ _| _ _ __ ___ _ __ ___ \n | || | | | '__/ _ \\| '_ \\ / _ \\\n | || |_| | | | (_) | | | | __/\n |_| \\__, |_| \\___/|_| |_|\\___|\n |___/ "; public static ArrayList toDoList = new ArrayList<>(); - public static void intro() { - System.out.println(Constants.LINE); - System.out.println(" Hello from\n" + Constants.logo + "\n"); - System.out.println(" What can I do for you cuh?\n"); - System.out.println(Constants.LINE); - } - public static void intro(){ System.out.println(LINE); System.out.println(" Hello from\n" + Constants.logo + "\n"); @@ -111,4 +95,27 @@ public static void deleteTask(int index) { System.out.println(LINE); } } + + public static void getPriorityList(){ + List deadlineList = new ArrayList<>(); + + // Filter out deadlines from the to-do list + for (Task task : Constants.toDoList) { + if (task instanceof Deadline) { + deadlineList.add((Deadline) task); + } + } + + // Sort the deadlines by due date + deadlineList.sort(Comparator.comparing(Deadline::getDueDateTime)); + + // Print the sorted deadlines + System.out.println(Constants.LINE); + System.out.println(" Here are your deadlines in order of priority:"); + for (int i = 0; i < deadlineList.size(); i++) { + Deadline d = deadlineList.get(i); + System.out.println(" " + (i + 1) + ". [D][ ] " + d.getDescription() + " (by: " + d.getDoBy() + ")"); + } + System.out.println(Constants.LINE); + } } diff --git a/src/main/java/tyrone/parser/Parser.java b/src/main/java/tyrone/parser/Parser.java index 12a5a198d..527b2cf0c 100644 --- a/src/main/java/tyrone/parser/Parser.java +++ b/src/main/java/tyrone/parser/Parser.java @@ -59,6 +59,8 @@ else if (userInput.startsWith("event ")) { } } else if (userInput.equals("list")) { Constants.getList(); + } else if (userInput.equals("priority list")) { + Constants.getPriorityList(); } else { System.out.println(Constants.LINE); System.out.println(" Invalid command my brother."); diff --git a/src/main/java/tyrone/storage/Storage.java b/src/main/java/tyrone/storage/Storage.java index 4a0fed4ac..879665484 100644 --- a/src/main/java/tyrone/storage/Storage.java +++ b/src/main/java/tyrone/storage/Storage.java @@ -12,6 +12,9 @@ import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Scanner; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; public class Storage { @@ -55,8 +58,7 @@ public static void saveTasks() { //loading task public static ArrayList loadTasks() { - System.out.println("loading list"); - + ArrayList tasks = new ArrayList<>(); try { @@ -81,9 +83,22 @@ public static ArrayList loadTasks() { tasks.add(todo); } else if (taskType.equals("D") && parts.length == 5) { String by = parts[4].trim(); // Deadline date or time - Deadline deadline = new Deadline(description, by); // Deadline constructor expected to accept a String for date - deadline.setDone(isDone); - tasks.add(deadline); + if (by.startsWith("by:")) { + by = by.replace("by:", "").trim(); // Remove "by:" prefix + } + + try { + // Parse the deadline date and time + DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("dd MMM uuuu h:mma"); + LocalDateTime dueDateTime = LocalDateTime.parse(by, inputFormatter); // Convert to LocalDateTime + + // Create the Deadline object using LocalDateTime + Deadline deadline = new Deadline(description, dueDateTime); + deadline.setDone(isDone); + tasks.add(deadline); + } catch (DateTimeParseException e) { + System.out.println(" Invalid date format for deadline: " + by); + } } else if (taskType.equals("E") && parts.length == 5) { String timing = parts[4].trim(); // Event timing Event event = new Event(description, timing); // Event constructor expected to accept a String for timing diff --git a/src/main/java/tyrone/task/Deadline.java b/src/main/java/tyrone/task/Deadline.java index 6720bec4b..f0cc26d27 100644 --- a/src/main/java/tyrone/task/Deadline.java +++ b/src/main/java/tyrone/task/Deadline.java @@ -4,19 +4,28 @@ import tyrone.exceptions.MissingTimeInfoException; import tyrone.exceptions.TyroneException; import tyrone.exceptions.WrongDeadlineFormatException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; public class Deadline extends Task { protected String doBy; + protected LocalDateTime dueDateTime; - public Deadline(String description, String by) { + public Deadline(String description, LocalDateTime dueDateTime) { super(description); - this.doBy = by; + this.dueDateTime = dueDateTime; + this.doBy = dueDateTime.format(DateTimeFormatter.ofPattern("dd MMM uuuu h:mma")); } public String getDoBy() { return doBy; } + public LocalDateTime getDueDateTime() { + return dueDateTime; + } + public static void createDeadline(String userInput) throws TyroneException { if (!userInput.contains("/by")) { throw new WrongDeadlineFormatException(); @@ -34,17 +43,29 @@ public static void createDeadline(String userInput) throws TyroneException { } String description = parts[0].substring(9); // Extracting description after "deadline " - String by = parts[1].trim(); // Extracting the due date + String byString = parts[1].trim(); // Extracting the due date and time + System.out.println(byString); - Deadline deadlineTask = new Deadline(description, by); - Constants.toDoList.add(deadlineTask); - Task.listCount++; + try { + // Parse the due date and time into LocalDateTime + DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HHmm"); + LocalDateTime dueDateTime = LocalDateTime.parse(byString, inputFormatter); // Correctly parse the string + DateTimeFormatter dTF = DateTimeFormatter.ofPattern("dd MMM uuuu h:mma"); - System.out.println(Constants.LINE); - System.out.println(" Got it. I've added this task:"); - System.out.println(" [D][ ] " + deadlineTask.getDescription() + " (by: " + deadlineTask.getDoBy() + ")"); - System.out.println(" Now you have " + Task.listCount + " tasks in the list."); - System.out.println(Constants.LINE); - } + // Create and add the new deadline task + Deadline deadlineTask = new Deadline(description, dueDateTime); + Constants.toDoList.add(deadlineTask); + Task.listCount++; + // Print success message with formatted date using formatDoBy() + System.out.println(Constants.LINE); + System.out.println(" Got it. I've added this task:"); + System.out.println(" [D][ ] " + deadlineTask.getDescription() + " (by: " + deadlineTask.getDoBy() + ")"); + System.out.println(" Now you have " + Constants.toDoList.size() + " tasks in the list."); + System.out.println(Constants.LINE); + + } catch (DateTimeParseException e) { + throw new TyroneException("Invalid date format! Please use d/M/yyyy HHmm (e.g., 2/12/2019 1800)."); + } + } } diff --git a/src/main/java/tyrone/task/Event.java b/src/main/java/tyrone/task/Event.java index 4f7e4eeb3..cf8949294 100644 --- a/src/main/java/tyrone/task/Event.java +++ b/src/main/java/tyrone/task/Event.java @@ -44,7 +44,7 @@ public static void createEvent(String userInput) throws TyroneException { System.out.println(Constants.LINE); System.out.println(" Got it. I've added this task cuh:"); System.out.println(" [E][ ] " + eventTask.getDescription() + " (" + eventTask.getTiming() + ")"); - System.out.println(" Now you have " + Task.listCount + " tasks in the list."); + System.out.println(" Now you have " + Constants.toDoList.size() + " tasks in the list."); System.out.println(Constants.LINE); } diff --git a/src/main/java/tyrone/task/Task.java b/src/main/java/tyrone/task/Task.java index 7098634e1..633624dd1 100644 --- a/src/main/java/tyrone/task/Task.java +++ b/src/main/java/tyrone/task/Task.java @@ -1,9 +1,11 @@ package tyrone.task; +import tyrone.constants.Constants; + public class Task { protected String description; protected boolean isDone; - public static int listCount = 0; + public static int listCount = Constants.toDoList.size(); public Task(String description) { this.description = description; From 07475664c7c878670af858fa99f60dbba16fef67 Mon Sep 17 00:00:00 2001 From: Paul Date: Sat, 28 Sep 2024 15:16:33 +0800 Subject: [PATCH 15/22] find function --- src/main/java/tyrone/constants/Constants.java | 48 ++++++++++++++++--- src/main/java/tyrone/parser/Parser.java | 10 ++-- 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/src/main/java/tyrone/constants/Constants.java b/src/main/java/tyrone/constants/Constants.java index 5028fb86f..24e37fddc 100644 --- a/src/main/java/tyrone/constants/Constants.java +++ b/src/main/java/tyrone/constants/Constants.java @@ -35,13 +35,6 @@ public static void intro() { System.out.println(Constants.LINE); } - public static void intro(){ - System.out.println(LINE); - System.out.println(" Hello from\n" + Constants.logo + "\n"); - System.out.println(" What can I do for you cuh?\n"); - System.out.println(LINE); - } - public static void goodbye() { System.out.println(LINE); System.out.println(" see you brother"); @@ -111,4 +104,45 @@ public static void deleteTask(int index) { System.out.println(LINE); } } + + public static void findTasks(String userInput) { + // Extract the search string (substring after "find ") + String searchString = userInput.substring(5).trim().toLowerCase(); // Convert to lowercase for case-insensitive search + + // Check if the search string is empty + if (searchString.isEmpty()) { + System.out.println(" Please specify a keyword to search."); + return; + } + + // Create a list to store matching tasks + ArrayList matchingTasks = new ArrayList<>(); + + // Iterate over the to-do list and find matching tasks + for (Task task : Constants.toDoList) { + if (task.getDescription().toLowerCase().contains(searchString)) { // Case-insensitive match + matchingTasks.add(task); + } + } + + // Print the results in the same format as getList() + System.out.println(Constants.LINE); + if (matchingTasks.isEmpty()) { + System.out.println(" No matching tasks found for: " + searchString); + } else { + System.out.println(" Here are the matching tasks in your list:"); + for (int i = 0; i < matchingTasks.size(); i++) { + Task task = matchingTasks.get(i); + String statusIcon = task.getStatusIcon(); + if (task instanceof Deadline) { + System.out.println(" " + (i + 1) + ". [D][" + statusIcon + "] " + task.getDescription() + " (by: " + ((Deadline) task).getDoBy() + ")"); + } else if (task instanceof Event) { + System.out.println(" " + (i + 1) + ". [E][" + statusIcon + "] " + task.getDescription() + " (" + ((Event) task).getTiming() + ")"); + } else { + System.out.println(" " + (i + 1) + ". [T][" + statusIcon + "] " + task.getDescription()); + } + } + } + System.out.println(Constants.LINE); + } } diff --git a/src/main/java/tyrone/parser/Parser.java b/src/main/java/tyrone/parser/Parser.java index 12a5a198d..e8cb77e2d 100644 --- a/src/main/java/tyrone/parser/Parser.java +++ b/src/main/java/tyrone/parser/Parser.java @@ -32,7 +32,9 @@ public static void getUserInput(String userInput) throws TyroneException { } } else if (userInput.startsWith("todo ")) { ToDo.createToDo(userInput); - } else if (userInput.startsWith("deadline ")) { + } else if (userInput.startsWith("find ")){ + Constants.findTasks(userInput); + }else if (userInput.startsWith("deadline ")) { try{ Deadline.createDeadline(userInput); }catch (WrongDeadlineFormatException e){ @@ -42,12 +44,10 @@ public static void getUserInput(String userInput) throws TyroneException { } catch (MissingTimeInfoException e) { Constants.missingTimeInfo(); } - } - else if (userInput.startsWith("delete ")) { + } else if (userInput.startsWith("delete ")) { int index = Integer.parseInt(userInput.substring(7)) - 1; Constants.deleteTask(index); - } - else if (userInput.startsWith("event ")) { + } else if (userInput.startsWith("event ")) { try{ Event.createEvent(userInput); } catch (WrongEventFormatException e){ From 76026f0f941a6db9a3a5b9d8d3bb7da83a5c00bd Mon Sep 17 00:00:00 2001 From: Paul Date: Sat, 28 Sep 2024 18:05:10 +0800 Subject: [PATCH 16/22] JavaDoc comments with some refactoring --- src/main/java/Tyrone.java | 31 +++-- src/main/java/tyrone/constants/Constants.java | 120 ++++++++++++++---- src/main/java/tyrone/parser/Parser.java | 24 ++-- src/main/java/tyrone/storage/Storage.java | 42 ++++-- src/main/java/tyrone/task/Deadline.java | 6 +- src/main/java/tyrone/task/Event.java | 10 +- src/main/java/tyrone/task/Task.java | 4 + src/main/java/tyrone/task/ToDo.java | 4 + 8 files changed, 176 insertions(+), 65 deletions(-) diff --git a/src/main/java/Tyrone.java b/src/main/java/Tyrone.java index 01ec05ed5..e3398ea1d 100644 --- a/src/main/java/Tyrone.java +++ b/src/main/java/Tyrone.java @@ -6,19 +6,26 @@ import tyrone.parser.Parser; public class Tyrone { + + /** + * Main Logic for the entire Tyrone app + * @param args + */ public static void main(String[] args) { - Constants.toDoList = Storage.loadTasks(); - try (Scanner in = new Scanner(System.in)) { - // Constants acts as my ui package - Constants.intro(); - String input = in.nextLine(); - while (!input.equals("bye")) { - try { - Parser.getUserInput(input); - } catch (TyroneException e) { - // General exception handling for TyroneException - System.out.println("An error occurred: " + e.getMessage()); - } + + //Load data from the txt file + Constants.toDoList = Storage.loadTasks(); + + try (Scanner in = new Scanner(System.in)) { + Constants.intro(); + String input = in.nextLine(); + while (!input.equals("bye")) { + try { + Parser.getUserInput(input); + } catch (TyroneException e) { + // General exception handling for TyroneException + System.out.println("An error occurred: " + e.getMessage()); + } input = in.nextLine(); } } diff --git a/src/main/java/tyrone/constants/Constants.java b/src/main/java/tyrone/constants/Constants.java index 88dfe81ab..41fb0cfac 100644 --- a/src/main/java/tyrone/constants/Constants.java +++ b/src/main/java/tyrone/constants/Constants.java @@ -14,11 +14,33 @@ public class Constants { - public static final String LINE = " ___________________________________"; - public static String logo = " _____ \n|_ _| _ _ __ ___ _ __ ___ \n | || | | | '__/ _ \\| '_ \\ / _ \\\n | || |_| | | | (_) | | | | __/\n |_| \\__, |_| \\___/|_| |_|\\___|\n |___/ "; public static ArrayList toDoList = new ArrayList<>(); + /** + * Bunch of static function that just prints out Strings to make code easier to read. + */ + + public static void help(){ + System.out.println(""" + Available commands: + \t- bye: Exit the application. + \t- todo [description]: Add a new todo task. + \t- deadline [description] /by [DD/MM/YYYY 2400]: Add a new task with a deadline. + \t- event [description] /from [start] /to [end]: Add a new event. + \t- mark [task number]: Mark a task as completed. + \t- unmark [task number]: Unmark a completed task. + \t- delete [task number]: Delete a task. + \t- clear: Clear all tasks in the list. + \t- list: List all tasks. + \t- priority list: Show all the deadlines due, with the earliest deadline at the top. + \t- find [keyword]: Find a task by keyword. + \t- help: Show this help message.""" + ); + } + + public static final String LINE = " ___________________________________"; + public static String logo = " _____ \n|_ _| _ _ __ ___ _ __ ___ \n | || | | | '__/ _ \\| '_ \\ / _ \\\n | || |_| | | | (_) | | | | __/\n |_| \\__, |_| \\___/|_| |_|\\___|\n |___/ "; public static void intro(){ System.out.println(LINE); @@ -33,6 +55,24 @@ public static void goodbye() { System.out.println(LINE); } + public static void invalidTask(){ + System.out.println(LINE); + System.out.println(" Invalid task number bro."); + System.out.println(LINE); + } + + public static void invalidCommand(){ + System.out.println(LINE); + System.out.println(" Invalid command my brother."); + System.out.println(LINE); + } + + public static void missingTimeInfo() { + System.out.println(LINE); + System.out.println(" YOURE Missing time info BRUTHA"); + System.out.println(LINE); + } + public static void markAsDone(int index) { toDoList.get(index).setDone(true); System.out.println(LINE); @@ -49,13 +89,18 @@ public static void unmarkAsUndone(int index) { System.out.println(LINE); } - public static void getList() { + + /** + * Higher level functions with greater complexity. + */ + + public static void getList(ArrayList tasksList) { System.out.println(LINE); - if (toDoList.isEmpty()) { + if (tasksList.isEmpty()) { System.out.println(" Your task list is empty, brother."); } else { - for (int i = 0; i < toDoList.size(); i++) { - Task task = toDoList.get(i); + for (int i = 0; i < tasksList.size(); i++) { + Task task = tasksList.get(i); String statusIcon = task.getStatusIcon(); if (task instanceof Deadline) { System.out.println(" " + (i + 1) + ". [D][" + statusIcon + "] " + task.getDescription() + " (by: " + ((Deadline) task).getDoBy() + ")"); @@ -68,12 +113,6 @@ public static void getList() { } System.out.println(LINE); } - - public static void missingTimeInfo() { - System.out.println(LINE); - System.out.println(" YOURE Missing time info BRUTHA"); - System.out.println(LINE); - } public static void deleteTask(int index) { if (index >= 0 && index < toDoList.size()) { @@ -117,25 +156,15 @@ public static void findTasks(String userInput) { } } - // Print the results in the same format as getList() - System.out.println(Constants.LINE); + // Print the results using getList() + System.out.println(LINE); if (matchingTasks.isEmpty()) { System.out.println(" No matching tasks found for: " + searchString); } else { System.out.println(" Here are the matching tasks in your list:"); - for (int i = 0; i < matchingTasks.size(); i++) { - Task task = matchingTasks.get(i); - String statusIcon = task.getStatusIcon(); - if (task instanceof Deadline) { - System.out.println(" " + (i + 1) + ". [D][" + statusIcon + "] " + task.getDescription() + " (by: " + ((Deadline) task).getDoBy() + ")"); - } else if (task instanceof Event) { - System.out.println(" " + (i + 1) + ". [E][" + statusIcon + "] " + task.getDescription() + " (" + ((Event) task).getTiming() + ")"); - } else { - System.out.println(" " + (i + 1) + ". [T][" + statusIcon + "] " + task.getDescription()); - } - } + Constants.getList(matchingTasks); } - System.out.println(Constants.LINE); + System.out.println(LINE); } public static void getPriorityList(){ @@ -152,13 +181,48 @@ public static void getPriorityList(){ deadlineList.sort(Comparator.comparing(Deadline::getDueDateTime)); // Print the sorted deadlines - System.out.println(Constants.LINE); + System.out.println(LINE); System.out.println(" Here are your deadlines in order of priority:"); for (int i = 0; i < deadlineList.size(); i++) { Deadline d = deadlineList.get(i); System.out.println(" " + (i + 1) + ". [D][ ] " + d.getDescription() + " (by: " + d.getDoBy() + ")"); } - System.out.println(Constants.LINE); + System.out.println(LINE); } + public static void clearTasks() { + // Prompt the user for confirmation + System.out.println(" Are you sure you want to clear all tasks? (y/n)"); + + Scanner scanner = new Scanner(System.in); + String response = scanner.nextLine().trim().toLowerCase(); + + if (response.equals("y")) { + // Clear the task list in memory + Constants.toDoList.clear(); + Task.listCount = 0; + + // Clear the tasks in the text file by overwriting it with an empty file + try { + FileWriter writer = new FileWriter("data/Tasks.txt", false); // Overwrite mode + writer.write(""); // Clear the content of the file + writer.close(); + System.out.println(Constants.LINE); + System.out.println(" All tasks have been cleared."); + System.out.println(Constants.LINE); + } catch (IOException e) { + System.out.println(" An error occurred while clearing the tasks."); + } + } else if (response.equals("n")) { + // User chose not to clear the tasks + System.out.println(Constants.LINE); + System.out.println(" Task clearing canceled."); + System.out.println(Constants.LINE); + } else { + // Handle invalid input + System.out.println(Constants.LINE); + System.out.println(" Invalid input. Please reply with 'y' for yes or 'n' for no."); + System.out.println(Constants.LINE); + } + } } diff --git a/src/main/java/tyrone/parser/Parser.java b/src/main/java/tyrone/parser/Parser.java index bf39cad98..cffcd3da3 100644 --- a/src/main/java/tyrone/parser/Parser.java +++ b/src/main/java/tyrone/parser/Parser.java @@ -11,24 +11,26 @@ import tyrone.task.ToDo; public class Parser { + /** + * Main Logic for the Tyrone ChatBot + * Each command has its own if else block + * @param userInput + * @throws TyroneException + */ public static void getUserInput(String userInput) throws TyroneException { if (userInput.startsWith("mark ")) { int index = Integer.parseInt(userInput.substring(5)) - 1; if (index >= 0 && index < Constants.toDoList.size()) { Constants.markAsDone(index); } else { - System.out.println(Constants.LINE); - System.out.println(" Invalid task number bro."); - System.out.println(Constants.LINE); + Constants.invalidTask(); } } else if (userInput.startsWith("unmark ")) { int index = Integer.parseInt(userInput.substring(7)) - 1; if (index >= 0 && index < Constants.toDoList.size()) { Constants.unmarkAsUndone(index); } else { - System.out.println(Constants.LINE); - System.out.println(" Invalid task number bro."); - System.out.println(Constants.LINE); + Constants.invalidTask(); } } else if (userInput.startsWith("todo ")) { ToDo.createToDo(userInput); @@ -58,13 +60,15 @@ public static void getUserInput(String userInput) throws TyroneException { Constants.missingTimeInfo(); } } else if (userInput.equals("list")) { - Constants.getList(); + Constants.getList(Constants.toDoList); } else if (userInput.equals("priority list")) { Constants.getPriorityList(); + } else if (userInput.startsWith("help")){ + Constants.help(); + } else if (userInput.equals("clear")){ + Constants.clearTasks(); } else { - System.out.println(Constants.LINE); - System.out.println(" Invalid command my brother."); - System.out.println(Constants.LINE); + Constants.invalidCommand(); } Storage.saveTasks();// Call save function } diff --git a/src/main/java/tyrone/storage/Storage.java b/src/main/java/tyrone/storage/Storage.java index 879665484..9117366d8 100644 --- a/src/main/java/tyrone/storage/Storage.java +++ b/src/main/java/tyrone/storage/Storage.java @@ -16,8 +16,16 @@ import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; +/** + * Storage has two main functions, + * storing Tasks in the .txt file and + * reading the Tasks in the .txt file when it is first booted up + */ public class Storage { + /** + * Every task is saved after every action taken in Parser + */ public static void saveTasks() { try { // Check if ./data directory exists, if not, create it @@ -56,7 +64,9 @@ public static void saveTasks() { } } - //loading task + /** + * This function reads the tasks in data/Task.txt and then inputs them into the ArrayList of Tasks + */ public static ArrayList loadTasks() { ArrayList tasks = new ArrayList<>(); @@ -72,25 +82,33 @@ public static ArrayList loadTasks() { String[] parts = line.split("\\|"); if (parts.length >= 4) { - String taskType = parts[1].trim(); // Task type, T (ToDo), D (Deadline), or E (Event) - boolean isDone = parts[2].trim().equals("X"); // Marked as done if 'X', otherwise not done - String description = parts[3].trim(); // Task description + // Task type, T (ToDo), D (Deadline), or E (Event) + String taskType = parts[1].trim(); + + // Marked as done if 'X', otherwise not done + boolean isDone = parts[2].trim().equals("X"); + + // Task description + String description = parts[3].trim(); // Handle different task types if (taskType.equals("T")) { ToDo todo = new ToDo(description); todo.setDone(isDone); + + // Create new Todo Task tasks.add(todo); } else if (taskType.equals("D") && parts.length == 5) { - String by = parts[4].trim(); // Deadline date or time + String by = parts[4].trim(); + // Remove "by:" prefix if (by.startsWith("by:")) { - by = by.replace("by:", "").trim(); // Remove "by:" prefix + by = by.replace("by:", "").trim(); } try { // Parse the deadline date and time DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("dd MMM uuuu h:mma"); - LocalDateTime dueDateTime = LocalDateTime.parse(by, inputFormatter); // Convert to LocalDateTime + LocalDateTime dueDateTime = LocalDateTime.parse(by, inputFormatter); // Create the Deadline object using LocalDateTime Deadline deadline = new Deadline(description, dueDateTime); @@ -100,17 +118,19 @@ public static ArrayList loadTasks() { System.out.println(" Invalid date format for deadline: " + by); } } else if (taskType.equals("E") && parts.length == 5) { - String timing = parts[4].trim(); // Event timing - Event event = new Event(description, timing); // Event constructor expected to accept a String for timing + String timing = parts[4].trim(); + + // Create new Event Task + Event event = new Event(description, timing); event.setDone(isDone); tasks.add(event); } } } - scanner.close(); // Close scanner after reading + scanner.close(); } catch (FileNotFoundException e) { System.out.println(" Tasks.txt file not found."); } - return tasks; // Return the list of tasks + return tasks; } } diff --git a/src/main/java/tyrone/task/Deadline.java b/src/main/java/tyrone/task/Deadline.java index f0cc26d27..1c90aa73d 100644 --- a/src/main/java/tyrone/task/Deadline.java +++ b/src/main/java/tyrone/task/Deadline.java @@ -8,6 +8,10 @@ import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; +/** + * Deadline specific functions. + */ + public class Deadline extends Task { protected String doBy; protected LocalDateTime dueDateTime; @@ -49,7 +53,7 @@ public static void createDeadline(String userInput) throws TyroneException { try { // Parse the due date and time into LocalDateTime DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HHmm"); - LocalDateTime dueDateTime = LocalDateTime.parse(byString, inputFormatter); // Correctly parse the string + LocalDateTime dueDateTime = LocalDateTime.parse(byString, inputFormatter); DateTimeFormatter dTF = DateTimeFormatter.ofPattern("dd MMM uuuu h:mma"); // Create and add the new deadline task diff --git a/src/main/java/tyrone/task/Event.java b/src/main/java/tyrone/task/Event.java index cf8949294..828cb8160 100644 --- a/src/main/java/tyrone/task/Event.java +++ b/src/main/java/tyrone/task/Event.java @@ -5,6 +5,10 @@ import tyrone.exceptions.TyroneException; import tyrone.exceptions.WrongEventFormatException; +/** + * Event specific functions. + */ + public class Event extends Task { protected String timing; @@ -25,15 +29,15 @@ public static void createEvent(String userInput) throws TyroneException { String[] parts = userInput.split(" /from | /to "); // Check if the description part exists and is long enough - if (parts[0].length() < 6) { // "event " is 6 characters long + if (parts[0].length() < 6) { throw new WrongEventFormatException(); } if (parts.length < 3) { throw new MissingTimeInfoException(); } - - String description = parts[0].substring(6); // Extracting description after "event " + // Extracting description after "event " + String description = parts[0].substring(6); String timing = "from: " + parts[1] + " to: " + parts[2]; // Properly add the new Event task diff --git a/src/main/java/tyrone/task/Task.java b/src/main/java/tyrone/task/Task.java index 633624dd1..ea35e0302 100644 --- a/src/main/java/tyrone/task/Task.java +++ b/src/main/java/tyrone/task/Task.java @@ -2,6 +2,10 @@ import tyrone.constants.Constants; +/** + * Base Class for the command class + */ + public class Task { protected String description; protected boolean isDone; diff --git a/src/main/java/tyrone/task/ToDo.java b/src/main/java/tyrone/task/ToDo.java index bd9b2b501..8bc383ec9 100644 --- a/src/main/java/tyrone/task/ToDo.java +++ b/src/main/java/tyrone/task/ToDo.java @@ -2,6 +2,10 @@ import tyrone.constants.Constants; +/** + * Todo specific functions. + */ + public class ToDo extends Task { public ToDo(String description) { From fa210bcb2bbd7ce5dfd340026204103cb48016fe Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 30 Sep 2024 11:40:23 +0800 Subject: [PATCH 17/22] A-UserGuide --- .gitignore | 5 +- docs/README.md | 300 ++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 287 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index 5a7c81afa..7b70edd51 100644 --- a/.gitignore +++ b/.gitignore @@ -16,10 +16,7 @@ bin/ /text-ui-test/ACTUAL.TXT text-ui-test/EXPECTED-UNIX.TXT -src/main/java/Tyrone.class -src/main/java/*class -src/main/java/tyrone/task/*class -src/main/java/tyrone/constants/*class *.class src/main/java/data/Tasks.txt +*.jar diff --git a/docs/README.md b/docs/README.md index 47b9f984f..41006e3ee 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,30 +1,302 @@ -# Duke User Guide +# Tyrone User Guide -// Update the title above to match the actual product name +## 👋 Welcome to Tyrone! 👋 -// Product screenshot goes here +Tyrone is your dependable Java CLI companion for managing tasks like a pro. -// Product intro goes here +With Tyrone, you can easily create, update, and manage your tasks using simple text commands. -## Adding deadlines +Whether you need to: -// Describe the action and its outcome. +- ➕ Add new tasks +- ✅ Mark tasks as completed +- ❌ Delete tasks +- 🔍 Search for tasks +- 📋 List all your current tasks -// Give examples of usage +Tyrone's got your back. Let's jump in and see how Tyrone can simplify your daily tasks! -Example: `keyword (optional arguments)` +## Quick Start -// A description of the expected outcome goes here +❗ Below are the **prerequisites**: + +1. Ensure you have Java 17 installed on your machine. +2. Download the latest `.jar` file from [here](https://github.com/paulktham/ip/releases). +3. Copy the file to the folder you want to use as the home folder for your chatbot. +4. Open a command terminal, `cd` into the directory where the `.jar` file is located. +5. Run the following command: `java -jar tyrone.jar` + +On launch, you should see this interface: + +``` +___________________________________ +Hello from + _____ +|_ _| _ _ __ ___ _ __ ___ + | || | | | '__/ _ \| '_ \ / _ \ + | || |_| | | | (_) | | | | __/ + |_| \__, |_| \___/|_| |_|\___| + |___/ + +What can I do for you cuh? + +___________________________________ + +``` + +## Features + +Tyrone supports 3 types of tasks: `Todo`, `Deadline`, and `Event`. + +- `Todo`: Task to be completed without specific timing constraints. +- `Deadline`: Task to be completed by a specified deadline. +- `Event`: Task with a defined start and end time. + +Here are some example commands: + +- `todo grocery shopping` +- `deadline CS3244 tutorial /by 26/09/2024 2359` +- `event Swimming /from Thursday Morning /to Thursday Afternoon` +- `delete 1` +- `mark 1` +- `unmark 1` +- `find swim` +- `list` +- `priority list` +- `help` +- `bye` + +Any unrecognized command will result in the following response: + +``` +___________________________________ +Invalid command my brother. +___________________________________ + +``` + +## Adding Todo Task + +Adds a `Todo` task to the task list. + +Format: `todo ` + +Examples: + +- `todo grocery shopping` + +Expected Outcome: + +``` + ___________________________________ + yeye. I've added this task: + [T][ ] grocery shopping + Now you have 1 tasks in the list. + ___________________________________ +``` + +## Adding Deadline Task + +Adds a `Deadline` task to the task list. + +Format: `deadline /by
` + +Examples: + +- `deadline CS3244 tutorial /by 26/09/2024 2359` + +Expected Outcome: + +``` + ___________________________________ + Got it. I've added this task: + [D][ ] CS3244 tutorial (by: 26 Sept 2024 11:59pm) + Now you have 2 tasks in the list. + ___________________________________ +``` + +## Adding Event Task + +Adds an `Event` task to the task list. + +Format: `event /from /to ` + +Examples: + +- `event Swimming /from Thursday Morning /to Thursday Afternoon` + +Expected Outcome: + +``` + ___________________________________ + Got it. I've added this task cuh: + [E][ ] Swimming (from: Thursday Morning to: Thursday Afternoon) + Now you have 3 tasks in the list. + ___________________________________ +``` + +## Delete Task + +Delete a task from the task list. + +Format: `delete ` + +Examples: + +- `delete 1` + +Expected Outcome: + +``` + ___________________________________ + Noted. I've removed this task: + [T][ ] grocery shopping + Now you have 2 tasks in the list. + ___________________________________ +``` + +## Mark Task + +Mark a task as completed. + +Format: `mark ` + +Examples: + +- `mark 1` + +Expected Outcome: + +``` + ___________________________________ + TIGHT! I've marked this task as done: + [X] CS3244 tutorial + ___________________________________ +``` + +## Unmark Task + +Unmark a task as uncompleted. + +Format: `unmark ` + +Examples: + +- `unmark 1` + +Expected Outcome: ``` -expected output + ___________________________________ + alright cuh, I've marked this task as unfinished: + [ ] CS3244 tutorial + ___________________________________ ``` -## Feature ABC +## Find Task With Keyword -// Feature details +Find and print out all the tasks related to the keyword. + +Format: `find ` + +Examples: + +- `find swim` + +Expected Outcome: + +``` + ___________________________________ + Here are the matching tasks in your list: + ___________________________________ + 1. [E][ ] Swimming (from: Thursday Morning to: Thursday Afternoon) + ___________________________________ +``` + +## List Task + +Lists all the tasks in the task list. + +Format: `list` + +Expected Outcome: + +``` + ___________________________________ + 1. [D][ ] CS3244 tutorial (by: 26 Sept 2024 11:59pm) + 2. [E][ ] Swimming (from: Thursday Morning to: Thursday Afternoon) + ___________________________________ +``` +## Priority List + +Lists all the deadlines, ordered by their due date. + +Format: `priority list` + +Expected Outcome: + +``` + ___________________________________ + Here are your deadlines in order of priority: + 1. [D][ ] CS3244 tutorial (by: 26 Sept 2024 11:59pm) + ___________________________________ +``` + +## Clearing All Tasks + +Clears all tasks from the list after confirmation. + +Format: `clear` + +Expected Outcome: + +``` + Are you sure you want to clear all tasks? (y/n) +y + ___________________________________ + All tasks have been cleared. + ___________________________________ +``` + +## Viewing help + +Lists out all the available commands and their command format. + +Format: `help` + +Expected Outcome: + +``` +Available commands: + - bye: Exit the application. + - todo [description]: Add a new todo task. + - deadline [description] /by [DD/MM/YYYY 2400]: Add a new task with a deadline. + - event [description] /from [start] /to [end]: Add a new event. + - mark [task number]: Mark a task as completed. + - unmark [task number]: Unmark a completed task. + - delete [task number]: Delete a task. + - clear: Clear all tasks in the list. + - list: List all tasks. + - priority list: Show all the deadlines due, with the earliest deadline at the top. + - find [keyword]: Find a task by keyword. + - help: Show this help message. +``` + +## Exit Program + +Exits the program. + +Format: `bye` + +Expected Outcome: + +``` + ___________________________________ + see you brother + ___________________________________ +``` -## Feature XYZ +## Saving the data -// Feature details \ No newline at end of file +Tyrone's data is saved in an external `.txt` file automatically after the `bye` command is executed. There is no need to save manually. From 67fe400a91e2726327ad87644894984bdf38454b Mon Sep 17 00:00:00 2001 From: paulktham <134585908+paulktham@users.noreply.github.com> Date: Thu, 3 Oct 2024 11:54:42 +0800 Subject: [PATCH 18/22] Update Task.java --- src/main/java/tyrone/task/Task.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/tyrone/task/Task.java b/src/main/java/tyrone/task/Task.java index ea35e0302..a8744e3f7 100644 --- a/src/main/java/tyrone/task/Task.java +++ b/src/main/java/tyrone/task/Task.java @@ -3,7 +3,7 @@ import tyrone.constants.Constants; /** - * Base Class for the command class + * Base Class for the different types of Tasks */ public class Task { From cfecd69c052b1bbe74b7dccd6facbc422d720ac8 Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 3 Oct 2024 11:55:00 +0800 Subject: [PATCH 19/22] JavaDoc Improvements --- .gitignore | 1 + src/main/java/Tyrone.java | 9 +++++++++ .../java/tyrone/exceptions/MissingTimeInfoException.java | 1 + src/main/java/tyrone/exceptions/TyroneException.java | 5 +++++ .../tyrone/exceptions/WrongDeadlineFormatException.java | 1 + .../tyrone/exceptions/WrongEventFormatException.java | 1 + src/main/java/tyrone/parser/Parser.java | 8 ++++++++ 7 files changed, 26 insertions(+) diff --git a/.gitignore b/.gitignore index 5a7c81afa..43d639706 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,4 @@ src/main/java/tyrone/constants/*class *.class src/main/java/data/Tasks.txt +ip.jar diff --git a/src/main/java/Tyrone.java b/src/main/java/Tyrone.java index 01ec05ed5..b94cc6299 100644 --- a/src/main/java/Tyrone.java +++ b/src/main/java/Tyrone.java @@ -5,6 +5,15 @@ import tyrone.storage.Storage; import tyrone.parser.Parser; + /** + * Main Logic for the entire Tyrone app + * The process of the main logic goes as follows, + * The system loads the data saved in data/Tasks.txt + * Then it starts to accept inputs in the command line to be passed to the Parser package + * Only when it reads a "bye" does it leave the main loop and quit the Java CLI Application + * @param args + */ + public class Tyrone { public static void main(String[] args) { Constants.toDoList = Storage.loadTasks(); diff --git a/src/main/java/tyrone/exceptions/MissingTimeInfoException.java b/src/main/java/tyrone/exceptions/MissingTimeInfoException.java index 23042707a..fedf39caf 100644 --- a/src/main/java/tyrone/exceptions/MissingTimeInfoException.java +++ b/src/main/java/tyrone/exceptions/MissingTimeInfoException.java @@ -1,4 +1,5 @@ package tyrone.exceptions; + public class MissingTimeInfoException extends TyroneException { public MissingTimeInfoException() { super("Missing time information for event."); diff --git a/src/main/java/tyrone/exceptions/TyroneException.java b/src/main/java/tyrone/exceptions/TyroneException.java index 3a85f17fe..bb7777ff2 100644 --- a/src/main/java/tyrone/exceptions/TyroneException.java +++ b/src/main/java/tyrone/exceptions/TyroneException.java @@ -1,4 +1,9 @@ package tyrone.exceptions; + +/** + * Main class for the Exceptions used in the application + */ + public class TyroneException extends Exception { public TyroneException(String message) { super(message); diff --git a/src/main/java/tyrone/exceptions/WrongDeadlineFormatException.java b/src/main/java/tyrone/exceptions/WrongDeadlineFormatException.java index 47538dc07..b49e22040 100644 --- a/src/main/java/tyrone/exceptions/WrongDeadlineFormatException.java +++ b/src/main/java/tyrone/exceptions/WrongDeadlineFormatException.java @@ -1,4 +1,5 @@ package tyrone.exceptions; + public class WrongDeadlineFormatException extends TyroneException{ public WrongDeadlineFormatException(){ super("WrongDeadlineFormat"); diff --git a/src/main/java/tyrone/exceptions/WrongEventFormatException.java b/src/main/java/tyrone/exceptions/WrongEventFormatException.java index fea5ef676..924d85768 100644 --- a/src/main/java/tyrone/exceptions/WrongEventFormatException.java +++ b/src/main/java/tyrone/exceptions/WrongEventFormatException.java @@ -1,4 +1,5 @@ package tyrone.exceptions; + public class WrongEventFormatException extends TyroneException { public WrongEventFormatException() { super("WrongEventFormat"); diff --git a/src/main/java/tyrone/parser/Parser.java b/src/main/java/tyrone/parser/Parser.java index 527b2cf0c..d82293b31 100644 --- a/src/main/java/tyrone/parser/Parser.java +++ b/src/main/java/tyrone/parser/Parser.java @@ -10,6 +10,14 @@ import tyrone.task.Event; import tyrone.task.ToDo; + /** + * Main Logic for the Tyrone ChatBot + * Each command has its own if else block which calls the appriopriate function in the right packages + * After each input, the ChatBot runs a save function to save the data into data/Tasks.txt + * @param userInput + * @throws TyroneException + */ + public class Parser { public static void getUserInput(String userInput) throws TyroneException { if (userInput.startsWith("mark ")) { From 412bec2179d58cb860ef365890a9291eb85e5f16 Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 3 Oct 2024 12:02:27 +0800 Subject: [PATCH 20/22] Indentations and minor comment fixes --- src/main/java/Tyrone.java | 31 +++++++++++-------------- src/main/java/tyrone/parser/Parser.java | 7 +----- src/main/java/tyrone/task/Deadline.java | 1 - 3 files changed, 14 insertions(+), 25 deletions(-) diff --git a/src/main/java/Tyrone.java b/src/main/java/Tyrone.java index f664fd987..4a4675b6b 100644 --- a/src/main/java/Tyrone.java +++ b/src/main/java/Tyrone.java @@ -15,26 +15,21 @@ */ public class Tyrone { + public static void main(String[] args) { - /** - * Main Logic for the entire Tyrone app - * @param args - */ - public static void main(String[] args) { - - //Load data from the txt file - Constants.toDoList = Storage.loadTasks(); + //Load data from the txt file + Constants.toDoList = Storage.loadTasks(); - try (Scanner in = new Scanner(System.in)) { - Constants.intro(); - String input = in.nextLine(); - while (!input.equals("bye")) { - try { - Parser.getUserInput(input); - } catch (TyroneException e) { - // General exception handling for TyroneException - System.out.println("An error occurred: " + e.getMessage()); - } + try (Scanner in = new Scanner(System.in)) { + Constants.intro(); + String input = in.nextLine(); + while (!input.equals("bye")) { + try { + Parser.getUserInput(input); + } catch (TyroneException e) { + // General exception handling for TyroneException + System.out.println("An error occurred: " + e.getMessage()); + } input = in.nextLine(); } } diff --git a/src/main/java/tyrone/parser/Parser.java b/src/main/java/tyrone/parser/Parser.java index d37958b77..773949a5f 100644 --- a/src/main/java/tyrone/parser/Parser.java +++ b/src/main/java/tyrone/parser/Parser.java @@ -19,12 +19,7 @@ */ public class Parser { - /** - * Main Logic for the Tyrone ChatBot - * Each command has its own if else block - * @param userInput - * @throws TyroneException - */ + public static void getUserInput(String userInput) throws TyroneException { if (userInput.startsWith("mark ")) { int index = Integer.parseInt(userInput.substring(5)) - 1; diff --git a/src/main/java/tyrone/task/Deadline.java b/src/main/java/tyrone/task/Deadline.java index 1c90aa73d..3c09b429b 100644 --- a/src/main/java/tyrone/task/Deadline.java +++ b/src/main/java/tyrone/task/Deadline.java @@ -54,7 +54,6 @@ public static void createDeadline(String userInput) throws TyroneException { // Parse the due date and time into LocalDateTime DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HHmm"); LocalDateTime dueDateTime = LocalDateTime.parse(byString, inputFormatter); - DateTimeFormatter dTF = DateTimeFormatter.ofPattern("dd MMM uuuu h:mma"); // Create and add the new deadline task Deadline deadlineTask = new Deadline(description, dueDateTime); From 18805a3df64c491472eb9ec475ef3067428f8bc1 Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 11 Oct 2024 19:14:57 +0800 Subject: [PATCH 21/22] checkstyle --- config/checkstyle.xml | 287 ++++++++++++++++++++++++++++++++++++++ config/supressions.xml | 10 ++ text-ui-test/EXPECTED.TXT | 57 +++++++- text-ui-test/input.txt | 10 +- 4 files changed, 357 insertions(+), 7 deletions(-) create mode 100644 config/checkstyle.xml create mode 100644 config/supressions.xml diff --git a/config/checkstyle.xml b/config/checkstyle.xml new file mode 100644 index 000000000..0ebdd3105 --- /dev/null +++ b/config/checkstyle.xml @@ -0,0 +1,287 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/config/supressions.xml b/config/supressions.xml new file mode 100644 index 000000000..7fa38b37c --- /dev/null +++ b/config/supressions.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 657e74f6e..68d583524 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,7 +1,52 @@ -Hello from - ____ _ -| _ \ _ _| | _____ -| | | | | | | |/ / _ \ -| |_| | |_| | < __/ -|____/ \__,_|_|\_\___| + ___________________________________ + Hello from + _____ +|_ _| _ _ __ ___ _ __ ___ + | || | | | '__/ _ \| '_ \ / _ \ + | || |_| | | | (_) | | | | __/ + |_| \__, |_| \___/|_| |_|\___| + |___/ + What can I do for you cuh? + + ___________________________________ + ___________________________________ + yeye. I've added this task: + [T][ ] grocery shopping + Now you have 1 tasks in the list. + ___________________________________ + ___________________________________ + Got it. I've added this task: + [D][ ] CS3244 tutorial (by: 26 Sept 2024 11:59pm) + Now you have 2 tasks in the list. + ___________________________________ + ___________________________________ + Got it. I've added this task cuh: + [E][ ] Swimming (from: Thursday Morning to: Thursday Afternoon) + Now you have 3 tasks in the list. + ___________________________________ + ___________________________________ + 1. [T][ ] grocery shopping + 2. [D][ ] CS3244 tutorial (by: 26 Sept 2024 11:59pm) + 3. [E][ ] Swimming (from: Thursday Morning to: Thursday Afternoon) + ___________________________________ + ___________________________________ + TIGHT! I've marked this task as done: + [X] grocery shopping + ___________________________________ + ___________________________________ + alright cuh, I've marked this task as unfinished: + [ ] grocery shopping + ___________________________________ + ___________________________________ + Noted. I've removed this task: + [T][ ] grocery shopping + Now you have 2 tasks in the list. + ___________________________________ + ___________________________________ + Here are your deadlines in order of priority: + 1. [D][ ] CS3244 tutorial (by: 26 Sept 2024 11:59pm) + ___________________________________ + ___________________________________ + see you brother + ___________________________________ diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 7e568f5e3..aadffed25 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1 +1,9 @@ -waddup dog \ No newline at end of file +todo grocery shopping +deadline CS3244 tutorial /by 26/09/2024 2359 +event Swimming /from Thursday Morning /to Thursday Afternoon +list +mark 1 +unmark 1 +delete 1 +priority list +bye \ No newline at end of file From fd61f4837e8155c46bd520ce77dd9dbfa0d909e3 Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 11 Oct 2024 19:25:26 +0800 Subject: [PATCH 22/22] small error message change. --- src/main/java/tyrone/storage/Storage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/tyrone/storage/Storage.java b/src/main/java/tyrone/storage/Storage.java index 9117366d8..7c5cc5af4 100644 --- a/src/main/java/tyrone/storage/Storage.java +++ b/src/main/java/tyrone/storage/Storage.java @@ -129,7 +129,7 @@ public static ArrayList loadTasks() { } scanner.close(); } catch (FileNotFoundException e) { - System.out.println(" Tasks.txt file not found."); + System.out.println(" Tasks.txt does not exist, will create one cuh."); } return tasks; }