package view; import javafx.scene.input.MouseDragEvent; import javafx.scene.input.MouseEvent; import javafx.scene.layout.GridPane; import javafx.scene.shape.Rectangle; import model.Cell; import model.CellState; import model.Grid; /** * Created by Arnaud Labourel on 22/11/2018. */ public class MatrixPane extends GridPane{ private static final double CELL_SIZE = 14; public void initialize(Grid grid) { for (int rowIndex = 0; rowIndex < grid.getNumberOfRows(); rowIndex++) { for (int columnIndex = 0; columnIndex < grid.getNumberOfColumns(); columnIndex++) { addCellRectangle(grid.getCell(rowIndex,columnIndex), rowIndex, columnIndex); } } } private void addCellRectangle(Cell cell, int rowIndex, int columnIndex) { Rectangle rectangleCell = new Rectangle(CELL_SIZE, CELL_SIZE); addStatePropertyListener(cell, rectangleCell); updateFill(rectangleCell, cell.getState()); addEventHandler(cell, rectangleCell); add(rectangleCell, columnIndex, rowIndex); } private void addStatePropertyListener(Cell cell, Rectangle cellRectangle) { cell.getStateProperty().addListener((observable, oldValue, newValue) -> updateFill(cellRectangle, newValue)); } private void updateFill(Rectangle cellRectangle, CellState newCellState) { cellRectangle.setFill(newCellState.color); } private void addEventHandler(Cell cell, Rectangle cellRectangle) { cellRectangle.addEventHandler( MouseEvent.MOUSE_PRESSED, event -> mouseListener.onMousePressed(event, cell) ); cellRectangle.addEventHandler( MouseEvent.DRAG_DETECTED, event -> { System.out.println("Full drag start"); this.startFullDrag(); } ); cellRectangle.addEventHandler( MouseDragEvent.MOUSE_DRAG_RELEASED, event -> mouseListener.onMouseReleased(event, cell) ); cellRectangle.addEventHandler( MouseDragEvent.MOUSE_DRAG_ENTERED, event -> mouseListener.onMouseEntered(event, cell) ); } private MouseListener mouseListener = new WaitingMouseListener(this); void setMouseListener(MouseListener mouseListener) { System.out.println("Change listener"); this.mouseListener = mouseListener; } void resetWaitingListener() { System.out.println("Reset listener"); this.mouseListener = new WaitingMouseListener(this); } }