1 /* 2 * Copyright (c) 2010, 2015, 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 com.sun.javafx.tk.quantum; 27 28 import java.security.AccessControlContext; 29 import java.security.AccessController; 30 import java.security.PrivilegedAction; 31 import java.util.List; 32 33 import com.sun.javafx.embed.AbstractEvents; 34 import com.sun.javafx.embed.EmbeddedStageInterface; 35 import com.sun.javafx.embed.HostInterface; 36 import com.sun.javafx.tk.TKScene; 37 import com.sun.javafx.tk.Toolkit; 38 import javafx.application.Platform; 39 40 final class EmbeddedStage extends GlassStage implements EmbeddedStageInterface { 41 42 private HostInterface host; 43 44 public EmbeddedStage(HostInterface host) { 45 this.host = host; 46 } 47 48 // TKStage methods 49 50 @Override 51 public TKScene createTKScene(boolean depthBuffer, boolean msaa, AccessControlContext acc) { 52 EmbeddedScene scene = new EmbeddedScene(host, depthBuffer, msaa); 53 scene.setSecurityContext(acc); 54 return scene; 55 } 56 57 @Override 58 public void setScene(TKScene scene) { 59 if (scene != null) { 60 assert scene instanceof EmbeddedScene; 61 } 62 super.setScene(scene); 63 } 64 65 @Override 66 public void setBounds(float x, float y, boolean xSet, boolean ySet, 67 float w, float h, float cw, float ch, 68 float xGravity, float yGravity, 69 float renderScaleX, float renderScaleY) 70 { 71 if (QuantumToolkit.verbose) { 72 System.err.println("EmbeddedStage.setBounds: x=" + x + " y=" + y + " xSet=" + xSet + " ySet=" + ySet + 73 " w=" + w + " h=" + " cw=" + cw + " ch=" + ch); 74 } 75 float newW = w > 0 ? w : cw; 76 float newH = h > 0 ? h : ch; 77 if ((newW > 0) && (newH > 0)) { 78 host.setPreferredSize((int)newW, (int)newH); 79 } 80 TKScene scene = getScene(); 81 if ((renderScaleX > 0 || renderScaleY > 0) 82 && scene instanceof EmbeddedScene) 83 { 84 EmbeddedScene escene = (EmbeddedScene) scene; 85 if (renderScaleX <= 0.0) renderScaleX = escene.getRenderScaleX(); 86 if (renderScaleY <= 0.0) renderScaleY = escene.getRenderScaleY(); 87 escene.setPixelScaleFactors(renderScaleX, renderScaleY); 88 } 89 } 90 91 @Override 92 public float getPlatformScaleX() { 93 return 1.0f; 94 } 95 96 @Override 97 public float getPlatformScaleY() { 98 return 1.0f; 99 } 100 101 @Override 102 public float getOutputScaleX() { 103 TKScene scene = getScene(); 104 if (scene instanceof EmbeddedScene) { 105 return ((EmbeddedScene) scene).getRenderScaleX(); 106 } 107 return 1.0f; 108 } 109 110 @Override 111 public float getOutputScaleY() { 112 TKScene scene = getScene(); 113 if (scene instanceof EmbeddedScene) { 114 return ((EmbeddedScene) scene).getRenderScaleY(); 115 } 116 return 1.0f; 117 } 118 119 @Override public void setMinimumSize(int minWidth, int minHeight) { 120 // This is a no-op for embedded stages 121 } 122 123 @Override public void setMaximumSize(int maxWidth, int maxHeight) { 124 // This is a no-op for embedded stages 125 } 126 127 @Override 128 protected void setPlatformEnabled(boolean enabled) { 129 super.setPlatformEnabled(enabled); 130 host.setEnabled(enabled); 131 } 132 133 @Override 134 public void setIcons(List icons) { 135 if (QuantumToolkit.verbose) { 136 System.err.println("EmbeddedStage.setIcons"); 137 } 138 } 139 140 @Override 141 public void setTitle(String title) { 142 if (QuantumToolkit.verbose) { 143 System.err.println("EmbeddedStage.setTitle " + title); 144 } 145 } 146 147 @Override 148 public void setVisible(boolean visible) { 149 host.setEmbeddedStage(visible ? this : null); 150 super.setVisible(visible); 151 } 152 153 @Override 154 public void setOpacity(float opacity) { 155 // host.setOpacity(opacity); 156 } 157 158 @Override 159 public void setIconified(boolean iconified) { 160 if (QuantumToolkit.verbose) { 161 System.err.println("EmbeddedScene.setIconified " + iconified); 162 } 163 } 164 165 @Override 166 public void setMaximized(boolean maximized) { 167 if (QuantumToolkit.verbose) { 168 System.err.println("EmbeddedScene.setMaximized " + maximized); 169 } 170 } 171 172 @Override 173 public void setAlwaysOnTop(boolean alwaysOnTop) { 174 if (QuantumToolkit.verbose) { 175 System.err.println("EmbeddedScene.setAlwaysOnTop " + alwaysOnTop); 176 } 177 } 178 179 @Override 180 public void setResizable(boolean resizable) { 181 if (QuantumToolkit.verbose) { 182 System.err.println("EmbeddedStage.setResizable " + resizable); 183 } 184 } 185 186 @Override 187 public void setFullScreen(boolean fullScreen) { 188 if (QuantumToolkit.verbose) { 189 System.err.println("EmbeddedStage.setFullScreen " + fullScreen); 190 } 191 } 192 193 @Override 194 public void requestFocus() { 195 if (!host.requestFocus()) { 196 return; 197 } 198 super.requestFocus(); 199 } 200 201 @Override 202 public void toBack() { 203 if (QuantumToolkit.verbose) { 204 System.err.println("EmbeddedStage.toBack"); 205 } 206 } 207 208 @Override 209 public void toFront() { 210 if (QuantumToolkit.verbose) { 211 System.err.println("EmbeddedStage.toFront"); 212 } 213 } 214 215 @Override public boolean grabFocus() { 216 return host.grabFocus(); 217 } 218 219 @Override public void ungrabFocus() { 220 host.ungrabFocus(); 221 } 222 223 private void notifyStageListener(final Runnable r) { 224 AccessControlContext acc = getAccessControlContext(); 225 AccessController.doPrivileged((PrivilegedAction<Void>) () -> { 226 r.run(); 227 return null; 228 }, acc); 229 } 230 private void notifyStageListenerLater(final Runnable r) { 231 Platform.runLater(() -> notifyStageListener(r)); 232 } 233 234 // EmbeddedStageInterface methods 235 236 @Override 237 public void setLocation(final int x, final int y) { 238 Runnable r = () -> { 239 if (stageListener != null) { 240 stageListener.changedLocation(x, y); 241 } 242 }; 243 // setLocation() can be called on both FX and Swing/SWT/etc threads 244 if (Toolkit.getToolkit().isFxUserThread()) { 245 notifyStageListener(r); 246 } else { 247 notifyStageListenerLater(r); 248 } 249 } 250 251 @Override 252 public void setSize(final int width, final int height) { 253 Runnable r = () -> { 254 if (stageListener != null) { 255 stageListener.changedSize(width, height); 256 } 257 }; 258 // setSize() can be called on both FX and Swing/SWT/etc threads 259 if (Toolkit.getToolkit().isFxUserThread()) { 260 notifyStageListener(r); 261 } else { 262 notifyStageListenerLater(r); 263 } 264 } 265 266 @Override 267 public void setFocused(final boolean focused, final int focusCause) { 268 Runnable r = () -> { 269 if (stageListener != null) { 270 stageListener.changedFocused(focused, 271 AbstractEvents.focusCauseToPeerFocusCause(focusCause)); 272 } 273 }; 274 // setFocused() can be called on both FX and Swing/SWT/etc threads 275 if (Toolkit.getToolkit().isFxUserThread()) { 276 notifyStageListener(r); 277 } else { 278 notifyStageListenerLater(r); 279 } 280 } 281 282 @Override 283 public void focusUngrab() { 284 Runnable r = () -> { 285 if (stageListener != null) { 286 stageListener.focusUngrab(); 287 } 288 }; 289 if (Toolkit.getToolkit().isFxUserThread()) { 290 notifyStageListener(r); 291 } else { 292 notifyStageListenerLater(r); 293 } 294 } 295 296 @Override 297 public void requestInput(String text, int type, double width, double height, 298 double Mxx, double Mxy, double Mxz, double Mxt, 299 double Myx, double Myy, double Myz, double Myt, 300 double Mzx, double Mzy, double Mzz, double Mzt) { 301 throw new UnsupportedOperationException("Not supported yet."); 302 } 303 304 @Override 305 public void releaseInput() { 306 throw new UnsupportedOperationException("Not supported yet."); 307 } 308 309 @Override public void setRTL(boolean b) { 310 } 311 312 }