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() {
|