package org.comtel.javafx.robot;
import java.awt.event.KeyEvent;
import org.comtel.javafx.control.KeyboardPane;
import org.slf4j.LoggerFactory;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.stage.Popup;
import javafx.stage.Window;
import static javafx.scene.input.KeyCode.*;
import com.sun.javafx.robot.FXRobot;
import com.sun.javafx.robot.FXRobotFactory;
public class FXRobotHandler implements IRobot {
private final static org.slf4j.Logger logger = LoggerFactory.getLogger(FXRobotHandler.class);
private final KeyCode controlKeyCode;
public FXRobotHandler() {
String osName = System.getProperty("os.name");
if (osName.toLowerCase().startsWith("mac")){
controlKeyCode = META;
}else{
controlKeyCode = CONTROL;
}
}
@Override
public void sendToComponent(Object kb, final char ch, final boolean ctrl) {
logger.trace("fire: {}", ch);
final Window keyboardWindow = ((KeyboardPane) kb).getScene().getWindow();
if (keyboardWindow != null) {
final Scene scene;
if (keyboardWindow instanceof Popup) {
scene = ((Popup) keyboardWindow).getOwnerWindow().getScene();
} else {
scene = keyboardWindow.getScene();
}
Platform.runLater(new Runnable() {
@Override
public void run() {
send(scene, ch, ctrl);
}
});
}
}
private void send(Scene scene, char ch, boolean ctrl) {
FXRobot robot = FXRobotFactory.createRobot(scene);
if (ctrl) {
switch (Character.toUpperCase(ch)) {
case KeyEvent.VK_A:
robot.keyPress(controlKeyCode);
robot.keyPress(KeyCode.A);
robot.keyType(KeyCode.A, "");
robot.keyRelease(KeyCode.A);
robot.keyRelease(controlKeyCode);
return;
case KeyEvent.VK_X:
robot.keyPress(controlKeyCode);
robot.keyPress(KeyCode.X);
robot.keyType(KeyCode.X, "");
robot.keyRelease(KeyCode.X);
robot.keyRelease(controlKeyCode);
return;
case KeyEvent.VK_C:
robot.keyPress(controlKeyCode);
robot.keyPress(KeyCode.C);
robot.keyType(KeyCode.C, "");
robot.keyRelease(KeyCode.C);
robot.keyRelease(controlKeyCode);
return;
case KeyEvent.VK_V:
robot.keyPress(controlKeyCode);
robot.keyPress(KeyCode.V);
robot.keyType(KeyCode.V, "");
robot.keyRelease(KeyCode.V);
robot.keyRelease(controlKeyCode);
return;
}
switch (ch) {
case KeyEvent.VK_ENTER:
robot.keyPress(KeyCode.ENTER);
robot.keyType(KeyCode.ENTER, Character.toString(ch));
robot.keyRelease(KeyCode.ENTER);
return;
case KeyEvent.VK_BACK_SPACE:
robot.keyPress(KeyCode.BACK_SPACE);
robot.keyType(KeyCode.BACK_SPACE, Character.toString(ch));
robot.keyRelease(KeyCode.BACK_SPACE);
return;
case KeyEvent.VK_DELETE:
robot.keyPress(KeyCode.DELETE);
robot.keyType(KeyCode.DELETE, Character.toString(ch));
robot.keyRelease(KeyCode.DELETE);
return;
case KeyEvent.VK_ESCAPE:
robot.keyPress(KeyCode.ESCAPE);
robot.keyType(KeyCode.ESCAPE, Character.toString(ch));
robot.keyRelease(KeyCode.ESCAPE);
return;
case KeyEvent.VK_SPACE:
robot.keyPress(KeyCode.SPACE);
robot.keyType(KeyCode.SPACE, " ");
robot.keyRelease(KeyCode.SPACE);
return;
case KeyEvent.VK_TAB:
robot.keyPress(KeyCode.TAB);
robot.keyType(KeyCode.TAB, Character.toString(ch));
robot.keyRelease(KeyCode.TAB);
return;
case KeyEvent.VK_UP:
robot.keyPress(KeyCode.UP);
robot.keyType(KeyCode.UP, "");
robot.keyRelease(KeyCode.UP);
return;
case KeyEvent.VK_DOWN:
robot.keyPress(KeyCode.DOWN);
robot.keyType(KeyCode.DOWN, "");
robot.keyRelease(KeyCode.DOWN);
return;
case KeyEvent.VK_LEFT:
robot.keyPress(KeyCode.LEFT);
robot.keyType(KeyCode.LEFT, "");
robot.keyRelease(KeyCode.LEFT);
return;
case KeyEvent.VK_RIGHT:
robot.keyPress(KeyCode.RIGHT);
robot.keyType(KeyCode.RIGHT, "");
robot.keyRelease(KeyCode.RIGHT);
return;
}
}
robot.keyPress(KeyCode.UNDEFINED);
robot.keyType(KeyCode.UNDEFINED, Character.toString(ch));
robot.keyRelease(KeyCode.UNDEFINED);
}
}