Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ChangruHenryQian] iP #544

Open
wants to merge 59 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
28ad2b8
Add Gradle support
May 24, 2020
ed6d4d2
Bump gradle and lib version
Eclipse-Dominator Aug 5, 2023
5080e17
Finish Level 0. Rename, Greet, Exit.
Aug 24, 2023
3d4a50f
Finish Level-1: Echo
Aug 24, 2023
fe29b0f
Finish Level 2. Add, List
Aug 26, 2023
02481a9
Finish Level 3. Mark as Done
Aug 27, 2023
91639a8
Finish Level 4. ToDos, Events, Deadlines
Aug 27, 2023
cab0141
Finish A-TextUiTesting
Aug 27, 2023
28266b3
Finish Level 5. Handle Errors
Aug 27, 2023
611f1ef
Finish Level 6. Delete
Aug 27, 2023
4197612
Finish Level 7. Save
Sep 5, 2023
c0ea8a2
Update data/duke.txt
Sep 5, 2023
bf86dc1
Merge branch 'branch-Level-7'
Sep 5, 2023
992ec01
Finish Level 8. Dates and Times
Sep 9, 2023
113e1d3
Merge branch 'branch-Level-8'
Sep 9, 2023
1f284c9
Finish A-MoreOOP: Use More OOP
Sep 9, 2023
92e988c
Fix bug on delete command
Sep 9, 2023
5c4a3ba
Finish A-Packages: Organize into Packages
Sep 9, 2023
d197fc2
Merge branch 'add-gradle-support'
Sep 9, 2023
e450bed
Finish A-Gradle: Use Gradle
Sep 9, 2023
2a0dedd
Finish A-JUnit: Add JUnit Tests
Sep 9, 2023
8ac5391
Finish A-Jar: Create a JAR File
Sep 9, 2023
dcc4829
Add part of Java Doc.
Sep 10, 2023
98baa49
Merge branch 'branch-A-JavaDoc'
Sep 10, 2023
cb8b5d6
Merge branch 'master' into branch-A-CodingStandard
Sep 10, 2023
a011a9e
Implement coding standard.
Sep 10, 2023
af45b36
Merge branch 'branch-A-CodingStandard'
Sep 10, 2023
b0af1ec
Update JavaDoc
Sep 10, 2023
1d67ccf
Merge branch 'branch-A-JavaDoc'
Sep 10, 2023
b47f650
Update JavaDoc
Sep 10, 2023
8e4c58e
Merge branch 'branch-A-JavaDoc'
Sep 10, 2023
c529dc9
Start Level 9. Find
Sep 10, 2023
b88d605
Merge branch 'master' into branch-Level-9
Sep 10, 2023
cfc25a9
Implement Level 9. Find
Sep 10, 2023
2a192a3
Merge branch 'branch-Level-9'
Sep 10, 2023
9ff4bbc
Start Level 10. GUI
Sep 10, 2023
76ab079
Implement Level 10. GUI
Sep 10, 2023
d1c94f8
Merge branch 'branch-Level-10'
Sep 10, 2023
3b3712a
Update build.gradle
Sep 15, 2023
b76decc
Implement A-Assertions
Sep 15, 2023
59658eb
Improve code quality
Sep 15, 2023
e20422e
Merge pull request #1 from ChangruHenryQian/branch-A-CodeQuality
ChangruHenryQian Sep 15, 2023
f1c1337
Merge branch 'master' into branch-A-Assertions
Sep 15, 2023
ed26f34
Merge pull request #2 from ChangruHenryQian/branch-A-Assertions
ChangruHenryQian Sep 15, 2023
a146f5a
Implement B-FixedDurationTasks
Sep 16, 2023
fe210a3
Add welcome message into GUI
Sep 18, 2023
b761c70
Add a representative screenshot
Sep 18, 2023
3f8b8db
Implement A-UserGuide: User Guide
Sep 18, 2023
9e2ec38
Update user guide
Sep 19, 2023
925e859
Implement CheckStyle
Sep 21, 2023
5c6a409
Add test cases
Sep 21, 2023
950bfdf
Update test cases
Sep 21, 2023
b02a0ee
Update test cases
Sep 21, 2023
bf0487d
Improve JavaDoc
Sep 21, 2023
bac1dfd
Update README.md
Sep 21, 2023
3600c25
Improve JavaDoc
Sep 21, 2023
fd641b2
Update user guide
Sep 22, 2023
c32f9db
Add test cases
Sep 22, 2023
5e157e9
Update JavaDoc
Sep 22, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions data/duke.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
T | 1 | hihi
T | 0 | hihihi
22 changes: 22 additions & 0 deletions src/main/java/Deadline.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
public class Deadline extends Task {
private String by;
public Deadline(String description, String by) {
super(description);
this.by = by;
}

public Deadline(String description, boolean isDone, String by) {
super(description, isDone);
this.by = by;
}

@Override
public String toString() {
return "[D]" + super.toString() + " (by: " + this.by + ")";
}

@Override
public String toTxt() {
return "D | " + super.toTxt() + " | " + this.by;
}
}
174 changes: 168 additions & 6 deletions src/main/java/Duke.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,172 @@
import java.util.ArrayList;
import java.util.Scanner;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;

