X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0b6f851f4ac593595c59f0e4ecf1caa48c572564..b64af07b7c8a0c59ec5922c06a852b32c574e463:/src/osx/cocoa/nonownedwnd.mm diff --git a/src/osx/cocoa/nonownedwnd.mm b/src/osx/cocoa/nonownedwnd.mm index 235cc8111b..4b73f1e26a 100644 --- a/src/osx/cocoa/nonownedwnd.mm +++ b/src/osx/cocoa/nonownedwnd.mm @@ -13,13 +13,27 @@ #ifndef WX_PRECOMP #include "wx/nonownedwnd.h" #include "wx/frame.h" + #include "wx/app.h" + #include "wx/dialog.h" + #include "wx/menuitem.h" + #include "wx/menu.h" #endif #include "wx/osx/private.h" +NSScreen* wxOSXGetMenuScreen() +{ + if ( [NSScreen screens] == nil ) + return [NSScreen mainScreen]; + else + { + return [[NSScreen screens] objectAtIndex:0]; + } +} + NSRect wxToNSRect( NSView* parent, const wxRect& r ) { - NSRect frame = parent ? [parent bounds] : [[NSScreen mainScreen] frame]; + NSRect frame = parent ? [parent bounds] : [wxOSXGetMenuScreen() frame]; int y = r.y; int x = r.x ; if ( parent == NULL || ![ parent isFlipped ] ) @@ -29,7 +43,7 @@ NSRect wxToNSRect( NSView* parent, const wxRect& r ) wxRect wxFromNSRect( NSView* parent, const NSRect& rect ) { - NSRect frame = parent ? [parent bounds] : [[NSScreen mainScreen] frame]; + NSRect frame = parent ? [parent bounds] : [wxOSXGetMenuScreen() frame]; int y = (int)rect.origin.y; int x = (int)rect.origin.x; if ( parent == NULL || ![ parent isFlipped ] ) @@ -39,7 +53,7 @@ wxRect wxFromNSRect( NSView* parent, const NSRect& rect ) NSPoint wxToNSPoint( NSView* parent, const wxPoint& p ) { - NSRect frame = parent ? [parent bounds] : [[NSScreen mainScreen] frame]; + NSRect frame = parent ? [parent bounds] : [wxOSXGetMenuScreen() frame]; int x = p.x ; int y = p.y; if ( parent == NULL || ![ parent isFlipped ] ) @@ -49,7 +63,7 @@ NSPoint wxToNSPoint( NSView* parent, const wxPoint& p ) wxPoint wxFromNSPoint( NSView* parent, const NSPoint& p ) { - NSRect frame = parent ? [parent bounds] : [[NSScreen mainScreen] frame]; + NSRect frame = parent ? [parent bounds] : [wxOSXGetMenuScreen() frame]; int x = (int)p.x; int y = (int)p.y; if ( parent == NULL || ![ parent isFlipped ] ) @@ -65,6 +79,7 @@ bool shouldHandleSelector(SEL selector) || selector == @selector(deleteForward:) || selector == @selector(insertNewline:) || selector == @selector(insertTab:) + || selector == @selector(insertBacktab:) || selector == @selector(keyDown:) || selector == @selector(keyUp:) || selector == @selector(scrollPageUp:) @@ -187,12 +202,22 @@ bool shouldHandleSelector(SEL selector) { } +- (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen; - (void)noResponderFor: (SEL) selector; - (void)sendEvent:(NSEvent *)event; @end @implementation wxNSPanel +- (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen +{ + wxNonOwnedWindowCocoaImpl* impl = (wxNonOwnedWindowCocoaImpl*) wxNonOwnedWindowImpl::FindFromWXWindow( self ); + if (impl && impl->IsFullScreen()) + return frameRect; + else + return [super constrainFrameRect:frameRect toScreen:screen]; +} + - (BOOL)canBecomeKeyWindow { return YES; @@ -240,6 +265,8 @@ bool shouldHandleSelector(SEL selector) @end +extern int wxOSXGetIdFromSelector(SEL action ); + @implementation wxNonOwnedWindowController - (id) init @@ -248,6 +275,72 @@ bool shouldHandleSelector(SEL selector) return self; } +- (BOOL) triggerMenu:(SEL) action +{ + wxMenuBar* mbar = wxMenuBar::MacGetInstalledMenuBar(); + if ( mbar ) + { + wxMenu* menu = NULL; + wxMenuItem* menuitem = mbar->FindItem(wxOSXGetIdFromSelector(action), &menu); + if ( menu != NULL && menuitem != NULL) + return menu->HandleCommandProcess(menuitem); + } + return NO; +} + +- (BOOL)validateMenuItem:(NSMenuItem *)menuItem +{ + SEL action = [menuItem action]; + + wxMenuBar* mbar = wxMenuBar::MacGetInstalledMenuBar(); + if ( mbar ) + { + wxMenu* menu = NULL; + wxMenuItem* menuitem = mbar->FindItem(wxOSXGetIdFromSelector(action), &menu); + if ( menu != NULL && menuitem != NULL) + { + if ( menu->HandleCommandUpdateStatus(menuitem) ) + return menuitem->IsEnabled(); + } + } + return YES; +} + +- (void)undo:(id)sender +{ + [self triggerMenu:_cmd]; +} + +- (void)redo:(id)sender +{ + [self triggerMenu:_cmd]; +} + +- (void)cut:(id)sender +{ + [self triggerMenu:_cmd]; +} + +- (void)copy:(id)sender +{ + [self triggerMenu:_cmd]; +} + +- (void)paste:(id)sender +{ + [self triggerMenu:_cmd]; +} + +- (void)delete:(id)sender +{ + [self triggerMenu:_cmd]; +} + +- (void)selectAll:(id)sender +{ + [self triggerMenu:_cmd]; +} + - (BOOL)windowShouldClose:(id)nwindow { wxNonOwnedWindowCocoaImpl* windowimpl = [(NSWindow*) nwindow WX_implementation]; @@ -407,7 +500,7 @@ void wxNonOwnedWindowCocoaImpl::WillBeDestroyed() } } -void wxNonOwnedWindowCocoaImpl::Create( wxWindow* WXUNUSED(parent), const wxPoint& pos, const wxSize& size, +void wxNonOwnedWindowCocoaImpl::Create( wxWindow* parent, const wxPoint& pos, const wxSize& size, long style, long extraStyle, const wxString& WXUNUSED(name) ) { static wxNonOwnedWindowController* controller = NULL; @@ -515,6 +608,29 @@ long style, long extraStyle, const wxString& WXUNUSED(name) ) defer:NO ]; + // If the parent is modal, windows with wxFRAME_FLOAT_ON_PARENT style need + // to be in kCGUtilityWindowLevel and not kCGFloatingWindowLevel to stay + // above the parent. + wxDialog * const parentDialog = wxDynamicCast(parent, wxDialog); + if (parentDialog && parentDialog->IsModal()) + { + if (level == kCGFloatingWindowLevel) + { + level = kCGUtilityWindowLevel; + } + + // Cocoa's modal loop does not process other windows by default, but + // don't call this on normal window levels so nested modal dialogs will + // still behave modally. + if (level != kCGNormalWindowLevel) + { + if ([m_macWindow isKindOfClass:[NSPanel class]]) + { + [(NSPanel*)m_macWindow setWorksWhenModal:YES]; + } + } + } + [m_macWindow setLevel:level]; [m_macWindow setDelegate:controller]; @@ -526,6 +642,9 @@ long style, long extraStyle, const wxString& WXUNUSED(name) ) [m_macWindow setOpaque:NO]; [m_macWindow setAlphaValue:1.0]; } + + if ( !(style & wxFRAME_TOOL_WINDOW) ) + [m_macWindow setHidesOnDeactivate:NO]; } void wxNonOwnedWindowCocoaImpl::Create( wxWindow* WXUNUSED(parent), WXWindow nativeWindow ) @@ -540,7 +659,7 @@ WXWindow wxNonOwnedWindowCocoaImpl::GetWXWindow() const void wxNonOwnedWindowCocoaImpl::Raise() { - [m_macWindow orderWindow:NSWindowAbove relativeTo:0]; + [m_macWindow makeKeyAndOrderFront:nil]; } void wxNonOwnedWindowCocoaImpl::Lower() @@ -665,8 +784,6 @@ void wxNonOwnedWindowCocoaImpl::GetSize( int &width, int &height ) const void wxNonOwnedWindowCocoaImpl::GetContentArea( int& left, int &top, int &width, int &height ) const { - NSRect outer = NSMakeRect(100,100,100,100); - NSRect content = [NSWindow contentRectForFrameRect:outer styleMask:[m_macWindow styleMask] ]; NSRect rect = [[m_macWindow contentView] frame]; left = (int)rect.origin.x; top = (int)rect.origin.y; @@ -749,7 +866,14 @@ bool wxNonOwnedWindowCocoaImpl::ShowFullScreen(bool show, long WXUNUSED(style)) data->m_formerFrame = [m_macWindow frame]; CGDisplayCapture( kCGDirectMainDisplay ); [m_macWindow setLevel:CGShieldingWindowLevel()]; - [m_macWindow setFrame:[[NSScreen mainScreen] frame] display:YES]; + NSRect screenframe = [[NSScreen mainScreen] frame]; + NSRect frame = NSMakeRect (0, 0, 100, 100); + NSRect contentRect; + contentRect = [NSWindow contentRectForFrameRect: frame + styleMask: NSTitledWindowMask]; + screenframe.origin.y += (frame.origin.y - contentRect.origin.y); + screenframe.size.height += (frame.size.height - contentRect.size.height); + [m_macWindow setFrame:screenframe display:YES]; } else if ( m_macFullScreenData != NULL ) {