From: Stefan Csomor Date: Tue, 29 Jul 2008 19:58:39 +0000 (+0000) Subject: universal implementation for osx cocoa X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/33e902756fa5e12d57b92c5b9262f2db8ab332da universal implementation for osx cocoa git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54819 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/osx/cocoa/nonownedwnd.mm b/src/osx/cocoa/nonownedwnd.mm new file mode 100644 index 0000000000..b63421373c --- /dev/null +++ b/src/osx/cocoa/nonownedwnd.mm @@ -0,0 +1,376 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/mac/cocoa/nonownedwnd.mm +// Purpose: non owned window for cocoa +// Author: DavidStefan Csomor +// Modified by: +// Created: 2008-06-20 +// RCS-ID: $Id: nonownedwnd.mm 48805 2007-09-19 14:52:25Z SC $ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#if wxOSX_USE_COCOA +#include +#else +#include +#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 ); + 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 ); +} + +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 ); + 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 ); + return wxPoint( x, y); +} + +IMPLEMENT_DYNAMIC_CLASS( wxNonOwnedWindowCocoaImpl , wxNonOwnedWindowImpl ) + +wxNonOwnedWindowCocoaImpl::wxNonOwnedWindowCocoaImpl( wxNonOwnedWindow* nonownedwnd) : + wxNonOwnedWindowImpl(nonownedwnd) +{ + m_macWindow = NULL; + m_macFullScreenData = NULL; +} + +wxNonOwnedWindowCocoaImpl::wxNonOwnedWindowCocoaImpl() +{ + m_macWindow = NULL; + m_macFullScreenData = NULL; +} + +wxNonOwnedWindowCocoaImpl::~wxNonOwnedWindowCocoaImpl() +{ + [m_macWindow release]; +} + +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 ) +{ + int windowstyle = NSBorderlessWindowMask; + + if ( style & wxFRAME_TOOL_WINDOW ) + m_macWindow = [NSPanel alloc]; + else + m_macWindow = [NSWindow alloc]; + + CGWindowLevel level = kCGNormalWindowLevelKey; + + if ( style & wxFRAME_TOOL_WINDOW ) + { + if ( ( style & wxSTAY_ON_TOP ) ) + level = kCGUtilityWindowLevel; + else + level = kCGFloatingWindowLevel ; + + } + else if ( ( style & wxPOPUP_WINDOW ) ) + { + level = kCGPopUpMenuWindowLevel; + /* + if ( ( style & wxBORDER_NONE ) ) + { + wclass = kHelpWindowClass ; // has no border + attr |= kWindowNoShadowAttribute; + } + else + { + wclass = kPlainWindowClass ; // has a single line border, it will have to do for now + } + */ + } + else if ( ( style & wxCAPTION ) ) + { + windowstyle |= NSTitledWindowMask ; + } + else if ( ( style & wxFRAME_DRAWER ) ) + { + /* + wclass = kDrawerWindowClass; + */ + } + else + { + // set these even if we have no title, otherwise the controls won't be visible + if ( ( style & wxMINIMIZE_BOX ) || ( style & wxMAXIMIZE_BOX ) || + ( style & wxCLOSE_BOX ) || ( style & wxSYSTEM_MENU ) ) + { + windowstyle |= NSTitledWindowMask ; + } + /* + else if ( ( style & wxNO_BORDER ) ) + { + wclass = kSimpleWindowClass ; + } + else + { + wclass = kPlainWindowClass ; + } + */ + } + + if ( windowstyle & NSTitledWindowMask ) + { + if ( ( style & wxMINIMIZE_BOX ) ) + windowstyle |= NSMiniaturizableWindowMask ; + + if ( ( style & wxMAXIMIZE_BOX ) ) + windowstyle |= NSResizableWindowMask ; // TODO showing ZOOM ? + + if ( ( style & wxRESIZE_BORDER ) ) + windowstyle |= NSResizableWindowMask ; + + if ( ( style & wxCLOSE_BOX) ) + windowstyle |= NSClosableWindowMask ; + } + if ( extraStyle & wxFRAME_EX_METAL) + windowstyle |= NSTexturedBackgroundWindowMask; + + if ( ( style & wxSTAY_ON_TOP ) ) + level = kCGUtilityWindowLevel; +/* + if ( ( style & wxFRAME_FLOAT_ON_PARENT ) ) + group = GetWindowGroupOfClass(kFloatingWindowClass); + */ + + NSRect r = wxToNSRect( NULL, wxRect( pos, size) ); + + [m_macWindow initWithContentRect:r + styleMask:windowstyle + backing:NSBackingStoreBuffered + defer:NO + ]; + + [m_macWindow setLevel:level]; + // [m_macWindow makeKeyAndOrderFront:nil]; +} + + +WXWindow wxNonOwnedWindowCocoaImpl::GetWXWindow() const +{ + return m_macWindow; +} + +void wxNonOwnedWindowCocoaImpl::Raise() +{ + [m_macWindow orderWindow:NSWindowAbove relativeTo:0]; +} + +void wxNonOwnedWindowCocoaImpl::Lower() +{ + [m_macWindow orderWindow:NSWindowBelow relativeTo:0]; +} + +bool wxNonOwnedWindowCocoaImpl::Show(bool show) +{ + if ( show ) + { + [m_macWindow orderFront:nil]; + [[m_macWindow contentView] setNeedsDisplay:YES]; + } + else + [m_macWindow orderOut:nil]; + return true; +} + +bool wxNonOwnedWindowCocoaImpl::ShowWithEffect(bool show, wxShowEffect effect, unsigned timeout) +{ + return Show(show); +} + +void wxNonOwnedWindowCocoaImpl::Update() +{ + [m_macWindow displayIfNeeded]; +} + +bool wxNonOwnedWindowCocoaImpl::SetTransparent(wxByte alpha) +{ + [m_macWindow setAlphaValue:(CGFloat) alpha/255.0]; + return true; +} + +bool wxNonOwnedWindowCocoaImpl::SetBackgroundColour(const wxColour& col ) +{ + return true; +} + +void wxNonOwnedWindowCocoaImpl::SetExtraStyle( long exStyle ) +{ + if ( m_macWindow ) + { + bool metal = exStyle & wxFRAME_EX_METAL ; + int windowStyle = [ m_macWindow styleMask]; + if ( metal && !(windowStyle & NSTexturedBackgroundWindowMask) ) + { + wxFAIL_MSG( _T("Metal Style cannot be changed after creation") ); + } + else if ( !metal && (windowStyle & NSTexturedBackgroundWindowMask ) ) + { + wxFAIL_MSG( _T("Metal Style cannot be changed after creation") ); + } + } +} + +bool wxNonOwnedWindowCocoaImpl::SetBackgroundStyle(wxBackgroundStyle style) +{ + return true; +} + +bool wxNonOwnedWindowCocoaImpl::CanSetTransparent() +{ + return true; +} + +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]; +} + +void wxNonOwnedWindowCocoaImpl::GetPosition( int &x, int &y ) const +{ + wxRect r = wxFromNSRect( NULL, [m_macWindow frame] ); + x = r.GetLeft(); + y = r.GetTop(); +} + +void wxNonOwnedWindowCocoaImpl::GetSize( int &width, int &height ) const +{ + NSRect rect = [m_macWindow frame]; + width = rect.size.width; + height = rect.size.height; +} + +void wxNonOwnedWindowCocoaImpl::GetContentArea( int& left, int &right, 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; +} + +bool wxNonOwnedWindowCocoaImpl::SetShape(const wxRegion& region) +{ + return false; +} + +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 ) + [m_macWindow miniaturize:nil]; + else + [m_macWindow deminiaturize:nil]; +} + +void wxNonOwnedWindowCocoaImpl::Maximize(bool maximize) +{ + [m_macWindow zoom:nil]; +} + + +// http://cocoadevcentral.com/articles/000028.php + +typedef struct +{ + int m_formerLevel; + NSRect m_formerFrame; +} FullScreenData ; + +bool wxNonOwnedWindowCocoaImpl::IsFullScreen() const +{ + return m_macFullScreenData != NULL ; +} + +bool wxNonOwnedWindowCocoaImpl::ShowFullScreen(bool show, long style) +{ + if ( show ) + { + FullScreenData *data = (FullScreenData *)m_macFullScreenData ; + delete data ; + data = new FullScreenData(); + + m_macFullScreenData = data ; + data->m_formerLevel = [m_macWindow level]; + data->m_formerFrame = [m_macWindow frame]; + CGDisplayCapture( kCGDirectMainDisplay ); + [m_macWindow setLevel:CGShieldingWindowLevel()]; + [m_macWindow setFrame:[[NSScreen mainScreen] frame] display:YES]; + } + else if ( m_macFullScreenData != NULL ) + { + FullScreenData *data = (FullScreenData *) m_macFullScreenData ; + CGDisplayRelease( kCGDirectMainDisplay ); + [m_macWindow setLevel:data->m_formerLevel]; + [m_macWindow setFrame:data->m_formerFrame display:YES]; + delete data ; + m_macFullScreenData = NULL ; + } + + return true; +} + +void wxNonOwnedWindowCocoaImpl::RequestUserAttention(int WXUNUSED(flags)) +{ +} +#endif diff --git a/src/osx/cocoa/utils.mm b/src/osx/cocoa/utils.mm new file mode 100644 index 0000000000..279adf36fc --- /dev/null +++ b/src/osx/cocoa/utils.mm @@ -0,0 +1,138 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/mac/cocoa/utils.mm +// Purpose: various cocoa utility functions +// Author: Stefan Csomor +// Modified by: +// Created: 1998-01-01 +// RCS-ID: $Id: utils.mm 48805 2007-09-19 14:52:25Z SC $ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#include "wx/wxprec.h" + +#include "wx/utils.h" + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/app.h" + #if wxUSE_GUI + #include "wx/toplevel.h" + #include "wx/font.h" + #endif +#endif + +#include "wx/apptrait.h" + +#include "wx/osx/private.h" + +#if wxUSE_GUI +#if wxOSX_USE_COCOA_OR_CARBON + #include "wx/osx/uma.h" + #include + #include + #include "wx/osx/private/timer.h" +#endif +#endif // wxUSE_GUI + +#if wxOSX_USE_COCOA + +#if wxUSE_BASE + +// Emit a beeeeeep +void wxBell() +{ + NSBeep(); +} + +// ---------------------------------------------------------------------------- +// Common Event Support +// ---------------------------------------------------------------------------- + +void wxMacWakeUp() +{ + // TODO +} + +#endif // wxUSE_BASE + +#if wxUSE_GUI + +void wxClientDisplayRect(int *x, int *y, int *width, int *height) +{ + NSRect displayRect = [[NSScreen mainScreen] visibleFrame]; + wxRect r = wxFromNSRect( NULL, displayRect ); + if ( x ) + *x = r.x; + if ( y ) + *y = r.y; + if ( width ) + *width = r.GetWidth(); + if ( height ) + *height = r.GetHeight(); + +} + +void wxGetMousePosition( int* x, int* y ) +{ + wxPoint pt = wxFromNSPoint(NULL, [NSEvent mouseLocation]); +}; + +wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer) +{ + return new wxCarbonTimerImpl(timer); +} + +int gs_wxBusyCursorCount = 0; +extern wxCursor gMacCurrentCursor; +wxCursor gMacStoredActiveCursor; + +// Set the cursor to the busy cursor for all windows +void wxBeginBusyCursor(const wxCursor *cursor) +{ + if (gs_wxBusyCursorCount++ == 0) + { + gMacStoredActiveCursor = gMacCurrentCursor; + cursor->MacInstall(); + + wxSetCursor(*cursor); + } + //else: nothing to do, already set +} + +// Restore cursor to normal +void wxEndBusyCursor() +{ + wxCHECK_RET( gs_wxBusyCursorCount > 0, + wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") ); + + if (--gs_wxBusyCursorCount == 0) + { + gMacStoredActiveCursor.MacInstall(); + gMacStoredActiveCursor = wxNullCursor; + + wxSetCursor(wxNullCursor); + } +} + +// true if we're between the above two calls +bool wxIsBusy() +{ + return (gs_wxBusyCursorCount > 0); +} + +void wxMacGlobalToLocal( WindowRef window , Point*pt ) +{ +} + +void wxMacLocalToGlobal( WindowRef window , Point*pt ) +{ +} + +#endif // wxUSE_GUI + + + +#endif // wxOSX_USE_COCOA \ No newline at end of file diff --git a/src/osx/cocoa/window.mm b/src/osx/cocoa/window.mm new file mode 100644 index 0000000000..90311dff78 --- /dev/null +++ b/src/osx/cocoa/window.mm @@ -0,0 +1,434 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/osx/cocoa/window.mm +// Purpose: widgets (non tlw) for cocoa +// Author: Stefan Csomor +// Modified by: +// Created: 2008-06-20 +// RCS-ID: $Id: window.mm 48805 2007-09-19 14:52:25Z SC $ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#include + +#ifdef __WXMAC__ +#include "wx/osx/private.h" +#endif + +#if wxOSX_USE_COCOA + +@interface wxNSView : NSView +{ + wxWidgetImpl* m_impl; +} + +- (void)drawRect: (NSRect) rect; + +-(void)mouseDown:(NSEvent *)event ; +-(void)rightMouseDown:(NSEvent *)event ; +-(void)otherMouseDown:(NSEvent *)event ; +-(void)mouseUp:(NSEvent *)event ; +-(void)rightMouseUp:(NSEvent *)event ; +-(void)otherMouseUp:(NSEvent *)event ; +-(void)handleMouseEvent:(NSEvent *)event; + +- (void)setImplementation: (wxWidgetImpl *) theImplementation; +- (wxWidgetImpl*) implementation; +- (BOOL) isFlipped; +- (BOOL) becomeFirstResponder; +- (BOOL) resignFirstResponder; + +@end // wxNSView + +void SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEvent ) +{ + UInt32 modifiers = [nsEvent modifierFlags] ; + wxPoint screenMouseLocation = wxFromNSPoint( NULL, [nsEvent locationInWindow]); + + // these parameters are not given for all events + UInt32 button = [nsEvent buttonNumber]; + UInt32 clickCount = [nsEvent clickCount]; + UInt32 mouseChord = 0; // TODO does this exist for cocoa + + wxevent.m_x = screenMouseLocation.x; + wxevent.m_y = screenMouseLocation.y; + wxevent.m_shiftDown = modifiers & NSShiftKeyMask; + wxevent.m_controlDown = modifiers & NSControlKeyMask; + wxevent.m_altDown = modifiers & NSAlternateKeyMask; + wxevent.m_metaDown = modifiers & NSCommandKeyMask; + wxevent.m_clickCount = clickCount; + wxevent.SetTimestamp( [nsEvent timestamp] ) ; +/* + // a control click is interpreted as a right click + bool thisButtonIsFakeRight = false ; + if ( button == kEventMouseButtonPrimary && (modifiers & controlKey) ) + { + button = kEventMouseButtonSecondary ; + thisButtonIsFakeRight = true ; + } + + // otherwise we report double clicks by connecting a left click with a ctrl-left click + if ( clickCount > 1 && button != g_lastButton ) + clickCount = 1 ; + // we must make sure that our synthetic 'right' button corresponds in + // mouse down, moved and mouse up, and does not deliver a right down and left up + + if ( cEvent.GetKind() == kEventMouseDown ) + { + g_lastButton = button ; + g_lastButtonWasFakeRight = thisButtonIsFakeRight ; + } + + if ( button == 0 ) + { + g_lastButton = 0 ; + g_lastButtonWasFakeRight = false ; + } + else if ( g_lastButton == kEventMouseButtonSecondary && g_lastButtonWasFakeRight ) + button = g_lastButton ; + + // Adjust the chord mask to remove the primary button and add the + // secondary button. It is possible that the secondary button is + // already pressed, e.g. on a mouse connected to a laptop, but this + // possibility is ignored here: + if( thisButtonIsFakeRight && ( mouseChord & 1U ) ) + mouseChord = ((mouseChord & ~1U) | 2U); + + if(mouseChord & 1U) + wxevent.m_leftDown = true ; + if(mouseChord & 2U) + wxevent.m_rightDown = true ; + if(mouseChord & 4U) + wxevent.m_middleDown = true ; + +*/ + // translate into wx types + int eventType = [nsEvent type]; + switch (eventType) + { + case NSLeftMouseDown : + case NSRightMouseDown : + case NSOtherMouseDown : + switch ( button ) + { + case 0 : + wxevent.SetEventType( clickCount > 1 ? wxEVT_LEFT_DCLICK : wxEVT_LEFT_DOWN ) ; + break ; + + case 1 : + wxevent.SetEventType( clickCount > 1 ? wxEVT_RIGHT_DCLICK : wxEVT_RIGHT_DOWN ) ; + break ; + + case 2 : + wxevent.SetEventType( clickCount > 1 ? wxEVT_MIDDLE_DCLICK : wxEVT_MIDDLE_DOWN ) ; + break ; + + default: + break ; + } + break ; + + case NSLeftMouseUp : + case NSRightMouseUp : + case NSOtherMouseUp : + switch ( button ) + { + case 0 : + wxevent.SetEventType( wxEVT_LEFT_UP ) ; + break ; + + case 1 : + wxevent.SetEventType( wxEVT_RIGHT_UP ) ; + break ; + + case 2 : + wxevent.SetEventType( wxEVT_MIDDLE_UP ) ; + break ; + + default: + break ; + } + break ; + + case NSScrollWheel : + { + wxevent.SetEventType( wxEVT_MOUSEWHEEL ) ; + /* + EventMouseWheelAxis axis = cEvent.GetParameter(kEventParamMouseWheelAxis, typeMouseWheelAxis) ; + SInt32 delta = cEvent.GetParameter(kEventParamMouseWheelDelta, typeSInt32) ; + */ + wxevent.m_wheelRotation = 10; // delta; + wxevent.m_wheelDelta = 1; + wxevent.m_linesPerAction = 1; + if ( 0 /* axis == kEventMouseWheelAxisX*/ ) + wxevent.m_wheelAxis = 1; + } + break ; + + case NSMouseEntered : + case NSMouseExited : + case NSLeftMouseDragged : + case NSRightMouseDragged : + case NSOtherMouseDragged : + case NSMouseMoved : + wxevent.SetEventType( wxEVT_MOTION ) ; + break; + default : + break ; + } +} + +@implementation wxNSView + +- (void)drawRect: (NSRect) rect +{ + if ( m_impl ) + { + CGContextRef context = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort]; + CGContextSaveGState( context ); + CGContextBeginPath( context ); + CGContextMoveToPoint(context, 0, 0); + NSRect bounds = [self bounds]; + CGContextAddLineToPoint(context, 10, 0); + CGContextMoveToPoint(context, 0, 0); + CGContextAddLineToPoint(context, 0, 10); + CGContextMoveToPoint(context, bounds.size.width, bounds.size.height); + CGContextAddLineToPoint(context, bounds.size.width, bounds.size.height-10); + CGContextMoveToPoint(context, bounds.size.width, bounds.size.height); + CGContextAddLineToPoint(context, bounds.size.width-10, bounds.size.height); + CGContextClosePath( context ); + CGContextStrokePath(context); + + if ( [ self isFlipped ] == NO ) + { + CGContextTranslateCTM( context, 0, [self bounds].size.height ); + CGContextScaleCTM( context, 1, -1 ); + } + m_impl->GetWXPeer()->MacSetCGContextRef( context ); + + wxPaintEvent event; + event.SetTimestamp(0); // todo + event.SetEventObject(m_impl->GetWXPeer()); + m_impl->GetWXPeer()->HandleWindowEvent(event); + + CGContextRestoreGState( context ); + } +} + +-(void)mouseDown:(NSEvent *)event +{ + [self handleMouseEvent:event]; +} + +-(void)rightMouseDown:(NSEvent *)event +{ + [self handleMouseEvent:event]; +} + +-(void)otherMouseDown:(NSEvent *)event +{ + [self handleMouseEvent:event]; +} + +-(void)mouseUp:(NSEvent *)event +{ + [self handleMouseEvent:event]; +} + +-(void)rightMouseUp:(NSEvent *)event +{ + [self handleMouseEvent:event]; +} + +-(void)otherMouseUp:(NSEvent *)event +{ + [self handleMouseEvent:event]; +} + +-(void)handleMouseEvent:(NSEvent *)event +{ + NSPoint clickLocation; + clickLocation = [self convertPoint:[event locationInWindow] fromView:nil]; + wxPoint pt = wxFromNSPoint( self, clickLocation ); + wxMouseEvent wxevent(wxEVT_LEFT_DOWN); + SetupMouseEvent( wxevent , event ) ; + wxevent.m_x = pt.x; + wxevent.m_y = pt.y; + m_impl->GetWXPeer()->HandleWindowEvent(wxevent); +} + +- (void)setImplementation: (wxWidgetImpl *) theImplementation +{ + m_impl = theImplementation; +} + +- (wxWidgetImpl*) implementation +{ + return m_impl; +} + +- (BOOL) isFlipped +{ + return YES; +} + +- (BOOL) becomeFirstResponder +{ + BOOL r = [super becomeFirstResponder]; + if ( r ) + { + } + return r; +} + +- (BOOL) resignFirstResponder +{ + BOOL r = [super resignFirstResponder]; + if ( r ) + { + } + return r; +} + + +@end // wxNSView + +IMPLEMENT_DYNAMIC_CLASS( wxWidgetCocoaImpl , wxWidgetImpl ) + +wxWidgetCocoaImpl::wxWidgetCocoaImpl( wxWindowMac* peer , WXWidget w, bool isRootControl ) : + wxWidgetImpl( peer, isRootControl ), m_osxView(w) +{ +} + +wxWidgetCocoaImpl::wxWidgetCocoaImpl() +{ +} + +void wxWidgetCocoaImpl::Init() +{ + m_osxView = NULL; +} + +wxWidgetCocoaImpl::~wxWidgetCocoaImpl() +{ + [m_osxView setImplementation:NULL]; + [m_osxView release]; +} + +bool wxWidgetCocoaImpl::IsVisible() const +{ + return [m_osxView isHiddenOrHasHiddenAncestor] == NO; +} + +void wxWidgetCocoaImpl::Raise() +{ +} + +void wxWidgetCocoaImpl::Lower() +{ +} + +void wxWidgetCocoaImpl::ScrollRect( const wxRect *rect, int dx, int dy ) +{ +} + +void wxWidgetCocoaImpl::Move(int x, int y, int width, int height) +{ + NSRect r = wxToNSRect( [m_osxView superview], wxRect(x,y,width, height) ); + [m_osxView setFrame:r]; +} + +void wxWidgetCocoaImpl::GetPosition( int &x, int &y ) const +{ + wxRect r = wxFromNSRect( [m_osxView superview], [m_osxView frame] ); + x = r.GetLeft(); + y = r.GetTop(); +} + +void wxWidgetCocoaImpl::GetSize( int &width, int &height ) const +{ + NSRect rect = [m_osxView frame]; + width = rect.size.width; + height = rect.size.height; +} + +void wxWidgetCocoaImpl::GetContentArea( int&left, int &top, int &width, int &height ) +{ + left = top = 0; + GetSize( width, height ); +} + +void wxWidgetCocoaImpl::SetNeedsDisplay( const wxRect* where ) +{ + if ( where ) + [m_osxView setNeedsDisplayInRect:wxToNSRect(m_osxView, *where )]; + else + [m_osxView setNeedsDisplay:YES]; +} + +bool wxWidgetCocoaImpl::GetNeedsDisplay() const +{ + return [m_osxView needsDisplay]; +} + +void wxWidgetCocoaImpl::CanFocus() const +{ + return [m_osxView acceptsFirstResponder] == YES; +} + +bool wxWidgetCocoaImpl::HasFocus() const +{ + return [m_osxView isFirstResponder] == YES; +} + +bool wxWidgetCocoaImpl::SetFocus() +{ + [m_osxView makeKeyWindow] ; +} + + +void wxWidgetCocoaImpl::RemoveFromParent() +{ + [m_osxView removeFromSuperview]; +} + +void wxWidgetCocoaImpl::Embed( wxWidgetImpl *parent ) +{ + NSView* container = parent->GetWXWidget() ; + wxASSERT_MSG( container != NULL , wxT("No valid mac container control") ) ; + [container addSubview:m_osxView]; +} + + +// +// Factory methods +// + +wxWidgetImpl* wxWidgetImpl::CreateUserPane( wxWindowMac* wxpeer, const wxPoint& pos, const wxSize& size, + long style, long extraStyle, const wxString& name) +{ + NSView* sv = (wxpeer->GetParent()->GetHandle() ); + + NSRect r = wxToNSRect( sv, wxRect( pos, size) ); + // Rect bounds = wxMacGetBoundsForControl( wxpeer, pos , size ) ; + wxNSView* v = [[wxNSView alloc] initWithFrame:r]; + [sv addSubview:v]; + wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( wxpeer, v ); + [v setImplementation:c]; + return c; +} + +wxWidgetImpl* wxWidgetImpl::CreateContentView( wxNonOwnedWindow* now ) +{ + NSWindow* tlw = now->GetWXWindow(); + wxNSView* v = [[wxNSView alloc] initWithFrame:[[tlw contentView] frame]]; + wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( now, v, true ); + [v setImplementation:c]; + [tlw setContentView:v]; + return c; +} + + +#endif