package ru.khasang.cachoeira.view.mainwindow.diagram.ganttplan.gridlayer; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.scene.shape.Line; import ru.khasang.cachoeira.viewcontroller.MainWindowController; public abstract class GridLayer extends Pane { // This is to make the stroke be drawn 'on pixel'. private static final double HALF_PIXEL_OFFSET = -0.5; protected MainWindowController controller; public GridLayer() { this.setStyle("-fx-background-color: white"); } @Override protected void layoutChildren() { final int top = (int) snappedTopInset(); final int right = (int) snappedRightInset(); final int bottom = (int) snappedBottomInset(); final int left = (int) snappedLeftInset(); final int width = (int) getWidth() - left - right; final int height = (int) getHeight() - top - bottom; final int spacing = controller.getZoomMultiplier(); // Ширина дня в пикселях if (spacing <= 130 && spacing >= 55) { drawLines(width, height, spacing, 1); } if (spacing <= 54 && spacing >= 40) { drawLines(width, height, spacing, 2); } if (spacing <= 39 && spacing >= 20) { drawLines(width, height, spacing, 4); } if (spacing <= 19 && spacing >= 8) { drawLines(width, height, spacing, 7); } if (spacing <= 7 && spacing >= 4) { drawLines(width, height, spacing, 14); } if (spacing <= 3 && spacing >= 2) { drawLines(width, height, spacing, 28); } } /** * При вызове этого метода рисуются вертикальные линии по всей ширине GridLayer'а * * @param width Ширина панели * @param height Высота панели * @param spacing Значение зума * @param multiplier Множитель для увеличения расстояния между линиями */ private void drawLines(int width, int height, int spacing, int multiplier) { this.getChildren().clear(); final int vLineCount = (int) Math.floor((width + 1) / (spacing * multiplier)); for (int i = 0; i < vLineCount; i++) { Line line = new Line(snap((i + 1) * (spacing * multiplier)), 0, snap((i + 1) * (spacing * multiplier)), height); line.setStroke(Color.rgb(237, 237, 237)); this.getChildren().add(line); } } private static double snap(double y) { return ((int) y) + HALF_PIXEL_OFFSET; } }