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 }