#include "wx/wxprec.h"
#ifndef WX_PRECOMP
+ #include "wx/dcclient.h"
#include "wx/nonownedwnd.h"
#include "wx/log.h"
#endif
@interface wxNSView : NSView
{
+ NSTrackingRectTag rectTag;
}
- (BOOL) canBecomeKeyView;
-
+// the tracking tag is needed to track mouse enter / exit events
+- (void) setTrackingTag: (NSTrackingRectTag)tag;
+- (NSTrackingRectTag) trackingTag;
@end // wxNSView
@interface NSView(PossibleMethods)
- (void)setImage:(NSImage *)image;
- (void)setControlSize:(NSControlSize)size;
+- (void)setFont:(NSFont *)fontObject;
+
- (id)contentView;
- (void)setTarget:(id)anObject;
- (void)setDoubleAction:(SEL)aSelector;
@end
-long wxOSXTranslateCocoaKey( int unichar )
+long wxOSXTranslateCocoaKey( NSEvent* event )
{
- long retval = unichar;
- switch( unichar )
+ long retval = 0;
+
+ if ([event type] != NSFlagsChanged)
+ {
+ NSString* s = [event charactersIgnoringModifiers];
+ // backspace char reports as delete w/modifiers for some reason
+ if ([s length] == 1)
+ {
+ switch ( [s characterAtIndex:0] )
+ {
+ // backspace key
+ case 0x7F :
+ case 8 :
+ retval = WXK_BACK;
+ break;
+ case NSUpArrowFunctionKey :
+ retval = WXK_UP;
+ break;
+ case NSDownArrowFunctionKey :
+ retval = WXK_DOWN;
+ break;
+ case NSLeftArrowFunctionKey :
+ retval = WXK_LEFT;
+ break;
+ case NSRightArrowFunctionKey :
+ retval = WXK_RIGHT;
+ break;
+ case NSInsertFunctionKey :
+ retval = WXK_INSERT;
+ break;
+ case NSDeleteFunctionKey :
+ retval = WXK_DELETE;
+ break;
+ case NSHomeFunctionKey :
+ retval = WXK_HOME;
+ break;
+ // case NSBeginFunctionKey :
+ // retval = WXK_BEGIN;
+ // break;
+ case NSEndFunctionKey :
+ retval = WXK_END;
+ break;
+ case NSPageUpFunctionKey :
+ retval = WXK_PAGEUP;
+ break;
+ case NSPageDownFunctionKey :
+ retval = WXK_PAGEDOWN;
+ break;
+ case NSHelpFunctionKey :
+ retval = WXK_HELP;
+ break;
+ default:
+ int intchar = [s characterAtIndex: 0];
+ if ( intchar >= NSF1FunctionKey && intchar <= NSF24FunctionKey )
+ retval = WXK_F1 + (intchar - NSF1FunctionKey );
+ break;
+ }
+ }
+ }
+
+ // Some keys don't seem to have constants. The code mimics the approach
+ // taken by WebKit. See:
+ // http://trac.webkit.org/browser/trunk/WebCore/platform/mac/KeyEventMac.mm
+ switch( [event keyCode] )
{
- case NSUpArrowFunctionKey :
- retval = WXK_UP;
- break;
- case NSDownArrowFunctionKey :
- retval = WXK_DOWN;
+ // command key
+ case 54:
+ case 55:
+ retval = WXK_COMMAND;
break;
- case NSLeftArrowFunctionKey :
- retval = WXK_LEFT;
+ // caps locks key
+ case 57: // Capslock
+ retval = WXK_CAPITAL;
break;
- case NSRightArrowFunctionKey :
- retval = WXK_RIGHT;
+ // shift key
+ case 56: // Left Shift
+ case 60: // Right Shift
+ retval = WXK_SHIFT;
break;
- case NSInsertFunctionKey :
- retval = WXK_INSERT;
+ // alt key
+ case 58: // Left Alt
+ case 61: // Right Alt
+ retval = WXK_ALT;
break;
- case NSDeleteFunctionKey :
- retval = WXK_DELETE;
+ // ctrl key
+ case 59: // Left Ctrl
+ case 62: // Right Ctrl
+ retval = WXK_CONTROL;
break;
- case NSHomeFunctionKey :
- retval = WXK_HOME;
+ // clear key
+ case 71:
+ retval = WXK_CLEAR;
break;
-// case NSBeginFunctionKey :
-// retval = WXK_BEGIN;
-// break;
- case NSEndFunctionKey :
- retval = WXK_END;
- break;
- case NSPageUpFunctionKey :
- retval = WXK_PAGEUP;
- break;
- case NSPageDownFunctionKey :
- retval = WXK_PAGEDOWN;
- break;
- case NSHelpFunctionKey :
- retval = WXK_HELP;
+ // tab key
+ case 48:
+ retval = WXK_TAB;
break;
default :
- if ( unichar >= NSF1FunctionKey && unichar >= NSF24FunctionKey )
- retval = WXK_F1 + (unichar - NSF1FunctionKey );
break;
}
return retval;
}
-void SetupKeyEvent( wxKeyEvent &wxevent , NSEvent * nsEvent )
+void SetupKeyEvent( wxKeyEvent &wxevent , NSEvent * nsEvent, NSString* charString = NULL )
{
UInt32 modifiers = [nsEvent modifierFlags] ;
int eventType = [nsEvent type];
if ( eventType != NSFlagsChanged )
{
NSString* nschars = [nsEvent characters];
- if ( nschars )
+ if ( charString )
+ {
+ // if charString is set, it did not come from key up / key down
+ wxevent.SetEventType( wxEVT_CHAR );
+ wxCFStringRef cfchars((CFStringRef)[charString retain]);
+ chars = cfchars.AsString();
+ }
+ else if ( nschars )
{
wxCFStringRef cfchars((CFStringRef)[nschars retain]);
chars = cfchars.AsString();
}
}
- int unichar = chars.Length() > 0 ? chars[0] : 0;
- long keyval = wxOSXTranslateCocoaKey(unichar) ;
- if ( keyval == unichar && ( wxevent.GetEventType() == wxEVT_KEY_UP || wxevent.GetEventType() == wxEVT_KEY_DOWN ) )
- keyval = wxToupper( keyval ) ;
+ int aunichar = chars.Length() > 0 ? chars[0] : 0;
+ long keyval = 0;
+
+ if (wxevent.GetEventType() != wxEVT_CHAR)
+ keyval = wxOSXTranslateCocoaKey(nsEvent) ;
+ if ( !keyval )
+ {
+ if ( wxevent.GetEventType() == wxEVT_KEY_UP || wxevent.GetEventType() == wxEVT_KEY_DOWN )
+ keyval = wxToupper( aunichar ) ;
+ else
+ keyval = aunichar;
+ }
+
#if wxUSE_UNICODE
- wxevent.m_uniChar = unichar;
+ wxevent.m_uniChar = aunichar;
#endif
wxevent.m_keyCode = keyval;
}
// these parameters are not given for all events
UInt32 button = [nsEvent buttonNumber];
UInt32 clickCount = 0;
- if ( eventType != NSScrollWheel )
- [nsEvent clickCount];
wxevent.m_x = screenMouseLocation.x;
wxevent.m_y = screenMouseLocation.y;
wxevent.m_controlDown = modifiers & NSControlKeyMask;
wxevent.m_altDown = modifiers & NSAlternateKeyMask;
wxevent.m_metaDown = modifiers & NSCommandKeyMask;
- wxevent.m_clickCount = clickCount;
wxevent.SetTimestamp( [nsEvent timestamp] * 1000.0 ) ;
UInt32 mouseChord = 0;
case NSLeftMouseDown :
case NSRightMouseDown :
case NSOtherMouseDown :
+ clickCount = [nsEvent clickCount];
switch ( button )
{
case 0 :
case NSLeftMouseUp :
case NSRightMouseUp :
case NSOtherMouseUp :
+ clickCount = [nsEvent clickCount];
switch ( button )
{
case 0 :
case NSScrollWheel :
{
wxevent.SetEventType( wxEVT_MOUSEWHEEL ) ;
- wxevent.m_wheelDelta = 1;
+ wxevent.m_wheelDelta = 10;
wxevent.m_linesPerAction = 1;
+ NSLog(@"deltaX %f, deltaY %f",[nsEvent deltaX], [nsEvent deltaY]);
if ( abs([nsEvent deltaX]) > abs([nsEvent deltaY]) )
{
wxevent.m_wheelAxis = 1;
- wxevent.m_wheelRotation = [nsEvent deltaX] > 0.0 ? 1 : -1;
+ wxevent.m_wheelRotation = [nsEvent deltaX] * 10.0;
}
else
{
- wxevent.m_wheelRotation = [nsEvent deltaY] > 0.0 ? 1 : -1;
+ wxevent.m_wheelRotation = [nsEvent deltaY] * 10.0;
}
}
break ;
case NSMouseEntered :
+ wxevent.SetEventType( wxEVT_ENTER_WINDOW ) ;
+ break;
case NSMouseExited :
+ wxevent.SetEventType( wxEVT_LEAVE_WINDOW ) ;
+ break;
case NSLeftMouseDragged :
case NSRightMouseDragged :
case NSOtherMouseDragged :
default :
break ;
}
+
+ wxevent.m_clickCount = clickCount;
+
}
@implementation wxNSView
return YES;
}
+- (void) setTrackingTag: (NSTrackingRectTag)tag
+{
+ rectTag = tag;
+}
+
+- (NSTrackingRectTag) trackingTag
+{
+ return rectTag;
+}
+
@end // wxNSView
//
impl->keyEvent(event, self, _cmd);
}
+void wxOSX_insertText(NSView* self, SEL _cmd, NSString* text)
+{
+ wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
+ if (impl == NULL)
+ return;
+
+ impl->insertText(text, self, _cmd);
+}
+
BOOL wxOSX_performKeyEquivalent(NSView* self, SEL _cmd, NSEvent *event)
{
wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
return impl->performKeyEquivalent(event, self, _cmd);
}
+BOOL wxOSX_acceptsFirstResponder(NSView* self, SEL _cmd)
+{
+ wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
+ if (impl == NULL)
+ return NO;
+
+ return impl->acceptsFirstResponder(self, _cmd);
+}
+
BOOL wxOSX_becomeFirstResponder(NSView* self, SEL _cmd)
{
wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
return impl->drawRect(&rect, self, _cmd);
}
-void wxOSX_clickedAction(NSView* self, SEL _cmd, id sender)
+void wxOSX_controlAction(NSView* self, SEL _cmd, id sender)
{
wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
if (impl == NULL)
return;
- impl->clickedAction(self, _cmd, sender);
+ impl->controlAction(self, _cmd, sender);
}
-void wxOSX_doubleClickedAction(NSView* self, SEL _cmd, id sender)
+void wxOSX_controlDoubleAction(NSView* self, SEL _cmd, id sender)
{
wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
if (impl == NULL)
return;
- impl->doubleClickedAction(self, _cmd, sender);
+ impl->controlDoubleAction(self, _cmd, sender);
}
-unsigned int wxWidgetCocoaImpl::draggingEntered(void* s, WXWidget slf, void *_cmd)
+unsigned int wxWidgetCocoaImpl::draggingEntered(void* s, WXWidget WXUNUSED(slf), void *WXUNUSED(_cmd))
{
id <NSDraggingInfo>sender = (id <NSDraggingInfo>) s;
NSPasteboard *pboard = [sender draggingPasteboard];
return nsresult;
}
-void wxWidgetCocoaImpl::draggingExited(void* s, WXWidget slf, void *_cmd)
+void wxWidgetCocoaImpl::draggingExited(void* s, WXWidget WXUNUSED(slf), void *WXUNUSED(_cmd))
{
id <NSDraggingInfo>sender = (id <NSDraggingInfo>) s;
NSPasteboard *pboard = [sender draggingPasteboard];
CFRelease(pboardRef);
}
-unsigned int wxWidgetCocoaImpl::draggingUpdated(void* s, WXWidget slf, void *_cmd)
+unsigned int wxWidgetCocoaImpl::draggingUpdated(void* s, WXWidget WXUNUSED(slf), void *WXUNUSED(_cmd))
{
id <NSDraggingInfo>sender = (id <NSDraggingInfo>) s;
NSPasteboard *pboard = [sender draggingPasteboard];
return nsresult;
}
-bool wxWidgetCocoaImpl::performDragOperation(void* s, WXWidget slf, void *_cmd)
+bool wxWidgetCocoaImpl::performDragOperation(void* s, WXWidget WXUNUSED(slf), void *WXUNUSED(_cmd))
{
id <NSDraggingInfo>sender = (id <NSDraggingInfo>) s;
#endif
+typedef void (*wxOSX_TextEventHandlerPtr)(NSView* self, SEL _cmd, NSString *event);
typedef void (*wxOSX_EventHandlerPtr)(NSView* self, SEL _cmd, NSEvent *event);
typedef BOOL (*wxOSX_PerformKeyEventHandlerPtr)(NSView* self, SEL _cmd, NSEvent *event);
typedef BOOL (*wxOSX_FocusHandlerPtr)(NSView* self, SEL _cmd);
void wxWidgetCocoaImpl::keyEvent(WX_NSEvent event, WXWidget slf, void *_cmd)
{
- if ( !DoHandleKeyEvent(event) )
+ if ( [[slf window] firstResponder] != slf || !DoHandleKeyEvent(event) )
{
wxOSX_EventHandlerPtr superimpl = (wxOSX_EventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd];
superimpl(slf, (SEL)_cmd, event);
}
}
-bool wxWidgetCocoaImpl::performKeyEquivalent(WX_NSEvent event, WXWidget slf, void *_cmd)
+void wxWidgetCocoaImpl::insertText(NSString* text, WXWidget slf, void *_cmd)
{
- if ( !DoHandleKeyEvent(event) )
+ if (m_lastKeyDownEvent && !DoHandleCharEvent(m_lastKeyDownEvent, text) )
{
- wxOSX_PerformKeyEventHandlerPtr superimpl = (wxOSX_PerformKeyEventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd];
- return superimpl(slf, (SEL)_cmd, event);
+ wxOSX_TextEventHandlerPtr superimpl = (wxOSX_TextEventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd];
+ superimpl(slf, (SEL)_cmd, text);
}
+ m_lastKeyDownEvent = NULL;
+}
- return YES;
+
+bool wxWidgetCocoaImpl::performKeyEquivalent(WX_NSEvent event, WXWidget slf, void *_cmd)
+{
+ wxOSX_PerformKeyEventHandlerPtr superimpl = (wxOSX_PerformKeyEventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd];
+ return superimpl(slf, (SEL)_cmd, event);
+}
+
+bool wxWidgetCocoaImpl::acceptsFirstResponder(WXWidget slf, void *_cmd)
+{
+ // FIXME: We need to find a way to query AcceptsFocus here, but when we do it
+ // it calls native APIs which lead us back here and into a loop.
+ wxOSX_FocusHandlerPtr superimpl = (wxOSX_FocusHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd];
+ return superimpl(slf, (SEL)_cmd);
}
bool wxWidgetCocoaImpl::becomeFirstResponder(WXWidget slf, void *_cmd)
{
wxOSX_FocusHandlerPtr superimpl = (wxOSX_FocusHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd];
+ // get the current focus before running becomeFirstResponder
+ NSResponder* currentResponder = [[NSApp keyWindow] firstResponder];
+ NSView* otherView = (currentResponder != nil && [currentResponder isKindOfClass:[NSView class]]) ? (NSView*) currentResponder : NULL;
+ wxWidgetImpl* otherWindow = FindFromWXWidget(otherView);
BOOL r = superimpl(slf, (SEL)_cmd);
if ( r )
- DoNotifyFocusEvent( true );
+ DoNotifyFocusEvent( true, otherWindow );
return r;
}
{
wxOSX_FocusHandlerPtr superimpl = (wxOSX_FocusHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd];
BOOL r = superimpl(slf, (SEL)_cmd);
+ // get the current focus after running resignFirstResponder
+ NSResponder* currentResponder = [[NSApp keyWindow] firstResponder];
+ NSView* otherView = (currentResponder != nil && [currentResponder isKindOfClass:[NSView class]]) ? (NSView*) currentResponder : NULL;
+ wxWidgetImpl* otherWindow = FindFromWXWidget(otherView);
if ( r )
- DoNotifyFocusEvent( false );
+ DoNotifyFocusEvent( false, otherWindow );
return r;
}
superimpl(slf, (SEL)_cmd);
}
else
+ {
[slf addCursorRect: [slf bounds]
cursor: cursor];
+ }
}
}
-bool wxWidgetCocoaImpl::isFlipped(WXWidget slf, void *_cmd)
+bool wxWidgetCocoaImpl::isFlipped(WXWidget WXUNUSED(slf), void *WXUNUSED(_cmd))
{
return m_isFlipped;
}
#define OSX_DEBUG_DRAWING 0
-void wxWidgetCocoaImpl::drawRect(void* rect, WXWidget slf, void *_cmd)
+void wxWidgetCocoaImpl::drawRect(void* rect, WXWidget slf, void *WXUNUSED(_cmd))
{
CGContextRef context = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort];
CGContextSaveGState( context );
wxpeer->GetUpdateRegion() = updateRgn;
wxpeer->MacSetCGContextRef( context );
- wxPaintEvent event;
- event.SetTimestamp(0); // todo
- event.SetEventObject(wxpeer);
- bool handled = wxpeer->HandleWindowEvent(event);
+ bool handled = wxpeer->MacDoRedraw( 0 );
CGContextRestoreGState( context );
-
+
+ CGContextSaveGState( context );
if ( !handled )
{
// call super
SEL _cmd = @selector(drawRect:);
wxOSX_DrawRectHandlerPtr superimpl = (wxOSX_DrawRectHandlerPtr) [[slf superclass] instanceMethodForSelector:_cmd];
superimpl(slf, _cmd, *(NSRect*)rect);
+ CGContextRestoreGState( context );
+ CGContextSaveGState( context );
}
+ wxpeer->MacPaintChildrenBorders();
+ wxpeer->MacSetCGContextRef( NULL );
+ CGContextRestoreGState( context );
}
-void wxWidgetCocoaImpl::clickedAction( WXWidget slf, void *_cmd, void *sender)
+void wxWidgetCocoaImpl::controlAction( WXWidget WXUNUSED(slf), void *WXUNUSED(_cmd), void *WXUNUSED(sender))
{
wxWindow* wxpeer = (wxWindow*) GetWXPeer();
if ( wxpeer )
wxpeer->OSXHandleClicked(0);
}
-void wxWidgetCocoaImpl::doubleClickedAction( WXWidget slf, void *_cmd, void *sender)
+void wxWidgetCocoaImpl::controlDoubleAction( WXWidget WXUNUSED(slf), void *WXUNUSED(_cmd), void *WXUNUSED(sender))
{
}
wxOSX_CLASS_ADD_METHOD(c, @selector(keyDown:), (IMP) wxOSX_keyEvent, "v@:@" )
wxOSX_CLASS_ADD_METHOD(c, @selector(keyUp:), (IMP) wxOSX_keyEvent, "v@:@" )
wxOSX_CLASS_ADD_METHOD(c, @selector(flagsChanged:), (IMP) wxOSX_keyEvent, "v@:@" )
+
+ wxOSX_CLASS_ADD_METHOD(c, @selector(insertText:), (IMP) wxOSX_insertText, "v@:@" )
wxOSX_CLASS_ADD_METHOD(c, @selector(performKeyEquivalent:), (IMP) wxOSX_performKeyEquivalent, "v@:@" )
-
+ wxOSX_CLASS_ADD_METHOD(c, @selector(acceptsFirstResponder), (IMP) wxOSX_acceptsFirstResponder, "c@:" )
wxOSX_CLASS_ADD_METHOD(c, @selector(becomeFirstResponder), (IMP) wxOSX_becomeFirstResponder, "c@:" )
wxOSX_CLASS_ADD_METHOD(c, @selector(resignFirstResponder), (IMP) wxOSX_resignFirstResponder, "c@:" )
wxOSX_CLASS_ADD_METHOD(c, @selector(resetCursorRects), (IMP) wxOSX_resetCursorRects, "v@:" )
wxOSX_CLASS_ADD_METHOD(c, @selector(isFlipped), (IMP) wxOSX_isFlipped, "c@:" )
wxOSX_CLASS_ADD_METHOD(c, @selector(drawRect:), (IMP) wxOSX_drawRect, "v@:{_NSRect={_NSPoint=ff}{_NSSize=ff}}" )
- wxOSX_CLASS_ADD_METHOD(c, @selector(clickedAction:), (IMP) wxOSX_clickedAction, "v@:@" )
- wxOSX_CLASS_ADD_METHOD(c, @selector(doubleClickedAction:), (IMP) wxOSX_doubleClickedAction, "v@:@" )
+ wxOSX_CLASS_ADD_METHOD(c, @selector(controlAction:), (IMP) wxOSX_controlAction, "v@:@" )
+ wxOSX_CLASS_ADD_METHOD(c, @selector(controlDoubleAction:), (IMP) wxOSX_controlDoubleAction, "v@:@" )
#if wxUSE_DRAG_AND_DROP
wxOSX_CLASS_ADD_METHOD(c, @selector(draggingEntered:), (IMP) wxOSX_draggingEntered, "I@:@" )
{
m_osxView = NULL;
m_isFlipped = true;
+ m_lastKeyDownEvent = NULL;
}
wxWidgetCocoaImpl::~wxWidgetCocoaImpl()
{
}
-void wxWidgetCocoaImpl::ScrollRect( const wxRect *rect, int dx, int dy )
+void wxWidgetCocoaImpl::ScrollRect( const wxRect *WXUNUSED(rect), int WXUNUSED(dx), int WXUNUSED(dy) )
{
#if 1
SetNeedsDisplay() ;
wxWindowMac* parent = GetWXPeer()->GetParent();
// under Cocoa we might have a contentView in the wxParent to which we have to
// adjust the coordinates
- if (parent)
+ if (parent && [m_osxView superview] != parent->GetHandle() )
{
- wxPoint pt(parent->GetClientAreaOrigin());
- x -= pt.x;
- y -= pt.y;
+ int cx = 0,cy = 0,cw = 0,ch = 0;
+ if ( parent->GetPeer() )
+ {
+ parent->GetPeer()->GetContentArea(cx, cy, cw, ch);
+ x -= cx;
+ y -= cy;
+ }
}
+ [[m_osxView superview] setNeedsDisplayInRect:[m_osxView frame]];
NSRect r = wxToNSRect( [m_osxView superview], wxRect(x,y,width, height) );
[m_osxView setFrame:r];
+ [[m_osxView superview] setNeedsDisplayInRect:r];
+
+ if ([m_osxView respondsToSelector:@selector(trackingTag)] )
+ {
+ if ( [(wxNSView*)m_osxView trackingTag] )
+ [m_osxView removeTrackingRect: [(wxNSView*)m_osxView trackingTag]];
+
+ [(wxNSView*)m_osxView setTrackingTag: [m_osxView addTrackingRect: [m_osxView bounds] owner: m_osxView userData: nil assumeInside: NO]];
+ }
}
void wxWidgetCocoaImpl::GetPosition( int &x, int &y ) const
{
if ( [m_osxView respondsToSelector:@selector(setTitle:) ] )
{
- wxCFStringRef cf( title , m_wxPeer->GetFont().GetEncoding() );
+ wxCFStringRef cf( title , encoding );
[m_osxView setTitle:cf.AsNSString()];
}
+ else if ( [m_osxView respondsToSelector:@selector(setStringValue:) ] )
+ {
+ wxCFStringRef cf( title , encoding );
+ [m_osxView setStringValue:cf.AsNSString()];
+ }
}
}
}
-void wxWidgetCocoaImpl::SetupTabs( const wxNotebook& notebook)
+void wxWidgetCocoaImpl::SetupTabs( const wxNotebook& WXUNUSED(notebook))
{
// implementation in subclass
}
void wxWidgetCocoaImpl::GetBestRect( wxRect *r ) const
{
r->x = r->y = r->width = r->height = 0;
-// if ( [m_osxView isKindOfClass:[NSControl class]] )
+
if ( [m_osxView respondsToSelector:@selector(sizeToFit)] )
{
NSRect former = [m_osxView frame];
{
}
-void wxWidgetCocoaImpl::SetScrollThumb( wxInt32 val, wxInt32 view )
+void wxWidgetCocoaImpl::SetScrollThumb( wxInt32 WXUNUSED(val), wxInt32 WXUNUSED(view) )
{
}
[m_osxView setControlSize:size];
}
-void wxWidgetCocoaImpl::SetFont(wxFont const&, wxColour const&, long, bool)
+void wxWidgetCocoaImpl::SetFont(wxFont const& font, wxColour const&, long, bool)
{
- // TODO
+ if ([m_osxView respondsToSelector:@selector(setFont:)])
+ [m_osxView setFont: font.GetNSFont()];
}
void wxWidgetCocoaImpl::InstallEventHandler( WXWidget control )
if ([c respondsToSelector:@selector(setAction:)])
{
[c setTarget: c];
- [c setAction: @selector(clickedAction:)];
+ [c setAction: @selector(controlAction:)];
if ([c respondsToSelector:@selector(setDoubleAction:)])
{
- [c setDoubleAction: @selector(doubleClickedAction:)];
+ [c setDoubleAction: @selector(controlDoubleAction:)];
}
}
}
+bool wxWidgetCocoaImpl::DoHandleCharEvent(NSEvent *event, NSString *text)
+{
+ wxKeyEvent wxevent(wxEVT_KEY_DOWN);
+ SetupKeyEvent( wxevent, event, text );
+ wxevent.SetEventObject(GetWXPeer());
+
+ return GetWXPeer()->OSXHandleKeyEvent(wxevent);
+}
+
bool wxWidgetCocoaImpl::DoHandleKeyEvent(NSEvent *event)
{
wxKeyEvent wxevent(wxEVT_KEY_DOWN);
SetupKeyEvent( wxevent, event );
+ wxevent.SetEventObject(GetWXPeer());
+ bool result = GetWXPeer()->OSXHandleKeyEvent(wxevent);
- return GetWXPeer()->OSXHandleKeyEvent(wxevent);
+ // this will fire higher level events, like insertText, to help
+ // us handle EVT_CHAR, etc.
+ if ([event type] == NSKeyDown)
+ {
+ m_lastKeyDownEvent = event;
+ [m_osxView interpretKeyEvents:[NSArray arrayWithObject:event]];
+ }
+ return result;
}
bool wxWidgetCocoaImpl::DoHandleMouseEvent(NSEvent *event)
wxPoint pt = wxFromNSPoint( m_osxView, clickLocation );
wxMouseEvent wxevent(wxEVT_LEFT_DOWN);
SetupMouseEvent( wxevent , event ) ;
+ wxevent.SetEventObject(GetWXPeer());
wxevent.m_x = pt.x;
wxevent.m_y = pt.y;
return GetWXPeer()->HandleWindowEvent(wxevent);
}
-void wxWidgetCocoaImpl::DoNotifyFocusEvent(bool receivedFocus)
+void wxWidgetCocoaImpl::DoNotifyFocusEvent(bool receivedFocus, wxWidgetImpl* otherWindow)
{
wxWindow* thisWindow = GetWXPeer();
if ( thisWindow->MacGetTopLevelWindow() && NeedsFocusRect() )
wxFocusEvent event(wxEVT_SET_FOCUS, thisWindow->GetId());
event.SetEventObject(thisWindow);
- // TODO how to find out the targetFocusWindow ?
- // event.SetWindow(targetFocusWindow);
+ if (otherWindow)
+ event.SetWindow(otherWindow->GetWXPeer());
thisWindow->HandleWindowEvent(event) ;
}
else // !receivedFocuss
wxFocusEvent event( wxEVT_KILL_FOCUS, thisWindow->GetId());
event.SetEventObject(thisWindow);
- // TODO how to find out the targetFocusWindow ?
- // event.SetWindow(targetFocusWindow);
+ if (otherWindow)
+ event.SetWindow(otherWindow->GetWXPeer());
thisWindow->HandleWindowEvent(event) ;
}
}
// Factory methods
//
-wxWidgetImpl* wxWidgetImpl::CreateUserPane( wxWindowMac* wxpeer, wxWindowMac* parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
- long style, long extraStyle)
+wxWidgetImpl* wxWidgetImpl::CreateUserPane( wxWindowMac* wxpeer, wxWindowMac* WXUNUSED(parent),
+ wxWindowID WXUNUSED(id), const wxPoint& pos, const wxSize& size,
+ long WXUNUSED(style), long WXUNUSED(extraStyle))
{
NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
wxNSView* v = [[wxNSView alloc] initWithFrame:r];
NSWindow* tlw = now->GetWXWindow();
wxNSView* v = [[wxNSView alloc] initWithFrame:[[tlw contentView] frame]];
wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( now, v, true );
+ c->InstallEventHandler();
[tlw setContentView:v];
return c;
}