< prev index next >
src/java.desktop/macosx/native/libawt_lwawt/awt/AWTWindow.m
Print this page
*** 178,187 ****
--- 178,188 ----
@synthesize styleBits;
@synthesize isEnabled;
@synthesize ownerWindow;
@synthesize preFullScreenLevel;
@synthesize standardFrame;
+ @synthesize isMinimizing;
- (void) updateMinMaxSize:(BOOL)resizable {
if (resizable) {
[self.nsWindow setMinSize:self.javaMinSize];
[self.nsWindow setMaxSize:self.javaMaxSize];
*** 302,311 ****
--- 303,313 ----
if (self.nsWindow == nil) return nil; // no hope either
[self.nsWindow release]; // the property retains the object already
self.isEnabled = YES;
+ self.isMinimizing = NO;
self.javaPlatformWindow = platformWindow;
self.styleBits = bits;
self.ownerWindow = owner;
[self setPropertiesForStyleBits:styleBits mask:MASK(_METHOD_PROP_BITMASK)];
*** 421,430 ****
--- 423,490 ----
self.nsWindow = nil;
self.ownerWindow = nil;
[super dealloc];
}
+ // Tests wheather the corresponding Java paltform window is visible or not
+ + (BOOL) isJavaPlatformWindowVisible:(NSWindow *)window {
+ BOOL isVisible = NO;
+
+ if ([AWTWindow isAWTWindow:window] && [window delegate] != nil) {
+ AWTWindow *awtWindow = (AWTWindow *)[window delegate];
+ [AWTToolkit eventCountPlusPlus];
+
+ JNIEnv *env = [ThreadUtilities getJNIEnv];
+ jobject platformWindow = [awtWindow.javaPlatformWindow jObjectWithEnv:env];
+ if (platformWindow != NULL) {
+ static JNF_MEMBER_CACHE(jm_isVisible, jc_CPlatformWindow, "isVisible", "()Z");
+ isVisible = JNFCallBooleanMethod(env, platformWindow, jm_isVisible) == JNI_TRUE ? YES : NO;
+ (*env)->DeleteLocalRef(env, platformWindow);
+
+ }
+ }
+ return isVisible;
+ }
+
+ // Orders window's childs based on the current focus state
+ - (void) orderChilds:(BOOL)focus {
+ AWT_ASSERT_APPKIT_THREAD;
+
+ if (self.isMinimizing) {
+ // Do not perform any ordering, if iconify is in progress
+ return;
+ }
+
+ NSEnumerator *windowEnumerator = [[NSApp windows]objectEnumerator];
+ NSWindow *window;
+ while ((window = [windowEnumerator nextObject]) != nil) {
+ if ([AWTWindow isJavaPlatformWindowVisible:window]) {
+ AWTWindow *awtWindow = (AWTWindow *)[window delegate];
+ AWTWindow *owner = awtWindow.ownerWindow;
+ if (IS(awtWindow.styleBits, ALWAYS_ON_TOP)) {
+ // Do not order 'always on top' windows
+ continue;
+ }
+ while (awtWindow.ownerWindow != nil) {
+ if (awtWindow.ownerWindow == self) {
+ if (focus) {
+ // Place the child above the owner
+ [window setLevel:NSFloatingWindowLevel];
+ } else {
+ // Place the child to the owner's level
+ [window setLevel:NSNormalWindowLevel];
+ }
+ // Adjust ordering
+ [window orderWindow:NSWindowAbove relativeTo:[owner.nsWindow windowNumber]];
+ break;
+ }
+ awtWindow = awtWindow.ownerWindow;
+ }
+ }
+ }
+ }
+
// NSWindow overrides
- (BOOL) canBecomeKeyWindow {
AWT_ASSERT_APPKIT_THREAD;
return self.isEnabled && IS(self.styleBits, SHOULD_BECOME_KEY);
}
*** 509,518 ****
--- 569,602 ----
defaultFrame:(NSRect)newFrame {
return [self standardFrame];
}
+ // Hides/shows window's childs during iconify/de-iconify operation
+ - (void) iconifyChilds:(BOOL)iconify {
+ AWT_ASSERT_APPKIT_THREAD;
+
+ NSEnumerator *windowEnumerator = [[NSApp windows]objectEnumerator];
+ NSWindow *window;
+ while ((window = [windowEnumerator nextObject]) != nil) {
+ if ([AWTWindow isJavaPlatformWindowVisible:window]) {
+ AWTWindow *awtWindow = (AWTWindow *)[window delegate];
+ while (awtWindow.ownerWindow != nil) {
+ if (awtWindow.ownerWindow == self) {
+ if (iconify) {
+ [window orderOut:window];
+ } else {
+ [window orderFront:window];
+ }
+ break;
+ }
+ awtWindow = awtWindow.ownerWindow;
+ }
+ }
+ }
+ }
+
- (void) _deliverIconify:(BOOL)iconify {
AWT_ASSERT_APPKIT_THREAD;
[AWTToolkit eventCountPlusPlus];
JNIEnv *env = [ThreadUtilities getJNIEnv];
*** 522,541 ****
--- 606,637 ----
JNFCallVoidMethod(env, platformWindow, jm_deliverIconify, iconify);
(*env)->DeleteLocalRef(env, platformWindow);
}
}
+ - (void)windowWillMiniaturize:(NSNotification *)notification {
+ AWT_ASSERT_APPKIT_THREAD;
+
+ self.isMinimizing = YES;
+ // Excplicitly make myself a key window to avoid possible
+ // negative visual effects during iconify operation
+ [self.nsWindow makeKeyAndOrderFront:self.nsWindow];
+ [self iconifyChilds:YES];
+ }
+
- (void)windowDidMiniaturize:(NSNotification *)notification {
AWT_ASSERT_APPKIT_THREAD;
[self _deliverIconify:JNI_TRUE];
+ self.isMinimizing = NO;
}
- (void)windowDidDeminiaturize:(NSNotification *)notification {
AWT_ASSERT_APPKIT_THREAD;
[self _deliverIconify:JNI_FALSE];
+ [self iconifyChilds:NO];
}
- (void) _deliverWindowFocusEvent:(BOOL)focused oppositeWindow:(AWTWindow *)opposite {
//AWT_ASSERT_APPKIT_THREAD;
JNIEnv *env = [ThreadUtilities getJNIEnvUncached];
*** 577,586 ****
--- 673,683 ----
[CMenuBar activate:menuBar modallyDisabled:isDisabled];
[AWTWindow setLastKeyWindow:nil];
[self _deliverWindowFocusEvent:YES oppositeWindow: opposite];
+ [self orderChilds:YES];
}
- (void) windowDidResignKey: (NSNotification *) notification {
// TODO: check why sometimes at start is invoked *not* on AppKit main thread.
AWT_ASSERT_APPKIT_THREAD;
*** 604,613 ****
--- 701,711 ----
} else {
[AWTWindow setLastKeyWindow: nil];
}
[self _deliverWindowFocusEvent:NO oppositeWindow: opposite];
+ [self orderChilds:NO];
}
- (void) windowDidBecomeMain: (NSNotification *) notification {
AWT_ASSERT_APPKIT_THREAD;
[AWTToolkit eventCountPlusPlus];
< prev index next >