X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3a1767632183503f200cd33f36f13d67c62f2a9e..bc9d3d911cfb51f612a699d7fb00f57eb5b2097c:/src/osx/cocoa/window.mm diff --git a/src/osx/cocoa/window.mm b/src/osx/cocoa/window.mm index 39a737650a..7b30bf644f 100644 --- a/src/osx/cocoa/window.mm +++ b/src/osx/cocoa/window.mm @@ -455,6 +455,11 @@ bool g_lastButtonWasFakeRight = false ; @interface NSEvent (DeviceDelta) - (CGFloat)deviceDeltaX; - (CGFloat)deviceDeltaY; + +// 10.7+ +- (BOOL)hasPreciseScrollingDeltas; +- (CGFloat)scrollingDeltaX; +- (CGFloat)scrollingDeltaY; @end void wxWidgetCocoaImpl::SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEvent ) @@ -609,23 +614,39 @@ void wxWidgetCocoaImpl::SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEve wxevent.SetEventType( wxEVT_MOUSEWHEEL ) ; - // see http://developer.apple.com/qa/qa2005/qa1453.html - // for more details on why we have to look for the exact type - - const EventRef cEvent = (EventRef) [nsEvent eventRef]; - bool isMouseScrollEvent = false; - if ( cEvent ) - isMouseScrollEvent = ::GetEventKind(cEvent) == kEventMouseScroll; - - if ( isMouseScrollEvent ) + if ( UMAGetSystemVersion() >= 0x1070 ) { - deltaX = [nsEvent deviceDeltaX]; - deltaY = [nsEvent deviceDeltaY]; + if ( [nsEvent hasPreciseScrollingDeltas] ) + { + deltaX = [nsEvent scrollingDeltaX]; + deltaY = [nsEvent scrollingDeltaY]; + } + else + { + deltaX = [nsEvent scrollingDeltaX] * 10; + deltaY = [nsEvent scrollingDeltaY] * 10; + } } else { - deltaX = ([nsEvent deltaX] * 10); - deltaY = ([nsEvent deltaY] * 10); + const EventRef cEvent = (EventRef) [nsEvent eventRef]; + // see http://developer.apple.com/qa/qa2005/qa1453.html + // for more details on why we have to look for the exact type + + bool isMouseScrollEvent = false; + if ( cEvent ) + isMouseScrollEvent = ::GetEventKind(cEvent) == kEventMouseScroll; + + if ( isMouseScrollEvent ) + { + deltaX = [nsEvent deviceDeltaX]; + deltaY = [nsEvent deviceDeltaY]; + } + else + { + deltaX = ([nsEvent deltaX] * 10); + deltaY = ([nsEvent deltaY] * 10); + } } wxevent.m_wheelDelta = 10; @@ -633,7 +654,7 @@ void wxWidgetCocoaImpl::SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEve if ( fabs(deltaX) > fabs(deltaY) ) { - wxevent.m_wheelAxis = 1; + wxevent.m_wheelAxis = wxMOUSE_WHEEL_HORIZONTAL; wxevent.m_wheelRotation = (int)deltaX; } else @@ -2072,6 +2093,27 @@ bool wxWidgetCocoaImpl::SetFocus() return true; } +void wxWidgetCocoaImpl::SetDropTarget(wxDropTarget* target) +{ + [m_osxView unregisterDraggedTypes]; + + if ( target == NULL ) + return; + + wxDataObject* dobj = target->GetDataObject(); + + if( dobj ) + { + CFMutableArrayRef typesarray = CFArrayCreateMutable(kCFAllocatorDefault,0,&kCFTypeArrayCallBacks); + dobj->AddSupportedTypes(typesarray); + NSView* targetView = m_osxView; + if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) + targetView = [(NSScrollView*) m_osxView documentView]; + + [targetView registerForDraggedTypes:(NSArray*)typesarray]; + CFRelease(typesarray); + } +} void wxWidgetCocoaImpl::RemoveFromParent() { @@ -2330,14 +2372,33 @@ void wxWidgetCocoaImpl::SetControlSize( wxWindowVariant variant ) if ([cell respondsToSelector:@selector(setControlSize:)]) [cell setControlSize:size]; } + + // we need to propagate this to inner views as well + if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) + { + NSView* targetView = [(NSScrollView*) m_osxView documentView]; + + if ( [targetView respondsToSelector:@selector(setControlSize:)] ) + [targetView setControlSize:size]; + else if ([targetView respondsToSelector:@selector(cell)]) + { + id cell = [(id)targetView cell]; + if ([cell respondsToSelector:@selector(setControlSize:)]) + [cell setControlSize:size]; + } + } } void wxWidgetCocoaImpl::SetFont(wxFont const& font, wxColour const&col, long, bool) { - if ([m_osxView respondsToSelector:@selector(setFont:)]) - [m_osxView setFont: font.OSXGetNSFont()]; - if ([m_osxView respondsToSelector:@selector(setTextColor:)]) - [m_osxView setTextColor:[NSColor colorWithCalibratedRed:(CGFloat) (col.Red() / 255.0) + NSView* targetView = m_osxView; + if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) + targetView = [(NSScrollView*) m_osxView documentView]; + + if ([targetView respondsToSelector:@selector(setFont:)]) + [targetView setFont: font.OSXGetNSFont()]; + if ([targetView respondsToSelector:@selector(setTextColor:)]) + [targetView setTextColor:[NSColor colorWithCalibratedRed:(CGFloat) (col.Red() / 255.0) green:(CGFloat) (col.Green() / 255.0) blue:(CGFloat) (col.Blue() / 255.0) alpha:(CGFloat) (col.Alpha() / 255.0)]]; @@ -2407,7 +2468,7 @@ bool wxWidgetCocoaImpl::DoHandleKeyEvent(NSEvent *event) if ( !result ) { - if ( IsUserPane() && [event type] == NSKeyDown) + if ( [event type] == NSKeyDown) { long keycode = wxOSXTranslateCocoaKey( event, wxEVT_CHAR ); @@ -2416,12 +2477,20 @@ bool wxWidgetCocoaImpl::DoHandleKeyEvent(NSEvent *event) // eventually we could setup a doCommandBySelector catcher and retransform this into the wx key chars wxKeyEvent wxevent2(wxevent) ; wxevent2.SetEventType(wxEVT_CHAR); + SetupKeyEvent( wxevent2, event ); wxevent2.m_keyCode = keycode; result = GetWXPeer()->OSXHandleKeyEvent(wxevent2); } + else if (wxevent.CmdDown()) + { + wxKeyEvent wxevent2(wxevent) ; + wxevent2.SetEventType(wxEVT_CHAR); + SetupKeyEvent( wxevent2, event ); + result = GetWXPeer()->OSXHandleKeyEvent(wxevent2); + } else { - if ( !wxevent.CmdDown() ) + if ( IsUserPane() && !wxevent.CmdDown() ) { if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) [[(NSScrollView*)m_osxView documentView] interpretKeyEvents:[NSArray arrayWithObject:event]]; @@ -2502,12 +2571,14 @@ void wxWidgetCocoaImpl::SetCursor(const wxCursor& cursor) void wxWidgetCocoaImpl::CaptureMouse() { - [[m_osxView window] disableCursorRects]; + // TODO remove if we don't get into problems with cursor settings + // [[m_osxView window] disableCursorRects]; } void wxWidgetCocoaImpl::ReleaseMouse() { - [[m_osxView window] enableCursorRects]; + // TODO remove if we don't get into problems with cursor settings + // [[m_osxView window] enableCursorRects]; } void wxWidgetCocoaImpl::SetFlipped(bool flipped) @@ -2526,10 +2597,6 @@ wxWidgetImpl* wxWidgetImpl::CreateUserPane( wxWindowMac* wxpeer, wxWindowMac* WX NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; wxNSView* v = [[wxNSView alloc] initWithFrame:r]; - // temporary hook for dnd - [v registerForDraggedTypes:[NSArray arrayWithObjects: - NSStringPboardType, NSFilenamesPboardType, NSTIFFPboardType, NSPICTPboardType, NSPDFPboardType, nil]]; - wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( wxpeer, v, false, true ); return c; }