X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/33e902756fa5e12d57b92c5b9262f2db8ab332da..c8eab84f834989c4c7285376ece45504c51b1205:/src/osx/cocoa/nonownedwnd.mm?ds=inline diff --git a/src/osx/cocoa/nonownedwnd.mm b/src/osx/cocoa/nonownedwnd.mm index b63421373c..35e7553229 100644 --- a/src/osx/cocoa/nonownedwnd.mm +++ b/src/osx/cocoa/nonownedwnd.mm @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: src/mac/cocoa/nonownedwnd.mm +// Name: src/osx/cocoa/nonownedwnd.mm // Purpose: non owned window for cocoa // Author: DavidStefan Csomor // Modified by: @@ -10,38 +10,33 @@ ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" - -#if wxOSX_USE_COCOA -#include -#else -#include +#ifndef WX_PRECOMP + #include "wx/nonownedwnd.h" + #include "wx/frame.h" + #include "wx/app.h" + #include "wx/dialog.h" #endif -#ifdef __WXMAC__ #include "wx/osx/private.h" -#endif - -#if wxOSX_USE_COCOA - NSRect wxToNSRect( NSView* parent, const wxRect& r ) { NSRect frame = parent ? [parent bounds] : [[NSScreen mainScreen] frame]; int y = r.y; int x = r.x ; - if ( parent != NULL && ![ parent isFlipped ] ) - y = frame.size.height - ( r.y + r.height ); + if ( parent == NULL || ![ parent isFlipped ] ) + 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; - 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 ); + int y = (int)rect.origin.y; + int x = (int)rect.origin.x; + if ( parent == NULL || ![ parent isFlipped ] ) + 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 ) @@ -49,65 +44,400 @@ NSPoint wxToNSPoint( NSView* parent, const wxPoint& p ) NSRect frame = parent ? [parent bounds] : [[NSScreen mainScreen] frame]; int x = p.x ; int y = p.y; - if ( parent != NULL && ![ parent isFlipped ] ) - y = frame.size.height - ( p.y ); + if ( parent == NULL || ![ parent isFlipped ] ) + 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; - if ( parent != NULL && ![ parent isFlipped ] ) - y = frame.size.height - ( p.y ); + int x = (int)p.x; + int y = (int)p.y; + if ( parent == NULL || ![ parent isFlipped ] ) + 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 category for NSWindow (our own and wrapped instances) +// + +@interface NSWindow (wxNSWindowSupport) + +- (wxNonOwnedWindowCocoaImpl*) WX_implementation; + +- (bool) WX_filterSendEvent:(NSEvent *) event; + +@end + +@implementation NSWindow (wxNSWindowSupport) + +- (wxNonOwnedWindowCocoaImpl*) WX_implementation +{ + return (wxNonOwnedWindowCocoaImpl*) wxNonOwnedWindowImpl::FindFromWXWindow( self ); +} + +// TODO in cocoa everything during a drag is sent to the NSWindow the mouse down occured, +// this does not conform to the wx behaviour if the window is not captured, so try to resend +// or capture all wx mouse event handling at the tlw as we did for carbon + +- (bool) WX_filterSendEvent:(NSEvent *) event +{ + bool handled = false; + if ( ([event type] >= NSLeftMouseDown) && ([event type] <= NSMouseExited) ) + { + wxWindow* cw = wxWindow::GetCapture(); + if ( cw != NULL ) + { + ((wxWidgetCocoaImpl*)cw->GetPeer())->DoHandleMouseEvent( event); + handled = true; + } + } + return handled; +} +@end + +// +// wx native implementation +// + +@interface wxNSWindow : NSWindow +{ +} + +- (void) sendEvent:(NSEvent *)event; +- (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen; +- (void)noResponderFor: (SEL) selector; +@end + +@implementation wxNSWindow + +- (void)sendEvent:(NSEvent *) event +{ + if ( ![self WX_filterSendEvent: event] ) + { + WXEVENTREF formerEvent = wxTheApp == NULL ? NULL : wxTheApp->MacGetCurrentEvent(); + WXEVENTHANDLERCALLREF formerHandler = wxTheApp == NULL ? NULL : wxTheApp->MacGetCurrentEventHandlerCallRef(); + + if (wxTheApp) + wxTheApp->MacSetCurrentEvent(event, NULL); + + [super sendEvent: event]; + + if (wxTheApp) + wxTheApp->MacSetCurrentEvent(formerEvent , formerHandler); + } +} + +// The default implementation always moves the window back onto the screen, +// even when the programmer explicitly wants to hide it. +- (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen +{ + wxUnusedVar(screen); + return frameRect; +} + +- (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:) && selector != @selector(keyUp:)) + { + [super noResponderFor:selector]; + } +} + +// We need this for borderless windows, i.e. shaped windows or windows without +// a title bar. For more info, see: +// http://lists.apple.com/archives/cocoa-dev/2008/May/msg02091.html +- (BOOL)canBecomeKeyWindow +{ + return YES; +} + +@end + +@interface wxNSPanel : NSPanel +{ +} + +- (void)noResponderFor: (SEL) selector; +- (void)sendEvent:(NSEvent *)event; +@end + +@implementation wxNSPanel + +- (BOOL)canBecomeKeyWindow +{ + return YES; +} + +- (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:) && selector != @selector(keyUp:)) + { + [super noResponderFor:selector]; + } +} + +- (void)sendEvent:(NSEvent *) event +{ + if ( ![self WX_filterSendEvent: event] ) + [super sendEvent: event]; +} + +@end + + +// +// controller +// + +@interface wxNonOwnedWindowController : NSObject wxOSX_10_6_AND_LATER() +{ +} + +- (void)windowDidResize:(NSNotification *)notification; +- (NSSize)windowWillResize:(NSWindow *)window toSize:(NSSize)proposedFrameSize; +- (void)windowDidResignKey:(NSNotification *)notification; +- (void)windowDidBecomeKey:(NSNotification *)notification; +- (void)windowDidMove:(NSNotification *)notification; +- (BOOL)windowShouldClose:(id)window; +- (BOOL)windowShouldZoom:(NSWindow *)window toFrame:(NSRect)newFrame; + +@end + +@implementation wxNonOwnedWindowController + +- (id) init +{ + [super init]; + return self; +} + +- (BOOL)windowShouldClose:(id)nwindow +{ + wxNonOwnedWindowCocoaImpl* windowimpl = [(NSWindow*) nwindow WX_implementation]; + if ( windowimpl ) + { + wxNonOwnedWindow* wxpeer = windowimpl->GetWXPeer(); + if ( wxpeer ) + wxpeer->Close(); + } + return NO; +} + +- (NSSize)windowWillResize:(NSWindow *)window + toSize:(NSSize)proposedFrameSize +{ + NSRect frame = [window frame]; + wxRect wxframe = wxFromNSRect( NULL, frame ); + wxframe.SetWidth( (int)proposedFrameSize.width ); + wxframe.SetHeight( (int)proposedFrameSize.height ); + + wxNonOwnedWindowCocoaImpl* windowimpl = [window WX_implementation]; + if ( windowimpl ) + { + wxNonOwnedWindow* wxpeer = windowimpl->GetWXPeer(); + if ( wxpeer ) + { + wxpeer->HandleResizing( 0, &wxframe ); + NSSize newSize = NSMakeSize(wxframe.GetWidth(), wxframe.GetHeight()); + return newSize; + } + } + + return proposedFrameSize; +} + +- (void)windowDidResize:(NSNotification *)notification +{ + NSWindow* window = (NSWindow*) [notification object]; + wxNonOwnedWindowCocoaImpl* windowimpl = [window WX_implementation]; + if ( windowimpl ) + { + wxNonOwnedWindow* wxpeer = windowimpl->GetWXPeer(); + if ( wxpeer ) + wxpeer->HandleResized(0); + } +} + +- (void)windowDidMove:(NSNotification *)notification +{ + wxNSWindow* window = (wxNSWindow*) [notification object]; + wxNonOwnedWindowCocoaImpl* windowimpl = [window WX_implementation]; + if ( windowimpl ) + { + wxNonOwnedWindow* wxpeer = windowimpl->GetWXPeer(); + if ( wxpeer ) + wxpeer->HandleMoved(0); + } +} + +- (void)windowDidBecomeKey:(NSNotification *)notification +{ + NSWindow* window = (NSWindow*) [notification object]; + wxNonOwnedWindowCocoaImpl* windowimpl = [window WX_implementation]; + if ( windowimpl ) + { + wxNonOwnedWindow* wxpeer = windowimpl->GetWXPeer(); + if ( wxpeer ) + wxpeer->HandleActivated(0, true); + } +} + +- (void)windowDidResignKey:(NSNotification *)notification +{ + NSWindow* window = (NSWindow*) [notification object]; + wxNonOwnedWindowCocoaImpl* windowimpl = [window WX_implementation]; + if ( windowimpl ) + { + wxNonOwnedWindow* wxpeer = windowimpl->GetWXPeer(); + if ( wxpeer ) + { + wxpeer->HandleActivated(0, false); + // 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); + wxpeer->HandleWindowEvent(event); + } + } +} + +- (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; +} + +- (BOOL)windowShouldZoom:(NSWindow *)window toFrame:(NSRect)newFrame +{ + wxUnusedVar(newFrame); + wxNonOwnedWindowCocoaImpl* windowimpl = [window WX_implementation]; + if ( windowimpl ) + { + wxNonOwnedWindow* wxpeer = windowimpl->GetWXPeer(); + wxMaximizeEvent event(wxpeer->GetId()); + event.SetEventObject(wxpeer); + return !wxpeer->HandleWindowEvent(event); + } + return true; +} + +@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 release]; + if ( !m_wxPeer->IsNativeWindowWrapper() ) + { + [m_macWindow setDelegate:nil]; + [m_macWindow release]; + } } -void wxNonOwnedWindowCocoaImpl::Destroy() +void wxNonOwnedWindowCocoaImpl::WillBeDestroyed() { - wxPendingDelete.Append( new wxDeferredObjectDeleter( this ) ); + if ( !m_wxPeer->IsNativeWindowWrapper() ) + { + [m_macWindow setDelegate:nil]; + } } void wxNonOwnedWindowCocoaImpl::Create( wxWindow* parent, const wxPoint& pos, const wxSize& size, -long style, long extraStyle, const wxString& name ) +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 ) - m_macWindow = [NSPanel alloc]; + + if ( style & wxFRAME_TOOL_WINDOW || ( style & wxPOPUP_WINDOW ) || + GetWXPeer()->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG ) + { + m_macWindow = [wxNSPanel alloc]; + } else - m_macWindow = [NSWindow alloc]; - - CGWindowLevel level = kCGNormalWindowLevelKey; - + m_macWindow = [wxNSWindow alloc]; + + CGWindowLevel level = kCGNormalWindowLevel; + if ( style & wxFRAME_TOOL_WINDOW ) { - if ( ( style & wxSTAY_ON_TOP ) ) - level = kCGUtilityWindowLevel; - else - level = kCGFloatingWindowLevel ; - + windowstyle |= NSUtilityWindowMask; + if ( ( style & wxMINIMIZE_BOX ) || ( style & wxMAXIMIZE_BOX ) || + ( style & wxCLOSE_BOX ) || ( style & wxSYSTEM_MENU ) ) + { + windowstyle |= NSTitledWindowMask ; + } } else if ( ( style & wxPOPUP_WINDOW ) ) { @@ -171,25 +501,65 @@ long style, long extraStyle, const wxString& name ) if ( extraStyle & wxFRAME_EX_METAL) windowstyle |= NSTexturedBackgroundWindowMask; + if ( ( style & wxFRAME_FLOAT_ON_PARENT ) || ( style & wxFRAME_TOOL_WINDOW ) ) + level = kCGFloatingWindowLevel; + if ( ( style & wxSTAY_ON_TOP ) ) level = kCGUtilityWindowLevel; -/* - if ( ( style & wxFRAME_FLOAT_ON_PARENT ) ) - group = GetWindowGroupOfClass(kFloatingWindowClass); - */ - + NSRect r = wxToNSRect( NULL, wxRect( pos, size) ); - + + r = [NSWindow contentRectForFrameRect:r styleMask:windowstyle]; + [m_macWindow initWithContentRect:r styleMask:windowstyle backing:NSBackingStoreBuffered - defer:NO + 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 makeKeyAndOrderFront:nil]; + + [m_macWindow setDelegate:controller]; + + [m_macWindow setAcceptsMouseMovedEvents: YES]; + + if ( ( style & wxFRAME_SHAPED) ) + { + [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 ) +{ + m_macWindow = nativeWindow; +} WXWindow wxNonOwnedWindowCocoaImpl::GetWXWindow() const { @@ -200,27 +570,40 @@ void wxNonOwnedWindowCocoaImpl::Raise() { [m_macWindow orderWindow:NSWindowAbove relativeTo:0]; } - + void wxNonOwnedWindowCocoaImpl::Lower() { [m_macWindow orderWindow:NSWindowBelow relativeTo:0]; } +void wxNonOwnedWindowCocoaImpl::ShowWithoutActivating() +{ + [m_macWindow orderFront:nil]; + [[m_macWindow contentView] setNeedsDisplay: YES]; +} + bool wxNonOwnedWindowCocoaImpl::Show(bool show) { if ( show ) { - [m_macWindow orderFront:nil]; - [[m_macWindow contentView] setNeedsDisplay:YES]; + 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 effect, + unsigned timeout) { - return Show(show); + return wxWidgetCocoaImpl:: + ShowViewOrWindowWithEffect(m_wxPeer, show, effect, timeout); } void wxNonOwnedWindowCocoaImpl::Update() @@ -234,7 +617,7 @@ bool wxNonOwnedWindowCocoaImpl::SetTransparent(wxByte alpha) return true; } -bool wxNonOwnedWindowCocoaImpl::SetBackgroundColour(const wxColour& col ) +bool wxNonOwnedWindowCocoaImpl::SetBackgroundColour(const wxColour& WXUNUSED(col) ) { return true; } @@ -247,20 +630,41 @@ 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") ); + } } } - + +void wxNonOwnedWindowCocoaImpl::SetWindowStyleFlag( long style ) +{ + if (m_macWindow) + { + CGWindowLevel level = kCGNormalWindowLevel; + + if (style & wxSTAY_ON_TOP) + level = kCGUtilityWindowLevel; + else if (( style & wxFRAME_FLOAT_ON_PARENT ) || ( style & wxFRAME_TOOL_WINDOW )) + level = kCGFloatingWindowLevel; + + [m_macWindow setLevel: level]; + } +} + bool wxNonOwnedWindowCocoaImpl::SetBackgroundStyle(wxBackgroundStyle style) { + if ( style == wxBG_STYLE_TRANSPARENT ) + { + [m_macWindow setOpaque:NO]; + [m_macWindow setBackgroundColor:[NSColor clearColor]]; + } + return true; } - + bool wxNonOwnedWindowCocoaImpl::CanSetTransparent() { return true; @@ -269,7 +673,8 @@ bool wxNonOwnedWindowCocoaImpl::CanSetTransparent() void wxNonOwnedWindowCocoaImpl::MoveWindow(int x, int y, int width, int height) { NSRect r = wxToNSRect( NULL, wxRect(x,y,width, height) ); - [m_macWindow setFrame:r display:YES]; + // do not trigger refreshes upon invisible and possible partly created objects + [m_macWindow setFrame:r display:GetWXPeer()->IsShownOnScreen()]; } void wxNonOwnedWindowCocoaImpl::GetPosition( int &x, int &y ) const @@ -282,39 +687,56 @@ 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 &right, 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]; - 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; + [m_macWindow setOpaque:NO]; + [m_macWindow setBackgroundColor:[NSColor clearColor]]; + + return true; } -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]; + if (([m_macWindow styleMask] & NSResizableWindowMask) != 0) + { + return [m_macWindow isZoomed]; + } + else + { + NSRect rectScreen = [[NSScreen mainScreen] visibleFrame]; + NSRect rectWindow = [m_macWindow frame]; + return (rectScreen.origin.x == rectWindow.origin.x && + rectScreen.origin.y == rectWindow.origin.y && + rectScreen.size.width == rectWindow.size.width && + rectScreen.size.height == rectWindow.size.height); + } } - + bool wxNonOwnedWindowCocoaImpl::IsIconized() const { return [m_macWindow isMiniaturized]; } - + void wxNonOwnedWindowCocoaImpl::Iconize( bool iconize ) { if ( iconize ) @@ -322,12 +744,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 @@ -341,8 +763,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 ) { @@ -366,11 +788,83 @@ bool wxNonOwnedWindowCocoaImpl::ShowFullScreen(bool show, long style) delete data ; m_macFullScreenData = NULL ; } - + return true; } -void wxNonOwnedWindowCocoaImpl::RequestUserAttention(int WXUNUSED(flags)) +void wxNonOwnedWindowCocoaImpl::RequestUserAttention(int flagsWX) { + NSRequestUserAttentionType flagsOSX; + switch ( flagsWX ) + { + case wxUSER_ATTENTION_INFO: + flagsOSX = NSInformationalRequest; + break; + + case wxUSER_ATTENTION_ERROR: + flagsOSX = NSCriticalRequest; + break; + + default: + wxFAIL_MSG( "invalid RequestUserAttention() flags" ); + return; + } + + [NSApp requestUserAttention:flagsOSX]; +} + +void wxNonOwnedWindowCocoaImpl::ScreenToWindow( int *x, int *y ) +{ + wxPoint p((x ? *x : 0), (y ? *y : 0) ); + NSPoint nspt = wxToNSPoint( NULL, p ); + nspt = [m_macWindow convertScreenToBase:nspt]; + nspt = [[m_macWindow contentView] convertPoint:nspt fromView:nil]; + p = wxFromNSPoint([m_macWindow contentView], nspt); + if ( x ) + *x = p.x; + if ( y ) + *y = p.y; +} + +void wxNonOwnedWindowCocoaImpl::WindowToScreen( int *x, int *y ) +{ + wxPoint p((x ? *x : 0), (y ? *y : 0) ); + NSPoint nspt = wxToNSPoint( [m_macWindow contentView], p ); + nspt = [[m_macWindow contentView] convertPoint:nspt toView:nil]; + nspt = [m_macWindow convertBaseToScreen:nspt]; + p = wxFromNSPoint( NULL, nspt); + if ( x ) + *x = p.x; + if ( y ) + *y = p.y; +} + +bool wxNonOwnedWindowCocoaImpl::IsActive() +{ + return [m_macWindow isKeyWindow]; +} + +void wxNonOwnedWindowCocoaImpl::SetModified(bool modified) +{ + [m_macWindow setDocumentEdited:modified]; +} + +bool wxNonOwnedWindowCocoaImpl::IsModified() const +{ + return [m_macWindow isDocumentEdited]; +} + +wxNonOwnedWindowImpl* wxNonOwnedWindowImpl::CreateNonOwnedWindow( wxNonOwnedWindow* wxpeer, wxWindow* parent, WXWindow nativeWindow) +{ + wxNonOwnedWindowCocoaImpl* now = new wxNonOwnedWindowCocoaImpl( wxpeer ); + now->Create( parent, nativeWindow ); + return now; +} + +wxNonOwnedWindowImpl* wxNonOwnedWindowImpl::CreateNonOwnedWindow( wxNonOwnedWindow* wxpeer, wxWindow* parent, const wxPoint& pos, const wxSize& size, + long style, long extraStyle, const wxString& name ) +{ + wxNonOwnedWindowImpl* now = new wxNonOwnedWindowCocoaImpl( wxpeer ); + now->Create( parent, pos, size, style , extraStyle, name ); + return now; } -#endif