diff --git a/src/main/java/view/FillingMouseListener.java b/src/main/java/view/FillingMouseListener.java new file mode 100644 index 0000000000000000000000000000000000000000..7cd1efd462ab71d01fb43a857698f9c809869f72 --- /dev/null +++ b/src/main/java/view/FillingMouseListener.java @@ -0,0 +1,41 @@ +package view; + +import javafx.scene.input.MouseEvent; +import model.Cell; +import model.CellState; + +public class FillingMouseListener implements MouseListener { + private final MatrixPane matrix; + private final CellState cellState; + + public FillingMouseListener(MatrixPane matrix, CellState cellState) { + this.matrix = matrix; + this.cellState = cellState; + } + + @Override + public void onMouseReleased(MouseEvent event, Cell cell) { + System.out.println("Filling Release"); + this.matrix.resetWaitingListener(); + } + + @Override + public void onMouseEntered(MouseEvent event, Cell cell) { + System.out.println("Filling Enter"); + if (!event.isPrimaryButtonDown()) { + this.matrix.resetWaitingListener(); + return; + } + while (!cellState.equals(cell.getState())) { + cell.toggleState(); + } + } + + @Override + public void onMousePressed(MouseEvent event, Cell cell) { + System.out.println("Filling Pressed"); + cell.toggleState(); + CellState state = cell.getState(); + this.matrix.setMouseListener(new FillingMouseListener(this.matrix, state)); + } +} diff --git a/src/main/java/view/MatrixPane.java b/src/main/java/view/MatrixPane.java index 03874d390de1806ba1ddb1c21085f946580b8e08..e5c0713bbc1aa839bcd95412ab1490e555962fcd 100644 --- a/src/main/java/view/MatrixPane.java +++ b/src/main/java/view/MatrixPane.java @@ -1,5 +1,6 @@ package view; +import javafx.scene.input.MouseDragEvent; import javafx.scene.input.MouseEvent; import javafx.scene.layout.GridPane; import javafx.scene.shape.Rectangle; @@ -25,7 +26,7 @@ public class MatrixPane extends GridPane{ Rectangle rectangleCell = new Rectangle(CELL_SIZE, CELL_SIZE); addStatePropertyListener(cell, rectangleCell); updateFill(rectangleCell, cell.getState()); - addClickEventHandler(cell, rectangleCell); + addEventHandler(cell, rectangleCell); add(rectangleCell, columnIndex, rowIndex); } @@ -38,7 +39,37 @@ public class MatrixPane extends GridPane{ cellRectangle.setFill(newCellState.color); } - private void addClickEventHandler(Cell cell, Rectangle cellRectangle) { - cellRectangle.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> cell.toggleState()); + 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); } } diff --git a/src/main/java/view/MouseListener.java b/src/main/java/view/MouseListener.java new file mode 100644 index 0000000000000000000000000000000000000000..d227a11bab758827ba20fe3db220a523e03e4078 --- /dev/null +++ b/src/main/java/view/MouseListener.java @@ -0,0 +1,13 @@ +package view; + +import javafx.event.EventType; +import javafx.scene.input.MouseEvent; +import model.Cell; + +interface MouseListener { + + default void onMousePressed(MouseEvent event, Cell cell) {} + default void onMouseReleased(MouseEvent event, Cell cell) {} + default void onMouseEntered(MouseEvent event, Cell cell) {}; + +} diff --git a/src/main/java/view/WaitingMouseListener.java b/src/main/java/view/WaitingMouseListener.java new file mode 100644 index 0000000000000000000000000000000000000000..39f1f9739a8a4328b83de1ff1126ab43faea2c41 --- /dev/null +++ b/src/main/java/view/WaitingMouseListener.java @@ -0,0 +1,22 @@ +package view; + +import javafx.scene.input.MouseEvent; +import model.Cell; +import model.CellState; + +class WaitingMouseListener implements MouseListener { + + + private final MatrixPane matrix; + + WaitingMouseListener(MatrixPane matrix) { + this.matrix = matrix; + } + + @Override + public void onMousePressed(MouseEvent event, Cell cell) { + cell.toggleState(); + CellState cellState = cell.getState(); + matrix.setMouseListener(new FillingMouseListener(this.matrix, cellState)); + } +}