< prev index next >

modules/javafx.swing/src/main/java/javafx/embed/swing/SwingNode.java

Print this page

        

*** 51,61 **** import java.awt.dnd.DragGestureListener; import java.awt.dnd.DragGestureRecognizer; import java.awt.dnd.DragSource; import java.awt.dnd.DropTarget; import java.awt.dnd.InvalidDnDOperationException; - import java.awt.dnd.peer.DragSourceContextPeer; import java.awt.event.InputEvent; import java.awt.event.MouseWheelEvent; import java.awt.event.WindowEvent; import java.awt.event.WindowFocusListener; import java.lang.reflect.Method; --- 51,60 ----
*** 78,93 **** import com.sun.javafx.stage.WindowHelper; import com.sun.javafx.tk.TKStage; import com.sun.javafx.PlatformUtil; import com.sun.javafx.embed.swing.SwingNodeHelper; import com.sun.javafx.scene.NodeHelper; - import sun.awt.UngrabEvent; - import sun.swing.JLightweightFrame; - import sun.swing.LightweightContent; import static javafx.stage.WindowEvent.WINDOW_HIDDEN; /** * This class is used to embed a Swing content into a JavaFX application. * The content to be displayed is specified with the {@link #setContent} method * that accepts an instance of Swing {@code JComponent}. The hierarchy of components * contained in the {@code JComponent} instance should not contain any heavyweight --- 77,94 ---- import com.sun.javafx.stage.WindowHelper; import com.sun.javafx.tk.TKStage; import com.sun.javafx.PlatformUtil; import com.sun.javafx.embed.swing.SwingNodeHelper; import com.sun.javafx.scene.NodeHelper; + import com.sun.javafx.embed.swing.SwingEvents; + import com.sun.javafx.embed.swing.SwingCursors; import static javafx.stage.WindowEvent.WINDOW_HIDDEN; + import com.sun.javafx.embed.swing.InteropFactory; + import com.sun.javafx.embed.swing.SwingNodeInterop; + /** * This class is used to embed a Swing content into a JavaFX application. * The content to be displayed is specified with the {@link #setContent} method * that accepts an instance of Swing {@code JComponent}. The hierarchy of components * contained in the {@code JComponent} instance should not contain any heavyweight
*** 127,146 **** --- 128,157 ---- * </pre> * @since JavaFX 8.0 */ public class SwingNode extends Node { private static boolean isThreadMerged; + private static SwingNodeInterop swiop; static { + InteropFactory instance = null; + try { + instance = InteropFactory.getInstance(); + } catch (Exception e) { + throw new ExceptionInInitializerError(e); + } + swiop = instance.createSwingNodeImpl(); + AccessController.doPrivileged(new PrivilegedAction<Object>() { public Object run() { isThreadMerged = Boolean.valueOf( System.getProperty("javafx.embed.singleThread")); return null; } }); + // This is used by classes in different packages to get access to // private and package private methods. SwingNodeHelper.setSwingNodeAccessor(new SwingNodeHelper.SwingNodeAccessor() { @Override public NGNode doCreatePeer(Node node) {
*** 166,193 **** } private double fxWidth; private double fxHeight; ! private int swingPrefWidth; ! private int swingPrefHeight; ! private int swingMaxWidth; ! private int swingMaxHeight; ! private int swingMinWidth; ! private int swingMinHeight; private volatile JComponent content; ! private volatile JLightweightFrame lwFrame; ! final JLightweightFrame getLightweightFrame() { return lwFrame; } private NGExternalNode peer; ! private final ReentrantLock paintLock = new ReentrantLock(); private boolean skipBackwardUnrgabNotification; ! private boolean grabbed; // lwframe initiated grab ! private Timer deactivate; // lwFrame deactivate delay for Linux { // To initialize the class helper at the begining each constructor of this class SwingNodeHelper.initHelper(this); } --- 177,203 ---- } private double fxWidth; private double fxHeight; ! public int swingPrefWidth; ! public int swingPrefHeight; ! public int swingMaxWidth; ! public int swingMaxHeight; ! public int swingMinWidth; ! public int swingMinHeight; private volatile JComponent content; ! private volatile Object lwFrame; ! public final Object getLightweightFrame() { return lwFrame; } private NGExternalNode peer; ! public final ReentrantLock paintLock = new ReentrantLock(); private boolean skipBackwardUnrgabNotification; ! public boolean grabbed; // lwframe initiated grab { // To initialize the class helper at the begining each constructor of this class SwingNodeHelper.initHelper(this); }
*** 200,210 **** setEventHandler(MouseEvent.ANY, new SwingMouseEventHandler()); setEventHandler(KeyEvent.ANY, new SwingKeyEventHandler()); setEventHandler(ScrollEvent.SCROLL, new SwingScrollEventHandler()); focusedProperty().addListener((observable, oldValue, newValue) -> { ! activateLwFrame(newValue); }); //Workaround for RT-34170 javafx.scene.text.Font.getFamilies(); } --- 210,220 ---- setEventHandler(MouseEvent.ANY, new SwingMouseEventHandler()); setEventHandler(KeyEvent.ANY, new SwingKeyEventHandler()); setEventHandler(ScrollEvent.SCROLL, new SwingScrollEventHandler()); focusedProperty().addListener((observable, oldValue, newValue) -> { ! swiop.activateLwFrame(lwFrame, newValue); }); //Workaround for RT-34170 javafx.scene.text.Font.getFamilies(); }
*** 214,230 **** if (lwFrame != null && event.getTarget() instanceof Window) { final Window w = (Window) event.getTarget(); TKStage tk = WindowHelper.getPeer(w); if (tk != null) { if (isThreadMerged) { ! jlfOverrideNativeWindowHandle.invoke(lwFrame, 0L, null); } else { // Postpone actual window closing to ensure that // a native window handler is valid on a Swing side tk.postponeClose(); SwingFXUtils.runOnEDT(() -> { ! jlfOverrideNativeWindowHandle.invoke(lwFrame, 0L, (Runnable) () -> SwingFXUtils.runOnFxThread( () -> tk.closePostponed())); }); } } --- 224,240 ---- if (lwFrame != null && event.getTarget() instanceof Window) { final Window w = (Window) event.getTarget(); TKStage tk = WindowHelper.getPeer(w); if (tk != null) { if (isThreadMerged) { ! swiop.overrideNativeWindowHandle(0L, null); } else { // Postpone actual window closing to ensure that // a native window handler is valid on a Swing side tk.postponeClose(); SwingFXUtils.runOnEDT(() -> { ! swiop.overrideNativeWindowHandle(0L, (Runnable) () -> SwingFXUtils.runOnFxThread( () -> tk.closePostponed())); }); } }
*** 250,260 **** TKStage tkStage = WindowHelper.getPeer(window); if (tkStage != null) { rawHandle = tkStage.getRawHandle(); } } ! jlfOverrideNativeWindowHandle.invoke(lwFrame, rawHandle, null); } } /** * Attaches a {@code JComponent} instance to display in this {@code SwingNode}. --- 260,270 ---- TKStage tkStage = WindowHelper.getPeer(window); if (tkStage != null) { rawHandle = tkStage.getRawHandle(); } } ! swiop.overrideNativeWindowHandle(rawHandle, null); } } /** * Attaches a {@code JComponent} instance to display in this {@code SwingNode}.
*** 328,411 **** return null; } } } - /** - * Calls JLightweightFrame.notifyDisplayChanged. - * Must be called on EDT only. - */ - private static OptionalMethod<JLightweightFrame> jlfNotifyDisplayChanged; - private static OptionalMethod<JLightweightFrame> jlfOverrideNativeWindowHandle; - - static { - jlfNotifyDisplayChanged = new OptionalMethod<>(JLightweightFrame.class, - "notifyDisplayChanged", Double.TYPE, Double.TYPE); - if (!jlfNotifyDisplayChanged.isSupported()) { - jlfNotifyDisplayChanged = new OptionalMethod<>( - JLightweightFrame.class,"notifyDisplayChanged", Integer.TYPE); - } - - jlfOverrideNativeWindowHandle = new OptionalMethod<>(JLightweightFrame.class, - "overrideNativeWindowHandle", Long.TYPE, Runnable.class); - - } - /* * Called on EDT */ private void setContentImpl(JComponent content) { if (lwFrame != null) { ! lwFrame.dispose(); lwFrame = null; } if (content != null) { ! lwFrame = new JLightweightFrame(); SwingNodeWindowFocusListener snfListener = new SwingNodeWindowFocusListener(this); ! lwFrame.addWindowFocusListener(snfListener); if (getScene() != null) { Window window = getScene().getWindow(); if (window != null) { ! if (jlfNotifyDisplayChanged.isIntegerApi()) { ! jlfNotifyDisplayChanged.invoke(lwFrame, ! (int) Math.round(window.getRenderScaleX())); ! } else { ! jlfNotifyDisplayChanged.invoke(lwFrame, ! window.getRenderScaleX(), ! window.getRenderScaleY()); } } ! } ! lwFrame.setContent(new SwingNodeContent(content, this)); ! lwFrame.setVisible(true); ! SwingNodeDisposer disposeRec = new SwingNodeDisposer(lwFrame); ! Disposer.addRecord(this, disposeRec); if (getScene() != null) { notifyNativeHandle(getScene().getWindow()); } SwingFXUtils.runOnFxThread(() -> { ! locateLwFrame(); // initialize location if (focusedProperty().get()) { ! activateLwFrame(true); } }); } } private List<Runnable> peerRequests = new ArrayList<>(); /* * Called on EDT */ ! void setImageBuffer(final int[] data, final int x, final int y, final int w, final int h, final int linestride, final double scaleX, final double scaleY) --- 338,393 ---- return null; } } } /* * Called on EDT */ private void setContentImpl(JComponent content) { if (lwFrame != null) { ! swiop.disposeLwFrame(); lwFrame = null; } if (content != null) { ! lwFrame = swiop.createLightweightFrame(); SwingNodeWindowFocusListener snfListener = new SwingNodeWindowFocusListener(this); ! swiop.addWindowFocusListener(lwFrame, snfListener); if (getScene() != null) { Window window = getScene().getWindow(); if (window != null) { ! swiop.notifyDisplayChanged(lwFrame, window); } } ! swiop.setContent(lwFrame, swiop.createSwingNodeContent(content, this)); ! swiop.setVisible(lwFrame, true); ! Disposer.addRecord(this, swiop.createSwingNodeDisposer(lwFrame)); if (getScene() != null) { notifyNativeHandle(getScene().getWindow()); } SwingFXUtils.runOnFxThread(() -> { ! locateLwFrame();// initialize location if (focusedProperty().get()) { ! swiop.activateLwFrame(lwFrame, true); } }); } } private List<Runnable> peerRequests = new ArrayList<>(); /* * Called on EDT */ ! public void setImageBuffer(final int[] data, final int x, final int y, final int w, final int h, final int linestride, final double scaleX, final double scaleY)
*** 423,433 **** } /* * Called on EDT */ ! void setImageBounds(final int x, final int y, final int w, final int h) { Runnable r = () -> peer.setImageBounds(x, y, w, h, w, h); SwingFXUtils.runOnFxThread(() -> { if (peer != null) { r.run(); } else { --- 405,415 ---- } /* * Called on EDT */ ! public void setImageBounds(final int x, final int y, final int w, final int h) { Runnable r = () -> peer.setImageBounds(x, y, w, h, w, h); SwingFXUtils.runOnFxThread(() -> { if (peer != null) { r.run(); } else {
*** 437,447 **** } /* * Called on EDT */ ! void repaintDirtyRegion(final int dirtyX, final int dirtyY, final int dirtyWidth, final int dirtyHeight) { Runnable r = () -> { peer.repaintDirtyRegion(dirtyX, dirtyY, dirtyWidth, dirtyHeight); NodeHelper.markDirty(this, DirtyBits.NODE_CONTENTS); }; SwingFXUtils.runOnFxThread(() -> { --- 419,429 ---- } /* * Called on EDT */ ! public void repaintDirtyRegion(final int dirtyX, final int dirtyY, final int dirtyWidth, final int dirtyHeight) { Runnable r = () -> { peer.repaintDirtyRegion(dirtyX, dirtyY, dirtyWidth, dirtyHeight); NodeHelper.markDirty(this, DirtyBits.NODE_CONTENTS); }; SwingFXUtils.runOnFxThread(() -> {
*** 557,574 **** }; private final EventHandler<FocusUngrabEvent> ungrabHandler = event -> { if (!skipBackwardUnrgabNotification) { if (lwFrame != null) { ! AccessController.doPrivileged(new PostEventAction(new UngrabEvent(lwFrame))); } } }; private final ChangeListener<Boolean> windowVisibleListener = (observable, oldValue, newValue) -> { if (!newValue) { ! disposeLwFrame(); } else { setContent(content); } }; --- 539,557 ---- }; private final EventHandler<FocusUngrabEvent> ungrabHandler = event -> { if (!skipBackwardUnrgabNotification) { if (lwFrame != null) { ! AccessController.doPrivileged(new PostEventAction( ! swiop.createUngrabEvent(lwFrame))); } } }; private final ChangeListener<Boolean> windowVisibleListener = (observable, oldValue, newValue) -> { if (!newValue) { ! swiop.disposeLwFrame(); } else { setContent(content); } };
*** 607,617 **** window.widthProperty().addListener(locationListener); window.heightProperty().addListener(locationListener); window.renderScaleXProperty().addListener(locationListener); window.addEventHandler(FocusUngrabEvent.FOCUS_UNGRAB, ungrabHandler); window.showingProperty().addListener(windowVisibleListener); ! setLwFrameScale(window.getRenderScaleX(), window.getRenderScaleY()); } private void removeWindowListeners(final Window window) { window.xProperty().removeListener(locationListener); window.yProperty().removeListener(locationListener); --- 590,600 ---- window.widthProperty().addListener(locationListener); window.heightProperty().addListener(locationListener); window.renderScaleXProperty().addListener(locationListener); window.addEventHandler(FocusUngrabEvent.FOCUS_UNGRAB, ungrabHandler); window.showingProperty().addListener(windowVisibleListener); ! swiop.setLwFrameScale(window.getRenderScaleX(), window.getRenderScaleY()); } private void removeWindowListeners(final Window window) { window.xProperty().removeListener(locationListener); window.yProperty().removeListener(locationListener);
*** 639,649 **** sceneProperty().addListener((observable, oldValue, newValue) -> { if (oldValue != null) { // Removed from scene removeSceneListeners(oldValue); ! disposeLwFrame(); } if (newValue != null) { // Added to another scene if (content != null && lwFrame == null) { setContent(content); --- 622,632 ---- sceneProperty().addListener((observable, oldValue, newValue) -> { if (oldValue != null) { // Removed from scene removeSceneListeners(oldValue); ! swiop.disposeLwFrame(); } if (newValue != null) { // Added to another scene if (content != null && lwFrame == null) { setContent(content);
*** 651,661 **** addSceneListeners(newValue); } }); NodeHelper.treeVisibleProperty(this).addListener((observable, oldValue, newValue) -> { ! setLwFrameVisible(newValue); }); return peer; } --- 634,644 ---- addSceneListeners(newValue); } }); NodeHelper.treeVisibleProperty(this).addListener((observable, oldValue, newValue) -> { ! swiop.setLwFrameVisible(newValue); }); return peer; }
*** 670,687 **** if (NodeHelper.isDirty(this, DirtyBits.NODE_CONTENTS)) { peer.markContentDirty(); } } - /** - * Calls JLightweightFrame.setHostBounds. - * Must be called on EDT only. - */ - private static final OptionalMethod<JLightweightFrame> jlfSetHostBounds = - new OptionalMethod<>(JLightweightFrame.class, "setHostBounds", - Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE); - private void locateLwFrame() { if (getScene() == null || lwFrame == null || getScene().getWindow() == null || !getScene().getWindow().isShowing()) { --- 653,662 ----
*** 701,790 **** final int frameW = (int) (fxWidth); final int frameH = (int) (fxHeight); SwingFXUtils.runOnEDT(() -> { if (lwFrame != null) { ! if (jlfNotifyDisplayChanged.isIntegerApi()) { ! jlfNotifyDisplayChanged.invoke(lwFrame, ! (int)Math.round(renderScaleX)); ! } else { ! jlfNotifyDisplayChanged.invoke(lwFrame, renderScaleX, ! renderScaleY); ! } ! lwFrame.setBounds(frameX, frameY, frameW, frameH); ! jlfSetHostBounds.invoke(lwFrame, windowX, windowY, ! windowW, windowH); ! } ! }); ! } ! ! private void activateLwFrame(final boolean activate) { ! if (lwFrame == null) { ! return; ! } ! if (PlatformUtil.isLinux()) { ! // Workaround to block FocusOut/FocusIn notifications from Unity ! // focus grabbing upon Alt press ! if (deactivate == null || !deactivate.isRunning()) { ! if (!activate) { ! deactivate = new Timer(50, (e) -> { ! { ! if (lwFrame != null) { ! lwFrame.emulateActivation(false); ! } ! } ! }); ! deactivate.start(); ! return; ! } ! } else { ! deactivate.stop(); ! } ! } ! ! SwingFXUtils.runOnEDT(() -> { ! if (lwFrame != null) { ! lwFrame.emulateActivation(activate); ! } ! }); ! } ! ! private void disposeLwFrame() { ! if (lwFrame == null) { ! return; ! } ! SwingFXUtils.runOnEDT(() -> { ! if (lwFrame != null) { ! lwFrame.dispose(); ! lwFrame = null; ! } ! }); ! } ! ! private void setLwFrameVisible(final boolean visible) { ! if (lwFrame == null) { ! return; ! } ! SwingFXUtils.runOnEDT(() -> { ! if (lwFrame != null) { ! lwFrame.setVisible(visible); ! } ! }); ! } ! ! private void setLwFrameScale(final double scaleX, final double scaleY) { ! if (lwFrame == null) { ! return; ! } ! SwingFXUtils.runOnEDT(() -> { ! if (lwFrame != null) { ! if (jlfNotifyDisplayChanged.isIntegerApi()) { ! jlfNotifyDisplayChanged.invoke(lwFrame, ! (int)Math.round(scaleX)); ! } else { ! jlfNotifyDisplayChanged.invoke(lwFrame, scaleX, scaleY); ! } } }); } /* --- 676,688 ---- final int frameW = (int) (fxWidth); final int frameH = (int) (fxHeight); SwingFXUtils.runOnEDT(() -> { if (lwFrame != null) { ! swiop.notifyDisplayChanged(lwFrame, w); ! swiop.setBounds(lwFrame, frameX, frameY, frameW, frameH); ! swiop.setHostBounds(lwFrame, w); } }); } /*
*** 794,816 **** bounds.deriveWithNewBounds(0, 0, 0, (float)fxWidth, (float)fxHeight, 0); tx.transform(bounds, bounds); return bounds; } - private static class SwingNodeDisposer implements DisposerRecord { - JLightweightFrame lwFrame; - - SwingNodeDisposer(JLightweightFrame ref) { - this.lwFrame = ref; - } - public void dispose() { - if (lwFrame != null) { - lwFrame.dispose(); - lwFrame = null; - } - } - } private static class SwingNodeWindowFocusListener implements WindowFocusListener { private WeakReference<SwingNode> swingNodeRef; SwingNodeWindowFocusListener(SwingNode swingNode) { --- 692,701 ----
*** 836,1022 **** } }); } } ! private static class SwingNodeContent implements LightweightContent { ! private JComponent comp; ! private volatile FXDnD dnd; ! private WeakReference<SwingNode> swingNodeRef; ! ! SwingNodeContent(JComponent comp, SwingNode swingNode) { ! this.comp = comp; ! this.swingNodeRef = new WeakReference<SwingNode>(swingNode); ! } ! @Override ! public JComponent getComponent() { ! return comp; ! } ! @Override ! public void paintLock() { ! SwingNode swingNode = swingNodeRef.get(); ! if (swingNode != null) { ! swingNode.paintLock.lock(); ! } ! } ! @Override ! public void paintUnlock() { ! SwingNode swingNode = swingNodeRef.get(); ! if (swingNode != null) { ! swingNode.paintLock.unlock(); ! } ! } ! ! // Note: we skip @Override annotation and implement both pre-hiDPI and post-hiDPI versions ! // of the method for compatibility. ! //@Override ! public void imageBufferReset(int[] data, int x, int y, int width, int height, int linestride) { ! imageBufferReset(data, x, y, width, height, linestride, 1); ! } ! //@Override ! public void imageBufferReset(int[] data, int x, int y, int width, int height, int linestride, int scale) { ! SwingNode swingNode = swingNodeRef.get(); ! if (swingNode != null) { ! swingNode.setImageBuffer(data, x, y, width, height, linestride, scale, scale); ! } ! } ! //@Override ! public void imageBufferReset(int[] data, int x, int y, int width, int height, int linestride, double scaleX, double scaleY) { ! SwingNode swingNode = swingNodeRef.get(); ! if (swingNode != null) { ! swingNode.setImageBuffer(data, x, y, width, height, linestride, scaleX, scaleY); ! } ! } ! @Override ! public void imageReshaped(int x, int y, int width, int height) { ! SwingNode swingNode = swingNodeRef.get(); ! if (swingNode != null) { ! swingNode.setImageBounds(x, y, width, height); ! } ! } ! @Override ! public void imageUpdated(int dirtyX, int dirtyY, int dirtyWidth, int dirtyHeight) { ! SwingNode swingNode = swingNodeRef.get(); ! if (swingNode != null) { ! swingNode.repaintDirtyRegion(dirtyX, dirtyY, dirtyWidth, dirtyHeight); ! } ! } ! @Override ! public void focusGrabbed() { ! SwingFXUtils.runOnFxThread(() -> { ! // On X11 grab is limited to a single XDisplay connection, ! // so we can't delegate it to another GUI toolkit. ! if (PlatformUtil.isLinux()) return; ! ! SwingNode swingNode = swingNodeRef.get(); ! if (swingNode != null) { ! Scene scene = swingNode.getScene(); ! if (scene != null && ! scene.getWindow() != null && ! WindowHelper.getPeer(scene.getWindow()) != null) { ! WindowHelper.getPeer(scene.getWindow()).grabFocus(); ! swingNode.grabbed = true; ! } ! } ! }); ! } ! @Override ! public void focusUngrabbed() { ! SwingFXUtils.runOnFxThread(() -> { ! SwingNode swingNode = swingNodeRef.get(); ! if (swingNode != null) { ! swingNode.ungrabFocus(false); ! } ! }); ! } ! @Override ! public void preferredSizeChanged(final int width, final int height) { ! SwingFXUtils.runOnFxThread(() -> { ! SwingNode swingNode = swingNodeRef.get(); ! if (swingNode != null) { ! swingNode.swingPrefWidth = width; ! swingNode.swingPrefHeight = height; ! NodeHelper.notifyLayoutBoundsChanged(swingNode); ! } ! }); ! } ! @Override ! public void maximumSizeChanged(final int width, final int height) { ! SwingFXUtils.runOnFxThread(() -> { ! SwingNode swingNode = swingNodeRef.get(); ! if (swingNode != null) { ! swingNode.swingMaxWidth = width; ! swingNode.swingMaxHeight = height; ! NodeHelper.notifyLayoutBoundsChanged(swingNode); ! } ! }); ! } ! @Override ! public void minimumSizeChanged(final int width, final int height) { ! SwingFXUtils.runOnFxThread(() -> { ! SwingNode swingNode = swingNodeRef.get(); ! if (swingNode != null) { ! swingNode.swingMinWidth = width; ! swingNode.swingMinHeight = height; ! NodeHelper.notifyLayoutBoundsChanged(swingNode); ! } ! }); ! } ! ! //@Override ! public void setCursor(Cursor cursor) { ! SwingFXUtils.runOnFxThread(() -> { ! SwingNode swingNode = swingNodeRef.get(); ! if (swingNode != null) { ! swingNode.setCursor(SwingCursors.embedCursorToCursor(cursor)); ! } ! }); ! } ! ! private void initDnD() { ! // This is a part of AWT API, so the method may be invoked on any thread ! synchronized (SwingNodeContent.this) { ! if (this.dnd == null) { ! SwingNode swingNode = swingNodeRef.get(); ! if (swingNode != null) { ! this.dnd = new FXDnD(swingNode); ! } ! } ! } ! } ! ! //@Override ! public synchronized <T extends DragGestureRecognizer> T createDragGestureRecognizer( ! Class<T> abstractRecognizerClass, ! DragSource ds, Component c, int srcActions, ! DragGestureListener dgl) ! { ! initDnD(); ! return dnd.createDragGestureRecognizer(abstractRecognizerClass, ds, c, srcActions, dgl); ! } ! ! //@Override ! public DragSourceContextPeer createDragSourceContextPeer(DragGestureEvent dge) throws InvalidDnDOperationException ! { ! initDnD(); ! return dnd.createDragSourceContextPeer(dge); ! } ! ! //@Override ! public void addDropTarget(DropTarget dt) { ! initDnD(); ! dnd.addDropTarget(dt); ! } ! ! //@Override ! public void removeDropTarget(DropTarget dt) { ! initDnD(); ! dnd.removeDropTarget(dt); ! } ! } ! ! private void ungrabFocus(boolean postUngrabEvent) { // On X11 grab is limited to a single XDisplay connection, // so we can't delegate it to another GUI toolkit. if (PlatformUtil.isLinux()) return; if (grabbed && --- 721,731 ---- } }); } } ! public void ungrabFocus(boolean postUngrabEvent) { // On X11 grab is limited to a single XDisplay connection, // so we can't delegate it to another GUI toolkit. if (PlatformUtil.isLinux()) return; if (grabbed &&
*** 1047,1057 **** private class SwingMouseEventHandler implements EventHandler<MouseEvent> { private final Set<MouseButton> mouseClickedAllowed = new HashSet<>(); @Override public void handle(MouseEvent event) { ! JLightweightFrame frame = lwFrame; if (frame == null) { return; } int swingID = SwingEvents.fxMouseEventTypeToMouseID(event); if (swingID < 0) { --- 756,766 ---- private class SwingMouseEventHandler implements EventHandler<MouseEvent> { private final Set<MouseButton> mouseClickedAllowed = new HashSet<>(); @Override public void handle(MouseEvent event) { ! Object frame = swiop.getLightweightFrame(); if (frame == null) { return; } int swingID = SwingEvents.fxMouseEventTypeToMouseID(event); if (swingID < 0) {
*** 1085,1106 **** int relX = (int) Math.round(event.getX()); int relY = (int) Math.round(event.getY()); int absX = (int) Math.round(event.getScreenX()); int absY = (int) Math.round(event.getScreenY()); java.awt.event.MouseEvent mouseEvent = ! new java.awt.event.MouseEvent( frame, swingID, swingWhen, swingModifiers, relX, relY, absX, absY, event.getClickCount(), swingPopupTrigger, swingButton); AccessController.doPrivileged(new PostEventAction(mouseEvent)); } } private class SwingScrollEventHandler implements EventHandler<ScrollEvent> { @Override public void handle(ScrollEvent event) { ! JLightweightFrame frame = lwFrame; if (frame == null) { return; } int swingModifiers = SwingEvents.fxScrollModsToMouseWheelMods(event); --- 794,815 ---- int relX = (int) Math.round(event.getX()); int relY = (int) Math.round(event.getY()); int absX = (int) Math.round(event.getScreenX()); int absY = (int) Math.round(event.getScreenY()); java.awt.event.MouseEvent mouseEvent = ! swiop.createMouseEvent( frame, swingID, swingWhen, swingModifiers, relX, relY, absX, absY, event.getClickCount(), swingPopupTrigger, swingButton); AccessController.doPrivileged(new PostEventAction(mouseEvent)); } } private class SwingScrollEventHandler implements EventHandler<ScrollEvent> { @Override public void handle(ScrollEvent event) { ! Object frame = swiop.getLightweightFrame(); if (frame == null) { return; } int swingModifiers = SwingEvents.fxScrollModsToMouseWheelMods(event);
*** 1120,1149 **** sendMouseWheelEvent(frame, event.getX(), event.getY(), swingModifiers, delta); } } ! private void sendMouseWheelEvent(Component source, double fxX, double fxY, int swingModifiers, double delta) { int wheelRotation = (int) delta; int signum = (int) Math.signum(delta); if (signum * delta < 1) { wheelRotation = signum; } int x = (int) Math.round(fxX); int y = (int) Math.round(fxY); MouseWheelEvent mouseWheelEvent = ! new MouseWheelEvent(source, java.awt.event.MouseEvent.MOUSE_WHEEL, ! System.currentTimeMillis(), swingModifiers, x, y, 0, 0, ! 0, false, MouseWheelEvent.WHEEL_UNIT_SCROLL, 1 , -wheelRotation); AccessController.doPrivileged(new PostEventAction(mouseWheelEvent)); } } private class SwingKeyEventHandler implements EventHandler<KeyEvent> { @Override public void handle(KeyEvent event) { ! JLightweightFrame frame = lwFrame; if (frame == null) { return; } if (event.getCharacter().isEmpty()) { // TODO: should we post an "empty" character? --- 829,856 ---- sendMouseWheelEvent(frame, event.getX(), event.getY(), swingModifiers, delta); } } ! private void sendMouseWheelEvent(Object source, double fxX, double fxY, int swingModifiers, double delta) { int wheelRotation = (int) delta; int signum = (int) Math.signum(delta); if (signum * delta < 1) { wheelRotation = signum; } int x = (int) Math.round(fxX); int y = (int) Math.round(fxY); MouseWheelEvent mouseWheelEvent = ! swiop.createMouseWheelEvent(source, swingModifiers, x, y, -wheelRotation); AccessController.doPrivileged(new PostEventAction(mouseWheelEvent)); } } private class SwingKeyEventHandler implements EventHandler<KeyEvent> { @Override public void handle(KeyEvent event) { ! Object frame = swiop.getLightweightFrame(); if (frame == null) { return; } if (event.getCharacter().isEmpty()) { // TODO: should we post an "empty" character?
*** 1174,1185 **** if (text.length() == 1) { swingChar = text.charAt(0); } } long swingWhen = System.currentTimeMillis(); ! java.awt.event.KeyEvent keyEvent = new java.awt.event.KeyEvent( ! frame, swingID, swingWhen, swingModifiers, ! swingKeyCode, swingChar); AccessController.doPrivileged(new PostEventAction(keyEvent)); } } } --- 881,893 ---- if (text.length() == 1) { swingChar = text.charAt(0); } } long swingWhen = System.currentTimeMillis(); ! java.awt.event.KeyEvent keyEvent = swiop.createKeyEvent(frame, ! swingID, swingWhen, swingModifiers, swingKeyCode, ! swingChar); AccessController.doPrivileged(new PostEventAction(keyEvent)); } } } +
< prev index next >