diff --git a/Task.java b/Task.java new file mode 100644 index 0000000..a11794b --- /dev/null +++ b/Task.java @@ -0,0 +1,48 @@ +// Represents a Task, which can be written and loaded to/from a file and are comparable to each other. +public class Task { + private String title; + private String description; + private String dueDate; + private boolean completed; + + // Constructor to create a new Task object. + public Task(String title, String description, String dueDate) { + this.title = title; + this.description = description; + this.dueDate = dueDate; + this.completed = false; + } + + public String getTitle() { + return title; + } + + public String getDescription() { + return description; + } + + public String getDueDate() { + return dueDate; + } + + public boolean isCompleted() { + return completed; + } + + // Edit a task by providing new information. + public void editTask(String newTitle, String newDescription, String newDueDate) { + this.title = newTitle; + this.description = newDescription; + this.dueDate = newDueDate; + } + + // Return if a task is complete or not. + public void toggleComplete() { + if(completed) completed = false; + else completed = true; + + System.out.println("task status toggled"); + } + + // TODO: Implement Comparable or Comparator. +} diff --git a/Week9.java b/Week9.java new file mode 100644 index 0000000..87b3df3 --- /dev/null +++ b/Week9.java @@ -0,0 +1,115 @@ +import java.awt.event.*; + +import java.util.ArrayList; +import java.io.File; + +public class Week9 { + private static ArrayList tasks; + private static String filepath; + private static Week9Gui gui; + + // NOTE: For sorts, the Task class needs something implemented. + private static void sortByTitle() { + System.out.println("Sort By Title clicked!"); + // TODO + gui.update(tasks); + } + + // NOTE: For sorts, the Task class needs something implemented. + private static void sortByDueDate() { + System.out.println("Sort By Due Date clicked!"); + // TODO + gui.update(tasks); + } + + // NOTE: For sorts, the Task class needs something implemented. + private static void filterByComplete() { + System.out.println("Filter By Complete clicked!"); + // TODO + gui.update(tasks); + } + + private void parse(File f) { + // TODO: Need to open the file and get each line. + // TODO: Parse the format ("TITLE, DESCRIPTION, DUE DATE, COMPLETED"), + // TODO: Create a new Task object and add it to the ArrayList. + } + + // Writes each task to the file after a change. + private static void saveTasks() { + System.out.println("writing tasks to " + filepath); + // TODO: Write each Task stored in the ArrayList to the file. + } + + ///////////////////////// END OF TODO //////////////////////////// + + // Initialize tasks and GUI, populate with test data (if applicable). + private void init() { + filepath = getNotesDirectoryPath(); + initTasks(); + testData(); + } + + // Identify the operating system of the user, and obtain the path to the "tasks" directory. + private String getNotesDirectoryPath() { + String os = System.getProperty("os.name").toLowerCase(); + + String userHome = System.getProperty("user.home"); + String tasksDir = "tasks"; + + if (os.contains("win")) // Windows + return userHome + "\\" + tasksDir; + else if (os.contains("mac")) // MacOS + return userHome + "/Library/Application Support/" + tasksDir; + else // Linux/other + return userHome + "/" + tasksDir; + } + + // Create the tasks file if it does not already exist. Load tasks from the existing file otherwise. + private void initTasks() { + File f = new File(filepath); + tasks = new ArrayList(); + + if(f.isFile()) { + System.out.println("loading tasks from " + filepath); + parse(f); + } else { + try { + f.createNewFile(); + System.out.println(filepath + " has been created."); + } catch(Exception e) { + System.out.println(e); + } + } + } + + // Test tasks, not read from a file and are not intended to be saved to a file. + private void testData() { + for(int i = 0; i < 10; i++) + tasks.add(new Task("Title " + i, "Description " + i, "Due Date " + i)); + } + + public static void main(String[] args) { + new Week9().init(); + ActionListener sortByTitle = new ActionListener() { + public void actionPerformed(ActionEvent e) { + sortByTitle(); + } + }; + + ActionListener sortByDueDate = new ActionListener() { + public void actionPerformed(ActionEvent e) { + sortByDueDate(); + } + }; + + ActionListener filterByCompleted = new ActionListener() { + public void actionPerformed(ActionEvent e) { + filterByComplete(); + } + }; + + gui = new Week9Gui(tasks, sortByTitle, sortByDueDate, filterByCompleted); + } + +} diff --git a/Week9Gui.java b/Week9Gui.java new file mode 100644 index 0000000..7c1070c --- /dev/null +++ b/Week9Gui.java @@ -0,0 +1,97 @@ +import java.util.ArrayList; + +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JLabel; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.UIManager; + +import java.awt.event.*; +import java.awt.BorderLayout; +import java.awt.GridLayout; + +public class Week9Gui { + private JFrame frame = new JFrame("SLCC Programming Club Challenge - Task Manager"); + + private ActionListener titleSort; + private ActionListener dueDateSort; + private ActionListener completeFilter; + + public Week9Gui(ArrayList tasks, ActionListener titleSort, ActionListener dueDateSort, ActionListener completeFilter) { + this.titleSort = titleSort; + this.dueDateSort = dueDateSort; + this.completeFilter = completeFilter; + + initGui(tasks); + } + + // Setup the basic GUI layout. + private void initGui(ArrayList tasks) { + frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); + frame.setLayout(new BorderLayout()); + frame.setLocationRelativeTo(null); + + try { + UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); + } catch (Exception e) { + System.out.println("Error with cross platform look & feel."); + } + + frame.add(buttonsView(), BorderLayout.PAGE_END); + frame.add(view(tasks)); + + frame.setVisible(true); + } + + // Displays sort and filter buttons + private JPanel buttonsView() { + JButton sortByTitle = new JButton("Title"); + sortByTitle.addActionListener(titleSort); + + JButton sortByDueDate = new JButton("Due Date"); + sortByDueDate.addActionListener(dueDateSort); + + JButton filterByComplete = new JButton("Complete"); + filterByComplete.addActionListener(completeFilter); + + JPanel p = new JPanel(new GridLayout(2, 3)); + p.add(new JLabel("Sort by:")); + p.add(new JLabel("Sort by:")); + p.add(new JLabel("Filter by:")); + p.add(sortByTitle); + p.add(sortByDueDate); + p.add(filterByComplete); + + return p; + } + + // Displays tasks and their completion status. + private JPanel view(ArrayList tasks) { + JPanel v = new JPanel(new GridLayout(tasks.size(), 4)); + + for(Task t : tasks) { + v.add(new JLabel(t.getTitle())); + v.add(new JLabel(t.getDescription())); + v.add(new JLabel(t.getDueDate())); + JCheckBox toggleComplete = new JCheckBox("Completed", t.isCompleted()); + toggleComplete.addActionListener( + e -> { t.toggleComplete(); } + ); + v.add(toggleComplete); + } + + return v; + } + + // Clear everything and refresh the JFrame to update information. + public void update(ArrayList tasks) { + frame.getContentPane().removeAll(); + frame.add(buttonsView(), BorderLayout.PAGE_END); + frame.add(view(tasks)); + frame.repaint(); + frame.revalidate(); + frame.pack(); + System.out.println("Updated UI"); + } +}