Gitea Migration
This commit is contained in:
18
LICENSE
Normal file
18
LICENSE
Normal file
@@ -0,0 +1,18 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 rapturate
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
||||
associated documentation files (the "Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial
|
||||
portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
||||
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
|
||||
EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# To_Do_List
|
||||
|
||||
A console To Do List, written in Java, for a software development class. Shows my functional understanding of Java and organizational skills for code
|
||||
BIN
To_Do_List_Console.jar
Normal file
BIN
To_Do_List_Console.jar
Normal file
Binary file not shown.
6
bin/list.txt
Normal file
6
bin/list.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
Health, Doctors Appointment, 10/31/2025, 2
|
||||
Health, Dentist Appointment, 10/31/2025, 3
|
||||
School, School Visit, 11/22/2025, 3
|
||||
Rover, Sadie, 11/22/1995, 4
|
||||
Rover, Sadie and Finn, 09/10/2025, 4
|
||||
na, Dog Sit, 12/31/1969, 10
|
||||
224
src/Item.java
Normal file
224
src/Item.java
Normal file
@@ -0,0 +1,224 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
public class Item {
|
||||
private String category = " ";
|
||||
private String name;
|
||||
private Date dueDate;
|
||||
private int priority = 10;
|
||||
|
||||
//Constructors
|
||||
/**
|
||||
* Initializes an {@code Item} object.
|
||||
* <p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* Item item = new Item("Jump up and down");
|
||||
* }
|
||||
* @param String The name of the item to do.
|
||||
* @return {@code void}
|
||||
*/
|
||||
public Item(String name){
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public Item(String name, String category, String dateString, int priority){
|
||||
SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
|
||||
|
||||
this.name = name;
|
||||
this.category = category;
|
||||
try {
|
||||
this.dueDate = formatter.parse(dateString);
|
||||
} catch (ParseException e){
|
||||
System.out.println("Date formatting failed.");
|
||||
e.printStackTrace();
|
||||
}
|
||||
this.priority = priority;
|
||||
|
||||
}
|
||||
//Setters
|
||||
|
||||
// Method Signature: setCategoty(String) -> void
|
||||
// Purpose: sets the category name
|
||||
// Example: Item.setCategory("Health")
|
||||
|
||||
/**
|
||||
* Sets the {@code String category} field.
|
||||
* <p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* item.setCategory("Health");
|
||||
* }
|
||||
* @param String The String for {@code Private String category}.
|
||||
* @return {@code void}
|
||||
*/
|
||||
public void setCategory(String category){
|
||||
this.category = category;
|
||||
}
|
||||
|
||||
// Method Signature: setName(String) -> void
|
||||
// Purpose: sets the name of the event
|
||||
// Example: Item.setName("Workout")
|
||||
|
||||
/**
|
||||
* Sets the {@code private String name} field.
|
||||
* <p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* item.setName("Field Work");
|
||||
* }
|
||||
* @param String The String for {@code Private String name}.
|
||||
* @return {@code void}
|
||||
*/
|
||||
public void setName(String name){
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
// Method Signature: setDueDate(String) -> void
|
||||
// Purpose: sets the date. This class takes in a String, converts it into a Date and puts it into dueDate.
|
||||
// Default: if the date is input incorrectly, it defaults to 12/31/1969.
|
||||
// Example: Item.setCategory(dateString)
|
||||
|
||||
/**
|
||||
* Sets the {@code private Date dueDate} field.
|
||||
* <p>
|
||||
* The date MUST be formatted as MM/DD/YYYY.
|
||||
* <p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* item.setDueDate("MM/DD/YYYY");
|
||||
* }
|
||||
* @param String The String that will be formatted for {@code Private Date dueDate}.
|
||||
* @return {@code void}
|
||||
*/
|
||||
public void setDueDate(String dateString){
|
||||
SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
|
||||
Date date = new Date(0);
|
||||
try {
|
||||
date = formatter.parse(dateString);
|
||||
} catch (ParseException e){
|
||||
System.out.println("Bad Date format.");
|
||||
}
|
||||
|
||||
this.dueDate = date;
|
||||
}
|
||||
|
||||
// Method Signature: setPriority(int) -> void
|
||||
// Purpose: sets the priority on a scale of 1-10. 10 being the least important and 1 being the most.
|
||||
// Example: Item.setPriority(1)
|
||||
|
||||
/**
|
||||
* Sets the {@code private int priority} field.
|
||||
* <p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* item.setPriority(10);
|
||||
* }
|
||||
* @param int The integer for {@code Private String priority}.
|
||||
* @return {@code void}
|
||||
*/
|
||||
public void setPriority(int priority){
|
||||
this.priority = priority;
|
||||
}
|
||||
|
||||
|
||||
//Getters
|
||||
|
||||
/**
|
||||
* Gets the String stored in {@code private String category} field.
|
||||
* <p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* String category = item.getCategory();
|
||||
* }
|
||||
* @return {@code String}
|
||||
*/
|
||||
public String getCategory() {
|
||||
return this.category;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the String stored in {@code private String name} field.
|
||||
* <p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* String name = item.getName();
|
||||
* }
|
||||
* @return {@code String}
|
||||
*/
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the {@code Date} object stored in {@code private int dueDate} field.
|
||||
* <p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* Date dueDate = item.getDueDate();
|
||||
* }
|
||||
* @return {@code Date}
|
||||
*/
|
||||
public Date getDueDate() {
|
||||
return this.dueDate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the integer stored in {@code private int dueDate} field and converts it to a {@code String}.
|
||||
* <p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* String dueDateString = item.getDueDateString();
|
||||
* }
|
||||
* @return {@code String}
|
||||
*/
|
||||
public String getDueDateString(){
|
||||
SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
|
||||
return formatter.format(this.dueDate);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the integer stored in {@code private int priority} field.
|
||||
* <p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* int priority = item.getPriority();
|
||||
* }
|
||||
* @return {@code int}
|
||||
*/
|
||||
public int getPriority() {
|
||||
return this.priority;
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes all of the fields in {@code Item} and converts them to a formatted {@code String} for command line printing.
|
||||
* <p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* String itemString = item.formatString();
|
||||
* }
|
||||
* @return {@code String}: returns "" if there is no date
|
||||
*/
|
||||
public String formatString(){
|
||||
String dateString = "";
|
||||
|
||||
if(dueDate.compareTo(new Date(0)) != 0 ){ //If the compareTo funcioon returns 0 than the date is set to default which means 12/31/1969.
|
||||
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyy");
|
||||
dateString = format.format(this.dueDate);
|
||||
if(dateString.equals("12/31/1969")){
|
||||
dateString = "";
|
||||
}
|
||||
}
|
||||
if(this.category.equals("na")){
|
||||
this.category = "";
|
||||
}
|
||||
|
||||
return String.format("%-23s %-20s %-12s %-10d\n", this.name, this.category, dateString, this.priority);
|
||||
}
|
||||
}
|
||||
21
src/MainLoop.java
Normal file
21
src/MainLoop.java
Normal file
@@ -0,0 +1,21 @@
|
||||
import java.util.Scanner;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Lewis Price
|
||||
* @since 1.0
|
||||
*/
|
||||
|
||||
public class MainLoop {
|
||||
public static void main(String[] args) {
|
||||
String listPath;
|
||||
System.out.println("Enter the path to where you want the todo list file to be.");
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
listPath = scanner.next();
|
||||
|
||||
UserInterface ui = new UserInterface(listPath);
|
||||
ui.run();
|
||||
|
||||
scanner.close();
|
||||
}
|
||||
}
|
||||
481
src/ToDoList.java
Normal file
481
src/ToDoList.java
Normal file
@@ -0,0 +1,481 @@
|
||||
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.InputMismatchException;
|
||||
import java.util.Scanner;
|
||||
|
||||
public class ToDoList {
|
||||
private ArrayList<Item> listArr;
|
||||
private String pathName;
|
||||
private Scanner scanner;
|
||||
private String listHeader = String.format("%-23s %-20s %-12s %-10s\n----------------------------------------------------------------------------------------------------\n"
|
||||
, "Name", "Category", "Date", "Priority");
|
||||
private String footer = "----------------------------------------------------------------------------------------------------\n";
|
||||
|
||||
//Constructor
|
||||
/**
|
||||
* Constructor for creating a new ToDoList.
|
||||
*
|
||||
* {@snippet :
|
||||
* ToDoList list = new ToDoList( [filePath] , [Scanner Object] );
|
||||
* }
|
||||
*
|
||||
* @param pathName Takes the path of the list.txt file to open or create a new file.
|
||||
* @param Scanner Scanner passthrough to prevent {@code Scanner} clashes.
|
||||
*/
|
||||
public ToDoList(String pathName, Scanner scanner){
|
||||
listArr = new ArrayList<Item>();
|
||||
this.pathName = pathName;
|
||||
this.scanner = scanner;
|
||||
openList();
|
||||
}
|
||||
|
||||
//Setters
|
||||
/**
|
||||
* Used by the system to add a new {@code Item} to the {@code ArrayList<Item>}
|
||||
*
|
||||
* {@snippet :
|
||||
* list.addItem( [item] );
|
||||
* }
|
||||
*
|
||||
* @param Item The {@code Item} being added to the {@code ArrayList<Item>}
|
||||
* @return void
|
||||
*/
|
||||
private void addItem(Item item){
|
||||
listArr.add(item);
|
||||
}
|
||||
|
||||
/**
|
||||
* Used by the system to create a header for console output.
|
||||
*
|
||||
* {@snippet :
|
||||
* formatHeader( "Add Item" );
|
||||
* }
|
||||
*
|
||||
* @param String: the name of the page that needs a header output string.
|
||||
* @return {@code String header}
|
||||
*/
|
||||
private String formatHeader(String pageName){
|
||||
String formatedHeader = "";
|
||||
int i;
|
||||
for(i = 0; i < (50 - pageName.length()/2); i++){
|
||||
formatedHeader += "-";
|
||||
}
|
||||
formatedHeader += pageName;
|
||||
|
||||
for( i += pageName.length(); i < 100; i++){
|
||||
formatedHeader += "-";
|
||||
}
|
||||
formatedHeader += "\n";
|
||||
return formatedHeader;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Begins the System output and input to create and add a new {@code Item} to {@code ArrayList<Item>}.
|
||||
* <p>
|
||||
* Usage
|
||||
* {@snippet :
|
||||
* list.addItemAction();
|
||||
* }
|
||||
* <p>
|
||||
* -------------
|
||||
* <p>
|
||||
* Defaults:
|
||||
* <p>
|
||||
* Date: 12/31/1969
|
||||
* <p>
|
||||
* - This date is read by the system as null and won't be visibly printed.
|
||||
* <p>
|
||||
* Category: "na"
|
||||
* <p>
|
||||
* - "na" is read by the system as null and won't be visibly printed.
|
||||
* <p>
|
||||
* Priority: 10
|
||||
* <p>
|
||||
* - Priority 10 is the least important therefore the default if not provided.
|
||||
*
|
||||
* @return void, but prints messages to console.
|
||||
*/
|
||||
public void addItemAction() {
|
||||
System.out.println(formatHeader("Add Item"));
|
||||
System.out.print("Name (Required): ");
|
||||
String name = scanner.nextLine();
|
||||
Item newItem = new Item(name);
|
||||
|
||||
|
||||
System.out.print("Category: ");
|
||||
String category = scanner.nextLine();
|
||||
if(category.equals("na") || category.equals("")) {
|
||||
category = "na";
|
||||
}
|
||||
newItem.setCategory(category);
|
||||
|
||||
System.out.print("Date (MM/DD/YYYY): ");
|
||||
String dateString = scanner.nextLine();
|
||||
|
||||
if(dateString.equals("na") || dateString.equals("")) {
|
||||
newItem.setDueDate("12/31/1969"); //defaults to 12/31/1969
|
||||
} else {
|
||||
newItem.setDueDate(dateString);
|
||||
}
|
||||
|
||||
System.out.print("Priority: ");
|
||||
String priority = scanner.nextLine();
|
||||
try {
|
||||
Integer.parseInt(priority);
|
||||
} catch (NumberFormatException e){
|
||||
priority = "10";
|
||||
}
|
||||
|
||||
if(priority.equals("")){
|
||||
priority = "10";
|
||||
}else if(Integer.parseInt(priority) < 1 || Integer.parseInt(priority) > 10) {
|
||||
System.out.println("Priority out of range, defaulted to 10.");
|
||||
priority = "10";
|
||||
}
|
||||
|
||||
newItem.setPriority(Integer.parseInt(priority));
|
||||
addItem(newItem);
|
||||
System.out.println("\n\nAdded:\n" + listHeader + newItem.formatString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes a {@code String} to create an {@code Item} to {@code ArrayList<Item>}.
|
||||
* <p>
|
||||
* This function must include a all {@code Item} parameters.
|
||||
* <p>
|
||||
* Usage
|
||||
* {@snippet :
|
||||
* list.addItemAction({@code "name, category, date, priority");
|
||||
* }
|
||||
* <p>
|
||||
*
|
||||
* @param String, parses this string into different sections to create a new {@code Item}
|
||||
* @return void, but prints messages to console.
|
||||
*/
|
||||
public void addItemByString(String inputString) {
|
||||
String[] parsedString = inputString.split(", ");
|
||||
Item newItem = new Item(parsedString[0], parsedString[1], parsedString[2], Integer.parseInt(parsedString[3]));
|
||||
addItem(newItem);
|
||||
System.out.println("\n\nAdded:\n" + listHeader + newItem.formatString());
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Formats, displays, and deletes an {@code Item} from user input from {@code ArrayList<Item>}.
|
||||
* <p>
|
||||
* Does not save to the txt file. See {@code saveChanges()}.
|
||||
*<p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* list.deleteItem();
|
||||
* }
|
||||
*
|
||||
* @return void, but prints to console.
|
||||
*/
|
||||
public void deleteItem(){
|
||||
System.out.println(formatHeader("Delete Item"));
|
||||
System.out.println("Type one name and all items by that name will be removed.");
|
||||
System.out.print("Name: ");
|
||||
String name = scanner.nextLine();
|
||||
ArrayList<Item> tempList = new ArrayList<>();
|
||||
ArrayList<Item> deletedItems = new ArrayList<>();
|
||||
|
||||
//Deletes
|
||||
for(Item list: listArr){
|
||||
if(!list.getName().equalsIgnoreCase(name)){
|
||||
tempList.add(list);
|
||||
} else {
|
||||
deletedItems.add(list);
|
||||
}
|
||||
}
|
||||
|
||||
if(deletedItems.size() > 0){
|
||||
System.out.println(formatHeader("Deleted Items"));
|
||||
for(Item list: deletedItems){
|
||||
System.out.print(list.formatString());
|
||||
}
|
||||
System.out.print(footer);
|
||||
listArr = tempList;
|
||||
saveChanges();
|
||||
} else {
|
||||
System.out.println("No item by that name.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats, displays, and changes an {@code Item} from user input from {@code ArrayList<Item>}.
|
||||
* <p>
|
||||
* Does not save to the txt file. See {@code saveChanges()}.
|
||||
*<p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* list.changeItem();
|
||||
* }
|
||||
*
|
||||
* @return void, but prints to console.
|
||||
*/
|
||||
public void changeItem(){
|
||||
System.out.println(formatHeader("Change Item"));
|
||||
ArrayList<Item> alteredItems = new ArrayList<>();
|
||||
System.out.println();
|
||||
|
||||
System.out.println("Type the name of the item you'd like to change.");
|
||||
System.out.print("Name: ");
|
||||
String name = scanner.nextLine();
|
||||
|
||||
System.out.println("What aspect would you like to change?");
|
||||
System.out.println("Type 'Name', 'Category', 'Date' or 'Priority'.");
|
||||
System.out.print("Response: ");
|
||||
String response = scanner.nextLine();
|
||||
|
||||
int changeCount = 0;
|
||||
|
||||
//Change Name
|
||||
if(response.equalsIgnoreCase("Name")){
|
||||
System.out.print("New Name: ");
|
||||
String newName = scanner.nextLine();
|
||||
|
||||
for(Item changedItem : listArr){
|
||||
if(changedItem.getName().equalsIgnoreCase(name)){
|
||||
alteredItems.add(changedItem);
|
||||
changedItem.setName(newName);
|
||||
changeCount++;
|
||||
}
|
||||
}
|
||||
System.out.println(String.format("%d item(s) changed", changeCount));
|
||||
|
||||
//Change Category
|
||||
} else if(response.equalsIgnoreCase("Category")){
|
||||
System.out.print("\nNew Category Name: ");
|
||||
String newCatName = scanner.nextLine();
|
||||
for(Item changedItem : listArr){
|
||||
if(changedItem.getName().equalsIgnoreCase(name)){
|
||||
alteredItems.add(changedItem);
|
||||
changedItem.setCategory(newCatName);
|
||||
changeCount++;
|
||||
}
|
||||
}
|
||||
System.out.println(String.format("%d item(s) changed", changeCount));
|
||||
|
||||
//Change Date
|
||||
} else if(response.equalsIgnoreCase("Date")){
|
||||
System.out.print("New Date (MM/DD/YYY): ");
|
||||
String dateString = scanner.nextLine();
|
||||
for(Item changedItem : listArr){
|
||||
if(changedItem.getName().equalsIgnoreCase(name)){
|
||||
alteredItems.add(changedItem);
|
||||
changedItem.setDueDate(dateString);
|
||||
changeCount++;
|
||||
}
|
||||
}
|
||||
System.out.println(String.format("%d item(s) changed", changeCount));
|
||||
|
||||
//Change Priority
|
||||
} else if(response.equalsIgnoreCase("Priority")){
|
||||
System.out.print("New Priority: ");
|
||||
|
||||
for(Item changedItem : listArr){
|
||||
if(changedItem.getName().equalsIgnoreCase(name)){
|
||||
try {
|
||||
String newPriorityString = scanner.nextLine();
|
||||
alteredItems.add(changedItem);
|
||||
int newPriority = Integer.parseInt(newPriorityString);
|
||||
changedItem.setPriority(newPriority);
|
||||
changeCount++;
|
||||
|
||||
} catch (InputMismatchException e) {
|
||||
System.out.println("Not an integer. Nothing changed.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println(String.format("%d item(s) changed", changeCount));
|
||||
|
||||
//Bad Input
|
||||
} else {
|
||||
System.out.println("Bad input, nothing altered.");
|
||||
}
|
||||
|
||||
//Print Changed Items
|
||||
System.out.print(listHeader);
|
||||
for(Item item : alteredItems){
|
||||
System.out.println(item.formatString());
|
||||
}
|
||||
System.out.print(footer);
|
||||
printList();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*Opens a {@code .txt file} from a developers {@code main} function.
|
||||
*<p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* list.openList();
|
||||
* }
|
||||
*
|
||||
* @return void, but prints to console.
|
||||
*/
|
||||
public void openList(){
|
||||
File listFile = new File(pathName);
|
||||
try(Scanner fileReader = new Scanner(listFile)){
|
||||
while (fileReader.hasNextLine()) {
|
||||
|
||||
String line = fileReader.nextLine();
|
||||
String[] splitLine = line.split(", ");
|
||||
Item item = new Item(splitLine[1]);
|
||||
|
||||
if(splitLine.length == 0){
|
||||
break;
|
||||
}
|
||||
|
||||
if(splitLine[0].equals("na")){
|
||||
item.setCategory("");
|
||||
} else {
|
||||
item.setCategory(splitLine[0]);
|
||||
}
|
||||
|
||||
if(splitLine[2].equals("12/31/1969")){
|
||||
item.setDueDate("12/31/1969");
|
||||
} else {
|
||||
item.setDueDate(splitLine[2]);
|
||||
}
|
||||
|
||||
if(splitLine[3].equals("na")){
|
||||
item.setPriority(10);
|
||||
} else {
|
||||
item.setPriority(Integer.parseInt(splitLine[3]));
|
||||
}
|
||||
|
||||
listArr.add(item);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
System.out.println("No Previous List. Creating a new one.");
|
||||
File file = new File(pathName);
|
||||
try{
|
||||
file.createNewFile();
|
||||
|
||||
} catch(IOException failed){
|
||||
System.out.println("File creation failed.");
|
||||
failed.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Organization
|
||||
/**
|
||||
* Sorts the {@code ArrayList<Item>} by asking users which field they want to sort by.
|
||||
* <p>
|
||||
* Does not save to the txt file. See {@code saveChanges()}.
|
||||
*<p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* list.sortBy();
|
||||
* }
|
||||
*
|
||||
* @return void, but prints to console.
|
||||
*/
|
||||
public void sortBy(){
|
||||
System.out.println(formatHeader("Sort By"));
|
||||
System.out.println( "- Category: Alphabetically by category name then alphabetically by Name.\n" +
|
||||
"- Name: Alphabetically by Name.\n" +
|
||||
"- Date: Earliest Date first, then by Category for repeated Dates.\n" +
|
||||
"- Priorty: 1 is most important, 10 is least important. If Priorities are equal, sorted by Date. \n");
|
||||
System.out.print("Option: ");
|
||||
String organizeBy = scanner.nextLine();
|
||||
if(organizeBy.equalsIgnoreCase("category")){
|
||||
listArr.sort(Comparator.comparing(Item::getCategory).thenComparing(Item::getName));
|
||||
|
||||
} else if(organizeBy.equalsIgnoreCase("name")){
|
||||
listArr.sort(Comparator.comparing(Item::getName).thenComparing(Item::getDueDate));
|
||||
|
||||
} else if(organizeBy.equalsIgnoreCase("date")){
|
||||
listArr.sort(Comparator.comparing(Item::getDueDate).thenComparing(Item::getCategory));
|
||||
|
||||
} else if(organizeBy.equalsIgnoreCase("priority")){
|
||||
listArr.sort(Comparator.comparingInt(Item::getPriority).thenComparing(Item::getDueDate));
|
||||
|
||||
} else {
|
||||
System.out.println("Cannot organize by that.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves the {@code ArrayList<Item>} to the {@code list.txt} using the developer provided {@code path}.
|
||||
*<p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* list.saveChanges();
|
||||
* }
|
||||
* @return void, but prints to console.
|
||||
*/
|
||||
public void saveChanges(){
|
||||
File file = new File(pathName);
|
||||
try (FileWriter writer = new FileWriter(file, false)){
|
||||
for(Item listInput : listArr){
|
||||
String category = listInput.getCategory();
|
||||
if(category.equals("")){
|
||||
category = "na";
|
||||
}
|
||||
String name = listInput.getName();
|
||||
String date = listInput.getDueDateString();
|
||||
String priority = Integer.toString(listInput.getPriority());
|
||||
|
||||
String line = String.format("%s, %s, %s, %s\n",category, name, date, priority);
|
||||
writer.write(line);
|
||||
}
|
||||
writer.close();
|
||||
} catch (IOException e){
|
||||
System.out.println("File not found.");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//Getters
|
||||
/**
|
||||
* Formats a {@code String} from the encapsulated {@code ArrayList<Item> listArr}.
|
||||
*<p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* list.openList();
|
||||
* }
|
||||
*
|
||||
* @return {@code String}
|
||||
*/
|
||||
public String printList(){
|
||||
String list = footer
|
||||
+ formatHeader("To Do List")
|
||||
+ footer
|
||||
+ listHeader;
|
||||
for(int i = 0; i < listArr.size(); i++){
|
||||
list = list.concat(listArr.get(i).formatString());
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public String getCategory(String category){
|
||||
String list = listHeader;
|
||||
for(int i = 0; i < listArr.size(); i++){
|
||||
if(listArr.get(i).getCategory().equals(category)){
|
||||
list = list.concat(i+1 + ": " + listArr.get(i).formatString());
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
||||
115
src/UserInterface.java
Normal file
115
src/UserInterface.java
Normal file
@@ -0,0 +1,115 @@
|
||||
|
||||
import java.util.Scanner;
|
||||
|
||||
public class UserInterface {
|
||||
|
||||
private String pathName;
|
||||
private Scanner scanner;
|
||||
private ToDoList list;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* <p>
|
||||
* Initializes a {@code UserInterface} object.
|
||||
* <p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* UserInterface ui = new UserInterface("./list.txt");
|
||||
* }
|
||||
* @param String The path to the list.txt file as a string.
|
||||
*/
|
||||
public UserInterface(String listPath){
|
||||
this.pathName = listPath; //Relative path to the starting .txt file. If one is not found, a new one is created.
|
||||
this.scanner = new Scanner(System.in); //The only scanner that will be declared in the overall program
|
||||
this.list = new ToDoList(pathName, scanner);
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts a while loop that runs an instance of ToDoList.
|
||||
* <p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* ToDoList list.run();
|
||||
* }
|
||||
* @return {@code void}, but has outputs to the terminal.
|
||||
*/
|
||||
public void run(){
|
||||
|
||||
//Loop that continues until the user inputs "quit". Capitalization not important
|
||||
while(true){
|
||||
printChoices();
|
||||
String input = getInput();
|
||||
if(runInput(input)) break;
|
||||
list.saveChanges();
|
||||
}
|
||||
scanner.close();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Formats and prints a consistent "Directions" message.
|
||||
* <p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* printChoices();
|
||||
* }
|
||||
* @return {@code void}, but prints to console.
|
||||
*/
|
||||
private void printChoices(){
|
||||
System.out.println(list.printList());
|
||||
String directionMessage = "\n"
|
||||
+ "-'Home': takes you to your current list.\n"
|
||||
+ "-'Add': adds new item.\n"
|
||||
+ "-'Delete': deletes an item.\n"
|
||||
+ "-'Change': changes an item.\n"
|
||||
+ "-'Organize': organizes based on what you want to organize by.\n"
|
||||
+ "-'Quit': exits the program.\n";
|
||||
System.out.println(directionMessage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Recieves the {@code String input} via the instance of {@code java.util.Scanner} that was declared in this class.
|
||||
* <p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* String input = getInput();
|
||||
* }
|
||||
* @return {@code String input}, and prints a prompt to console.
|
||||
*/
|
||||
private String getInput(){
|
||||
System.out.print("Choice: ");
|
||||
return scanner.nextLine();
|
||||
}
|
||||
|
||||
/**
|
||||
* Recieves the {@code String input} via the instance of {@code java.util.Scanner} that was declared in this class. If the user types "quit", the program quits, otherwise it continues.
|
||||
* <p>
|
||||
* The {@code input string} is not case sensitive.
|
||||
* <p>
|
||||
* Usage:
|
||||
* {@snippet :
|
||||
* if(runInput("Quit")) break; //this will break out of a loop.
|
||||
* }
|
||||
* @param String input: the input {@code String} that {@code runInput()} will use.
|
||||
* @return {@code boolean endLoop}: returns true if input = "Quit" to end the loop in {@code run()}, false otherwise.
|
||||
*/
|
||||
private boolean runInput(String input){
|
||||
if(input.equalsIgnoreCase("quit")){
|
||||
System.out.println("Bye!");
|
||||
return true;
|
||||
} else if(input.equalsIgnoreCase("Add")){
|
||||
list.addItemAction();
|
||||
} else if (input.equalsIgnoreCase("Delete")){
|
||||
list.deleteItem();
|
||||
} else if(input.equalsIgnoreCase("Change")){
|
||||
list.changeItem();
|
||||
} else if (input.equalsIgnoreCase("Organize")){
|
||||
list.sortBy();
|
||||
} else if (input.equalsIgnoreCase("Home")){
|
||||
System.out.println(list.printList());
|
||||
} else {
|
||||
System.out.println("That was not an option.");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user