Skip to content

Commit

Permalink
Added grid lines to background canvas.
Browse files Browse the repository at this point in the history
  • Loading branch information
dlemmermann committed Sep 16, 2022
1 parent af9f9eb commit 3b7cd4a
Show file tree
Hide file tree
Showing 4 changed files with 183 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2255,8 +2255,7 @@ public final void clearSelection() {
getSelections().clear();
}

private final ObjectProperty<VirtualGrid> virtualGrid = new SimpleObjectProperty<>(this, "virtualGrid",
new VirtualGrid(Messages.getString("DateControl.DEFAULT_VIRTUAL_GRID_NAME"), Messages.getString("DateControl.DEFAULT_VIRTUAL_GRID_SHORT_NAME"), ChronoUnit.MINUTES, 15));
private final ObjectProperty<VirtualGrid> virtualGrid = new SimpleObjectProperty<>(this, "virtualGrid", new VirtualGrid(Messages.getString("DateControl.DEFAULT_VIRTUAL_GRID_NAME"), Messages.getString("DateControl.DEFAULT_VIRTUAL_GRID_SHORT_NAME"), ChronoUnit.MINUTES, 15));

/**
* A virtual grid used for snapping to invisible grid lines while editing
Expand Down
131 changes: 130 additions & 1 deletion CalendarFXView/src/main/java/com/calendarfx/view/DayViewBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,45 @@ public DayViewBase() {
setMinWidth(0); // important, so that multi day views apply same width for all day views
}

private final ObjectProperty<VirtualGrid> gridLines = new SimpleObjectProperty<>(this, "virtualGrid", new VirtualGrid("Grid Lines", "Grid", ChronoUnit.MINUTES, 30));

public final VirtualGrid getGridLines() {
return gridLines.get();
}

/**
* A virtual grid used to control the placement of lightweight grid lines in the background
* of the view. These grid lines are drawn via the canvas API.
*
* @return the grid lines virtual grid object
*/
public final ObjectProperty<VirtualGrid> gridLinesProperty() {
return gridLines;
}

public final void setGridLines(VirtualGrid gridLines) {
this.gridLines.set(gridLines);
}

private final ObjectProperty<Paint> gridLineColor = new SimpleObjectProperty<>(this, "gridLineColor", Color.LIGHTGRAY);

public final Paint getGridLineColor() {
return gridLineColor.get();
}

/**
* A color used to draw the lightweight grid lines in a background canvas.
*
* @return the grid line color
*/
public final ObjectProperty<Paint> gridLineColorProperty() {
return gridLineColor;
}

public final void setGridLineColor(Paint gridLineColor) {
this.gridLineColor.set(gridLineColor);
}