public class Duke {

private Storage storage;
private TaskList tasks;
private Ui ui = new Ui();
private static final String filePath = "./data/duke.txt";

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since it is a constant, may I suggest this change?

Suggested change
private static final String filePath = "./data/duke.txt";
private static final String FILE_PATH = "./data/duke.txt";



public static void main(String[] args) {
String logo = " ____ _ \n"
+ "| _ \\ _ _| | _____ \n"
+ "| | | | | | | |/ / _ \\\n"
+ "| |_| | |_| | < __/\n"
+ "|____/ \\__,_|_|\\_\\___|\n";
System.out.println("Hello from\n" + logo);
System.out.println("____________________________________________________________");
System.out.println(" Hello! I'm Jarvis");
System.out.println(" What can I do for you?");
System.out.println("____________________________________________________________");


ArrayList<Task> list;

try {
list = load();
} catch (IOException e) {
throw new DukeException("Unable to find file with data.");
}

Scanner userInput = new Scanner(System.in);
String command = userInput.nextLine();
while (!command.startsWith("bye")) {

try{
if (command.startsWith("list")) {
System.out.println("____________________________________________________________");
System.out.println(" Here are the tasks in your list:");
int counter = 0;
while (counter != list.size()) {
counter++;
System.out.println(" " + counter + "." + list.get(counter - 1).toString());
}
System.out.println("____________________________________________________________");
} else if (command.startsWith("mark")) {
list.get(Integer.valueOf(command.split(" ")[1]) - 1).markAsDone();
System.out.println("____________________________________________________________");
System.out.println(" Nice! I've marked this task as done:");
System.out.println(" " + list.get(Integer.valueOf(command.split(" ")[1]) - 1).toString());
System.out.println("____________________________________________________________");
rewriteFile(list);
} else if (command.startsWith("todo")) {
if (command.split(" ", 2).length == 1) {
throw new DukeException(" OOPS!!! The description of a todo cannot be empty.");
}
ToDo newToDo = new ToDo(command.split(" ", 2)[1]);
list.add(newToDo);
System.out.println("____________________________________________________________");
System.out.println(" Got it. I've added this task:");
System.out.println(" " + newToDo.toString());
System.out.println(" Now you have " + list.size() + " tasks in the list.");
System.out.println("____________________________________________________________");
addToFile(list);
} else if (command.startsWith("deadline")) {
String deadline = command.split(" /by ", 2)[1];
String name = command.split(" /by ", 2)[0].split(" ", 2)[1];
Deadline newDeadline = new Deadline(deadline, name);
list.add(newDeadline);
System.out.println("____________________________________________________________");
System.out.println(" Got it. I've added this task:");
System.out.println(" " + newDeadline.toString());
System.out.println(" Now you have " + list.size() + " tasks in the list.");
System.out.println("____________________________________________________________");
addToFile(list);
} else if (command.startsWith("event")) {
String startTime = command.split(" /from ", 2)[1]
.split(" /to ", 2)[0];
String endTime = command.split(" /to ", 2)[1];
String name = command.split(" /from ", 2)[0].split(" ", 2)[1];
Event newEvent = new Event(name, startTime, endTime);
list.add(newEvent);
System.out.println("____________________________________________________________");
System.out.println(" Got it. I've added this task:");
System.out.println(" " + newEvent.toString());
System.out.println(" Now you have " + list.size() + " tasks in the list.");
System.out.println("____________________________________________________________");
addToFile(list);
} else if (command.startsWith("delete")) {
Task re = list.remove(Integer.valueOf(command.split(" ")[1]) - 1);
System.out.println("____________________________________________________________");
System.out.println(" Noted. I've removed this task:");
System.out.println(" " + re.toString());
System.out.println(" Now you have " + list.size() + " tasks in the list.");
System.out.println("____________________________________________________________");
rewriteFile(list);
} else {
throw new DukeException(" OOPS!!! I'm sorry, but I don't know what that means :-(");
}
} catch (DukeException e) {
System.out.println("____________________________________________________________");
System.out.println(" " + e.getMessage());
System.out.println("____________________________________________________________");
} finally {
command = userInput.nextLine();
}
}

System.out.println("____________________________________________________________");
System.out.println(" Bye. Hope to see you again soon!");
System.out.println("____________________________________________________________");
}

public static ArrayList<Task> load() throws IOException {
File dir = new File("./data");
if (!dir.exists()) {
dir.mkdir();
}
File f = new File(filePath);
f.createNewFile();
Scanner s = new Scanner(f);
ArrayList<Task> tasks = new ArrayList<>();
while (s.hasNext()) {
tasks.add(addTask(s.nextLine()));
}
return tasks;
}

private static Task addTask(String input) {
String taskType = input.split(" \\| ")[0];
boolean isComplete = input.split(" \\| ")[1].equals("1");
String description = input.split(" \\| ")[2];
if (taskType.equals("T")) {
return new ToDo(description, isComplete);
} else if (taskType.equals("D")) {
return new Deadline(description, isComplete, input.split(" \\| ")[3]);
} else {
return new Event(description, isComplete, input.split(" \\| ")[3], input.split(" \\| ")[4]);
}
}


public static void addToFile(ArrayList<Task> list) throws DukeException {
try {
FileWriter fw = new FileWriter(filePath, true);
if (list.size() == 1) {
fw.write(list.get(0).toTxt());
} else {
fw.write("\n" + list.get(list.size() - 1).toTxt());
}
fw.close();
} catch (IOException e) {
throw new DukeException("Unable to write to file.");
}
}

public static void rewriteFile(ArrayList<Task> list) throws DukeException {
try {
FileWriter fw = new FileWriter(filePath);
for (int i = 0; i < list.size(); i++) {
if (i == list.size() - 1) {
fw.write(list.get(i).toTxt());
} else {
fw.write(list.get(i).toTxt() + "\n");
}
}
fw.close();
} catch (IOException e) {
throw new DukeException("Unable to write to file.");
}
}
}
5 changes: 5 additions & 0 deletions src/main/java/DukeException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
public class DukeException extends RuntimeException{
public DukeException(String message) {
super(message);
}
}
25 changes: 25 additions & 0 deletions src/main/java/Event.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
public class Event extends Task{
private String startTime;
private String endTime;
public Event(String description, String startTime, String endTime) {
super(description);
this.startTime = startTime;
this.endTime = endTime;
}

public Event(String description, boolean isDone, String startTime, String endTime) {
super(description, isDone);
this.startTime = startTime;
this.endTime = endTime;
}

@Override
public String toString() {
return "[E]" + super.toString() + " (from: " + startTime + " to: " + endTime + ")";
}

@Override
public String toTxt() {
return "E | " + super.toTxt() + " | " + this.startTime + " | " + this.endTime;
}
}
3 changes: 3 additions & 0 deletions src/main/java/Parser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
public class Parser {

}
74 changes: 74 additions & 0 deletions src/main/java/Storage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

