< 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         // 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 
< prev index next >