X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/09a9eb2069fe15a010efebe0b5378376a2c337fa..33820d94285c0004acce756e7d10d9698e6387d1:/src/osx/cocoa/nonownedwnd.mm diff --git a/src/osx/cocoa/nonownedwnd.mm b/src/osx/cocoa/nonownedwnd.mm index bdee26db1a..6e617f9bfd 100644 --- a/src/osx/cocoa/nonownedwnd.mm +++ b/src/osx/cocoa/nonownedwnd.mm @@ -23,18 +23,18 @@ NSRect wxToNSRect( NSView* parent, const wxRect& r ) int y = r.y; int x = r.x ; if ( parent == NULL || ![ parent isFlipped ] ) - y = frame.size.height - ( r.y + r.height ); + y = (int)(frame.size.height - ( r.y + r.height )); return NSMakeRect(x, y, r.width , r.height); } wxRect wxFromNSRect( NSView* parent, const NSRect& rect ) { NSRect frame = parent ? [parent bounds] : [[NSScreen mainScreen] frame]; - int y = rect.origin.y; - int x = rect.origin.x; + int y = (int)rect.origin.y; + int x = (int)rect.origin.x; if ( parent == NULL || ![ parent isFlipped ] ) - y = frame.size.height - (rect.origin.y + rect.size.height); - return wxRect( x, y, rect.size.width, rect.size.height ); + y = (int)(frame.size.height - (rect.origin.y + rect.size.height)); + return wxRect( x, y, (int)rect.size.width, (int)rect.size.height ); } NSPoint wxToNSPoint( NSView* parent, const wxPoint& p ) @@ -43,20 +43,40 @@ NSPoint wxToNSPoint( NSView* parent, const wxPoint& p ) int x = p.x ; int y = p.y; if ( parent == NULL || ![ parent isFlipped ] ) - y = frame.size.height - ( p.y ); + y = (int)(frame.size.height - ( p.y )); return NSMakePoint(x, y); } wxPoint wxFromNSPoint( NSView* parent, const NSPoint& p ) { NSRect frame = parent ? [parent bounds] : [[NSScreen mainScreen] frame]; - int x = p.x; - int y = p.y; + int x = (int)p.x; + int y = (int)p.y; if ( parent == NULL || ![ parent isFlipped ] ) - y = frame.size.height - ( p.y ); + y = (int)(frame.size.height - ( p.y )); return wxPoint( x, y); } +bool shouldHandleSelector(SEL selector) +{ + if (selector == @selector(noop:) + || selector == @selector(complete:) + || selector == @selector(deleteBackward:) + || selector == @selector(deleteForward:) + || selector == @selector(insertNewline:) + || selector == @selector(insertTab:) + || selector == @selector(keyDown:) + || selector == @selector(keyUp:) + || selector == @selector(scrollPageUp:) + || selector == @selector(scrollPageDown:) + || selector == @selector(scrollToBeginningOfDocument:) + || selector == @selector(scrollToEndOfDocument:)) + return false; + + return true; + +} + // // wx native implementation classes // @@ -64,7 +84,6 @@ wxPoint wxFromNSPoint( NSView* parent, const NSPoint& p ) typedef void (*wxOSX_NoResponderHandlerPtr)(NSView* self, SEL _cmd, SEL selector); @interface wxNSWindow : NSWindow - { wxNonOwnedWindowCocoaImpl* impl; } @@ -86,13 +105,22 @@ typedef void (*wxOSX_NoResponderHandlerPtr)(NSView* self, SEL _cmd, SEL selector return impl; } +- (void)doCommandBySelector:(SEL)selector +{ + if (shouldHandleSelector(selector) && + !(selector == @selector(cancel:) || selector == @selector(cancelOperation:)) ) + [super doCommandBySelector:selector]; +} + + // NB: if we don't do this, all key downs that get handled lead to a NSBeep - (void)noResponderFor: (SEL) selector { - if (selector != @selector(keyDown:)) + if (selector != @selector(keyDown:) && selector != @selector(keyUp:)) { - wxOSX_NoResponderHandlerPtr superimpl = (wxOSX_NoResponderHandlerPtr) [[self superclass] instanceMethodForSelector:@selector(noResponderFor:)]; - superimpl(self, @selector(noResponderFor:), selector); + [super noResponderFor:selector]; +// wxOSX_NoResponderHandlerPtr superimpl = (wxOSX_NoResponderHandlerPtr) [[self superclass] instanceMethodForSelector:@selector(noResponderFor:)]; +// superimpl(self, @selector(noResponderFor:), selector); } } @@ -109,7 +137,7 @@ typedef void (*wxOSX_NoResponderHandlerPtr)(NSView* self, SEL _cmd, SEL selector - (void)noResponderFor: (SEL) selector; @end -@implementation wxNSPanel +@implementation wxNSPanel - (void)setImplementation: (wxNonOwnedWindowCocoaImpl *) theImplementation { @@ -126,13 +154,20 @@ typedef void (*wxOSX_NoResponderHandlerPtr)(NSView* self, SEL _cmd, SEL selector return impl; } -// NB: if we don't do this, all key downs that get handled lead to a NSBeep +- (void)doCommandBySelector:(SEL)selector +{ + if (shouldHandleSelector(selector)) + [super doCommandBySelector:selector]; +} + +// NB: if we don't do this, it seems that all events that end here lead to a NSBeep - (void)noResponderFor: (SEL) selector { - if (selector != @selector(keyDown:)) + if (selector != @selector(keyDown:) && selector != @selector(keyUp:)) { - wxOSX_NoResponderHandlerPtr superimpl = (wxOSX_NoResponderHandlerPtr) [[self superclass] instanceMethodForSelector:@selector(noResponderFor:)]; - superimpl(self, @selector(noResponderFor:), selector); + [super noResponderFor:selector]; +// wxOSX_NoResponderHandlerPtr superimpl = (wxOSX_NoResponderHandlerPtr) [[self superclass] instanceMethodForSelector:@selector(noResponderFor:)]; +// superimpl(self, @selector(noResponderFor:), selector); } } @@ -182,8 +217,8 @@ typedef void (*wxOSX_NoResponderHandlerPtr)(NSView* self, SEL _cmd, SEL selector { NSRect frame = [win frame]; wxRect wxframe = wxFromNSRect( NULL, frame ); - wxframe.SetWidth( proposedFrameSize.width ); - wxframe.SetHeight( proposedFrameSize.height ); + wxframe.SetWidth( (int)proposedFrameSize.width ); + wxframe.SetHeight( (int)proposedFrameSize.height ); wxNSWindow* window = (wxNSWindow*) win; wxNonOwnedWindowCocoaImpl* windowimpl = [window implementation]; if ( windowimpl ) @@ -246,8 +281,8 @@ typedef void (*wxOSX_NoResponderHandlerPtr)(NSView* self, SEL _cmd, SEL selector if ( wxpeer ) { wxpeer->HandleActivated(0, false); - // Needed for popup window since the firstResponder - // (focus in wx) doesn't change when this + // Needed for popup window since the firstResponder + // (focus in wx) doesn't change when this // TLW becomes inactive. wxFocusEvent event( wxEVT_KILL_FOCUS, wxpeer->GetId()); event.SetEventObject(wxpeer); @@ -256,23 +291,43 @@ typedef void (*wxOSX_NoResponderHandlerPtr)(NSView* self, SEL _cmd, SEL selector } } +- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)anObject +{ + wxUnusedVar(sender); + + if ([anObject isKindOfClass:[wxNSTextField class]]) + { + wxNSTextField* tf = (wxNSTextField*) anObject; + wxNSTextFieldEditor* editor = [tf fieldEditor]; + if ( editor == nil ) + { + editor = [[wxNSTextFieldEditor alloc] init]; + [editor setFieldEditor:YES]; + [tf setFieldEditor:editor]; + } + return editor; + } + + return nil; +} + @end IMPLEMENT_DYNAMIC_CLASS( wxNonOwnedWindowCocoaImpl , wxNonOwnedWindowImpl ) -wxNonOwnedWindowCocoaImpl::wxNonOwnedWindowCocoaImpl( wxNonOwnedWindow* nonownedwnd) : +wxNonOwnedWindowCocoaImpl::wxNonOwnedWindowCocoaImpl( wxNonOwnedWindow* nonownedwnd) : wxNonOwnedWindowImpl(nonownedwnd) { m_macWindow = NULL; m_macFullScreenData = NULL; } - -wxNonOwnedWindowCocoaImpl::wxNonOwnedWindowCocoaImpl() + +wxNonOwnedWindowCocoaImpl::wxNonOwnedWindowCocoaImpl() { m_macWindow = NULL; m_macFullScreenData = NULL; } - + wxNonOwnedWindowCocoaImpl::~wxNonOwnedWindowCocoaImpl() { [m_macWindow setImplementation:nil]; @@ -285,27 +340,27 @@ void wxNonOwnedWindowCocoaImpl::Destroy() wxPendingDelete.Append( new wxDeferredObjectDeleter( this ) ); } -void wxNonOwnedWindowCocoaImpl::Create( wxWindow* parent, const wxPoint& pos, const wxSize& size, -long style, long extraStyle, const wxString& name ) +void wxNonOwnedWindowCocoaImpl::Create( wxWindow* WXUNUSED(parent), const wxPoint& pos, const wxSize& size, +long style, long extraStyle, const wxString& WXUNUSED(name) ) { static wxNonOwnedWindowController* controller = NULL; - + if ( !controller ) controller =[[wxNonOwnedWindowController alloc] init]; int windowstyle = NSBorderlessWindowMask; - - if ( style & wxFRAME_TOOL_WINDOW || ( style & wxPOPUP_WINDOW ) || + + if ( style & wxFRAME_TOOL_WINDOW || ( style & wxPOPUP_WINDOW ) || GetWXPeer()->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG ) { m_macWindow = [wxNSPanel alloc]; } else m_macWindow = [wxNSWindow alloc]; - + CGWindowLevel level = kCGNormalWindowLevel; - + if ( style & wxFRAME_TOOL_WINDOW ) { windowstyle |= NSUtilityWindowMask; @@ -382,25 +437,22 @@ long style, long extraStyle, const wxString& name ) if ( ( style & wxSTAY_ON_TOP ) ) level = kCGUtilityWindowLevel; - + NSRect r = wxToNSRect( NULL, wxRect( pos, size) ); - + [m_macWindow setImplementation:this]; - + [m_macWindow initWithContentRect:r styleMask:windowstyle backing:NSBackingStoreBuffered - defer:NO + defer:NO ]; - + [m_macWindow setLevel:level]; [m_macWindow setDelegate:controller]; - + [m_macWindow setAcceptsMouseMovedEvents: YES]; - - if ( ( style & wxPOPUP_WINDOW ) ) - [m_macWindow makeKeyAndOrderFront:nil]; } @@ -413,7 +465,7 @@ void wxNonOwnedWindowCocoaImpl::Raise() { [m_macWindow orderWindow:NSWindowAbove relativeTo:0]; } - + void wxNonOwnedWindowCocoaImpl::Lower() { [m_macWindow orderWindow:NSWindowBelow relativeTo:0]; @@ -423,15 +475,20 @@ bool wxNonOwnedWindowCocoaImpl::Show(bool show) { if ( show ) { - [m_macWindow orderFront:nil]; + wxNonOwnedWindow* wxpeer = GetWXPeer(); + if (wxpeer && !(wxpeer->GetWindowStyle() & wxFRAME_TOOL_WINDOW)) + [m_macWindow makeKeyAndOrderFront:nil]; + else + [m_macWindow orderFront:nil]; + [[m_macWindow contentView] setNeedsDisplay:YES]; } - else + else [m_macWindow orderOut:nil]; return true; } - -bool wxNonOwnedWindowCocoaImpl::ShowWithEffect(bool show, wxShowEffect effect, unsigned timeout) + +bool wxNonOwnedWindowCocoaImpl::ShowWithEffect(bool show, wxShowEffect WXUNUSED(effect), unsigned WXUNUSED(timeout)) { return Show(show); } @@ -447,7 +504,7 @@ bool wxNonOwnedWindowCocoaImpl::SetTransparent(wxByte alpha) return true; } -bool wxNonOwnedWindowCocoaImpl::SetBackgroundColour(const wxColour& col ) +bool wxNonOwnedWindowCocoaImpl::SetBackgroundColour(const wxColour& WXUNUSED(col) ) { return true; } @@ -460,20 +517,20 @@ void wxNonOwnedWindowCocoaImpl::SetExtraStyle( long exStyle ) int windowStyle = [ m_macWindow styleMask]; if ( metal && !(windowStyle & NSTexturedBackgroundWindowMask) ) { - wxFAIL_MSG( _T("Metal Style cannot be changed after creation") ); + wxFAIL_MSG( wxT("Metal Style cannot be changed after creation") ); } else if ( !metal && (windowStyle & NSTexturedBackgroundWindowMask ) ) { - wxFAIL_MSG( _T("Metal Style cannot be changed after creation") ); - } + wxFAIL_MSG( wxT("Metal Style cannot be changed after creation") ); + } } } - -bool wxNonOwnedWindowCocoaImpl::SetBackgroundStyle(wxBackgroundStyle style) + +bool wxNonOwnedWindowCocoaImpl::SetBackgroundStyle(wxBackgroundStyle WXUNUSED(style)) { return true; } - + bool wxNonOwnedWindowCocoaImpl::CanSetTransparent() { return true; @@ -496,8 +553,8 @@ void wxNonOwnedWindowCocoaImpl::GetPosition( int &x, int &y ) const void wxNonOwnedWindowCocoaImpl::GetSize( int &width, int &height ) const { NSRect rect = [m_macWindow frame]; - width = rect.size.width; - height = rect.size.height; + width = (int)rect.size.width; + height = (int)rect.size.height; } void wxNonOwnedWindowCocoaImpl::GetContentArea( int& left, int &top, int &width, int &height ) const @@ -505,32 +562,32 @@ void wxNonOwnedWindowCocoaImpl::GetContentArea( int& left, int &top, int &width, NSRect outer = NSMakeRect(100,100,100,100); NSRect content = [NSWindow contentRectForFrameRect:outer styleMask:[m_macWindow styleMask] ]; NSRect rect = [[m_macWindow contentView] frame]; - left = rect.origin.x; - top = rect.origin.y; - width = rect.size.width; - height = rect.size.height; + left = (int)rect.origin.x; + top = (int)rect.origin.y; + width = (int)rect.size.width; + height = (int)rect.size.height; } - -bool wxNonOwnedWindowCocoaImpl::SetShape(const wxRegion& region) + +bool wxNonOwnedWindowCocoaImpl::SetShape(const wxRegion& WXUNUSED(region)) { return false; } -void wxNonOwnedWindowCocoaImpl::SetTitle( const wxString& title, wxFontEncoding encoding ) +void wxNonOwnedWindowCocoaImpl::SetTitle( const wxString& title, wxFontEncoding encoding ) { [m_macWindow setTitle:wxCFStringRef( title , encoding ).AsNSString()]; } - + bool wxNonOwnedWindowCocoaImpl::IsMaximized() const { return [m_macWindow isZoomed]; } - + bool wxNonOwnedWindowCocoaImpl::IsIconized() const { return [m_macWindow isMiniaturized]; } - + void wxNonOwnedWindowCocoaImpl::Iconize( bool iconize ) { if ( iconize ) @@ -538,12 +595,12 @@ void wxNonOwnedWindowCocoaImpl::Iconize( bool iconize ) else [m_macWindow deminiaturize:nil]; } - -void wxNonOwnedWindowCocoaImpl::Maximize(bool maximize) + +void wxNonOwnedWindowCocoaImpl::Maximize(bool WXUNUSED(maximize)) { [m_macWindow zoom:nil]; } - + // http://cocoadevcentral.com/articles/000028.php @@ -557,8 +614,8 @@ bool wxNonOwnedWindowCocoaImpl::IsFullScreen() const { return m_macFullScreenData != NULL ; } - -bool wxNonOwnedWindowCocoaImpl::ShowFullScreen(bool show, long style) + +bool wxNonOwnedWindowCocoaImpl::ShowFullScreen(bool show, long WXUNUSED(style)) { if ( show ) { @@ -582,7 +639,7 @@ bool wxNonOwnedWindowCocoaImpl::ShowFullScreen(bool show, long style) delete data ; m_macFullScreenData = NULL ; } - + return true; } @@ -598,7 +655,7 @@ void wxNonOwnedWindowCocoaImpl::ScreenToWindow( int *x, int *y ) nspt = [[m_macWindow contentView] convertPoint:nspt fromView:nil]; p = wxFromNSPoint([m_macWindow contentView], nspt); if ( x ) - *x = p.x; + *x = p.x; if ( y ) *y = p.y; }