提交 0bac9fca 编写于 作者: S serb

8017189: [macosx] AWT program menu disabled on Mac

Reviewed-by: leonidr, anthony
上级 5fc2c062
...@@ -47,7 +47,7 @@ import com.apple.laf.ClientPropertyApplicator.Property; ...@@ -47,7 +47,7 @@ import com.apple.laf.ClientPropertyApplicator.Property;
import com.sun.awt.AWTUtilities; import com.sun.awt.AWTUtilities;
public class CPlatformWindow extends CFRetainedResource implements PlatformWindow { public class CPlatformWindow extends CFRetainedResource implements PlatformWindow {
private native long nativeCreateNSWindow(long nsViewPtr, long styleBits, double x, double y, double w, double h); private native long nativeCreateNSWindow(long nsViewPtr,long ownerPtr, long styleBits, double x, double y, double w, double h);
private static native void nativeSetNSWindowStyleBits(long nsWindowPtr, int mask, int data); private static native void nativeSetNSWindowStyleBits(long nsWindowPtr, int mask, int data);
private static native void nativeSetNSWindowMenuBar(long nsWindowPtr, long menuBarPtr); private static native void nativeSetNSWindowMenuBar(long nsWindowPtr, long menuBarPtr);
private static native Insets nativeGetNSWindowInsets(long nsWindowPtr); private static native Insets nativeGetNSWindowInsets(long nsWindowPtr);
...@@ -230,7 +230,8 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -230,7 +230,8 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
contentView = createContentView(); contentView = createContentView();
contentView.initialize(peer, responder); contentView.initialize(peer, responder);
final long nativeWindowPtr = nativeCreateNSWindow(contentView.getAWTView(), styleBits, 0, 0, 0, 0); final long ownerPtr = owner != null ? owner.getNSWindowPtr() : 0L;
final long nativeWindowPtr = nativeCreateNSWindow(contentView.getAWTView(), ownerPtr, styleBits, 0, 0, 0, 0);
setPtr(nativeWindowPtr); setPtr(nativeWindowPtr);
if (target instanceof javax.swing.RootPaneContainer) { if (target instanceof javax.swing.RootPaneContainer) {
......
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
jint styleBits; jint styleBits;
BOOL isEnabled; BOOL isEnabled;
NSWindow *nsWindow; NSWindow *nsWindow;
AWTWindow *ownerWindow;
} }
// An instance of either AWTWindow_Normal or AWTWindow_Panel // An instance of either AWTWindow_Normal or AWTWindow_Panel
...@@ -51,12 +52,15 @@ ...@@ -51,12 +52,15 @@
@property (nonatomic, retain) JNFWeakJObjectWrapper *javaPlatformWindow; @property (nonatomic, retain) JNFWeakJObjectWrapper *javaPlatformWindow;
@property (nonatomic, retain) CMenuBar *javaMenuBar; @property (nonatomic, retain) CMenuBar *javaMenuBar;
@property (nonatomic, retain) AWTWindow *ownerWindow;
@property (nonatomic) NSSize javaMinSize; @property (nonatomic) NSSize javaMinSize;
@property (nonatomic) NSSize javaMaxSize; @property (nonatomic) NSSize javaMaxSize;
@property (nonatomic) jint styleBits; @property (nonatomic) jint styleBits;
@property (nonatomic) BOOL isEnabled; @property (nonatomic) BOOL isEnabled;
- (id) initWithPlatformWindow:(JNFWeakJObjectWrapper *)javaPlatformWindow - (id) initWithPlatformWindow:(JNFWeakJObjectWrapper *)javaPlatformWindow
ownerWindow:owner
styleBits:(jint)styleBits styleBits:(jint)styleBits
frameRect:(NSRect)frameRect frameRect:(NSRect)frameRect
contentView:(NSView *)contentView; contentView:(NSView *)contentView;
......
...@@ -120,6 +120,7 @@ AWT_NS_WINDOW_IMPLEMENTATION ...@@ -120,6 +120,7 @@ AWT_NS_WINDOW_IMPLEMENTATION
@synthesize javaMaxSize; @synthesize javaMaxSize;
@synthesize styleBits; @synthesize styleBits;
@synthesize isEnabled; @synthesize isEnabled;
@synthesize ownerWindow;
- (void) updateMinMaxSize:(BOOL)resizable { - (void) updateMinMaxSize:(BOOL)resizable {
if (resizable) { if (resizable) {
...@@ -201,6 +202,7 @@ AWT_NS_WINDOW_IMPLEMENTATION ...@@ -201,6 +202,7 @@ AWT_NS_WINDOW_IMPLEMENTATION
} }
- (id) initWithPlatformWindow:(JNFWeakJObjectWrapper *)platformWindow - (id) initWithPlatformWindow:(JNFWeakJObjectWrapper *)platformWindow
ownerWindow:owner
styleBits:(jint)bits styleBits:(jint)bits
frameRect:(NSRect)rect frameRect:(NSRect)rect
contentView:(NSView *)view contentView:(NSView *)view
...@@ -245,6 +247,7 @@ AWT_ASSERT_APPKIT_THREAD; ...@@ -245,6 +247,7 @@ AWT_ASSERT_APPKIT_THREAD;
self.isEnabled = YES; self.isEnabled = YES;
self.javaPlatformWindow = platformWindow; self.javaPlatformWindow = platformWindow;
self.styleBits = bits; self.styleBits = bits;
self.ownerWindow = owner;
[self setPropertiesForStyleBits:styleBits mask:MASK(_METHOD_PROP_BITMASK)]; [self setPropertiesForStyleBits:styleBits mask:MASK(_METHOD_PROP_BITMASK)];
return self; return self;
...@@ -350,7 +353,7 @@ AWT_ASSERT_APPKIT_THREAD; ...@@ -350,7 +353,7 @@ AWT_ASSERT_APPKIT_THREAD;
[self.javaPlatformWindow setJObject:nil withEnv:env]; [self.javaPlatformWindow setJObject:nil withEnv:env];
self.nsWindow = nil; self.nsWindow = nil;
self.ownerWindow = nil;
[super dealloc]; [super dealloc];
} }
...@@ -539,11 +542,18 @@ AWT_ASSERT_APPKIT_THREAD; ...@@ -539,11 +542,18 @@ AWT_ASSERT_APPKIT_THREAD;
AWT_ASSERT_APPKIT_THREAD; AWT_ASSERT_APPKIT_THREAD;
[AWTToolkit eventCountPlusPlus]; [AWTToolkit eventCountPlusPlus];
AWTWindow *opposite = [AWTWindow lastKeyWindow]; AWTWindow *opposite = [AWTWindow lastKeyWindow];
if (!IS(self.styleBits, IS_DIALOG)) {
[CMenuBar activate:self.javaMenuBar modallyDisabled:NO]; // Finds appropriate menubar in our hierarchy,
} else if ((opposite != NULL) && IS(self.styleBits, IS_MODAL)) { AWTWindow *awtWindow = self;
[CMenuBar activate:opposite->javaMenuBar modallyDisabled:YES]; while (awtWindow.ownerWindow != nil) {
awtWindow = awtWindow.ownerWindow;
}
CMenuBar *menuBar = nil;
if ([awtWindow.nsWindow isVisible]){
menuBar = awtWindow.javaMenuBar;
} }
[CMenuBar activate:menuBar modallyDisabled:!awtWindow.isEnabled];
[AWTWindow setLastKeyWindow:nil]; [AWTWindow setLastKeyWindow:nil];
[self _deliverWindowFocusEvent:YES oppositeWindow: opposite]; [self _deliverWindowFocusEvent:YES oppositeWindow: opposite];
...@@ -741,7 +751,7 @@ AWT_ASSERT_APPKIT_THREAD; ...@@ -741,7 +751,7 @@ AWT_ASSERT_APPKIT_THREAD;
* Signature: (JJIIII)J * Signature: (JJIIII)J
*/ */
JNIEXPORT jlong JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeCreateNSWindow JNIEXPORT jlong JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeCreateNSWindow
(JNIEnv *env, jobject obj, jlong contentViewPtr, jlong styleBits, jdouble x, jdouble y, jdouble w, jdouble h) (JNIEnv *env, jobject obj, jlong contentViewPtr, jlong ownerPtr, jlong styleBits, jdouble x, jdouble y, jdouble w, jdouble h)
{ {
__block AWTWindow *window = nil; __block AWTWindow *window = nil;
...@@ -750,13 +760,14 @@ JNF_COCOA_ENTER(env); ...@@ -750,13 +760,14 @@ JNF_COCOA_ENTER(env);
JNFWeakJObjectWrapper *platformWindow = [JNFWeakJObjectWrapper wrapperWithJObject:obj withEnv:env]; JNFWeakJObjectWrapper *platformWindow = [JNFWeakJObjectWrapper wrapperWithJObject:obj withEnv:env];
NSView *contentView = OBJC(contentViewPtr); NSView *contentView = OBJC(contentViewPtr);
NSRect frameRect = NSMakeRect(x, y, w, h); NSRect frameRect = NSMakeRect(x, y, w, h);
AWTWindow *owner = [OBJC(ownerPtr) delegate];
[ThreadUtilities performOnMainThreadWaiting:YES block:^(){ [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
window = [[AWTWindow alloc] initWithPlatformWindow:platformWindow window = [[AWTWindow alloc] initWithPlatformWindow:platformWindow
styleBits:styleBits ownerWindow:owner
frameRect:frameRect styleBits:styleBits
contentView:contentView]; frameRect:frameRect
contentView:contentView];
// the window is released is CPlatformWindow.nativeDispose() // the window is released is CPlatformWindow.nativeDispose()
if (window) CFRetain(window.nsWindow); if (window) CFRetain(window.nsWindow);
......
...@@ -63,7 +63,7 @@ static BOOL sSetupHelpMenu = NO; ...@@ -63,7 +63,7 @@ static BOOL sSetupHelpMenu = NO;
if (excludingAppleMenu && ![currMenu isJavaMenu]) { if (excludingAppleMenu && ![currMenu isJavaMenu]) {
continue; continue;
} }
[currItem setSubmenu:nil];
[theMainMenu removeItemAtIndex:index]; [theMainMenu removeItemAtIndex:index];
} }
...@@ -154,7 +154,10 @@ static BOOL sSetupHelpMenu = NO; ...@@ -154,7 +154,10 @@ static BOOL sSetupHelpMenu = NO;
// Clean up extra items // Clean up extra items
NSUInteger removedIndex, removedCount = [removedMenuArray count]; NSUInteger removedIndex, removedCount = [removedMenuArray count];
for (removedIndex=removedCount; removedIndex > 0; removedIndex--) { for (removedIndex=removedCount; removedIndex > 0; removedIndex--) {
[theMainMenu removeItemAtIndex:[[removedMenuArray objectAtIndex:(removedIndex-1)] integerValue]]; NSUInteger index = [[removedMenuArray objectAtIndex:(removedIndex-1)] integerValue];
NSMenuItem *currItem = [theMainMenu itemAtIndex:index];
[currItem setSubmenu:nil];
[theMainMenu removeItemAtIndex:index];
} }
i = cmenuIndex; i = cmenuIndex;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册