diff --git a/core/src/processing/core/PSurfaceFX.java b/core/src/processing/core/PSurfaceFX.java index 4d0937cb3..27dcff4b8 100644 --- a/core/src/processing/core/PSurfaceFX.java +++ b/core/src/processing/core/PSurfaceFX.java @@ -22,6 +22,14 @@ package processing.core; +//import java.awt.event.FocusEvent; +//import java.awt.event.FocusListener; +//import java.awt.event.KeyListener; +//import java.awt.event.MouseListener; +//import java.awt.event.MouseMotionListener; +//import java.awt.event.MouseWheelEvent; +//import java.awt.event.MouseWheelListener; + import javafx.animation.AnimationTimer; import javafx.application.Application; import javafx.application.Platform; @@ -30,10 +38,16 @@ import javafx.beans.value.ObservableValue; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; +import javafx.scene.input.KeyEvent; +import javafx.scene.input.MouseEvent; +import javafx.scene.input.ScrollEvent; import javafx.scene.layout.StackPane; import javafx.stage.Stage; import javafx.stage.WindowEvent; +//import processing.event.KeyEvent; +//import processing.event.MouseEvent; + public class PSurfaceFX implements PSurface { PApplet sketch; @@ -73,6 +87,54 @@ public class PSurfaceFX implements PSurface { fx.setSize(sketch.width, sketch.height); } }); + + //addEventHandler(eventType, eventHandler); + + EventHandler mouseHandler = new EventHandler() { + public void handle(MouseEvent e) { + fxMouseEvent(e); + } + }; + + setOnMousePressed(mouseHandler); + setOnMouseReleased(mouseHandler); + setOnMouseClicked(mouseHandler); + setOnMouseEntered(mouseHandler); + setOnMouseExited(mouseHandler); + + setOnMouseDragged(mouseHandler); + setOnMouseMoved(mouseHandler); + + setOnScroll(new EventHandler() { + public void handle(ScrollEvent e) { + fxScrollEvent(e); + } + }); + + EventHandler keyHandler = new EventHandler() { + public void handle(KeyEvent e) { + fxKeyEvent(e); + } + }; + + setOnKeyPressed(keyHandler); + setOnKeyReleased(keyHandler); + setOnKeyTyped(keyHandler); + + setFocusTraversable(false); // prevent tab from de-focusing + + focusedProperty().addListener(new ChangeListener() { + public void changed(ObservableValue value, + Boolean oldValue, Boolean newValue) { + if (newValue.booleanValue()) { + sketch.focused = true; + sketch.focusGained(); + } else { + sketch.focused = false; + sketch.focusLost(); + } + } + }); } @Override @@ -162,6 +224,7 @@ public class PSurfaceFX implements PSurface { /** Show or hide the window. */ + @Override public void setVisible(boolean visible) { Platform.runLater(new Runnable() { public void run() { @@ -408,4 +471,217 @@ public class PSurfaceFX implements PSurface { // TODO Auto-generated method stub return false; } + + + // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + /* + protected void addListeners() { + + canvas.addMouseListener(new MouseListener() { + + public void mousePressed(java.awt.event.MouseEvent e) { + nativeMouseEvent(e); + } + + public void mouseReleased(java.awt.event.MouseEvent e) { + nativeMouseEvent(e); + } + + public void mouseClicked(java.awt.event.MouseEvent e) { + nativeMouseEvent(e); + } + + public void mouseEntered(java.awt.event.MouseEvent e) { + nativeMouseEvent(e); + } + + public void mouseExited(java.awt.event.MouseEvent e) { + nativeMouseEvent(e); + } + }); + + canvas.addMouseMotionListener(new MouseMotionListener() { + + public void mouseDragged(java.awt.event.MouseEvent e) { + nativeMouseEvent(e); + } + + public void mouseMoved(java.awt.event.MouseEvent e) { + nativeMouseEvent(e); + } + }); + + canvas.addMouseWheelListener(new MouseWheelListener() { + + public void mouseWheelMoved(MouseWheelEvent e) { + nativeMouseEvent(e); + } + }); + + canvas.addKeyListener(new KeyListener() { + + public void keyPressed(java.awt.event.KeyEvent e) { + nativeKeyEvent(e); + } + + + public void keyReleased(java.awt.event.KeyEvent e) { + nativeKeyEvent(e); + } + + + public void keyTyped(java.awt.event.KeyEvent e) { + nativeKeyEvent(e); + } + }); + + canvas.addFocusListener(new FocusListener() { + + public void focusGained(FocusEvent e) { + sketch.focused = true; + sketch.focusGained(); + } + + public void focusLost(FocusEvent e) { + sketch.focused = false; + sketch.focusLost(); + } + }); + } + */ + + + protected void fxMouseEvent(javafx.scene.input.MouseEvent nativeEvent) { + // the 'amount' is the number of button clicks for a click event, + // or the number of steps/clicks on the wheel for a mouse wheel event. + int peCount = nativeEvent.getClickCount(); + + int peAction = 0; + switch (nativeEvent.getID()) { + case java.awt.event.MouseEvent.MOUSE_PRESSED: + peAction = MouseEvent.PRESS; + break; + case java.awt.event.MouseEvent.MOUSE_RELEASED: + peAction = MouseEvent.RELEASE; + break; + case java.awt.event.MouseEvent.MOUSE_CLICKED: + peAction = MouseEvent.CLICK; + break; + case java.awt.event.MouseEvent.MOUSE_DRAGGED: + peAction = MouseEvent.DRAG; + break; + case java.awt.event.MouseEvent.MOUSE_MOVED: + peAction = MouseEvent.MOVE; + break; + case java.awt.event.MouseEvent.MOUSE_ENTERED: + peAction = MouseEvent.ENTER; + break; + case java.awt.event.MouseEvent.MOUSE_EXITED: + peAction = MouseEvent.EXIT; + break; + //case java.awt.event.MouseWheelEvent.WHEEL_UNIT_SCROLL: + case java.awt.event.MouseEvent.MOUSE_WHEEL: + peAction = MouseEvent.WHEEL; + /* + if (preciseWheelMethod != null) { + try { + peAmount = ((Double) preciseWheelMethod.invoke(nativeEvent, (Object[]) null)).floatValue(); + } catch (Exception e) { + preciseWheelMethod = null; + } + } + */ + peCount = ((MouseWheelEvent) nativeEvent).getWheelRotation(); + break; + } + + //System.out.println(nativeEvent); + //int modifiers = nativeEvent.getModifiersEx(); + // If using getModifiersEx(), the regular modifiers don't set properly. + int modifiers = nativeEvent.getModifiers(); + + int peModifiers = modifiers & + (InputEvent.SHIFT_MASK | + InputEvent.CTRL_MASK | + InputEvent.META_MASK | + InputEvent.ALT_MASK); + + // Windows and OS X seem to disagree on how to handle this. Windows only + // sets BUTTON1_DOWN_MASK, while OS X seems to set BUTTON1_MASK. + // This is an issue in particular with mouse release events: + // http://code.google.com/p/processing/issues/detail?id=1294 + // The fix for which led to a regression (fixed here by checking both): + // http://code.google.com/p/processing/issues/detail?id=1332 + int peButton = 0; +// if ((modifiers & InputEvent.BUTTON1_MASK) != 0 || +// (modifiers & InputEvent.BUTTON1_DOWN_MASK) != 0) { +// peButton = LEFT; +// } else if ((modifiers & InputEvent.BUTTON2_MASK) != 0 || +// (modifiers & InputEvent.BUTTON2_DOWN_MASK) != 0) { +// peButton = CENTER; +// } else if ((modifiers & InputEvent.BUTTON3_MASK) != 0 || +// (modifiers & InputEvent.BUTTON3_DOWN_MASK) != 0) { +// peButton = RIGHT; +// } + if ((modifiers & InputEvent.BUTTON1_MASK) != 0) { + peButton = PConstants.LEFT; + } else if ((modifiers & InputEvent.BUTTON2_MASK) != 0) { + peButton = PConstants.CENTER; + } else if ((modifiers & InputEvent.BUTTON3_MASK) != 0) { + peButton = PConstants.RIGHT; + } + + // If running on Mac OS, allow ctrl-click as right mouse. Prior to 0215, + // this used isPopupTrigger() on the native event, but that doesn't work + // for mouseClicked and mouseReleased (or others). + if (PApplet.platform == PConstants.MACOSX) { + //if (nativeEvent.isPopupTrigger()) { + if ((modifiers & InputEvent.CTRL_MASK) != 0) { + peButton = PConstants.RIGHT; + } + } + + //if (canvas.getBoundsInLocal().contains(me.getX(), me.getY())) { + //System.out.println(me.getSceneX() + " " + me.getSceneY()); + //} + + sketch.postEvent(new MouseEvent(nativeEvent, nativeEvent.getWhen(), + peAction, peModifiers, + nativeEvent.getX(), nativeEvent.getY(), + peButton, + peCount)); + } + + + protected void fxKeyEvent(javafx.scene.input.KeyEvent event) { + int peAction = 0; + switch (event.getID()) { + case java.awt.event.KeyEvent.KEY_PRESSED: + peAction = KeyEvent.PRESS; + break; + case java.awt.event.KeyEvent.KEY_RELEASED: + peAction = KeyEvent.RELEASE; + break; + case java.awt.event.KeyEvent.KEY_TYPED: + peAction = KeyEvent.TYPE; + break; + } + +// int peModifiers = event.getModifiersEx() & +// (InputEvent.SHIFT_DOWN_MASK | +// InputEvent.CTRL_DOWN_MASK | +// InputEvent.META_DOWN_MASK | +// InputEvent.ALT_DOWN_MASK); + int peModifiers = event.getModifiers() & + (InputEvent.SHIFT_MASK | + InputEvent.CTRL_MASK | + InputEvent.META_MASK | + InputEvent.ALT_MASK); + + sketch.postEvent(new KeyEvent(event, event.getWhen(), + peAction, peModifiers, + event.getKeyChar(), event.getKeyCode())); + } } \ No newline at end of file