< prev index next >

src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java

Print this page




  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 sun.lwawt.macosx;
  27 
  28 import com.apple.eawt.FullScreenAdapter;
  29 import com.apple.eawt.FullScreenUtilities;
  30 import com.apple.eawt.event.FullScreenEvent;
  31 import java.awt.*;
  32 import java.awt.Dialog.ModalityType;
  33 import java.awt.event.*;
  34 import java.beans.*;
  35 import java.lang.reflect.InvocationTargetException;


  36 
  37 import javax.swing.*;
  38 
  39 import sun.awt.*;
  40 import sun.awt.AWTAccessor.ComponentAccessor;
  41 import sun.java2d.SurfaceData;
  42 import sun.java2d.opengl.CGLSurfaceData;
  43 import sun.lwawt.*;
  44 import sun.util.logging.PlatformLogger;
  45 
  46 import com.apple.laf.*;
  47 import com.apple.laf.ClientPropertyApplicator.Property;
  48 import com.sun.awt.AWTUtilities;
  49 import sun.lwawt.LWWindowPeer.PeerType;
  50 
  51 public class CPlatformWindow extends CFRetainedResource implements PlatformWindow {
  52     private native long nativeCreateNSWindow(long nsViewPtr,long ownerPtr, long styleBits, double x, double y, double w, double h);
  53     private static native void nativeSetNSWindowStyleBits(long nsWindowPtr, int mask, int data);
  54     private static native void nativeSetNSWindowMenuBar(long nsWindowPtr, long menuBarPtr);
  55     private static native Insets nativeGetNSWindowInsets(long nsWindowPtr);


1046         if (blocker == null) {
1047             return false;
1048         }
1049 
1050         if (blocker instanceof CPrinterDialogPeer) {
1051             return true;
1052         }
1053 
1054         CPlatformWindow pWindow = (CPlatformWindow)blocker.getPlatformWindow();
1055 
1056         pWindow.orderAboveSiblings();
1057 
1058         final long nsWindowPtr = pWindow.getNSWindowPtr();
1059         CWrapper.NSWindow.orderFrontRegardless(nsWindowPtr);
1060         CWrapper.NSWindow.makeKeyAndOrderFront(nsWindowPtr);
1061         CWrapper.NSWindow.makeMainWindow(nsWindowPtr);
1062 
1063         return true;
1064     }
1065 
1066     private void orderAboveSiblings() {
1067         if (owner == null) {
1068             return;





1069         }
1070 
1071         // NOTE: the logic will fail if we have a hierarchy like:
1072         //       visible root owner
1073         //          invisible owner
1074         //              visible dialog
1075         // However, this is an unlikely scenario for real life apps
1076         if (owner.isVisible()) {
1077             // Recursively pop up the windows from the very bottom so that only
1078             // the very top-most one becomes the main window
1079             owner.orderAboveSiblings();
1080 
1081             // Order the window to front of the stack of child windows
1082             final long nsWindowSelfPtr = getNSWindowPtr();
1083             final long nsWindowOwnerPtr = owner.getNSWindowPtr();
1084             CWrapper.NSWindow.orderFront(nsWindowOwnerPtr);
1085             CWrapper.NSWindow.orderWindow(nsWindowSelfPtr, CWrapper.NSWindow.NSWindowAbove, nsWindowOwnerPtr);
1086         }
1087 
1088         applyWindowLevel(target);



































1089     }
1090 
1091     protected void applyWindowLevel(Window target) {
1092         if (target.isAlwaysOnTop() && target.getType() != Window.Type.POPUP) {
1093             CWrapper.NSWindow.setLevel(getNSWindowPtr(), CWrapper.NSWindow.NSFloatingWindowLevel);
1094         } else if (target.getType() == Window.Type.POPUP) {
1095             CWrapper.NSWindow.setLevel(getNSWindowPtr(), CWrapper.NSWindow.NSPopUpMenuWindowLevel);
1096         }
1097     }
1098 
1099     // ----------------------------------------------------------------------
1100     //                          NATIVE CALLBACKS
1101     // ----------------------------------------------------------------------
1102 
1103     private void windowDidBecomeMain() {
1104         if (checkBlockingAndOrder()) return;
1105         // If it's not blocked, make sure it's above its siblings
1106         orderAboveSiblings();
1107     }
1108 


  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 sun.lwawt.macosx;
  27 
  28 import com.apple.eawt.FullScreenAdapter;
  29 import com.apple.eawt.FullScreenUtilities;
  30 import com.apple.eawt.event.FullScreenEvent;
  31 import java.awt.*;
  32 import java.awt.Dialog.ModalityType;
  33 import java.awt.event.*;
  34 import java.beans.*;
  35 import java.lang.reflect.InvocationTargetException;
  36 import java.util.ArrayList;
  37 import java.util.Arrays;
  38 
  39 import javax.swing.*;
  40 
  41 import sun.awt.*;
  42 import sun.awt.AWTAccessor.ComponentAccessor;
  43 import sun.java2d.SurfaceData;
  44 import sun.java2d.opengl.CGLSurfaceData;
  45 import sun.lwawt.*;
  46 import sun.util.logging.PlatformLogger;
  47 
  48 import com.apple.laf.*;
  49 import com.apple.laf.ClientPropertyApplicator.Property;
  50 import com.sun.awt.AWTUtilities;
  51 import sun.lwawt.LWWindowPeer.PeerType;
  52 
  53 public class CPlatformWindow extends CFRetainedResource implements PlatformWindow {
  54     private native long nativeCreateNSWindow(long nsViewPtr,long ownerPtr, long styleBits, double x, double y, double w, double h);
  55     private static native void nativeSetNSWindowStyleBits(long nsWindowPtr, int mask, int data);
  56     private static native void nativeSetNSWindowMenuBar(long nsWindowPtr, long menuBarPtr);
  57     private static native Insets nativeGetNSWindowInsets(long nsWindowPtr);


1048         if (blocker == null) {
1049             return false;
1050         }
1051 
1052         if (blocker instanceof CPrinterDialogPeer) {
1053             return true;
1054         }
1055 
1056         CPlatformWindow pWindow = (CPlatformWindow)blocker.getPlatformWindow();
1057 
1058         pWindow.orderAboveSiblings();
1059 
1060         final long nsWindowPtr = pWindow.getNSWindowPtr();
1061         CWrapper.NSWindow.orderFrontRegardless(nsWindowPtr);
1062         CWrapper.NSWindow.makeKeyAndOrderFront(nsWindowPtr);
1063         CWrapper.NSWindow.makeMainWindow(nsWindowPtr);
1064 
1065         return true;
1066     }
1067 
1068     private boolean isOneOfOwnersOrSelf(CPlatformWindow window) {
1069         while (window != null) {
1070             if (this == window) {
1071                 return true;
1072             }
1073             window = window.owner;
1074         }
1075         return false;
1076     }
1077 
1078     private CPlatformWindow getRootOwner() {
1079         CPlatformWindow rootOwner = this;
1080         while (rootOwner.owner != null) {
1081             rootOwner = rootOwner.owner;
1082         }
1083         return rootOwner;









1084     }
1085 
1086     private void orderAboveSiblings() {
1087         CPlatformWindow rootOwner = getRootOwner();
1088         CWrapper.NSWindow.orderFront(rootOwner.getNSWindowPtr());
1089         orderAboveSiblingsImpl(rootOwner.target.getOwnedWindows(), this);
1090     }
1091 
1092     private void orderAboveSiblingsImpl(Window[] windows, CPlatformWindow activeWindow) {
1093         ArrayList<Window> childWindows = new ArrayList<Window>();
1094 
1095         final ComponentAccessor acc = AWTAccessor.getComponentAccessor();
1096 
1097         // Go through the list of windows and order them above their nearest parent.
1098         for (Window w : windows) {
1099             final Object p = acc.getPeer(w);
1100             if (p instanceof LWWindowPeer) {
1101                 CPlatformWindow pw = (CPlatformWindow)((LWWindowPeer)p).getPlatformWindow();
1102                 if (pw != null && pw.isVisible()) {
1103                     // If a window is active window or one of active window parent, the window should be ordered
1104                     // above its siblings; otherwise the window is just ordered above its nearest parent.
1105                     if (pw.isOneOfOwnersOrSelf(activeWindow)) {
1106                         CWrapper.NSWindow.orderFront(pw.getNSWindowPtr());
1107                     } else {
1108                         CWrapper.NSWindow.orderWindow(pw.getNSWindowPtr(), CWrapper.NSWindow.NSWindowAbove,
1109                                 pw.owner.getNSWindowPtr());
1110                     }
1111                     pw.applyWindowLevel(w);
1112                     // Collect information about child windows and store it for future use.
1113                     java.util.List<Window> pwChildWindows = new ArrayList<Window>(Arrays.asList(w.getOwnedWindows()));
1114                     childWindows.addAll(pwChildWindows);
1115                 }
1116             }
1117         }
1118         // Start new iteration, if any.
1119         if (!childWindows.isEmpty()) {
1120             orderAboveSiblingsImpl(childWindows.toArray(new Window[childWindows.size()]), activeWindow);
1121         }
1122     }
1123 
1124     protected void applyWindowLevel(Window target) {
1125         if (target.isAlwaysOnTop() && target.getType() != Window.Type.POPUP) {
1126             CWrapper.NSWindow.setLevel(getNSWindowPtr(), CWrapper.NSWindow.NSFloatingWindowLevel);
1127         } else if (target.getType() == Window.Type.POPUP) {
1128             CWrapper.NSWindow.setLevel(getNSWindowPtr(), CWrapper.NSWindow.NSPopUpMenuWindowLevel);
1129         }
1130     }
1131 
1132     // ----------------------------------------------------------------------
1133     //                          NATIVE CALLBACKS
1134     // ----------------------------------------------------------------------
1135 
1136     private void windowDidBecomeMain() {
1137         if (checkBlockingAndOrder()) return;
1138         // If it's not blocked, make sure it's above its siblings
1139         orderAboveSiblings();
1140     }
1141 
< prev index next >