MAIN CLASS:
import [Link].*;
import [Link].*;
public class Todo {
public static Scanner sc = new Scanner([Link]);
public static ArrayList<Task> tasks = new ArrayList<>();
public static String currentUsername = "";
public static int taskCounter = 1;
public static void main(String[] args) throws IOException {
login();
loadTasks();
sortTasks();
while (true) {
[Link]("\nTo Do List App");
if ([Link]() == 0) {
[Link]("No task yet, you are doing great :)");
} else {
Task mostUrgent = [Link](0);
[Link]("MOST URGENT TASK!!: \"" + [Link]() + "\"
(Due: " + [Link]() + ")");
}
[Link]("[1] View Entries");
[Link]("[2] Edit Entries");
[Link]("[3] Exit");
[Link]("Choose: ");
String choice = [Link]();
switch (choice) {
case "1":
viewEntries();
break;
case "2":
editEntries();
break;
case "3":
[Link]("Exiting...");
return;
default:
[Link]("Invalid choice.");
}
}
}
public static void login() throws IOException {
while (true) {
[Link]("---- LABORER'S TO-DO-LIST APPLICATION ----");
[Link]("[1] Login | [2] Register");
String option = [Link]();
if ([Link]("2")) {
while (true) {
[Link]("Enter new username: ");
currentUsername = [Link]();
File userFolder = new File(currentUsername);
if ([Link]()) {
[Link]("Username already exists. Try another.");
} else {
[Link]();
[Link]("Enter password: ");
String password = [Link]();
FileWriter writer = new FileWriter(new File(userFolder, "[Link]"));
[Link](password);
[Link]();
[Link]("Registration successful! You are now logged in as " +
currentUsername);
break;
}
}
} else if ([Link]("1")) {
while (true) {
[Link]("Enter username: ");
currentUsername = [Link]();
File userFolder = new File(currentUsername);
if (![Link]()) {
[Link]("Username not found. Try again.");
break;
} else {
[Link]("Enter password: ");
String password = [Link]();
File passFile = new File(userFolder, "[Link]");
Scanner passReader = new Scanner(passFile);
String storedPass = [Link]();
[Link]();
if ([Link](storedPass)) {
[Link]("Login successful!");
return;
} else {
[Link]("Incorrect password.");
break;
}
}
}
}
}
}
public static void loadTasks() throws IOException {
File userFolder = new File(currentUsername);
if (![Link]()) {
[Link]();
}
File[] files = [Link]((dir, name) -> [Link](".txt") &&
);
if (files == null) {
return;
}
for (File file : files) {
Scanner reader = new Scanner(file);
int id = [Link]([Link]());
String group = [Link]();
boolean completed = [Link]([Link]());
String dueDate = [Link]();
String header = [Link]();
String description = [Link]();
[Link](new Task(id, group, completed, dueDate, header, description));
if (id >= taskCounter) {
taskCounter = id + 1;
}
[Link]();
}
}
public static void sortTasks() {
for (int i = 0; i < [Link](); i++) {
for (int j = i + 1; j < [Link](); j++) {
Task task1 = [Link](i);
Task task2 = [Link](j);
if ([Link]() != [Link]()) {
if ([Link]()) {
[Link](i, task2);
[Link](j, task1);
}
} else {
if ([Link]().compareTo([Link]()) > 0) {
[Link](i, task2);
[Link](j, task1);
}
}
}
}
}
public static void viewEntries() {
sortTasks();
[Link]("%-9s %-10s %-10s %-15s %-20s\n", "List No.", "Group", "Status",
"Due Date", "Header");
[Link]("--------------------------------------------------------------------------");
if ([Link]() == 0) {
[Link]("No tasks available.");
} else {
int listNumber = 1;
for (Task task : tasks) {
[Link]("%-9d %-10s %-10s %-15s %-20s\n",
listNumber,
[Link](),
[Link](),
[Link](),
[Link]().length() > 17 ? [Link]().substring(0, 17) + "..." :
[Link]()
);
listNumber++;
}
}
[Link]("--------------------------------------------------------------------------");
String choice = "";
while ( && ) {
[Link]("[1] View Task | [4] Return");
[Link]("Choice: ");
choice = [Link]();
if ( && ) {
[Link]("Invalid choice. Please enter 1 or 4.");
}
}
if ([Link]("1")) {
[Link]("Enter Task Number: ");
String input = [Link]();
int num = [Link](input);
viewTask(num);
}
}
public static void viewTask(int num) {
if (num <= 0 || num > [Link]()) {
[Link]("Task not found.");
return;
}
Task t = [Link](num - 1);
[Link]("\n--- VIEWING TASK " + num + " ---");
[Link]("[" + [Link]() + "] " + [Link]());
[Link]([Link]());
[Link]("press any key to return");
[Link]();
}
public static void editEntries() throws IOException {
sortTasks();
[Link]("%-9s %-10s %-10s %-15s %-20s\n", "List No.", "Group", "Status",
"Due Date", "Header");
[Link]("--------------------------------------------------------------------------");
if ([Link]() == 0) {
[Link]("No tasks available.");
} else {
int listNumber = 1;
for (Task task : tasks) {
[Link]("%-9d %-10s %-10s %-15s %-20s\n",
listNumber,
[Link](),
[Link](),
[Link](),
[Link]().length() > 17 ? [Link]().substring(0, 17) + "..." :
[Link]()
);
listNumber++;
}
}
[Link]("--------------------------------------------------------------------------");
String choice = "";
while ( &&  &&  &&
) {
[Link]("[1] Add Task | [2] Edit Task | [3] Remove Task/s | [7] Return");
[Link]("Choice: ");
choice = [Link]();
if ( &&  &&  &&
) {
[Link]("Invalid choice.");
}
}
switch (choice) {
case "1":
addTask();
break;
case "2":
editTask();
break;
case "3":
removeTask();
break;
case "7":
break;
}
}
public static void editTask() throws IOException {
[Link]("Enter Task Number (List no.) to Edit: ");
int index = [Link]([Link]()) - 1;
if (index < 0 || index >= [Link]()) {
[Link]("Invalid task number.");
return;
}
Task task = [Link](index);
[Link]("\n-- Editing Task: " + [Link]());
[Link]("Enter new header (leave blank to keep current): ");
String newHeader = [Link]();
boolean hasHeader = false;
for (int i = 0; i < [Link](); i++) {
if ([Link](i) != ' ') {
hasHeader = true;
break;
}
}
if (hasHeader) {
[Link](newHeader);
}
[Link]("Enter new due date (yyyy-mm-dd, leave blank to keep current): ");
String newDate = [Link]();
boolean hasDate = false;
for (int i = 0; i < [Link](); i++) {
if ([Link](i) != ' ') {
hasDate = true;
break;
}
}
if (hasDate) {
[Link](newDate);
}
[Link]("Enter new description (leave blank to keep current): ");
String newDesc = [Link]();
boolean hasDesc = false;
for (int i = 0; i < [Link](); i++) {
if ([Link](i) != ' ') {
hasDesc = true;
break;
}
}
if (hasDesc) {
[Link](newDesc);
}
[Link]("Mark as completed? (yes/no): ");
String status = [Link]();
if ([Link]("yes")) {
[Link](true);
} else if ([Link]("no")) {
[Link](false);
}
File userFolder = new File(currentUsername);
File taskFile = new File(userFolder, "task" + [Link]() + ".txt");
FileWriter fw = new FileWriter(taskFile);
[Link]([Link]() + "\n");
[Link]([Link]() + "\n");
[Link]([Link]() + "\n");
[Link]([Link]() + "\n");
[Link]([Link]() + "\n");
[Link]([Link]() + "\n");
[Link]();
[Link]("Task updated successfully!");
sortTasks();
}
public static void removeTask() {
[Link]("\n---- Remove Task/s ----");
[Link]("How many do you want to remove?");
[Link]("[1] Single");
[Link]("[2] Multiple");
[Link]("[3] All");
[Link]("[4] Return");
[Link]("Choice: ");
String choice = [Link]();
if ([Link]("1")) {
[Link]("%-9s %-10s %-10s %-15s %-20s\n", "List No.", "Group", "Status",
"Due Date", "Header");
[Link]("--------------------------------------------------------------------------");
if ([Link]() == 0) {
[Link]("No tasks available.");
} else {
int listNumber = 1;
for (Task task : tasks) {
[Link]("%-9d %-10s %-10s %-15s %-20s\n",
listNumber,
[Link](),
[Link](),
[Link](),
[Link]().length() > 17 ? [Link]().substring(0, 17) + "..." :
[Link]()
);
listNumber++;
}
}
[Link]("--------------------------------------------------------------------------");
[Link]("Enter Task Number (List No.): ");
int index = [Link]([Link]()) - 1;
if (index < 0 || index >= [Link]()) {
[Link]("Invalid task number.");
return;
}
Task removed = [Link](index);
[Link]("Are you sure you want to remove \"" + [Link]() +
"\"? (yes/no): ");
String confirm = [Link]();
if ([Link]("yes")) {
[Link](index);
File userFolder = new File(currentUsername);
File taskFile = new File(userFolder, "task" + [Link]() + ".txt");
if ([Link]()) {
[Link]();
}
[Link]("Removed: " + [Link]());
} else {
[Link]("Cancelled.");
}
} else if ([Link]("2")) {
[Link]("%-9s %-10s %-10s %-15s %-20s\n", "List No.", "Group", "Status",
"Due Date", "Header");
[Link]("--------------------------------------------------------------------------");
if ([Link]() == 0) {
[Link]("No tasks available.");
} else {
int listNumber = 1;
for (Task task : tasks) {
[Link]("%-9d %-10s %-10s %-15s %-20s\n",
listNumber,
[Link](),
[Link](),
[Link](),
[Link]().length() > 17 ? [Link]().substring(0, 17) + "..." :
[Link]()
);
listNumber++;
}
}
[Link]("--------------------------------------------------------------------------");
[Link]("Enter Task Numbers (ex. [1, 3, 5]): ");
String input = [Link]();
input = [Link]("[", "").replace("]", "").replace(",", " ");
String[] parts = [Link](" ");
ArrayList<Integer> indexes = new ArrayList<>();
for (String part : parts) {
if () {
int val = [Link](part) - 1;
if (val >= 0 && val < [Link]()) {
[Link](val);
}
}
}
if ([Link]() == 0) {
[Link]("No valid task numbers provided.");
return;
}
[Link]("Are you sure you want to remove these " + [Link]() + "
tasks? (yes/no): ");
String confirm = [Link]();
if ([Link]("yes")) {
for (int i = 0; i < [Link]() - 1; i++) {
for (int j = i + 1; j < [Link](); j++) {
if ([Link](i) < [Link](j)) {
int temp = [Link](i);
[Link](i, [Link](j));
[Link](j, temp);
}
}
}
for (int idx : indexes) {
Task removed = [Link](idx);
File userFolder = new File(currentUsername);
File taskFile = new File(userFolder, "task" + [Link]() + ".txt");
if ([Link]()) {
[Link]();
}
[Link]("Removed: " + [Link]());
[Link](idx);
}
} else {
[Link]("Cancelled.");
}
} else if ([Link]("3")) {
[Link]("%-9s %-10s %-10s %-15s %-20s\n", "List No.", "Group", "Status",
"Due Date", "Header");
[Link]("--------------------------------------------------------------------------");
if ([Link]() == 0) {
[Link]("No tasks available.");
} else {
int listNumber = 1;
for (Task task : tasks) {
[Link]("%-9d %-10s %-10s %-15s %-20s\n",
listNumber,
[Link](),
[Link](),
[Link](),
[Link]().length() > 17 ? [Link]().substring(0, 17) + "..." :
[Link]()
);
listNumber++;
}
}
[Link]("--------------------------------------------------------------------------");
if ([Link]() == 0) {
[Link]("There are no tasks to remove.");
return;
}
[Link]("Are you sure you want to remove ALL tasks? (yes/no): ");
String confirm = [Link]();
if ([Link]("yes")) {
for (Task task : tasks) {
File userFolder = new File(currentUsername);
File taskFile = new File(userFolder, "task" + [Link]() + ".txt");
if ([Link]()) {
[Link]();
}
}
[Link]();
[Link]("All tasks removed.");
} else {
[Link]("Cancelled.");
}
} else if ([Link]("4")) {
return;
} else {
[Link]("Invalid choice.");
}
sortTasks();
}
public static void addTask() throws IOException {
[Link]("\n---- ADD TASK ----");
String group = chooseGroup();
boolean completed = false;
[Link]("Due Date (YYYY-MM-DD): ");
String dueDate = [Link]();
[Link]("Header: ");
String header = [Link]();
[Link]("Description: ");
String description = [Link]();
Task newTask = new Task(taskCounter, group, completed, dueDate, header,
description);
[Link](newTask);
File userFolder = new File(currentUsername);
File file = new File(userFolder, "task" + taskCounter + ".txt");
FileWriter fw = new FileWriter(file);
[Link](taskCounter + "\n");
[Link](group + "\n");
[Link](completed + "\n");
[Link](dueDate + "\n");
[Link](header + "\n");
[Link](description + "\n");
[Link]();
sortTasks();
[Link]("Task saved!");
taskCounter++;
}
public static String chooseGroup() {
String input = "";
while ( &&  &&  &&
) {
[Link]("Group:\n[1] Work\n[2] School\n[3] House\n[4] Other");
[Link]("Choose group: ");
input = [Link]();
if ( &&  &&  &&
) {
[Link]("Invalid choice.");
}
}
switch (input) {
case "1":
return "Work";
case "2":
return "School";
case "3":
return "House";
case "4":
return "Other";
}
return "Other";
}
}
ENTRY CLASS:
public abstract class Entry {
protected int id;
protected String header;
protected String description;
public Entry(int id, String header, String description) {
[Link] = id;
[Link] = header;
[Link] = description;
}
public int getId() {
return id;
}
public String getHeader() {
return header;
}
public void setHeader(String header) {
[Link] = header;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
[Link] = description;
}
public abstract String getDetails();
}
TASK CLASS:
public class Task extends Entry {
private String group;
private boolean isCompleted;
private String dueDate;
public Task(int id, String group, boolean isCompleted, String dueDate, String header,
String description) {
super(id, header, description);
[Link] = group;
[Link] = isCompleted;
[Link] = dueDate;
}
public String getStatusIcon() {
return isCompleted ? "/" : "X";
}
public String getDetails() {
return [Link]("Group: %s\nStatus: %s\nDue Date: %s\nHeader:
%s\nDescription: %s",
group, getStatusIcon(), dueDate, header, description);
}
public String getGroup() {
return group;
}
public void setGroup(String group) {
[Link] = group;
}
public boolean isIsCompleted() {
return isCompleted;
}
public void setIsCompleted(boolean isCompleted) {
[Link] = isCompleted;
}
public String getDueDate() {
return dueDate;
}
public void setDueDate(String dueDate) {
[Link] = dueDate;
}
@Override
public String toString() {
return [Link]("%d %s %s %s %s", id, group, getStatusIcon(), dueDate, header);
}
}