package org.comtel.javafx.robot;
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent;
import org.slf4j.LoggerFactory;
/**
* native OS support<p>
* dirty unicode char support only by transfer over OS clipboard..
*
* @author comtel
*
*/
public class NativeAsciiRobotHandler implements IRobot {
private final static org.slf4j.Logger logger = LoggerFactory.getLogger(NativeAsciiRobotHandler.class);
private final int controlKeyEvent;
String clipboardRecovered;
public NativeAsciiRobotHandler() {
String osName = System.getProperty("os.name");
if (osName.startsWith("Mac")){
controlKeyEvent = KeyEvent.VK_META;
}else{
controlKeyEvent = KeyEvent.VK_CONTROL;
}
}
@Override
public void sendToComponent(Object kb, char ch, boolean ctrl) {
logger.trace("fire: {}", ch);
send(ch, ctrl);
}
private void send(char ch, boolean ctrl) {
Robot robot;
try {
robot = new Robot();
} catch (AWTException e) {
logger.error(e.getMessage(), e);
return;
}
if (ctrl) {
switch (Character.toUpperCase(ch)) {
case KeyEvent.VK_A:
robot.keyPress(controlKeyEvent);
robot.keyPress(KeyEvent.VK_A);
robot.keyRelease(KeyEvent.VK_A);
robot.keyRelease(controlKeyEvent);
return;
case KeyEvent.VK_X:
robot.keyPress(controlKeyEvent);
robot.keyPress(KeyEvent.VK_X);
robot.keyRelease(KeyEvent.VK_X);
robot.keyRelease(controlKeyEvent);
return;
case KeyEvent.VK_C:
robot.keyPress(controlKeyEvent);
robot.keyPress(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_C);
robot.keyRelease(controlKeyEvent);
return;
case KeyEvent.VK_V:
robot.keyPress(controlKeyEvent);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(controlKeyEvent);
return;
}
switch (ch) {
case KeyEvent.VK_ENTER:
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
return;
case KeyEvent.VK_BACK_SPACE:
robot.keyPress(KeyEvent.VK_BACK_SPACE);
robot.keyRelease(KeyEvent.VK_BACK_SPACE);
return;
case KeyEvent.VK_DELETE:
robot.keyPress(KeyEvent.VK_DELETE);
robot.keyRelease(KeyEvent.VK_DELETE);
return;
case KeyEvent.VK_ESCAPE:
robot.keyPress(KeyEvent.VK_ESCAPE);
robot.keyRelease(KeyEvent.VK_ESCAPE);
return;
case KeyEvent.VK_SPACE:
robot.keyPress(KeyEvent.VK_SPACE);
robot.keyRelease(KeyEvent.VK_SPACE);
return;
case KeyEvent.VK_TAB:
robot.keyPress(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_TAB);
return;
case KeyEvent.VK_UP:
robot.keyPress(KeyEvent.VK_UP);
robot.keyRelease(KeyEvent.VK_UP);
return;
case KeyEvent.VK_DOWN:
robot.keyPress(KeyEvent.VK_DOWN);
robot.keyRelease(KeyEvent.VK_DOWN);
return;
case KeyEvent.VK_LEFT:
robot.keyPress(KeyEvent.VK_LEFT);
robot.keyRelease(KeyEvent.VK_LEFT);
return;
case KeyEvent.VK_RIGHT:
robot.keyPress(KeyEvent.VK_RIGHT);
robot.keyRelease(KeyEvent.VK_RIGHT);
return;
}
}
if (Character.isWhitespace(ch)) {
robot.keyPress(ch);
robot.keyRelease(ch);
return;
}
boolean isUpperCase = Character.isUpperCase(ch);
int keyCode = KeyEvent.getExtendedKeyCodeForChar(ch);
System.err.println("key code: " + keyCode);
if (isUpperCase) {
robot.keyPress(KeyEvent.VK_SHIFT);
}
try {
robot.keyPress(keyCode);
robot.keyRelease(keyCode);
} catch (IllegalArgumentException e) {
logger.error(e.getMessage() + " " + ch);
clipboardTransfer(robot, ch);
}
if (isUpperCase) {
robot.keyRelease(KeyEvent.VK_SHIFT);
}
}
private void clipboardTransfer(Robot robot, char ch) {
final String clipboardRecovered = Clipboard.getSystemClipboard().getString();
ClipboardContent content = new ClipboardContent();
content.putString(Character.toString(ch));
Clipboard.getSystemClipboard().setContent(content);
robot.keyPress(controlKeyEvent);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(controlKeyEvent);
// ClipboardContent recover = new ClipboardContent();
// recover.putString(clipboardRecovered != null ? clipboardRecovered :
// "");
// Clipboard.getSystemClipboard().setContent(recover);
// Thread recoverThread = new Thread(new Runnable() {
//
// @Override
// public void run() {
// try {
// Thread.sleep(200);
// } catch (final InterruptedException e) {
// }
// ClipboardContent recover = new ClipboardContent();
// recover.putString(clipboardRecovered != null ? clipboardRecovered :
// "");
// Clipboard.getSystemClipboard().setContent(recover);
//
// }
// });
// recoverThread.setDaemon(true);
// recoverThread.start();
// recover old content
// clipboard.setContent(Collections.singletonMap(DataFormat.PLAIN_TEXT,
// content != null ? content : ""));
}
}