diff --git a/build.gradle b/build.gradle index f4c7ed147d9a..2cf16a253753 100644 --- a/build.gradle +++ b/build.gradle @@ -76,10 +76,10 @@ allprojects { } shadowJar { - archiveName = "addressbook.jar" + archiveName = "agendum.jar" manifest { - attributes "Main-Class": "seedu.address.MainApp" + attributes "Main-Class": "seedu.agendum.MainApp" } destinationDir = file("${buildDir}/jar/") @@ -115,8 +115,8 @@ tasks.coveralls { onlyIf { System.env.'CI' } } -class AddressBookTest extends Test { - public AddressBookTest() { +class AgendumTest extends Test { + public AgendumTest() { forkEvery = 1 systemProperty 'testfx.setup.timeout', '60000' } @@ -130,7 +130,7 @@ class AddressBookTest extends Test { } } -task guiTests(type: AddressBookTest) { +task guiTests(type: AgendumTest) { include 'guitests/**' jacoco { @@ -139,8 +139,8 @@ task guiTests(type: AddressBookTest) { } -task nonGuiTests(type: AddressBookTest) { - include 'seedu/address/**' +task nonGuiTests(type: AgendumTest) { + include 'seedu/agendum/**' jacoco { destinationFile = new File("${buildDir}/jacoco/test.exec") @@ -148,7 +148,7 @@ task nonGuiTests(type: AddressBookTest) { } // Test mode depends on whether headless task has been run -task allTests(type: AddressBookTest) { +task allTests(type: AgendumTest) { jacoco { destinationFile = new File("${buildDir}/jacoco/test.exec") } diff --git a/src/main/java/seedu/agendum/commons/events/ui/TaskPanelSelectionChangedEvent.java b/src/main/java/seedu/agendum/commons/events/ui/TaskPanelSelectionChangedEvent.java deleted file mode 100644 index 7603fb5a78da..000000000000 --- a/src/main/java/seedu/agendum/commons/events/ui/TaskPanelSelectionChangedEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -package seedu.agendum.commons.events.ui; - -import seedu.agendum.commons.events.BaseEvent; -import seedu.agendum.model.task.ReadOnlyTask; - -/** - * Represents a selection change in the Task List Panel - */ -public class TaskPanelSelectionChangedEvent extends BaseEvent { - - - private final ReadOnlyTask newSelection; - - public TaskPanelSelectionChangedEvent(ReadOnlyTask newSelection){ - this.newSelection = newSelection; - } - - @Override - public String toString() { - return this.getClass().getSimpleName(); - } - - public ReadOnlyTask getNewSelection() { - return newSelection; - } -} diff --git a/src/main/java/seedu/agendum/logic/Logic.java b/src/main/java/seedu/agendum/logic/Logic.java index 970cc35537c3..9823eabdcd10 100644 --- a/src/main/java/seedu/agendum/logic/Logic.java +++ b/src/main/java/seedu/agendum/logic/Logic.java @@ -17,5 +17,8 @@ public interface Logic { /** Returns the filtered list of tasks */ ObservableList getFilteredTaskList(); + + /** Returns list of completed tasks */ + ObservableList getCompletedTaskList(); } diff --git a/src/main/java/seedu/agendum/logic/LogicManager.java b/src/main/java/seedu/agendum/logic/LogicManager.java index 394810c19201..fd60e5787031 100644 --- a/src/main/java/seedu/agendum/logic/LogicManager.java +++ b/src/main/java/seedu/agendum/logic/LogicManager.java @@ -38,4 +38,12 @@ public CommandResult execute(String commandText) { public ObservableList getFilteredTaskList() { return model.getFilteredTaskList(); } + + /** + * Requires implementation here + */ + @Override + public ObservableList getCompletedTaskList() { + return null; + } } diff --git a/src/main/java/seedu/agendum/logic/commands/AddCommand.java b/src/main/java/seedu/agendum/logic/commands/AddCommand.java index 66f4e5919faf..840841d069b2 100644 --- a/src/main/java/seedu/agendum/logic/commands/AddCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/AddCommand.java @@ -15,7 +15,10 @@ public class AddCommand extends Command { public static final String COMMAND_WORD = "add"; - public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds a task with no time and date. " + public static String COMMAND_FORMAT = "add \nadd by \nadd from to "; + public static String COMMAND_DESCRIPTION = "adds a task to Agendum"; + + public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds a task with no time and date. \n" + "Parameters: NAME\n" + "Example: " + COMMAND_WORD + " Watch Star Wars t/movies"; @@ -23,7 +26,9 @@ public class AddCommand extends Command { public static final String MESSAGE_SUCCESS = "New task added: %1$s"; public static final String MESSAGE_DUPLICATE_TASK = "This task already exists"; - private final Task toAdd; + private Task toAdd = null; + + public AddCommand() {} /** * Convenience constructor using name @@ -75,5 +80,21 @@ public CommandResult execute() { } } + + @Override + public String getName() { + return COMMAND_WORD; + } + + @Override + public String getFormat() { + return COMMAND_FORMAT; + } + + @Override + public String getDescription() { + return COMMAND_DESCRIPTION; + } } + diff --git a/src/main/java/seedu/agendum/logic/commands/ClearCommand.java b/src/main/java/seedu/agendum/logic/commands/ClearCommand.java index 20a5cfc77cc9..50deb0931b13 100644 --- a/src/main/java/seedu/agendum/logic/commands/ClearCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/ClearCommand.java @@ -6,17 +6,34 @@ * Clears the to do list. */ public class ClearCommand extends Command { - + + // COMMAND_WORD, COMMAND_FORMAT, COMMAND_DESCRIPTION are for display in help window public static final String COMMAND_WORD = "clear"; + public static String COMMAND_FORMAT = "clear"; + public static String COMMAND_DESCRIPTION = "clear all tasks in Agemdum"; public static final String MESSAGE_SUCCESS = "Your tasks have been cleared!"; public ClearCommand() {} - @Override public CommandResult execute() { assert model != null; model.resetData(ToDoList.getEmptyToDoList()); return new CommandResult(MESSAGE_SUCCESS); } + + @Override + public String getName() { + return COMMAND_WORD; + } + + @Override + public String getFormat() { + return COMMAND_FORMAT; + } + + @Override + public String getDescription() { + return COMMAND_DESCRIPTION; + } } diff --git a/src/main/java/seedu/agendum/logic/commands/Command.java b/src/main/java/seedu/agendum/logic/commands/Command.java index 79dd67fb5766..ecf6b037006d 100644 --- a/src/main/java/seedu/agendum/logic/commands/Command.java +++ b/src/main/java/seedu/agendum/logic/commands/Command.java @@ -10,7 +10,23 @@ */ public abstract class Command { protected Model model; - + + /** + * Return the name of this command. + */ + public abstract String getName(); + + /** + * Return the format of this command. + */ + public abstract String getFormat(); + /** + * Return the description of this command. + */ + public abstract String getDescription(); + + public Command() {}; + /** * Constructs a feedback message to summarise an operation that displayed a listing of tasks. * diff --git a/src/main/java/seedu/agendum/logic/commands/DeleteCommand.java b/src/main/java/seedu/agendum/logic/commands/DeleteCommand.java index 6649b16d4bee..cccbe0ca9bb5 100644 --- a/src/main/java/seedu/agendum/logic/commands/DeleteCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/DeleteCommand.java @@ -14,8 +14,10 @@ */ public class DeleteCommand extends Command { + // COMMAND_WORD, COMMAND_FORMAT, COMMAND_DESCRIPTION are for display in help window public static final String COMMAND_WORD = "delete"; - + public static String COMMAND_FORMAT = "delete \ndelete "; + public static String COMMAND_DESCRIPTION = "delete task(s) from Agendum"; public static final String MESSAGE_USAGE = COMMAND_WORD + ": Deletes the tasks(s) identified by their index numbers used in the last task listing.\n" + "Parameters: INDEX... (must be a positive number)\n" @@ -23,10 +25,12 @@ public class DeleteCommand extends Command { public static final String MESSAGE_DELETE_TASK_SUCCESS = "Deleted Task(s): %1$s"; - public final ArrayList targetIndexes; + public ArrayList targetIndexes; - public final ArrayList tasksToDelete; + public ArrayList tasksToDelete; + public DeleteCommand() {} + public DeleteCommand(Set targetIndexes) { this.targetIndexes = new ArrayList(targetIndexes); Collections.sort(this.targetIndexes); @@ -62,4 +66,19 @@ private boolean isAnyIndexInvalid(UnmodifiableObservableList lastS return targetIndexes.stream().anyMatch(index -> index > lastShownList.size()); } + @Override + public String getName() { + return COMMAND_WORD; + } + + @Override + public String getFormat() { + return COMMAND_FORMAT; + } + + @Override + public String getDescription() { + return COMMAND_DESCRIPTION; + } + } diff --git a/src/main/java/seedu/agendum/logic/commands/ExitCommand.java b/src/main/java/seedu/agendum/logic/commands/ExitCommand.java index d624297d1e67..d03d37a6c1aa 100644 --- a/src/main/java/seedu/agendum/logic/commands/ExitCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/ExitCommand.java @@ -8,10 +8,12 @@ */ public class ExitCommand extends Command { + // COMMAND_WORD, COMMAND_FORMAT, COMMAND_DESCRIPTION are for display in help window public static final String COMMAND_WORD = "exit"; - + public static String COMMAND_FORMAT = "exit"; + public static String COMMAND_DESCRIPTION = "exit Agendum"; public static final String MESSAGE_EXIT_ACKNOWLEDGEMENT = "Exiting Agendum as requested ..."; - + public ExitCommand() {} @Override @@ -20,4 +22,18 @@ public CommandResult execute() { return new CommandResult(MESSAGE_EXIT_ACKNOWLEDGEMENT); } + @Override + public String getName() { + return COMMAND_WORD; + } + + @Override + public String getFormat() { + return COMMAND_FORMAT; + } + + @Override + public String getDescription() { + return COMMAND_DESCRIPTION; + } } diff --git a/src/main/java/seedu/agendum/logic/commands/FindCommand.java b/src/main/java/seedu/agendum/logic/commands/FindCommand.java index 28b50b8353ad..396c89185aa2 100644 --- a/src/main/java/seedu/agendum/logic/commands/FindCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/FindCommand.java @@ -8,15 +8,19 @@ */ public class FindCommand extends Command { + // COMMAND_WORD, COMMAND_FORMAT, COMMAND_DESCRIPTION are for display in help window public static final String COMMAND_WORD = "find"; - + public static String COMMAND_FORMAT= "find \nfind "; + public static String COMMAND_DESCRIPTION = "search for task(s) based on keywords"; public static final String MESSAGE_USAGE = COMMAND_WORD + ": Finds all tasks whose names contain any of " + "the specified keywords (case-sensitive) and displays them as a list with index numbers.\n" + "Parameters: KEYWORD [MORE_KEYWORDS]...\n" + "Example: " + COMMAND_WORD + " star wars"; - private final Set keywords; + private Set keywords = null; + public FindCommand() {}; + public FindCommand(Set keywords) { this.keywords = keywords; } @@ -27,4 +31,19 @@ public CommandResult execute() { return new CommandResult(getMessageForTaskListShownSummary(model.getFilteredTaskList().size())); } + @Override + public String getName() { + return COMMAND_WORD; + } + + @Override + public String getFormat() { + return COMMAND_FORMAT; + } + + @Override + public String getDescription() { + return COMMAND_DESCRIPTION; + } + } diff --git a/src/main/java/seedu/agendum/logic/commands/HelpCommand.java b/src/main/java/seedu/agendum/logic/commands/HelpCommand.java index 1d41b9893629..cedfece82750 100644 --- a/src/main/java/seedu/agendum/logic/commands/HelpCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/HelpCommand.java @@ -9,13 +9,15 @@ */ public class HelpCommand extends Command { + // COMMAND_WORD, COMMAND_FORMAT, COMMAND_DESCRIPTION are for display in help window public static final String COMMAND_WORD = "help"; - + public static String COMMAND_FORMAT = "help"; + public static String COMMAND_DESCRIPTION = "view Agendum’s command summary"; public static final String MESSAGE_USAGE = COMMAND_WORD + ": Shows program usage instructions.\n" + "Example: " + COMMAND_WORD; public static final String SHOWING_HELP_MESSAGE = "Opened help window."; - + public HelpCommand() {} @Override @@ -23,4 +25,19 @@ public CommandResult execute() { EventsCenter.getInstance().post(new ShowHelpRequestEvent()); return new CommandResult(SHOWING_HELP_MESSAGE); } + + @Override + public String getName() { + return COMMAND_WORD; + } + + @Override + public String getFormat() { + return COMMAND_FORMAT; + } + + @Override + public String getDescription() { + return COMMAND_DESCRIPTION; + } } diff --git a/src/main/java/seedu/agendum/logic/commands/IncorrectCommand.java b/src/main/java/seedu/agendum/logic/commands/IncorrectCommand.java index 368cacd0c455..bdee0df6a0ae 100644 --- a/src/main/java/seedu/agendum/logic/commands/IncorrectCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/IncorrectCommand.java @@ -18,5 +18,20 @@ public CommandResult execute() { return new CommandResult(feedbackToUser); } + @Override + public String getName() { + return null; + } + + @Override + public String getFormat() { + return null; + } + + @Override + public String getDescription() { + return null; + } + } diff --git a/src/main/java/seedu/agendum/logic/commands/ListCommand.java b/src/main/java/seedu/agendum/logic/commands/ListCommand.java index f100808b8a22..047e293a7499 100644 --- a/src/main/java/seedu/agendum/logic/commands/ListCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/ListCommand.java @@ -6,8 +6,10 @@ */ public class ListCommand extends Command { + // COMMAND_WORD, COMMAND_FORMAT, COMMAND_DESCRIPTION are for display in help window public static final String COMMAND_WORD = "list"; - + public static String COMMAND_FORMAT = "list \nlist overdue \nlist near \nlist done \nlist all"; + public static String COMMAND_DESCRIPTION = "list a category of tasks \n(Incomplete tasks as default)"; public static final String MESSAGE_SUCCESS = "Listed all tasks"; public ListCommand() {} @@ -17,4 +19,19 @@ public CommandResult execute() { model.updateFilteredListToShowAll(); return new CommandResult(MESSAGE_SUCCESS); } + + @Override + public String getName() { + return COMMAND_WORD; + } + + @Override + public String getFormat() { + return COMMAND_FORMAT; + } + + @Override + public String getDescription() { + return COMMAND_DESCRIPTION; + } } diff --git a/src/main/java/seedu/agendum/logic/commands/MarkCommand.java b/src/main/java/seedu/agendum/logic/commands/MarkCommand.java index c5d9d69fcaba..86f0a8ab0794 100644 --- a/src/main/java/seedu/agendum/logic/commands/MarkCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/MarkCommand.java @@ -14,8 +14,10 @@ */ public class MarkCommand extends Command { + // COMMAND_WORD, COMMAND_FORMAT, COMMAND_DESCRIPTION are for display in help window public static final String COMMAND_WORD = "mark"; - + public static String COMMAND_FORMAT = "mark \nmark "; + public static String COMMAND_DESCRIPTION ="mark task(s) as completed"; public static final String MESSAGE_USAGE = COMMAND_WORD + ": Marks the tasks(s) identified by their index numbers used in the last task listing.\n" + "Parameters: INDEX... (must be a positive number)\n" @@ -23,9 +25,11 @@ public class MarkCommand extends Command { public static final String MESSAGE_MARK_TASK_SUCCESS = "Marked Task(s): %1$s"; - public final ArrayList targetIndexes; + public ArrayList targetIndexes; - public final ArrayList tasksToMark; + public ArrayList tasksToMark; + + public MarkCommand() {} public MarkCommand(Set targetIndexes) { this.targetIndexes = new ArrayList(targetIndexes); @@ -33,7 +37,6 @@ public MarkCommand(Set targetIndexes) { this.tasksToMark = new ArrayList(); } - @Override public CommandResult execute() { @@ -63,4 +66,18 @@ private boolean isAnyIndexInvalid(UnmodifiableObservableList lastS } + @Override + public String getName() { + return COMMAND_WORD; + } + + @Override + public String getFormat() { + return COMMAND_FORMAT; + } + + @Override + public String getDescription() { + return COMMAND_DESCRIPTION; + } } diff --git a/src/main/java/seedu/agendum/logic/commands/RenameCommand.java b/src/main/java/seedu/agendum/logic/commands/RenameCommand.java index 0834201bd9aa..0bb56e1109d1 100644 --- a/src/main/java/seedu/agendum/logic/commands/RenameCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/RenameCommand.java @@ -12,8 +12,10 @@ */ public class RenameCommand extends Command { + // COMMAND_WORD, COMMAND_FORMAT, COMMAND_DESCRIPTION are for display in help window public static final String COMMAND_WORD = "rename"; - + public static String COMMAND_FORMAT = "rename "; + public static String COMMAND_DESCRIPTION = "update the name of a task"; public static final String MESSAGE_USAGE = COMMAND_WORD + ": Rename an existing task. " + "Parameters: INDEX (must be a positive number) NAME\n" + "Example: " + COMMAND_WORD @@ -22,9 +24,11 @@ public class RenameCommand extends Command { public static final String MESSAGE_SUCCESS = "Task #%1$s renamed: %2$s"; public static final String MESSAGE_DUPLICATE_TASK = "This task already exists"; - public final int targetIndex; - public final Name newTaskName; + public int targetIndex = -1;; + public Name newTaskName = null; + public RenameCommand() {}; + /** * Convenience constructor using raw values. * @@ -62,4 +66,19 @@ public CommandResult execute() { } + @Override + public String getName() { + return COMMAND_WORD; + } + + @Override + public String getFormat() { + return COMMAND_FORMAT; + } + + @Override + public String getDescription() { + return COMMAND_DESCRIPTION; + } + } diff --git a/src/main/java/seedu/agendum/logic/commands/SelectCommand.java b/src/main/java/seedu/agendum/logic/commands/SelectCommand.java index c3d17ffcce9e..ce26ce309740 100644 --- a/src/main/java/seedu/agendum/logic/commands/SelectCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/SelectCommand.java @@ -41,4 +41,19 @@ public CommandResult execute() { } + @Override + public String getName() { + return null; + } + + @Override + public String getFormat() { + return null; + } + + @Override + public String getDescription() { + return null; + } + } diff --git a/src/main/java/seedu/agendum/logic/commands/StoreCommand.java b/src/main/java/seedu/agendum/logic/commands/StoreCommand.java index ac3fb5ab2046..4fe63fef6a71 100644 --- a/src/main/java/seedu/agendum/logic/commands/StoreCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/StoreCommand.java @@ -10,6 +10,9 @@ public class StoreCommand extends Command { public static final String COMMAND_WORD = "store"; + public static final String COMMAND_FORMAT = "store "; + public static final String COMMAND_DESCRIPTION = "stores task list at specified location"; + public static final String MESSAGE_SUCCESS = "New save location: %1$s"; public static final String MESSAGE_LOCATION_DEFAULT = "Save location set to default: %1$s"; @@ -64,5 +67,20 @@ private boolean isLocationValid() { private boolean isFileExists() { return FileUtil.isFileExists(pathToFile); } + + @Override + public String getName() { + return COMMAND_WORD; + } + + @Override + public String getFormat() { + return COMMAND_FORMAT; + } + + @Override + public String getDescription() { + return COMMAND_DESCRIPTION; + } } diff --git a/src/main/java/seedu/agendum/logic/commands/UndoCommand.java b/src/main/java/seedu/agendum/logic/commands/UndoCommand.java index 94e66edf29f1..9e322c63e680 100644 --- a/src/main/java/seedu/agendum/logic/commands/UndoCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/UndoCommand.java @@ -7,6 +7,9 @@ public class UndoCommand extends Command { public static final String COMMAND_WORD = "undo"; + public static final String COMMAND_FORMAT = "undo"; + public static final String COMMAND_DESCRIPTION = "Undo last command!"; + public static final String MESSAGE_SUCCESS = "Previous command undone!"; public static final String MESSAGE_FAILURE = "Nothing to undo!"; @@ -22,4 +25,19 @@ public CommandResult execute() { return new CommandResult(MESSAGE_FAILURE); } } + + @Override + public String getName() { + return COMMAND_WORD; + } + + @Override + public String getFormat() { + return COMMAND_FORMAT; + } + + @Override + public String getDescription() { + return COMMAND_DESCRIPTION; + } } \ No newline at end of file diff --git a/src/main/java/seedu/agendum/logic/commands/UnmarkCommand.java b/src/main/java/seedu/agendum/logic/commands/UnmarkCommand.java index 68783490883d..f16e7d9f2218 100644 --- a/src/main/java/seedu/agendum/logic/commands/UnmarkCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/UnmarkCommand.java @@ -14,8 +14,10 @@ */ public class UnmarkCommand extends Command { + // COMMAND_WORD, COMMAND_FORMAT, COMMAND_DESCRIPTION are for display in help window public static final String COMMAND_WORD = "unmark"; - + public static String COMMAND_FORMAT = "unmark \nunmark "; + public static String COMMAND_DESCRIPTION = "mark task(s) as uncomplete"; public static final String MESSAGE_USAGE = COMMAND_WORD + ": Ununmarks the tasks(s) identified by their index numbers used in the last task listing.\n" + "Parameters: INDEX... (must be a positive number)\n" @@ -23,17 +25,18 @@ public class UnmarkCommand extends Command { public static final String MESSAGE_UNMARK_TASK_SUCCESS = "Ununmarked Task(s): %1$s"; - public final ArrayList targetIndexes; + public ArrayList targetIndexes; - public final ArrayList tasksToUnmark; + public ArrayList tasksToUnmark; + public UnmarkCommand() {} + public UnmarkCommand(Set targetIndexes) { this.targetIndexes = new ArrayList(targetIndexes); Collections.sort(this.targetIndexes); this.tasksToUnmark = new ArrayList(); } - @Override public CommandResult execute() { @@ -62,5 +65,18 @@ private boolean isAnyIndexInvalid(UnmodifiableObservableList lastS return targetIndexes.stream().anyMatch(index -> index > lastShownList.size()); } + @Override + public String getName() { + return COMMAND_WORD; + } + @Override + public String getFormat() { + return COMMAND_FORMAT; + } + + @Override + public String getDescription() { + return COMMAND_DESCRIPTION; + } } diff --git a/src/main/java/seedu/agendum/model/Model.java b/src/main/java/seedu/agendum/model/Model.java index 49ba10ae1c83..4f18a447fa16 100644 --- a/src/main/java/seedu/agendum/model/Model.java +++ b/src/main/java/seedu/agendum/model/Model.java @@ -43,10 +43,31 @@ void updateTask(ReadOnlyTask target, Task updatedTask) /** Updates the filter of the filtered task list to show all tasks */ void updateFilteredListToShowAll(); + /** Updates the filter of the filtered task list to show all uncompleted tasks */ + void updateFilteredListToShowUncompleted(); + + /** Updates the filter of the filtered task list to show all completed tasks */ + void updateFilteredListToShowCompleted(); + + /** Updates the filter of the filtered task list to show all overdue tasks */ + void updateFilteredListToShowOverdue(); + + /** Updates the filter of the filtered task list to show all upcoming tasks */ + void updateFilteredListToShowUpcoming(); + /** Updates the filter of the filtered task list to filter by the given keywords*/ void updateFilteredTaskList(Set keywords); /** Change the storage location of the todolist.xml */ void changeSaveLocation(String location); + /** Returns the completed task list as an {@code UnmodifiableObservableList} */ + UnmodifiableObservableList getCompletedTaskList(); + + /** Returns the upcoming task list as an {@code UnmodifiableObservableList} */ + UnmodifiableObservableList getUpcomingTaskList(); + + /** Returns the overdue task list as an {@code UnmodifiableObservableList} */ + UnmodifiableObservableList getOverdueTaskList(); + } diff --git a/src/main/java/seedu/agendum/model/ModelManager.java b/src/main/java/seedu/agendum/model/ModelManager.java index 522f47af12b8..d439bb28dc51 100644 --- a/src/main/java/seedu/agendum/model/ModelManager.java +++ b/src/main/java/seedu/agendum/model/ModelManager.java @@ -1,6 +1,7 @@ package seedu.agendum.model; import javafx.collections.transformation.FilteredList; +import javafx.collections.transformation.SortedList; import seedu.agendum.commons.core.LogsCenter; import seedu.agendum.commons.core.UnmodifiableObservableList; import seedu.agendum.commons.util.ConfigUtil; @@ -30,6 +31,12 @@ public class ModelManager extends ComponentManager implements Model { private final ToDoList toDoList; private final Stack previousLists; private final FilteredList filteredTasks; + private final FilteredList completedTasks; + private final SortedList sortedTasks; + private final FilteredList uncompletedUpcomingTasks; + private final FilteredList uncompletedOverdueTasks; + private final SortedList upcomingTasks; + private final SortedList overdueTasks; private final Config config; /** @@ -46,6 +53,15 @@ public ModelManager(ToDoList src, UserPrefs userPrefs, Config config) { toDoList = new ToDoList(src); filteredTasks = new FilteredList<>(toDoList.getTasks()); + sortedTasks = filteredTasks.sorted(); + completedTasks = new FilteredList<>(toDoList.getTasks()); + completedTasks.setPredicate(task -> task.isCompleted()); + uncompletedUpcomingTasks = new FilteredList<>(toDoList.getTasks()); + uncompletedOverdueTasks = new FilteredList<>(toDoList.getTasks()); + uncompletedUpcomingTasks.setPredicate(task -> task.isUpcoming()); + uncompletedOverdueTasks.setPredicate(task -> task.isOverdue()); + upcomingTasks = uncompletedUpcomingTasks.sorted(); + overdueTasks = uncompletedOverdueTasks.sorted(); previousLists = new Stack(); backupNewToDoList(); this.config = config; @@ -58,6 +74,15 @@ public ModelManager() { public ModelManager(ReadOnlyToDoList initialData, UserPrefs userPrefs, Config config) { toDoList = new ToDoList(initialData); filteredTasks = new FilteredList<>(toDoList.getTasks()); + sortedTasks = filteredTasks.sorted(); + completedTasks = new FilteredList<>(toDoList.getTasks()); + completedTasks.setPredicate(task -> task.isCompleted()); + uncompletedUpcomingTasks = new FilteredList<>(toDoList.getTasks()); + uncompletedOverdueTasks = new FilteredList<>(toDoList.getTasks()); + uncompletedUpcomingTasks.setPredicate(task -> task.isUpcoming()); + uncompletedOverdueTasks.setPredicate(task -> task.isOverdue()); + upcomingTasks = uncompletedUpcomingTasks.sorted(); + overdueTasks = uncompletedOverdueTasks.sorted(); previousLists = new Stack(); backupNewToDoList(); this.config = config; @@ -167,13 +192,33 @@ private void backupNewToDoList() { @Override public UnmodifiableObservableList getFilteredTaskList() { - return new UnmodifiableObservableList<>(filteredTasks); + return new UnmodifiableObservableList<>(sortedTasks); } @Override public void updateFilteredListToShowAll() { filteredTasks.setPredicate(null); } + + @Override + public void updateFilteredListToShowUncompleted() { + filteredTasks.setPredicate(task -> !task.isCompleted()); + } + + @Override + public void updateFilteredListToShowCompleted() { + filteredTasks.setPredicate(task -> task.isCompleted()); + } + + @Override + public void updateFilteredListToShowOverdue() { + filteredTasks.setPredicate(task -> task.isOverdue()); + } + + @Override + public void updateFilteredListToShowUpcoming() { + filteredTasks.setPredicate(task -> task.isUpcoming()); + } @Override public void updateFilteredTaskList(Set keywords){ @@ -183,6 +228,23 @@ public void updateFilteredTaskList(Set keywords){ private void updateFilteredTaskList(Expression expression) { filteredTasks.setPredicate(expression::satisfies); } + + //=========== Other Task List Accessors =================================================================== + + @Override + public UnmodifiableObservableList getCompletedTaskList() { + return new UnmodifiableObservableList<>(completedTasks); + } + + @Override + public UnmodifiableObservableList getUpcomingTaskList() { + return new UnmodifiableObservableList<>(upcomingTasks); + } + + @Override + public UnmodifiableObservableList getOverdueTaskList() { + return new UnmodifiableObservableList<>(overdueTasks); + } //========== Inner classes/interfaces used for filtering ================================================== diff --git a/src/main/java/seedu/agendum/model/task/ReadOnlyTask.java b/src/main/java/seedu/agendum/model/task/ReadOnlyTask.java index 2a7d98ce07b3..200d83f0ac32 100644 --- a/src/main/java/seedu/agendum/model/task/ReadOnlyTask.java +++ b/src/main/java/seedu/agendum/model/task/ReadOnlyTask.java @@ -11,6 +11,8 @@ public interface ReadOnlyTask { Name getName(); boolean isCompleted(); + boolean isUpcoming(); + boolean isOverdue(); Optional getStartDateTime(); Optional getEndDateTime(); @@ -32,9 +34,8 @@ default boolean isSameStateAs(ReadOnlyTask other) { default String getAsText() { final StringBuilder builder = new StringBuilder(); builder.append(getName()); - builder.append("\nStart time: ").append(this.getStartDateTime()); - builder.append("\nEnd time: ").append(this.getEndDateTime()); - + builder.append("\nStart time: ").append(this.getStartDateTime()); + builder.append("\nEnd time: ").append(this.getEndDateTime()); return builder.toString(); } } diff --git a/src/main/java/seedu/agendum/model/task/Task.java b/src/main/java/seedu/agendum/model/task/Task.java index fd59e67d284f..f539f2f9ce45 100644 --- a/src/main/java/seedu/agendum/model/task/Task.java +++ b/src/main/java/seedu/agendum/model/task/Task.java @@ -10,7 +10,9 @@ * Represents a Task in the to do list. * Only the task name is compulsory and it cannot be an empty string. */ -public class Task implements ReadOnlyTask { +public class Task implements ReadOnlyTask, Comparable { + + private static final int UPCOMING_DAYS_THRESHOLD = 7; private Name name; private boolean isCompleted; @@ -45,7 +47,7 @@ public Task(Name name, Optional deadline) { * Constructor for a task with start and end datetime */ public Task(Name name, Optional startDateTime, - Optional endDateTime) { + Optional endDateTime) { assert !CollectionUtil.isAnyNull(name); this.name = name; this.isCompleted = false; @@ -76,6 +78,23 @@ public boolean isCompleted() { return isCompleted; } + @Override + public boolean isOverdue() { + if (!getTaskTime().isPresent()) { + return false; + } + return !isCompleted() && getTaskTime().get().isBefore(LocalDateTime.now()); + } + + @Override + public boolean isUpcoming() { + if (!getTaskTime().isPresent()) { + return false; + } + return !isCompleted() && !isOverdue() && getTaskTime().get().isBefore( + LocalDateTime.now().plusDays(UPCOMING_DAYS_THRESHOLD)); + } + @Override public Optional getStartDateTime() { return Optional.ofNullable(startDateTime); @@ -85,6 +104,14 @@ public Optional getStartDateTime() { public Optional getEndDateTime() { return Optional.ofNullable(endDateTime); } + + private Optional getTaskTime() { + if (getStartDateTime().isPresent()) { + return getStartDateTime(); + } else { + return getEndDateTime(); + } + } // ================ Setter methods ============================== @@ -107,7 +134,7 @@ public void setStartDateTime(Optional startDateTime) { public void setEndDateTime(Optional endDateTime) { this.endDateTime = endDateTime.orElse(null); } - + // ================ Other methods ============================== @Override @@ -123,9 +150,42 @@ public int hashCode() { return Objects.hash(name); } + @Override + public int compareTo(Task other) { +// int compareCompletionStatus = compareCompletionStatus(other); +// if (compareCompletionStatus != 0) { +// return compareCompletionStatus; +// } + int compareTime = compareTime(other); + if (compareTime != 0) { + return compareTime; + } + int compareName = compareName(other); + return compareName; + } + + public int compareTime(Task other) { + if (this.getTaskTime().isPresent() && other.getTaskTime().isPresent()) { + return this.getTaskTime().get().compareTo(other.getTaskTime().get()); + } else if (this.getTaskTime().isPresent()) { + return 1; + } else if (other.getTaskTime().isPresent()) { + return -1; + } + return 0; + } + + public int compareCompletionStatus(Task other) { + return Boolean.compare(this.isCompleted, other.isCompleted); + } + + public int compareName(Task other) { + return this.getName().toString().compareTo(other.getName().toString()); + } + @Override public String toString() { return getAsText(); } -} +} \ No newline at end of file diff --git a/src/main/java/seedu/agendum/ui/AllTasksPanel.java b/src/main/java/seedu/agendum/ui/AllTasksPanel.java new file mode 100644 index 000000000000..2fc5b8c7adf4 --- /dev/null +++ b/src/main/java/seedu/agendum/ui/AllTasksPanel.java @@ -0,0 +1,95 @@ +package seedu.agendum.ui; + +import java.util.logging.Logger; + +import javafx.application.Platform; +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.scene.Node; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.scene.control.SplitPane; +import javafx.scene.layout.AnchorPane; +import javafx.stage.Stage; +import seedu.agendum.model.task.ReadOnlyTask; +import seedu.agendum.commons.core.LogsCenter; + +/** + * Panel contains the list of all tasks + */ +public class AllTasksPanel extends UiPart { + private final Logger logger = LogsCenter.getLogger(AllTasksPanel.class); + private static final String FXML = "AllTasksPanel.fxml"; + private AnchorPane panel; + private AnchorPane placeHolderPane; + + @FXML + private ListView allTasksListView; + + public AllTasksPanel() { + super(); + } + + @Override + public void setNode(Node node) { + panel = (AnchorPane) node; + } + + @Override + public String getFxmlPath() { + return FXML; + } + + @Override + public void setPlaceholder(AnchorPane pane) { + this.placeHolderPane = pane; + } + + public static AllTasksPanel load(Stage primaryStage, AnchorPane AllTasksPlaceholder, + ObservableList taskList) { + AllTasksPanel allTasksPanel = UiPartLoader.loadUiPart(primaryStage, AllTasksPlaceholder, new AllTasksPanel()); + allTasksPanel.configure(taskList); + return allTasksPanel; + } + + private void configure(ObservableList allTasks) { + setConnections(allTasks); + addToPlaceholder(); + } + + private void setConnections(ObservableList allTasks) { + allTasksListView.setItems(allTasks); + allTasksListView.setCellFactory(listView -> new allTasksListViewCell()); + } + + private void addToPlaceholder() { + SplitPane.setResizableWithParent(placeHolderPane, false); + placeHolderPane.getChildren().add(panel); + } + + public void scrollTo(int index) { + Platform.runLater(() -> { + allTasksListView.scrollTo(index); + allTasksListView.getSelectionModel().clearAndSelect(index); + }); + } + + class allTasksListViewCell extends ListCell { + + public allTasksListViewCell() { + } + + @Override + protected void updateItem(ReadOnlyTask task, boolean empty) { + super.updateItem(task, empty); + + if (empty || task == null) { + setGraphic(null); + setText(null); + } else { + setGraphic(TaskCard.load(task, getIndex() + 1).getLayout()); + } + } + } + +} diff --git a/src/main/java/seedu/agendum/ui/CommandBox.java b/src/main/java/seedu/agendum/ui/CommandBox.java index 6aaba5ce2940..668ee5aeb0a6 100644 --- a/src/main/java/seedu/agendum/ui/CommandBox.java +++ b/src/main/java/seedu/agendum/ui/CommandBox.java @@ -21,7 +21,7 @@ public class CommandBox extends UiPart { private AnchorPane placeHolderPane; private AnchorPane commandPane; - private ResultDisplay resultDisplay; + private ResultPopUp resultPopUp; String previousCommandTest; private Logic logic; @@ -31,15 +31,15 @@ public class CommandBox extends UiPart { private CommandResult mostRecentResult; public static CommandBox load(Stage primaryStage, AnchorPane commandBoxPlaceholder, - ResultDisplay resultDisplay, Logic logic) { + ResultPopUp resultPopUp, Logic logic) { CommandBox commandBox = UiPartLoader.loadUiPart(primaryStage, commandBoxPlaceholder, new CommandBox()); - commandBox.configure(resultDisplay, logic); + commandBox.configure(resultPopUp, logic); commandBox.addToPlaceholder(); return commandBox; } - public void configure(ResultDisplay resultDisplay, Logic logic) { - this.resultDisplay = resultDisplay; + public void configure(ResultPopUp resultPopUp, Logic logic) { + this.resultPopUp = resultPopUp; this.logic = logic; registerAsAnEventHandler(this); } @@ -66,7 +66,6 @@ public void setPlaceholder(AnchorPane pane) { this.placeHolderPane = pane; } - @FXML private void handleCommandInputChanged() { //Take a copy of the command text @@ -77,11 +76,12 @@ private void handleCommandInputChanged() { */ setStyleToIndicateCorrectCommand(); mostRecentResult = logic.execute(previousCommandTest); - resultDisplay.postMessage(mostRecentResult.feedbackToUser); + if(!previousCommandTest.toLowerCase().equals("help")) { + resultPopUp.postMessage(mostRecentResult.feedbackToUser); + } logger.info("Result: " + mostRecentResult.feedbackToUser); } - /** * Sets the command box style to indicate a correct command. */ diff --git a/src/main/java/seedu/agendum/ui/CompletedTaskCard.java b/src/main/java/seedu/agendum/ui/CompletedTaskCard.java new file mode 100644 index 000000000000..5ccc55a7e2c4 --- /dev/null +++ b/src/main/java/seedu/agendum/ui/CompletedTaskCard.java @@ -0,0 +1,53 @@ +package seedu.agendum.ui; + +import javafx.fxml.FXML; +import javafx.scene.Node; +import javafx.scene.control.Label; +import javafx.scene.layout.HBox; +import seedu.agendum.model.task.ReadOnlyTask; + +public class CompletedTaskCard extends UiPart { + + private static final String FXML = "CompletedTaskCard.fxml"; + + @FXML + private HBox cardPane; + @FXML + private Label name; + @FXML + private Label id; + + private ReadOnlyTask task; + private int displayedIndex; + + public CompletedTaskCard(){ + + } + + public static CompletedTaskCard load(ReadOnlyTask task, int displayedIndex){ + CompletedTaskCard card = new CompletedTaskCard(); + card.task = task; + card.displayedIndex = displayedIndex; + return UiPartLoader.loadUiPart(card); + } + + @FXML + public void initialize() { + name.setText(task.getName().fullName); + id.setText(displayedIndex + ". "); + } + + public HBox getLayout() { + return cardPane; + } + + @Override + public void setNode(Node node) { + cardPane = (HBox)node; + } + + @Override + public String getFxmlPath() { + return FXML; + } +} diff --git a/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java b/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java new file mode 100644 index 000000000000..66b59a3b8b18 --- /dev/null +++ b/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java @@ -0,0 +1,96 @@ +package seedu.agendum.ui; + +import java.util.logging.Logger; + +import javafx.application.Platform; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.scene.Node; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.scene.control.SplitPane; +import javafx.scene.layout.AnchorPane; +import javafx.stage.Stage; +import seedu.agendum.model.task.ReadOnlyTask; +import seedu.agendum.commons.core.LogsCenter; + +/** + * Panel contains the list of completed tasks + */ +public class CompletedTasksPanel extends UiPart { + private final Logger logger = LogsCenter.getLogger(CompletedTasksPanel.class); + private static final String FXML = "CompletedTasksPanel.fxml"; + private AnchorPane panel; + private AnchorPane placeHolderPane; + + @FXML + private ListView completedTasksListView; + + public CompletedTasksPanel() { + super(); + } + + @Override + public void setNode(Node node) { + panel = (AnchorPane) node; + } + + @Override + public String getFxmlPath() { + return FXML; + } + + @Override + public void setPlaceholder(AnchorPane pane) { + this.placeHolderPane = pane; + } + + public static CompletedTasksPanel load(Stage primaryStage, AnchorPane CompletedTasksPlaceholder, + ObservableList taskList) { + CompletedTasksPanel completedTasksPanel = UiPartLoader.loadUiPart(primaryStage, CompletedTasksPlaceholder, new CompletedTasksPanel()); + completedTasksPanel.configure(taskList); + return completedTasksPanel; + } + + private void configure(ObservableList taskList) { + setConnections(taskList); + addToPlaceholder(); + } + + private void setConnections(ObservableList taskList) { + completedTasksListView.setItems(taskList.filtered(task -> task.isCompleted())); + completedTasksListView.setCellFactory(listView -> new completedTasksListViewCell()); + } + + private void addToPlaceholder() { + SplitPane.setResizableWithParent(placeHolderPane, false); + placeHolderPane.getChildren().add(panel); + } + + public void scrollTo(int index) { + Platform.runLater(() -> { + completedTasksListView.scrollTo(index); + completedTasksListView.getSelectionModel().clearAndSelect(index); + }); + } + + class completedTasksListViewCell extends ListCell { + + public completedTasksListViewCell() { + } + + @Override + protected void updateItem(ReadOnlyTask task, boolean empty) { + super.updateItem(task, empty); + + if (empty || task == null) { + setGraphic(null); + setText(null); + } else { + setGraphic(TaskCard.load(task).getLayout()); + } + } + } + +} diff --git a/src/main/java/seedu/agendum/ui/HelpWindow.java b/src/main/java/seedu/agendum/ui/HelpWindow.java index 4a7e5d7534d2..4d6bd772c437 100644 --- a/src/main/java/seedu/agendum/ui/HelpWindow.java +++ b/src/main/java/seedu/agendum/ui/HelpWindow.java @@ -1,15 +1,48 @@ package seedu.agendum.ui; +import javafx.beans.property.SimpleStringProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.event.EventHandler; +import javafx.event.EventType; +import javafx.fxml.FXML; import javafx.scene.Node; import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Control; +import javafx.scene.control.ListView; +import javafx.scene.control.TableCell; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; +import javafx.scene.input.KeyEvent; import javafx.scene.layout.AnchorPane; -import javafx.scene.web.WebView; +import javafx.scene.paint.Color; +import javafx.scene.text.Text; import javafx.stage.Stage; -import seedu.agendum.commons.util.FxViewUtil; +import javafx.stage.StageStyle; +import javafx.util.Callback; +import seedu.agendum.logic.commands.AddCommand; +import seedu.agendum.logic.commands.ClearCommand; +import seedu.agendum.logic.commands.Command; +import seedu.agendum.logic.commands.DeleteCommand; +import seedu.agendum.logic.commands.ExitCommand; +import seedu.agendum.logic.commands.FindCommand; +import seedu.agendum.logic.commands.HelpCommand; +import seedu.agendum.logic.commands.ListCommand; +import seedu.agendum.logic.commands.MarkCommand; +import seedu.agendum.logic.commands.RenameCommand; +import seedu.agendum.logic.commands.UnmarkCommand; import seedu.agendum.commons.core.LogsCenter; import java.util.logging.Logger; +import com.sun.javafx.stage.StageHelper; + +import guitests.guihandles.GuiHandle; + /** * Controller for a help page */ @@ -19,19 +52,59 @@ public class HelpWindow extends UiPart { private static final String ICON = "/images/help_icon.png"; private static final String FXML = "HelpWindow.fxml"; private static final String TITLE = "Help"; - private static final String USERGUIDE_URL = - "https://github.com/se-edu/todolist-level4/blob/master/docs/UserGuide.md"; + private static final int WIDTH = 1000; + private static final int HEIGHT = 650; + private ObservableList commandList = FXCollections.observableArrayList(); private AnchorPane mainPane; - private Stage dialogStage; - + private static Stage dialogStage; + + @FXML + private TableView commandTable; + + @FXML + private TableColumn commandColumn; + + @FXML + private TableColumn descriptionColumn; + + @FXML + private TableColumn formatColumn; + + @FXML + private Button backButton; + + /** + * Initializes the controller class. This method is automatically called + * after the fxml file has been loaded. + */ + @FXML + private void initialize() { + + backButton.setOnAction((event) -> { + dialogStage.close(); + }); + + commandColumn.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getName())); + descriptionColumn.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getDescription())); + formatColumn.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getFormat())); + + commandTable.setItems(commandList); + } + public static HelpWindow load(Stage primaryStage) { - logger.fine("Showing help page about the application."); - HelpWindow helpWindow = UiPartLoader.loadUiPart(primaryStage, new HelpWindow()); - helpWindow.configure(); - return helpWindow; + if (!StageHelper.getStages().contains(dialogStage)) { + logger.fine("Showing help page about the application."); + HelpWindow helpWindow = UiPartLoader.loadUiPart(primaryStage, new HelpWindow()); + helpWindow.configure(); + return helpWindow; + } else { + dialogStage.requestFocus(); + return null; + } } + @Override public void setNode(Node node) { @@ -47,16 +120,44 @@ private void configure(){ Scene scene = new Scene(mainPane); //Null passed as the parent stage to make it non-modal. dialogStage = createDialogStage(TITLE, null, scene); - dialogStage.setMaximized(true); //TODO: set a more appropriate initial size + dialogStage.setWidth(WIDTH); + dialogStage.setHeight(HEIGHT); + dialogStage.setResizable(false); + + scene.setFill(Color.TRANSPARENT); + dialogStage.initStyle(StageStyle.TRANSPARENT); + setIcon(dialogStage, ICON); + loadHelpList(); + + handleEscape(scene); + } + + private void handleEscape(Scene scene) { + scene.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler() { + @Override + public void handle(KeyEvent evt) { + if (evt.getCode().equals(KeyCode.ESCAPE)) { + dialogStage.close(); + } + } + }); + } - WebView browser = new WebView(); - browser.getEngine().load(USERGUIDE_URL); - FxViewUtil.applyAnchorBoundaryParameters(browser, 0.0, 0.0, 0.0, 0.0); - mainPane.getChildren().add(browser); + private void loadHelpList() { + commandList.add(new AddCommand()); + commandList.add(new RenameCommand()); + commandList.add(new MarkCommand()); + commandList.add(new UnmarkCommand()); + commandList.add(new DeleteCommand()); + commandList.add(new ListCommand()); + commandList.add(new FindCommand()); + commandList.add(new ClearCommand()); + commandList.add(new HelpCommand()); + commandList.add(new ExitCommand()); } public void show() { - dialogStage.showAndWait(); + dialogStage.show(); } } diff --git a/src/main/java/seedu/agendum/ui/MainWindow.java b/src/main/java/seedu/agendum/ui/MainWindow.java index c6b83a2a5c86..f96064c8dd4d 100644 --- a/src/main/java/seedu/agendum/ui/MainWindow.java +++ b/src/main/java/seedu/agendum/ui/MainWindow.java @@ -1,13 +1,24 @@ package seedu.agendum.ui; +import com.sun.javafx.stage.StageHelper; + +import javafx.application.Platform; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.Node; import javafx.scene.Scene; +import javafx.scene.control.Menu; import javafx.scene.control.MenuItem; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; import javafx.scene.input.KeyCombination; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.VBox; import javafx.stage.Stage; +import javafx.stage.WindowEvent; import seedu.agendum.commons.core.Config; import seedu.agendum.commons.core.GuiSettings; import seedu.agendum.commons.events.ui.ExitAppRequestEvent; @@ -21,17 +32,18 @@ */ public class MainWindow extends UiPart { - private static final String ICON = "/images/address_book_32.png"; + private static final String ICON = "/images/agendum_icon.png"; private static final String FXML = "MainWindow.fxml"; public static final int MIN_HEIGHT = 600; public static final int MIN_WIDTH = 450; private Logic logic; - + // Independent Ui parts residing in this Ui container - private BrowserPanel browserPanel; - private TaskListPanel taskListPanel; - private ResultDisplay resultDisplay; + private AllTasksPanel allTasksPanel; + private CompletedTasksPanel completedTasksPanel; + private OtherTasksPanel otherTasksPanel; + private ResultPopUp resultPopUp; private StatusBarFooter statusBarFooter; private CommandBox commandBox; private Config config; @@ -53,15 +65,17 @@ public class MainWindow extends UiPart { private MenuItem helpMenuItem; @FXML - private AnchorPane taskListPanelPlaceholder; - + private AnchorPane allTasksPlaceHolder; + @FXML - private AnchorPane resultDisplayPlaceholder; - + private AnchorPane completedTasksPlaceHolder; + + @FXML + private AnchorPane otherTasksPlaceHolder; + @FXML private AnchorPane statusbarPlaceholder; - public MainWindow() { super(); } @@ -77,7 +91,6 @@ public String getFxmlPath() { } public static MainWindow load(Stage primaryStage, Config config, UserPrefs prefs, Logic logic) { - MainWindow mainWindow = UiPartLoader.loadUiPart(primaryStage, new MainWindow()); mainWindow.configure(config.getAppTitle(), config.getToDoListName(), config, prefs, logic); return mainWindow; @@ -98,21 +111,25 @@ private void configure(String appTitle, String toDoListName, Config config, User setWindowMinSize(); setWindowDefaultSize(prefs); scene = new Scene(rootLayout); + primaryStage.setScene(scene); + + primaryStage.setOnHidden(e -> Platform.exit()); setAccelerators(); } private void setAccelerators() { - helpMenuItem.setAccelerator(KeyCombination.valueOf("F1")); + helpMenuItem.setAccelerator(KeyCombination.valueOf("F5")); } void fillInnerParts() { - browserPanel = BrowserPanel.load(browserPlaceholder); - taskListPanel = TaskListPanel.load(primaryStage, getTaskListPlaceholder(), logic.getFilteredTaskList()); - resultDisplay = ResultDisplay.load(primaryStage, getResultDisplayPlaceholder()); + allTasksPanel = AllTasksPanel.load(primaryStage, getAllTasksPlaceHolder(), logic.getFilteredTaskList()); + completedTasksPanel = CompletedTasksPanel.load(primaryStage, getCompletedTasksPlaceHolder(), logic.getFilteredTaskList()); + otherTasksPanel = OtherTasksPanel.load(primaryStage, getOtherTasksPlaceHolder(), logic.getFilteredTaskList()); + resultPopUp = ResultPopUp.load(primaryStage); statusBarFooter = StatusBarFooter.load(primaryStage, getStatusbarPlaceholder(), config.getToDoListFilePath()); - commandBox = CommandBox.load(primaryStage, getCommandBoxPlaceholder(), resultDisplay, logic); + commandBox = CommandBox.load(primaryStage, getCommandBoxPlaceholder(), resultPopUp, logic); } private AnchorPane getCommandBoxPlaceholder() { @@ -122,13 +139,17 @@ private AnchorPane getCommandBoxPlaceholder() { private AnchorPane getStatusbarPlaceholder() { return statusbarPlaceholder; } - - private AnchorPane getResultDisplayPlaceholder() { - return resultDisplayPlaceholder; + + public AnchorPane getAllTasksPlaceHolder() { + return allTasksPlaceHolder; } - - public AnchorPane getTaskListPlaceholder() { - return taskListPanelPlaceholder; + + public AnchorPane getCompletedTasksPlaceHolder() { + return completedTasksPlaceHolder; + } + + public AnchorPane getOtherTasksPlaceHolder() { + return otherTasksPlaceHolder; } public void hide() { @@ -164,10 +185,13 @@ public GuiSettings getCurrentGuiSetting() { (int) primaryStage.getX(), (int) primaryStage.getY()); } + @SuppressWarnings("restriction") @FXML public void handleHelp() { HelpWindow helpWindow = HelpWindow.load(primaryStage); - helpWindow.show(); + if(helpWindow != null) { + helpWindow.show(); + } } public void show() { @@ -182,15 +206,11 @@ private void handleExit() { raise(new ExitAppRequestEvent()); } - public TaskListPanel getTaskListPanel() { - return this.taskListPanel; + public AllTasksPanel getAllTasksPanel() { + return this.allTasksPanel; } - - public void loadTaskPage(ReadOnlyTask task) { - browserPanel.loadTaskPage(task); - } - - public void releaseResources() { - browserPanel.freeResources(); + + public CompletedTasksPanel getCompletedTasksPanel() { + return this.completedTasksPanel; } } diff --git a/src/main/java/seedu/agendum/ui/OtherTasksPanel.java b/src/main/java/seedu/agendum/ui/OtherTasksPanel.java new file mode 100644 index 000000000000..fd65ade9d157 --- /dev/null +++ b/src/main/java/seedu/agendum/ui/OtherTasksPanel.java @@ -0,0 +1,95 @@ +package seedu.agendum.ui; + +import java.util.logging.Logger; + +import javafx.application.Platform; +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.scene.Node; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.scene.control.SplitPane; +import javafx.scene.layout.AnchorPane; +import javafx.stage.Stage; +import seedu.agendum.model.task.ReadOnlyTask; +import seedu.agendum.commons.core.LogsCenter; + +/** + * Panel contains the list of other tasks + */ +public class OtherTasksPanel extends UiPart { + private final Logger logger = LogsCenter.getLogger(OtherTasksPanel.class); + private static final String FXML = "OtherTasksPanel.fxml"; + private AnchorPane panel; + private AnchorPane placeHolderPane; + + @FXML + private ListView otherTasksListView; + + public OtherTasksPanel() { + super(); + } + + @Override + public void setNode(Node node) { + panel = (AnchorPane) node; + } + + @Override + public String getFxmlPath() { + return FXML; + } + + @Override + public void setPlaceholder(AnchorPane pane) { + this.placeHolderPane = pane; + } + + public static OtherTasksPanel load(Stage primaryStage, AnchorPane OtherTasksPlaceholder, + ObservableList taskList) { + OtherTasksPanel otherTasksPanel = UiPartLoader.loadUiPart(primaryStage, OtherTasksPlaceholder, new OtherTasksPanel()); + otherTasksPanel.configure(taskList); + return otherTasksPanel; + } + + private void configure(ObservableList taskList) { + setConnections(taskList.filtered(task -> !task.isCompleted())); + addToPlaceholder(); + } + + private void setConnections(ObservableList otherTasks) { + otherTasksListView.setItems(otherTasks); + otherTasksListView.setCellFactory(listView -> new otherTasksListViewCell()); + } + + private void addToPlaceholder() { + SplitPane.setResizableWithParent(placeHolderPane, false); + placeHolderPane.getChildren().add(panel); + } + + public void scrollTo(int index) { + Platform.runLater(() -> { + otherTasksListView.scrollTo(index); + otherTasksListView.getSelectionModel().clearAndSelect(index); + }); + } + + class otherTasksListViewCell extends ListCell { + + public otherTasksListViewCell() { + } + + @Override + protected void updateItem(ReadOnlyTask task, boolean empty) { + super.updateItem(task, empty); + + if (empty || task == null) { + setGraphic(null); + setText(null); + } else { + setGraphic(TaskCard.load(task).getLayout()); + } + } + } + +} diff --git a/src/main/java/seedu/agendum/ui/ResultDisplay.java b/src/main/java/seedu/agendum/ui/ResultDisplay.java deleted file mode 100644 index 4a6b1de8f5ae..000000000000 --- a/src/main/java/seedu/agendum/ui/ResultDisplay.java +++ /dev/null @@ -1,65 +0,0 @@ -package seedu.agendum.ui; - -import javafx.beans.property.SimpleStringProperty; -import javafx.beans.property.StringProperty; -import javafx.scene.Node; -import javafx.scene.control.TextArea; -import javafx.scene.layout.AnchorPane; -import javafx.stage.Stage; -import seedu.agendum.commons.util.FxViewUtil; - -/** - * A ui for the status bar that is displayed at the header of the application. - */ -public class ResultDisplay extends UiPart { - public static final String RESULT_DISPLAY_ID = "resultDisplay"; - private static final String STATUS_BAR_STYLE_SHEET = "result-display"; - private TextArea resultDisplayArea; - private final StringProperty displayed = new SimpleStringProperty(""); - - private static final String FXML = "ResultDisplay.fxml"; - - private AnchorPane placeHolder; - - private AnchorPane mainPane; - - public static ResultDisplay load(Stage primaryStage, AnchorPane placeHolder) { - ResultDisplay statusBar = UiPartLoader.loadUiPart(primaryStage, placeHolder, new ResultDisplay()); - statusBar.configure(); - return statusBar; - } - - public void configure() { - resultDisplayArea = new TextArea(); - resultDisplayArea.setEditable(false); - resultDisplayArea.setId(RESULT_DISPLAY_ID); - resultDisplayArea.getStyleClass().removeAll(); - resultDisplayArea.getStyleClass().add(STATUS_BAR_STYLE_SHEET); - resultDisplayArea.setText(""); - resultDisplayArea.textProperty().bind(displayed); - FxViewUtil.applyAnchorBoundaryParameters(resultDisplayArea, 0.0, 0.0, 0.0, 0.0); - mainPane.getChildren().add(resultDisplayArea); - FxViewUtil.applyAnchorBoundaryParameters(mainPane, 0.0, 0.0, 0.0, 0.0); - placeHolder.getChildren().add(mainPane); - } - - @Override - public void setNode(Node node) { - mainPane = (AnchorPane) node; - } - - @Override - public void setPlaceholder(AnchorPane placeholder) { - this.placeHolder = placeholder; - } - - @Override - public String getFxmlPath() { - return FXML; - } - - public void postMessage(String message) { - displayed.setValue(message); - } - -} diff --git a/src/main/java/seedu/agendum/ui/ResultPopUp.java b/src/main/java/seedu/agendum/ui/ResultPopUp.java new file mode 100644 index 000000000000..ff0575d07c44 --- /dev/null +++ b/src/main/java/seedu/agendum/ui/ResultPopUp.java @@ -0,0 +1,85 @@ +package seedu.agendum.ui; + +import javafx.animation.PauseTransition; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import javafx.fxml.FXML; +import javafx.scene.Node; +import javafx.scene.Scene; +import javafx.scene.control.Label; +import javafx.scene.control.TextArea; +import javafx.scene.layout.AnchorPane; +import javafx.scene.paint.Color; +import javafx.stage.Stage; +import javafx.stage.StageStyle; +import javafx.util.Duration; +import seedu.agendum.commons.core.LogsCenter; + +import java.util.logging.Logger; + +/** + * Pop up window to show command execution result + */ +public class ResultPopUp extends UiPart { + private static final Logger logger = LogsCenter.getLogger(ResultPopUp.class); + private static final String FXML = "ResultPopUp.fxml"; + + private AnchorPane mainPane; + + private Stage dialogStage; + private static Stage root; + + @FXML + private Label resultDisplay; + + public static ResultPopUp load(Stage primaryStage) { + logger.fine("Showing command execution result."); + root = primaryStage; + ResultPopUp resultPopUp = UiPartLoader.loadUiPart(primaryStage, new ResultPopUp()); + resultPopUp.configure(); + return resultPopUp; + } + + @Override + public void setNode(Node node) { + mainPane = (AnchorPane) node; + } + + @Override + public String getFxmlPath() { + return FXML; + } + + private void configure(){ + + Scene scene = new Scene(mainPane); + dialogStage = createDialogStage(null, null, scene); + + scene.setFill(Color.TRANSPARENT); + dialogStage.initStyle(StageStyle.TRANSPARENT); + } + + public void postMessage(String message) { + resultDisplay.setWrapText(true); + resultDisplay.setText(message); + show(); + + PauseTransition delay = new PauseTransition(Duration.seconds(2)); + delay.setOnFinished(event -> reFocusRoot()); + delay.play(); + } + + public void reFocusRoot() { + dialogStage.setOpacity(0); + root.requestFocus(); + } + + public void show() { + dialogStage.requestFocus(); + dialogStage.setOpacity(1.0); + dialogStage.sizeToScene(); + dialogStage.show(); + dialogStage.setX(root.getX() + root.getWidth() / 2 - dialogStage.getWidth() / 2); + dialogStage.setY(root.getY() + root.getHeight() / 2 - dialogStage.getHeight() / 2); + } +} diff --git a/src/main/java/seedu/agendum/ui/StatusBarFooter.java b/src/main/java/seedu/agendum/ui/StatusBarFooter.java index 63c35df281e1..43994777d0ac 100644 --- a/src/main/java/seedu/agendum/ui/StatusBarFooter.java +++ b/src/main/java/seedu/agendum/ui/StatusBarFooter.java @@ -1,17 +1,32 @@ package seedu.agendum.ui; import com.google.common.eventbus.Subscribe; + +import javafx.animation.Animation; +import javafx.animation.KeyFrame; +import javafx.animation.Timeline; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; import javafx.fxml.FXML; +import javafx.geometry.Pos; import javafx.scene.Node; +import javafx.scene.control.ContentDisplay; +import javafx.scene.control.Label; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.GridPane; +import javafx.scene.paint.Color; +import javafx.scene.text.TextAlignment; import javafx.stage.Stage; +import javafx.util.Duration; + import org.controlsfx.control.StatusBar; import seedu.agendum.commons.core.LogsCenter; import seedu.agendum.commons.events.model.SaveLocationChangedEvent; import seedu.agendum.commons.events.model.ToDoListChangedEvent; import seedu.agendum.commons.util.FxViewUtil; +import java.text.SimpleDateFormat; +import java.util.Calendar; import java.util.Date; import java.util.logging.Logger; @@ -22,6 +37,7 @@ public class StatusBarFooter extends UiPart { private static final Logger logger = LogsCenter.getLogger(StatusBarFooter.class); private StatusBar syncStatus; private StatusBar saveLocationStatus; + private Label timeStatus; private GridPane mainPane; @@ -30,6 +46,9 @@ public class StatusBarFooter extends UiPart { @FXML private AnchorPane syncStatusBarPane; + + @FXML + private AnchorPane timeStatusBarPane; private AnchorPane placeHolder; @@ -46,7 +65,8 @@ public void configure(String saveLocation) { addSyncStatus(); setSyncStatus("Not updated yet in this session"); addSaveLocation(); - setSaveLocation(saveLocation); + setSaveLocation("./" + saveLocation); + addTimeStatus(); registerAsAnEventHandler(this); } @@ -74,7 +94,14 @@ private void addSyncStatus() { FxViewUtil.applyAnchorBoundaryParameters(syncStatus, 0.0, 0.0, 0.0, 0.0); syncStatusBarPane.getChildren().add(syncStatus); } - + + private void addTimeStatus() { + this.timeStatus = new DigitalClock(); + FxViewUtil.applyAnchorBoundaryParameters(timeStatus, 0.0, 0.0, 0.0, 0.0); + timeStatus.setAlignment(Pos.CENTER); + timeStatusBarPane.getChildren().add(timeStatus); + } + @Override public void setNode(Node node) { mainPane = (GridPane) node; @@ -104,3 +131,24 @@ public void handleSaveLocationChangedEvent(SaveLocationChangedEvent event) { setSaveLocation(saveLocation); } } + +class DigitalClock extends Label { + public DigitalClock() { + bindToTime(); + } + + private void bindToTime() { + Timeline timeline = new Timeline( + new KeyFrame(Duration.seconds(0), + new EventHandler() { + @Override public void handle(ActionEvent actionEvent) { + Calendar time = Calendar.getInstance(); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss, EEE d MMM yyyy"); + setText(simpleDateFormat.format(time.getTime())); + setTextFill(Color.web("#ffffff")); + } + }), new KeyFrame(Duration.seconds(1))); + timeline.setCycleCount(Animation.INDEFINITE); + timeline.play(); + } +} \ No newline at end of file diff --git a/src/main/java/seedu/agendum/ui/TaskCard.java b/src/main/java/seedu/agendum/ui/TaskCard.java index fa6cb0c85510..228d6e793ce2 100644 --- a/src/main/java/seedu/agendum/ui/TaskCard.java +++ b/src/main/java/seedu/agendum/ui/TaskCard.java @@ -1,14 +1,19 @@ package seedu.agendum.ui; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Optional; + import javafx.fxml.FXML; import javafx.scene.Node; import javafx.scene.control.Label; import javafx.scene.layout.HBox; +import javafx.scene.paint.Color; import seedu.agendum.model.task.ReadOnlyTask; -public class TaskCard extends UiPart{ - - private static final String FXML = "TaskListCard.fxml"; +public class TaskCard extends UiPart { + + private static final String FXML = "TaskCard.fxml"; @FXML private HBox cardPane; @@ -16,24 +21,70 @@ public class TaskCard extends UiPart{ private Label name; @FXML private Label id; + @FXML + private Label time; private ReadOnlyTask task; - private int displayedIndex; + private String displayedIndex; public TaskCard(){ } - public static TaskCard load(ReadOnlyTask task, int displayedIndex){ + public static TaskCard load(ReadOnlyTask task, int Index){ TaskCard card = new TaskCard(); card.task = task; - card.displayedIndex = displayedIndex; + card.displayedIndex = String.valueOf(Index) + "."; + return UiPartLoader.loadUiPart(card); + } + + public static TaskCard load(ReadOnlyTask task){ + TaskCard card = new TaskCard(); + card.task = task; + card.displayedIndex = ""; return UiPartLoader.loadUiPart(card); } @FXML public void initialize() { + + if(task.isOverdue()) { + cardPane.setStyle("-fx-background-color: rgb(255, 169, 147)"); + } else if(task.isUpcoming()) { + cardPane.setStyle("-fx-background-color: rgb(255, 229, 86)"); + } else { + cardPane.setStyle("-fx-background-color: rgba(255,255,255,0.6)"); + } + + name.setTextFill(Color.web("#555555")); + name.setText(task.getName().fullName); + id.setText(displayedIndex); + + if(task.isOverdue()) { + time.setText("Overdue\nScheduled: "+ formatTime()); + } else { + time.setText(formatTime()); + } + + } + + public String formatTime() { + StringBuilder sb = new StringBuilder(); + Optional start = task.getStartDateTime(); + Optional end = task.getEndDateTime(); + + DateTimeFormatter startFormat = DateTimeFormatter.ofPattern("HH:mm EEE, dd MMM"); + + if(start.isPresent()) { + sb.append("from ").append(start.get().format(startFormat)); + } + if(end.isPresent()) { + sb.append(sb.length()>0 ? " to " : "by "); + sb.append(end.get().format(startFormat)); + } + + return sb.toString().replace("AM", "am").replace("PM","pm"); } public HBox getLayout() { diff --git a/src/main/java/seedu/agendum/ui/TaskListPanel.java b/src/main/java/seedu/agendum/ui/TaskListPanel.java deleted file mode 100644 index a1ad36583ca0..000000000000 --- a/src/main/java/seedu/agendum/ui/TaskListPanel.java +++ /dev/null @@ -1,108 +0,0 @@ -package seedu.agendum.ui; - -import javafx.application.Platform; -import javafx.collections.ObservableList; -import javafx.fxml.FXML; -import javafx.scene.Node; -import javafx.scene.control.ListCell; -import javafx.scene.control.ListView; -import javafx.scene.control.SplitPane; -import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.VBox; -import javafx.stage.Stage; -import seedu.agendum.commons.events.ui.TaskPanelSelectionChangedEvent; -import seedu.agendum.model.task.ReadOnlyTask; -import seedu.agendum.commons.core.LogsCenter; - -import java.util.logging.Logger; - -/** - * Panel containing the list of tasks. - */ -public class TaskListPanel extends UiPart { - private final Logger logger = LogsCenter.getLogger(TaskListPanel.class); - private static final String FXML = "TaskListPanel.fxml"; - private VBox panel; - private AnchorPane placeHolderPane; - - @FXML - private ListView taskListView; - - public TaskListPanel() { - super(); - } - - @Override - public void setNode(Node node) { - panel = (VBox) node; - } - - @Override - public String getFxmlPath() { - return FXML; - } - - @Override - public void setPlaceholder(AnchorPane pane) { - this.placeHolderPane = pane; - } - - public static TaskListPanel load(Stage primaryStage, AnchorPane taskListPlaceholder, - ObservableList taskList) { - TaskListPanel taskListPanel = - UiPartLoader.loadUiPart(primaryStage, taskListPlaceholder, new TaskListPanel()); - taskListPanel.configure(taskList); - return taskListPanel; - } - - private void configure(ObservableList taskList) { - setConnections(taskList); - addToPlaceholder(); - } - - private void setConnections(ObservableList taskList) { - taskListView.setItems(taskList); - taskListView.setCellFactory(listView -> new TaskListViewCell()); - setEventHandlerForSelectionChangeEvent(); - } - - private void addToPlaceholder() { - SplitPane.setResizableWithParent(placeHolderPane, false); - placeHolderPane.getChildren().add(panel); - } - - private void setEventHandlerForSelectionChangeEvent() { - taskListView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { - if (newValue != null) { - logger.fine("Selection in task list panel changed to : '" + newValue + "'"); - raise(new TaskPanelSelectionChangedEvent(newValue)); - } - }); - } - - public void scrollTo(int index) { - Platform.runLater(() -> { - taskListView.scrollTo(index); - taskListView.getSelectionModel().clearAndSelect(index); - }); - } - - class TaskListViewCell extends ListCell { - - public TaskListViewCell() { - } - - @Override - protected void updateItem(ReadOnlyTask task, boolean empty) { - super.updateItem(task, empty); - - if (empty || task == null) { - setGraphic(null); - setText(null); - } else { - setGraphic(TaskCard.load(task, getIndex() + 1).getLayout()); - } - } - } - -} diff --git a/src/main/java/seedu/agendum/ui/UiManager.java b/src/main/java/seedu/agendum/ui/UiManager.java index 76c9de3034e4..f883a4d54cd6 100644 --- a/src/main/java/seedu/agendum/ui/UiManager.java +++ b/src/main/java/seedu/agendum/ui/UiManager.java @@ -12,7 +12,6 @@ import seedu.agendum.commons.core.LogsCenter; import seedu.agendum.commons.events.storage.DataSavingExceptionEvent; import seedu.agendum.commons.events.ui.JumpToListRequestEvent; -import seedu.agendum.commons.events.ui.TaskPanelSelectionChangedEvent; import seedu.agendum.commons.events.ui.ShowHelpRequestEvent; import seedu.agendum.commons.util.StringUtil; import seedu.agendum.logic.Logic; @@ -25,7 +24,7 @@ */ public class UiManager extends ComponentManager implements Ui { private static final Logger logger = LogsCenter.getLogger(UiManager.class); - private static final String ICON_APPLICATION = "/images/address_book_32.png"; + private static final String ICON_APPLICATION = "/images/agendum_icon.png"; private Logic logic; private Config config; @@ -62,7 +61,6 @@ public void start(Stage primaryStage) { public void stop() { prefs.updateLastUsedGuiSetting(mainWindow.getCurrentGuiSetting()); mainWindow.hide(); - mainWindow.releaseResources(); } private void showFileOperationAlertAndWait(String description, String details, Throwable cause) { @@ -114,13 +112,8 @@ private void handleShowHelpEvent(ShowHelpRequestEvent event) { @Subscribe private void handleJumpToListRequestEvent(JumpToListRequestEvent event) { logger.info(LogsCenter.getEventHandlingLogMessage(event)); - mainWindow.getTaskListPanel().scrollTo(event.targetIndex); - } - - @Subscribe - private void handleTaskPanelSelectionChangedEvent(TaskPanelSelectionChangedEvent event){ - logger.info(LogsCenter.getEventHandlingLogMessage(event)); - mainWindow.loadTaskPage(event.getNewSelection()); +// mainWindow.getTaskListPanel().scrollTo(event.targetIndex); + mainWindow.getAllTasksPanel().scrollTo(event.targetIndex); } } diff --git a/src/main/resources/images/address_book_32.png b/src/main/resources/images/address_book_32.png deleted file mode 100644 index 29810cf1fd93..000000000000 Binary files a/src/main/resources/images/address_book_32.png and /dev/null differ diff --git a/src/main/resources/images/agendum_icon.png b/src/main/resources/images/agendum_icon.png new file mode 100644 index 000000000000..41941a11f5e1 Binary files /dev/null and b/src/main/resources/images/agendum_icon.png differ diff --git a/src/main/resources/view/AllTasksPanel.fxml b/src/main/resources/view/AllTasksPanel.fxml new file mode 100644 index 000000000000..2aa4048a34fd --- /dev/null +++ b/src/main/resources/view/AllTasksPanel.fxml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/view/CompletedTaskCard.fxml b/src/main/resources/view/CompletedTaskCard.fxml new file mode 100644 index 000000000000..92f7584f7e00 --- /dev/null +++ b/src/main/resources/view/CompletedTaskCard.fxml @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/main/resources/view/CompletedTasksPanel.fxml b/src/main/resources/view/CompletedTasksPanel.fxml new file mode 100644 index 000000000000..d9f7aea1fc2a --- /dev/null +++ b/src/main/resources/view/CompletedTasksPanel.fxml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/view/DarkTheme.css b/src/main/resources/view/DarkTheme.css index 0d3593de87f1..bb337f178052 100644 --- a/src/main/resources/view/DarkTheme.css +++ b/src/main/resources/view/DarkTheme.css @@ -2,27 +2,6 @@ -fx-background-color: derive(#1d1d1d, 20%); } -.label { - -fx-font-size: 11pt; - -fx-font-family: "Segoe UI Semibold"; - -fx-text-fill: #555555; - -fx-opacity: 0.9; -} - -.label-bright { - -fx-font-size: 11pt; - -fx-font-family: "Segoe UI Semibold"; - -fx-text-fill: white; - -fx-opacity: 1; -} - -.label-header { - -fx-font-size: 32pt; - -fx-font-family: "Segoe UI Light"; - -fx-text-fill: white; - -fx-opacity: 1; -} - .text-field { -fx-font-size: 12pt; -fx-font-family: "Segoe UI Semibold"; @@ -38,43 +17,6 @@ -fx-max-height: 0; } -.table-view { - -fx-base: #1d1d1d; - -fx-control-inner-background: #1d1d1d; - -fx-background-color: #1d1d1d; - -fx-table-cell-border-color: transparent; - -fx-table-header-border-color: transparent; - -fx-padding: 5; -} - -.table-view .column-header-background { - -fx-background-color: transparent; -} - -.table-view .column-header, .table-view .filler { - -fx-size: 35; - -fx-border-width: 0 0 1 0; - -fx-background-color: transparent; - -fx-border-color: - transparent - transparent - derive(-fx-base, 80%) - transparent; - -fx-border-insets: 0 10 1 0; -} - -.table-view .column-header .label { - -fx-font-size: 20pt; - -fx-font-family: "Segoe UI Light"; - -fx-text-fill: white; - -fx-alignment: center-left; - -fx-opacity: 1; -} - -.table-view:focused .table-row-cell:filled:focused:selected { - -fx-background-color: -fx-focus-color; -} - .split-pane:horizontal .split-pane-divider { -fx-border-color: transparent #1d1d1d transparent #1d1d1d; -fx-background-color: transparent, derive(#1d1d1d, 10%); @@ -86,26 +28,6 @@ -fx-background-color: derive(#1d1d1d, 20%); } -.list-cell { - -fx-label-padding: 0 0 0 0; - -fx-graphic-text-gap : 0; - -fx-padding: 0 0 0 0; -} - -.list-cell .label { - -fx-text-fill: #010504; -} - -.cell_big_label { - -fx-font-size: 16px; - -fx-text-fill: #010504; -} - -.cell_small_label { - -fx-font-size: 11px; - -fx-text-fill: #010504; -} - .anchor-pane { -fx-background-color: derive(#1d1d1d, 20%); } @@ -118,18 +40,19 @@ .status-bar { -fx-background-color: derive(#1d1d1d, 20%); - -fx-text-fill: black; + -fx-text-fill: white; } .result-display { -fx-background-color: #ffffff; } -.result-display .label { +.result-display { -fx-text-fill: black !important; } .status-bar .label { + -fx-background-color: transparent; -fx-text-fill: white; } @@ -150,7 +73,7 @@ } .grid-pane .anchor-pane { - -fx-background-color: derive(#1d1d1d, 30%); + -fx-background-color: derive(#1d1d1d, 20%); } .context-menu { @@ -250,32 +173,57 @@ -fx-text-fill: white; } -.scroll-bar .thumb { - -fx-background-color: derive(#1d1d1d, 50%); - -fx-background-insets: 3; +.scroll-bar .increment-button { + -fx-opacity: 0; } -.scroll-bar .increment-button, .scroll-bar .decrement-button { - -fx-background-color: transparent; - -fx-padding: 0 0 0 0; +.scroll-bar .decrement-button { + -fx-opacity: 0; +} + +.scroll-bar { + -fx-background-color: transparent; +} + +.scroll-bar .track-background { + -fx-opacity: 0; + -fx-background-color: transparent; + -fx-background-insets: 0; +} + +.scroll-bar .track { + -fx-opacity: 0; + -fx-background-color: transparent; + -fx-border-color:transparent; +} + +.scroll-bar:horizontal .thumb { + -fx-background-color: rgba(255,255,255,0.5); + -fx-background-insets: 4 0 4 0; + -fx-background-radius: 2em; +} + +.scroll-bar:hover .thumb { + -fx-background-color: rgba(0,0,0,0.3); } -.scroll-bar .increment-arrow, .scroll-bar .decrement-arrow { - -fx-shape: " "; +.scroll-bar:pressed .thumb { + -fx-background-color: rgba(0,0,0,0.3); } -.scroll-bar:vertical .increment-arrow, .scroll-bar:vertical .decrement-arrow { - -fx-padding: 1 8 1 8; +.list-view .scroll-bar:vertical .increment-arrow, +.list-view .scroll-bar:vertical .decrement-arrow, +.list-view .scroll-bar:vertical .increment-button, +.list-view .scroll-bar:vertical .decrement-button { + -fx-padding:0; } -.scroll-bar:horizontal .increment-arrow, .scroll-bar:horizontal .decrement-arrow { - -fx-padding: 8 1 8 1; +.list-view { + -fx-background-radius: 10; } #cardPane { -fx-background-color: transparent; - -fx-border-color: #d6d6d6; - -fx-border-width: 1 1 1 1; } #commandTypeLabel { diff --git a/src/main/resources/view/DefaultBrowserPlaceHolderScreen.fxml b/src/main/resources/view/DefaultBrowserPlaceHolderScreen.fxml deleted file mode 100644 index bc761118235a..000000000000 --- a/src/main/resources/view/DefaultBrowserPlaceHolderScreen.fxml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - diff --git a/src/main/resources/view/HelpWindow.css b/src/main/resources/view/HelpWindow.css new file mode 100644 index 000000000000..7f7d4c502b56 --- /dev/null +++ b/src/main/resources/view/HelpWindow.css @@ -0,0 +1,103 @@ +.pane { + -fx-background-color: #EA6254; + -fx-background-radius: 10; +} + +.button { + -fx-background-color: rgba(0,0,0,0.1); + -fx-background-radius: 10; +} + +.button:hover { + -fx-background-color: rgba(0,0,0,0.3); + -fx-background-radius: 10; +} + +.table-view:focused{ + -fx-background-color: transparent; +} + +.table-view{ + -fx-background-color: transparent; +} + +.table-view .column-header-background{ + -fx-background-color: transparent; +} + +.table-view .column-header-background .label{ + -fx-background-color: transparent; + -fx-text-fill: white; + -fx-font-size: 16pt; +} + +.table-view .column-header { + -fx-background-color: transparent; +} + +.table-view .table-cell{ + -fx-text-fill: white; + -fx-font-size: 14pt; +} + +.table-cell:empty { + -fx-background-color: transparent; +} + +.table-row-cell{ + -fx-table-cell-border-color: transparent; + -fx-background-color: transparent; +} + +.table-row-cell:even{ + -fx-table-cell-border-color: transparent; + -fx-background-color: rgba(255,255,255,0.3); +} + +.table-row-cell:hover{ + -fx-background-color: rgba(0,0,0,0.1); +} + +.scroll-bar .increment-button { + -fx-opacity: 0; +} + +.scroll-bar .decrement-button { + -fx-opacity: 0; +} + +.scroll-bar { + -fx-background-color: transparent; +} + +.scroll-bar .track-background { + -fx-opacity: 0; + -fx-background-color: transparent; + -fx-background-insets: 0; +} + +.scroll-bar .track { + -fx-opacity: 0; + -fx-background-color: transparent; + -fx-border-color:transparent; +} + +.scroll-bar .thumb { + -fx-background-color: transparent; + -fx-background-insets: 4 0 4 0; + -fx-background-radius: 2em; +} + +.table-view .scroll-bar:vertical .increment-arrow, +.table-view .scroll-bar:vertical .decrement-arrow, +.table-view .scroll-bar:vertical .increment-button, +.table-view .scroll-bar:vertical .decrement-button { + -fx-padding:0; +} + +.table-view .scroll-bar:horizontal .increment-arrow, +.table-view .scroll-bar:horizontal .decrement-arrow, +.table-view .scroll-bar:horizontal .increment-button, +.table-view .scroll-bar:horizontal .decrement-button { + -fx-padding:0; +} \ No newline at end of file diff --git a/src/main/resources/view/HelpWindow.fxml b/src/main/resources/view/HelpWindow.fxml index 482ffa9a0287..8f04d6cf5114 100644 --- a/src/main/resources/view/HelpWindow.fxml +++ b/src/main/resources/view/HelpWindow.fxml @@ -1,8 +1,39 @@ + + + + - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/view/MainWindow.fxml b/src/main/resources/view/MainWindow.fxml index 79d4181c0333..8f6a51328446 100644 --- a/src/main/resources/view/MainWindow.fxml +++ b/src/main/resources/view/MainWindow.fxml @@ -1,10 +1,15 @@ - - - - + + + + + + + + + @@ -24,31 +29,37 @@ - + - + - - - - - - + - + - + - + - - - - - + + + + + + + + + + + + + + + + diff --git a/src/main/resources/view/OtherTasksPanel.fxml b/src/main/resources/view/OtherTasksPanel.fxml new file mode 100644 index 000000000000..99119b53a3ab --- /dev/null +++ b/src/main/resources/view/OtherTasksPanel.fxml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/view/ResultDisplay.fxml b/src/main/resources/view/ResultDisplay.fxml deleted file mode 100644 index 785fef703fe6..000000000000 --- a/src/main/resources/view/ResultDisplay.fxml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - diff --git a/src/main/resources/view/ResultPopUp.css b/src/main/resources/view/ResultPopUp.css new file mode 100644 index 000000000000..7b05206dc998 --- /dev/null +++ b/src/main/resources/view/ResultPopUp.css @@ -0,0 +1,10 @@ +.pane { + -fx-background-color: rgb(229,74,63); + -fx-background-radius: 20; + -fx-padding: 10px; +} + +.label { + -fx-text-fill: white; + -fx-font-size: 14pt; +} \ No newline at end of file diff --git a/src/main/resources/view/ResultPopUp.fxml b/src/main/resources/view/ResultPopUp.fxml new file mode 100644 index 000000000000..321dbe24495b --- /dev/null +++ b/src/main/resources/view/ResultPopUp.fxml @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/src/main/resources/view/StatusBarFooter.fxml b/src/main/resources/view/StatusBarFooter.fxml index b73cf328033c..764c0a000d93 100644 --- a/src/main/resources/view/StatusBarFooter.fxml +++ b/src/main/resources/view/StatusBarFooter.fxml @@ -1,13 +1,22 @@ - - + + + + + + + - - + + + + + + diff --git a/src/main/resources/view/TaskCard.fxml b/src/main/resources/view/TaskCard.fxml new file mode 100644 index 000000000000..56bcda0891ca --- /dev/null +++ b/src/main/resources/view/TaskCard.fxml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/view/TaskListCard.fxml b/src/main/resources/view/TaskListCard.fxml deleted file mode 100644 index d126739601ae..000000000000 --- a/src/main/resources/view/TaskListCard.fxml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/resources/view/TaskListPanel.fxml b/src/main/resources/view/TaskListPanel.fxml deleted file mode 100644 index 1b474547f6db..000000000000 --- a/src/main/resources/view/TaskListPanel.fxml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/src/main/resources/view/TasksPanel.css b/src/main/resources/view/TasksPanel.css new file mode 100644 index 000000000000..f803fd6424cf --- /dev/null +++ b/src/main/resources/view/TasksPanel.css @@ -0,0 +1,53 @@ +.all-pane { + -fx-background-color: #F39C12; + -fx-background-radius: 10; +} + +.completed-pane { + -fx-background-color: #03C9A9; + -fx-background-radius: 10; +} + +.other-pane { + -fx-background-color: #3498DB; + -fx-background-radius: 10; +} + +.list-view { + -fx-background-color: transparent; + -fx-background-radius: 10; +} + +.list-cell { + -fx-background-radius: 10; + -fx-background-color: transparent; +} + +.list-cell:empty { + -fx-background-color: transparent; +} + +.cell_big_label { + -fx-font-size: 16pt; + -fx-opacity: 0.9; +} + +.cell_small_label { + -fx-font-size: 11pt; + -fx-text-fill: #555555; + -fx-opacity: 0.9; +} + +.cell_time_label { + -fx-text-fill: #5284f2; + -fx-font-family: "Segoe UI Light"; + -fx-opacity: 0.9; +} + +.hbox { + -fx-background-radius: 10; +} + +.vbox { + -fx-background-color: transparent; +} \ No newline at end of file diff --git a/src/test/java/guitests/HelpWindowTest.java b/src/test/java/guitests/HelpWindowTest.java index 91d2dbb1a192..5eae1eba2277 100644 --- a/src/test/java/guitests/HelpWindowTest.java +++ b/src/test/java/guitests/HelpWindowTest.java @@ -1,6 +1,8 @@ package guitests; import guitests.guihandles.HelpWindowHandle; +import guitests.guihandles.MainGuiHandle; + import org.junit.Test; import static org.junit.Assert.assertTrue; @@ -20,6 +22,16 @@ public void openHelpWindow() { } + @Test + public void closeHelpWindow() { + assertHelpWindowClose(mainMenu.closeHelpWindowUsingAccelerator()); + } + + private void assertHelpWindowClose(MainGuiHandle mainGuiHandle) { + commandBox.runHelpCommand(); + assertTrue(mainGuiHandle.isWindowClose()); + } + private void assertHelpWindowOpen(HelpWindowHandle helpWindowHandle) { assertTrue(helpWindowHandle.isWindowOpen()); helpWindowHandle.closeWindow(); diff --git a/src/test/java/guitests/SelectCommandTest.java b/src/test/java/guitests/SelectCommandTest.java deleted file mode 100644 index 1c3033ade6d2..000000000000 --- a/src/test/java/guitests/SelectCommandTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package guitests; - -import org.junit.Test; -import seedu.agendum.logic.commands.SelectCommand; -import seedu.agendum.commons.core.Messages; -import seedu.agendum.model.task.ReadOnlyTask; - -import static org.junit.Assert.assertEquals; - -public class SelectCommandTest extends ToDoListGuiTest { - - - @Test - public void selectTask_nonEmptyList() { - - assertSelectionInvalid(10); //invalid index - assertNoTaskSelected(); - - assertSelectionSuccess(1); //first task in the list - int taskCount = td.getTypicalTasks().length; - assertSelectionSuccess(taskCount); //last task in the list - int middleIndex = taskCount / 2; - assertSelectionSuccess(middleIndex); //a task in the middle of the list - - assertSelectionInvalid(taskCount + 1); //invalid index - assertTaskSelected(middleIndex); //assert previous selection remains - - /* Testing other invalid indexes such as -1 should be done when testing the SelectCommand */ - } - - @Test - public void selectTask_emptyList(){ - commandBox.runCommand("clear"); - assertListSize(0); - assertSelectionInvalid(1); //invalid index - } - - private void assertSelectionInvalid(int index) { - commandBox.runCommand("select " + index); - assertResultMessage(Messages.MESSAGE_INVALID_TASK_DISPLAYED_INDEX); - } - - private void assertSelectionSuccess(int index) { - commandBox.runCommand("select " + index); - assertResultMessage(String.format(SelectCommand.MESSAGE_SELECT_TASK_SUCCESS, index)); - assertTaskSelected(index); - } - - private void assertTaskSelected(int index) { - assertEquals(taskListPanel.getSelectedTasks().size(), 1); - ReadOnlyTask selectedTask = taskListPanel.getSelectedTasks().get(0); - assertEquals(taskListPanel.getTask(index-1), selectedTask); - //TODO: confirm the correct page is loaded in the Browser Panel - } - - private void assertNoTaskSelected() { - assertEquals(taskListPanel.getSelectedTasks().size(), 0); - } - -} diff --git a/src/test/java/guitests/guihandles/CommandBoxHandle.java b/src/test/java/guitests/guihandles/CommandBoxHandle.java index dcd3155636cd..dc02e66984f8 100644 --- a/src/test/java/guitests/guihandles/CommandBoxHandle.java +++ b/src/test/java/guitests/guihandles/CommandBoxHandle.java @@ -28,7 +28,7 @@ public String getCommandInput() { public void runCommand(String command) { enterCommand(command); pressEnter(); - guiRobot.sleep(200); //Give time for the command to take effect + guiRobot.sleep(1000); //Give time for the command to take effect } public HelpWindowHandle runHelpCommand() { diff --git a/src/test/java/guitests/guihandles/HelpWindowHandle.java b/src/test/java/guitests/guihandles/HelpWindowHandle.java index 3931c5fb24b7..2266908772fa 100644 --- a/src/test/java/guitests/guihandles/HelpWindowHandle.java +++ b/src/test/java/guitests/guihandles/HelpWindowHandle.java @@ -1,5 +1,7 @@ package guitests.guihandles; +import java.util.NoSuchElementException; + import guitests.GuiRobot; import javafx.stage.Stage; diff --git a/src/test/java/guitests/guihandles/MainGuiHandle.java b/src/test/java/guitests/guihandles/MainGuiHandle.java index 7b4b770196b8..9449dc696669 100644 --- a/src/test/java/guitests/guihandles/MainGuiHandle.java +++ b/src/test/java/guitests/guihandles/MainGuiHandle.java @@ -1,6 +1,8 @@ package guitests.guihandles; import guitests.GuiRobot; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; import javafx.stage.Stage; import seedu.agendum.TestApp; @@ -9,6 +11,8 @@ */ public class MainGuiHandle extends GuiHandle { + private static final String HELP_WINDOW_ROOT_FIELD_ID = "#helpWindowRoot"; + public MainGuiHandle(GuiRobot guiRobot, Stage primaryStage) { super(guiRobot, primaryStage, TestApp.APP_TITLE); } @@ -28,5 +32,14 @@ public CommandBoxHandle getCommandBox() { public MainMenuHandle getMainMenu() { return new MainMenuHandle(guiRobot, primaryStage); } + + public boolean isWindowClose() { + return getNode(HELP_WINDOW_ROOT_FIELD_ID) != null; + } + + private void useAcceleratorToCloseHelpWindow() { + guiRobot.push(new KeyCodeCombination(KeyCode.ESCAPE)); + guiRobot.sleep(500); + } } diff --git a/src/test/java/guitests/guihandles/MainMenuHandle.java b/src/test/java/guitests/guihandles/MainMenuHandle.java index eac004292dea..f21b94ecfc3a 100644 --- a/src/test/java/guitests/guihandles/MainMenuHandle.java +++ b/src/test/java/guitests/guihandles/MainMenuHandle.java @@ -2,6 +2,8 @@ import guitests.GuiRobot; import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; import javafx.stage.Stage; import seedu.agendum.TestApp; @@ -21,17 +23,28 @@ public GuiHandle clickOn(String... menuText) { } public HelpWindowHandle openHelpWindowUsingMenu() { - clickOn("Help", "F1"); + clickOn("Help", "F5"); return new HelpWindowHandle(guiRobot, primaryStage); } public HelpWindowHandle openHelpWindowUsingAccelerator() { - useF1Accelerator(); + useAcceleratorToOpenHelpWindow(); return new HelpWindowHandle(guiRobot, primaryStage); } + + public MainGuiHandle closeHelpWindowUsingAccelerator() { + useAcceleratorToCloseHelpWindow(); + return new MainGuiHandle(guiRobot, primaryStage); + } - private void useF1Accelerator() { - guiRobot.push(KeyCode.F1); + private void useAcceleratorToOpenHelpWindow() { + guiRobot.push(new KeyCodeCombination(KeyCode.F5)); + guiRobot.sleep(500); + } + + private void useAcceleratorToCloseHelpWindow() { + guiRobot.push(new KeyCodeCombination(KeyCode.ESCAPE)); guiRobot.sleep(500); } + } diff --git a/src/test/java/guitests/guihandles/ResultDisplayHandle.java b/src/test/java/guitests/guihandles/ResultDisplayHandle.java index 4da0bb3b097b..e9daf20a62b2 100644 --- a/src/test/java/guitests/guihandles/ResultDisplayHandle.java +++ b/src/test/java/guitests/guihandles/ResultDisplayHandle.java @@ -1,6 +1,7 @@ package guitests.guihandles; import guitests.GuiRobot; +import javafx.scene.control.Label; import javafx.scene.control.TextArea; import javafx.stage.Stage; import seedu.agendum.TestApp; @@ -20,7 +21,7 @@ public String getText() { return getResultDisplay().getText(); } - private TextArea getResultDisplay() { - return (TextArea) getNode(RESULT_DISPLAY_ID); + private Label getResultDisplay() { + return (Label) getNode(RESULT_DISPLAY_ID); } } diff --git a/src/test/java/guitests/guihandles/TaskListPanelHandle.java b/src/test/java/guitests/guihandles/TaskListPanelHandle.java index fd0c4de92457..11b096f4f8a3 100644 --- a/src/test/java/guitests/guihandles/TaskListPanelHandle.java +++ b/src/test/java/guitests/guihandles/TaskListPanelHandle.java @@ -25,7 +25,7 @@ public class TaskListPanelHandle extends GuiHandle { public static final int NOT_FOUND = -1; public static final String CARD_PANE_ID = "#cardPane"; - private static final String TASK_LIST_VIEW_ID = "#taskListView"; + private static final String TASK_LIST_VIEW_ID = "#allTasksListView"; public TaskListPanelHandle(GuiRobot guiRobot, Stage primaryStage) { super(guiRobot, primaryStage, TestApp.APP_TITLE); diff --git a/src/test/java/seedu/agendum/commons/util/AppUtilTest.java b/src/test/java/seedu/agendum/commons/util/AppUtilTest.java index 10acdabed286..a91617736f92 100644 --- a/src/test/java/seedu/agendum/commons/util/AppUtilTest.java +++ b/src/test/java/seedu/agendum/commons/util/AppUtilTest.java @@ -15,7 +15,7 @@ public class AppUtilTest { @Test public void getImage_exitingImage(){ - assertNotNull(AppUtil.getImage("/images/address_book_32.png")); + assertNotNull(AppUtil.getImage("/images/agendum_icon.png")); } diff --git a/src/test/java/seedu/agendum/logic/DateTimerParserTest.java b/src/test/java/seedu/agendum/logic/DateTimerParserTest.java new file mode 100644 index 000000000000..ac9fa6335804 --- /dev/null +++ b/src/test/java/seedu/agendum/logic/DateTimerParserTest.java @@ -0,0 +1,23 @@ +package seedu.agendum.logic; + +import org.junit.Test; +import seedu.agendum.logic.parser.DateTimeParser; + +import java.time.LocalDateTime; +import java.util.Optional; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class DateTimerParserTest { + + private void assertDates(LocalDateTime dateTime1, LocalDateTime dateTime2) { + assertEquals(dateTime1, dateTime2); + } + + @Test + public void simpleDateTest() throws Exception { + Optional t = DateTimeParser.parseString("2016/01/01 00:00"); + assertDates(t.get(), LocalDateTime.of(2016,1,1,0,0)); + } +} diff --git a/src/test/java/seedu/agendum/logic/LogicManagerTest.java b/src/test/java/seedu/agendum/logic/LogicManagerTest.java index 1e9b960839ba..9c7f130d44d9 100644 --- a/src/test/java/seedu/agendum/logic/LogicManagerTest.java +++ b/src/test/java/seedu/agendum/logic/LogicManagerTest.java @@ -1,6 +1,10 @@ package seedu.agendum.logic; import com.google.common.eventbus.Subscribe; + +import javafx.collections.transformation.FilteredList; +import javafx.collections.transformation.SortedList; + import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -9,6 +13,7 @@ import seedu.agendum.commons.core.Config; import seedu.agendum.commons.core.EventsCenter; +import seedu.agendum.commons.core.UnmodifiableObservableList; import seedu.agendum.logic.commands.*; import seedu.agendum.commons.events.ui.JumpToListRequestEvent; import seedu.agendum.commons.events.ui.ShowHelpRequestEvent; @@ -665,12 +670,21 @@ public void execute_find_onlyMatchesFullWordsInNames() throws Exception { List fourTasks = helper.generateTaskList(p1, pTarget1, p2, pTarget2); ToDoList expectedTDL = helper.generateToDoList(fourTasks); List expectedList = helper.generateTaskList(pTarget1, pTarget2); + ToDoList generatedTDL = helper.generateToDoList(expectedList); helper.addToModel(model, fourTasks); + + ToDoList toDoList = new ToDoList(generatedTDL); + FilteredList filteredTasks = new FilteredList<>(toDoList.getTasks()); + SortedList sortedTasks = filteredTasks.sorted(); + UnmodifiableObservableList expectedUOList = new UnmodifiableObservableList<>(sortedTasks); + + String inputCommand = "find KEY"; + String expectedMessage = Command.getMessageForTaskListShownSummary(expectedList.size()); - assertCommandBehavior("find KEY", - Command.getMessageForTaskListShownSummary(expectedList.size()), + assertCommandBehavior(inputCommand, + expectedMessage, expectedTDL, - expectedList); + expectedUOList); } @Test @@ -683,11 +697,18 @@ public void execute_find_isNotCaseSensitive() throws Exception { List fourTasks = helper.generateTaskList(p3, p1, p4, p2); ToDoList expectedTDL = helper.generateToDoList(fourTasks); - List expectedList = fourTasks; helper.addToModel(model, fourTasks); + + ToDoList toDoList = new ToDoList(expectedTDL); + FilteredList filteredTasks = new FilteredList<>(toDoList.getTasks()); + SortedList sortedTasks = filteredTasks.sorted(); + UnmodifiableObservableList expectedList = new UnmodifiableObservableList<>(sortedTasks); + + String inputCommand = "find KEY"; + String expectedMessage = Command.getMessageForTaskListShownSummary(expectedList.size()); - assertCommandBehavior("find KEY", - Command.getMessageForTaskListShownSummary(expectedList.size()), + assertCommandBehavior(inputCommand, + expectedMessage, expectedTDL, expectedList); } diff --git a/src/test/java/seedu/agendum/testutil/TestTask.java b/src/test/java/seedu/agendum/testutil/TestTask.java index ef4c0efa0841..99520f7494af 100644 --- a/src/test/java/seedu/agendum/testutil/TestTask.java +++ b/src/test/java/seedu/agendum/testutil/TestTask.java @@ -10,6 +10,8 @@ */ public class TestTask implements ReadOnlyTask { + private static final int UPCOMING_DAYS_THRESHOLD = 7; + private Name name; private boolean isCompleted; private LocalDateTime startDateTime; @@ -61,6 +63,23 @@ public boolean isCompleted() { return isCompleted; } + @Override + public boolean isOverdue() { + if (!getTaskTime().isPresent()) { + return false; + } + return !isCompleted() && getTaskTime().get().isBefore(LocalDateTime.now()); + } + + @Override + public boolean isUpcoming() { + if (!getTaskTime().isPresent()) { + return false; + } + return !isCompleted() && getTaskTime().get().isBefore( + LocalDateTime.now().plusDays(UPCOMING_DAYS_THRESHOLD)); + } + @Override public Optional getStartDateTime() { return Optional.ofNullable(startDateTime); @@ -71,6 +90,14 @@ public Optional getEndDateTime() { return Optional.ofNullable(endDateTime); } + private Optional getTaskTime() { + if (getStartDateTime().isPresent()) { + return getStartDateTime(); + } else { + return getEndDateTime(); + } + } + @Override public String toString() { return getAsText();