Skip to content

Commit

Permalink
Implemented infinite scrolling for ResourcesView.
Browse files Browse the repository at this point in the history
  • Loading branch information
dlemmermann committed Oct 6, 2022
1 parent 9172778 commit 1ee0953
Show file tree
Hide file tree
Showing 6 changed files with 221 additions and 111 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,9 @@ public Type fromString(String string) {
gridTypeBox.getItems().setAll(GridType.values());
gridTypeBox.valueProperty().bindBidirectional(resourcesView.gridTypeProperty());

CheckBox infiniteScrolling = new CheckBox("Infinite scrolling");
infiniteScrolling.selectedProperty().bindBidirectional(resourcesView.scrollingEnabledProperty());

CheckBox adjustBox = new CheckBox("Adjust first day of week");
adjustBox.selectedProperty().bindBidirectional(resourcesView.adjustToFirstDayOfWeekProperty());

Expand All @@ -148,13 +151,14 @@ public Type fromString(String string) {
slider.setMax(1);
slider.valueProperty().bindBidirectional(resourcesView.entryViewAvailabilityEditingOpacityProperty());

return new VBox(10, availabilityButton, new Label("View type"), typeBox, datePicker, adjustBox, new Label("Number of resources"), numberOfResourcesBox, new Label("Number of days"), daysBox, new Label("Clicks to create"), clicksBox,
return new VBox(10, availabilityButton, new Label("View type"), typeBox, datePicker, infiniteScrolling, adjustBox, new Label("Number of resources"), numberOfResourcesBox, new Label("Number of days"), daysBox, new Label("Clicks to create"), clicksBox,
new Label("Availability Behaviour"), behaviourBox, new Label("Availability Opacity"), slider, new Label("Grid Type"), gridTypeBox, scrollbarBox, timescaleBox, allDayBox, detailsBox, flipBox);
}

@Override
protected DateControl createControl() {
resourcesView = new ResourcesView();
resourcesView.setScrollingEnabled(true);
resourcesView.setType(Type.DATES_OVER_RESOURCES);
resourcesView.setNumberOfDays(5);
resourcesView.setCreateEntryClickCount(1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ public DayViewBaseSkin(T view) {
registerLayoutListener(view.showTodayProperty());
registerLayoutListener(view.zoneIdProperty());
registerLayoutListener(view.editAvailabilityProperty());
registerLayoutListener(view.scrollingEnabledProperty());
registerLayoutListener(view.gridTypeProperty());

view.setOnScroll(evt -> {
final double oldLocation = evt.getY();
Expand Down
171 changes: 97 additions & 74 deletions CalendarFXView/src/main/java/impl/com/calendarfx/view/DayViewSkin.java
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ public DayViewSkin(T view) {
currentTimeLine.visibleProperty().bind(view.enableCurrentTimeMarkerProperty().and(view.editAvailabilityProperty().not()));
getChildren().add(currentTimeLine);

view.scrollTimeProperty().addListener(drawBackgroundCanvasListener);
view.lassoStartProperty().addListener(drawBackgroundCanvasListener);
view.lassoEndProperty().addListener(drawBackgroundCanvasListener);
view.editAvailabilityProperty().addListener(drawBackgroundCanvasListener);
Expand Down Expand Up @@ -263,6 +264,8 @@ private void listenToAvailabilityCalendar(Calendar oldCalendar, Calendar newCale
}

private void createStaticLines() {
lines.clear();

for (int i = 1; i < 24; i++) {
createLine(HALF_HOUR_LINE_STYLE_CLASS);
createLine(FULL_HOUR_LINE_STYLE_CLASS);
Expand Down Expand Up @@ -448,63 +451,65 @@ protected void layoutChildren(double contentX, double contentY, double contentWi

protected void layoutChildrenInfiniteScrolling(double contentX, double contentY, double contentWidth, double contentHeight) {
final T view = getSkinnable();
final ZonedDateTime scrollTime = view.getScrollTime();
Instant time = scrollTime.toInstant().truncatedTo(ChronoUnit.HOURS);
if (view.getGridType().equals(GridType.STANDARD)) {
final ZonedDateTime scrollTime = view.getScrollTime();
Instant time = scrollTime.toInstant().truncatedTo(ChronoUnit.HOURS);

double y = view.getLocation(time);
double y = view.getLocation(time);

int lineIndex = 0;
int lineIndex = 0;

do {
do {

LocalTime localTime = LocalTime.ofInstant(time, view.getZoneId());
LocalTime localTime = LocalTime.ofInstant(time, view.getZoneId());

if (lineIndex >= lines.size()) {
createLine();
Line line = lines.get(lineIndex);
line.toBack();
}

if (lineIndex >= lines.size()) {
createLine();
Line line = lines.get(lineIndex);
line.toBack();
}

Line line = lines.get(lineIndex);
line.toBack();
line.setVisible(true);
line.setVisible(true);

line.getStyleClass().removeAll(HALF_HOUR_LINE_STYLE_CLASS, FULL_HOUR_LINE_STYLE_CLASS, MIDNIGHT_LINE_STYLE_CLASS, NOON_LINE_STYLE_CLASS);
line.getStyleClass().removeAll(HALF_HOUR_LINE_STYLE_CLASS, FULL_HOUR_LINE_STYLE_CLASS, MIDNIGHT_LINE_STYLE_CLASS, NOON_LINE_STYLE_CLASS);

if (localTime.getMinute() == 30) {
line.getStyleClass().add(HALF_HOUR_LINE_STYLE_CLASS);
} else {
line.getStyleClass().add(FULL_HOUR_LINE_STYLE_CLASS);
}
if (localTime.getMinute() == 30) {
line.getStyleClass().add(HALF_HOUR_LINE_STYLE_CLASS);
} else {
line.getStyleClass().add(FULL_HOUR_LINE_STYLE_CLASS);
}

if (localTime.equals(LocalTime.MIDNIGHT)) {
line.getStyleClass().add(MIDNIGHT_LINE_STYLE_CLASS);
line.setStartX(snapPositionX(contentX));
line.setEndX(snapPositionX(contentX + contentWidth));
} else if (localTime.equals(LocalTime.NOON)) {
line.setStartX(snapPositionX(contentX));
line.setEndX(snapPositionX(contentX + contentWidth));
if (view.isShowNoonMarker()) {
line.getStyleClass().add(NOON_LINE_STYLE_CLASS);
if (localTime.equals(LocalTime.MIDNIGHT)) {
line.getStyleClass().add(MIDNIGHT_LINE_STYLE_CLASS);
line.setStartX(snapPositionX(contentX));
line.setEndX(snapPositionX(contentX + contentWidth));
} else if (localTime.equals(LocalTime.NOON)) {
line.setStartX(snapPositionX(contentX));
line.setEndX(snapPositionX(contentX + contentWidth));
if (view.isShowNoonMarker()) {
line.getStyleClass().add(NOON_LINE_STYLE_CLASS);
}
} else {
line.setStartX(snapPositionX(contentX + 4));
line.setEndX(snapPositionX(contentX + contentWidth - 4));
}
} else {
line.setStartX(snapPositionX(contentX + 4));
line.setEndX(snapPositionX(contentX + contentWidth - 4));
}

line.setStartY(snapPositionY(y));
line.setEndY(snapPositionY(y));
line.setStartY(snapPositionY(y));
line.setEndY(snapPositionY(y));

lineIndex++;
lineIndex++;

time = time.plus(30, ChronoUnit.MINUTES);
y = view.getLocation(time);
time = time.plus(30, ChronoUnit.MINUTES);
y = view.getLocation(time);

} while (y < contentY + contentHeight);
} while (y < contentY + contentHeight);

for (int i = lineIndex; i < lines.size(); i++) {
Line line = lines.get(i);
line.setVisible(false);
for (int i = lineIndex; i < lines.size(); i++) {
Line line = lines.get(i);
line.setVisible(false);
}
}

layoutEntries(contentX, contentY, contentWidth, contentHeight);
Expand Down Expand Up @@ -1120,67 +1125,85 @@ public void draw() {
GraphicsContext gc = backgroundCanvas.getGraphicsContext2D();
gc.clearRect(0, 0, getWidth(), getHeight());

T dayView = getSkinnable();
Calendar availabilityCalendar = dayView.getAvailabilityCalendar();
T view = getSkinnable();
Calendar availabilityCalendar = view.getAvailabilityCalendar();

if (availabilityCalendar != null) {
gc.setFill(dayView.getAvailabilityFill());
LocalDate date = dayView.getDate();
Map<LocalDate, List<Entry<?>>> entries = availabilityCalendar.findEntries(date, date, dayView.getZoneId());
gc.setFill(view.getAvailabilityFill());
LocalDate date = view.getDate();
Map<LocalDate, List<Entry<?>>> entries = availabilityCalendar.findEntries(date, date, view.getZoneId());
List<Entry<?>> entriesOnDate = entries.get(date);
if (entriesOnDate != null) {
entriesOnDate.forEach(entry -> {
ZonedDateTime startAsZonedDateTime = entry.getStartAsZonedDateTime();
ZonedDateTime endAsZonedDateTime = entry.getEndAsZonedDateTime();
double y1 = ViewHelper.getTimeLocation(dayView, startAsZonedDateTime);
double y2 = ViewHelper.getTimeLocation(dayView, endAsZonedDateTime);
double y1 = ViewHelper.getTimeLocation(view, startAsZonedDateTime);
double y2 = ViewHelper.getTimeLocation(view, endAsZonedDateTime);
gc.fillRect(0, y1, getWidth(), y2 - y1);
});
}
}

if (dayView.isEditAvailability()) {
Instant start = dayView.getLassoStart();
Instant end = dayView.getLassoEnd();
if (view.isEditAvailability()) {
Instant start = view.getLassoStart();
Instant end = view.getLassoEnd();

if (start != null && end != null) {
double y1 = ViewHelper.getTimeLocation(dayView, start);
double y2 = ViewHelper.getTimeLocation(dayView, end);
double y1 = ViewHelper.getTimeLocation(view, start);
double y2 = ViewHelper.getTimeLocation(view, end);

double minY = Math.min(y1, y2);
double maxY = Math.max(y1, y2);

gc.setFill(dayView.getLassoColor());
gc.setFill(view.getLassoColor());
gc.fillRect(0, minY, getWidth(), maxY - minY);
}
}

if (dayView.getGridType().equals(GridType.CUSTOM)) {
gc.setStroke(dayView.getGridLineColor());
VirtualGrid virtualGrid = view.getGridLines();

ZonedDateTime startTime = dayView.getZonedDateTimeMin();
ZonedDateTime endTime = dayView.getZonedDateTimeMax();
if (view.getGridType().equals(GridType.CUSTOM)) {
gc.setStroke(view.getGridLineColor());

if (dayView.getEarlyLateHoursStrategy().equals(EarlyLateHoursStrategy.HIDE)) {
startTime = dayView.getZonedDateTimeStart();
endTime = dayView.getZonedDateTimeEnd();
}
if (view.isScrollingEnabled()) {
ZonedDateTime time = view.getScrollTime();
time = virtualGrid.adjustTime(time, false, view.getFirstDayOfWeek());

VirtualGrid virtualGrid = dayView.getGridLines();
double y = view.getLocation(time);

do {
double y = ViewHelper.getTimeLocation(dayView, startTime);
if (startTime.toLocalTime().getMinute() == 0) {
gc.setLineDashes(null);
} else {
gc.setLineDashes(2, 2);
do {
if (time.toLocalTime().getMinute() == 0) {
gc.setLineDashes(null);
} else {
gc.setLineDashes(2, 2);
}
gc.strokeLine(0, y, getWidth(), y);
time = time.plus(virtualGrid.getAmount(), virtualGrid.getUnit());
y = view.getLocation(time);
} while (y < getHeight());

gc.setLineDashes(null);
} else {
ZonedDateTime startTime = view.getZonedDateTimeMin();
ZonedDateTime endTime = view.getZonedDateTimeMax();

if (view.getEarlyLateHoursStrategy().equals(EarlyLateHoursStrategy.HIDE)) {
startTime = view.getZonedDateTimeStart();
endTime = view.getZonedDateTimeEnd();
}
gc.strokeLine(0, y, getWidth(), y);
startTime = startTime.plus(virtualGrid.getAmount(), virtualGrid.getUnit());
} while (startTime.isBefore(endTime));
}

gc.setLineDashes(null);
do {
double y = ViewHelper.getTimeLocation(view, startTime);
if (startTime.toLocalTime().getMinute() == 0) {
gc.setLineDashes(null);
} else {
gc.setLineDashes(2, 2);
}
gc.strokeLine(0, y, getWidth(), y);
startTime = startTime.plus(virtualGrid.getAmount(), virtualGrid.getUnit());
} while (startTime.isBefore(endTime));
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ private void updateViewDatesOverResources() {
dayView.setDefaultCalendarProvider(control -> calendarSource.getCalendars().get(0));

dayView.setPrefWidth(0); // so they all end up with the same percentage width
dayView.setMinHeight(0);
HBox.setHgrow(dayView, Priority.ALWAYS);
resourcesBox.getChildren().add(dayView);

Expand Down
Loading

0 comments on commit 1ee0953

Please sign in to comment.