1 /* 2 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package jdk.swing.interop; 27 28 import java.awt.AWTEvent; 29 import java.awt.Container; 30 import java.awt.Component; 31 import java.awt.event.WindowFocusListener; 32 import java.awt.event.MouseEvent; 33 import java.awt.event.MouseWheelEvent; 34 import java.awt.event.KeyEvent; 35 import sun.awt.LightweightFrame; 36 import sun.awt.UngrabEvent; 37 import sun.awt.AWTAccessor; 38 import sun.swing.JLightweightFrame; 39 40 /** 41 * This class wraps sun.swing.JLightweightFrame and implements 42 * APIs to be used by FX swing interop to access and use JLightweightFrame APIs. 43 * 44 * @since 11 45 */ 46 public class LightweightFrameWrapper { 47 48 JLightweightFrame lwFrame; 49 LightweightFrameWrapper()50 public LightweightFrameWrapper() { 51 lwFrame = new JLightweightFrame(); 52 } 53 getLightweightFrame()54 private JLightweightFrame getLightweightFrame() { 55 return lwFrame; 56 } 57 notifyDisplayChanged(final int scaleFactor)58 public void notifyDisplayChanged(final int scaleFactor) { 59 if (lwFrame != null) { 60 lwFrame.notifyDisplayChanged(scaleFactor, scaleFactor); 61 } 62 } 63 64 /** 65 * {@code overrideNativeWindowHandle()} is package private but 66 * part of the interface of this class. It supports providing a 67 * foreign native window handle (i.e. an FX window handle) to AWT, 68 * and as such is intended to be called via JNI code, 69 * not by Java code, so it is not public. 70 */ overrideNativeWindowHandle(long handle, Runnable closeWindow)71 void overrideNativeWindowHandle(long handle, Runnable closeWindow) { 72 if (lwFrame != null) { 73 lwFrame.overrideNativeWindowHandle(handle, closeWindow); 74 } 75 } 76 setHostBounds(int x, int y, int w, int h)77 public void setHostBounds(int x, int y, int w, int h) { 78 if (lwFrame != null) { 79 lwFrame.setHostBounds(x, y, w, h); 80 } 81 } 82 dispose()83 public void dispose() { 84 if (lwFrame != null) { 85 lwFrame.dispose(); 86 } 87 } 88 addWindowFocusListener(WindowFocusListener listener)89 public void addWindowFocusListener(WindowFocusListener listener) { 90 if (lwFrame != null) { 91 lwFrame.addWindowFocusListener(listener); 92 } 93 } 94 setVisible(boolean visible)95 public void setVisible(boolean visible) { 96 if (lwFrame != null) { 97 lwFrame.setVisible(visible); 98 } 99 } 100 setBounds(int x, int y, int w, int h)101 public void setBounds(int x, int y, int w, int h) { 102 if (lwFrame != null) { 103 lwFrame.setBounds(x, y, w, h); 104 } 105 } 106 setContent(final LightweightContentWrapper lwCntWrapper)107 public void setContent(final LightweightContentWrapper lwCntWrapper) { 108 if (lwFrame != null) { 109 lwFrame.setContent(lwCntWrapper.getContent()); 110 } 111 } 112 emulateActivation(boolean activate)113 public void emulateActivation(boolean activate) { 114 if (lwFrame != null) { 115 lwFrame.emulateActivation(activate); 116 } 117 } 118 createMouseEvent(LightweightFrameWrapper lwFrame, int swingID, long swingWhen, int swingModifiers, int relX, int relY, int absX, int absY, int clickCount, boolean swingPopupTrigger, int swingButton)119 public MouseEvent createMouseEvent(LightweightFrameWrapper lwFrame, 120 int swingID, long swingWhen, int swingModifiers, 121 int relX, int relY, int absX, int absY, 122 int clickCount, boolean swingPopupTrigger, 123 int swingButton) { 124 return new java.awt.event.MouseEvent(lwFrame.getLightweightFrame(), 125 swingID, swingWhen, 126 swingModifiers, 127 relX, relY, absX, absY, clickCount, 128 swingPopupTrigger, swingButton); 129 } 130 createMouseWheelEvent(LightweightFrameWrapper lwFrame, int swingModifiers, int x, int y, int wheelRotation)131 public MouseWheelEvent createMouseWheelEvent(LightweightFrameWrapper lwFrame, 132 int swingModifiers, int x, int y, int wheelRotation) { 133 return new MouseWheelEvent(lwFrame.getLightweightFrame(), 134 java.awt.event.MouseEvent.MOUSE_WHEEL, 135 System.currentTimeMillis(), 136 swingModifiers, x, y, 0, 0, 0, false, 137 MouseWheelEvent.WHEEL_UNIT_SCROLL, 1, 138 wheelRotation); 139 } 140 createKeyEvent(LightweightFrameWrapper lwFrame, int swingID, long swingWhen, int swingModifiers, int swingKeyCode, char swingChar)141 public KeyEvent createKeyEvent(LightweightFrameWrapper lwFrame, 142 int swingID, long swingWhen, 143 int swingModifiers, 144 int swingKeyCode, char swingChar) { 145 return new java.awt.event.KeyEvent(lwFrame.getLightweightFrame(), 146 swingID, swingWhen, swingModifiers, swingKeyCode, 147 swingChar); 148 } 149 createUngrabEvent(LightweightFrameWrapper lwFrame)150 public AWTEvent createUngrabEvent(LightweightFrameWrapper lwFrame) { 151 return new UngrabEvent(lwFrame.getLightweightFrame()); 152 } 153 findComponentAt(LightweightFrameWrapper cont, int x, int y, boolean ignoreEnabled)154 public Component findComponentAt(LightweightFrameWrapper cont, int x, int y, boolean ignoreEnabled) { 155 Container lwframe = cont.getLightweightFrame(); 156 return AWTAccessor.getContainerAccessor().findComponentAt(lwframe, x, y, ignoreEnabled); 157 } 158 isCompEqual(Component c, LightweightFrameWrapper lwFrame)159 public boolean isCompEqual(Component c, LightweightFrameWrapper lwFrame) { 160 return c != lwFrame.getLightweightFrame(); 161 } 162 } 163