// Get the window with the focus
-WXWidget wxWidgetImpl::FindFocus()
+NSView* GetViewFromResponder( NSResponder* responder )
{
- NSView* focusedView = nil;
- NSWindow* keyWindow = [[NSApplication sharedApplication] keyWindow];
- if ( keyWindow != nil )
+ NSView* view = nil;
+ if ( [responder isKindOfClass:[NSTextView class]] )
{
- NSResponder* responder = [keyWindow firstResponder];
- if ( [responder isKindOfClass:[NSTextView class]] &&
- [keyWindow fieldEditor:NO forObject:nil] != nil )
- {
- focusedView = [(NSTextView*)responder delegate];
- }
+ NSView* delegate = [(NSTextView*)responder delegate];
+ if ( [delegate isKindOfClass:[NSTextField class] ] )
+ view = delegate;
else
- {
- if ( [responder isKindOfClass:[NSView class]] )
- focusedView = (NSView*) responder;
- }
+ view = (NSView*) responder;
}
+ else
+ {
+ if ( [responder isKindOfClass:[NSView class]] )
+ view = (NSView*) responder;
+ }
+ return view;
+}
+
+NSView* GetFocusedViewInWindow( NSWindow* keyWindow )
+{
+ NSView* focusedView = nil;
+ if ( keyWindow != nil )
+ focusedView = GetViewFromResponder([keyWindow firstResponder]);
+
return focusedView;
}
+WXWidget wxWidgetImpl::FindFocus()
+{
+ return GetFocusedViewInWindow( [[NSApplication sharedApplication] keyWindow] );
+}
+
NSRect wxOSXGetFrameForControl( wxWindowMac* window , const wxPoint& pos , const wxSize &size , bool adjustForOrigin )
{
int x, y, w, h ;
wxevent.m_rawCode = [nsEvent keyCode];
wxevent.m_rawFlags = modifiers;
- wxevent.SetTimestamp( [nsEvent timestamp] * 1000.0 ) ;
+ wxevent.SetTimestamp( (int)([nsEvent timestamp] * 1000) ) ;
wxString chars;
if ( eventType != NSFlagsChanged )
wxevent.m_controlDown = modifiers & NSControlKeyMask;
wxevent.m_altDown = modifiers & NSAlternateKeyMask;
wxevent.m_metaDown = modifiers & NSCommandKeyMask;
- wxevent.SetTimestamp( [nsEvent timestamp] * 1000.0 ) ;
+ wxevent.SetTimestamp( (int)([nsEvent timestamp] * 1000) ) ;
UInt32 mouseChord = 0;
if ( fabs([nsEvent deltaX]) > fabs([nsEvent deltaY]) )
{
wxevent.m_wheelAxis = 1;
- wxevent.m_wheelRotation = [nsEvent deltaX] * 10.0;
+ wxevent.m_wheelRotation = (int)([nsEvent deltaX] * 10);
}
else
{
- wxevent.m_wheelRotation = [nsEvent deltaY] * 10.0;
+ wxevent.m_wheelRotation = (int)([nsEvent deltaY] * 10);
}
}
break ;
return impl->performDragOperation(sender, self, _cmd) ? YES:NO ;
}
+#endif
+
void wxOSX_mouseEvent(NSView* self, SEL _cmd, NSEvent *event)
{
wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
return NSDragOperationNone;
wxDragResult result = wxDragNone;
- wxPoint pt = wxFromNSPoint( m_osxView, [sender draggingLocation] );
+ NSPoint nspoint = [m_osxView convertPoint:[sender draggingLocation] fromView:nil];
+ wxPoint pt = wxFromNSPoint( m_osxView, nspoint );
if ( sourceDragMask & NSDragOperationLink )
result = wxDragLink;
return NSDragOperationNone;
wxDragResult result = wxDragNone;
- wxPoint pt = wxFromNSPoint( m_osxView, [sender draggingLocation] );
+ NSPoint nspoint = [m_osxView convertPoint:[sender draggingLocation] fromView:nil];
+ wxPoint pt = wxFromNSPoint( m_osxView, nspoint );
if ( sourceDragMask & NSDragOperationLink )
result = wxDragLink;
wxWindow* wxpeer = GetWXPeer();
wxDropTarget* target = wxpeer->GetDropTarget();
wxDragResult result = wxDragNone;
- wxPoint pt = wxFromNSPoint( m_osxView, [sender draggingLocation] );
+ NSPoint nspoint = [m_osxView convertPoint:[sender draggingLocation] fromView:nil];
+ wxPoint pt = wxFromNSPoint( m_osxView, nspoint );
if ( sourceDragMask & NSDragOperationLink )
result = wxDragLink;
PasteboardRef pboardRef;
PasteboardCreate((CFStringRef)[pboard name], &pboardRef);
target->SetCurrentDragPasteboard(pboardRef);
- result = target->OnData(pt.x, pt.y, result);
+
+ if (target->OnDrop(pt.x, pt.y))
+ result = target->OnData(pt.x, pt.y, result);
+
CFRelease(pboardRef);
return result != wxDragNone;
}
-#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);
typedef BOOL (*wxOSX_ResetCursorRectsHandlerPtr)(NSView* self, SEL _cmd);
-typedef BOOL (*wxOSX_DrawRectHandlerPtr)(NSView* self, SEL _cmd, NSRect rect);
+typedef void (*wxOSX_DrawRectHandlerPtr)(NSView* self, SEL _cmd, NSRect rect);
void wxWidgetCocoaImpl::mouseEvent(WX_NSEvent event, WXWidget slf, void *_cmd)
{
if ( !DoHandleMouseEvent(event) )
{
- wxOSX_EventHandlerPtr superimpl = (wxOSX_EventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd];
- superimpl(slf, (SEL)_cmd, event);
+ // for plain NSView mouse events would propagate to parents otherwise
+ if (!m_wxPeer->MacIsUserPane())
+ {
+ wxOSX_EventHandlerPtr superimpl = (wxOSX_EventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd];
+ superimpl(slf, (SEL)_cmd, event);
+ }
}
}
void wxWidgetCocoaImpl::keyEvent(WX_NSEvent event, WXWidget slf, void *_cmd)
{
- if ( [[slf window] firstResponder] != slf || !DoHandleKeyEvent(event) )
+ if ( GetFocusedViewInWindow([slf window]) != slf || m_hasEditor || !DoHandleKeyEvent(event) )
{
wxOSX_EventHandlerPtr superimpl = (wxOSX_EventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd];
superimpl(slf, (SEL)_cmd, event);
void wxWidgetCocoaImpl::insertText(NSString* text, WXWidget slf, void *_cmd)
{
- if (m_lastKeyDownEvent && !DoHandleCharEvent(m_lastKeyDownEvent, text) )
+ if ( m_lastKeyDownEvent==NULL || m_hasEditor || !DoHandleCharEvent(m_lastKeyDownEvent, text) )
{
- wxOSX_TextEventHandlerPtr superimpl = (wxOSX_TextEventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd];
- superimpl(slf, (SEL)_cmd, text);
+ wxOSX_TextEventHandlerPtr superimpl = (wxOSX_TextEventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd];
+ superimpl(slf, (SEL)_cmd, text);
}
m_lastKeyDownEvent = NULL;
}
wxOSX_FocusHandlerPtr superimpl = (wxOSX_FocusHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd];
// get the current focus before running becomeFirstResponder
NSView* otherView = FindFocus();
+
wxWidgetImpl* otherWindow = FindFromWXWidget(otherView);
BOOL r = superimpl(slf, (SEL)_cmd);
if ( r )
{
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
+ // note that this value isn't reliable, it might return the same view that
+ // is resigning
NSView* otherView = FindFocus();
wxWidgetImpl* otherWindow = FindFromWXWidget(otherView);
// NSTextViews have an editor as true responder, therefore the might get the
- // resign notification if their editor takes over, don't trigger any event hen
- if ( r && otherWindow != this)
+ // resign notification if their editor takes over, don't trigger any event then
+ if ( r && !m_hasEditor)
{
DoNotifyFocusEvent( false, otherWindow );
}
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(performKeyEquivalent:), (IMP) wxOSX_performKeyEquivalent, "c@:@" )
wxOSX_CLASS_ADD_METHOD(c, @selector(acceptsFirstResponder), (IMP) wxOSX_acceptsFirstResponder, "c@:" )
wxOSX_CLASS_ADD_METHOD(c, @selector(becomeFirstResponder), (IMP) wxOSX_becomeFirstResponder, "c@:" )
m_osxView = NULL;
m_isFlipped = true;
m_lastKeyDownEvent = NULL;
+ m_hasEditor = false;
}
wxWidgetCocoaImpl::~wxWidgetCocoaImpl()
void wxWidgetCocoaImpl::Raise()
{
+ // Not implemented
}
void wxWidgetCocoaImpl::Lower()
{
+ // Not implemented
}
void wxWidgetCocoaImpl::ScrollRect( const wxRect *WXUNUSED(rect), int WXUNUSED(dx), int WXUNUSED(dy) )
void wxWidgetCocoaImpl::GetSize( int &width, int &height ) const
{
NSRect rect = [m_osxView frame];
- width = rect.size.width;
- height = rect.size.height;
+ width = (int)rect.size.width;
+ height = (int)rect.size.height;
}
void wxWidgetCocoaImpl::GetContentArea( int&left, int &top, int &width, int &height ) const
NSRect bounds = [m_osxView bounds];
NSRect rect = [cv frame];
- int y = rect.origin.y;
- int x = rect.origin.x;
+ int y = (int)rect.origin.y;
+ int x = (int)rect.origin.x;
if ( ![ m_osxView isFlipped ] )
- y = bounds.size.height - (rect.origin.y + rect.size.height);
+ y = (int)(bounds.size.height - (rect.origin.y + rect.size.height));
left = x;
top = y;
- width = rect.size.width;
- height = rect.size.height;
+ width = (int)rect.size.width;
+ height = (int)rect.size.height;
}
else
{
return false;
[[m_osxView window] makeFirstResponder: m_osxView] ;
+ [[m_osxView window] makeKeyAndOrderFront:nil] ;
return true;
}
{
if ( [m_osxView respondsToSelector:@selector(getMinValue:)] )
{
- return [m_osxView minValue];
+ return (int)[m_osxView minValue];
}
return 0;
}
{
if ( [m_osxView respondsToSelector:@selector(getMaxValue:)] )
{
- return [m_osxView maxValue];
+ return (int)[m_osxView maxValue];
}
return 0;
}
+wxBitmap wxWidgetCocoaImpl::GetBitmap() const
+{
+ wxBitmap bmp;
+
+ // TODO: how to create a wxBitmap from NSImage?
+#if 0
+ if ( [m_osxView respondsToSelector:@selector(image:)] )
+ bmp = [m_osxView image];
+#endif
+
+ return bmp;
+}
+
void wxWidgetCocoaImpl::SetBitmap( const wxBitmap& bitmap )
{
if ( [m_osxView respondsToSelector:@selector(setImage:)] )
}
}
+void wxWidgetCocoaImpl::SetBitmapPosition( wxDirection dir )
+{
+ if ( [m_osxView respondsToSelector:@selector(setImagePosition:)] )
+ {
+ NSCellImagePosition pos;
+ switch ( dir )
+ {
+ case wxLEFT:
+ pos = NSImageLeft;
+ break;
+
+ case wxRIGHT:
+ pos = NSImageRight;
+ break;
+
+ case wxTOP:
+ pos = NSImageAbove;
+ break;
+
+ case wxBOTTOM:
+ pos = NSImageBelow;
+ break;
+
+ default:
+ wxFAIL_MSG( "invalid image position" );
+ pos = NSNoImage;
+ }
+
+ [m_osxView setImagePosition:pos];
+ }
+}
+
void wxWidgetCocoaImpl::SetupTabs( const wxNotebook& WXUNUSED(notebook))
{
// implementation in subclass
[m_osxView sizeToFit];
NSRect best = [m_osxView frame];
[m_osxView setFrame:former];
- r->width = best.size.width;
- r->height = best.size.height;
+ r->width = (int)best.size.width;
+ r->height = (int)best.size.height;
}
}
// this will fire higher level events, like insertText, to help
// us handle EVT_CHAR, etc.
- if ([event type] == NSKeyDown)
+ if ( !m_hasEditor && [event type] == NSKeyDown)
{
m_lastKeyDownEvent = event;
if ( !result )
- [m_osxView interpretKeyEvents:[NSArray arrayWithObject:event]];
+ {
+ if ( [m_osxView isKindOfClass:[NSScrollView class] ] )
+ [[(NSScrollView*)m_osxView documentView] interpretKeyEvents:[NSArray arrayWithObject:event]];
+ else
+ [m_osxView interpretKeyEvents:[NSArray arrayWithObject:event]];
+ result = true;
+ }
}
return result;
}