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 |