diff --git a/src/com/patryk/mathdoku/gui/InputHandler.java b/src/com/patryk/mathdoku/gui/InputHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..4d27c45f61ea82cbe6efa42906dd6b5e41205b50 --- /dev/null +++ b/src/com/patryk/mathdoku/gui/InputHandler.java @@ -0,0 +1,119 @@ +package com.patryk.mathdoku.gui; + +import com.patryk.mathdoku.util.Direction; +import com.patryk.mathdoku.util.Util; +import com.patryk.mathdoku.util.BoardPosVec; +import javafx.event.EventHandler; +import javafx.scene.input.KeyEvent; +import javafx.scene.input.MouseEvent; + +public class InputHandler { + //the class must store view in order to be able to call its methods + GameGridView view; + + //constructor + public InputHandler(GameGridView view){ + this.view = view; + + } + + //mouse callback + EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() { + @Override + public void handle(MouseEvent mouseEvent) { + view.getNode().requestFocus(); + BoardPosVec selectedCellPos = new BoardPosVec((int)mouseEvent.getY(), (int)mouseEvent.getX()); + selectedCellPos = selectedCellPos.fromPixelToBoardSpace(); + view.setSelectedCell(selectedCellPos); + + } + }; + + //key callback + EventHandler<KeyEvent> keyEventHandler = new EventHandler<KeyEvent>() { + @Override + //can either be user entering a value, or navigating + public void handle(KeyEvent keyEvent) { + if (!handleDirectionKeyPress(keyEvent)) handleValueEntered(keyEvent); + } + }; + + public boolean handleDirectionKeyPress(KeyEvent event) { + + Direction direction;// = Util.Direction.NORTH; + switch (event.getCode()) { + + case W: + case UP: + direction = Direction.NORTH; + break; + case D: + case RIGHT: + direction = Direction.EAST; + break; + + case S: + case DOWN: + direction = Direction.SOUTH; + break; + + case A: + case LEFT: + direction = Direction.WEST; + break; + + + default: + return false; + + + } + + //consume if arrow key to prevent loss of focus + switch (event.getCode()) { + case UP: + case RIGHT: + case DOWN: + case LEFT: + event.consume(); + } + view.setSelectedCell(view.getSelectedCell().add(direction.vector)); + return true; + } + + public boolean handleValueEntered (KeyEvent keyEvent) { + switch (keyEvent.getCode()) { + case BACK_SPACE: + view.getGameContext().setValueAtCell(view.getSelectedCell(), 0, true); + break; + default: + char keyCharacter = keyEvent.getText().charAt(0); + char maxChar = Character.forDigit(view.getGameContext().getBoardWidth(), 10); + //if digit entered: + if ( keyCharacter >='1'&& keyCharacter <= maxChar) { + injectNumberKey(Util.charToInt(keyCharacter)); + return true; + } + + return false; + + + } + + + return true; + } + + public void injectNumberKey(int digit) { + view.getGameContext().setValueAtCell(view.getSelectedCell(), digit, true); + } + + //returns handlers so that the view can register them + public EventHandler<MouseEvent> getMouseHandler() { + return mouseHandler; + } + + public EventHandler<KeyEvent> getKeyEventHandler() { + return keyEventHandler; + } +}