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 // Recursively pop up the windows from the very bottom, (i.e. root owner) so that 1088 // the windows are ordered above their nearest owner; ancestors of the window, 1089 // which is going to become 'main window', are placed above their siblings. 1090 CPlatformWindow rootOwner = getRootOwner(); 1091 if (rootOwner.isVisible()) { 1092 CWrapper.NSWindow.orderFront(rootOwner.getNSWindowPtr()); 1093 } 1094 orderAboveSiblingsImpl(rootOwner.target.getOwnedWindows()); 1095 } 1096 1097 private void orderAboveSiblingsImpl(Window[] windows) { 1098 ArrayList<Window> childWindows = new ArrayList<Window>(); 1099 1100 final ComponentAccessor acc = AWTAccessor.getComponentAccessor(); 1101 1102 // Go through the list of windows and perform ordering. 1103 for (Window w : windows) { 1104 final Object p = acc.getPeer(w); 1105 if (p instanceof LWWindowPeer) { 1106 CPlatformWindow pw = (CPlatformWindow)((LWWindowPeer)p).getPlatformWindow(); 1107 if (pw != null && pw.isVisible()) { 1108 // If the window is one of ancestors of 'main window' or is going to become main by itself, 1109 // the window should be ordered above its siblings; otherwise the window is just ordered 1110 // above its nearest parent. 1111 if (pw.isOneOfOwnersOrSelf(this)) { 1112 CWrapper.NSWindow.orderFront(pw.getNSWindowPtr()); 1113 } else { 1114 CWrapper.NSWindow.orderWindow(pw.getNSWindowPtr(), CWrapper.NSWindow.NSWindowAbove, 1115 pw.owner.getNSWindowPtr()); 1116 } 1117 pw.applyWindowLevel(w); 1118 } 1119 } 1120 // Retrieve the child windows for each window from the list and store them for future use. 1121 // Note: we collect data about child windows even for invisible owners, since they may have 1122 // visible children. 1123 java.util.List<Window> pwChildWindows = new ArrayList<Window>(Arrays.asList(w.getOwnedWindows())); 1124 childWindows.addAll(pwChildWindows); 1125 } 1126 // If some windows, which have just been ordered, have any child windows, let's start new iteration 1127 // and order these child windows. 1128 if (!childWindows.isEmpty()) { 1129 orderAboveSiblingsImpl(childWindows.toArray(new Window[childWindows.size()])); 1130 } 1131 } 1132 1133 protected void applyWindowLevel(Window target) { 1134 if (target.isAlwaysOnTop() && target.getType() != Window.Type.POPUP) { 1135 CWrapper.NSWindow.setLevel(getNSWindowPtr(), CWrapper.NSWindow.NSFloatingWindowLevel); 1136 } else if (target.getType() == Window.Type.POPUP) { 1137 CWrapper.NSWindow.setLevel(getNSWindowPtr(), CWrapper.NSWindow.NSPopUpMenuWindowLevel); 1138 } 1139 } 1140 1141 // ---------------------------------------------------------------------- 1142 // NATIVE CALLBACKS 1143 // ---------------------------------------------------------------------- 1144 1145 private void windowDidBecomeMain() { 1146 if (checkBlockingAndOrder()) return; 1147 // If it's not blocked, make sure it's above its siblings 1148 orderAboveSiblings(); 1149 } 1150 |