From 8e02a66d2bfd96c8b5e4df9af4179cd7bff3e249 Mon Sep 17 00:00:00 2001 From: fanwgwg Date: Mon, 10 Oct 2016 23:40:17 +0800 Subject: [PATCH 01/67] Update UI for v0.2 demo --- src/main/java/seedu/agendum/logic/Logic.java | 3 + .../seedu/agendum/logic/LogicManager.java | 8 ++ .../java/seedu/agendum/ui/CommandBox.java | 14 +-- .../seedu/agendum/ui/CompletedTaskCard.java | 56 +++++++++ .../seedu/agendum/ui/CompletedTasksPanel.java | 106 ++++++++++++++++++ .../java/seedu/agendum/ui/MainWindow.java | 41 ++++--- .../java/seedu/agendum/ui/ResultPopUp.java | 91 +++++++++++++++ src/main/java/seedu/agendum/ui/TaskCard.java | 5 + src/main/java/seedu/agendum/ui/UiManager.java | 3 +- .../seedu/agendum/ui/UpcomingTaskCard.java | 83 ++++++++++++++ .../seedu/agendum/ui/UpcomingTasksPanel.java | 106 ++++++++++++++++++ .../resources/view/CompletedTaskCard.fxml | 6 + .../resources/view/CompletedTasksPanel.fxml | 22 ++++ src/main/resources/view/DarkTheme.css | 47 +------- src/main/resources/view/MainWindow.fxml | 42 ++++--- src/main/resources/view/ResultPopUp.css | 31 +++++ src/main/resources/view/ResultPopUp.fxml | 20 ++++ src/main/resources/view/TaskListCard.fxml | 39 ------- src/main/resources/view/TasksPanel.css | 59 ++++++++++ src/main/resources/view/UpcomingTaskCard.fxml | 70 ++++++++++++ .../resources/view/UpcomingTasksPanel.css | 44 ++++++++ .../resources/view/UpcomingTasksPanel.fxml | 22 ++++ .../guihandles/ResultDisplayHandle.java | 2 +- .../guihandles/TaskListPanelHandle.java | 2 +- 24 files changed, 793 insertions(+), 129 deletions(-) create mode 100644 src/main/java/seedu/agendum/ui/CompletedTaskCard.java create mode 100644 src/main/java/seedu/agendum/ui/CompletedTasksPanel.java create mode 100644 src/main/java/seedu/agendum/ui/ResultPopUp.java create mode 100644 src/main/java/seedu/agendum/ui/UpcomingTaskCard.java create mode 100644 src/main/java/seedu/agendum/ui/UpcomingTasksPanel.java create mode 100644 src/main/resources/view/CompletedTaskCard.fxml create mode 100644 src/main/resources/view/CompletedTasksPanel.fxml create mode 100644 src/main/resources/view/ResultPopUp.css create mode 100644 src/main/resources/view/ResultPopUp.fxml delete mode 100644 src/main/resources/view/TaskListCard.fxml create mode 100644 src/main/resources/view/TasksPanel.css create mode 100644 src/main/resources/view/UpcomingTaskCard.fxml create mode 100644 src/main/resources/view/UpcomingTasksPanel.css create mode 100644 src/main/resources/view/UpcomingTasksPanel.fxml 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/ui/CommandBox.java b/src/main/java/seedu/agendum/ui/CommandBox.java index 6aaba5ce2940..b07364f4eef9 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,10 @@ private void handleCommandInputChanged() { */ setStyleToIndicateCorrectCommand(); mostRecentResult = logic.execute(previousCommandTest); - resultDisplay.postMessage(mostRecentResult.feedbackToUser); + 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..c2e147d9b42d --- /dev/null +++ b/src/main/java/seedu/agendum/ui/CompletedTaskCard.java @@ -0,0 +1,56 @@ +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; + @FXML + private Label tags; + + 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 + ". "); + tags.setText(task.tagsString()); + } + + 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..478f5ba68676 --- /dev/null +++ b/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java @@ -0,0 +1,106 @@ +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.commons.events.ui.TaskPanelSelectionChangedEvent; +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 completedTasks) { + setConnections(completedTasks); + addToPlaceholder(); + } + + private void setConnections(ObservableList completedTasks) { + completedTasksListView.setItems(completedTasks); + completedTasksListView.setCellFactory(listView -> new completedTasksListViewCell()); + setEventHandlerForSelectionChangeEvent(); + } + + private void addToPlaceholder() { + SplitPane.setResizableWithParent(placeHolderPane, false); + placeHolderPane.getChildren().add(panel); + } + + private void setEventHandlerForSelectionChangeEvent() { + completedTasksListView.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(() -> { + 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(CompletedTaskCard.load(task, getIndex() + 1).getLayout()); + } + } + } + +} diff --git a/src/main/java/seedu/agendum/ui/MainWindow.java b/src/main/java/seedu/agendum/ui/MainWindow.java index c6b83a2a5c86..a10f18207cb1 100644 --- a/src/main/java/seedu/agendum/ui/MainWindow.java +++ b/src/main/java/seedu/agendum/ui/MainWindow.java @@ -30,8 +30,9 @@ public class MainWindow extends UiPart { // Independent Ui parts residing in this Ui container private BrowserPanel browserPanel; - private TaskListPanel taskListPanel; - private ResultDisplay resultDisplay; + private UpcomingTasksPanel upcomingTasksPanel; + private CompletedTasksPanel completedTasksPanel; + private ResultPopUp resultPopUp; private StatusBarFooter statusBarFooter; private CommandBox commandBox; private Config config; @@ -53,15 +54,14 @@ public class MainWindow extends UiPart { private MenuItem helpMenuItem; @FXML - private AnchorPane taskListPanelPlaceholder; - + private AnchorPane upcomingTasksPlaceHolder; + @FXML - private AnchorPane resultDisplayPlaceholder; - + private AnchorPane completedTasksPlaceHolder; + @FXML private AnchorPane statusbarPlaceholder; - public MainWindow() { super(); } @@ -109,10 +109,11 @@ private void setAccelerators() { void fillInnerParts() { browserPanel = BrowserPanel.load(browserPlaceholder); - taskListPanel = TaskListPanel.load(primaryStage, getTaskListPlaceholder(), logic.getFilteredTaskList()); - resultDisplay = ResultDisplay.load(primaryStage, getResultDisplayPlaceholder()); + upcomingTasksPanel = UpcomingTasksPanel.load(primaryStage, getUpcomingTasksPlaceHolder(), logic.getFilteredTaskList()); + completedTasksPanel = CompletedTasksPanel.load(primaryStage, getCompletedTasksPlaceHolder(), logic.getCompletedTaskList()); + 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 +123,13 @@ private AnchorPane getCommandBoxPlaceholder() { private AnchorPane getStatusbarPlaceholder() { return statusbarPlaceholder; } - - private AnchorPane getResultDisplayPlaceholder() { - return resultDisplayPlaceholder; + + public AnchorPane getUpcomingTasksPlaceHolder() { + return upcomingTasksPlaceHolder; } - - public AnchorPane getTaskListPlaceholder() { - return taskListPanelPlaceholder; + + public AnchorPane getCompletedTasksPlaceHolder() { + return completedTasksPlaceHolder; } public void hide() { @@ -182,8 +183,12 @@ private void handleExit() { raise(new ExitAppRequestEvent()); } - public TaskListPanel getTaskListPanel() { - return this.taskListPanel; + public UpcomingTasksPanel getUpcomingTasksPanel() { + return this.upcomingTasksPanel; + } + + public CompletedTasksPanel getCompletedTasksPanel() { + return this.completedTasksPanel; } public void loadTaskPage(ReadOnlyTask task) { 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..217e4115bdd2 --- /dev/null +++ b/src/main/java/seedu/agendum/ui/ResultPopUp.java @@ -0,0 +1,91 @@ +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.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"; + public static final int HEIGHT = 150; + public static final int WIDTH = 200; + private final StringProperty displayed = new SimpleStringProperty(""); + + private AnchorPane mainPane; + + private Stage dialogStage; + private static Stage root; + + @FXML + private TextArea resultTextArea; + + 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; + } + + private void setWindowMinSize() { + dialogStage.setHeight(HEIGHT); + dialogStage.setWidth(WIDTH); + } + + @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); + dialogStage.setMaximized(false); + setWindowMinSize(); + + scene.setFill(Color.TRANSPARENT); + dialogStage.initStyle(StageStyle.TRANSPARENT); + } + + public void postMessage(String message) { + displayed.setValue(message); + resultTextArea.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.show(); + } +} diff --git a/src/main/java/seedu/agendum/ui/TaskCard.java b/src/main/java/seedu/agendum/ui/TaskCard.java index 75257ee2f795..9b320a2c7c02 100644 --- a/src/main/java/seedu/agendum/ui/TaskCard.java +++ b/src/main/java/seedu/agendum/ui/TaskCard.java @@ -38,6 +38,11 @@ public void initialize() { name.setText(task.getName().fullName); id.setText(displayedIndex + ". "); tags.setText(task.tagsString()); + if (task.isCompleted()) { + cardPane.setStyle("-fx-background-color: aquamarine"); + } else { + cardPane.setStyle("-fx-background-color: salmon"); + } } public HBox getLayout() { diff --git a/src/main/java/seedu/agendum/ui/UiManager.java b/src/main/java/seedu/agendum/ui/UiManager.java index 76c9de3034e4..34c420a61c72 100644 --- a/src/main/java/seedu/agendum/ui/UiManager.java +++ b/src/main/java/seedu/agendum/ui/UiManager.java @@ -114,7 +114,8 @@ private void handleShowHelpEvent(ShowHelpRequestEvent event) { @Subscribe private void handleJumpToListRequestEvent(JumpToListRequestEvent event) { logger.info(LogsCenter.getEventHandlingLogMessage(event)); - mainWindow.getTaskListPanel().scrollTo(event.targetIndex); +// mainWindow.getTaskListPanel().scrollTo(event.targetIndex); + mainWindow.getUpcomingTasksPanel().scrollTo(event.targetIndex); } @Subscribe diff --git a/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java b/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java new file mode 100644 index 000000000000..972ca1d31127 --- /dev/null +++ b/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java @@ -0,0 +1,83 @@ +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 seedu.agendum.model.task.ReadOnlyTask; + +public class UpcomingTaskCard extends UiPart { + + private static final String FXML = "UpcomingTaskCard.fxml"; + + @FXML + private HBox cardPane; + @FXML + private Label name; + @FXML + private Label id; + @FXML + private Label tags; + @FXML + private Label time; + + private ReadOnlyTask task; + private int displayedIndex; + + public UpcomingTaskCard(){ + + } + + public static UpcomingTaskCard load(ReadOnlyTask task, int displayedIndex){ + UpcomingTaskCard card = new UpcomingTaskCard(); + card.task = task; + card.displayedIndex = displayedIndex; + return UiPartLoader.loadUiPart(card); + } + + @FXML + public void initialize() { + name.setText(task.getName().fullName); + id.setText(displayedIndex + ". "); + time.setText(formatTime()); + tags.setText(task.tagsString()); + } + + public String formatTime() { + StringBuilder sb = new StringBuilder(); + Optional start = task.getStartDateTime(); + Optional end = task.getStartDateTime(); + + DateTimeFormatter startFormat = DateTimeFormatter.ofPattern("EEE, dd MMM"); + + if(start.isPresent() && end.isPresent()) { // Have both start time and end time + sb.append("from ").append(start.get().format(startFormat)).append(" to ").append(end.get().format(startFormat)); + } else if (end.isPresent()) { // No start time + sb.append("by ").append(end.get().format(startFormat)); + } else if (start.isPresent()) { // No end time + sb.append("from ").append(start.get().format(startFormat)); + } else { // Both are null + sb.append(""); + } + + return sb.toString(); + } + + 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/UpcomingTasksPanel.java b/src/main/java/seedu/agendum/ui/UpcomingTasksPanel.java new file mode 100644 index 000000000000..b4004f4aa73d --- /dev/null +++ b/src/main/java/seedu/agendum/ui/UpcomingTasksPanel.java @@ -0,0 +1,106 @@ +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.commons.events.ui.TaskPanelSelectionChangedEvent; +import seedu.agendum.model.task.ReadOnlyTask; +import seedu.agendum.commons.core.LogsCenter; + +/** + * Panel contains the list of upcoming tasks + */ +public class UpcomingTasksPanel extends UiPart { + private final Logger logger = LogsCenter.getLogger(UpcomingTasksPanel.class); + private static final String FXML = "UpcomingTasksPanel.fxml"; + private AnchorPane panel; + private AnchorPane placeHolderPane; + + @FXML + private ListView upcomingTasksListView; + + public UpcomingTasksPanel() { + 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 UpcomingTasksPanel load(Stage primaryStage, AnchorPane UpcomingTasksPlaceholder, + ObservableList taskList) { + UpcomingTasksPanel upcomingTasksPanel = UiPartLoader.loadUiPart(primaryStage, UpcomingTasksPlaceholder, new UpcomingTasksPanel()); + upcomingTasksPanel.configure(taskList); + return upcomingTasksPanel; + } + + private void configure(ObservableList upcomingTasks) { + setConnections(upcomingTasks); + addToPlaceholder(); + } + + private void setConnections(ObservableList upcomingTasks) { + upcomingTasksListView.setItems(upcomingTasks); + upcomingTasksListView.setCellFactory(listView -> new upcomingTasksListViewCell()); + setEventHandlerForSelectionChangeEvent(); + } + + private void addToPlaceholder() { + SplitPane.setResizableWithParent(placeHolderPane, false); + placeHolderPane.getChildren().add(panel); + } + + private void setEventHandlerForSelectionChangeEvent() { + upcomingTasksListView.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(() -> { + upcomingTasksListView.scrollTo(index); + upcomingTasksListView.getSelectionModel().clearAndSelect(index); + }); + } + + class upcomingTasksListViewCell extends ListCell { + + public upcomingTasksListViewCell() { + } + + @Override + protected void updateItem(ReadOnlyTask task, boolean empty) { + super.updateItem(task, empty); + + if (empty || task == null) { + setGraphic(null); + setText(null); + } else { + setGraphic(UpcomingTaskCard.load(task, getIndex() + 1).getLayout()); + } + } + } + +} 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..0f076ef72fa2 --- /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..b5e3d8cfa63a 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"; @@ -63,7 +42,7 @@ -fx-border-insets: 0 10 1 0; } -.table-view .column-header .label { +.table-view .column-header { -fx-font-size: 20pt; -fx-font-family: "Segoe UI Light"; -fx-text-fill: white; @@ -86,26 +65,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%); } @@ -125,7 +84,7 @@ -fx-background-color: #ffffff; } -.result-display .label { +.result-display { -fx-text-fill: black !important; } @@ -275,7 +234,7 @@ #cardPane { -fx-background-color: transparent; -fx-border-color: #d6d6d6; - -fx-border-width: 1 1 1 1; + -fx-border-width: 0 0 0 0; } #commandTypeLabel { diff --git a/src/main/resources/view/MainWindow.fxml b/src/main/resources/view/MainWindow.fxml index 79d4181c0333..5c1bcd81e7cf 100644 --- a/src/main/resources/view/MainWindow.fxml +++ b/src/main/resources/view/MainWindow.fxml @@ -1,10 +1,15 @@ - - - - + + + + + + + + + @@ -24,29 +29,32 @@ - + - + - - - - - - + - + - + - + + + + + + + + + - + - + diff --git a/src/main/resources/view/ResultPopUp.css b/src/main/resources/view/ResultPopUp.css new file mode 100644 index 000000000000..094f2ba4f062 --- /dev/null +++ b/src/main/resources/view/ResultPopUp.css @@ -0,0 +1,31 @@ +.pane { + -fx-background-color: transparent; + -fx-padding: 10px; +} + +.hbox { + -fx-background-color: rgb(229,74,63); + -fx-background-radius: 20; +} + +.text-area { + -fx-font-size: 18px; + -fx-background-color: transparent; + -fx-text-fill: white; +} + +.text-area .scroll-pane { + -fx-background-color: transparent; +} + +.text-area .scroll-pane .viewport{ + -fx-background-color: transparent; +} + +.text-area .scroll-pane .content{ + -fx-background-color: transparent; +} + +.text-area *.text { + -fx-text-alignment: center; +} \ 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..e569df5759e0 --- /dev/null +++ b/src/main/resources/view/ResultPopUp.fxml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + 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/TasksPanel.css b/src/main/resources/view/TasksPanel.css new file mode 100644 index 000000000000..cd4947db54dc --- /dev/null +++ b/src/main/resources/view/TasksPanel.css @@ -0,0 +1,59 @@ +.upcoming-pane { + -fx-background-color: #F39C12; + -fx-background-radius: 10; +} + +.completed-pane { + -fx-background-color: #03C9A9; + -fx-background-radius: 10; +} + +.list-view { + -fx-background-color: transparent; + -fx-background-radius: 10; + -fx-background-insets: 0; +} + +.list-cell { + -fx-background-radius: 10; + -fx-background-color: rgba(255,255,255,0.6); +} + +.list-cell:filled { + -fx-background-insets: 3; +} + +.list-cell:empty { + -fx-background-color: transparent; +} + +.list-cell:filled:hover { + -fx-background-color: #00BCD4; + -fx-text-fill: white; +} + +.cell_big_label { + -fx-font-size: 16pt; + -fx-text-fill: #555555; + -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/main/resources/view/UpcomingTaskCard.fxml b/src/main/resources/view/UpcomingTaskCard.fxml new file mode 100644 index 000000000000..a7f1b82c5d9e --- /dev/null +++ b/src/main/resources/view/UpcomingTaskCard.fxml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/view/UpcomingTasksPanel.css b/src/main/resources/view/UpcomingTasksPanel.css new file mode 100644 index 000000000000..138c27c1dc54 --- /dev/null +++ b/src/main/resources/view/UpcomingTasksPanel.css @@ -0,0 +1,44 @@ +.pane { + -fx-background-color: #F39C12; + -fx-background-radius: 10; +} + +.list-view { + -fx-background-color: transparent; + -fx-background-radius: 10; + -fx-background-insets: 0; +} + +.list-cell { + -fx-background-radius: 10; + -fx-background-color: rgba(255,255,255,0.6); +} + +.list-cell:filled { + -fx-background-insets: 3; +} + +.list-cell:empty { + -fx-background-color: transparent; +} + +.list-cell:filled:hover { + -fx-background-color: #00BCD4; + -fx-text-fill: white; +} + +.list-cell .label { + -fx-font-size: 16px; +} + +.cell_big_label { + -fx-font-size: 16px; +} + +.cell_small_label { + -fx-font-size: 11px; +} + +.hbox { + -fx-background-radius: 10; +} \ No newline at end of file diff --git a/src/main/resources/view/UpcomingTasksPanel.fxml b/src/main/resources/view/UpcomingTasksPanel.fxml new file mode 100644 index 000000000000..2524c8edd0d4 --- /dev/null +++ b/src/main/resources/view/UpcomingTasksPanel.fxml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/java/guitests/guihandles/ResultDisplayHandle.java b/src/test/java/guitests/guihandles/ResultDisplayHandle.java index 4da0bb3b097b..2e298cc7f3ac 100644 --- a/src/test/java/guitests/guihandles/ResultDisplayHandle.java +++ b/src/test/java/guitests/guihandles/ResultDisplayHandle.java @@ -10,7 +10,7 @@ */ public class ResultDisplayHandle extends GuiHandle { - public static final String RESULT_DISPLAY_ID = "#resultDisplay"; + public static final String RESULT_DISPLAY_ID = "#resultTextArea"; public ResultDisplayHandle(GuiRobot guiRobot, Stage primaryStage) { super(guiRobot, primaryStage, TestApp.APP_TITLE); diff --git a/src/test/java/guitests/guihandles/TaskListPanelHandle.java b/src/test/java/guitests/guihandles/TaskListPanelHandle.java index fd0c4de92457..246672ace23e 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 = "#upcomingTasksListView"; public TaskListPanelHandle(GuiRobot guiRobot, Stage primaryStage) { super(guiRobot, primaryStage, TestApp.APP_TITLE); From 6587f5c0484a7cab3a5efea2ade80bf0f5a323c7 Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Tue, 11 Oct 2016 13:26:04 +0800 Subject: [PATCH 02/67] Update gradle file --- build.gradle | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index 46b06c1e42ec..c2ec6ace4e60 100644 --- a/build.gradle +++ b/build.gradle @@ -74,10 +74,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/") @@ -113,8 +113,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' } @@ -128,7 +128,7 @@ class AddressBookTest extends Test { } } -task guiTests(type: AddressBookTest) { +task guiTests(type: AgendumTest) { include 'guitests/**' jacoco { @@ -137,8 +137,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") @@ -146,7 +146,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") } From 7082dd50a963d689e4558687d72e4467352ff96f Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Wed, 12 Oct 2016 00:15:41 +0800 Subject: [PATCH 03/67] Change icon to agendum --- src/main/java/seedu/agendum/ui/MainWindow.java | 2 +- src/main/java/seedu/agendum/ui/UiManager.java | 2 +- src/main/resources/images/address_book_32.png | Bin 4214 -> 0 bytes src/main/resources/images/agendum_icon.png | Bin 0 -> 41343 bytes 4 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 src/main/resources/images/address_book_32.png create mode 100644 src/main/resources/images/agendum_icon.png diff --git a/src/main/java/seedu/agendum/ui/MainWindow.java b/src/main/java/seedu/agendum/ui/MainWindow.java index a10f18207cb1..c883d1023ffd 100644 --- a/src/main/java/seedu/agendum/ui/MainWindow.java +++ b/src/main/java/seedu/agendum/ui/MainWindow.java @@ -21,7 +21,7 @@ */ 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; diff --git a/src/main/java/seedu/agendum/ui/UiManager.java b/src/main/java/seedu/agendum/ui/UiManager.java index 34c420a61c72..6f965d2af91d 100644 --- a/src/main/java/seedu/agendum/ui/UiManager.java +++ b/src/main/java/seedu/agendum/ui/UiManager.java @@ -25,7 +25,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; 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 29810cf1fd938e8568946ad28ee0c678564804b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4214 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 diff --git a/src/main/resources/images/agendum_icon.png b/src/main/resources/images/agendum_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..41941a11f5e123e7ee77186faafdcf48959ee68b GIT binary patch literal 41343 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 z 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 literal 0 HcmV?d00001 From 551dcf698a2a1ba7f07877d05aa5d0c44264261d Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Wed, 12 Oct 2016 10:06:09 +0800 Subject: [PATCH 04/67] =?UTF-8?q?Refactor=20UpcomingTaskCard=E2=80=99s=20t?= =?UTF-8?q?ime=20formatting=20method?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../seedu/agendum/ui/UpcomingTaskCard.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java b/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java index 972ca1d31127..dc4126b44574 100644 --- a/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java +++ b/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java @@ -50,19 +50,17 @@ public void initialize() { public String formatTime() { StringBuilder sb = new StringBuilder(); Optional start = task.getStartDateTime(); - Optional end = task.getStartDateTime(); + Optional end = task.getEndDateTime(); DateTimeFormatter startFormat = DateTimeFormatter.ofPattern("EEE, dd MMM"); - if(start.isPresent() && end.isPresent()) { // Have both start time and end time - sb.append("from ").append(start.get().format(startFormat)).append(" to ").append(end.get().format(startFormat)); - } else if (end.isPresent()) { // No start time - sb.append("by ").append(end.get().format(startFormat)); - } else if (start.isPresent()) { // No end time - sb.append("from ").append(start.get().format(startFormat)); - } else { // Both are null - sb.append(""); - } + 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(); } From bf33fd8a5302537721857ebc301e689f979151ce Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Wed, 12 Oct 2016 16:40:45 +0800 Subject: [PATCH 05/67] Change keyboard shortcut of helpwindow --- src/main/java/seedu/agendum/ui/MainWindow.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/agendum/ui/MainWindow.java b/src/main/java/seedu/agendum/ui/MainWindow.java index c883d1023ffd..915f08e598ff 100644 --- a/src/main/java/seedu/agendum/ui/MainWindow.java +++ b/src/main/java/seedu/agendum/ui/MainWindow.java @@ -3,7 +3,10 @@ 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; @@ -104,7 +107,7 @@ private void configure(String appTitle, String toDoListName, Config config, User } private void setAccelerators() { - helpMenuItem.setAccelerator(KeyCombination.valueOf("F1")); + helpMenuItem.setAccelerator(new KeyCodeCombination(KeyCode.H, KeyCombination.ALT_DOWN)); } void fillInnerParts() { From bee960565e8cf5dfbe0e694ff4ce61058a999f86 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Wed, 12 Oct 2016 16:41:06 +0800 Subject: [PATCH 06/67] Update helpWindow gui tests --- src/test/java/guitests/guihandles/MainMenuHandle.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/test/java/guitests/guihandles/MainMenuHandle.java b/src/test/java/guitests/guihandles/MainMenuHandle.java index eac004292dea..c8c43b30b072 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,17 @@ public GuiHandle clickOn(String... menuText) { } public HelpWindowHandle openHelpWindowUsingMenu() { - clickOn("Help", "F1"); + clickOn("Help", "⌥H"); return new HelpWindowHandle(guiRobot, primaryStage); } public HelpWindowHandle openHelpWindowUsingAccelerator() { - useF1Accelerator(); + useAccelerator(); return new HelpWindowHandle(guiRobot, primaryStage); } - private void useF1Accelerator() { - guiRobot.push(KeyCode.F1); + private void useAccelerator() { + guiRobot.push(new KeyCodeCombination(KeyCode.H, KeyCombination.ALT_DOWN)); guiRobot.sleep(500); } } From 0ade408730851a8196d9ae20cfd57a1a7a475a74 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Wed, 12 Oct 2016 17:16:44 +0800 Subject: [PATCH 07/67] Update image path in tests --- src/test/java/seedu/agendum/commons/util/AppUtilTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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")); } From 0c56cb6d403658f8f2bc684cdfa3b629c01287b2 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Wed, 12 Oct 2016 18:19:41 +0800 Subject: [PATCH 08/67] Add underline to completed tasks --- src/main/java/seedu/agendum/ui/UpcomingTaskCard.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java b/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java index dc4126b44574..e1ca803e80ce 100644 --- a/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java +++ b/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java @@ -41,6 +41,9 @@ public static UpcomingTaskCard load(ReadOnlyTask task, int displayedIndex){ @FXML public void initialize() { + if(task.isCompleted()) { + name.setUnderline(true); + } name.setText(task.getName().fullName); id.setText(displayedIndex + ". "); time.setText(formatTime()); From fa0162bac73a103d922303a9615c81f2453a1312 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Fri, 14 Oct 2016 18:59:23 +0800 Subject: [PATCH 09/67] Update task card to show more detailed time --- src/main/java/seedu/agendum/ui/UpcomingTaskCard.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java b/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java index e1ca803e80ce..1515912042eb 100644 --- a/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java +++ b/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java @@ -55,7 +55,7 @@ public String formatTime() { Optional start = task.getStartDateTime(); Optional end = task.getEndDateTime(); - DateTimeFormatter startFormat = DateTimeFormatter.ofPattern("EEE, dd MMM"); + DateTimeFormatter startFormat = DateTimeFormatter.ofPattern("hh a EEE, dd MMM"); if(start.isPresent()) { sb.append("from ").append(start.get().format(startFormat)); @@ -64,8 +64,8 @@ public String formatTime() { sb.append(sb.length()>0 ? " to " : "by "); sb.append(end.get().format(startFormat)); } - - return sb.toString(); + + return sb.toString().replace("AM", "am").replace("PM","pm"); } public HBox getLayout() { From 18df6d529b55ea727e902b5a822ec10e3ce6a27a Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Fri, 14 Oct 2016 20:31:04 +0800 Subject: [PATCH 10/67] Update completedTaskList when mark/unmark is activated --- .../java/seedu/agendum/ui/CompletedTasksPanel.java | 13 +++++++------ src/main/java/seedu/agendum/ui/MainWindow.java | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java b/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java index 478f5ba68676..a33c94fa027d 100644 --- a/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java +++ b/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java @@ -3,6 +3,7 @@ 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; @@ -52,14 +53,14 @@ public static CompletedTasksPanel load(Stage primaryStage, AnchorPane CompletedT completedTasksPanel.configure(taskList); return completedTasksPanel; } - - private void configure(ObservableList completedTasks) { - setConnections(completedTasks); + + private void configure(ObservableList taskList) { + setConnections(taskList); addToPlaceholder(); } - private void setConnections(ObservableList completedTasks) { - completedTasksListView.setItems(completedTasks); + private void setConnections(ObservableList taskList) { + completedTasksListView.setItems(taskList.filtered(task -> task.isCompleted())); completedTasksListView.setCellFactory(listView -> new completedTasksListViewCell()); setEventHandlerForSelectionChangeEvent(); } @@ -98,7 +99,7 @@ protected void updateItem(ReadOnlyTask task, boolean empty) { setGraphic(null); setText(null); } else { - setGraphic(CompletedTaskCard.load(task, getIndex() + 1).getLayout()); + setGraphic(UpcomingTaskCard.load(task, getIndex() + 1).getLayout()); } } } diff --git a/src/main/java/seedu/agendum/ui/MainWindow.java b/src/main/java/seedu/agendum/ui/MainWindow.java index 915f08e598ff..04dd0684d215 100644 --- a/src/main/java/seedu/agendum/ui/MainWindow.java +++ b/src/main/java/seedu/agendum/ui/MainWindow.java @@ -113,7 +113,7 @@ private void setAccelerators() { void fillInnerParts() { browserPanel = BrowserPanel.load(browserPlaceholder); upcomingTasksPanel = UpcomingTasksPanel.load(primaryStage, getUpcomingTasksPlaceHolder(), logic.getFilteredTaskList()); - completedTasksPanel = CompletedTasksPanel.load(primaryStage, getCompletedTasksPlaceHolder(), logic.getCompletedTaskList()); + completedTasksPanel = CompletedTasksPanel.load(primaryStage, getCompletedTasksPlaceHolder(), logic.getFilteredTaskList()); resultPopUp = ResultPopUp.load(primaryStage); statusBarFooter = StatusBarFooter.load(primaryStage, getStatusbarPlaceholder(), config.getToDoListFilePath()); commandBox = CommandBox.load(primaryStage, getCommandBoxPlaceholder(), resultPopUp, logic); From 4a92570b630e640827810a520c41bc44586f0f45 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Fri, 14 Oct 2016 21:18:20 +0800 Subject: [PATCH 11/67] Remove index for completed tasks list --- .../seedu/agendum/ui/CompletedTasksPanel.java | 2 +- .../java/seedu/agendum/ui/UpcomingTaskCard.java | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java b/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java index a33c94fa027d..cf8ab367723c 100644 --- a/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java +++ b/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java @@ -99,7 +99,7 @@ protected void updateItem(ReadOnlyTask task, boolean empty) { setGraphic(null); setText(null); } else { - setGraphic(UpcomingTaskCard.load(task, getIndex() + 1).getLayout()); + setGraphic(UpcomingTaskCard.load(task).getLayout()); } } } diff --git a/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java b/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java index 1515912042eb..7be47958ee6a 100644 --- a/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java +++ b/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java @@ -26,16 +26,23 @@ public class UpcomingTaskCard extends UiPart { private Label time; private ReadOnlyTask task; - private int displayedIndex; + private String displayedIndex; public UpcomingTaskCard(){ } - public static UpcomingTaskCard load(ReadOnlyTask task, int displayedIndex){ + public static UpcomingTaskCard load(ReadOnlyTask task, int Index){ UpcomingTaskCard card = new UpcomingTaskCard(); card.task = task; - card.displayedIndex = displayedIndex; + card.displayedIndex = String.valueOf(Index) + "."; + return UiPartLoader.loadUiPart(card); + } + + public static UpcomingTaskCard load(ReadOnlyTask task){ + UpcomingTaskCard card = new UpcomingTaskCard(); + card.task = task; + card.displayedIndex = ""; return UiPartLoader.loadUiPart(card); } @@ -45,7 +52,7 @@ public void initialize() { name.setUnderline(true); } name.setText(task.getName().fullName); - id.setText(displayedIndex + ". "); + id.setText(displayedIndex); time.setText(formatTime()); tags.setText(task.tagsString()); } From e14e607db41f3cd6f05eb506fc86b48551d81cfc Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Fri, 14 Oct 2016 21:33:14 +0800 Subject: [PATCH 12/67] Delete unnecessary files --- .../java/seedu/agendum/ui/TaskListPanel.java | 108 ------------------ .../seedu/agendum/ui/UpcomingTaskCard.java | 91 --------------- src/main/resources/view/UpcomingTaskCard.fxml | 70 ------------ .../resources/view/UpcomingTasksPanel.fxml | 22 ---- 4 files changed, 291 deletions(-) delete mode 100644 src/main/java/seedu/agendum/ui/TaskListPanel.java delete mode 100644 src/main/java/seedu/agendum/ui/UpcomingTaskCard.java delete mode 100644 src/main/resources/view/UpcomingTaskCard.fxml delete mode 100644 src/main/resources/view/UpcomingTasksPanel.fxml 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/UpcomingTaskCard.java b/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java deleted file mode 100644 index 7be47958ee6a..000000000000 --- a/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java +++ /dev/null @@ -1,91 +0,0 @@ -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 seedu.agendum.model.task.ReadOnlyTask; - -public class UpcomingTaskCard extends UiPart { - - private static final String FXML = "UpcomingTaskCard.fxml"; - - @FXML - private HBox cardPane; - @FXML - private Label name; - @FXML - private Label id; - @FXML - private Label tags; - @FXML - private Label time; - - private ReadOnlyTask task; - private String displayedIndex; - - public UpcomingTaskCard(){ - - } - - public static UpcomingTaskCard load(ReadOnlyTask task, int Index){ - UpcomingTaskCard card = new UpcomingTaskCard(); - card.task = task; - card.displayedIndex = String.valueOf(Index) + "."; - return UiPartLoader.loadUiPart(card); - } - - public static UpcomingTaskCard load(ReadOnlyTask task){ - UpcomingTaskCard card = new UpcomingTaskCard(); - card.task = task; - card.displayedIndex = ""; - return UiPartLoader.loadUiPart(card); - } - - @FXML - public void initialize() { - if(task.isCompleted()) { - name.setUnderline(true); - } - name.setText(task.getName().fullName); - id.setText(displayedIndex); - time.setText(formatTime()); - tags.setText(task.tagsString()); - } - - public String formatTime() { - StringBuilder sb = new StringBuilder(); - Optional start = task.getStartDateTime(); - Optional end = task.getEndDateTime(); - - DateTimeFormatter startFormat = DateTimeFormatter.ofPattern("hh a 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() { - return cardPane; - } - - @Override - public void setNode(Node node) { - cardPane = (HBox)node; - } - - @Override - public String getFxmlPath() { - return FXML; - } -} diff --git a/src/main/resources/view/UpcomingTaskCard.fxml b/src/main/resources/view/UpcomingTaskCard.fxml deleted file mode 100644 index a7f1b82c5d9e..000000000000 --- a/src/main/resources/view/UpcomingTaskCard.fxml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/resources/view/UpcomingTasksPanel.fxml b/src/main/resources/view/UpcomingTasksPanel.fxml deleted file mode 100644 index 2524c8edd0d4..000000000000 --- a/src/main/resources/view/UpcomingTasksPanel.fxml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - From fc2b00fb5607837b020cde4815abdd9ecff7eb1f Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Fri, 14 Oct 2016 21:36:23 +0800 Subject: [PATCH 13/67] Rename from upcoming to all --- ...mingTasksPanel.java => AllTasksPanel.java} | 42 +++++------ .../seedu/agendum/ui/CompletedTasksPanel.java | 2 +- src/main/java/seedu/agendum/ui/TaskCard.java | 54 ++++++++++---- src/main/resources/view/AllTasksPanel.fxml | 22 ++++++ src/main/resources/view/MainWindow.fxml | 16 +++-- src/main/resources/view/TaskCard.fxml | 70 +++++++++++++++++++ src/main/resources/view/TaskListPanel.fxml | 14 ---- src/main/resources/view/TasksPanel.css | 2 +- .../resources/view/UpcomingTasksPanel.css | 44 ------------ 9 files changed, 167 insertions(+), 99 deletions(-) rename src/main/java/seedu/agendum/ui/{UpcomingTasksPanel.java => AllTasksPanel.java} (57%) create mode 100644 src/main/resources/view/AllTasksPanel.fxml create mode 100644 src/main/resources/view/TaskCard.fxml delete mode 100644 src/main/resources/view/TaskListPanel.fxml delete mode 100644 src/main/resources/view/UpcomingTasksPanel.css diff --git a/src/main/java/seedu/agendum/ui/UpcomingTasksPanel.java b/src/main/java/seedu/agendum/ui/AllTasksPanel.java similarity index 57% rename from src/main/java/seedu/agendum/ui/UpcomingTasksPanel.java rename to src/main/java/seedu/agendum/ui/AllTasksPanel.java index b4004f4aa73d..71832491ba2e 100644 --- a/src/main/java/seedu/agendum/ui/UpcomingTasksPanel.java +++ b/src/main/java/seedu/agendum/ui/AllTasksPanel.java @@ -16,18 +16,18 @@ import seedu.agendum.commons.core.LogsCenter; /** - * Panel contains the list of upcoming tasks + * Panel contains the list of all tasks */ -public class UpcomingTasksPanel extends UiPart { - private final Logger logger = LogsCenter.getLogger(UpcomingTasksPanel.class); - private static final String FXML = "UpcomingTasksPanel.fxml"; +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 upcomingTasksListView; + private ListView allTasksListView; - public UpcomingTasksPanel() { + public AllTasksPanel() { super(); } @@ -46,21 +46,21 @@ public void setPlaceholder(AnchorPane pane) { this.placeHolderPane = pane; } - public static UpcomingTasksPanel load(Stage primaryStage, AnchorPane UpcomingTasksPlaceholder, + public static AllTasksPanel load(Stage primaryStage, AnchorPane AllTasksPlaceholder, ObservableList taskList) { - UpcomingTasksPanel upcomingTasksPanel = UiPartLoader.loadUiPart(primaryStage, UpcomingTasksPlaceholder, new UpcomingTasksPanel()); - upcomingTasksPanel.configure(taskList); - return upcomingTasksPanel; + AllTasksPanel allTasksPanel = UiPartLoader.loadUiPart(primaryStage, AllTasksPlaceholder, new AllTasksPanel()); + allTasksPanel.configure(taskList); + return allTasksPanel; } - private void configure(ObservableList upcomingTasks) { - setConnections(upcomingTasks); + private void configure(ObservableList allTasks) { + setConnections(allTasks); addToPlaceholder(); } - private void setConnections(ObservableList upcomingTasks) { - upcomingTasksListView.setItems(upcomingTasks); - upcomingTasksListView.setCellFactory(listView -> new upcomingTasksListViewCell()); + private void setConnections(ObservableList allTasks) { + allTasksListView.setItems(allTasks); + allTasksListView.setCellFactory(listView -> new allTasksListViewCell()); setEventHandlerForSelectionChangeEvent(); } @@ -70,7 +70,7 @@ private void addToPlaceholder() { } private void setEventHandlerForSelectionChangeEvent() { - upcomingTasksListView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { + allTasksListView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { if (newValue != null) { logger.fine("Selection in task list panel changed to : '" + newValue + "'"); raise(new TaskPanelSelectionChangedEvent(newValue)); @@ -80,14 +80,14 @@ private void setEventHandlerForSelectionChangeEvent() { public void scrollTo(int index) { Platform.runLater(() -> { - upcomingTasksListView.scrollTo(index); - upcomingTasksListView.getSelectionModel().clearAndSelect(index); + allTasksListView.scrollTo(index); + allTasksListView.getSelectionModel().clearAndSelect(index); }); } - class upcomingTasksListViewCell extends ListCell { + class allTasksListViewCell extends ListCell { - public upcomingTasksListViewCell() { + public allTasksListViewCell() { } @Override @@ -98,7 +98,7 @@ protected void updateItem(ReadOnlyTask task, boolean empty) { setGraphic(null); setText(null); } else { - setGraphic(UpcomingTaskCard.load(task, getIndex() + 1).getLayout()); + setGraphic(TaskCard.load(task, getIndex() + 1).getLayout()); } } } diff --git a/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java b/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java index cf8ab367723c..f6816cd86598 100644 --- a/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java +++ b/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java @@ -99,7 +99,7 @@ protected void updateItem(ReadOnlyTask task, boolean empty) { setGraphic(null); setText(null); } else { - setGraphic(UpcomingTaskCard.load(task).getLayout()); + setGraphic(TaskCard.load(task).getLayout()); } } } diff --git a/src/main/java/seedu/agendum/ui/TaskCard.java b/src/main/java/seedu/agendum/ui/TaskCard.java index 9b320a2c7c02..b617e8c8cdf2 100644 --- a/src/main/java/seedu/agendum/ui/TaskCard.java +++ b/src/main/java/seedu/agendum/ui/TaskCard.java @@ -1,14 +1,18 @@ 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 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; @@ -18,31 +22,57 @@ public class TaskCard extends UiPart{ private Label id; @FXML private Label tags; + @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 = String.valueOf(Index) + "."; + return UiPartLoader.loadUiPart(card); + } + + public static TaskCard load(ReadOnlyTask task){ TaskCard card = new TaskCard(); card.task = task; - card.displayedIndex = displayedIndex; + card.displayedIndex = ""; return UiPartLoader.loadUiPart(card); } @FXML public void initialize() { + if(task.isCompleted()) { + name.setUnderline(true); + } name.setText(task.getName().fullName); - id.setText(displayedIndex + ". "); + id.setText(displayedIndex); + time.setText(formatTime()); tags.setText(task.tagsString()); - if (task.isCompleted()) { - cardPane.setStyle("-fx-background-color: aquamarine"); - } else { - cardPane.setStyle("-fx-background-color: salmon"); - } + } + + public String formatTime() { + StringBuilder sb = new StringBuilder(); + Optional start = task.getStartDateTime(); + Optional end = task.getEndDateTime(); + + DateTimeFormatter startFormat = DateTimeFormatter.ofPattern("hh a 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/resources/view/AllTasksPanel.fxml b/src/main/resources/view/AllTasksPanel.fxml new file mode 100644 index 000000000000..f96315c0ab60 --- /dev/null +++ b/src/main/resources/view/AllTasksPanel.fxml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/view/MainWindow.fxml b/src/main/resources/view/MainWindow.fxml index 5c1bcd81e7cf..e3480a2731a5 100644 --- a/src/main/resources/view/MainWindow.fxml +++ b/src/main/resources/view/MainWindow.fxml @@ -41,7 +41,7 @@ - + @@ -52,11 +52,15 @@ - - - - - + + + + + + + + + diff --git a/src/main/resources/view/TaskCard.fxml b/src/main/resources/view/TaskCard.fxml new file mode 100644 index 000000000000..a7f1b82c5d9e --- /dev/null +++ b/src/main/resources/view/TaskCard.fxml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 index cd4947db54dc..1f2577b47d0e 100644 --- a/src/main/resources/view/TasksPanel.css +++ b/src/main/resources/view/TasksPanel.css @@ -1,4 +1,4 @@ -.upcoming-pane { +.all-pane { -fx-background-color: #F39C12; -fx-background-radius: 10; } diff --git a/src/main/resources/view/UpcomingTasksPanel.css b/src/main/resources/view/UpcomingTasksPanel.css deleted file mode 100644 index 138c27c1dc54..000000000000 --- a/src/main/resources/view/UpcomingTasksPanel.css +++ /dev/null @@ -1,44 +0,0 @@ -.pane { - -fx-background-color: #F39C12; - -fx-background-radius: 10; -} - -.list-view { - -fx-background-color: transparent; - -fx-background-radius: 10; - -fx-background-insets: 0; -} - -.list-cell { - -fx-background-radius: 10; - -fx-background-color: rgba(255,255,255,0.6); -} - -.list-cell:filled { - -fx-background-insets: 3; -} - -.list-cell:empty { - -fx-background-color: transparent; -} - -.list-cell:filled:hover { - -fx-background-color: #00BCD4; - -fx-text-fill: white; -} - -.list-cell .label { - -fx-font-size: 16px; -} - -.cell_big_label { - -fx-font-size: 16px; -} - -.cell_small_label { - -fx-font-size: 11px; -} - -.hbox { - -fx-background-radius: 10; -} \ No newline at end of file From b6d0ff7ec14d877a1de36511f1b4e89f4d8495e0 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Fri, 14 Oct 2016 21:36:37 +0800 Subject: [PATCH 14/67] Remove browser panel --- .../java/seedu/agendum/ui/MainWindow.java | 20 +++++++++---------- src/main/java/seedu/agendum/ui/UiManager.java | 3 +-- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/main/java/seedu/agendum/ui/MainWindow.java b/src/main/java/seedu/agendum/ui/MainWindow.java index 04dd0684d215..e8e420591e4a 100644 --- a/src/main/java/seedu/agendum/ui/MainWindow.java +++ b/src/main/java/seedu/agendum/ui/MainWindow.java @@ -33,7 +33,7 @@ public class MainWindow extends UiPart { // Independent Ui parts residing in this Ui container private BrowserPanel browserPanel; - private UpcomingTasksPanel upcomingTasksPanel; + private AllTasksPanel allTasksPanel; private CompletedTasksPanel completedTasksPanel; private ResultPopUp resultPopUp; private StatusBarFooter statusBarFooter; @@ -57,7 +57,7 @@ public class MainWindow extends UiPart { private MenuItem helpMenuItem; @FXML - private AnchorPane upcomingTasksPlaceHolder; + private AnchorPane allTasksPlaceHolder; @FXML private AnchorPane completedTasksPlaceHolder; @@ -111,8 +111,9 @@ private void setAccelerators() { } void fillInnerParts() { - browserPanel = BrowserPanel.load(browserPlaceholder); - upcomingTasksPanel = UpcomingTasksPanel.load(primaryStage, getUpcomingTasksPlaceHolder(), logic.getFilteredTaskList()); + +// browserPanel = BrowserPanel.load(browserPlaceholder); + allTasksPanel = AllTasksPanel.load(primaryStage, getAllTasksPlaceHolder(), logic.getFilteredTaskList()); completedTasksPanel = CompletedTasksPanel.load(primaryStage, getCompletedTasksPlaceHolder(), logic.getFilteredTaskList()); resultPopUp = ResultPopUp.load(primaryStage); statusBarFooter = StatusBarFooter.load(primaryStage, getStatusbarPlaceholder(), config.getToDoListFilePath()); @@ -127,8 +128,8 @@ private AnchorPane getStatusbarPlaceholder() { return statusbarPlaceholder; } - public AnchorPane getUpcomingTasksPlaceHolder() { - return upcomingTasksPlaceHolder; + public AnchorPane getAllTasksPlaceHolder() { + return allTasksPlaceHolder; } public AnchorPane getCompletedTasksPlaceHolder() { @@ -186,8 +187,8 @@ private void handleExit() { raise(new ExitAppRequestEvent()); } - public UpcomingTasksPanel getUpcomingTasksPanel() { - return this.upcomingTasksPanel; + public AllTasksPanel getAllTasksPanel() { + return this.allTasksPanel; } public CompletedTasksPanel getCompletedTasksPanel() { @@ -198,7 +199,4 @@ public void loadTaskPage(ReadOnlyTask task) { browserPanel.loadTaskPage(task); } - public void releaseResources() { - browserPanel.freeResources(); - } } diff --git a/src/main/java/seedu/agendum/ui/UiManager.java b/src/main/java/seedu/agendum/ui/UiManager.java index 6f965d2af91d..0eed70e1fa36 100644 --- a/src/main/java/seedu/agendum/ui/UiManager.java +++ b/src/main/java/seedu/agendum/ui/UiManager.java @@ -62,7 +62,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) { @@ -115,7 +114,7 @@ private void handleShowHelpEvent(ShowHelpRequestEvent event) { private void handleJumpToListRequestEvent(JumpToListRequestEvent event) { logger.info(LogsCenter.getEventHandlingLogMessage(event)); // mainWindow.getTaskListPanel().scrollTo(event.targetIndex); - mainWindow.getUpcomingTasksPanel().scrollTo(event.targetIndex); + mainWindow.getAllTasksPanel().scrollTo(event.targetIndex); } @Subscribe From a28971b87de77730805ab95ee406cdb92b0c90c3 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Fri, 14 Oct 2016 22:02:59 +0800 Subject: [PATCH 15/67] Add panel for other tasks --- .../java/seedu/agendum/ui/MainWindow.java | 9 ++ .../seedu/agendum/ui/OtherTasksPanel.java | 106 ++++++++++++++++++ src/main/resources/view/AllTasksPanel.fxml | 2 +- src/main/resources/view/MainWindow.fxml | 9 +- src/main/resources/view/OtherTasksPanel.fxml | 22 ++++ src/main/resources/view/TasksPanel.css | 5 + 6 files changed, 147 insertions(+), 6 deletions(-) create mode 100644 src/main/java/seedu/agendum/ui/OtherTasksPanel.java create mode 100644 src/main/resources/view/OtherTasksPanel.fxml diff --git a/src/main/java/seedu/agendum/ui/MainWindow.java b/src/main/java/seedu/agendum/ui/MainWindow.java index e8e420591e4a..2306a3cdb909 100644 --- a/src/main/java/seedu/agendum/ui/MainWindow.java +++ b/src/main/java/seedu/agendum/ui/MainWindow.java @@ -35,6 +35,7 @@ public class MainWindow extends UiPart { private BrowserPanel browserPanel; private AllTasksPanel allTasksPanel; private CompletedTasksPanel completedTasksPanel; + private OtherTasksPanel otherTasksPanel; private ResultPopUp resultPopUp; private StatusBarFooter statusBarFooter; private CommandBox commandBox; @@ -62,6 +63,9 @@ public class MainWindow extends UiPart { @FXML private AnchorPane completedTasksPlaceHolder; + @FXML + private AnchorPane otherTasksPlaceHolder; + @FXML private AnchorPane statusbarPlaceholder; @@ -115,6 +119,7 @@ void fillInnerParts() { // browserPanel = BrowserPanel.load(browserPlaceholder); 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(), resultPopUp, logic); @@ -135,6 +140,10 @@ public AnchorPane getAllTasksPlaceHolder() { public AnchorPane getCompletedTasksPlaceHolder() { return completedTasksPlaceHolder; } + + public AnchorPane getOtherTasksPlaceHolder() { + return otherTasksPlaceHolder; + } public void hide() { primaryStage.hide(); 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..3d4c510b04bf --- /dev/null +++ b/src/main/java/seedu/agendum/ui/OtherTasksPanel.java @@ -0,0 +1,106 @@ +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.commons.events.ui.TaskPanelSelectionChangedEvent; +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 otherTasks) { + setConnections(otherTasks); + addToPlaceholder(); + } + + private void setConnections(ObservableList otherTasks) { + otherTasksListView.setItems(otherTasks); + otherTasksListView.setCellFactory(listView -> new otherTasksListViewCell()); + setEventHandlerForSelectionChangeEvent(); + } + + private void addToPlaceholder() { + SplitPane.setResizableWithParent(placeHolderPane, false); + placeHolderPane.getChildren().add(panel); + } + + private void setEventHandlerForSelectionChangeEvent() { + otherTasksListView.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(() -> { + 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/resources/view/AllTasksPanel.fxml b/src/main/resources/view/AllTasksPanel.fxml index f96315c0ab60..2aa4048a34fd 100644 --- a/src/main/resources/view/AllTasksPanel.fxml +++ b/src/main/resources/view/AllTasksPanel.fxml @@ -11,7 +11,7 @@ - + diff --git a/src/main/resources/view/MainWindow.fxml b/src/main/resources/view/MainWindow.fxml index e3480a2731a5..c8af33d6b936 100644 --- a/src/main/resources/view/MainWindow.fxml +++ b/src/main/resources/view/MainWindow.fxml @@ -54,12 +54,11 @@ - - - - - + + + + diff --git a/src/main/resources/view/OtherTasksPanel.fxml b/src/main/resources/view/OtherTasksPanel.fxml new file mode 100644 index 000000000000..2adceef05e29 --- /dev/null +++ b/src/main/resources/view/OtherTasksPanel.fxml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/view/TasksPanel.css b/src/main/resources/view/TasksPanel.css index 1f2577b47d0e..588b698c6cd4 100644 --- a/src/main/resources/view/TasksPanel.css +++ b/src/main/resources/view/TasksPanel.css @@ -8,6 +8,11 @@ -fx-background-radius: 10; } +.other-pane { + -fx-background-color: #3498DB; + -fx-background-radius: 10; +} + .list-view { -fx-background-color: transparent; -fx-background-radius: 10; From 7071676d48e936ca7522ae37d9981025f01a0b80 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Fri, 14 Oct 2016 22:21:32 +0800 Subject: [PATCH 16/67] Change scroll bar effect --- src/main/resources/view/DarkTheme.css | 31 ++++++++++++++++----------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/main/resources/view/DarkTheme.css b/src/main/resources/view/DarkTheme.css index b5e3d8cfa63a..e89aea9c3199 100644 --- a/src/main/resources/view/DarkTheme.css +++ b/src/main/resources/view/DarkTheme.css @@ -209,26 +209,33 @@ -fx-text-fill: white; } -.scroll-bar .thumb { - -fx-background-color: derive(#1d1d1d, 50%); - -fx-background-insets: 3; +.scroll-pane { + -fx-background-color: transparent; } -.scroll-bar .increment-button, .scroll-bar .decrement-button { - -fx-background-color: transparent; - -fx-padding: 0 0 0 0; +.scroll-bar .increment-button { + -fx-opacity: 0; } -.scroll-bar .increment-arrow, .scroll-bar .decrement-arrow { - -fx-shape: " "; +.scroll-bar .decrement-button { + -fx-opacity: 0; } -.scroll-bar:vertical .increment-arrow, .scroll-bar:vertical .decrement-arrow { - -fx-padding: 1 8 1 8; +.scroll-bar { + -fx-background-color: transparent; } -.scroll-bar:horizontal .increment-arrow, .scroll-bar:horizontal .decrement-arrow { - -fx-padding: 8 1 8 1; +.scroll-bar .track-background { + -fx-opacity: 0; +} + +.scroll-bar .track { + -fx-opacity: 0; +} + +.scroll-bar .thumb { + -fx-background-color: rgba(255,255,255,0.5); + -fx-background-radius: 2em; } #cardPane { From 287ad82b72696e62df16e9075288e4e4ee7983e0 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Fri, 14 Oct 2016 22:34:41 +0800 Subject: [PATCH 17/67] Change list cell hovering effect --- src/main/resources/view/TasksPanel.css | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/resources/view/TasksPanel.css b/src/main/resources/view/TasksPanel.css index 588b698c6cd4..e207f1443aa7 100644 --- a/src/main/resources/view/TasksPanel.css +++ b/src/main/resources/view/TasksPanel.css @@ -33,8 +33,7 @@ } .list-cell:filled:hover { - -fx-background-color: #00BCD4; - -fx-text-fill: white; + -fx-background-color: rgba(255,255,255,0.9); } .cell_big_label { From 5f317bbf431c8d211c17c6e760939f26bd42449c Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Sat, 15 Oct 2016 14:35:35 +0800 Subject: [PATCH 18/67] Change scrollbar effect --- src/main/resources/view/DarkTheme.css | 30 ++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/main/resources/view/DarkTheme.css b/src/main/resources/view/DarkTheme.css index e89aea9c3199..960a4dabada8 100644 --- a/src/main/resources/view/DarkTheme.css +++ b/src/main/resources/view/DarkTheme.css @@ -209,10 +209,6 @@ -fx-text-fill: white; } -.scroll-pane { - -fx-background-color: transparent; -} - .scroll-bar .increment-button { -fx-opacity: 0; } @@ -227,17 +223,41 @@ .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 { +.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:pressed .thumb { + -fx-background-color: rgba(0,0,0,0.3); +} + +.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; +} + +.list-view { + -fx-background-radius: 10; +} + #cardPane { -fx-background-color: transparent; -fx-border-color: #d6d6d6; From 2a015d223521d68e8b95fd33c2336616c71f2668 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Sat, 15 Oct 2016 14:37:56 +0800 Subject: [PATCH 19/67] Delete task selection event --- .../java/seedu/agendum/ui/MainWindow.java | 6 ------ src/main/java/seedu/agendum/ui/UiManager.java | 6 ------ .../view/DefaultBrowserPlaceHolderScreen.fxml | 21 ------------------- 3 files changed, 33 deletions(-) delete mode 100644 src/main/resources/view/DefaultBrowserPlaceHolderScreen.fxml diff --git a/src/main/java/seedu/agendum/ui/MainWindow.java b/src/main/java/seedu/agendum/ui/MainWindow.java index 2306a3cdb909..bad424f160ed 100644 --- a/src/main/java/seedu/agendum/ui/MainWindow.java +++ b/src/main/java/seedu/agendum/ui/MainWindow.java @@ -32,7 +32,6 @@ public class MainWindow extends UiPart { private Logic logic; // Independent Ui parts residing in this Ui container - private BrowserPanel browserPanel; private AllTasksPanel allTasksPanel; private CompletedTasksPanel completedTasksPanel; private OtherTasksPanel otherTasksPanel; @@ -203,9 +202,4 @@ public AllTasksPanel getAllTasksPanel() { public CompletedTasksPanel getCompletedTasksPanel() { return this.completedTasksPanel; } - - public void loadTaskPage(ReadOnlyTask task) { - browserPanel.loadTaskPage(task); - } - } diff --git a/src/main/java/seedu/agendum/ui/UiManager.java b/src/main/java/seedu/agendum/ui/UiManager.java index 0eed70e1fa36..31e8fc90c186 100644 --- a/src/main/java/seedu/agendum/ui/UiManager.java +++ b/src/main/java/seedu/agendum/ui/UiManager.java @@ -117,10 +117,4 @@ private void handleJumpToListRequestEvent(JumpToListRequestEvent event) { mainWindow.getAllTasksPanel().scrollTo(event.targetIndex); } - @Subscribe - private void handleTaskPanelSelectionChangedEvent(TaskPanelSelectionChangedEvent event){ - logger.info(LogsCenter.getEventHandlingLogMessage(event)); - mainWindow.loadTaskPage(event.getNewSelection()); - } - } 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 @@ - - - - - - - - - - - - From 203bb67bd2e860e81dc4c2988138d2df817f6b44 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Sat, 15 Oct 2016 14:46:10 +0800 Subject: [PATCH 20/67] Delete select command test --- .../java/seedu/agendum/ui/ResultDisplay.java | 65 ------------------- src/main/resources/view/ResultDisplay.fxml | 11 ---- src/main/resources/view/TasksPanel.css | 2 +- src/test/java/guitests/SelectCommandTest.java | 60 ----------------- .../guihandles/TaskListPanelHandle.java | 2 +- 5 files changed, 2 insertions(+), 138 deletions(-) delete mode 100644 src/main/java/seedu/agendum/ui/ResultDisplay.java delete mode 100644 src/main/resources/view/ResultDisplay.fxml delete mode 100644 src/test/java/guitests/SelectCommandTest.java 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/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/TasksPanel.css b/src/main/resources/view/TasksPanel.css index e207f1443aa7..2a6e4b70fb66 100644 --- a/src/main/resources/view/TasksPanel.css +++ b/src/main/resources/view/TasksPanel.css @@ -33,7 +33,7 @@ } .list-cell:filled:hover { - -fx-background-color: rgba(255,255,255,0.9); + -fx-background-color: rgba(255,255,255,0.8); } .cell_big_label { 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/TaskListPanelHandle.java b/src/test/java/guitests/guihandles/TaskListPanelHandle.java index 246672ace23e..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 = "#upcomingTasksListView"; + private static final String TASK_LIST_VIEW_ID = "#allTasksListView"; public TaskListPanelHandle(GuiRobot guiRobot, Stage primaryStage) { super(guiRobot, primaryStage, TestApp.APP_TITLE); From 028279398efc603124614e938a0c791e0b8f3f99 Mon Sep 17 00:00:00 2001 From: rachx Date: Sat, 15 Oct 2016 15:32:51 +0800 Subject: [PATCH 21/67] Add getter methods to check if a Task is overdue or upcoming --- .../agendum/model/task/ReadOnlyTask.java | 2 ++ .../java/seedu/agendum/model/task/Task.java | 27 +++++++++++++++++++ .../java/seedu/agendum/testutil/TestTask.java | 27 +++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/src/main/java/seedu/agendum/model/task/ReadOnlyTask.java b/src/main/java/seedu/agendum/model/task/ReadOnlyTask.java index ceddcac0c57e..a2e11cb5fbb4 100644 --- a/src/main/java/seedu/agendum/model/task/ReadOnlyTask.java +++ b/src/main/java/seedu/agendum/model/task/ReadOnlyTask.java @@ -13,6 +13,8 @@ public interface ReadOnlyTask { Name getName(); boolean isCompleted(); + boolean isUpcoming(); + boolean isOverdue(); Optional getStartDateTime(); Optional getEndDateTime(); diff --git a/src/main/java/seedu/agendum/model/task/Task.java b/src/main/java/seedu/agendum/model/task/Task.java index e5c418e228a7..0f0b1ea00627 100644 --- a/src/main/java/seedu/agendum/model/task/Task.java +++ b/src/main/java/seedu/agendum/model/task/Task.java @@ -13,6 +13,8 @@ */ public class Task implements ReadOnlyTask { + private static final int UPCOMING_DAYS_THRESHOLD = 7; + private Name name; private boolean isCompleted; private LocalDateTime startDateTime; @@ -82,6 +84,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); @@ -97,6 +116,14 @@ public UniqueTagList getTags() { return new UniqueTagList(tags); } + private Optional getTaskTime() { + if (getStartDateTime().isPresent()) { + return getStartDateTime(); + } else { + return getEndDateTime(); + } + } + // ================ Setter methods ============================== public void setName(Name name) { diff --git a/src/test/java/seedu/agendum/testutil/TestTask.java b/src/test/java/seedu/agendum/testutil/TestTask.java index 9b8dc6017de9..8efae8ca73cd 100644 --- a/src/test/java/seedu/agendum/testutil/TestTask.java +++ b/src/test/java/seedu/agendum/testutil/TestTask.java @@ -11,6 +11,8 @@ */ public class TestTask implements ReadOnlyTask { + private static final int UPCOMING_DAYS_THRESHOLD = 7; + private Name name; private boolean isCompleted; private LocalDateTime startDateTime; @@ -65,6 +67,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); @@ -75,6 +94,14 @@ public Optional getEndDateTime() { return Optional.ofNullable(endDateTime); } + private Optional getTaskTime() { + if (getStartDateTime().isPresent()) { + return getStartDateTime(); + } else { + return getEndDateTime(); + } + } + @Override public UniqueTagList getTags() { return tags; From fd8bc04e0031827018202abee8dc82b1b234f5a9 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Sat, 15 Oct 2016 15:45:38 +0800 Subject: [PATCH 22/67] Delete task selection event --- .../ui/TaskPanelSelectionChangedEvent.java | 26 ------------------- .../java/seedu/agendum/ui/AllTasksPanel.java | 11 -------- .../seedu/agendum/ui/CompletedTasksPanel.java | 11 -------- .../seedu/agendum/ui/OtherTasksPanel.java | 11 -------- src/main/java/seedu/agendum/ui/UiManager.java | 1 - 5 files changed, 60 deletions(-) delete mode 100644 src/main/java/seedu/agendum/commons/events/ui/TaskPanelSelectionChangedEvent.java 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/ui/AllTasksPanel.java b/src/main/java/seedu/agendum/ui/AllTasksPanel.java index 71832491ba2e..2fc5b8c7adf4 100644 --- a/src/main/java/seedu/agendum/ui/AllTasksPanel.java +++ b/src/main/java/seedu/agendum/ui/AllTasksPanel.java @@ -11,7 +11,6 @@ import javafx.scene.control.SplitPane; import javafx.scene.layout.AnchorPane; import javafx.stage.Stage; -import seedu.agendum.commons.events.ui.TaskPanelSelectionChangedEvent; import seedu.agendum.model.task.ReadOnlyTask; import seedu.agendum.commons.core.LogsCenter; @@ -61,7 +60,6 @@ private void configure(ObservableList allTasks) { private void setConnections(ObservableList allTasks) { allTasksListView.setItems(allTasks); allTasksListView.setCellFactory(listView -> new allTasksListViewCell()); - setEventHandlerForSelectionChangeEvent(); } private void addToPlaceholder() { @@ -69,15 +67,6 @@ private void addToPlaceholder() { placeHolderPane.getChildren().add(panel); } - private void setEventHandlerForSelectionChangeEvent() { - allTasksListView.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(() -> { allTasksListView.scrollTo(index); diff --git a/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java b/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java index f6816cd86598..66b59a3b8b18 100644 --- a/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java +++ b/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java @@ -12,7 +12,6 @@ import javafx.scene.control.SplitPane; import javafx.scene.layout.AnchorPane; import javafx.stage.Stage; -import seedu.agendum.commons.events.ui.TaskPanelSelectionChangedEvent; import seedu.agendum.model.task.ReadOnlyTask; import seedu.agendum.commons.core.LogsCenter; @@ -62,7 +61,6 @@ private void configure(ObservableList taskList) { private void setConnections(ObservableList taskList) { completedTasksListView.setItems(taskList.filtered(task -> task.isCompleted())); completedTasksListView.setCellFactory(listView -> new completedTasksListViewCell()); - setEventHandlerForSelectionChangeEvent(); } private void addToPlaceholder() { @@ -70,15 +68,6 @@ private void addToPlaceholder() { placeHolderPane.getChildren().add(panel); } - private void setEventHandlerForSelectionChangeEvent() { - completedTasksListView.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(() -> { completedTasksListView.scrollTo(index); diff --git a/src/main/java/seedu/agendum/ui/OtherTasksPanel.java b/src/main/java/seedu/agendum/ui/OtherTasksPanel.java index 3d4c510b04bf..bb3d8a4d3d69 100644 --- a/src/main/java/seedu/agendum/ui/OtherTasksPanel.java +++ b/src/main/java/seedu/agendum/ui/OtherTasksPanel.java @@ -11,7 +11,6 @@ import javafx.scene.control.SplitPane; import javafx.scene.layout.AnchorPane; import javafx.stage.Stage; -import seedu.agendum.commons.events.ui.TaskPanelSelectionChangedEvent; import seedu.agendum.model.task.ReadOnlyTask; import seedu.agendum.commons.core.LogsCenter; @@ -61,7 +60,6 @@ private void configure(ObservableList otherTasks) { private void setConnections(ObservableList otherTasks) { otherTasksListView.setItems(otherTasks); otherTasksListView.setCellFactory(listView -> new otherTasksListViewCell()); - setEventHandlerForSelectionChangeEvent(); } private void addToPlaceholder() { @@ -69,15 +67,6 @@ private void addToPlaceholder() { placeHolderPane.getChildren().add(panel); } - private void setEventHandlerForSelectionChangeEvent() { - otherTasksListView.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(() -> { otherTasksListView.scrollTo(index); diff --git a/src/main/java/seedu/agendum/ui/UiManager.java b/src/main/java/seedu/agendum/ui/UiManager.java index 31e8fc90c186..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; From 3e5305f3bf50a156258c088bdf06125f65f8001a Mon Sep 17 00:00:00 2001 From: rachx Date: Sat, 15 Oct 2016 17:41:09 +0800 Subject: [PATCH 23/67] Add compareTo for task --- src/main/java/seedu/agendum/model/task/Task.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/seedu/agendum/model/task/Task.java b/src/main/java/seedu/agendum/model/task/Task.java index 0f0b1ea00627..6811827b5774 100644 --- a/src/main/java/seedu/agendum/model/task/Task.java +++ b/src/main/java/seedu/agendum/model/task/Task.java @@ -11,7 +11,7 @@ * 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; @@ -97,7 +97,7 @@ public boolean isUpcoming() { if (!getTaskTime().isPresent()) { return false; } - return !isCompleted() && getTaskTime().get().isBefore( + return !isCompleted() && !isOverdue() && getTaskTime().get().isBefore( LocalDateTime.now().plusDays(UPCOMING_DAYS_THRESHOLD)); } @@ -168,6 +168,18 @@ public int hashCode() { return Objects.hash(name, tags); } + @Override + public int compareTo(Task other) { + if (this.getTaskTime().isPresent() && other.getTaskTime().isPresent()) { + this.getTaskTime().get().compareTo(other.getTaskTime().get()); + } else if (this.getTaskTime().isPresent()) { + return 1; + } else if (other.getTaskTime().isPresent()) { + return -1; + } + return this.getName().toString().compareTo(other.getName().toString()); + } + @Override public String toString() { return getAsText(); From f21c11522600af87d023178b49452afc09f35f16 Mon Sep 17 00:00:00 2001 From: rachx Date: Sat, 15 Oct 2016 17:41:49 +0800 Subject: [PATCH 24/67] Update filter list to show uncompleted/completed/overdue or completed task or return a separate observable list --- src/main/java/seedu/agendum/model/Model.java | 21 ++++++ .../seedu/agendum/model/ModelManager.java | 64 ++++++++++++++++++- 2 files changed, 84 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/agendum/model/Model.java b/src/main/java/seedu/agendum/model/Model.java index e14ab8c4f08c..e121f6e56d24 100644 --- a/src/main/java/seedu/agendum/model/Model.java +++ b/src/main/java/seedu/agendum/model/Model.java @@ -43,7 +43,28 @@ 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); + /** 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 695bd0389c12..ac39f3854adf 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.StringUtil; @@ -26,6 +27,12 @@ public class ModelManager extends ComponentManager implements Model { private final ToDoList toDoList; 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; /** * Initializes a ModelManager with the given ToDoList @@ -40,6 +47,15 @@ public ModelManager(ToDoList src, UserPrefs userPrefs) { 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(); } public ModelManager() { @@ -49,6 +65,15 @@ public ModelManager() { public ModelManager(ReadOnlyToDoList initialData, UserPrefs userPrefs) { 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(); } @Override @@ -104,13 +129,33 @@ public synchronized void unmarkTask(ReadOnlyTask target) throws TaskNotFoundExce @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){ @@ -120,6 +165,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 ================================================== From 88413a1b27eaead99956c25c4e4e447f1e5abaed Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Mon, 10 Oct 2016 01:49:46 +0800 Subject: [PATCH 25/67] Add natty dependency into Gradle --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index 46b06c1e42ec..f4c7ed147d9a 100644 --- a/build.gradle +++ b/build.gradle @@ -35,6 +35,7 @@ allprojects { junitVersion = '4.12' testFxVersion = '4.0.+' monocleVersion = '1.8.0_20' + nattyVersion = '0.12' libDir = 'lib' } @@ -52,6 +53,7 @@ allprojects { compile "com.fasterxml.jackson.core:jackson-databind:$jacksonVersion" compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonDataTypeVersion" compile "com.google.guava:guava:$guavaVersion" + compile "com.joestelmach:natty:$nattyVersion" testCompile "junit:junit:$junitVersion" testCompile "org.testfx:testfx-core:$testFxVersion" From eb33c45b1f10b55ba14f710b526b0d5d92927533 Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Wed, 12 Oct 2016 06:59:43 +0800 Subject: [PATCH 26/67] Add DateTimeParser and test class --- .../agendum/logic/parser/DateTimeParser.java | 33 +++++++++++++++++++ .../agendum/logic/DateTimerParserTest.java | 23 +++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/main/java/seedu/agendum/logic/parser/DateTimeParser.java create mode 100644 src/test/java/seedu/agendum/logic/DateTimerParserTest.java diff --git a/src/main/java/seedu/agendum/logic/parser/DateTimeParser.java b/src/main/java/seedu/agendum/logic/parser/DateTimeParser.java new file mode 100644 index 000000000000..9fecde780f8e --- /dev/null +++ b/src/main/java/seedu/agendum/logic/parser/DateTimeParser.java @@ -0,0 +1,33 @@ +package seedu.agendum.logic.parser; + +import com.joestelmach.natty.DateGroup; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; +import java.util.List; +import java.util.Optional; + +public class DateTimeParser { + + public static Optional parseString(String input) { + // Referring to natty's Parser Class using its full path because of the namespace collision with our Parser class. + com.joestelmach.natty.Parser parser = new com.joestelmach.natty.Parser(); + List groups = parser.parse(input); + + if (groups.size() <= 0) { + return Optional.empty(); + } + + DateGroup dateGroup = (DateGroup) groups.get(0); + + if (dateGroup.getDates().size() < 0) { + return Optional.empty(); + } + + Date date = dateGroup.getDates().get(0); + + LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()); + return Optional.ofNullable(localDateTime); + } +} 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)); + } +} From 2fe83b246a8be8b87582e3a08e72c1ef04483c83 Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Wed, 12 Oct 2016 07:01:19 +0800 Subject: [PATCH 27/67] Modify Task to support LocalDateTime constructor --- .../java/seedu/agendum/model/task/Task.java | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/src/main/java/seedu/agendum/model/task/Task.java b/src/main/java/seedu/agendum/model/task/Task.java index e5c418e228a7..fe34537e1fd5 100644 --- a/src/main/java/seedu/agendum/model/task/Task.java +++ b/src/main/java/seedu/agendum/model/task/Task.java @@ -15,8 +15,8 @@ public class Task implements ReadOnlyTask { private Name name; private boolean isCompleted; - private LocalDateTime startDateTime; - private LocalDateTime endDateTime; + private Optional startDateTime; + private Optional endDateTime; private UniqueTagList tags; @@ -42,23 +42,18 @@ public Task(Name name, Optional deadline, UniqueTagList tags) { this.name = name; this.isCompleted = false; this.startDateTime = null; - this.endDateTime = deadline.orElse(null); + this.endDateTime = deadline; this.tags = new UniqueTagList(tags); // protect internal tags from changes in the arg list } - - /** - * Constructor for a task (event) with both a start and end time - */ - public Task(Name name, Optional startDateTime, - Optional endDateTime, UniqueTagList tags) { + + public Task(Name name, Optional startDateTime, Optional endDateTime, UniqueTagList tags) { assert !CollectionUtil.isAnyNull(name, tags); this.name = name; this.isCompleted = false; - this.startDateTime = startDateTime.orElse(null); - this.endDateTime = endDateTime.orElse(null); + this.startDateTime = startDateTime; + this.endDateTime = endDateTime; this.tags = new UniqueTagList(tags); // protect internal tags from changes in the arg list } - /** * Copy constructor. */ @@ -84,12 +79,12 @@ public boolean isCompleted() { @Override public Optional getStartDateTime() { - return Optional.ofNullable(startDateTime); + return startDateTime; } @Override public Optional getEndDateTime() { - return Optional.ofNullable(endDateTime); + return endDateTime; } @Override @@ -112,11 +107,11 @@ public void markAsUncompleted() { } public void setStartDateTime(Optional startDateTime) { - this.startDateTime = startDateTime.orElse(null); + this.startDateTime = startDateTime; } public void setEndDateTime(Optional endDateTime) { - this.endDateTime = endDateTime.orElse(null); + this.endDateTime = endDateTime; } /** From 2c7126f47a761d33dc100b025c63dade12af342e Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Wed, 12 Oct 2016 07:02:21 +0800 Subject: [PATCH 28/67] Modify Parser to support complex add commands with DateTime inputs --- .../seedu/agendum/logic/parser/Parser.java | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/main/java/seedu/agendum/logic/parser/Parser.java b/src/main/java/seedu/agendum/logic/parser/Parser.java index 0a0057ec382c..4f1c050629e5 100644 --- a/src/main/java/seedu/agendum/logic/parser/Parser.java +++ b/src/main/java/seedu/agendum/logic/parser/Parser.java @@ -4,6 +4,7 @@ import seedu.agendum.commons.util.StringUtil; import seedu.agendum.commons.exceptions.IllegalValueException; +import java.time.LocalDateTime; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -32,6 +33,8 @@ public class Parser { private static final Pattern RENAME_ARGS_FORMAT = Pattern.compile("(?\\d+)\\s+(?[^/]+)"); + private static final Pattern ADD_ARGS_FORMAT = Pattern.compile("(?[^/]+)(\\/from\\s)(?\\b.+?(?=\\/|$)){1}(\\/to\\s)(?\\b.+?(?=\\/|$)){1}(\\/by\\s)(?\\b.+?(?=\\/|$)){1}"); + public Parser() {} /** @@ -95,16 +98,35 @@ public Command parseCommand(String userInput) { * @return the prepared command */ private Command prepareAdd(String args){ - final Matcher matcher = TASK_DATA_ARGS_FORMAT.matcher(args.trim()); + final Matcher matcher = ADD_ARGS_FORMAT.matcher(args.trim()); // Validate arg string format - if (!matcher.matches()) { + if (!matcher.find()) { return new IncorrectCommand(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); } + try { - return new AddCommand( - matcher.group("name"), - getTagsFromArgs(matcher.group("tagArguments")) - ); + String name = matcher.group("name"); + Optional byDateTime = DateTimeParser.parseString(matcher.group("byAdd")); + Optional fromDateTime = DateTimeParser.parseString(matcher.group("fromAdd")); + Optional toDateTime = DateTimeParser.parseString(matcher.group("toAdd")); + + if (byDateTime.isPresent()) { + return new AddCommand( + name, + byDateTime, + getTagsFromArgs("test") + ); + } else if (fromDateTime.isPresent() && toDateTime.isPresent()) { + return new AddCommand( + name, + fromDateTime, + toDateTime, + getTagsFromArgs("test") + ); + } else { + return new IncorrectCommand( + String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); + } } catch (IllegalValueException ive) { return new IncorrectCommand(ive.getMessage()); } From f3dfce1afa0e2a54003c542b613623e1efce63a3 Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Wed, 12 Oct 2016 07:02:57 +0800 Subject: [PATCH 29/67] Modify AddCommand to add LocalDateTime Constructor --- .../agendum/logic/commands/AddCommand.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/main/java/seedu/agendum/logic/commands/AddCommand.java b/src/main/java/seedu/agendum/logic/commands/AddCommand.java index d2b446a87ae9..985a192f1a40 100644 --- a/src/main/java/seedu/agendum/logic/commands/AddCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/AddCommand.java @@ -5,7 +5,11 @@ import seedu.agendum.model.tag.UniqueTagList; import seedu.agendum.model.task.*; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Collections; import java.util.HashSet; +import java.util.Optional; import java.util.Set; /** @@ -42,6 +46,43 @@ public AddCommand(String name, Set tags) ); } + /** + * Convenience constructor using raw values. + * + * @throws IllegalValueException if any of the raw values are invalid + */ + public AddCommand(String name, Optional deadlineDate, Set tags) + throws IllegalValueException { + final Set tagSet = new HashSet<>(); + for (String tagName : tags) { + tagSet.add(new Tag(tagName)); + } + this.toAdd = new Task( + new Name(name), + deadlineDate, + new UniqueTagList(tagSet) + ); + } + + /** + * Convenience constructor using raw values. + * + * @throws IllegalValueException if any of the raw values are invalid + */ + public AddCommand(String name, Optional startDateTime, Optional endDateTime, Set tags) + throws IllegalValueException { + final Set tagSet = new HashSet<>(); + for (String tagName : tags) { + tagSet.add(new Tag(tagName)); + } + this.toAdd = new Task( + new Name(name), + startDateTime, + endDateTime, + new UniqueTagList(tagSet) + ); + } + @Override public CommandResult execute() { assert model != null; From d7b828705b9aa59ec5f633bb5809d53dc04c4752 Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Wed, 12 Oct 2016 07:53:49 +0800 Subject: [PATCH 30/67] Guard checks to DateTimeParser --- src/main/java/seedu/agendum/logic/parser/DateTimeParser.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/seedu/agendum/logic/parser/DateTimeParser.java b/src/main/java/seedu/agendum/logic/parser/DateTimeParser.java index 9fecde780f8e..4cd35a7df02e 100644 --- a/src/main/java/seedu/agendum/logic/parser/DateTimeParser.java +++ b/src/main/java/seedu/agendum/logic/parser/DateTimeParser.java @@ -11,6 +11,9 @@ public class DateTimeParser { public static Optional parseString(String input) { + if (input.length() <= 0) { + return Optional.empty(); + } // Referring to natty's Parser Class using its full path because of the namespace collision with our Parser class. com.joestelmach.natty.Parser parser = new com.joestelmach.natty.Parser(); List groups = parser.parse(input); From 29c57c5fb59899556be88764c7204904f7865b20 Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Wed, 12 Oct 2016 08:01:53 +0800 Subject: [PATCH 31/67] Update regex --- src/main/java/seedu/agendum/logic/parser/Parser.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/seedu/agendum/logic/parser/Parser.java b/src/main/java/seedu/agendum/logic/parser/Parser.java index 4f1c050629e5..9af417a3fc12 100644 --- a/src/main/java/seedu/agendum/logic/parser/Parser.java +++ b/src/main/java/seedu/agendum/logic/parser/Parser.java @@ -33,7 +33,7 @@ public class Parser { private static final Pattern RENAME_ARGS_FORMAT = Pattern.compile("(?\\d+)\\s+(?[^/]+)"); - private static final Pattern ADD_ARGS_FORMAT = Pattern.compile("(?[^/]+)(\\/from\\s)(?\\b.+?(?=\\/|$)){1}(\\/to\\s)(?\\b.+?(?=\\/|$)){1}(\\/by\\s)(?\\b.+?(?=\\/|$)){1}"); + private static final Pattern ADD_ARGS_FORMAT = Pattern.compile("(?[^/]+)(\\/from\\s)(?\\b.+?(?=\\/|$)){0,1}(\\/to\\s)(?\\b.+?(?=\\/|$)){0,1}"); public Parser() {} @@ -106,9 +106,9 @@ private Command prepareAdd(String args){ try { String name = matcher.group("name"); - Optional byDateTime = DateTimeParser.parseString(matcher.group("byAdd")); - Optional fromDateTime = DateTimeParser.parseString(matcher.group("fromAdd")); - Optional toDateTime = DateTimeParser.parseString(matcher.group("toAdd")); + Optional byDateTime = DateTimeParser.parseString(""); + Optional fromDateTime = DateTimeParser.parseString(matcher.group("fromArg")); + Optional toDateTime = DateTimeParser.parseString(matcher.group("toArg")); if (byDateTime.isPresent()) { return new AddCommand( From 74937c9df21b438e21941758d1b858c24b75485f Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Wed, 12 Oct 2016 09:29:06 +0800 Subject: [PATCH 32/67] =?UTF-8?q?Revert=20Task=E2=80=99s=20instance=20vari?= =?UTF-8?q?able=20to=20old=20state?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/seedu/agendum/model/task/Task.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/seedu/agendum/model/task/Task.java b/src/main/java/seedu/agendum/model/task/Task.java index fe34537e1fd5..0e36d9223d3f 100644 --- a/src/main/java/seedu/agendum/model/task/Task.java +++ b/src/main/java/seedu/agendum/model/task/Task.java @@ -15,8 +15,8 @@ public class Task implements ReadOnlyTask { private Name name; private boolean isCompleted; - private Optional startDateTime; - private Optional endDateTime; + private LocalDateTime startDateTime; + private LocalDateTime endDateTime; private UniqueTagList tags; @@ -42,16 +42,17 @@ public Task(Name name, Optional deadline, UniqueTagList tags) { this.name = name; this.isCompleted = false; this.startDateTime = null; - this.endDateTime = deadline; + this.endDateTime = deadline.orElse(null); this.tags = new UniqueTagList(tags); // protect internal tags from changes in the arg list } - public Task(Name name, Optional startDateTime, Optional endDateTime, UniqueTagList tags) { + public Task(Name name, Optional startDateTime, + Optional endDateTime, UniqueTagList tags) { assert !CollectionUtil.isAnyNull(name, tags); this.name = name; this.isCompleted = false; - this.startDateTime = startDateTime; - this.endDateTime = endDateTime; + this.startDateTime = startDateTime.orElse(null); + this.endDateTime = endDateTime.orElse(null); this.tags = new UniqueTagList(tags); // protect internal tags from changes in the arg list } /** @@ -79,12 +80,12 @@ public boolean isCompleted() { @Override public Optional getStartDateTime() { - return startDateTime; + return Optional.ofNullable(startDateTime); } @Override public Optional getEndDateTime() { - return endDateTime; + return Optional.ofNullable(endDateTime); } @Override @@ -107,11 +108,11 @@ public void markAsUncompleted() { } public void setStartDateTime(Optional startDateTime) { - this.startDateTime = startDateTime; + this.startDateTime = startDateTime.orElse(null); } public void setEndDateTime(Optional endDateTime) { - this.endDateTime = endDateTime; + this.endDateTime = endDateTime.orElse(null); } /** From 49d177dfba1b2ffe99cba92059b9cab0559ecf76 Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Wed, 12 Oct 2016 09:31:30 +0800 Subject: [PATCH 33/67] =?UTF-8?q?Adding=20start/end=20time=20info=20to=20T?= =?UTF-8?q?ask=E2=80=99s=20message=20output?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/seedu/agendum/model/task/ReadOnlyTask.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/seedu/agendum/model/task/ReadOnlyTask.java b/src/main/java/seedu/agendum/model/task/ReadOnlyTask.java index ceddcac0c57e..c39268d8ba97 100644 --- a/src/main/java/seedu/agendum/model/task/ReadOnlyTask.java +++ b/src/main/java/seedu/agendum/model/task/ReadOnlyTask.java @@ -42,6 +42,8 @@ default String getAsText() { builder.append(getName()) .append(" Tags: "); getTags().forEach(builder::append); + builder.append("\nStart time: ").append(this.getStartDateTime()); + builder.append("\nEnd time: ").append(this.getEndDateTime()); return builder.toString(); } From d37070c247ff14171847933d2870a03f978314a2 Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Wed, 12 Oct 2016 10:08:33 +0800 Subject: [PATCH 34/67] Fix minor formatting --- src/main/java/seedu/agendum/model/task/Task.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/agendum/model/task/Task.java b/src/main/java/seedu/agendum/model/task/Task.java index 0e36d9223d3f..76bf5ba28bc7 100644 --- a/src/main/java/seedu/agendum/model/task/Task.java +++ b/src/main/java/seedu/agendum/model/task/Task.java @@ -47,7 +47,7 @@ public Task(Name name, Optional deadline, UniqueTagList tags) { } public Task(Name name, Optional startDateTime, - Optional endDateTime, UniqueTagList tags) { + Optional endDateTime, UniqueTagList tags) { assert !CollectionUtil.isAnyNull(name, tags); this.name = name; this.isCompleted = false; @@ -55,6 +55,7 @@ public Task(Name name, Optional startDateTime, this.endDateTime = endDateTime.orElse(null); this.tags = new UniqueTagList(tags); // protect internal tags from changes in the arg list } + /** * Copy constructor. */ From 5c99477182b90fd54ba9efc476c8c416039d728b Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Wed, 12 Oct 2016 10:11:27 +0800 Subject: [PATCH 35/67] Comments and minor code fixes --- .../java/seedu/agendum/logic/commands/AddCommand.java | 8 +++----- src/main/java/seedu/agendum/logic/parser/Parser.java | 6 +----- src/main/java/seedu/agendum/model/task/Task.java | 3 +++ 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main/java/seedu/agendum/logic/commands/AddCommand.java b/src/main/java/seedu/agendum/logic/commands/AddCommand.java index 985a192f1a40..40194b4aa50f 100644 --- a/src/main/java/seedu/agendum/logic/commands/AddCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/AddCommand.java @@ -5,9 +5,7 @@ import seedu.agendum.model.tag.UniqueTagList; import seedu.agendum.model.task.*; -import java.time.LocalDate; import java.time.LocalDateTime; -import java.util.Collections; import java.util.HashSet; import java.util.Optional; import java.util.Set; @@ -30,7 +28,7 @@ public class AddCommand extends Command { private final Task toAdd; /** - * Convenience constructor using raw values. + * Convenience constructor using name and set of tags * * @throws IllegalValueException if any of the raw values are invalid */ @@ -47,7 +45,7 @@ public AddCommand(String name, Set tags) } /** - * Convenience constructor using raw values. + * Convenience constructor using name, end datetime and set of tags * * @throws IllegalValueException if any of the raw values are invalid */ @@ -65,7 +63,7 @@ public AddCommand(String name, Optional deadlineDate, Set } /** - * Convenience constructor using raw values. + * Convenience constructor using name, start datetime, end datetime and set of tags * * @throws IllegalValueException if any of the raw values are invalid */ diff --git a/src/main/java/seedu/agendum/logic/parser/Parser.java b/src/main/java/seedu/agendum/logic/parser/Parser.java index 9af417a3fc12..658d7c45b278 100644 --- a/src/main/java/seedu/agendum/logic/parser/Parser.java +++ b/src/main/java/seedu/agendum/logic/parser/Parser.java @@ -27,10 +27,6 @@ public class Parser { private static final Pattern KEYWORDS_ARGS_FORMAT = Pattern.compile("(?\\S+(?:\\s+\\S+)*)"); // one or more keywords separated by whitespace - private static final Pattern TASK_DATA_ARGS_FORMAT = // '/' forward slashes are reserved for delimiter prefixes - Pattern.compile("(?[^/]+)" - + "(?(?: t/[^/]+)*)"); // variable number of tags - private static final Pattern RENAME_ARGS_FORMAT = Pattern.compile("(?\\d+)\\s+(?[^/]+)"); private static final Pattern ADD_ARGS_FORMAT = Pattern.compile("(?[^/]+)(\\/from\\s)(?\\b.+?(?=\\/|$)){0,1}(\\/to\\s)(?\\b.+?(?=\\/|$)){0,1}"); @@ -100,7 +96,7 @@ public Command parseCommand(String userInput) { private Command prepareAdd(String args){ final Matcher matcher = ADD_ARGS_FORMAT.matcher(args.trim()); // Validate arg string format - if (!matcher.find()) { + if (!matcher.matches()) { return new IncorrectCommand(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); } diff --git a/src/main/java/seedu/agendum/model/task/Task.java b/src/main/java/seedu/agendum/model/task/Task.java index 76bf5ba28bc7..63294433d2b7 100644 --- a/src/main/java/seedu/agendum/model/task/Task.java +++ b/src/main/java/seedu/agendum/model/task/Task.java @@ -46,6 +46,9 @@ public Task(Name name, Optional deadline, UniqueTagList tags) { this.tags = new UniqueTagList(tags); // protect internal tags from changes in the arg list } + /** + * Constructor for a task with start and end datetime + */ public Task(Name name, Optional startDateTime, Optional endDateTime, UniqueTagList tags) { assert !CollectionUtil.isAnyNull(name, tags); From a6ff5c36fb04bd73d1936425b1936a5f1315800e Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Wed, 12 Oct 2016 21:20:53 +0800 Subject: [PATCH 36/67] Improve guard for DateTimeParmer --- src/main/java/seedu/agendum/logic/parser/DateTimeParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/seedu/agendum/logic/parser/DateTimeParser.java b/src/main/java/seedu/agendum/logic/parser/DateTimeParser.java index 4cd35a7df02e..84b3710e9236 100644 --- a/src/main/java/seedu/agendum/logic/parser/DateTimeParser.java +++ b/src/main/java/seedu/agendum/logic/parser/DateTimeParser.java @@ -11,7 +11,7 @@ public class DateTimeParser { public static Optional parseString(String input) { - if (input.length() <= 0) { + if(input == null || input.isEmpty()) { return Optional.empty(); } // Referring to natty's Parser Class using its full path because of the namespace collision with our Parser class. From 03533b5163eaa795ba61eeba5628c69309312956 Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Wed, 12 Oct 2016 21:25:04 +0800 Subject: [PATCH 37/67] =?UTF-8?q?Major=20refactor=20to=20Parser=E2=80=99s?= =?UTF-8?q?=20prepareAdd=20regex=20matcher?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Matching was reimplemented for robustness. Now supports ‘from’, ‘by’, ‘to’ tokens in any order or combination --- .../seedu/agendum/logic/parser/Parser.java | 48 +++++++++++++------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/src/main/java/seedu/agendum/logic/parser/Parser.java b/src/main/java/seedu/agendum/logic/parser/Parser.java index 658d7c45b278..8dee10e93abf 100644 --- a/src/main/java/seedu/agendum/logic/parser/Parser.java +++ b/src/main/java/seedu/agendum/logic/parser/Parser.java @@ -29,7 +29,11 @@ public class Parser { private static final Pattern RENAME_ARGS_FORMAT = Pattern.compile("(?\\d+)\\s+(?[^/]+)"); - private static final Pattern ADD_ARGS_FORMAT = Pattern.compile("(?[^/]+)(\\/from\\s)(?\\b.+?(?=\\/|$)){0,1}(\\/to\\s)(?\\b.+?(?=\\/|$)){0,1}"); + private static final Pattern ADD_ARGS_FORMAT = Pattern.compile("(?:.+?(?=(?:(?:by|from|to)\\s|$)))+?"); + + private static final String ADD_ARGS_FROM = "from"; + private static final String ADD_ARGS_BY = "by"; + private static final String ADD_ARGS_TO = "to"; public Parser() {} @@ -94,29 +98,45 @@ public Command parseCommand(String userInput) { * @return the prepared command */ private Command prepareAdd(String args){ - final Matcher matcher = ADD_ARGS_FORMAT.matcher(args.trim()); - // Validate arg string format + Matcher matcher = ADD_ARGS_FORMAT.matcher(args.trim()); if (!matcher.matches()) { return new IncorrectCommand(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); } try { - String name = matcher.group("name"); - Optional byDateTime = DateTimeParser.parseString(""); - Optional fromDateTime = DateTimeParser.parseString(matcher.group("fromArg")); - Optional toDateTime = DateTimeParser.parseString(matcher.group("toArg")); + matcher = ADD_ARGS_FORMAT.matcher(args.trim()); + + String taskTitle = null; + HashMap> dateTimeMap = new HashMap<>(); + final String[] tokens = new String[]{ADD_ARGS_FROM, ADD_ARGS_TO, ADD_ARGS_BY}; + + while (matcher.find()) { + boolean matchedWithPrefix = false; + + for (String token:tokens) { + String s = matcher.group(0).toLowerCase(); + if (s.startsWith(token)) { + s = s.substring(token.length(), s.length()); + dateTimeMap.put(token, DateTimeParser.parseString(s)); + matchedWithPrefix = true; + } + } + if (!matchedWithPrefix) { + taskTitle = matcher.group(0); + } + } - if (byDateTime.isPresent()) { + if (dateTimeMap.containsKey(ADD_ARGS_BY)) { return new AddCommand( - name, - byDateTime, + taskTitle, + dateTimeMap.get(ADD_ARGS_BY), getTagsFromArgs("test") ); - } else if (fromDateTime.isPresent() && toDateTime.isPresent()) { + } else if (dateTimeMap.containsKey(ADD_ARGS_FROM) && dateTimeMap.containsKey(ADD_ARGS_TO)) { return new AddCommand( - name, - fromDateTime, - toDateTime, + taskTitle, + dateTimeMap.get(ADD_ARGS_FROM), + dateTimeMap.get(ADD_ARGS_TO), getTagsFromArgs("test") ); } else { From 6b8065502a0b6fa36867e023c0f929766ebda3d2 Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Wed, 12 Oct 2016 23:20:27 +0800 Subject: [PATCH 38/67] Fix bug where tasks with just a title were getting ignored --- src/main/java/seedu/agendum/logic/parser/Parser.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/agendum/logic/parser/Parser.java b/src/main/java/seedu/agendum/logic/parser/Parser.java index 8dee10e93abf..48d052a300bb 100644 --- a/src/main/java/seedu/agendum/logic/parser/Parser.java +++ b/src/main/java/seedu/agendum/logic/parser/Parser.java @@ -139,7 +139,13 @@ private Command prepareAdd(String args){ dateTimeMap.get(ADD_ARGS_TO), getTagsFromArgs("test") ); - } else { + } else if (!dateTimeMap.containsKey(ADD_ARGS_FROM) && !dateTimeMap.containsKey(ADD_ARGS_TO) && !dateTimeMap.containsKey(ADD_ARGS_BY)) { + return new AddCommand( + taskTitle, + getTagsFromArgs("test") + ); + } + else { return new IncorrectCommand( String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); } From 676518f74f4cdffda26b4e4657a862cbf182ceb3 Mon Sep 17 00:00:00 2001 From: Justin Date: Sat, 15 Oct 2016 18:51:38 +0800 Subject: [PATCH 39/67] Fix error in LogicManagerTest # list that was passed in does not match the list that model gives, which is an unmodifiable observable sorted filtered todolist --- .../seedu/agendum/logic/LogicManagerTest.java | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/test/java/seedu/agendum/logic/LogicManagerTest.java b/src/test/java/seedu/agendum/logic/LogicManagerTest.java index c1a8f29a1973..4cdbea32a2f0 100644 --- a/src/test/java/seedu/agendum/logic/LogicManagerTest.java +++ b/src/test/java/seedu/agendum/logic/LogicManagerTest.java @@ -1,12 +1,17 @@ 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; import org.junit.Test; import org.junit.rules.TemporaryFolder; 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; @@ -470,12 +475,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 @@ -488,11 +502,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); } From 7c528a89d7e1d77917e847cab18a29fb62aaf77a Mon Sep 17 00:00:00 2001 From: rachx Date: Sat, 15 Oct 2016 19:28:02 +0800 Subject: [PATCH 40/67] Update compareTo in task class --- .../java/seedu/agendum/model/task/Task.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/agendum/model/task/Task.java b/src/main/java/seedu/agendum/model/task/Task.java index 6811827b5774..8483757c0ce3 100644 --- a/src/main/java/seedu/agendum/model/task/Task.java +++ b/src/main/java/seedu/agendum/model/task/Task.java @@ -170,13 +170,34 @@ public int hashCode() { @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()) { - this.getTaskTime().get().compareTo(other.getTaskTime().get()); + 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()); } From 1781e7b45807edaa1fd87d4182ad3794b95f1d05 Mon Sep 17 00:00:00 2001 From: rachx Date: Sat, 15 Oct 2016 20:43:53 +0800 Subject: [PATCH 41/67] update xml adapted task to store time --- .../seedu/agendum/storage/XmlAdaptedTask.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/main/java/seedu/agendum/storage/XmlAdaptedTask.java b/src/main/java/seedu/agendum/storage/XmlAdaptedTask.java index 90c8ab8974d7..5a83b223762f 100644 --- a/src/main/java/seedu/agendum/storage/XmlAdaptedTask.java +++ b/src/main/java/seedu/agendum/storage/XmlAdaptedTask.java @@ -6,18 +6,27 @@ import seedu.agendum.model.task.*; import javax.xml.bind.annotation.XmlElement; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; +import java.util.Optional; /** * JAXB-friendly version of the Task. */ public class XmlAdaptedTask { + private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); @XmlElement(required = true) private String name; @XmlElement(required = true) private String isCompleted; + @XmlElement(required = false) + private String startDateTime; + @XmlElement(required = false) + private String endDateTime; @XmlElement private List tagged = new ArrayList<>(); @@ -37,6 +46,12 @@ public XmlAdaptedTask(ReadOnlyTask source) { name = source.getName().fullName; isCompleted = Boolean.toString(source.isCompleted()); tagged = new ArrayList<>(); + if (source.getStartDateTime().isPresent()) { + startDateTime = source.getStartDateTime().get().format(formatter); + } + if (source.getEndDateTime().isPresent()) { + endDateTime = source.getEndDateTime().get().format(formatter); + } for (Tag tag : source.getTags()) { tagged.add(new XmlAdaptedTag(tag)); } @@ -60,6 +75,12 @@ public Task toModelType() throws IllegalValueException { if (markedAsCompleted) { newTask.markAsCompleted(); } + if (startDateTime != null) { + newTask.setStartDateTime(Optional.ofNullable(LocalDateTime.parse(this.startDateTime, formatter))); + } + if (endDateTime != null) { + newTask.setEndDateTime(Optional.ofNullable(LocalDateTime.parse(this.endDateTime, formatter))); + } return newTask; } } From 482c172ca5ec9f477fa4ce756aae2f1787c8a269 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Sat, 15 Oct 2016 21:51:42 +0800 Subject: [PATCH 42/67] Edit dark theme --- src/main/resources/view/DarkTheme.css | 37 --------------------------- 1 file changed, 37 deletions(-) diff --git a/src/main/resources/view/DarkTheme.css b/src/main/resources/view/DarkTheme.css index 960a4dabada8..7db0faf313a6 100644 --- a/src/main/resources/view/DarkTheme.css +++ b/src/main/resources/view/DarkTheme.css @@ -17,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 { - -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%); From 6437b2488b7277255eac76558fdd9bd44ec87100 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Sat, 15 Oct 2016 21:52:03 +0800 Subject: [PATCH 43/67] Add help window --- src/main/resources/view/HelpWindow.css | 103 ++++++++++++++++++++++++ src/main/resources/view/HelpWindow.fxml | 35 +++++++- 2 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/view/HelpWindow.css 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..70196f3f664e 100644 --- a/src/main/resources/view/HelpWindow.fxml +++ b/src/main/resources/view/HelpWindow.fxml @@ -1,8 +1,39 @@ + + + + - - + + + + + + + + + + + + + + + + + + + + + + From 45d4ddb00ec51819a78ef48dfd077c6f3f86fa51 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Sat, 15 Oct 2016 21:52:32 +0800 Subject: [PATCH 44/67] Add table view for help window --- .../java/seedu/agendum/ui/HelpWindow.java | 95 ++++++++++++++++--- .../java/seedu/agendum/ui/ResultPopUp.java | 2 +- 2 files changed, 85 insertions(+), 12 deletions(-) diff --git a/src/main/java/seedu/agendum/ui/HelpWindow.java b/src/main/java/seedu/agendum/ui/HelpWindow.java index 4a7e5d7534d2..5a4b4f025c93 100644 --- a/src/main/java/seedu/agendum/ui/HelpWindow.java +++ b/src/main/java/seedu/agendum/ui/HelpWindow.java @@ -1,11 +1,34 @@ package seedu.agendum.ui; +import javafx.beans.property.SimpleStringProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +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.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; @@ -19,19 +42,54 @@ 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; - + + @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; } + @Override public void setNode(Node node) { @@ -47,13 +105,28 @@ 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); - - WebView browser = new WebView(); - browser.getEngine().load(USERGUIDE_URL); - FxViewUtil.applyAnchorBoundaryParameters(browser, 0.0, 0.0, 0.0, 0.0); - mainPane.getChildren().add(browser); + loadHelpList(); + } + + 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() { diff --git a/src/main/java/seedu/agendum/ui/ResultPopUp.java b/src/main/java/seedu/agendum/ui/ResultPopUp.java index 217e4115bdd2..46d1ccd9da12 100644 --- a/src/main/java/seedu/agendum/ui/ResultPopUp.java +++ b/src/main/java/seedu/agendum/ui/ResultPopUp.java @@ -74,7 +74,7 @@ public void postMessage(String message) { show(); PauseTransition delay = new PauseTransition(Duration.seconds(2)); - delay.setOnFinished( event -> reFocusRoot()); + delay.setOnFinished(event -> reFocusRoot()); delay.play(); } From 1145c982a8854cbd56d2745a900cdebf1982a4dd Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Sat, 15 Oct 2016 21:52:48 +0800 Subject: [PATCH 45/67] Add attributes to commands --- .../agendum/logic/commands/AddCommand.java | 22 +++++++++++++++-- .../agendum/logic/commands/ClearCommand.java | 18 +++++++++++++- .../seedu/agendum/logic/commands/Command.java | 18 +++++++++++++- .../agendum/logic/commands/DeleteCommand.java | 22 +++++++++++++++-- .../agendum/logic/commands/ExitCommand.java | 19 +++++++++++++-- .../agendum/logic/commands/FindCommand.java | 22 +++++++++++++++-- .../agendum/logic/commands/HelpCommand.java | 20 ++++++++++++++-- .../logic/commands/IncorrectCommand.java | 15 ++++++++++++ .../agendum/logic/commands/ListCommand.java | 18 +++++++++++++- .../agendum/logic/commands/MarkCommand.java | 22 +++++++++++++++-- .../agendum/logic/commands/RenameCommand.java | 24 ++++++++++++++++--- .../agendum/logic/commands/SelectCommand.java | 15 ++++++++++++ .../agendum/logic/commands/UnmarkCommand.java | 23 +++++++++++++++--- 13 files changed, 237 insertions(+), 21 deletions(-) diff --git a/src/main/java/seedu/agendum/logic/commands/AddCommand.java b/src/main/java/seedu/agendum/logic/commands/AddCommand.java index d2b446a87ae9..4be125f6a3a1 100644 --- a/src/main/java/seedu/agendum/logic/commands/AddCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/AddCommand.java @@ -14,7 +14,9 @@ public class AddCommand extends Command { public static final String COMMAND_WORD = "add"; - + 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. " + "Parameters: NAME [t/TAG]...\n" + "Example: " + COMMAND_WORD @@ -23,8 +25,10 @@ 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 raw values. * @@ -54,4 +58,18 @@ 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..4500efb4445c 100644 --- a/src/main/java/seedu/agendum/logic/commands/ClearCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/ClearCommand.java @@ -8,15 +8,31 @@ public class ClearCommand extends Command { 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 906dd1a84199..2d129964230c 100644 --- a/src/main/java/seedu/agendum/logic/commands/DeleteCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/DeleteCommand.java @@ -11,7 +11,8 @@ public class DeleteCommand extends Command { 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 task identified by the index number used in the last task listing.\n" + "Parameters: INDEX (must be a positive integer)\n" @@ -19,8 +20,10 @@ public class DeleteCommand extends Command { public static final String MESSAGE_DELETE_TASK_SUCCESS = "Deleted Task: %1$s"; - public final int targetIndex; + public int targetIndex = -1; + public DeleteCommand() {} + public DeleteCommand(int targetIndex) { this.targetIndex = targetIndex; } @@ -47,4 +50,19 @@ public CommandResult execute() { return new CommandResult(String.format(MESSAGE_DELETE_TASK_SUCCESS, taskToDelete)); } + @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..4aa55e047c71 100644 --- a/src/main/java/seedu/agendum/logic/commands/ExitCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/ExitCommand.java @@ -9,9 +9,10 @@ public class ExitCommand extends Command { 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 +21,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..ce3ee01cd3ff 100644 --- a/src/main/java/seedu/agendum/logic/commands/FindCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/FindCommand.java @@ -9,14 +9,17 @@ public class FindCommand extends Command { 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 +30,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..2b237e4fc18c 100644 --- a/src/main/java/seedu/agendum/logic/commands/HelpCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/HelpCommand.java @@ -10,12 +10,13 @@ public class HelpCommand extends Command { 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 +24,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..f35b82d71f93 100644 --- a/src/main/java/seedu/agendum/logic/commands/ListCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/ListCommand.java @@ -7,7 +7,8 @@ public class ListCommand extends Command { 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 +18,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 1591696edb98..33bbeca48cbd 100644 --- a/src/main/java/seedu/agendum/logic/commands/MarkCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/MarkCommand.java @@ -11,7 +11,8 @@ public class MarkCommand extends Command { 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 task identified by the index number used in the last task listing.\n" + "Parameters: INDEX (must be a positive integer)\n" @@ -19,8 +20,10 @@ public class MarkCommand extends Command { public static final String MESSAGE_MARK_TASK_SUCCESS = "Marked Task: %1$s"; - public final int targetIndex; + public int targetIndex = -1; + public MarkCommand() {}; + public MarkCommand(int targetIndex) { this.targetIndex = targetIndex; } @@ -47,4 +50,19 @@ public CommandResult execute() { return new CommandResult(String.format(MESSAGE_MARK_TASK_SUCCESS, taskToMark)); } + @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 5e16eff3399c..c5877233163b 100644 --- a/src/main/java/seedu/agendum/logic/commands/RenameCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/RenameCommand.java @@ -13,7 +13,8 @@ public class RenameCommand extends Command { 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 integer) NAME\n" + "Example: " + COMMAND_WORD @@ -22,9 +23,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. * @@ -60,4 +63,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 1827465aea78..47d6ab8fdd45 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/UnmarkCommand.java b/src/main/java/seedu/agendum/logic/commands/UnmarkCommand.java index 818b4d2030b1..876a9f3b88dc 100644 --- a/src/main/java/seedu/agendum/logic/commands/UnmarkCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/UnmarkCommand.java @@ -11,7 +11,8 @@ public class UnmarkCommand extends Command { 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 + ": Unmarks the task identified by the index number used in the last task listing.\n" + "Parameters: INDEX (must be a positive integer)\n" @@ -19,8 +20,9 @@ public class UnmarkCommand extends Command { public static final String MESSAGE_UNMARK_TASK_SUCCESS = "Unmarked Task: %1$s"; - public final int targetIndex; - + public int targetIndex = -1; + + public UnmarkCommand() {}; public UnmarkCommand(int targetIndex) { this.targetIndex = targetIndex; } @@ -47,4 +49,19 @@ public CommandResult execute() { return new CommandResult(String.format(MESSAGE_UNMARK_TASK_SUCCESS, taskToUnmark)); } + @Override + public String getName() { + return COMMAND_WORD; + } + + @Override + public String getFormat() { + return COMMAND_FORMAT; + } + + @Override + public String getDescription() { + return COMMAND_DESCRIPTION; + } + } From adc4e96509500e19ab1234ab7d95cb4d58a43dbb Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Sat, 15 Oct 2016 22:01:51 +0800 Subject: [PATCH 46/67] Add id for helpwindow --- src/main/resources/view/HelpWindow.fxml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/view/HelpWindow.fxml b/src/main/resources/view/HelpWindow.fxml index 70196f3f664e..8f04d6cf5114 100644 --- a/src/main/resources/view/HelpWindow.fxml +++ b/src/main/resources/view/HelpWindow.fxml @@ -9,7 +9,7 @@ - + From ddfb75e2c93a3beae560d4edacf76e939212ff28 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Sun, 16 Oct 2016 15:33:39 +0800 Subject: [PATCH 47/67] Remove showing result pop up after help windows opened --- src/main/java/seedu/agendum/ui/CommandBox.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/agendum/ui/CommandBox.java b/src/main/java/seedu/agendum/ui/CommandBox.java index b07364f4eef9..668ee5aeb0a6 100644 --- a/src/main/java/seedu/agendum/ui/CommandBox.java +++ b/src/main/java/seedu/agendum/ui/CommandBox.java @@ -76,7 +76,9 @@ private void handleCommandInputChanged() { */ setStyleToIndicateCorrectCommand(); mostRecentResult = logic.execute(previousCommandTest); - resultPopUp.postMessage(mostRecentResult.feedbackToUser); + if(!previousCommandTest.toLowerCase().equals("help")) { + resultPopUp.postMessage(mostRecentResult.feedbackToUser); + } logger.info("Result: " + mostRecentResult.feedbackToUser); } From 513430df07541af99a81dd2c897413f877c15bfa Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Sun, 16 Oct 2016 15:33:53 +0800 Subject: [PATCH 48/67] Formant add command message usage --- src/main/java/seedu/agendum/logic/commands/AddCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/seedu/agendum/logic/commands/AddCommand.java b/src/main/java/seedu/agendum/logic/commands/AddCommand.java index 4be125f6a3a1..d2359b70d359 100644 --- a/src/main/java/seedu/agendum/logic/commands/AddCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/AddCommand.java @@ -17,7 +17,7 @@ public class AddCommand extends Command { 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. " + public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds a task with no time and date. \n" + "Parameters: NAME [t/TAG]...\n" + "Example: " + COMMAND_WORD + " Watch Star Wars t/movies"; From 7f97bf1365589da9983e5f5a7c7d03ec98277645 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Sun, 16 Oct 2016 15:34:12 +0800 Subject: [PATCH 49/67] Change result popup style --- src/main/resources/view/ResultPopUp.css | 31 ++++-------------------- src/main/resources/view/ResultPopUp.fxml | 16 +++--------- 2 files changed, 8 insertions(+), 39 deletions(-) diff --git a/src/main/resources/view/ResultPopUp.css b/src/main/resources/view/ResultPopUp.css index 094f2ba4f062..7b05206dc998 100644 --- a/src/main/resources/view/ResultPopUp.css +++ b/src/main/resources/view/ResultPopUp.css @@ -1,31 +1,10 @@ .pane { - -fx-background-color: transparent; - -fx-padding: 10px; -} - -.hbox { -fx-background-color: rgb(229,74,63); - -fx-background-radius: 20; -} - -.text-area { - -fx-font-size: 18px; - -fx-background-color: transparent; - -fx-text-fill: white; -} - -.text-area .scroll-pane { - -fx-background-color: transparent; -} - -.text-area .scroll-pane .viewport{ - -fx-background-color: transparent; -} - -.text-area .scroll-pane .content{ - -fx-background-color: transparent; + -fx-background-radius: 20; + -fx-padding: 10px; } -.text-area *.text { - -fx-text-alignment: center; +.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 index e569df5759e0..321dbe24495b 100644 --- a/src/main/resources/view/ResultPopUp.fxml +++ b/src/main/resources/view/ResultPopUp.fxml @@ -1,20 +1,10 @@ - + - - - + - - - - - + From 2cd5517f6a8a8e65f8806875036220b47045adca Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Sun, 16 Oct 2016 15:34:30 +0800 Subject: [PATCH 50/67] Allow result pop up to resize based on the length of content --- .../java/seedu/agendum/ui/ResultPopUp.java | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/main/java/seedu/agendum/ui/ResultPopUp.java b/src/main/java/seedu/agendum/ui/ResultPopUp.java index 46d1ccd9da12..ff0575d07c44 100644 --- a/src/main/java/seedu/agendum/ui/ResultPopUp.java +++ b/src/main/java/seedu/agendum/ui/ResultPopUp.java @@ -6,6 +6,7 @@ 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; @@ -22,9 +23,6 @@ public class ResultPopUp extends UiPart { private static final Logger logger = LogsCenter.getLogger(ResultPopUp.class); private static final String FXML = "ResultPopUp.fxml"; - public static final int HEIGHT = 150; - public static final int WIDTH = 200; - private final StringProperty displayed = new SimpleStringProperty(""); private AnchorPane mainPane; @@ -32,7 +30,7 @@ public class ResultPopUp extends UiPart { private static Stage root; @FXML - private TextArea resultTextArea; + private Label resultDisplay; public static ResultPopUp load(Stage primaryStage) { logger.fine("Showing command execution result."); @@ -42,11 +40,6 @@ public static ResultPopUp load(Stage primaryStage) { return resultPopUp; } - private void setWindowMinSize() { - dialogStage.setHeight(HEIGHT); - dialogStage.setWidth(WIDTH); - } - @Override public void setNode(Node node) { mainPane = (AnchorPane) node; @@ -61,16 +54,14 @@ private void configure(){ Scene scene = new Scene(mainPane); dialogStage = createDialogStage(null, null, scene); - dialogStage.setMaximized(false); - setWindowMinSize(); scene.setFill(Color.TRANSPARENT); dialogStage.initStyle(StageStyle.TRANSPARENT); } public void postMessage(String message) { - displayed.setValue(message); - resultTextArea.setText(message); + resultDisplay.setWrapText(true); + resultDisplay.setText(message); show(); PauseTransition delay = new PauseTransition(Duration.seconds(2)); @@ -86,6 +77,9 @@ public void reFocusRoot() { 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); } } From b4c3669ffccbf1bc961402bae82cc56ca2c8ad69 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Sun, 16 Oct 2016 15:34:43 +0800 Subject: [PATCH 51/67] Update relevant info in test --- src/test/java/guitests/guihandles/ResultDisplayHandle.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/test/java/guitests/guihandles/ResultDisplayHandle.java b/src/test/java/guitests/guihandles/ResultDisplayHandle.java index 2e298cc7f3ac..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; @@ -10,7 +11,7 @@ */ public class ResultDisplayHandle extends GuiHandle { - public static final String RESULT_DISPLAY_ID = "#resultTextArea"; + public static final String RESULT_DISPLAY_ID = "#resultDisplay"; public ResultDisplayHandle(GuiRobot guiRobot, Stage primaryStage) { super(guiRobot, primaryStage, TestApp.APP_TITLE); @@ -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); } } From 9bc47fce2241f3e3f56a2273b6a77d792c6c685c Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Mon, 17 Oct 2016 14:25:03 +0800 Subject: [PATCH 52/67] Add comment for commands --- src/main/java/seedu/agendum/logic/commands/AddCommand.java | 1 + src/main/java/seedu/agendum/logic/commands/ClearCommand.java | 3 ++- src/main/java/seedu/agendum/logic/commands/DeleteCommand.java | 1 + src/main/java/seedu/agendum/logic/commands/ExitCommand.java | 1 + src/main/java/seedu/agendum/logic/commands/FindCommand.java | 1 + src/main/java/seedu/agendum/logic/commands/HelpCommand.java | 1 + src/main/java/seedu/agendum/logic/commands/ListCommand.java | 1 + src/main/java/seedu/agendum/logic/commands/MarkCommand.java | 1 + src/main/java/seedu/agendum/logic/commands/RenameCommand.java | 1 + src/main/java/seedu/agendum/logic/commands/UnmarkCommand.java | 1 + 10 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/agendum/logic/commands/AddCommand.java b/src/main/java/seedu/agendum/logic/commands/AddCommand.java index d2359b70d359..9a2df0668b69 100644 --- a/src/main/java/seedu/agendum/logic/commands/AddCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/AddCommand.java @@ -13,6 +13,7 @@ */ public class AddCommand extends Command { + // COMMAND_WORD, COMMAND_FORMAT, COMMAND_DESCRIPTION are for display in help window public static final String COMMAND_WORD = "add"; public static String COMMAND_FORMAT = "add \nadd by \nadd from to "; public static String COMMAND_DESCRIPTION = "adds a task to Agendum"; diff --git a/src/main/java/seedu/agendum/logic/commands/ClearCommand.java b/src/main/java/seedu/agendum/logic/commands/ClearCommand.java index 4500efb4445c..50deb0931b13 100644 --- a/src/main/java/seedu/agendum/logic/commands/ClearCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/ClearCommand.java @@ -6,7 +6,8 @@ * 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"; diff --git a/src/main/java/seedu/agendum/logic/commands/DeleteCommand.java b/src/main/java/seedu/agendum/logic/commands/DeleteCommand.java index 2d129964230c..3b0c02c81f39 100644 --- a/src/main/java/seedu/agendum/logic/commands/DeleteCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/DeleteCommand.java @@ -10,6 +10,7 @@ */ 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"; diff --git a/src/main/java/seedu/agendum/logic/commands/ExitCommand.java b/src/main/java/seedu/agendum/logic/commands/ExitCommand.java index 4aa55e047c71..d03d37a6c1aa 100644 --- a/src/main/java/seedu/agendum/logic/commands/ExitCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/ExitCommand.java @@ -8,6 +8,7 @@ */ 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"; diff --git a/src/main/java/seedu/agendum/logic/commands/FindCommand.java b/src/main/java/seedu/agendum/logic/commands/FindCommand.java index ce3ee01cd3ff..396c89185aa2 100644 --- a/src/main/java/seedu/agendum/logic/commands/FindCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/FindCommand.java @@ -8,6 +8,7 @@ */ 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"; diff --git a/src/main/java/seedu/agendum/logic/commands/HelpCommand.java b/src/main/java/seedu/agendum/logic/commands/HelpCommand.java index 2b237e4fc18c..cedfece82750 100644 --- a/src/main/java/seedu/agendum/logic/commands/HelpCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/HelpCommand.java @@ -9,6 +9,7 @@ */ 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"; diff --git a/src/main/java/seedu/agendum/logic/commands/ListCommand.java b/src/main/java/seedu/agendum/logic/commands/ListCommand.java index f35b82d71f93..047e293a7499 100644 --- a/src/main/java/seedu/agendum/logic/commands/ListCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/ListCommand.java @@ -6,6 +6,7 @@ */ 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)"; diff --git a/src/main/java/seedu/agendum/logic/commands/MarkCommand.java b/src/main/java/seedu/agendum/logic/commands/MarkCommand.java index 33bbeca48cbd..092b5ae33330 100644 --- a/src/main/java/seedu/agendum/logic/commands/MarkCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/MarkCommand.java @@ -10,6 +10,7 @@ */ 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"; diff --git a/src/main/java/seedu/agendum/logic/commands/RenameCommand.java b/src/main/java/seedu/agendum/logic/commands/RenameCommand.java index 4adc6ea98917..a0a10320c657 100644 --- a/src/main/java/seedu/agendum/logic/commands/RenameCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/RenameCommand.java @@ -12,6 +12,7 @@ */ 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"; diff --git a/src/main/java/seedu/agendum/logic/commands/UnmarkCommand.java b/src/main/java/seedu/agendum/logic/commands/UnmarkCommand.java index 876a9f3b88dc..46e56f193186 100644 --- a/src/main/java/seedu/agendum/logic/commands/UnmarkCommand.java +++ b/src/main/java/seedu/agendum/logic/commands/UnmarkCommand.java @@ -10,6 +10,7 @@ */ 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"; From b031943fa9e6545a1de89f7b3d09af39bbb305c1 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Mon, 17 Oct 2016 14:25:27 +0800 Subject: [PATCH 53/67] Change name of other tasks to uncompleted tasks --- src/main/resources/view/MainWindow.fxml | 4 ++-- src/main/resources/view/OtherTasksPanel.fxml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/view/MainWindow.fxml b/src/main/resources/view/MainWindow.fxml index c8af33d6b936..8f6a51328446 100644 --- a/src/main/resources/view/MainWindow.fxml +++ b/src/main/resources/view/MainWindow.fxml @@ -46,7 +46,7 @@ - + @@ -54,7 +54,7 @@ - + diff --git a/src/main/resources/view/OtherTasksPanel.fxml b/src/main/resources/view/OtherTasksPanel.fxml index 2adceef05e29..8a9c328b666d 100644 --- a/src/main/resources/view/OtherTasksPanel.fxml +++ b/src/main/resources/view/OtherTasksPanel.fxml @@ -11,7 +11,7 @@ - + From 1bd22dc4ac422882dbe07dc3b66c2552e8fc052a Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Mon, 17 Oct 2016 14:25:38 +0800 Subject: [PATCH 54/67] Show overdue for overdue tasks --- src/main/java/seedu/agendum/ui/OtherTasksPanel.java | 4 ++-- src/main/java/seedu/agendum/ui/TaskCard.java | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/seedu/agendum/ui/OtherTasksPanel.java b/src/main/java/seedu/agendum/ui/OtherTasksPanel.java index bb3d8a4d3d69..fd65ade9d157 100644 --- a/src/main/java/seedu/agendum/ui/OtherTasksPanel.java +++ b/src/main/java/seedu/agendum/ui/OtherTasksPanel.java @@ -52,8 +52,8 @@ public static OtherTasksPanel load(Stage primaryStage, AnchorPane OtherTasksPlac return otherTasksPanel; } - private void configure(ObservableList otherTasks) { - setConnections(otherTasks); + private void configure(ObservableList taskList) { + setConnections(taskList.filtered(task -> !task.isCompleted())); addToPlaceholder(); } diff --git a/src/main/java/seedu/agendum/ui/TaskCard.java b/src/main/java/seedu/agendum/ui/TaskCard.java index b617e8c8cdf2..457a01b75a01 100644 --- a/src/main/java/seedu/agendum/ui/TaskCard.java +++ b/src/main/java/seedu/agendum/ui/TaskCard.java @@ -53,7 +53,11 @@ public void initialize() { } name.setText(task.getName().fullName); id.setText(displayedIndex); - time.setText(formatTime()); + if(task.isOverdue()) { + time.setText("Overdue"); + } else { + time.setText(formatTime()); + } tags.setText(task.tagsString()); } From fa9ff7348dfccb9fad17ad35db48786e8c06d476 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Mon, 17 Oct 2016 21:07:21 +0800 Subject: [PATCH 55/67] Update task card --- src/main/java/seedu/agendum/ui/TaskCard.java | 11 +++++++---- src/main/resources/view/TaskCard.fxml | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/seedu/agendum/ui/TaskCard.java b/src/main/java/seedu/agendum/ui/TaskCard.java index cf9029d0dfc9..a745f4a658fb 100644 --- a/src/main/java/seedu/agendum/ui/TaskCard.java +++ b/src/main/java/seedu/agendum/ui/TaskCard.java @@ -49,21 +49,24 @@ public static TaskCard load(ReadOnlyTask task){ @FXML public void initialize() { - if(task.isCompleted()) { - name.setUnderline(true); - } + if(task.isOverdue()) { name.setTextFill(Color.web("#ff0a0a")); + } else if(task.isUpcoming()) { + name.setTextFill(Color.web("#6407c6")); } else { name.setTextFill(Color.web("#555555")); } + name.setText(task.getName().fullName); id.setText(displayedIndex); + if(task.isOverdue()) { - time.setText("Overdue"); + time.setText("Overdue\nScheduled: "+ formatTime()); } else { time.setText(formatTime()); } + tags.setText(task.tagsString()); } diff --git a/src/main/resources/view/TaskCard.fxml b/src/main/resources/view/TaskCard.fxml index a7f1b82c5d9e..09690c6cca98 100644 --- a/src/main/resources/view/TaskCard.fxml +++ b/src/main/resources/view/TaskCard.fxml @@ -65,6 +65,6 @@ - + From e51b230e94d93fc086e206eb394aa9faed7e30e7 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Mon, 17 Oct 2016 21:11:25 +0800 Subject: [PATCH 56/67] Update anchorpane insets --- src/main/resources/view/CompletedTasksPanel.fxml | 2 +- src/main/resources/view/OtherTasksPanel.fxml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/view/CompletedTasksPanel.fxml b/src/main/resources/view/CompletedTasksPanel.fxml index 0f076ef72fa2..d9f7aea1fc2a 100644 --- a/src/main/resources/view/CompletedTasksPanel.fxml +++ b/src/main/resources/view/CompletedTasksPanel.fxml @@ -8,7 +8,7 @@ - + diff --git a/src/main/resources/view/OtherTasksPanel.fxml b/src/main/resources/view/OtherTasksPanel.fxml index 8a9c328b666d..99119b53a3ab 100644 --- a/src/main/resources/view/OtherTasksPanel.fxml +++ b/src/main/resources/view/OtherTasksPanel.fxml @@ -8,7 +8,7 @@ - + From e06953b01cb847b981cf266a03f3fa928296f107 Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Mon, 17 Oct 2016 23:21:16 -0700 Subject: [PATCH 57/67] merge fixes --- .../agendum/logic/commands/AddCommand.java | 25 +++++++++++++++++-- .../seedu/agendum/ui/CompletedTaskCard.java | 3 --- 2 files changed, 23 insertions(+), 5 deletions(-) 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/ui/CompletedTaskCard.java b/src/main/java/seedu/agendum/ui/CompletedTaskCard.java index c2e147d9b42d..5ccc55a7e2c4 100644 --- a/src/main/java/seedu/agendum/ui/CompletedTaskCard.java +++ b/src/main/java/seedu/agendum/ui/CompletedTaskCard.java @@ -16,8 +16,6 @@ public class CompletedTaskCard extends UiPart { private Label name; @FXML private Label id; - @FXML - private Label tags; private ReadOnlyTask task; private int displayedIndex; @@ -37,7 +35,6 @@ public static CompletedTaskCard load(ReadOnlyTask task, int displayedIndex){ public void initialize() { name.setText(task.getName().fullName); id.setText(displayedIndex + ". "); - tags.setText(task.tagsString()); } public HBox getLayout() { From d5b56b300b8a36d3457528f1c05cb3d938d529e2 Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Mon, 17 Oct 2016 23:58:36 -0700 Subject: [PATCH 58/67] Fix all failing UI tests by increasing add command wait time All test pass now! :) (Even though now it takes much longer to run a tests :( ) --- src/test/java/guitests/guihandles/CommandBoxHandle.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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() { From 8e851fe36d4e23a83b27880f76c84a00339f780d Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Tue, 18 Oct 2016 15:53:46 +0800 Subject: [PATCH 59/67] Remove tags in task card --- src/main/resources/view/TaskCard.fxml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/main/resources/view/TaskCard.fxml b/src/main/resources/view/TaskCard.fxml index 09690c6cca98..987a5e1a33ab 100644 --- a/src/main/resources/view/TaskCard.fxml +++ b/src/main/resources/view/TaskCard.fxml @@ -37,14 +37,6 @@ - From 90308a193a6599cf7a12f232a94b731732f2f3bf Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Tue, 18 Oct 2016 17:30:05 +0800 Subject: [PATCH 60/67] Add color for upcoming and overdue list cell --- src/main/java/seedu/agendum/ui/TaskCard.java | 8 +++++--- src/main/resources/view/TaskCard.fxml | 2 +- src/main/resources/view/TasksPanel.css | 11 +---------- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/main/java/seedu/agendum/ui/TaskCard.java b/src/main/java/seedu/agendum/ui/TaskCard.java index e360883be60f..228d6e793ce2 100644 --- a/src/main/java/seedu/agendum/ui/TaskCard.java +++ b/src/main/java/seedu/agendum/ui/TaskCard.java @@ -49,13 +49,15 @@ public static TaskCard load(ReadOnlyTask task){ public void initialize() { if(task.isOverdue()) { - name.setTextFill(Color.web("#ff0a0a")); + cardPane.setStyle("-fx-background-color: rgb(255, 169, 147)"); } else if(task.isUpcoming()) { - name.setTextFill(Color.web("#6407c6")); + cardPane.setStyle("-fx-background-color: rgb(255, 229, 86)"); } else { - name.setTextFill(Color.web("#555555")); + cardPane.setStyle("-fx-background-color: rgba(255,255,255,0.6)"); } + name.setTextFill(Color.web("#555555")); + name.setText(task.getName().fullName); id.setText(displayedIndex); diff --git a/src/main/resources/view/TaskCard.fxml b/src/main/resources/view/TaskCard.fxml index 987a5e1a33ab..56bcda0891ca 100644 --- a/src/main/resources/view/TaskCard.fxml +++ b/src/main/resources/view/TaskCard.fxml @@ -11,7 +11,7 @@ - + diff --git a/src/main/resources/view/TasksPanel.css b/src/main/resources/view/TasksPanel.css index 870ec340c605..f803fd6424cf 100644 --- a/src/main/resources/view/TasksPanel.css +++ b/src/main/resources/view/TasksPanel.css @@ -16,26 +16,17 @@ .list-view { -fx-background-color: transparent; -fx-background-radius: 10; - -fx-background-insets: 0; } .list-cell { -fx-background-radius: 10; - -fx-background-color: rgba(255,255,255,0.6); -} - -.list-cell:filled { - -fx-background-insets: 3; + -fx-background-color: transparent; } .list-cell:empty { -fx-background-color: transparent; } -.list-cell:filled:hover { - -fx-background-color: rgba(255,255,255,0.8); -} - .cell_big_label { -fx-font-size: 16pt; -fx-opacity: 0.9; From d2e1c53fcb61a4fa82ed00ec04cf5da13713601c Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Tue, 18 Oct 2016 17:30:18 +0800 Subject: [PATCH 61/67] Add time to status bar --- .../seedu/agendum/ui/StatusBarFooter.java | 50 ++++++++++++++++++- src/main/resources/view/DarkTheme.css | 7 ++- src/main/resources/view/StatusBarFooter.fxml | 17 +++++-- 3 files changed, 65 insertions(+), 9 deletions(-) diff --git a/src/main/java/seedu/agendum/ui/StatusBarFooter.java b/src/main/java/seedu/agendum/ui/StatusBarFooter.java index 4e8f5beccd44..6d993f899408 100644 --- a/src/main/java/seedu/agendum/ui/StatusBarFooter.java +++ b/src/main/java/seedu/agendum/ui/StatusBarFooter.java @@ -1,16 +1,31 @@ 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.ToDoListChangedEvent; import seedu.agendum.commons.util.FxViewUtil; +import java.text.SimpleDateFormat; +import java.util.Calendar; import java.util.Date; import java.util.logging.Logger; @@ -21,6 +36,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; @@ -29,6 +45,9 @@ public class StatusBarFooter extends UiPart { @FXML private AnchorPane syncStatusBarPane; + + @FXML + private AnchorPane timeStatusBarPane; private AnchorPane placeHolder; @@ -46,6 +65,7 @@ public void configure(String saveLocation) { setSyncStatus("Not updated yet in this session"); addSaveLocation(); setSaveLocation("./" + saveLocation); + addTimeStatus(); registerAsAnEventHandler(this); } @@ -73,7 +93,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; @@ -96,3 +123,24 @@ public void handleToDoListChangedEvent(ToDoListChangedEvent abce) { setSyncStatus("Last Updated: " + lastUpdated); } } + +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/resources/view/DarkTheme.css b/src/main/resources/view/DarkTheme.css index 7db0faf313a6..bb337f178052 100644 --- a/src/main/resources/view/DarkTheme.css +++ b/src/main/resources/view/DarkTheme.css @@ -40,7 +40,7 @@ .status-bar { -fx-background-color: derive(#1d1d1d, 20%); - -fx-text-fill: black; + -fx-text-fill: white; } .result-display { @@ -52,6 +52,7 @@ } .status-bar .label { + -fx-background-color: transparent; -fx-text-fill: white; } @@ -72,7 +73,7 @@ } .grid-pane .anchor-pane { - -fx-background-color: derive(#1d1d1d, 30%); + -fx-background-color: derive(#1d1d1d, 20%); } .context-menu { @@ -223,8 +224,6 @@ #cardPane { -fx-background-color: transparent; - -fx-border-color: #d6d6d6; - -fx-border-width: 0 0 0 0; } #commandTypeLabel { 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 @@ - - + + + + + + + - - + + + + + + From 66f2646a4a1354422bdd69c89c67c2f19ddcd3eb Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Tue, 18 Oct 2016 19:21:30 +0800 Subject: [PATCH 62/67] Add escape as shortcut key to close help window --- .../java/seedu/agendum/ui/HelpWindow.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/agendum/ui/HelpWindow.java b/src/main/java/seedu/agendum/ui/HelpWindow.java index 5a4b4f025c93..e26dea06ef80 100644 --- a/src/main/java/seedu/agendum/ui/HelpWindow.java +++ b/src/main/java/seedu/agendum/ui/HelpWindow.java @@ -3,6 +3,8 @@ 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; @@ -12,6 +14,10 @@ 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.paint.Color; import javafx.scene.text.Text; @@ -114,8 +120,21 @@ private void configure(){ 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(); + } + } + }); + } + private void loadHelpList() { commandList.add(new AddCommand()); commandList.add(new RenameCommand()); From d3443caa4c56157b88904b367124440e657853e0 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Tue, 18 Oct 2016 20:24:58 +0800 Subject: [PATCH 63/67] Update help window test and add test for closing help window --- .../java/seedu/agendum/ui/MainWindow.java | 2 +- src/test/java/guitests/HelpWindowTest.java | 12 ++++++++++++ .../guitests/guihandles/HelpWindowHandle.java | 2 ++ .../guitests/guihandles/MainGuiHandle.java | 13 +++++++++++++ .../guitests/guihandles/MainMenuHandle.java | 19 +++++++++++++++---- 5 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/main/java/seedu/agendum/ui/MainWindow.java b/src/main/java/seedu/agendum/ui/MainWindow.java index bad424f160ed..3edbb9df2ca6 100644 --- a/src/main/java/seedu/agendum/ui/MainWindow.java +++ b/src/main/java/seedu/agendum/ui/MainWindow.java @@ -110,7 +110,7 @@ private void configure(String appTitle, String toDoListName, Config config, User } private void setAccelerators() { - helpMenuItem.setAccelerator(new KeyCodeCombination(KeyCode.H, KeyCombination.ALT_DOWN)); + helpMenuItem.setAccelerator(KeyCombination.valueOf("F5")); } void fillInnerParts() { 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/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 c8c43b30b072..f21b94ecfc3a 100644 --- a/src/test/java/guitests/guihandles/MainMenuHandle.java +++ b/src/test/java/guitests/guihandles/MainMenuHandle.java @@ -23,17 +23,28 @@ public GuiHandle clickOn(String... menuText) { } public HelpWindowHandle openHelpWindowUsingMenu() { - clickOn("Help", "⌥H"); + clickOn("Help", "F5"); return new HelpWindowHandle(guiRobot, primaryStage); } public HelpWindowHandle openHelpWindowUsingAccelerator() { - useAccelerator(); + useAcceleratorToOpenHelpWindow(); return new HelpWindowHandle(guiRobot, primaryStage); } + + public MainGuiHandle closeHelpWindowUsingAccelerator() { + useAcceleratorToCloseHelpWindow(); + return new MainGuiHandle(guiRobot, primaryStage); + } - private void useAccelerator() { - guiRobot.push(new KeyCodeCombination(KeyCode.H, KeyCombination.ALT_DOWN)); + private void useAcceleratorToOpenHelpWindow() { + guiRobot.push(new KeyCodeCombination(KeyCode.F5)); + guiRobot.sleep(500); + } + + private void useAcceleratorToCloseHelpWindow() { + guiRobot.push(new KeyCodeCombination(KeyCode.ESCAPE)); guiRobot.sleep(500); } + } From 9607bdda6631ed5c12e3e207f8f75e8bd4f02e81 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Wed, 19 Oct 2016 11:42:21 +0800 Subject: [PATCH 64/67] Close popup window when main window is closed --- src/main/java/seedu/agendum/ui/MainWindow.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/seedu/agendum/ui/MainWindow.java b/src/main/java/seedu/agendum/ui/MainWindow.java index 3edbb9df2ca6..3e661029d3eb 100644 --- a/src/main/java/seedu/agendum/ui/MainWindow.java +++ b/src/main/java/seedu/agendum/ui/MainWindow.java @@ -1,5 +1,6 @@ package seedu.agendum.ui; +import javafx.application.Platform; import javafx.fxml.FXML; import javafx.scene.Node; import javafx.scene.Scene; @@ -104,7 +105,10 @@ 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(); } From b27df99cad91eff4ed89b3b5027d91ddc10a19f2 Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Wed, 19 Oct 2016 12:25:42 +0800 Subject: [PATCH 65/67] Fix merge issues --- .../agendum/logic/commands/StoreCommand.java | 18 ++++++++++++++++++ .../agendum/logic/commands/UndoCommand.java | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) 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 From 12ac24c5b2061db99540b84bc17bfebaf7738d2f Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Wed, 19 Oct 2016 14:19:34 +0800 Subject: [PATCH 66/67] Fix helpwindow issue --- .../java/seedu/agendum/ui/HelpWindow.java | 21 ++++-- .../java/seedu/agendum/ui/MainWindow.java | 64 ++++++++++++++++++- 2 files changed, 76 insertions(+), 9 deletions(-) diff --git a/src/main/java/seedu/agendum/ui/HelpWindow.java b/src/main/java/seedu/agendum/ui/HelpWindow.java index e26dea06ef80..4d6bd772c437 100644 --- a/src/main/java/seedu/agendum/ui/HelpWindow.java +++ b/src/main/java/seedu/agendum/ui/HelpWindow.java @@ -39,6 +39,10 @@ import java.util.logging.Logger; +import com.sun.javafx.stage.StageHelper; + +import guitests.guihandles.GuiHandle; + /** * Controller for a help page */ @@ -54,7 +58,7 @@ public class HelpWindow extends UiPart { private AnchorPane mainPane; - private Stage dialogStage; + private static Stage dialogStage; @FXML private TableView commandTable; @@ -90,10 +94,15 @@ private void initialize() { } 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; + } } @@ -149,6 +158,6 @@ private void loadHelpList() { } 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 3e661029d3eb..2ab21b79ca9c 100644 --- a/src/main/java/seedu/agendum/ui/MainWindow.java +++ b/src/main/java/seedu/agendum/ui/MainWindow.java @@ -1,6 +1,12 @@ 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; @@ -12,6 +18,7 @@ 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; @@ -31,6 +38,8 @@ public class MainWindow extends UiPart { public static final int MIN_WIDTH = 450; private Logic logic; + + private static StageFactory factory; // Independent Ui parts residing in this Ui container private AllTasksPanel allTasksPanel; @@ -84,6 +93,9 @@ public String getFxmlPath() { } public static MainWindow load(Stage primaryStage, Config config, UserPrefs prefs, Logic logic) { + + factory = StageFactory.INSTANCE ; + factory.registerStage(primaryStage); MainWindow mainWindow = UiPartLoader.loadUiPart(primaryStage, new MainWindow()); mainWindow.configure(config.getAppTitle(), config.getToDoListName(), config, prefs, logic); @@ -118,8 +130,6 @@ private void setAccelerators() { } void fillInnerParts() { - -// browserPanel = BrowserPanel.load(browserPlaceholder); allTasksPanel = AllTasksPanel.load(primaryStage, getAllTasksPlaceHolder(), logic.getFilteredTaskList()); completedTasksPanel = CompletedTasksPanel.load(primaryStage, getCompletedTasksPlaceHolder(), logic.getFilteredTaskList()); otherTasksPanel = OtherTasksPanel.load(primaryStage, getOtherTasksPlaceHolder(), logic.getFilteredTaskList()); @@ -181,10 +191,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() { @@ -206,4 +219,49 @@ public AllTasksPanel getAllTasksPanel() { public CompletedTasksPanel getCompletedTasksPanel() { return this.completedTasksPanel; } + + public enum StageFactory { + INSTANCE ; + + private final ObservableList openStages = FXCollections.observableArrayList(); + + public ObservableList getOpenStages() { + return openStages ; + } + + private final ObjectProperty currentStage = new SimpleObjectProperty<>(null); + + public final ObjectProperty currentStageProperty() { + return this.currentStage; + } + + public final javafx.stage.Stage getCurrentStage() { + return this.currentStageProperty().get(); + } + + public final void setCurrentStage(final javafx.stage.Stage currentStage) { + this.currentStageProperty().set(currentStage); + } + + public void registerStage(Stage stage) { + stage.addEventHandler(WindowEvent.WINDOW_SHOWN, e -> + openStages.add(stage)); + stage.addEventHandler(WindowEvent.WINDOW_HIDDEN, e -> + openStages.remove(stage)); + stage.focusedProperty().addListener((obs, wasFocused, isNowFocused) -> { + if (isNowFocused) { + currentStage.set(stage); + } else { + currentStage.set(null); + } + }); + } + + public Stage createStage() { + Stage stage = new Stage(); + registerStage(stage); + return stage ; + } + + } } From 257d5993105594a18579f39e646970676dc6fdb7 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Wed, 19 Oct 2016 14:21:58 +0800 Subject: [PATCH 67/67] Remove irrelevant code --- .../java/seedu/agendum/ui/MainWindow.java | 51 ------------------- 1 file changed, 51 deletions(-) diff --git a/src/main/java/seedu/agendum/ui/MainWindow.java b/src/main/java/seedu/agendum/ui/MainWindow.java index 2ab21b79ca9c..f96064c8dd4d 100644 --- a/src/main/java/seedu/agendum/ui/MainWindow.java +++ b/src/main/java/seedu/agendum/ui/MainWindow.java @@ -39,8 +39,6 @@ public class MainWindow extends UiPart { private Logic logic; - private static StageFactory factory; - // Independent Ui parts residing in this Ui container private AllTasksPanel allTasksPanel; private CompletedTasksPanel completedTasksPanel; @@ -93,10 +91,6 @@ public String getFxmlPath() { } public static MainWindow load(Stage primaryStage, Config config, UserPrefs prefs, Logic logic) { - - factory = StageFactory.INSTANCE ; - factory.registerStage(primaryStage); - MainWindow mainWindow = UiPartLoader.loadUiPart(primaryStage, new MainWindow()); mainWindow.configure(config.getAppTitle(), config.getToDoListName(), config, prefs, logic); return mainWindow; @@ -219,49 +213,4 @@ public AllTasksPanel getAllTasksPanel() { public CompletedTasksPanel getCompletedTasksPanel() { return this.completedTasksPanel; } - - public enum StageFactory { - INSTANCE ; - - private final ObservableList openStages = FXCollections.observableArrayList(); - - public ObservableList getOpenStages() { - return openStages ; - } - - private final ObjectProperty currentStage = new SimpleObjectProperty<>(null); - - public final ObjectProperty currentStageProperty() { - return this.currentStage; - } - - public final javafx.stage.Stage getCurrentStage() { - return this.currentStageProperty().get(); - } - - public final void setCurrentStage(final javafx.stage.Stage currentStage) { - this.currentStageProperty().set(currentStage); - } - - public void registerStage(Stage stage) { - stage.addEventHandler(WindowEvent.WINDOW_SHOWN, e -> - openStages.add(stage)); - stage.addEventHandler(WindowEvent.WINDOW_HIDDEN, e -> - openStages.remove(stage)); - stage.focusedProperty().addListener((obs, wasFocused, isNowFocused) -> { - if (isNowFocused) { - currentStage.set(stage); - } else { - currentStage.set(null); - } - }); - } - - public Stage createStage() { - Stage stage = new Stage(); - registerStage(stage); - return stage ; - } - - } }