forked from nus-cs2103-AY1920S1/addressbook-level3
/
TimelineView.java
218 lines (191 loc) · 6.64 KB
/
TimelineView.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
package seedu.address.ui.panel.calendar;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javafx.concurrent.Task;
import javafx.concurrent.WorkerStateEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.geometry.VPos;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Region;
import javafx.scene.layout.RowConstraints;
import seedu.address.model.events.EventSource;
import seedu.address.model.tasks.TaskSource;
import seedu.address.ui.MainWindow;
import seedu.address.ui.UiPart;
import seedu.address.ui.card.CardHolder;
import seedu.address.ui.card.EventCard;
//@@author Kyzure
/**
* Represents an abstract class for the different timelines placed in the CalendarPanel.
* Currently there are 3 types of timeline - day, week and month.
*
* @see TimelineDayView
* @see TimelineWeekView
* @see TimelineMonthView
*/
public abstract class TimelineView extends UiPart<Region> {
private static final Integer SPACING = 62;
private ArrayList<CardHolder> cardHolders;
private Integer totalRows;
@FXML
private Label timelineTitle;
@FXML
private GridPane timelineGrid;
TimelineView(String fxml) {
super(fxml);
}
/**
* Initializes the timeline by adding cardholders to hold the EventCards.
*
* @see CardHolder ;
*/
void addEventCardHolders() {
this.cardHolders = new ArrayList<>();
for (int row = 0; row < totalRows; row++) {
CardHolder eventCardHolder = new CardHolder();
cardHolders.add(eventCardHolder);
timelineGrid.add(eventCardHolder.getRoot(), 1, row);
}
}
/**
* Re-sizes the timeline view panel by setting all the RowConstraints sizes to be the same
* height as the it's EventCardHolders, with an additional spacing.
*
* @see RowConstraints
*/
void resizeTimelineView() {
for (int row = 0; row < totalRows; row++) {
CardHolder eventCardHolder = cardHolders.get(row);
RowConstraints rowConstraints = timelineGrid.getRowConstraints().get(row);
rowConstraints.setPrefHeight(eventCardHolder.getHeight() + SPACING);
}
}
/**
* Updates the current row's constraints height after a certain delay so to obtain the
* updated height of the EventCardHolder.
*
* @param rowConstraints The current row constraints.
* @param eventCardHolder The current EventCardHolder to obtain the height.
*/
void updateSizeDelay(RowConstraints rowConstraints, CardHolder eventCardHolder) {
Task<Void> sleeper = new Task<Void>() {
@Override
protected Void call() throws Exception {
try {
Thread.sleep(MainWindow.TIMING);
} catch (InterruptedException e) {
throw new Exception(e.getMessage());
}
return null;
}
};
sleeper.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent event) {
rowConstraints.setPrefHeight(eventCardHolder.getHeight() + SPACING);
}
});
new Thread(sleeper).start();
}
/**
* Adds an array of labels into the Grid Pane.
*
* @param labels The labels to be added into the Grid Pane.
*/
void addLabels(String ...labels) {
int row = 0;
for (String label : labels) {
TimelineLabel timelineLabel = new TimelineLabel(label);
timelineGrid.add(timelineLabel.getRoot(), 0, row);
row++;
}
}
/**
* Adds a set of RowConstraints into the Grid Pane.
*
* @see RowConstraints
*/
void addGrids() {
for (int row = 0; row < totalRows; row++) {
RowConstraints rowConstraints = new RowConstraints();
rowConstraints.setValignment(VPos.TOP);
rowConstraints.setPrefHeight(100);
rowConstraints.setMinHeight(100);
timelineGrid.getRowConstraints().add(rowConstraints);
}
}
/**
* Changes the timeline by resetting it with the new list of events.
*
* @param eventTaskList The given event list containing all the events and tasks.
*/
void onChange(List<Object> eventTaskList,
HashMap<EventSource, Integer> eventHash,
HashMap<TaskSource, Integer> taskHash) {
resetTimeline();
for (Object source : eventTaskList) {
if (source instanceof EventSource) {
EventSource event = (EventSource) source;
if (isWithinTimeline(event)) {
addEventCard(event, eventHash.get(event));
}
} else if (source instanceof TaskSource) {
TaskSource task = (TaskSource) source;
if (task.getDueDate() == null) {
break;
}
if (isWithinTimeline(task)) {
addTaskCard(task, taskHash.get(task));
}
}
}
}
/**
* Resets the timeline by removing all of the EventCardHolders' EventCard.
*/
private void resetTimeline() {
for (int row = 0; row < totalRows; row++) {
// Reset RowConstraints
RowConstraints rowConstraints = timelineGrid.getRowConstraints().get(row);
rowConstraints.setPrefHeight(0);
// Reset EventCards for each hour
cardHolders.get(row).removeCards();
}
}
/**
* Creates an EventCard and adds it to the current timeline.
*
* @param event The given event.
* @see EventCard
*/
abstract void addEventCard(EventSource event, Integer eventIndex);
abstract void addTaskCard(TaskSource task, Integer taskIndex);
/**
* Returns a boolean that checks if the given date of the event is within the particular timeline.
*
* @param event The given event.
* @return a boolean that checks if the given date of the event is within the particular timeline.
*/
abstract boolean isWithinTimeline(EventSource event);
abstract boolean isWithinTimeline(TaskSource task);
// Getters
ArrayList<CardHolder> getCardHolder() {
return this.cardHolders;
}
GridPane getTimelineGrid() {
return this.timelineGrid;
}
Integer getTotalRows() {
return this.totalRows;
}
// Setters
void setTotalRows(int totalRows) {
this.totalRows = totalRows;
}
void setTimelineTitle(String timelineTitle) {
this.timelineTitle.setText(timelineTitle);
}
}