From d8398594b7bc43da5eb865321c5a50cec4b3923d Mon Sep 17 00:00:00 2001 From: damithc Date: Mon, 25 May 2020 00:58:18 +0800 Subject: [PATCH 01/38] Add Gradle support --- build.gradle | 46 ++++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58695 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 183 +++++++++++++++++++++++ gradlew.bat | 103 +++++++++++++ text-ui-test/runtest.sh | 0 6 files changed, 337 insertions(+) create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat mode change 100644 => 100755 text-ui-test/runtest.sh diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000000..20c0521cc7 --- /dev/null +++ b/build.gradle @@ -0,0 +1,46 @@ +plugins { + id 'java' + id 'application' + id 'checkstyle' + id 'com.github.johnrengelman.shadow' version '5.1.0' +} + +repositories { + mavenCentral() +} + +dependencies { + testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.5.0' + testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.5.0' +} + +test { + useJUnitPlatform() + + testLogging { + events "passed", "skipped", "failed" + + showExceptions true + exceptionFormat "full" + showCauses true + showStackTraces true + showStandardStreams = false + } +} + +application { + mainClassName = "seedu.duke.Duke" +} + +shadowJar { + archiveBaseName = "duke" + archiveClassifier = null +} + +checkstyle { + toolVersion = '8.29' +} + +run{ + standardInput = System.in +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f3d88b1c2faf2fc91d853cd5d4242b5547257070 GIT binary patch literal 58695 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..b7c8c5dbf5 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000000..2fe81a7d95 --- /dev/null +++ b/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000000..62bd9b9cce --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,103 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh old mode 100644 new mode 100755 From a632fc9c031e8a2be0b6cdd9301efc388e6cb248 Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Sat, 22 Jan 2022 16:19:51 +0800 Subject: [PATCH 02/38] Add BufferedReader and BufferedWriter --- src/main/java/Duke.class | Bin 0 -> 986 bytes src/main/java/Duke.java | 13 ++++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 src/main/java/Duke.class diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class new file mode 100644 index 0000000000000000000000000000000000000000..c5509fc1b5c86797f982519643570c65ff16e1db GIT binary patch literal 986 zcmaJ=QEw7K5dIb@2j^LkN^8~DRcVE`_WI@njSpg)nxHnJsSlD|7FgRW$1S;Anvn2A z{2Th9Ngwkbk3;4s{^<@1?#{oiLZilMJ|p zr+8-IxrGvTD8(phVo&q?*t(W&JqI<0p_V-=mm1JPF)oIy>@%u_rg})xtD4xw3kK^{ zdYT3K{a6Q0*_wX7Pj8Fm)(TNWF`_WyZQtTg>K z(MW(r9Zai9yDgH8yu= Date: Sat, 22 Jan 2022 17:20:19 +0800 Subject: [PATCH 03/38] Add Level-1 --- src/main/java/Duke.java | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 6db7bbc639..6d072be2b5 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -3,7 +3,24 @@ import java.io.InputStreamReader; import java.io.OutputStreamWriter; +/** + * Project Duke is a educational software project designed to take you + * through the steps of building a small software incrementally, + * while applying as many Java and SE techniques as possible along the way. + * + * @author AdrianOngJJ + */ public class Duke { + private static final String LINE_BREAK = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"; + + /** + * Prints line break + * @return void + */ + private static final void printLineBreak() { + System.out.println(LINE_BREAK); + } + public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); @@ -13,9 +30,24 @@ public static void main(String[] args) throws Exception { + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; System.out.println("Hello from\n" + logo); - String s = br.readLine(); - bw.write(s); - bw.flush(); + printLineBreak(); + System.out.println("Hello! I'm Duke\nWhat can I do for you?"); + printLineBreak(); + String inputCommand = ""; + boolean ifBye = false; + do { + inputCommand = br.readLine(); + switch (inputCommand) { + case "bye": + ifBye = true; + bw.write("Bye. Hope to see you again soon!"); + bw.close(); + break; + + default: + System.out.println(inputCommand); + } + } while (!ifBye); } } From 3c42ef71244c7eb291e9acb5d60252dacc4c90e4 Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Sat, 22 Jan 2022 18:16:50 +0800 Subject: [PATCH 04/38] Adjust spacing of output --- src/main/java/Duke.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 6d072be2b5..cce5bfb4a6 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -11,8 +11,7 @@ * @author AdrianOngJJ */ public class Duke { - private static final String LINE_BREAK = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"; - + private static final String LINE_BREAK = "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"; /** * Prints line break * @return void @@ -32,22 +31,24 @@ public static void main(String[] args) throws Exception { System.out.println("Hello from\n" + logo); printLineBreak(); System.out.println("Hello! I'm Duke\nWhat can I do for you?"); - printLineBreak(); String inputCommand = ""; boolean ifBye = false; do { + printLineBreak(); + System.out.println(); inputCommand = br.readLine(); + printLineBreak(); switch (inputCommand) { case "bye": ifBye = true; - bw.write("Bye. Hope to see you again soon!"); - bw.close(); + System.out.println("Bye. Hope to see you again soon!"); break; default: System.out.println(inputCommand); } } while (!ifBye); + printLineBreak(); } } From 9d19fadfc59b3266c348cbc03f183fc7df2c9777 Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Sat, 22 Jan 2022 18:40:47 +0800 Subject: [PATCH 05/38] Add list function --- src/main/java/Duke.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index cce5bfb4a6..67c447e83b 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -2,6 +2,7 @@ import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; +import java.util.ArrayList; /** * Project Duke is a educational software project designed to take you @@ -12,6 +13,7 @@ */ public class Duke { private static final String LINE_BREAK = "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"; + private static final ArrayList masterList = new ArrayList<>(); /** * Prints line break * @return void @@ -20,6 +22,16 @@ private static final void printLineBreak() { System.out.println(LINE_BREAK); } + private static final void printList(BufferedWriter bw) throws Exception { + Object[] masterListArr = masterList.toArray(); + int x = 1; + for (Object s : masterListArr) { + bw.write(x++ + ". " + s); + bw.newLine(); + } + bw.flush(); + } + public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); @@ -44,8 +56,13 @@ public static void main(String[] args) throws Exception { System.out.println("Bye. Hope to see you again soon!"); break; + case "list": + printList(bw); + break; + default: - System.out.println(inputCommand); + masterList.add(inputCommand); + System.out.println("added: " + inputCommand); } } while (!ifBye); printLineBreak(); From abde661b5fb9a65487684b224c900724ea8ba311 Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Sat, 22 Jan 2022 19:40:29 +0800 Subject: [PATCH 06/38] Add ability to mark oand unmark --- src/main/java/Duke.java | 43 +++++++++++++++++++++++++++++++++-------- src/main/java/Task.java | 43 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 8 deletions(-) create mode 100644 src/main/java/Task.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 67c447e83b..a6fa2f3b1a 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -10,23 +10,29 @@ * while applying as many Java and SE techniques as possible along the way. * * @author AdrianOngJJ + * @version 0.1 + * @since 22/1/2022 */ public class Duke { private static final String LINE_BREAK = "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"; - private static final ArrayList masterList = new ArrayList<>(); + private static final ArrayList masterList = new ArrayList<>(); /** - * Prints line break + * Prints line break. * @return void */ private static final void printLineBreak() { System.out.println(LINE_BREAK); } + /** + * Prints Master List + * @param bw BufferedWriter from main to print out the Master List. + * @throws java.io.IOException If an I/O error occurs. Only takes in string. + */ private static final void printList(BufferedWriter bw) throws Exception { - Object[] masterListArr = masterList.toArray(); - int x = 1; - for (Object s : masterListArr) { - bw.write(x++ + ". " + s); + for(int i = 0; i < masterList.size(); i++) { + Task curr = masterList.get(i); + bw.write((i + 1) + "." + curr.toString()); bw.newLine(); } bw.flush(); @@ -44,24 +50,45 @@ public static void main(String[] args) throws Exception { printLineBreak(); System.out.println("Hello! I'm Duke\nWhat can I do for you?"); String inputCommand = ""; + String[] inputCommandArr = new String[100]; boolean ifBye = false; do { printLineBreak(); System.out.println(); inputCommand = br.readLine(); + inputCommandArr = inputCommand.split(" "); printLineBreak(); - switch (inputCommand) { + switch (inputCommandArr[0]) { case "bye": ifBye = true; System.out.println("Bye. Hope to see you again soon!"); break; case "list": + bw.write("Here are the tasks in your list:\n"); printList(bw); break; + case "mark": + bw.write("Nice! I've marked this task as done:\n"); + int index = Integer.parseInt(inputCommandArr[1]) - 1; + Task curr = masterList.get(index); // task to be marked + masterList.set(index, curr.markAsDone()); + bw.write(masterList.get(index).toString()); + bw.flush(); + break; + + case "unmark": + bw.write("OK, I've marked this task as not done yet:\n"); + int indexUnmark = Integer.parseInt(inputCommandArr[1]) - 1; + Task currUnmark = masterList.get(indexUnmark); // task to be unmarked + masterList.set(indexUnmark, currUnmark.unmarkItem()); + bw.write(masterList.get(indexUnmark).toString()); + bw.flush(); + break; + default: - masterList.add(inputCommand); + masterList.add(new Task(inputCommand)); System.out.println("added: " + inputCommand); } } while (!ifBye); diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 0000000000..d08e0b86d6 --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,43 @@ +/** + * Task class contains the task's name and whether it is completed + */ +public class Task { + protected String description; + protected boolean isDone; + + public Task(String description) { + this.description = description; + this.isDone = false; + } + + /** + * Check if task is done + * @return String "X" to indicate if a task is done + */ + public String getStatusIcon() { + return (isDone ? "X" : " "); // mark done with X + } + + /** + * Mark item as done + * @return Item that is done + */ + public Task markAsDone() { + this.isDone = true; + return this; + } + + /** + * Mark item as undone + * @return Item that is undone + */ + public Task unmarkItem() { + this.isDone = false; + return this; + } + + @Override + public String toString() { + return "[" + getStatusIcon() + "] " + this.description; + } +} From fa48c36781be4fb7a92ba74c03501beb442e49cc Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Sat, 22 Jan 2022 20:00:01 +0800 Subject: [PATCH 07/38] Add Task class --- src/main/java/ToDos.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/ToDos.java diff --git a/src/main/java/ToDos.java b/src/main/java/ToDos.java new file mode 100644 index 0000000000..350e9c3285 --- /dev/null +++ b/src/main/java/ToDos.java @@ -0,0 +1,13 @@ +/** + * To Dos are tasks without any date/time attached to it + */ +public class ToDos extends Task { + public ToDos(String description) { + super(description); + } + + @Override + public String toString() { + return "[T]" + super.toString(); + } +} From af9709297408a79b1639b9f07d8ab28bfe2e5bbd Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Tue, 25 Jan 2022 17:41:46 +0800 Subject: [PATCH 08/38] Add Deadlines.java and Events.java --- src/main/java/Deadlines.java | 19 ++++++++++++ src/main/java/Duke.java | 56 ++++++++++++++++++------------------ src/main/java/Events.java | 14 +++++++++ 3 files changed, 61 insertions(+), 28 deletions(-) create mode 100644 src/main/java/Deadlines.java create mode 100644 src/main/java/Events.java diff --git a/src/main/java/Deadlines.java b/src/main/java/Deadlines.java new file mode 100644 index 0000000000..9f2aceb55a --- /dev/null +++ b/src/main/java/Deadlines.java @@ -0,0 +1,19 @@ +/** + * Deadlines tasks that need to be done before a specific date/time + * e.g., submit report by 11/10/2019 5pm + */ + +public class Deadlines extends Task { + + private final String deadline; + + public Deadlines(String description, String deadline) { + super(description); + this.deadline = deadline; + } + + @Override + public String toString() { + return "[D]" + super.toString() + " (by: " + this.deadline + ")"; + } +} diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index a6fa2f3b1a..9ea91b763f 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -56,40 +56,40 @@ public static void main(String[] args) throws Exception { printLineBreak(); System.out.println(); inputCommand = br.readLine(); - inputCommandArr = inputCommand.split(" "); + inputCommandArr = inputCommand.split(" ", 2); printLineBreak(); switch (inputCommandArr[0]) { - case "bye": - ifBye = true; - System.out.println("Bye. Hope to see you again soon!"); - break; + case "bye": + ifBye = true; + System.out.println("Bye. Hope to see you again soon!"); + break; - case "list": - bw.write("Here are the tasks in your list:\n"); - printList(bw); - break; + case "list": + bw.write("Here are the tasks in your list:\n"); + printList(bw); + break; - case "mark": - bw.write("Nice! I've marked this task as done:\n"); - int index = Integer.parseInt(inputCommandArr[1]) - 1; - Task curr = masterList.get(index); // task to be marked - masterList.set(index, curr.markAsDone()); - bw.write(masterList.get(index).toString()); - bw.flush(); - break; + case "mark": + bw.write("Nice! I've marked this task as done:\n"); + int index = Integer.parseInt(inputCommandArr[1]) - 1; + Task curr = masterList.get(index); // task to be marked + masterList.set(index, curr.markAsDone()); + bw.write(masterList.get(index).toString()); + bw.flush(); + break; - case "unmark": - bw.write("OK, I've marked this task as not done yet:\n"); - int indexUnmark = Integer.parseInt(inputCommandArr[1]) - 1; - Task currUnmark = masterList.get(indexUnmark); // task to be unmarked - masterList.set(indexUnmark, currUnmark.unmarkItem()); - bw.write(masterList.get(indexUnmark).toString()); - bw.flush(); - break; + case "unmark": + bw.write("OK, I've marked this task as not done yet:\n"); + int indexUnmark = Integer.parseInt(inputCommandArr[1]) - 1; + Task currUnmark = masterList.get(indexUnmark); // task to be unmarked + masterList.set(indexUnmark, currUnmark.unmarkItem()); + bw.write(masterList.get(indexUnmark).toString()); + bw.flush(); + break; - default: - masterList.add(new Task(inputCommand)); - System.out.println("added: " + inputCommand); + default: + masterList.add(new Task(inputCommand)); + System.out.println("added: " + inputCommand); } } while (!ifBye); printLineBreak(); diff --git a/src/main/java/Events.java b/src/main/java/Events.java new file mode 100644 index 0000000000..98af0455b2 --- /dev/null +++ b/src/main/java/Events.java @@ -0,0 +1,14 @@ +/** + * Events are tasks that start at a specific time and ends at a specific time + * e.g., team project meeting on 2/10/2019 2-4pm + */ + +public class Events extends Task { + + private final String duration; + + public Events(String description, String duration) { + super(description); + this.duration = duration; + } +} From e881447577f313f47e7a9f4af3a419d57c91ba28 Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Tue, 25 Jan 2022 23:13:32 +0800 Subject: [PATCH 09/38] Add Events.java and complete Level 4 --- src/main/java/Duke.java | 43 +++++++++++++++++++++++++++++++-------- src/main/java/Events.java | 5 +++++ 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 9ea91b763f..d25a2a9b79 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -38,6 +38,14 @@ private static final void printList(BufferedWriter bw) throws Exception { bw.flush(); } + private static final String getDateTime(String[] inputArr) { + return inputArr[1].split("/")[1].split(" ", 2)[1]; // split input from slash + } + + private static final String getDescription(String[] inputArr) { + return inputArr[1].split("/")[0]; // split input from slash + } + public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); @@ -49,16 +57,16 @@ public static void main(String[] args) throws Exception { System.out.println("Hello from\n" + logo); printLineBreak(); System.out.println("Hello! I'm Duke\nWhat can I do for you?"); - String inputCommand = ""; - String[] inputCommandArr = new String[100]; + String input; // to store raw input command + String[] inputArr; // to store split input command boolean ifBye = false; do { printLineBreak(); System.out.println(); - inputCommand = br.readLine(); - inputCommandArr = inputCommand.split(" ", 2); + input = br.readLine(); + inputArr = input.split(" ", 2); // split first word from body printLineBreak(); - switch (inputCommandArr[0]) { + switch (inputArr[0]) { case "bye": ifBye = true; System.out.println("Bye. Hope to see you again soon!"); @@ -71,7 +79,7 @@ public static void main(String[] args) throws Exception { case "mark": bw.write("Nice! I've marked this task as done:\n"); - int index = Integer.parseInt(inputCommandArr[1]) - 1; + int index = Integer.parseInt(inputArr[1]) - 1; Task curr = masterList.get(index); // task to be marked masterList.set(index, curr.markAsDone()); bw.write(masterList.get(index).toString()); @@ -80,16 +88,33 @@ public static void main(String[] args) throws Exception { case "unmark": bw.write("OK, I've marked this task as not done yet:\n"); - int indexUnmark = Integer.parseInt(inputCommandArr[1]) - 1; + int indexUnmark = Integer.parseInt(inputArr[1]) - 1; Task currUnmark = masterList.get(indexUnmark); // task to be unmarked masterList.set(indexUnmark, currUnmark.unmarkItem()); bw.write(masterList.get(indexUnmark).toString()); bw.flush(); break; + case "deadline": + masterList.add(new Deadlines(getDescription(inputArr), getDateTime(inputArr))); + System.out.println("Got it. I've added this task:\n\t " + input + + "\nNow you have " + masterList.size() + " tasks in the list."); + break; + + case "todo": + masterList.add(new ToDos(getDescription(inputArr))); + System.out.println("Got it. I've added this task:\n\t " + input + + "\nNow you have " + masterList.size() + " tasks in the list."); + break; + + case "event": + masterList.add(new Events(getDescription(inputArr), getDateTime(inputArr))); + System.out.println("Got it. I've added this task:\n\t " + input + + "\nNow you have " + masterList.size() + " tasks in the list."); + break; + default: - masterList.add(new Task(inputCommand)); - System.out.println("added: " + inputCommand); + System.out.println("Invalid input: " + input); } } while (!ifBye); printLineBreak(); diff --git a/src/main/java/Events.java b/src/main/java/Events.java index 98af0455b2..4126d4f9ab 100644 --- a/src/main/java/Events.java +++ b/src/main/java/Events.java @@ -11,4 +11,9 @@ public Events(String description, String duration) { super(description); this.duration = duration; } + + @Override + public String toString() { + return "[E]" + super.toString() + " (at: " + this.duration + ")"; + } } From a78a820709e6de68076fb082bd0fa4991826fc52 Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Wed, 26 Jan 2022 17:02:25 +0800 Subject: [PATCH 10/38] Complete Level 4 --- src/main/java/Deadlines.java | 2 +- src/main/java/Duke.java | 3 ++- src/main/java/Events.java | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/Deadlines.java b/src/main/java/Deadlines.java index 9f2aceb55a..ffe2d3cb00 100644 --- a/src/main/java/Deadlines.java +++ b/src/main/java/Deadlines.java @@ -14,6 +14,6 @@ public Deadlines(String description, String deadline) { @Override public String toString() { - return "[D]" + super.toString() + " (by: " + this.deadline + ")"; + return "[D]" + super.toString() + "(by: " + this.deadline + ")"; } } diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index d25a2a9b79..d809a9cfd6 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -109,7 +109,8 @@ public static void main(String[] args) throws Exception { case "event": masterList.add(new Events(getDescription(inputArr), getDateTime(inputArr))); - System.out.println("Got it. I've added this task:\n\t " + input + System.out.println("Got it. I've added this task:\n\t " + + (masterList.get(masterList.size() - 1)).toString() + "\nNow you have " + masterList.size() + " tasks in the list."); break; diff --git a/src/main/java/Events.java b/src/main/java/Events.java index 4126d4f9ab..865e4b9757 100644 --- a/src/main/java/Events.java +++ b/src/main/java/Events.java @@ -14,6 +14,6 @@ public Events(String description, String duration) { @Override public String toString() { - return "[E]" + super.toString() + " (at: " + this.duration + ")"; + return "[E]" + super.toString() + "(at: " + this.duration + ")"; } } From bd3878a39d40ea1dacbce83af1bccf19fae92533 Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Wed, 26 Jan 2022 17:56:01 +0800 Subject: [PATCH 11/38] Add Delete function --- src/main/java/Duke.java | 15 ++++++++++-- src/main/java/DukeException.java | 11 +++++++++ text-ui-test/EXPECTED.TXT | 42 ++++++++++++++++++++++++++++++++ text-ui-test/input.txt | 10 ++++++++ text-ui-test/runtest.bat | 4 +-- text-ui-test/runtest.sh | 2 +- 6 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 src/main/java/DukeException.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index d809a9cfd6..45227b6f63 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -97,13 +97,15 @@ public static void main(String[] args) throws Exception { case "deadline": masterList.add(new Deadlines(getDescription(inputArr), getDateTime(inputArr))); - System.out.println("Got it. I've added this task:\n\t " + input + System.out.println("Got it. I've added this task:\n\t " + + (masterList.get(masterList.size() - 1)).toString() + "\nNow you have " + masterList.size() + " tasks in the list."); break; case "todo": masterList.add(new ToDos(getDescription(inputArr))); - System.out.println("Got it. I've added this task:\n\t " + input + System.out.println("Got it. I've added this task:\n\t " + + (masterList.get(masterList.size() - 1)).toString() + "\nNow you have " + masterList.size() + " tasks in the list."); break; @@ -114,6 +116,15 @@ public static void main(String[] args) throws Exception { + "\nNow you have " + masterList.size() + " tasks in the list."); break; + case "delete": + bw.write("Noted. I've removed this task:\n\t"); + int indexDel = Integer.parseInt(inputArr[1]) - 1; + bw.write(masterList.remove(indexDel).toString()); + bw.write("\nNow you have " + masterList.size() + " tasks in list."); + bw.flush(); + break; + + default: System.out.println("Invalid input: " + input); } diff --git a/src/main/java/DukeException.java b/src/main/java/DukeException.java new file mode 100644 index 0000000000..61954006cd --- /dev/null +++ b/src/main/java/DukeException.java @@ -0,0 +1,11 @@ +/** + * Exception class for Duke to handle Exceptions + */ + +public class DukeException extends Exception { + + public DukeException(String message) { + super(message); + } + +} diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 657e74f6e7..97d48a7262 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -5,3 +5,45 @@ Hello from | |_| | |_| | < __/ |____/ \__,_|_|\_\___| + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Hello! I'm Duke +What can I do for you? + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +event project meeting /at Mon 2-4pm + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Got it. I've added this task: + [E][ ] project meeting (at: Mon 2-4pm) +Now you have 1 tasks in the list. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +deadline return book /by Sunday + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Got it. I've added this task: + deadline return book /by Sunday +Now you have 2 tasks in the list. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +list + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Here are the tasks in your list: +1.[E][ ] project meeting (at: Mon 2-4pm) +2.[D][ ] return book (by: Sunday) + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +bye + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Bye. Hope to see you again soon! + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Process finished with exit code 0 \ No newline at end of file diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index e69de29bb2..d59240a9cb 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -0,0 +1,10 @@ +todo read book +deadline return book /by June 6th +event project meeting /at Aug 6th 2-4pm +todo join sports club +mark 1 +mark 4 +todo borrow book +list +deadline return book /by Sunday +event project meeting /at Mon 2-4pm diff --git a/text-ui-test/runtest.bat b/text-ui-test/runtest.bat index 0873744649..ec0e4f026a 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 C:\Users\adria\Desktop\iP\src\main\java -Xlint:none -d ..\bin C:\Users\adria\Desktop\iP\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 C:\Users\adria\Desktop\iP\src\main\java\Duke.java < input.txt > ACTUAL.TXT REM compare the output to the expected output FC ACTUAL.TXT EXPECTED.TXT diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh index c9ec870033..c4458cdf46 100644 --- a/text-ui-test/runtest.sh +++ b/text-ui-test/runtest.sh @@ -13,7 +13,7 @@ then fi # compile the code into the bin folder, terminates if error occurred -if ! javac -cp ../src/main/java -Xlint:none -d ../bin ../src/main/java/*.java +if ! javac -cp C:\Users\adria\Desktop\iP\src\main\java -Xlint:none -d ../bin C:\Users\adria\Desktop\iP\src\main\java*.java then echo "********** BUILD FAILURE **********" exit 1 From 24dd4bf698e3615afd981cbd32df08af18425663 Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Thu, 3 Feb 2022 18:14:00 +0800 Subject: [PATCH 12/38] Test file creating --- src/main/java/Duke.java | 24 ++++++++++++++++++++---- text-ui-test/runtest.bat | 4 ++-- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 45227b6f63..1614b29d90 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,8 +1,7 @@ -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; +import java.io.*; import java.util.ArrayList; +import java.nio.file.Paths; +import java.nio.file.Files; /** * Project Duke is a educational software project designed to take you @@ -47,6 +46,23 @@ private static final String getDescription(String[] inputArr) { } public static void main(String[] args) throws Exception { + + String home = System.getProperty("user.home"); // base directory + // following code should give me [HOME_DIRECTORY]/Desktop/iP/data + java.nio.file.Path path = java.nio.file.Paths.get(home,"Desktop", "iP", "data"); + boolean directoryExists = java.nio.file.Files.exists(path); + System.out.println(directoryExists); + // if path doesn't exist, make new directory and file + if (!directoryExists) { + File dataDirectory = new File(path.toString()); + File dukeStore = new File(path + "\\duke.txt"); + System.out.println("I tried creating a new directory " + dataDirectory); + System.out.println("I tried creating a new file " + dukeStore); + + } + System.out.println("Does this directory " + path + " exist? " + directoryExists); + System.exit(0); + //java.nio.file.Path path = java.nio.file.Paths.get(home, ""); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); String logo = " ____ _ \n" diff --git a/text-ui-test/runtest.bat b/text-ui-test/runtest.bat index ec0e4f026a..74a7c489cd 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 C:\Users\adria\Desktop\iP\src\main\java -Xlint:none -d ..\bin C:\Users\adria\Desktop\iP\src\main\java*.java +javac -cp C:\Users\adria\Desktop\iP\src\main\java -Xlint:none -d ..\bin C:\Users\adria\Desktop\iP\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 C:\Users\adria\Desktop\iP\src\main\java\Duke.java < input.txt > ACTUAL.TXT +java -classpath ../bin Duke < input.txt > ACTUAL.TXT REM compare the output to the expected output FC ACTUAL.TXT EXPECTED.TXT From 4488007c1675609884102cea527d45c852722de0 Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Thu, 3 Feb 2022 18:24:25 +0800 Subject: [PATCH 13/38] Update text-ui-test/runtest.bat syntax --- text-ui-test/runtest.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/text-ui-test/runtest.bat b/text-ui-test/runtest.bat index ec0e4f026a..74a7c489cd 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 C:\Users\adria\Desktop\iP\src\main\java -Xlint:none -d ..\bin C:\Users\adria\Desktop\iP\src\main\java*.java +javac -cp C:\Users\adria\Desktop\iP\src\main\java -Xlint:none -d ..\bin C:\Users\adria\Desktop\iP\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 C:\Users\adria\Desktop\iP\src\main\java\Duke.java < input.txt > ACTUAL.TXT +java -classpath ../bin Duke < input.txt > ACTUAL.TXT REM compare the output to the expected output FC ACTUAL.TXT EXPECTED.TXT From b6fe97aa49c71ca652119a8b64889df3384ab7b7 Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Thu, 3 Feb 2022 21:05:23 +0800 Subject: [PATCH 14/38] Improve directory saving. Cannot create duke.txt --- src/main/java/Duke.java | 5 ++++- text-ui-test/runtest.bat | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 1614b29d90..e16f6dd4c5 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -55,9 +55,12 @@ public static void main(String[] args) throws Exception { // if path doesn't exist, make new directory and file if (!directoryExists) { File dataDirectory = new File(path.toString()); - File dukeStore = new File(path + "\\duke.txt"); + dataDirectory.mkdir(); + File dukeStore = new File(path + "/duke.txt"); System.out.println("I tried creating a new directory " + dataDirectory); System.out.println("I tried creating a new file " + dukeStore); + directoryExists = java.nio.file.Files.exists(dukeStore.toPath()); + } System.out.println("Does this directory " + path + " exist? " + directoryExists); diff --git a/text-ui-test/runtest.bat b/text-ui-test/runtest.bat index 74a7c489cd..4bc0718db1 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 C:\Users\adria\Desktop\iP\src\main\java -Xlint:none -d ..\bin C:\Users\adria\Desktop\iP\src\main\java\*.java +javac -cp C:\Users\User\Desktop\iP\src\main\java -Xlint:none -d ..\bin C:\Users\User\Desktop\iP\src\main\java\*.java IF ERRORLEVEL 1 ( echo ********** BUILD FAILURE ********** exit /b 1 From cb3b03c1b215099426ca349bca4b6437caec108c Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Thu, 17 Feb 2022 21:54:57 +0800 Subject: [PATCH 15/38] Improve saving duke.txt. Unable to create duke.txt file --- src/main/java/Duke.java | 45 ++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 1614b29d90..115e25bc10 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,7 +1,15 @@ -import java.io.*; +import java.io.IOException; +import java.io.BufferedWriter; +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.nio.Buffer; +import java.nio.file.Path; import java.util.ArrayList; import java.nio.file.Paths; import java.nio.file.Files; +import java.util.Scanner; /** * Project Duke is a educational software project designed to take you @@ -14,7 +22,7 @@ */ public class Duke { private static final String LINE_BREAK = "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"; - private static final ArrayList masterList = new ArrayList<>(); + private static ArrayList masterList; /** * Prints line break. * @return void @@ -28,7 +36,7 @@ private static final void printLineBreak() { * @param bw BufferedWriter from main to print out the Master List. * @throws java.io.IOException If an I/O error occurs. Only takes in string. */ - private static final void printList(BufferedWriter bw) throws Exception { + private static final void printList(BufferedWriter bw) throws IOException { for(int i = 0; i < masterList.size(); i++) { Task curr = masterList.get(i); bw.write((i + 1) + "." + curr.toString()); @@ -45,26 +53,27 @@ private static final String getDescription(String[] inputArr) { return inputArr[1].split("/")[0]; // split input from slash } - public static void main(String[] args) throws Exception { - + public static void main(String[] args) throws Exception, IOException { String home = System.getProperty("user.home"); // base directory // following code should give me [HOME_DIRECTORY]/Desktop/iP/data java.nio.file.Path path = java.nio.file.Paths.get(home,"Desktop", "iP", "data"); - boolean directoryExists = java.nio.file.Files.exists(path); - System.out.println(directoryExists); - // if path doesn't exist, make new directory and file - if (!directoryExists) { - File dataDirectory = new File(path.toString()); - File dukeStore = new File(path + "\\duke.txt"); - System.out.println("I tried creating a new directory " + dataDirectory); - System.out.println("I tried creating a new file " + dukeStore); - - } - System.out.println("Does this directory " + path + " exist? " + directoryExists); - System.exit(0); - //java.nio.file.Path path = java.nio.file.Paths.get(home, ""); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + try { + File dataDirectory = new File(path.toString()); + File dukeStore = new File(path + "/duke.txt"); + Scanner fileReader = new Scanner(dukeStore); + } catch (IOException e) { + Path filePath = Paths.get("data"); + boolean isDirectoryExists = Files.exists(filePath); + if (!isDirectoryExists) { + new File("data").mkdir(); + } + new File(String.valueOf(path)).createNewFile(); + masterList = new ArrayList<>(); + } + + String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" From 7e02ee6ffc5dadad65e7762a32528ab3a72abd1a Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Mon, 21 Feb 2022 20:47:27 +0800 Subject: [PATCH 16/38] Implement correct saving --- data/duke.txt | 4 ++ src/main/java/Duke.java | 89 ++++++++++++++++++++++++++++++++++----- src/main/java/Events.java | 2 +- 3 files changed, 84 insertions(+), 11 deletions(-) create mode 100644 data/duke.txt diff --git a/data/duke.txt b/data/duke.txt new file mode 100644 index 0000000000..1e930c8477 --- /dev/null +++ b/data/duke.txt @@ -0,0 +1,4 @@ +T|0|buy apple +T|1|sell pear +D|0|cry |Something +E|0|party |Tmr diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 115e25bc10..aba9b6b8d8 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,9 +1,4 @@ -import java.io.IOException; -import java.io.BufferedWriter; -import java.io.BufferedReader; -import java.io.File; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; +import java.io.*; import java.nio.Buffer; import java.nio.file.Path; import java.util.ArrayList; @@ -22,7 +17,8 @@ */ public class Duke { private static final String LINE_BREAK = "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"; - private static ArrayList masterList; + private static ArrayList masterList = new ArrayList<>(); + ; /** * Prints line break. * @return void @@ -53,6 +49,74 @@ private static final String getDescription(String[] inputArr) { return inputArr[1].split("/")[0]; // split input from slash } + private static final String taskToString(Task task) { + String toReturn = ""; + if (task instanceof ToDos) { + toReturn = toReturn + "T|"; + } else if (task instanceof Deadlines) { + toReturn = toReturn + "D|"; + } else if (task instanceof Events) { + toReturn = toReturn + "E|"; + } + if (task.isDone) { + toReturn = toReturn + "1|"; + } else { + toReturn = toReturn + "0|"; + } + toReturn = toReturn + task.description; + if (task instanceof Deadlines || task instanceof Events) { + String[] durationArr = task.toString().split("[:)]"); + String duration = durationArr[1].split(" ")[1]; + toReturn = toReturn + "|" + duration; + } + return toReturn; + } + + private static final void saveAllTask(ArrayList tasks, String filePath) throws IOException { + FileWriter fw = new FileWriter(filePath); + for (Task task : tasks) { + fw.write(taskToString(task)); + fw.write("\n"); + } + fw.close(); + } + + public static final Task loadTask(String description) { + String[] splitDescription = description.split("\\|"); + String taskType = splitDescription[0]; + Task tempTask = new Task("Temp task"); + switch (taskType) { + case "T": + Task newToDo = new ToDos(splitDescription[2]); + if (splitDescription[1].equals("1")) { + newToDo.markAsDone(); + } + tempTask = newToDo; + break; + + case "D": + Task newDeadline = new Deadlines(splitDescription[2], splitDescription[3]); + if (splitDescription[1].equals("1")) { + newDeadline.markAsDone(); + } + tempTask = newDeadline; + break; + + case "E": + Task newEvent = new Events(splitDescription[2], splitDescription[3]); + if (splitDescription[1].equals("1")) { + newEvent.markAsDone(); + } + tempTask = newEvent; + break; + + default: + System.out.println("All tasks loaded!"); + + } + return tempTask; + } + public static void main(String[] args) throws Exception, IOException { String home = System.getProperty("user.home"); // base directory // following code should give me [HOME_DIRECTORY]/Desktop/iP/data @@ -60,20 +124,22 @@ public static void main(String[] args) throws Exception, IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); try { - File dataDirectory = new File(path.toString()); File dukeStore = new File(path + "/duke.txt"); Scanner fileReader = new Scanner(dukeStore); + while (fileReader.hasNextLine()) { + masterList.add(loadTask(fileReader.nextLine())); + } } catch (IOException e) { Path filePath = Paths.get("data"); boolean isDirectoryExists = Files.exists(filePath); if (!isDirectoryExists) { new File("data").mkdir(); } - new File(String.valueOf(path)).createNewFile(); - masterList = new ArrayList<>(); + new File(path + "/duke.txt").createNewFile(); } + String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" @@ -94,6 +160,9 @@ public static void main(String[] args) throws Exception, IOException { switch (inputArr[0]) { case "bye": ifBye = true; + File dukeStore = new File(path + "/duke.txt"); + dukeStore.delete(); + saveAllTask(masterList, path + "/duke.txt"); System.out.println("Bye. Hope to see you again soon!"); break; diff --git a/src/main/java/Events.java b/src/main/java/Events.java index 865e4b9757..50aa67f543 100644 --- a/src/main/java/Events.java +++ b/src/main/java/Events.java @@ -5,7 +5,7 @@ public class Events extends Task { - private final String duration; + protected final String duration; public Events(String description, String duration) { super(description); From 40d8e48f3ad511522d1c94cff527f8acba57725d Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Wed, 23 Feb 2022 14:59:53 +0800 Subject: [PATCH 17/38] Add DateTime function --- src/main/java/DateTime.java | 28 ++++++++++++++++++++++++++++ src/main/java/Deadlines.java | 6 +++--- src/main/java/Duke.java | 9 +++++++-- src/main/java/Events.java | 6 +++--- 4 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 src/main/java/DateTime.java diff --git a/src/main/java/DateTime.java b/src/main/java/DateTime.java new file mode 100644 index 0000000000..43a4523a80 --- /dev/null +++ b/src/main/java/DateTime.java @@ -0,0 +1,28 @@ +import java.time.*; + +public class DateTime { + private final LocalDateTime dateTime; + + DateTime(String[] dateTimeArr) { + this.dateTime = LocalDateTime.of(Integer.parseInt(dateTimeArr[1]) + , Integer.parseInt(dateTimeArr[2]) + , Integer.parseInt(dateTimeArr[3]) + , Integer.parseInt(dateTimeArr[4].substring(0, 2)) + , Integer.parseInt(dateTimeArr[4].substring(2))); + } + + @Override + public String toString() { + String minutes = ""; + if (this.dateTime.getMinute() < 10) { + minutes = "0" + this.dateTime.getMinute(); + } else { + minutes = String.valueOf(this.dateTime.getMinute()); + } + return this.dateTime.getMonth().toString().substring(0, 3) + " " + + this.dateTime.getDayOfMonth() + " " + + this.dateTime.getYear() + " " + + this.dateTime.getHour() + ":" + + minutes; + } +} diff --git a/src/main/java/Deadlines.java b/src/main/java/Deadlines.java index ffe2d3cb00..f155084b4d 100644 --- a/src/main/java/Deadlines.java +++ b/src/main/java/Deadlines.java @@ -5,15 +5,15 @@ public class Deadlines extends Task { - private final String deadline; + private final DateTime deadline; - public Deadlines(String description, String deadline) { + public Deadlines(String description, DateTime deadline) { super(description); this.deadline = deadline; } @Override public String toString() { - return "[D]" + super.toString() + "(by: " + this.deadline + ")"; + return "[D]" + super.toString() + "(by: " + this.deadline.toString() + ")"; } } diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 45227b6f63..814f1ffadf 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -3,6 +3,9 @@ import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.ArrayList; +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; /** * Project Duke is a educational software project designed to take you @@ -38,8 +41,10 @@ private static final void printList(BufferedWriter bw) throws Exception { bw.flush(); } - private static final String getDateTime(String[] inputArr) { - return inputArr[1].split("/")[1].split(" ", 2)[1]; // split input from slash + private static final DateTime getDateTime(String[] inputArr) { + String[] dateTimeArr = inputArr[1].split("/")[1].split("[- ]"); // [String, yyyy, mm, dd, HHMM] + return new DateTime(dateTimeArr); + } private static final String getDescription(String[] inputArr) { diff --git a/src/main/java/Events.java b/src/main/java/Events.java index 865e4b9757..1389b6f0ba 100644 --- a/src/main/java/Events.java +++ b/src/main/java/Events.java @@ -5,15 +5,15 @@ public class Events extends Task { - private final String duration; + private final DateTime duration; - public Events(String description, String duration) { + public Events(String description, DateTime duration) { super(description); this.duration = duration; } @Override public String toString() { - return "[E]" + super.toString() + "(at: " + this.duration + ")"; + return "[E]" + super.toString() + "(at: " + this.duration.toString() + ")"; } } From b56678ce2e3e4d28c1e215ab1c419d1a66b60caf Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Wed, 23 Feb 2022 15:17:39 +0800 Subject: [PATCH 18/38] Merge branch-Level-7 with branch-Level-8 --- data/duke.txt | 4 ++-- src/main/java/DateTime.java | 8 ++++---- src/main/java/Duke.java | 9 ++++++--- src/main/java/Events.java | 5 +---- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/data/duke.txt b/data/duke.txt index 1e930c8477..33889d02cc 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -1,4 +1,4 @@ T|0|buy apple T|1|sell pear -D|0|cry |Something -E|0|party |Tmr +D|0|cry |2022-12-12 1900 +E|0|party |2022-12-30 1550 diff --git a/src/main/java/DateTime.java b/src/main/java/DateTime.java index 43a4523a80..2d392184f3 100644 --- a/src/main/java/DateTime.java +++ b/src/main/java/DateTime.java @@ -4,11 +4,11 @@ public class DateTime { private final LocalDateTime dateTime; DateTime(String[] dateTimeArr) { - this.dateTime = LocalDateTime.of(Integer.parseInt(dateTimeArr[1]) + this.dateTime = LocalDateTime.of(Integer.parseInt(dateTimeArr[0]) + , Integer.parseInt(dateTimeArr[1]) , Integer.parseInt(dateTimeArr[2]) - , Integer.parseInt(dateTimeArr[3]) - , Integer.parseInt(dateTimeArr[4].substring(0, 2)) - , Integer.parseInt(dateTimeArr[4].substring(2))); + , Integer.parseInt(dateTimeArr[3].substring(0, 2)) + , Integer.parseInt(dateTimeArr[3].substring(2))); } @Override diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 7c64e988ac..9ef8f90bd4 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -5,6 +5,7 @@ import java.nio.file.Paths; import java.nio.file.Files; import java.util.Scanner; +import java.util.Arrays; /** @@ -44,7 +45,9 @@ private static final void printList(BufferedWriter bw) throws IOException { private static final DateTime getDateTime(String[] inputArr) { String[] dateTimeArr = inputArr[1].split("/")[1].split("[- ]"); // [String, yyyy, mm, dd, HHMM] - return new DateTime(dateTimeArr); + return new DateTime(Arrays.copyOfRange(dateTimeArr, 1, dateTimeArr.length)); + // will reduce dateTimeArr to [yyyy, mm, dd, HHMM] + } @@ -98,7 +101,7 @@ public static final Task loadTask(String description) { break; case "D": - Task newDeadline = new Deadlines(splitDescription[2], splitDescription[3]); + Task newDeadline = new Deadlines(splitDescription[2], new DateTime(splitDescription[3].split("[- ]"))); if (splitDescription[1].equals("1")) { newDeadline.markAsDone(); } @@ -106,7 +109,7 @@ public static final Task loadTask(String description) { break; case "E": - Task newEvent = new Events(splitDescription[2], splitDescription[3]); + Task newEvent = new Events(splitDescription[2], new DateTime(splitDescription[3].split("[- ]"))); if (splitDescription[1].equals("1")) { newEvent.markAsDone(); } diff --git a/src/main/java/Events.java b/src/main/java/Events.java index 06ecd6c834..81f41478ca 100644 --- a/src/main/java/Events.java +++ b/src/main/java/Events.java @@ -5,11 +5,8 @@ public class Events extends Task { -<<<<<<< HEAD - protected final String duration; -======= private final DateTime duration; ->>>>>>> branch-Level-8 + public Events(String description, DateTime duration) { super(description); From 42d4ed2119eddc016bcb2ae00f980efde1e612ec Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Wed, 23 Feb 2022 17:25:21 +0800 Subject: [PATCH 19/38] Add skeleton classes for MoreOOP --- src/main/java/Duke.java | 25 +++++++++++++++++++++--- src/main/java/DukeException.java | 8 +++++++- src/main/java/Parser.java | 33 ++++++++++++++++++++++++++++++++ src/main/java/Storage.java | 2 ++ src/main/java/TaskList.java | 2 ++ src/main/java/Ui.java | 24 +++++++++++++++++++++++ 6 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 src/main/java/Parser.java create mode 100644 src/main/java/Storage.java create mode 100644 src/main/java/TaskList.java create mode 100644 src/main/java/Ui.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 9ef8f90bd4..2147be3aff 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -20,7 +20,25 @@ public class Duke { private static final String LINE_BREAK = "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"; private static ArrayList masterList = new ArrayList<>(); - ; + private Storage storage; + private TaskList tasks; + private Ui ui; + + + public Duke(String filePath) { + this.ui = new Ui(LINE_BREAK); + storage = new Storage(filePath); + try { + tasks = new TaskList(storage.load()); + } catch (DukeException e) { + ui.showLoadingError(); + tasks = new TaskList(); + } + } + + public void run() { + this.ui.initUi(); + } /** * Prints line break. * @return void @@ -123,7 +141,8 @@ public static final Task loadTask(String description) { return tempTask; } - public static void main(String[] args) throws Exception, IOException { + public static void main(String[] args) throws Exception, IOException, DukeException { + String home = System.getProperty("user.home"); // base directory // following code should give me [HOME_DIRECTORY]/Desktop/iP/data java.nio.file.Path path = java.nio.file.Paths.get(home,"Desktop", "iP", "data"); @@ -226,7 +245,7 @@ public static void main(String[] args) throws Exception, IOException { default: - System.out.println("Invalid input: " + input); + throw new DukeException(":( OOPS!!! I'm sorry, but I don't know what that means!"); } } while (!ifBye); printLineBreak(); diff --git a/src/main/java/DukeException.java b/src/main/java/DukeException.java index 61954006cd..d8289bc6f5 100644 --- a/src/main/java/DukeException.java +++ b/src/main/java/DukeException.java @@ -4,8 +4,14 @@ public class DukeException extends Exception { + private String message; public DukeException(String message) { - super(message); + this.message = message; + } + + @Override + public String getMessage() { + return this.message; } } diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java new file mode 100644 index 0000000000..4ca95ea0bc --- /dev/null +++ b/src/main/java/Parser.java @@ -0,0 +1,33 @@ +import java.util.Arrays; + +public class Parser { + + private static final String getDescription(String[] inputArr) { + return inputArr[1].split("/")[0]; // split input from slash + } + + private static final DateTime getDateTime(String[] inputArr) { + String[] dateTimeArr = inputArr[1].split("/")[1].split("[- ]"); // [String, yyyy, mm, dd, HHMM] + return new DateTime(Arrays.copyOfRange(dateTimeArr, 1, dateTimeArr.length)); + // will reduce dateTimeArr to [yyyy, mm, dd, HHMM] + + + } + // parse input commands to create new To dos, Events or Deadlines + public Task parse(String commandType, String[] inputArr) throws DukeException { + switch (commandType) { + case "todo": + return new ToDos(getDescription(inputArr)); + + case "event": + return new Events(getDescription(inputArr), getDateTime(inputArr)); + + case "deadline": + new Deadlines(getDescription(inputArr), getDateTime(inputArr)); + + default: + throw new DukeException(":( OOPS!!!! I'm sorry, but I don't know what that means!") + } + + } +} diff --git a/src/main/java/Storage.java b/src/main/java/Storage.java new file mode 100644 index 0000000000..14d3059133 --- /dev/null +++ b/src/main/java/Storage.java @@ -0,0 +1,2 @@ +public class Storage { +} diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java new file mode 100644 index 0000000000..1e7aed1c05 --- /dev/null +++ b/src/main/java/TaskList.java @@ -0,0 +1,2 @@ +public class TaskList { +} diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java new file mode 100644 index 0000000000..d22627f790 --- /dev/null +++ b/src/main/java/Ui.java @@ -0,0 +1,24 @@ +public class Ui { + private final String LOGO = " ____ _ \n" + + "| _ \\ _ _| | _____ \n" + + "| | | | | | | |/ / _ \\\n" + + "| |_| | |_| | < __/\n" + + "|____/ \\__,_|_|\\_\\___|\n"; + private final String lineBreak; + + Ui(String lineBreak) { + this.lineBreak = lineBreak; + + } + + public void initUi() { + System.out.println("Hello from\n" + LOGO); + printLineBreak(); + System.out.println("Hello! I'm Duke\nWhat can I do for you?"); + } + + private final void printLineBreak() { + System.out.println(this.lineBreak); + } + +} From 8f75ea82b26e7b08aeb860937796df60c734f28c Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Wed, 16 Mar 2022 23:04:47 +0800 Subject: [PATCH 20/38] Update Parser.java --- src/main/java/Duke.java | 10 ++++++ src/main/java/Parser.java | 64 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 70 insertions(+), 4 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 2147be3aff..b7e1b608f9 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -23,6 +23,7 @@ public class Duke { private Storage storage; private TaskList tasks; private Ui ui; + private final String END_MESSAGE = "Sayonara~"; public Duke(String filePath) { @@ -38,6 +39,15 @@ public Duke(String filePath) { public void run() { this.ui.initUi(); + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + Parser parser = new Parser(); + String parserOutput = ""; + while (!parserOutput.equals(END_MESSAGE)) { + String input = br.readLine(); + parserOutput = parser.parse(input, this.storage); + System.out.println(); + } } /** * Prints line break. diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index 4ca95ea0bc..ad080ec62d 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -2,31 +2,87 @@ public class Parser { - private static final String getDescription(String[] inputArr) { + private final String ADD_SUCCESS = "Got it! I've added:\n\t"; + + + private final String getDescription(String[] inputArr) { return inputArr[1].split("/")[0]; // split input from slash } - private static final DateTime getDateTime(String[] inputArr) { + private final DateTime getDateTime(String[] inputArr) { String[] dateTimeArr = inputArr[1].split("/")[1].split("[- ]"); // [String, yyyy, mm, dd, HHMM] return new DateTime(Arrays.copyOfRange(dateTimeArr, 1, dateTimeArr.length)); // will reduce dateTimeArr to [yyyy, mm, dd, HHMM] + } + + private void addToStorage(Task task, Storage storage) { + storage.addTask(task); + } + public String parse(String input, Storage storage) throws DukeException { + String[] inputArr = input.trim().split(" ", 2); // split first word from body + switch(inputArr[0]) { + case "todo": + if (inputArr.length == 1) { + throw new DukeException("todo simi?"); + } + ToDos newToDo = new ToDos(getDescription(inputArr)) + addToStorage(newToDo, storage); + return ADD_SUCCESS + newToDo; + + case "event": + if (inputArr.length == 1) { + throw new DukeException("event description?"); + } + Events newEvent = new Events(getDescription(inputArr), getDateTime(inputArr)); + addToStorage(newEvent, storage); + return ADD_SUCCESS + newEvent; + + case "deadline": + if (inputArr.length == 1) { + throw new DukeException("deadline when end?"); + } + Deadlines newDeadline = new Deadlines(getDescription(inputArr), getDateTime(inputArr)); + return ADD_SUCCESS + newDeadline; + default: + throw new DukeException(":( OOPS!!!! I'm sorry, but I don't know what that means!"); + } } + // parse input commands to create new To dos, Events or Deadlines public Task parse(String commandType, String[] inputArr) throws DukeException { switch (commandType) { case "todo": + if (inputArr.length == 1) { + throw new DukeException("todo simi?"); + } return new ToDos(getDescription(inputArr)); case "event": + if (inputArr.length == 1) { + throw new DukeException("event description?"); + } return new Events(getDescription(inputArr), getDateTime(inputArr)); case "deadline": - new Deadlines(getDescription(inputArr), getDateTime(inputArr)); + if (inputArr.length == 1) { + throw new DukeException("deadline when end?"); + } + return new Deadlines(getDescription(inputArr), getDateTime(inputArr)); default: - throw new DukeException(":( OOPS!!!! I'm sorry, but I don't know what that means!") + throw new DukeException(":( OOPS!!!! I'm sorry, but I don't know what that means!"); + } + + } + + public String parse(String commandType, Storage storage, String[] inputArr) { + switch(commandType) { + case "bye": + return "Sayonara~"; + + } } From ce96454b512c561c84173d146a8c6d7f38eaa1c5 Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Thu, 17 Mar 2022 21:41:07 +0800 Subject: [PATCH 21/38] Update MoreOOP --- src/main/java/Duke.java | 195 +++--------------------------------- src/main/java/Parser.java | 60 +++++------ src/main/java/Storage.java | 106 ++++++++++++++++++++ src/main/java/TaskList.java | 53 ++++++++++ 4 files changed, 194 insertions(+), 220 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index b7e1b608f9..0f86fcdc76 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -34,6 +34,8 @@ public Duke(String filePath) { } catch (DukeException e) { ui.showLoadingError(); tasks = new TaskList(); + } catch (IOException e) { + System.out.println(e.getMessage()); } } @@ -44,9 +46,15 @@ public void run() { Parser parser = new Parser(); String parserOutput = ""; while (!parserOutput.equals(END_MESSAGE)) { - String input = br.readLine(); - parserOutput = parser.parse(input, this.storage); - System.out.println(); + try { + String input = br.readLine(); + parserOutput = parser.parse(input, this.tasks, this.storage); + System.out.println(); + } catch (DukeException e) { + System.out.println(e.getMessage()); + } catch (IOException e) { + System.out.println(e.getMessage()); + } } } /** @@ -62,116 +70,11 @@ private static final void printLineBreak() { * @param bw BufferedWriter from main to print out the Master List. * @throws java.io.IOException If an I/O error occurs. Only takes in string. */ - private static final void printList(BufferedWriter bw) throws IOException { - for(int i = 0; i < masterList.size(); i++) { - Task curr = masterList.get(i); - bw.write((i + 1) + "." + curr.toString()); - bw.newLine(); - } - bw.flush(); - } - - private static final DateTime getDateTime(String[] inputArr) { - String[] dateTimeArr = inputArr[1].split("/")[1].split("[- ]"); // [String, yyyy, mm, dd, HHMM] - return new DateTime(Arrays.copyOfRange(dateTimeArr, 1, dateTimeArr.length)); - // will reduce dateTimeArr to [yyyy, mm, dd, HHMM] - - - } - - private static final String getDescription(String[] inputArr) { - return inputArr[1].split("/")[0]; // split input from slash - } - - private static final String taskToString(Task task) { - String toReturn = ""; - if (task instanceof ToDos) { - toReturn = toReturn + "T|"; - } else if (task instanceof Deadlines) { - toReturn = toReturn + "D|"; - } else if (task instanceof Events) { - toReturn = toReturn + "E|"; - } - if (task.isDone) { - toReturn = toReturn + "1|"; - } else { - toReturn = toReturn + "0|"; - } - toReturn = toReturn + task.description; - if (task instanceof Deadlines || task instanceof Events) { - String[] durationArr = task.toString().split("[:)]"); - String duration = durationArr[1].split(" ")[1]; - toReturn = toReturn + "|" + duration; - } - return toReturn; - } - - private static final void saveAllTask(ArrayList tasks, String filePath) throws IOException { - FileWriter fw = new FileWriter(filePath); - for (Task task : tasks) { - fw.write(taskToString(task)); - fw.write("\n"); - } - fw.close(); - } - - public static final Task loadTask(String description) { - String[] splitDescription = description.split("\\|"); - String taskType = splitDescription[0]; - Task tempTask = new Task("Temp task"); - switch (taskType) { - case "T": - Task newToDo = new ToDos(splitDescription[2]); - if (splitDescription[1].equals("1")) { - newToDo.markAsDone(); - } - tempTask = newToDo; - break; - - case "D": - Task newDeadline = new Deadlines(splitDescription[2], new DateTime(splitDescription[3].split("[- ]"))); - if (splitDescription[1].equals("1")) { - newDeadline.markAsDone(); - } - tempTask = newDeadline; - break; - case "E": - Task newEvent = new Events(splitDescription[2], new DateTime(splitDescription[3].split("[- ]"))); - if (splitDescription[1].equals("1")) { - newEvent.markAsDone(); - } - tempTask = newEvent; - break; - default: - System.out.println("All tasks loaded!"); - } - return tempTask; - } + public static void main(String[] args) { - public static void main(String[] args) throws Exception, IOException, DukeException { - - String home = System.getProperty("user.home"); // base directory - // following code should give me [HOME_DIRECTORY]/Desktop/iP/data - java.nio.file.Path path = java.nio.file.Paths.get(home,"Desktop", "iP", "data"); - BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); - try { - File dukeStore = new File(path + "/duke.txt"); - Scanner fileReader = new Scanner(dukeStore); - while (fileReader.hasNextLine()) { - masterList.add(loadTask(fileReader.nextLine())); - } - } catch (IOException e) { - Path filePath = Paths.get("data"); - boolean isDirectoryExists = Files.exists(filePath); - if (!isDirectoryExists) { - new File("data").mkdir(); - } - new File(path + "/duke.txt").createNewFile(); - } @@ -183,82 +86,8 @@ public static void main(String[] args) throws Exception, IOException, DukeExcept System.out.println("Hello from\n" + logo); printLineBreak(); System.out.println("Hello! I'm Duke\nWhat can I do for you?"); - String input; // to store raw input command - String[] inputArr; // to store split input command - boolean ifBye = false; - do { - printLineBreak(); - System.out.println(); - input = br.readLine(); - inputArr = input.split(" ", 2); // split first word from body - printLineBreak(); - switch (inputArr[0]) { - case "bye": - ifBye = true; - File dukeStore = new File(path + "/duke.txt"); - dukeStore.delete(); - saveAllTask(masterList, path + "/duke.txt"); - System.out.println("Bye. Hope to see you again soon!"); - break; - - case "list": - bw.write("Here are the tasks in your list:\n"); - printList(bw); - break; - - case "mark": - bw.write("Nice! I've marked this task as done:\n"); - int index = Integer.parseInt(inputArr[1]) - 1; - Task curr = masterList.get(index); // task to be marked - masterList.set(index, curr.markAsDone()); - bw.write(masterList.get(index).toString()); - bw.flush(); - break; - - case "unmark": - bw.write("OK, I've marked this task as not done yet:\n"); - int indexUnmark = Integer.parseInt(inputArr[1]) - 1; - Task currUnmark = masterList.get(indexUnmark); // task to be unmarked - masterList.set(indexUnmark, currUnmark.unmarkItem()); - bw.write(masterList.get(indexUnmark).toString()); - bw.flush(); - break; - - case "deadline": - masterList.add(new Deadlines(getDescription(inputArr), getDateTime(inputArr))); - System.out.println("Got it. I've added this task:\n\t " - + (masterList.get(masterList.size() - 1)).toString() - + "\nNow you have " + masterList.size() + " tasks in the list."); - break; - case "todo": - masterList.add(new ToDos(getDescription(inputArr))); - System.out.println("Got it. I've added this task:\n\t " - + (masterList.get(masterList.size() - 1)).toString() - + "\nNow you have " + masterList.size() + " tasks in the list."); - break; - case "event": - masterList.add(new Events(getDescription(inputArr), getDateTime(inputArr))); - System.out.println("Got it. I've added this task:\n\t " - + (masterList.get(masterList.size() - 1)).toString() - + "\nNow you have " + masterList.size() + " tasks in the list."); - break; - - case "delete": - bw.write("Noted. I've removed this task:\n\t"); - int indexDel = Integer.parseInt(inputArr[1]) - 1; - bw.write(masterList.remove(indexDel).toString()); - bw.write("\nNow you have " + masterList.size() + " tasks in list."); - bw.flush(); - break; - - - default: - throw new DukeException(":( OOPS!!! I'm sorry, but I don't know what that means!"); - } - } while (!ifBye); - printLineBreak(); } } diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index ad080ec62d..2f0c200db8 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -3,6 +3,9 @@ public class Parser { private final String ADD_SUCCESS = "Got it! I've added:\n\t"; + private final String MARK_SUCCESS = "Congrats on completing:\n\t"; + private final String UNMARK_SUCCESS = "Congrats on not completing:\n\t"; + private final String DELETE_SUCCESS = "Removed this task:\n\t"; private final String getDescription(String[] inputArr) { @@ -15,19 +18,19 @@ private final DateTime getDateTime(String[] inputArr) { // will reduce dateTimeArr to [yyyy, mm, dd, HHMM] } - private void addToStorage(Task task, Storage storage) { - storage.addTask(task); + private void addToTaskList(Task task, TaskList tasklist) { + tasklist.addTask(task); } - public String parse(String input, Storage storage) throws DukeException { + public String parse(String input, TaskList tasklist, Storage storage) throws DukeException { String[] inputArr = input.trim().split(" ", 2); // split first word from body switch(inputArr[0]) { case "todo": if (inputArr.length == 1) { throw new DukeException("todo simi?"); } - ToDos newToDo = new ToDos(getDescription(inputArr)) - addToStorage(newToDo, storage); + ToDos newToDo = new ToDos(getDescription(inputArr)); + addToTaskList(newToDo, tasklist); return ADD_SUCCESS + newToDo; case "event": @@ -35,7 +38,7 @@ public String parse(String input, Storage storage) throws DukeException { throw new DukeException("event description?"); } Events newEvent = new Events(getDescription(inputArr), getDateTime(inputArr)); - addToStorage(newEvent, storage); + addToTaskList(newEvent, tasklist); return ADD_SUCCESS + newEvent; case "deadline": @@ -45,45 +48,28 @@ public String parse(String input, Storage storage) throws DukeException { Deadlines newDeadline = new Deadlines(getDescription(inputArr), getDateTime(inputArr)); return ADD_SUCCESS + newDeadline; - default: - throw new DukeException(":( OOPS!!!! I'm sorry, but I don't know what that means!"); - } - } + case "list": + return tasklist.list(); - // parse input commands to create new To dos, Events or Deadlines - public Task parse(String commandType, String[] inputArr) throws DukeException { - switch (commandType) { - case "todo": - if (inputArr.length == 1) { - throw new DukeException("todo simi?"); - } - return new ToDos(getDescription(inputArr)); + case "bye": + storage.saveAllTasks(tasklist); + return "Sayonara~"; - case "event": - if (inputArr.length == 1) { - throw new DukeException("event description?"); - } - return new Events(getDescription(inputArr), getDateTime(inputArr)); + case "mark": + Task markedTask = tasklist.mark(Integer.parseInt(inputArr[1]) - 1); + return MARK_SUCCESS + markedTask; - case "deadline": - if (inputArr.length == 1) { - throw new DukeException("deadline when end?"); - } - return new Deadlines(getDescription(inputArr), getDateTime(inputArr)); + case "unmark": + Task unmarkedTask = tasklist.unmark(Integer.parseInt(inputArr[1]) - 1); + return UNMARK_SUCCESS + unmarkedTask; + case "delete": + Task deletedTask = tasklist.delete(Integer.parseInt(inputArr[1]) - 1); + return DELETE_SUCCESS + deletedTask; default: throw new DukeException(":( OOPS!!!! I'm sorry, but I don't know what that means!"); } - } - - public String parse(String commandType, Storage storage, String[] inputArr) { - switch(commandType) { - case "bye": - return "Sayonara~"; - - - } } } diff --git a/src/main/java/Storage.java b/src/main/java/Storage.java index 14d3059133..e20e974597 100644 --- a/src/main/java/Storage.java +++ b/src/main/java/Storage.java @@ -1,2 +1,108 @@ +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.nio.file.Paths; +import java.nio.file.Files; +import java.util.Scanner; + public class Storage { + private String filePath; + + Storage(String filePath) { + this.filePath = filePath; + } + + private Task convertStringToTask(String description) { + String[] splitDescription = description.split("\\|"); + String taskType = splitDescription[0]; + Task tempTask = new Task("Temp task"); + switch (taskType) { + case "T": + Task newToDo = new ToDos(splitDescription[2]); + if (splitDescription[1].equals("1")) { + newToDo.markAsDone(); + } + tempTask = newToDo; + break; + + case "D": + Task newDeadline = new Deadlines(splitDescription[2], new DateTime(splitDescription[3].split("[- ]"))); + if (splitDescription[1].equals("1")) { + newDeadline.markAsDone(); + } + tempTask = newDeadline; + break; + + case "E": + Task newEvent = new Events(splitDescription[2], new DateTime(splitDescription[3].split("[- ]"))); + if (splitDescription[1].equals("1")) { + newEvent.markAsDone(); + } + tempTask = newEvent; + break; + + default: + System.out.println("All tasks loaded!"); + + } + return tempTask; + } + + public ArrayList load() throws IOException { + String home = System.getProperty("user.home"); // base directory + // following code should give me [HOME_DIRECTORY]/Desktop/iP/data + java.nio.file.Path path = java.nio.file.Paths.get(home,"Desktop", "iP", "data"); + ArrayList masterList = new ArrayList<>(); + try { + File dukeStore = new File(path + this.filePath); + Scanner fileReader = new Scanner(dukeStore); + while (fileReader.hasNextLine()) { + masterList.add(convertStringToTask(fileReader.nextLine())); + } + } catch (IOException e) { + Path filePath = Paths.get("data"); + boolean isDirectoryExists = Files.exists(filePath); + if (!isDirectoryExists) { + new File("data").mkdir(); + } + new File(path + "/duke.txt").createNewFile(); + } + + return masterList; + } + + public void saveAllTask(TaskList tasklist) throws IOException { + FileWriter fw = new FileWriter(this.filePath); + for (int i = 0; i < tasklist.size(); i++) { + fw.write(taskToString(tasklist.get(i))); + fw.write("\n"); + } + fw.close(); + } + + private final String taskToString(Task task) { + String toReturn = ""; + if (task instanceof ToDos) { + toReturn += "T|"; + } else if (task instanceof Deadlines) { + toReturn += "D|"; + } else if (task instanceof Events) { + toReturn += "E|"; + } + if (task.isDone) { + toReturn += "1|"; + } else { + toReturn += "0|"; + } + toReturn += task.description.trim(); + if (task instanceof Deadlines || task instanceof Events) { + String[] durationArr = task.toString().split("[:)]"); + String duration = durationArr[1].split(" ")[1]; + toReturn += "|" + duration; + } + return toReturn; + } + } diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 1e7aed1c05..d286e6774c 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -1,2 +1,55 @@ +import java.util.ArrayList; + public class TaskList { + private final String LIST_INIT = "Here are the task:\n"; + private ArrayList masterList; + + public TaskList(ArrayList list) { + this.masterList = list; + } + + public TaskList() { + this.masterList = new ArrayList<>(); + } + + public int size() { + return this.masterList.size(); + } + + public Task get(int index) { + return this.masterList.get(index); + } + + public void addTask(Task task) { + masterList.add(task); + } + + public String list() { + String toPrint = LIST_INIT; + for (int i = 0; i < masterList.size(); i++) { + Task currTask = masterList.get(i); + toPrint += currTask + "\n"; + } + return toPrint; + } + + public Task mark(int index) { + Task currTask = masterList.get(index); + currTask.markAsDone(); + masterList.set(index, currTask); + return currTask; + } + + public Task unmark(int index) { + Task currTask = masterList.get(index); + currTask.unmarkItem(); + masterList.set(index, currTask); + return currTask; + } + + public Task delete(int index) { + Task currTask = masterList.get(index); + masterList.remove(index); + return currTask; + } } From 5d04bbfcf9360b1f3fb88cb066bb5ece73cdeec8 Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Thu, 17 Mar 2022 22:56:40 +0800 Subject: [PATCH 22/38] Complete MoreOOP --- data/tasks.txt | 2 ++ src/main/java/DateTime.java | 18 ++++++++++++++++-- src/main/java/Deadlines.java | 5 ++++- src/main/java/Duke.java | 35 +++-------------------------------- src/main/java/Events.java | 6 +++++- src/main/java/Parser.java | 4 +++- src/main/java/Storage.java | 27 +++++++++++++++++---------- src/main/java/TaskList.java | 2 +- src/main/java/Ui.java | 1 + 9 files changed, 52 insertions(+), 48 deletions(-) create mode 100644 data/tasks.txt diff --git a/data/tasks.txt b/data/tasks.txt new file mode 100644 index 0000000000..13f2922eed --- /dev/null +++ b/data/tasks.txt @@ -0,0 +1,2 @@ +T|1|eat apple +D|0|submit iP|1111-11-11-11-11 diff --git a/src/main/java/DateTime.java b/src/main/java/DateTime.java index 2d392184f3..9d1a1e4e5f 100644 --- a/src/main/java/DateTime.java +++ b/src/main/java/DateTime.java @@ -7,8 +7,8 @@ public class DateTime { this.dateTime = LocalDateTime.of(Integer.parseInt(dateTimeArr[0]) , Integer.parseInt(dateTimeArr[1]) , Integer.parseInt(dateTimeArr[2]) - , Integer.parseInt(dateTimeArr[3].substring(0, 2)) - , Integer.parseInt(dateTimeArr[3].substring(2))); + , Integer.parseInt(dateTimeArr[3]) + , Integer.parseInt(dateTimeArr[4])); } @Override @@ -25,4 +25,18 @@ public String toString() { + this.dateTime.getHour() + ":" + minutes; } + + public String dateTimeForStorage() { + String toBeStored = ""; + toBeStored = this.dateTime.getYear() + + "-" + + this.dateTime.getMonthValue() + + "-" + + this.dateTime.getDayOfMonth() + + "-" + + this.dateTime.getHour() + + "-" + + this.dateTime.getMinute(); + return toBeStored; + } } diff --git a/src/main/java/Deadlines.java b/src/main/java/Deadlines.java index f155084b4d..0ac24cf818 100644 --- a/src/main/java/Deadlines.java +++ b/src/main/java/Deadlines.java @@ -12,8 +12,11 @@ public Deadlines(String description, DateTime deadline) { this.deadline = deadline; } + public String getDateTimeForStorage() { + return this.deadline.dateTimeForStorage(); + } @Override public String toString() { - return "[D]" + super.toString() + "(by: " + this.deadline.toString() + ")"; + return "[D]" + super.toString() + " (by: " + this.deadline.toString() + ")"; } } diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 0f86fcdc76..486fd4fa0c 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -32,7 +32,7 @@ public Duke(String filePath) { try { tasks = new TaskList(storage.load()); } catch (DukeException e) { - ui.showLoadingError(); + System.out.println(e.getMessage()); tasks = new TaskList(); } catch (IOException e) { System.out.println(e.getMessage()); @@ -49,7 +49,7 @@ public void run() { try { String input = br.readLine(); parserOutput = parser.parse(input, this.tasks, this.storage); - System.out.println(); + System.out.println(parserOutput); } catch (DukeException e) { System.out.println(e.getMessage()); } catch (IOException e) { @@ -57,37 +57,8 @@ public void run() { } } } - /** - * Prints line break. - * @return void - */ - private static final void printLineBreak() { - System.out.println(LINE_BREAK); - } - - /** - * Prints Master List - * @param bw BufferedWriter from main to print out the Master List. - * @throws java.io.IOException If an I/O error occurs. Only takes in string. - */ - - public static void main(String[] args) { - - - - - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - printLineBreak(); - System.out.println("Hello! I'm Duke\nWhat can I do for you?"); - - - + new Duke("/tasks.txt").run(); } } diff --git a/src/main/java/Events.java b/src/main/java/Events.java index 81f41478ca..c98e100156 100644 --- a/src/main/java/Events.java +++ b/src/main/java/Events.java @@ -13,8 +13,12 @@ public Events(String description, DateTime duration) { this.duration = duration; } + public String getDateTimeForStorage() { + return this.duration.dateTimeForStorage(); + } + @Override public String toString() { - return "[E]" + super.toString() + "(at: " + this.duration.toString() + ")"; + return "[E]" + super.toString() + " (at: " + this.duration.toString() + ")"; } } diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index 2f0c200db8..73c3c841bb 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -1,3 +1,4 @@ +import java.io.IOException; import java.util.Arrays; public class Parser { @@ -22,7 +23,7 @@ private void addToTaskList(Task task, TaskList tasklist) { tasklist.addTask(task); } - public String parse(String input, TaskList tasklist, Storage storage) throws DukeException { + public String parse(String input, TaskList tasklist, Storage storage) throws DukeException, IOException { String[] inputArr = input.trim().split(" ", 2); // split first word from body switch(inputArr[0]) { case "todo": @@ -46,6 +47,7 @@ public String parse(String input, TaskList tasklist, Storage storage) throws Duk throw new DukeException("deadline when end?"); } Deadlines newDeadline = new Deadlines(getDescription(inputArr), getDateTime(inputArr)); + addToTaskList(newDeadline, tasklist); return ADD_SUCCESS + newDeadline; case "list": diff --git a/src/main/java/Storage.java b/src/main/java/Storage.java index e20e974597..76f044773a 100644 --- a/src/main/java/Storage.java +++ b/src/main/java/Storage.java @@ -9,9 +9,13 @@ public class Storage { private String filePath; + private Path path; Storage(String filePath) { this.filePath = filePath; + String home = System.getProperty("user.home"); // base directory + // following code should give me [HOME_DIRECTORY]/Desktop/iP/data + this.path = java.nio.file.Paths.get(home,"Desktop", "iP", "data"); } private Task convertStringToTask(String description) { @@ -50,13 +54,10 @@ private Task convertStringToTask(String description) { return tempTask; } - public ArrayList load() throws IOException { - String home = System.getProperty("user.home"); // base directory - // following code should give me [HOME_DIRECTORY]/Desktop/iP/data - java.nio.file.Path path = java.nio.file.Paths.get(home,"Desktop", "iP", "data"); + public ArrayList load() throws IOException, DukeException { ArrayList masterList = new ArrayList<>(); try { - File dukeStore = new File(path + this.filePath); + File dukeStore = new File(this.path + this.filePath); Scanner fileReader = new Scanner(dukeStore); while (fileReader.hasNextLine()) { masterList.add(convertStringToTask(fileReader.nextLine())); @@ -68,13 +69,15 @@ public ArrayList load() throws IOException { new File("data").mkdir(); } new File(path + "/duke.txt").createNewFile(); + throw new DukeException("File not found. Creating new file..."); } return masterList; } - public void saveAllTask(TaskList tasklist) throws IOException { - FileWriter fw = new FileWriter(this.filePath); + public void saveAllTasks(TaskList tasklist) throws IOException { + File dukeStore = new File(this.path + this.filePath); + FileWriter fw = new FileWriter(dukeStore); for (int i = 0; i < tasklist.size(); i++) { fw.write(taskToString(tasklist.get(i))); fw.write("\n"); @@ -97,12 +100,16 @@ private final String taskToString(Task task) { toReturn += "0|"; } toReturn += task.description.trim(); - if (task instanceof Deadlines || task instanceof Events) { - String[] durationArr = task.toString().split("[:)]"); - String duration = durationArr[1].split(" ")[1]; + if (task instanceof Deadlines) { + String duration = ((Deadlines) task).getDateTimeForStorage(); + toReturn += "|" + duration; + } else if (task instanceof Events) { + String duration = ((Events) task).getDateTimeForStorage(); toReturn += "|" + duration; } return toReturn; } + + } diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index d286e6774c..99fe228fab 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -28,7 +28,7 @@ public String list() { String toPrint = LIST_INIT; for (int i = 0; i < masterList.size(); i++) { Task currTask = masterList.get(i); - toPrint += currTask + "\n"; + toPrint += "\t" + (i + 1) + ". " + currTask + "\n"; } return toPrint; } diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index d22627f790..b1c2f3ba16 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -21,4 +21,5 @@ private final void printLineBreak() { System.out.println(this.lineBreak); } + } From bb998d24663ed3f1bfc206e29434fb4fcda197aa Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Thu, 17 Mar 2022 23:13:14 +0800 Subject: [PATCH 23/38] Place all class in duke package --- src/main/java/Duke.class | Bin 986 -> 0 bytes src/main/java/{ => duke}/DateTime.java | 2 ++ src/main/java/{ => duke}/Deadlines.java | 2 ++ src/main/java/{ => duke}/Duke.java | 2 ++ src/main/java/{ => duke}/DukeException.java | 2 ++ src/main/java/{ => duke}/Events.java | 2 ++ src/main/java/{ => duke}/Parser.java | 2 ++ src/main/java/{ => duke}/Storage.java | 2 ++ src/main/java/{ => duke}/Task.java | 2 ++ src/main/java/{ => duke}/TaskList.java | 2 ++ src/main/java/{ => duke}/ToDos.java | 2 ++ src/main/java/{ => duke}/Ui.java | 2 ++ 12 files changed, 22 insertions(+) delete mode 100644 src/main/java/Duke.class rename src/main/java/{ => duke}/DateTime.java (98%) rename src/main/java/{ => duke}/Deadlines.java (97%) rename src/main/java/{ => duke}/Duke.java (99%) rename src/main/java/{ => duke}/DukeException.java (95%) rename src/main/java/{ => duke}/Events.java (97%) rename src/main/java/{ => duke}/Parser.java (99%) rename src/main/java/{ => duke}/Storage.java (99%) rename src/main/java/{ => duke}/Task.java (98%) rename src/main/java/{ => duke}/TaskList.java (98%) rename src/main/java/{ => duke}/ToDos.java (94%) rename src/main/java/{ => duke}/Ui.java (97%) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class deleted file mode 100644 index c5509fc1b5c86797f982519643570c65ff16e1db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 986 zcmaJ=QEw7K5dIb@2j^LkN^8~DRcVE`_WI@njSpg)nxHnJsSlD|7FgRW$1S;Anvn2A z{2Th9Ngwkbk3;4s{^<@1?#{oiLZilMJ|p zr+8-IxrGvTD8(phVo&q?*t(W&JqI<0p_V-=mm1JPF)oIy>@%u_rg})xtD4xw3kK^{ zdYT3K{a6Q0*_wX7Pj8Fm)(TNWF`_WyZQtTg>K z(MW(r9Zai9yDgH8yu= Date: Thu, 17 Mar 2022 23:19:49 +0800 Subject: [PATCH 24/38] Create JAR files --- src/main/java/META-INF/MANIFEST.MF | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/main/java/META-INF/MANIFEST.MF diff --git a/src/main/java/META-INF/MANIFEST.MF b/src/main/java/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..2c9a9745c5 --- /dev/null +++ b/src/main/java/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: duke.Duke + From 1ece1cde127041eada893fd5e91bf806de96d2d7 Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Fri, 18 Mar 2022 14:18:59 +0800 Subject: [PATCH 25/38] Add javadocs --- data/duke.txt | 4 ---- src/main/java/duke/DateTime.java | 8 ++++++++ src/main/java/duke/Deadlines.java | 5 +++++ src/main/java/duke/Duke.java | 3 +++ src/main/java/duke/Events.java | 5 +++++ src/main/java/duke/Parser.java | 31 +++++++++++++++++++++++++++++++ src/main/java/duke/Storage.java | 30 +++++++++++++++++++++++++++++- src/main/java/duke/TaskList.java | 26 ++++++++++++++++++++++++++ src/main/java/duke/Ui.java | 3 +++ 9 files changed, 110 insertions(+), 5 deletions(-) delete mode 100644 data/duke.txt diff --git a/data/duke.txt b/data/duke.txt deleted file mode 100644 index 33889d02cc..0000000000 --- a/data/duke.txt +++ /dev/null @@ -1,4 +0,0 @@ -T|0|buy apple -T|1|sell pear -D|0|cry |2022-12-12 1900 -E|0|party |2022-12-30 1550 diff --git a/src/main/java/duke/DateTime.java b/src/main/java/duke/DateTime.java index a23b559eb0..037648690b 100644 --- a/src/main/java/duke/DateTime.java +++ b/src/main/java/duke/DateTime.java @@ -2,6 +2,9 @@ import java.time.*; +/** + * DateTime object handles the storage and reading of date and time in Java format (YYYY-MM-DD HH:MM) + */ public class DateTime { private final LocalDateTime dateTime; @@ -28,6 +31,11 @@ public String toString() { + minutes; } + /** + * Changes the date time in YYYY-MM-DD HH:MM into String for writing into Storage + * + * @return String format of dateTime (YYYY-MM-DD-HH-MM) + */ public String dateTimeForStorage() { String toBeStored = ""; toBeStored = this.dateTime.getYear() diff --git a/src/main/java/duke/Deadlines.java b/src/main/java/duke/Deadlines.java index 901c5e1600..5c682ac271 100644 --- a/src/main/java/duke/Deadlines.java +++ b/src/main/java/duke/Deadlines.java @@ -14,6 +14,11 @@ public Deadlines(String description, DateTime deadline) { this.deadline = deadline; } + /** + * Gets date and time of this Deadlines object + * + * @return date and time in String format + */ public String getDateTimeForStorage() { return this.deadline.dateTimeForStorage(); } diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 9267044c19..940ec4bf8f 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -41,6 +41,9 @@ public Duke(String filePath) { } } + /** + * Runs Duke to receive commands until command "bye" is given + */ public void run() { this.ui.initUi(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); diff --git a/src/main/java/duke/Events.java b/src/main/java/duke/Events.java index 890c820eb8..b30d57c5a8 100644 --- a/src/main/java/duke/Events.java +++ b/src/main/java/duke/Events.java @@ -15,6 +15,11 @@ public Events(String description, DateTime duration) { this.duration = duration; } + /** + * Gets date and time of this Events object + * + * @return Date and time in String format + */ public String getDateTimeForStorage() { return this.duration.dateTimeForStorage(); } diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index 692ce92268..f16ec7e846 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -3,6 +3,9 @@ import java.io.IOException; import java.util.Arrays; +/** + * Handles the raw input from user to create the corresponding objects + */ public class Parser { private final String ADD_SUCCESS = "Got it! I've added:\n\t"; @@ -11,20 +14,48 @@ public class Parser { private final String DELETE_SUCCESS = "Removed this task:\n\t"; + /** + * Gets the description from the raw input given by user + * + * @param inputArr raw input with command word, description and date time + * @return String of description of input only + */ private final String getDescription(String[] inputArr) { return inputArr[1].split("/")[0]; // split input from slash } + /** + * Gets date and time from the raw input given by the user + * + * @param inputArr raw input with command word, description and date time + * @return DateTime of input only + */ private final DateTime getDateTime(String[] inputArr) { String[] dateTimeArr = inputArr[1].split("/")[1].split("[- ]"); // [String, yyyy, mm, dd, HHMM] return new DateTime(Arrays.copyOfRange(dateTimeArr, 1, dateTimeArr.length)); // will reduce dateTimeArr to [yyyy, mm, dd, HHMM] } + /** + * Adds given task into tasklist + * + * @param task Task to be added + * @param tasklist Tasklist to be store the new task + */ private void addToTaskList(Task task, TaskList tasklist) { tasklist.addTask(task); } + /** + * Makes sense of the input given by the user + * + * @param input Raw input given by user + * @param tasklist Tasklist where tasks are to be updated + * @param storage Holds the backend storage of the file + * @return String of the result of the task executed + * @throws DukeException Incorrect use/format of Duke commands + * @throws IOException Missing file/null error + */ public String parse(String input, TaskList tasklist, Storage storage) throws DukeException, IOException { String[] inputArr = input.trim().split(" ", 2); // split first word from body switch(inputArr[0]) { diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java index 1d468a393f..c14d13b6a4 100644 --- a/src/main/java/duke/Storage.java +++ b/src/main/java/duke/Storage.java @@ -9,6 +9,9 @@ import java.nio.file.Files; import java.util.Scanner; +/** + * Holds the filepath to the file in which the data will be stored + */ public class Storage { private String filePath; private Path path; @@ -20,6 +23,12 @@ public class Storage { this.path = java.nio.file.Paths.get(home,"Desktop", "iP", "data"); } + /** + * Converts String stored in the database to create tasks when booting up Duke + * + * @param description Line read from the data file + * @return A task which will be added to the Tasklist + */ private Task convertStringToTask(String description) { String[] splitDescription = description.split("\\|"); String taskType = splitDescription[0]; @@ -56,6 +65,13 @@ private Task convertStringToTask(String description) { return tempTask; } + /** + * Read the data file and store it into an ArrayList + * + * @return An ArrayList of Tasks + * @throws IOException Missing file + * @throws DukeException Missing file + */ public ArrayList load() throws IOException, DukeException { ArrayList masterList = new ArrayList<>(); try { @@ -70,13 +86,19 @@ public ArrayList load() throws IOException, DukeException { if (!isDirectoryExists) { new File("data").mkdir(); } - new File(path + "/duke.txt").createNewFile(); + new File(path + "/tasks.txt").createNewFile(); throw new DukeException("File not found. Creating new file..."); } return masterList; } + /** + * Save all tasks before exiting Duke + * + * @param tasklist List of tasks to be saved + * @throws IOException Missing file + */ public void saveAllTasks(TaskList tasklist) throws IOException { File dukeStore = new File(this.path + this.filePath); FileWriter fw = new FileWriter(dukeStore); @@ -87,6 +109,12 @@ public void saveAllTasks(TaskList tasklist) throws IOException { fw.close(); } + /** + * Converts a task to String for storage purposes + * + * @param task Task to be converted to String to be stored + * @return String of Task + */ private final String taskToString(Task task) { String toReturn = ""; if (task instanceof ToDos) { diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index aee3650eb1..05a72f844e 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -2,6 +2,9 @@ import java.util.ArrayList; +/** + * Handles the current list of Tasks while Duke is running + */ public class TaskList { private final String LIST_INIT = "Here are the task:\n"; private ArrayList masterList; @@ -26,6 +29,11 @@ public void addTask(Task task) { masterList.add(task); } + /** + * Shows the list of existing tasks + * + * @return String of list of tasks + */ public String list() { String toPrint = LIST_INIT; for (int i = 0; i < masterList.size(); i++) { @@ -35,6 +43,12 @@ public String list() { return toPrint; } + /** + * Mark a task as done + * + * @param index Index of task in masterList + * @return Task marked as done + */ public Task mark(int index) { Task currTask = masterList.get(index); currTask.markAsDone(); @@ -42,6 +56,12 @@ public Task mark(int index) { return currTask; } + /** + * Mark a task as undone + * + * @param index Index of task in masterList + * @return Task marked as undone + */ public Task unmark(int index) { Task currTask = masterList.get(index); currTask.unmarkItem(); @@ -49,6 +69,12 @@ public Task unmark(int index) { return currTask; } + /** + * Delete a task + * + * @param index Index of task in masterList + * @return Deleted task + */ public Task delete(int index) { Task currTask = masterList.get(index); masterList.remove(index); diff --git a/src/main/java/duke/Ui.java b/src/main/java/duke/Ui.java index bca387788e..9a39fc3752 100644 --- a/src/main/java/duke/Ui.java +++ b/src/main/java/duke/Ui.java @@ -1,5 +1,8 @@ package duke; +/** + * Handles the visual interaction with the user + */ public class Ui { private final String LOGO = " ____ _ \n" + "| _ \\ _ _| | _____ \n" From 9ef56c0fbe63516ff7a629e8abe4cb17852dd982 Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Fri, 18 Mar 2022 14:39:49 +0800 Subject: [PATCH 26/38] Update Duke to reflect coding standards --- src/main/java/duke/Deadlines.java | 1 + src/main/java/duke/Duke.java | 12 +++++------- src/main/java/duke/Events.java | 1 - 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/duke/Deadlines.java b/src/main/java/duke/Deadlines.java index 5c682ac271..d402ad6539 100644 --- a/src/main/java/duke/Deadlines.java +++ b/src/main/java/duke/Deadlines.java @@ -22,6 +22,7 @@ public Deadlines(String description, DateTime deadline) { public String getDateTimeForStorage() { return this.deadline.dateTimeForStorage(); } + @Override public String toString() { return "[D]" + super.toString() + " (by: " + this.deadline.toString() + ")"; diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 940ec4bf8f..ea6847f7fe 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,13 +1,11 @@ package duke; -import java.io.*; -import java.nio.Buffer; -import java.nio.file.Path; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; import java.util.ArrayList; -import java.nio.file.Paths; -import java.nio.file.Files; -import java.util.Scanner; -import java.util.Arrays; /** diff --git a/src/main/java/duke/Events.java b/src/main/java/duke/Events.java index b30d57c5a8..7ad46f7e53 100644 --- a/src/main/java/duke/Events.java +++ b/src/main/java/duke/Events.java @@ -9,7 +9,6 @@ public class Events extends Task { private final DateTime duration; - public Events(String description, DateTime duration) { super(description); this.duration = duration; From 07c59e8641ca7d08eb4739bb8ab9202f6880abfa Mon Sep 17 00:00:00 2001 From: AdrianOngJJ Date: Mon, 21 Mar 2022 22:02:46 +0800 Subject: [PATCH 27/38] Add default GUI --- build.gradle | 14 +++ src/main/java/duke/DialogBox.java | 47 +++++++++ src/main/java/duke/Duke.java | 135 ++++++++++++++++++++++++- src/main/java/duke/Launcher.java | 12 +++ src/main/resources/images/isabell.png | Bin 0 -> 107812 bytes src/main/resources/images/kkslider.png | Bin 0 -> 97704 bytes 6 files changed, 207 insertions(+), 1 deletion(-) create mode 100644 src/main/java/duke/DialogBox.java create mode 100644 src/main/java/duke/Launcher.java create mode 100644 src/main/resources/images/isabell.png create mode 100644 src/main/resources/images/kkslider.png diff --git a/build.gradle b/build.gradle index 20c0521cc7..1ce991c762 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,20 @@ repositories { } dependencies { + String javaFxVersion = '11' + + implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'linux' + implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'linux' + implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'linux' + implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'linux' testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.5.0' testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.5.0' } diff --git a/src/main/java/duke/DialogBox.java b/src/main/java/duke/DialogBox.java new file mode 100644 index 0000000000..44abed7dc1 --- /dev/null +++ b/src/main/java/duke/DialogBox.java @@ -0,0 +1,47 @@ +package duke; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.geometry.Pos; +import javafx.scene.Node; +import javafx.scene.control.Label; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; + +public class DialogBox extends HBox { + + private Label text; + private ImageView displayPicture; + + public DialogBox(Label l, ImageView iv) { + text = l; + displayPicture = iv; + + text.setWrapText(true); + displayPicture.setFitWidth(100.0); + displayPicture.setFitHeight(100.0); + + this.setAlignment(Pos.TOP_RIGHT); + this.getChildren().addAll(text, displayPicture); + } + + /** + * Flips the dialog box such that the ImageView is on the left and text on the right. + */ + private void flip() { + this.setAlignment(Pos.TOP_LEFT); + ObservableList tmp = FXCollections.observableArrayList(this.getChildren()); + FXCollections.reverse(tmp); + this.getChildren().setAll(tmp); + } + + public static DialogBox getUserDialog(Label l, ImageView iv) { + return new DialogBox(l, iv); + } + + public static DialogBox getDukeDialog(Label l, ImageView iv) { + var db = new DialogBox(l, iv); + db.flip(); + return db; + } +} diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index ea6847f7fe..769d9ba0e9 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -6,6 +6,18 @@ import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.ArrayList; +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.layout.Region; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextField; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; /** @@ -17,13 +29,21 @@ * @version 0.1 * @since 22/1/2022 */ -public class Duke { +public class Duke extends Application { private static final String LINE_BREAK = "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"; private static ArrayList masterList = new ArrayList<>(); private Storage storage; private TaskList tasks; private Ui ui; private final String END_MESSAGE = "Sayonara~"; + private ScrollPane scrollPane; + private VBox dialogContainer; + private TextField userInput; + private Button sendButton; + private Scene scene; + private Image user = new Image(this.getClass().getResourceAsStream("/images/isabell.png")); + private Image duke = new Image(this.getClass().getResourceAsStream("/images/kkslider.png")); + public Duke(String filePath) { @@ -64,4 +84,117 @@ public void run() { public static void main(String[] args) { new Duke("/tasks.txt").run(); } + + public Duke() {} + + @Override + public void start(Stage stage) { + //Step 1. Setting up required components + + //The container for the content of the chat to scroll. + scrollPane = new ScrollPane(); + dialogContainer = new VBox(); + scrollPane.setContent(dialogContainer); + + userInput = new TextField(); + sendButton = new Button("Send"); + + AnchorPane mainLayout = new AnchorPane(); + mainLayout.getChildren().addAll(scrollPane, userInput, sendButton); + + scene = new Scene(mainLayout); + + stage.setScene(scene); + stage.show(); + + //Step 2. Formatting the window to look as expected + stage.setTitle("Duke"); + stage.setResizable(false); + stage.setMinHeight(600.0); + stage.setMinWidth(400.0); + + mainLayout.setPrefSize(400.0, 600.0); + + scrollPane.setPrefSize(385, 535); + scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); + scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS); + + scrollPane.setVvalue(1.0); + scrollPane.setFitToWidth(true); + + // You will need to import `javafx.scene.layout.Region` for this. + dialogContainer.setPrefHeight(Region.USE_COMPUTED_SIZE); + + userInput.setPrefWidth(325.0); + + sendButton.setPrefWidth(55.0); + + AnchorPane.setTopAnchor(scrollPane, 1.0); + + AnchorPane.setBottomAnchor(sendButton, 1.0); + AnchorPane.setRightAnchor(sendButton, 1.0); + + AnchorPane.setLeftAnchor(userInput , 1.0); + AnchorPane.setBottomAnchor(userInput, 1.0); + + //Step 3. Add functionality to handle user input. + sendButton.setOnMouseClicked((event) -> { + dialogContainer.getChildren().add(getDialogLabel(userInput.getText())); + userInput.clear(); + }); + + userInput.setOnAction((event) -> { + dialogContainer.getChildren().add(getDialogLabel(userInput.getText())); + userInput.clear(); + }); + + //Scroll down to the end every time dialogContainer's height changes. + dialogContainer.heightProperty().addListener((observable) -> scrollPane.setVvalue(1.0)); + + //Part 3. Add functionality to handle user input. + sendButton.setOnMouseClicked((event) -> { + handleUserInput(); + }); + + userInput.setOnAction((event) -> { + handleUserInput(); + }); + } + + /** + * Iteration 1: + * Creates a label with the specified text and adds it to the dialog container. + * @param text String containing text to add + * @return a label with the specified text that has word wrap enabled. + */ + private Label getDialogLabel(String text) { + // You will need to import `javafx.scene.control.Label`. + Label textToAdd = new Label(text); + textToAdd.setWrapText(true); + + return textToAdd; + } + + /** + * Iteration 2: + * Creates two dialog boxes, one echoing user input and the other containing Duke's reply and then appends them to + * the dialog container. Clears the user input after processing. + */ + private void handleUserInput() { + Label userText = new Label(userInput.getText()); + Label dukeText = new Label(getResponse(userInput.getText())); + dialogContainer.getChildren().addAll( + DialogBox.getUserDialog(userText, new ImageView(user)), + DialogBox.getDukeDialog(dukeText, new ImageView(duke)) + ); + userInput.clear(); + } + + /** + * You should have your own function to generate a response to user input. + * Replace this stub with your completed method. + */ + private String getResponse(String input) { + return "Duke heard: " + input; + } } diff --git a/src/main/java/duke/Launcher.java b/src/main/java/duke/Launcher.java new file mode 100644 index 0000000000..cef3c40d17 --- /dev/null +++ b/src/main/java/duke/Launcher.java @@ -0,0 +1,12 @@ +package duke; + +import javafx.application.Application; + +/** + * A launcher class to workaround classpath issues. + */ +public class Launcher { + public static void main(String[] args) { + Application.launch(Duke.class, args); + } +} \ No newline at end of file diff --git a/src/main/resources/images/isabell.png b/src/main/resources/images/isabell.png new file mode 100644 index 0000000000000000000000000000000000000000..f6dc18d189f743cf3341680b31b1f6f2065f18d4 GIT binary patch literal 107812 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Êjko97Or&u78CbIC5&ov0|0 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 Eg6~b5eEnnm};Z-~kfc3GNR6&HL9!O~Dq$ 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 Date: Fri, 25 Mar 2022 19:29:35 +0800 Subject: [PATCH 28/38] Add GUI --- config/checkstyle/checkstyle.xml | 403 ++++++++++++++++++++++++ config/checkstyle/suppressions.xml | 10 + data/tasks.txt | 1 + src/main/java/duke/DialogBox.java | 55 ++-- src/main/java/duke/Duke.java | 20 +- src/main/java/duke/Launcher.java | 2 +- src/main/java/duke/Main.java | 31 ++ src/main/java/duke/MainWindow.java | 51 +++ src/main/resources/view/DialogBox.fxml | 16 + src/main/resources/view/MainWindow.fxml | 19 ++ 10 files changed, 582 insertions(+), 26 deletions(-) create mode 100644 config/checkstyle/checkstyle.xml create mode 100644 config/checkstyle/suppressions.xml create mode 100644 src/main/java/duke/Main.java create mode 100644 src/main/java/duke/MainWindow.java create mode 100644 src/main/resources/view/DialogBox.fxml create mode 100644 src/main/resources/view/MainWindow.fxml diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml new file mode 100644 index 0000000000..4e2eb84de9 --- /dev/null +++ b/config/checkstyle/checkstyle.xml @@ -0,0 +1,403 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/config/checkstyle/suppressions.xml b/config/checkstyle/suppressions.xml new file mode 100644 index 0000000000..135ea49ee0 --- /dev/null +++ b/config/checkstyle/suppressions.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/data/tasks.txt b/data/tasks.txt index 13f2922eed..8bb9ba95f7 100644 --- a/data/tasks.txt +++ b/data/tasks.txt @@ -1,2 +1,3 @@ T|1|eat apple D|0|submit iP|1111-11-11-11-11 +T|0|eat snake diff --git a/src/main/java/duke/DialogBox.java b/src/main/java/duke/DialogBox.java index 44abed7dc1..70d7fd65bc 100644 --- a/src/main/java/duke/DialogBox.java +++ b/src/main/java/duke/DialogBox.java @@ -1,47 +1,62 @@ package duke; +import java.io.IOException; +import java.util.Collections; + +import duke.MainWindow; import javafx.collections.FXCollections; import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.control.Label; +import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.HBox; +/** + * An example of a custom control using FXML. + * This control represents a dialog box consisting of an ImageView to represent the speaker's face and a label + * containing text from the speaker. + */ public class DialogBox extends HBox { - - private Label text; + @FXML + private Label dialog; + @FXML private ImageView displayPicture; - public DialogBox(Label l, ImageView iv) { - text = l; - displayPicture = iv; - - text.setWrapText(true); - displayPicture.setFitWidth(100.0); - displayPicture.setFitHeight(100.0); - - this.setAlignment(Pos.TOP_RIGHT); - this.getChildren().addAll(text, displayPicture); + private DialogBox(String text, Image img) { + try { + FXMLLoader fxmlLoader = new FXMLLoader(MainWindow.class.getResource("/view/DialogBox.fxml")); + fxmlLoader.setController(this); + fxmlLoader.setRoot(this); + fxmlLoader.load(); + } catch (IOException e) { + e.printStackTrace(); + } + + dialog.setText(text); + displayPicture.setImage(img); } /** * Flips the dialog box such that the ImageView is on the left and text on the right. */ private void flip() { - this.setAlignment(Pos.TOP_LEFT); ObservableList tmp = FXCollections.observableArrayList(this.getChildren()); - FXCollections.reverse(tmp); - this.getChildren().setAll(tmp); + Collections.reverse(tmp); + getChildren().setAll(tmp); + setAlignment(Pos.TOP_LEFT); } - public static DialogBox getUserDialog(Label l, ImageView iv) { - return new DialogBox(l, iv); + public static DialogBox getUserDialog(String text, Image img) { + return new DialogBox(text, img); } - public static DialogBox getDukeDialog(Label l, ImageView iv) { - var db = new DialogBox(l, iv); + public static DialogBox getDukeDialog(String text, Image img) { + var db = new DialogBox(text, img); db.flip(); return db; } -} +} \ No newline at end of file diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 769d9ba0e9..ab8415de61 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -34,6 +34,7 @@ public class Duke extends Application { private static ArrayList masterList = new ArrayList<>(); private Storage storage; private TaskList tasks; + private Parser parser; private Ui ui; private final String END_MESSAGE = "Sayonara~"; private ScrollPane scrollPane; @@ -49,6 +50,7 @@ public class Duke extends Application { public Duke(String filePath) { this.ui = new Ui(LINE_BREAK); storage = new Storage(filePath); + this.parser = new Parser(); try { tasks = new TaskList(storage.load()); } catch (DukeException e) { @@ -63,7 +65,7 @@ public Duke(String filePath) { * Runs Duke to receive commands until command "bye" is given */ public void run() { - this.ui.initUi(); +// this.ui.initUi(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); Parser parser = new Parser(); @@ -184,8 +186,8 @@ private void handleUserInput() { Label userText = new Label(userInput.getText()); Label dukeText = new Label(getResponse(userInput.getText())); dialogContainer.getChildren().addAll( - DialogBox.getUserDialog(userText, new ImageView(user)), - DialogBox.getDukeDialog(dukeText, new ImageView(duke)) + DialogBox.getUserDialog(userText.toString(), new ImageView(user).getImage()), + DialogBox.getDukeDialog(dukeText.toString(), new ImageView(duke).getImage()) ); userInput.clear(); } @@ -194,7 +196,15 @@ private void handleUserInput() { * You should have your own function to generate a response to user input. * Replace this stub with your completed method. */ - private String getResponse(String input) { - return "Duke heard: " + input; + public String getResponse(String input) { + String toReturn = ""; + try { + toReturn = parser.parse(input, this.tasks, this.storage); + } catch (DukeException e) { + System.out.println(e.getMessage()); + } catch (IOException e) { + System.out.println(e.getMessage()); + } + return toReturn; } } diff --git a/src/main/java/duke/Launcher.java b/src/main/java/duke/Launcher.java index cef3c40d17..5483e63637 100644 --- a/src/main/java/duke/Launcher.java +++ b/src/main/java/duke/Launcher.java @@ -7,6 +7,6 @@ */ public class Launcher { public static void main(String[] args) { - Application.launch(Duke.class, args); + Application.launch(Main.class, args); } } \ No newline at end of file diff --git a/src/main/java/duke/Main.java b/src/main/java/duke/Main.java new file mode 100644 index 0000000000..779319b930 --- /dev/null +++ b/src/main/java/duke/Main.java @@ -0,0 +1,31 @@ +package duke; + +import java.io.IOException; + +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.layout.AnchorPane; +import javafx.stage.Stage; + +/** + * A GUI for Duke using FXML. + */ +public class Main extends Application { + + private Duke duke = new Duke("/tasks.txt"); + + @Override + public void start(Stage stage) { + try { + FXMLLoader fxmlLoader = new FXMLLoader(Main.class.getResource("/view/MainWindow.fxml")); + AnchorPane ap = fxmlLoader.load(); + Scene scene = new Scene(ap); + stage.setScene(scene); + fxmlLoader.getController().setDuke(duke); + stage.show(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/duke/MainWindow.java b/src/main/java/duke/MainWindow.java new file mode 100644 index 0000000000..5851151286 --- /dev/null +++ b/src/main/java/duke/MainWindow.java @@ -0,0 +1,51 @@ +package duke; + +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextField; +import javafx.scene.image.Image; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.VBox; +/** + * Controller for MainWindow. Provides the layout for the other controls. + */ +public class MainWindow extends AnchorPane { + @FXML + private ScrollPane scrollPane; + @FXML + private VBox dialogContainer; + @FXML + private TextField userInput; + @FXML + private Button sendButton; + + private Duke duke; + + private Image userImage = new Image(this.getClass().getResourceAsStream("/images/isabell.png")); + private Image dukeImage = new Image(this.getClass().getResourceAsStream("/images/kkslider.png")); + + @FXML + public void initialize() { + scrollPane.vvalueProperty().bind(dialogContainer.heightProperty()); + } + + public void setDuke(Duke d) { + duke = d; + } + + /** + * Creates two dialog boxes, one echoing user input and the other containing Duke's reply and then appends them to + * the dialog container. Clears the user input after processing. + */ + @FXML + private void handleUserInput() { + String input = userInput.getText(); + String response = duke.getResponse(input); + dialogContainer.getChildren().addAll( + DialogBox.getUserDialog(input, userImage), + DialogBox.getDukeDialog(response, dukeImage) + ); + userInput.clear(); + } +} diff --git a/src/main/resources/view/DialogBox.fxml b/src/main/resources/view/DialogBox.fxml new file mode 100644 index 0000000000..e433809947 --- /dev/null +++ b/src/main/resources/view/DialogBox.fxml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/view/MainWindow.fxml b/src/main/resources/view/MainWindow.fxml new file mode 100644 index 0000000000..832f84382e --- /dev/null +++ b/src/main/resources/view/MainWindow.fxml @@ -0,0 +1,19 @@ + + + + + + + + + + + +