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

Print this page




 192             if (root == null || (LWWindowPeer)root.getPeer() == null) return null;
 193             return (CPlatformWindow)((LWWindowPeer)root.getPeer()).getPlatformWindow();
 194         }
 195     };
 196 
 197     // Bounds of the native widget but in the Java coordinate system.
 198     // In order to keep it up-to-date we will update them on
 199     // 1) setting native bounds via nativeSetBounds() call
 200     // 2) getting notification from the native level via deliverMoveResizeEvent()
 201     private Rectangle nativeBounds;
 202     private volatile boolean isFullScreenMode = false;
 203 
 204     private Window target;
 205     private LWWindowPeer peer;
 206     private CPlatformView contentView;
 207     private CPlatformWindow owner;
 208     private boolean visible = false; // visibility status from native perspective
 209     private boolean undecorated; // initialized in getInitialStyleBits()
 210     private Rectangle normalBounds = null; // not-null only for undecorated maximized windows
 211     private CPlatformResponder responder;

 212 
 213     public CPlatformWindow(final PeerType peerType) {
 214         super(0, true);
 215         assert (peerType == PeerType.SIMPLEWINDOW || peerType == PeerType.DIALOG || peerType == PeerType.FRAME);
 216     }
 217 
 218     /*
 219      * Delegate initialization (create native window and all the
 220      * related resources).
 221      */
 222     @Override // PlatformWindow
 223     public void initialize(Window _target, LWWindowPeer _peer, PlatformWindow _owner) {
 224         this.peer = _peer;
 225         this.target = _target;
 226         if (_owner instanceof CPlatformWindow) {
 227             this.owner = (CPlatformWindow)_owner;
 228         }
 229 
 230         final int styleBits = getInitialStyleBits();
 231 


 450         return gd;
 451     }
 452 
 453     @Override // PlatformWindow
 454     public SurfaceData getScreenSurface() {
 455         // TODO: not implemented
 456         return null;
 457     }
 458 
 459     @Override // PlatformWindow
 460     public SurfaceData replaceSurfaceData() {
 461         return contentView.replaceSurfaceData();
 462     }
 463 
 464     @Override // PlatformWindow
 465     public void setBounds(int x, int y, int w, int h) {
 466 //        assert CThreading.assertEventQueue();
 467         nativeSetNSWindowBounds(getNSWindowPtr(), x, y, w, h);
 468     }
 469 




 470     private void zoom() {
 471         if (!undecorated) {

 472             CWrapper.NSWindow.zoom(getNSWindowPtr());
 473         } else {
 474             // OS X handles -zoom incorrectly for undecorated windows
 475             final boolean isZoomed = this.normalBounds == null;
 476             deliverZoom(isZoomed);
 477 
 478             Rectangle toBounds;
 479             if (isZoomed) {
 480                 this.normalBounds = peer.getBounds();
 481                 long screen = CWrapper.NSWindow.screen(getNSWindowPtr());
 482                 toBounds = CWrapper.NSScreen.visibleFrame(screen).getBounds();
 483                 // Flip the y coordinate
 484                 Rectangle frame = CWrapper.NSScreen.frame(screen).getBounds();
 485                 toBounds.y = frame.height - toBounds.y - toBounds.height;
 486             } else {
 487                 toBounds = normalBounds;
 488                 this.normalBounds = null;
 489             }
 490             setBounds(toBounds.x, toBounds.y, toBounds.width, toBounds.height);
 491         }
 492     }
 493 
 494     private boolean isVisible() {
 495         return this.visible;
 496     }
 497 
 498     @Override // PlatformWindow
 499     public void setVisible(boolean visible) {
 500         final long nsWindowPtr = getNSWindowPtr();
 501 
 502         // 1. Process parent-child relationship when hiding
 503         if (!visible) {
 504             // 1a. Unparent my children
 505             for (Window w : target.getOwnedWindows()) {
 506                 WindowPeer p = (WindowPeer)w.getPeer();
 507                 if (p instanceof LWWindowPeer) {
 508                     CPlatformWindow pw = (CPlatformWindow)((LWWindowPeer)p).getPlatformWindow();
 509                     if (pw != null && pw.isVisible()) {
 510                         CWrapper.NSWindow.removeChildWindow(nsWindowPtr, pw.getNSWindowPtr());
 511                     }
 512                 }
 513             }
 514 
 515             // 1b. Unparent myself
 516             if (owner != null && owner.isVisible()) {
 517                 CWrapper.NSWindow.removeChildWindow(owner.getNSWindowPtr(), nsWindowPtr);
 518             }
 519         }
 520 
 521         // 2. Configure stuff
 522         updateIconImages();
 523         updateFocusabilityForAutoRequestFocus(false);
 524 
 525         // 3. Manage the extended state when hiding
 526         if (!visible) {
 527             // Cancel out the current native state of the window
 528             switch (peer.getState()) {
 529                 case Frame.ICONIFIED:
 530                     CWrapper.NSWindow.deminiaturize(nsWindowPtr);
 531                     break;
 532                 case Frame.MAXIMIZED_BOTH:
 533                     zoom();
 534                     break;
 535             }
 536         }
 537 
 538         // 4. Actually show or hide the window
 539         LWWindowPeer blocker = peer.getBlocker();
 540         if (blocker == null || !visible) {
 541             // If it ain't blocked, or is being hidden, go regular way
 542             if (visible) {
 543                 CWrapper.NSWindow.makeFirstResponder(nsWindowPtr, contentView.getAWTView());
 544 
 545                 boolean isPopup = (target.getType() == Window.Type.POPUP);
 546                 if (isPopup) {
 547                     // Popups in applets don't activate applet's process
 548                     CWrapper.NSWindow.orderFrontRegardless(nsWindowPtr);
 549                 } else {
 550                     CWrapper.NSWindow.orderFront(nsWindowPtr);
 551                 }
 552 
 553                 boolean isKeyWindow = CWrapper.NSWindow.isKeyWindow(nsWindowPtr);
 554                 if (!isKeyWindow) {
 555                     CWrapper.NSWindow.makeKeyWindow(nsWindowPtr);
 556                 }
 557             } else {
 558                 CWrapper.NSWindow.orderOut(nsWindowPtr);
 559             }
 560         } else {
 561             // otherwise, put it in a proper z-order
 562             CWrapper.NSWindow.orderWindow(nsWindowPtr, CWrapper.NSWindow.NSWindowBelow,
 563                     ((CPlatformWindow)blocker.getPlatformWindow()).getNSWindowPtr());
 564         }
 565         this.visible = visible;
 566 
 567         // 5. Manage the extended state when showing
 568         if (visible) {
 569             // Re-apply the extended state as expected in shared code
 570             if (target instanceof Frame) {
 571                 switch (((Frame)target).getExtendedState()) {
 572                     case Frame.ICONIFIED:
 573                         CWrapper.NSWindow.miniaturize(nsWindowPtr);
 574                         break;
 575                     case Frame.MAXIMIZED_BOTH:

 576                         zoom();






 577                         break;
 578                 }
 579             }
 580         }
 581 
 582         nativeSynthesizeMouseEnteredExitedEvents(nsWindowPtr);
 583 
 584         // 6. Configure stuff #2
 585         updateFocusabilityForAutoRequestFocus(true);
 586 
 587         // 7. Manage parent-child relationship when showing
 588         if (visible) {
 589             // 7a. Add myself as a child
 590             if (owner != null && owner.isVisible()) {
 591                 CWrapper.NSWindow.addChildWindow(owner.getNSWindowPtr(), nsWindowPtr, CWrapper.NSWindow.NSWindowAbove);
 592                 if (target.isAlwaysOnTop()) {
 593                     CWrapper.NSWindow.setLevel(nsWindowPtr, CWrapper.NSWindow.NSFloatingWindowLevel);
 594                 }
 595             }
 596 
 597             // 7b. Add my own children to myself
 598             for (Window w : target.getOwnedWindows()) {
 599                 WindowPeer p = (WindowPeer)w.getPeer();
 600                 if (p instanceof LWWindowPeer) {
 601                     CPlatformWindow pw = (CPlatformWindow)((LWWindowPeer)p).getPlatformWindow();
 602                     if (pw != null && pw.isVisible()) {
 603                         CWrapper.NSWindow.addChildWindow(nsWindowPtr, pw.getNSWindowPtr(), CWrapper.NSWindow.NSWindowAbove);
 604                         if (w.isAlwaysOnTop()) {
 605                             CWrapper.NSWindow.setLevel(pw.getNSWindowPtr(), CWrapper.NSWindow.NSFloatingWindowLevel);
 606                         }
 607                     }
 608                 }
 609             }
 610         }
 611 
 612         // 8. Deal with the blocker of the window being shown
 613         if (blocker != null && visible) {
 614             // Make sure the blocker is above its siblings
 615             ((CPlatformWindow)blocker.getPlatformWindow()).orderAboveSiblings();
 616         }
 617     }
 618 
 619     @Override // PlatformWindow
 620     public void setTitle(String title) {
 621         nativeSetNSWindowTitle(getNSWindowPtr(), title);
 622     }
 623 
 624     // Should be called on every window key property change.
 625     @Override // PlatformWindow
 626     public void updateIconImages() {
 627         final long nsWindowPtr = getNSWindowPtr();
 628         final CImage cImage = getImageForTarget();
 629         nativeSetNSWindowMinimizedIcon(nsWindowPtr, cImage == null ? 0L : cImage.ptr);
 630     }
 631 
 632     public long getNSWindowPtr() {




 192             if (root == null || (LWWindowPeer)root.getPeer() == null) return null;
 193             return (CPlatformWindow)((LWWindowPeer)root.getPeer()).getPlatformWindow();
 194         }
 195     };
 196 
 197     // Bounds of the native widget but in the Java coordinate system.
 198     // In order to keep it up-to-date we will update them on
 199     // 1) setting native bounds via nativeSetBounds() call
 200     // 2) getting notification from the native level via deliverMoveResizeEvent()
 201     private Rectangle nativeBounds;
 202     private volatile boolean isFullScreenMode = false;
 203 
 204     private Window target;
 205     private LWWindowPeer peer;
 206     private CPlatformView contentView;
 207     private CPlatformWindow owner;
 208     private boolean visible = false; // visibility status from native perspective
 209     private boolean undecorated; // initialized in getInitialStyleBits()
 210     private Rectangle normalBounds = null; // not-null only for undecorated maximized windows
 211     private CPlatformResponder responder;
 212     private volatile boolean zoomed = false; // from native perspective
 213 
 214     public CPlatformWindow(final PeerType peerType) {
 215         super(0, true);
 216         assert (peerType == PeerType.SIMPLEWINDOW || peerType == PeerType.DIALOG || peerType == PeerType.FRAME);
 217     }
 218 
 219     /*
 220      * Delegate initialization (create native window and all the
 221      * related resources).
 222      */
 223     @Override // PlatformWindow
 224     public void initialize(Window _target, LWWindowPeer _peer, PlatformWindow _owner) {
 225         this.peer = _peer;
 226         this.target = _target;
 227         if (_owner instanceof CPlatformWindow) {
 228             this.owner = (CPlatformWindow)_owner;
 229         }
 230 
 231         final int styleBits = getInitialStyleBits();
 232 


 451         return gd;
 452     }
 453 
 454     @Override // PlatformWindow
 455     public SurfaceData getScreenSurface() {
 456         // TODO: not implemented
 457         return null;
 458     }
 459 
 460     @Override // PlatformWindow
 461     public SurfaceData replaceSurfaceData() {
 462         return contentView.replaceSurfaceData();
 463     }
 464 
 465     @Override // PlatformWindow
 466     public void setBounds(int x, int y, int w, int h) {
 467 //        assert CThreading.assertEventQueue();
 468         nativeSetNSWindowBounds(getNSWindowPtr(), x, y, w, h);
 469     }
 470 
 471     private boolean isZoomed() {
 472         return zoomed || this.normalBounds != null;
 473     }
 474 
 475     private void zoom() {
 476         if (!undecorated) {
 477             zoomed = !zoomed;
 478             CWrapper.NSWindow.zoom(getNSWindowPtr());
 479         } else {
 480             // OS X handles -zoom incorrectly for undecorated windows
 481             final boolean isZoomed = this.normalBounds == null;
 482             deliverZoom(isZoomed);
 483 
 484             Rectangle toBounds;
 485             if (isZoomed) {
 486                 this.normalBounds = peer.getBounds();
 487                 long screen = CWrapper.NSWindow.screen(getNSWindowPtr());
 488                 toBounds = CWrapper.NSScreen.visibleFrame(screen).getBounds();
 489                 // Flip the y coordinate
 490                 Rectangle frame = CWrapper.NSScreen.frame(screen).getBounds();
 491                 toBounds.y = frame.height - toBounds.y - toBounds.height;
 492             } else {
 493                 toBounds = normalBounds;
 494                 this.normalBounds = null;
 495             }
 496             setBounds(toBounds.x, toBounds.y, toBounds.width, toBounds.height);
 497         }
 498     }
 499 
 500     private boolean isVisible() {
 501         return this.visible;
 502     }
 503 
 504     @Override // PlatformWindow
 505     public void setVisible(boolean visible) {
 506         final long nsWindowPtr = getNSWindowPtr();
 507 
 508         // Process parent-child relationship when hiding
 509         if (!visible) {
 510             // Unparent my children
 511             for (Window w : target.getOwnedWindows()) {
 512                 WindowPeer p = (WindowPeer)w.getPeer();
 513                 if (p instanceof LWWindowPeer) {
 514                     CPlatformWindow pw = (CPlatformWindow)((LWWindowPeer)p).getPlatformWindow();
 515                     if (pw != null && pw.isVisible()) {
 516                         CWrapper.NSWindow.removeChildWindow(nsWindowPtr, pw.getNSWindowPtr());
 517                     }
 518                 }
 519             }
 520 
 521             // Unparent myself
 522             if (owner != null && owner.isVisible()) {
 523                 CWrapper.NSWindow.removeChildWindow(owner.getNSWindowPtr(), nsWindowPtr);
 524             }
 525         }
 526 
 527         // Configure stuff
 528         updateIconImages();
 529         updateFocusabilityForAutoRequestFocus(false);
 530 
 531         // Actually show or hide the window













 532         LWWindowPeer blocker = peer.getBlocker();
 533         if (blocker == null || !visible) {
 534             // If it ain't blocked, or is being hidden, go regular way
 535             if (visible) {
 536                 CWrapper.NSWindow.makeFirstResponder(nsWindowPtr, contentView.getAWTView());
 537 
 538                 boolean isPopup = (target.getType() == Window.Type.POPUP);
 539                 if (isPopup) {
 540                     // Popups in applets don't activate applet's process
 541                     CWrapper.NSWindow.orderFrontRegardless(nsWindowPtr);
 542                 } else {
 543                     CWrapper.NSWindow.orderFront(nsWindowPtr);
 544                 }
 545 
 546                 boolean isKeyWindow = CWrapper.NSWindow.isKeyWindow(nsWindowPtr);
 547                 if (!isKeyWindow) {
 548                     CWrapper.NSWindow.makeKeyWindow(nsWindowPtr);
 549                 }
 550             } else {
 551                 CWrapper.NSWindow.orderOut(nsWindowPtr);
 552             }
 553         } else {
 554             // otherwise, put it in a proper z-order
 555             CWrapper.NSWindow.orderWindow(nsWindowPtr, CWrapper.NSWindow.NSWindowBelow,
 556                     ((CPlatformWindow)blocker.getPlatformWindow()).getNSWindowPtr());
 557         }
 558         this.visible = visible;
 559 
 560         // Manage the extended state when showing
 561         if (visible) {
 562             // Apply the extended state as expected in shared code
 563             if (target instanceof Frame) {
 564                 switch (((Frame)target).getExtendedState()) {
 565                     case Frame.ICONIFIED:
 566                         CWrapper.NSWindow.miniaturize(nsWindowPtr);
 567                         break;
 568                     case Frame.MAXIMIZED_BOTH:
 569                         if (!isZoomed()) {
 570                             zoom();
 571                         }
 572                         break;
 573                     default: // NORMAL
 574                         if (isZoomed()) {
 575                             zoom();
 576                         }
 577                         break;
 578                 }
 579             }
 580         }
 581 
 582         nativeSynthesizeMouseEnteredExitedEvents(nsWindowPtr);
 583 
 584         // Configure stuff #2
 585         updateFocusabilityForAutoRequestFocus(true);
 586 
 587         // Manage parent-child relationship when showing
 588         if (visible) {
 589             // Add myself as a child
 590             if (owner != null && owner.isVisible()) {
 591                 CWrapper.NSWindow.addChildWindow(owner.getNSWindowPtr(), nsWindowPtr, CWrapper.NSWindow.NSWindowAbove);
 592                 if (target.isAlwaysOnTop()) {
 593                     CWrapper.NSWindow.setLevel(nsWindowPtr, CWrapper.NSWindow.NSFloatingWindowLevel);
 594                 }
 595             }
 596 
 597             // Add my own children to myself
 598             for (Window w : target.getOwnedWindows()) {
 599                 WindowPeer p = (WindowPeer)w.getPeer();
 600                 if (p instanceof LWWindowPeer) {
 601                     CPlatformWindow pw = (CPlatformWindow)((LWWindowPeer)p).getPlatformWindow();
 602                     if (pw != null && pw.isVisible()) {
 603                         CWrapper.NSWindow.addChildWindow(nsWindowPtr, pw.getNSWindowPtr(), CWrapper.NSWindow.NSWindowAbove);
 604                         if (w.isAlwaysOnTop()) {
 605                             CWrapper.NSWindow.setLevel(pw.getNSWindowPtr(), CWrapper.NSWindow.NSFloatingWindowLevel);
 606                         }
 607                     }
 608                 }
 609             }
 610         }
 611 
 612         // Deal with the blocker of the window being shown
 613         if (blocker != null && visible) {
 614             // Make sure the blocker is above its siblings
 615             ((CPlatformWindow)blocker.getPlatformWindow()).orderAboveSiblings();
 616         }
 617     }
 618 
 619     @Override // PlatformWindow
 620     public void setTitle(String title) {
 621         nativeSetNSWindowTitle(getNSWindowPtr(), title);
 622     }
 623 
 624     // Should be called on every window key property change.
 625     @Override // PlatformWindow
 626     public void updateIconImages() {
 627         final long nsWindowPtr = getNSWindowPtr();
 628         final CImage cImage = getImageForTarget();
 629         nativeSetNSWindowMinimizedIcon(nsWindowPtr, cImage == null ? 0L : cImage.ptr);
 630     }
 631 
 632     public long getNSWindowPtr() {