public class Storage {
private String filePath;

public Storage(String filePath) {
this.filePath = filePath;
}

public ArrayList<Task> load() throws IOException {
File dir = new File("./data");
if (!dir.exists()) {
dir.mkdir();
}
File f = new File(filePath);
f.createNewFile();
Scanner s = new Scanner(f);
ArrayList<Task> tasks = new ArrayList<>();
while (s.hasNext()) {
tasks.add(addTask(s.nextLine()));
}
return tasks;
}

private Task addTask(String input) {
String taskType = input.split(" \\| ")[0];
boolean isComplete = input.split(" \\| ")[1].equals("1");
String description = input.split(" \\| ")[2];
if (taskType.equals("T")) {
return new ToDo(description, isComplete);
} else if (taskType.equals("D")) {
return new Deadline(description, isComplete, input.split(" \\| ")[3]);
} else {
return new Event(description, isComplete, input.split(" \\| ")[3], input.split(" \\| ")[4]);
}
}


public void addToFile(ArrayList<Task> list) throws DukeException {
try {
FileWriter fw = new FileWriter(filePath, true);
if (list.size() == 1) {
fw.write(list.get(0).toTxt());
} else {
fw.write("\n" + list.get(list.size() - 1).toTxt());
}
fw.close();
} catch (IOException e) {
throw new DukeException("Unable to write to file.");
}
}

public void rewriteFile(ArrayList<Task> list) throws DukeException {
try {
FileWriter fw = new FileWriter(filePath);
for (int i = 0; i < list.size(); i++) {
if (i == list.size() - 1) {
fw.write(list.get(i).toTxt());
} else {
fw.write(list.get(i).toTxt() + "\n");
}
}
fw.close();
} catch (IOException e) {
throw new DukeException("Unable to write to file.");
}
}
}

