< 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 >