/**
* A list of possible ways that entries can behave when the user switches
* to availability editing. The values determine if the entries should
Expand Down Expand Up @@ -1014,6 +1053,8 @@ public final void bind(DayViewBase otherControl, boolean bindDate) {
Bindings.bindBidirectional(otherControl.endTimeProperty(), endTimeProperty());
Bindings.bindBidirectional(otherControl.entryViewAvailabilityEditingBehaviourProperty(), entryViewAvailabilityEditingBehaviourProperty());
Bindings.bindBidirectional(otherControl.entryViewAvailabilityEditingOpacityProperty(), entryViewAvailabilityEditingOpacityProperty());
Bindings.bindBidirectional(otherControl.gridLinesProperty(), gridLinesProperty());
Bindings.bindBidirectional(otherControl.gridLineColorProperty(), gridLineColorProperty());
}

public final void unbind(DayViewBase otherControl) {
Expand All @@ -1037,6 +1078,8 @@ public final void unbind(DayViewBase otherControl) {
Bindings.unbindBidirectional(otherControl.endTimeProperty(), endTimeProperty());
Bindings.unbindBidirectional(otherControl.entryViewAvailabilityEditingBehaviourProperty(), entryViewAvailabilityEditingBehaviourProperty());
Bindings.unbindBidirectional(otherControl.entryViewAvailabilityEditingOpacityProperty(), entryViewAvailabilityEditingOpacityProperty());
Bindings.unbindBidirectional(otherControl.gridLinesProperty(), gridLinesProperty());
Bindings.unbindBidirectional(otherControl.gridLineColorProperty(), gridLineColorProperty());
}

private static final String DAY_VIEW_BASE_CATEGORY = "Date View Base";
Expand Down Expand Up @@ -1557,7 +1600,93 @@ public boolean isEditable() {
}
});

items.add(new Item() {
items.add(new Item() {

@Override
public Optional<ObservableValue<?>> getObservableValue() {
return Optional.of(gridLinesProperty());
}

@Override
public void setValue(Object value) {
setGridLines((VirtualGrid) value);
}

@Override
public Object getValue() {
return getGridLines();
}

@Override
public Class<?> getType() {
return VirtualGrid.class;
}

@Override
public String getName() {
return "Grid used for drawing grid lines";
}

@Override
public String getDescription() {
return "Specifies the grid size.";
}

@Override
public String getCategory() {
return DAY_VIEW_BASE_CATEGORY;
}

@Override
public boolean isEditable() {
return true;
}
});

items.add(new Item() {

@Override
public Optional<ObservableValue<?>> getObservableValue() {
return Optional.of(gridLineColorProperty());
}

@Override
public void setValue(Object value) {
setGridLineColor((Paint) value);
}

@Override
public Object getValue() {
return getGridLineColor();
}

@Override
public Class<?> getType() {
return Paint.class;
}

@Override
public String getName() {
return "Color used for drawing grid lines";
}

@Override
public String getDescription() {
return "Specifies the grid line color.";
}

@Override
public String getCategory() {
return DAY_VIEW_BASE_CATEGORY;
}

@Override
public boolean isEditable() {
return true;
}
});

items.add(new Item() {

@Override
public Optional<ObservableValue<?>> getObservableValue() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import com.calendarfx.view.DayViewBase;
import com.calendarfx.view.RequestEvent;
import com.calendarfx.view.TimeScaleView;
import com.calendarfx.view.VirtualGrid;
import com.calendarfx.view.WeekDayHeaderView;
import com.calendarfx.view.WeekView;
import impl.com.calendarfx.view.resources.ResourcesViewSkin;
Expand All @@ -42,6 +43,7 @@
import javafx.scene.layout.Region;
import javafx.util.Callback;

import java.time.temporal.ChronoUnit;
import java.util.function.Consumer;

import static com.calendarfx.view.RequestEvent.REQUEST_ENTRY;
Expand Down Expand Up @@ -71,6 +73,9 @@ public ResourcesView() {

// calling "editEntry" with "false" flag because we do not want to change the start date of the view
addEventHandler(REQUEST_ENTRY, evt -> maybeRunAndConsume(evt, e -> editEntry(evt.getEntry(), false)));

setVirtualGrid(new VirtualGrid("Editing Grid", "Editing Grid", ChronoUnit.MINUTES, 20));
setGridLines(new VirtualGrid("Visible Grid", "Visible Grid", ChronoUnit.MINUTES, 20));
}

private void maybeRunAndConsume(RequestEvent evt, Consumer<RequestEvent> consumer) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import com.calendarfx.view.EntryViewBase.AlignmentStrategy;
import com.calendarfx.view.EntryViewBase.HeightLayoutStrategy;
import com.calendarfx.view.EntryViewBase.Position;
import com.calendarfx.view.VirtualGrid;
import impl.com.calendarfx.view.util.Placement;
import impl.com.calendarfx.view.util.TimeBoundsResolver;
import impl.com.calendarfx.view.util.VisualBoundsResolver;
Expand Down Expand Up @@ -98,7 +99,7 @@ public class DayViewSkin<T extends DayView> extends DayViewBaseSkin<T> implement

private double startY;

private final AvailabilityCanvas availabilityCanvas = new AvailabilityCanvas();
private final BackgroundCanvas backgroundCanvas = new BackgroundCanvas();

public DayViewSkin(T view) {
super(view);
Expand All @@ -115,10 +116,10 @@ public DayViewSkin(T view) {
lateHoursRegion.setManaged(false);
getChildren().add(lateHoursRegion);

InvalidationListener drawAvailabilityCanvasListener = it -> availabilityCanvas.draw();
view.editAvailabilityProperty().addListener(drawAvailabilityCanvasListener);
InvalidationListener drawBackgroundCanvasListener = it -> backgroundCanvas.draw();
view.editAvailabilityProperty().addListener(drawBackgroundCanvasListener);

getChildren().add(availabilityCanvas);
getChildren().add(backgroundCanvas);

if (!view.isScrollingEnabled()) {
// Static lines use different styling for early / late hours, we do not want that
Expand All @@ -142,9 +143,9 @@ public DayViewSkin(T view) {
currentTimeLine.visibleProperty().bind(view.enableCurrentTimeMarkerProperty().and(view.editAvailabilityProperty().not()));
getChildren().add(currentTimeLine);

view.lassoStartProperty().addListener(drawAvailabilityCanvasListener);
view.lassoEndProperty().addListener(drawAvailabilityCanvasListener);
view.editAvailabilityProperty().addListener(drawAvailabilityCanvasListener);
view.lassoStartProperty().addListener(drawBackgroundCanvasListener);
view.lassoEndProperty().addListener(drawBackgroundCanvasListener);
view.editAvailabilityProperty().addListener(drawBackgroundCanvasListener);

view.availabilityCalendarProperty().addListener((obs, oldCalendar, newCalendar) -> listenToAvailabilityCalendar(oldCalendar, newCalendar));
listenToAvailabilityCalendar(null, view.getAvailabilityCalendar());
Expand Down Expand Up @@ -225,9 +226,13 @@ public DayViewSkin(T view) {
startY = evt.getScreenY();
}
});

view.gridLinesProperty().addListener(drawBackgroundCanvasListener);
view.gridLineColorProperty().addListener(drawBackgroundCanvasListener);

}

private final EventHandler<CalendarEvent> availabilityHandler = evt -> availabilityCanvas.draw();
private final EventHandler<CalendarEvent> availabilityHandler = evt -> backgroundCanvas.draw();

private final WeakEventHandler<CalendarEvent> weakAvailabilityHandler = new WeakEventHandler<>(availabilityHandler);

Expand Down Expand Up @@ -337,7 +342,7 @@ private void createLine(String styleClass) {
line.getStyleClass().add(styleClass);
}
lines.add(line);
getChildren().add(line);
//getChildren().add(line);
}

private void updateLineStyling() {
Expand Down Expand Up @@ -406,11 +411,11 @@ private void updateLineStyling() {
protected void layoutChildren(double contentX, double contentY, double contentWidth, double contentHeight) {
super.layoutChildren(contentX, contentY, contentWidth, contentHeight);

availabilityCanvas.relocate(contentX + 2, contentY);
availabilityCanvas.setWidth(contentWidth - 4);
availabilityCanvas.setHeight(contentHeight);
backgroundCanvas.relocate(contentX, contentY);
backgroundCanvas.setWidth(contentWidth);
backgroundCanvas.setHeight(contentHeight);

availabilityCanvas.draw();
backgroundCanvas.draw();

if (getSkinnable().isScrollingEnabled()) {
layoutChildrenInfiniteScrolling(contentX, contentY, contentWidth, contentHeight);
Expand Down Expand Up @@ -1038,9 +1043,9 @@ public boolean isCalendarVisible(Calendar calendar) {
return getSkinnable().isCalendarVisible(calendar);
}

private class AvailabilityCanvas extends Canvas {
private class BackgroundCanvas extends Canvas {

public AvailabilityCanvas() {
BackgroundCanvas() {
setMouseTransparent(true);
heightProperty().addListener(it -> draw());
widthProperty().addListener(it -> draw());
Expand All @@ -1051,7 +1056,7 @@ public boolean isResizable() {
}

public void draw() {
GraphicsContext gc = availabilityCanvas.getGraphicsContext2D();
GraphicsContext gc = backgroundCanvas.getGraphicsContext2D();
gc.clearRect(0, 0, getWidth(), getHeight());

T dayView = getSkinnable();
Expand Down Expand Up @@ -1088,6 +1093,32 @@ public void draw() {
gc.fillRect(0, minY, getWidth(), maxY - minY);
}
}

gc.setStroke(dayView.getGridLineColor());

ZonedDateTime startTime = dayView.getZonedDateTimeMin();
ZonedDateTime endTime = dayView.getZonedDateTimeMax();

if (dayView.getEarlyLateHoursStrategy().equals(EarlyLateHoursStrategy.HIDE)) {
startTime = dayView.getZonedDateTimeStart();
endTime = dayView.getZonedDateTimeEnd();
}

VirtualGrid virtualGrid = dayView.getGridLines();

do {
double y = ViewHelper.getTimeLocation(dayView, 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));

gc.setLineDashes(null);
gc.strokeLine(getWidth() - gc.getLineWidth(), 0, getWidth() - gc.getLineWidth(), getHeight() - 1);
}
}
}

0 comments on commit 3b7cd4a

Please sign in to comment.