Skip to content

Commit

Permalink
(refactor) Replace calls to FXRobot with Event.fireEvent.
Browse files Browse the repository at this point in the history
  • Loading branch information
brcolow committed Jan 18, 2017
1 parent 8f0f9b4 commit 20a068a
Showing 1 changed file with 115 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,19 @@
*/
package org.testfx.service.adapter.impl;

import javafx.application.Platform;
import javafx.event.Event;
import javafx.event.EventTarget;
import javafx.event.EventType;
import javafx.geometry.Point2D;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.ScrollEvent;
import javafx.scene.paint.Color;

import com.sun.javafx.robot.FXRobot;
Expand All @@ -35,9 +42,23 @@ public class JavafxRobotAdapter {
//---------------------------------------------------------------------------------------------
// PRIVATE FIELDS.
//---------------------------------------------------------------------------------------------

private Scene scene;
private FXRobot fxRobot;

private boolean isShiftDown;
private boolean isControlDown;
private boolean isAltDown;
private boolean isMetaDown;

private MouseButton lastButtonPressed;
private boolean isButton1Pressed;
private boolean isButton2Pressed;
private boolean isButton3Pressed;
private double sceneMouseX;
private double sceneMouseY;
private double screenMouseX;
private double screenMouseY;

//---------------------------------------------------------------------------------------------
// METHODS.
//---------------------------------------------------------------------------------------------
Expand All @@ -46,29 +67,25 @@ public class JavafxRobotAdapter {

public void robotCreate(Scene scene) {
fxRobot = createFxRobot(scene);
}

public void robotDestroy() {
throw new UnsupportedOperationException();
}

public FXRobot getRobotInstance() {
return fxRobot;
this.scene = scene;
}

// KEY.

public void keyPress(KeyCode key) {
fxRobot.keyPress(key);
Platform.runLater(() -> Event.fireEvent(scene.getFocusOwner(), createKeyEvent(scene.getFocusOwner(),
KeyEvent.KEY_PRESSED, key, "")));
}

public void keyRelease(KeyCode key) {
fxRobot.keyRelease(key);
Platform.runLater(() -> Event.fireEvent(scene.getFocusOwner(), createKeyEvent(scene.getFocusOwner(),
KeyEvent.KEY_RELEASED, key, "")));
}

public void keyType(KeyCode key,
String character) {
fxRobot.keyType(key, character);
Platform.runLater(() -> Event.fireEvent(scene.getFocusOwner(), createKeyEvent(scene.getFocusOwner(),
KeyEvent.KEY_TYPED, key, character)));
}

// MOUSE.
Expand All @@ -78,42 +95,54 @@ public Point2D getMouseLocation() {
}

public void mouseMove(Point2D location) {
fxRobot.mouseMove((int) location.getX(), (int) location.getY());
Platform.runLater(() -> Event.fireEvent(scene.getFocusOwner(), createMouseEvent(MouseEvent.MOUSE_MOVED,
location.getX(), location.getY(), lastButtonPressed, 0)));
}

public void mousePress(MouseButton button,
int clickCount) {
fxRobot.mousePress(button, clickCount);
Platform.runLater(() -> Event.fireEvent(scene.getFocusOwner(), createMouseEvent(MouseEvent.MOUSE_PRESSED,
sceneMouseX, sceneMouseY, button, clickCount)));
}

public void mouseRelease(MouseButton button,
int clickCount) {
fxRobot.mouseRelease(button, clickCount);
Platform.runLater(() -> Event.fireEvent(scene.getFocusOwner(), createMouseEvent(MouseEvent.MOUSE_RELEASED,
sceneMouseX, sceneMouseY, button, clickCount)));
}

public void mouseClick(MouseButton button,
int clickCount) {
fxRobot.mouseClick(button, clickCount);
Platform.runLater(() -> Event.fireEvent(scene.getFocusOwner(), createMouseEvent(MouseEvent.MOUSE_CLICKED,
sceneMouseX, sceneMouseY, button, clickCount)));
}

public void mousePress(MouseButton button) {
fxRobot.mousePress(button);
mousePress(button, 1);
}

public void mouseRelease(MouseButton button) {
fxRobot.mouseRelease(button);
mouseRelease(button, 1);
}

public void mouseClick(MouseButton button) {
fxRobot.mouseClick(button);
mouseClick(button, 1);
}

public void mouseDrag(MouseButton button) {
fxRobot.mouseDrag(button);
Platform.runLater(() -> Event.fireEvent(scene.getFocusOwner(), createMouseEvent(MouseEvent.MOUSE_DRAGGED,
sceneMouseX, sceneMouseY, button, 0)));
}

public void mouseWheel(int wheelAmount) {
fxRobot.mouseWheel(wheelAmount);
screenMouseX = scene.getWindow().getX() + scene.getX() + sceneMouseX;
screenMouseY = scene.getWindow().getY() + scene.getY() + sceneMouseY;

final ScrollEvent scrollEvent = new ScrollEvent(ScrollEvent.SCROLL, sceneMouseX, sceneMouseY, screenMouseX,
screenMouseY, isShiftDown, isControlDown, isAltDown, isMetaDown, true, false, 0, wheelAmount * 40, 0,
0, ScrollEvent.HorizontalTextScrollUnits.NONE, 0, ScrollEvent.VerticalTextScrollUnits.NONE, 0, 0, null);

Platform.runLater(() -> Event.fireEvent(scene.getFocusOwner(), scrollEvent));
}

// CAPTURE.
Expand Down Expand Up @@ -150,6 +179,71 @@ private FXRobot createFxRobot(Scene scene) {
return fxRobot;
}

private KeyEvent createKeyEvent(EventTarget target, EventType<KeyEvent> eventType, KeyCode keyCode,
String character) {
boolean pressed = eventType == KeyEvent.KEY_PRESSED;
if (keyCode == KeyCode.SHIFT) {
isShiftDown = pressed;
}
if (keyCode == KeyCode.CONTROL) {
isControlDown = pressed;
}
if (keyCode == KeyCode.ALT) {
isAltDown = pressed;
}
if (keyCode == KeyCode.META) {
isMetaDown = pressed;
}

boolean typed = eventType == KeyEvent.KEY_TYPED;
String keyText = typed ? "" : keyCode.getName();
String keyChar = typed ? character : KeyEvent.CHAR_UNDEFINED;
return new KeyEvent(eventType, character, keyCode.toString(), keyCode, isShiftDown,
isControlDown, isAltDown, isMetaDown);
}

private MouseEvent createMouseEvent(EventType<MouseEvent> eventType, double x, double y, MouseButton mouseButton,
int clickCount) {
screenMouseX = scene.getWindow().getX() + scene.getX() + x;
screenMouseY = scene.getWindow().getY() + scene.getY() + y;
sceneMouseX = x;
sceneMouseY = y;

MouseButton button = mouseButton;
EventType<MouseEvent> type = eventType;
if (type == MouseEvent.MOUSE_PRESSED || type == MouseEvent.MOUSE_RELEASED) {
boolean pressed = type == MouseEvent.MOUSE_PRESSED;
if (button == MouseButton.PRIMARY) {
isButton1Pressed = pressed;
}
else if (button == MouseButton.MIDDLE) {
isButton2Pressed = pressed;
}
else if (button == MouseButton.SECONDARY) {
isButton3Pressed = pressed;
}
if (pressed) {
lastButtonPressed = button;
}
else {
if (!(isButton1Pressed || isButton2Pressed || isButton3Pressed)) {
lastButtonPressed = MouseButton.NONE;
}
}
}
else if (type == MouseEvent.MOUSE_MOVED) {
boolean someButtonPressed = isButton1Pressed || isButton2Pressed || isButton3Pressed;
if (someButtonPressed) {
type = MouseEvent.MOUSE_DRAGGED;
button = MouseButton.NONE;
}
}

return new MouseEvent(type, sceneMouseX, sceneMouseY, screenMouseX, screenMouseY, button, clickCount,
isShiftDown, isControlDown, isAltDown, isMetaDown, button == MouseButton.SECONDARY, isButton1Pressed,
isButton2Pressed, isButton3Pressed, true, true, null);
}

private Color convertFromFxRobotColor(int fxRobotColor) {
throw new UnsupportedOperationException();
}
Expand Down

0 comments on commit 20a068a

Please sign in to comment.