32 changes: 32 additions & 0 deletions src/main/java/Task.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
public class Task {
protected String description;
protected boolean isDone;

public Task(String description) {
this.description = description;
this.isDone = false;
}

public Task(String description, boolean isDone) {
this.description = description;
this.isDone = isDone;
}

public String getStatusIcon() {
return (isDone ? "X" : " "); // mark done task with X
}

public void markAsDone() {
this.isDone = true;
}

@Override
public String toString() {
return "[" + this.getStatusIcon() + "] " + this.description;
}

public String toTxt() {
return (this.isDone ? "1" : "0") + " | " + this.description;
}

}
17 changes: 17 additions & 0 deletions src/main/java/TaskList.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import java.util.ArrayList;

public class TaskList {
protected ArrayList<Task> tasks;

public TaskList() {
this.tasks = new ArrayList<>();
}

public TaskList(ArrayList<Task> tasks) {
this.tasks = tasks;
}

public boolean isEmpty() {
return tasks.isEmpty();
}
}
19 changes: 19 additions & 0 deletions src/main/java/ToDo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
public class ToDo extends Task {
public ToDo(String description) {
super(description);
}

public ToDo(String description, boolean isDone) {
super(description, isDone);
}

@Override
public String toString() {
return "[T]" + super.toString();
}

@Override
public String toTxt() {
return "T | " + super.toTxt();
}
}
2 changes: 2 additions & 0 deletions src/main/java/Ui.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
public class Ui {
}
Loading