diff --git a/include/wx/osx/cocoa/dataview.h b/include/wx/osx/cocoa/dataview.h index 23ff816053..9f54e49e6d 100644 --- a/include/wx/osx/cocoa/dataview.h +++ b/include/wx/osx/cocoa/dataview.h @@ -573,6 +573,9 @@ public: virtual void SetFont(const wxFont& font) wxOVERRIDE; + virtual void keyEvent(WX_NSEvent event, WXWidget slf, void* _cmd) wxOVERRIDE; + virtual bool doCommandBySelector(void* sel, WXWidget slf, void* _cmd) wxOVERRIDE; + private: void InitOutlineView(long style); int GetDefaultRowHeight() const; diff --git a/include/wx/osx/cocoa/private.h b/include/wx/osx/cocoa/private.h index e4800c979c..53aa9011c6 100644 --- a/include/wx/osx/cocoa/private.h +++ b/include/wx/osx/cocoa/private.h @@ -199,7 +199,8 @@ public : virtual void cursorUpdate(WX_NSEvent event, WXWidget slf, void* _cmd); virtual void keyEvent(WX_NSEvent event, WXWidget slf, void* _cmd); virtual void insertText(NSString* text, WXWidget slf, void* _cmd); - virtual void doCommandBySelector(void* sel, WXWidget slf, void* _cmd); + // Returns true if the event was processed by a user-defined event handler. + virtual bool doCommandBySelector(void* sel, WXWidget slf, void* _cmd); virtual bool acceptsFirstResponder(WXWidget slf, void* _cmd); virtual bool becomeFirstResponder(WXWidget slf, void* _cmd); virtual bool resignFirstResponder(WXWidget slf, void* _cmd); diff --git a/include/wx/osx/dataview.h b/include/wx/osx/dataview.h index 7e759472b1..457eddbebd 100644 --- a/include/wx/osx/dataview.h +++ b/include/wx/osx/dataview.h @@ -284,7 +284,6 @@ protected: // event handling void OnSize(wxSizeEvent &event); - void OnMouse(wxMouseEvent &event); private: // initializing of local variables: diff --git a/src/osx/cocoa/dataview.mm b/src/osx/cocoa/dataview.mm index 6ff0cc3088..ae6fb345bb 100644 --- a/src/osx/cocoa/dataview.mm +++ b/src/osx/cocoa/dataview.mm @@ -1632,6 +1632,16 @@ outlineView:(NSOutlineView*)outlineView // ============================================================================ @implementation wxCocoaOutlineView ++ (void)initialize +{ + static BOOL initialized = NO; + if (!initialized) + { + initialized = YES; + wxOSXCocoaClassAddWXMethods( self ); + } +} + // // initializers / destructor // @@ -1723,20 +1733,15 @@ outlineView:(NSOutlineView*)outlineView // Default enter key behaviour is to begin cell editing. Subclass keyDown to // provide a keyboard wxEVT_DATAVIEW_ITEM_ACTIVATED event and allow the NSEvent // to pass if the wxEvent is not processed. -- (void)keyDown:(NSEvent *)event + +// catch events routed here and feed them back before things get routed up the responder chain +// otherwise we lose functionality like arrow keys etc. +- (void)doCommandBySelector:(SEL)aSelector { - if( [[event charactersIgnoringModifiers] - characterAtIndex: 0] == NSCarriageReturnCharacter ) + wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); + if (impl) { - wxDataViewCtrl* const dvc = implementation->GetDataViewCtrl(); - const wxDataViewItem item = wxDataViewItem( [[self itemAtRow:[self selectedRow]] pointer]); - wxDataViewEvent eventDV(wxEVT_DATAVIEW_ITEM_ACTIVATED, dvc, item); - if ( !dvc->GetEventHandler()->ProcessEvent(eventDV) ) - [super keyDown:event]; - } - else - { - [super keyDown:event]; // all other keys + impl->doCommandBySelector(aSelector, self, _cmd); } } @@ -2082,7 +2087,8 @@ wxCocoaDataViewControl::wxCocoaDataViewControl(wxWindow* peer, : wxWidgetCocoaImpl ( peer, - [[NSScrollView alloc] initWithFrame:wxOSXGetFrameForControl(peer,pos,size)] + [[NSScrollView alloc] initWithFrame:wxOSXGetFrameForControl(peer,pos,size)], + wxWidgetImpl::Widget_UserKeyEvents ), m_DataSource(NULL), m_OutlineView([[wxCocoaOutlineView alloc] init]), @@ -2130,6 +2136,37 @@ wxCocoaDataViewControl::~wxCocoaDataViewControl() [m_OutlineView release]; } +void wxCocoaDataViewControl::keyEvent(WX_NSEvent event, WXWidget slf, void *_cmd) +{ + if( [event type] == NSKeyDown && [[event charactersIgnoringModifiers] + characterAtIndex: 0] == NSCarriageReturnCharacter ) + { + wxDataViewCtrl* const dvc = GetDataViewCtrl(); + const wxDataViewItem item = wxDataViewItem( [[m_OutlineView itemAtRow:[m_OutlineView selectedRow]] pointer]); + wxDataViewEvent eventDV(wxEVT_DATAVIEW_ITEM_ACTIVATED, dvc, item); + if ( !dvc->GetEventHandler()->ProcessEvent(eventDV) ) + wxWidgetCocoaImpl::keyEvent(event, slf, _cmd); + } + else + { + wxWidgetCocoaImpl::keyEvent(event, slf, _cmd); // all other keys + } +} + +bool wxCocoaDataViewControl::doCommandBySelector(void* sel, WXWidget slf, void* _cmd) +{ + bool handled = wxWidgetCocoaImpl::doCommandBySelector(sel, slf, _cmd); + // if this special key has not been handled + if ( !handled && IsInNativeKeyDown() ) + { + // send the original key event back to the native implementation to get proper default handling like eg for arrow keys + wxOSX_EventHandlerPtr superimpl = (wxOSX_EventHandlerPtr) [[slf superclass] instanceMethodForSelector:@selector(keyDown:)]; + superimpl(slf, @selector(keyDown:), GetLastNativeKeyDownEvent()); + } + return handled; +} + + // // column related methods (inherited from wxDataViewWidgetImpl) // diff --git a/src/osx/cocoa/window.mm b/src/osx/cocoa/window.mm index ad88ff7181..ea7729abac 100644 --- a/src/osx/cocoa/window.mm +++ b/src/osx/cocoa/window.mm @@ -2145,7 +2145,7 @@ void wxWidgetCocoaImpl::insertText(NSString* text, WXWidget slf, void *_cmd) } } -void wxWidgetCocoaImpl::doCommandBySelector(void* sel, WXWidget slf, void* WXUNUSED(_cmd)) +bool wxWidgetCocoaImpl::doCommandBySelector(void* sel, WXWidget slf, void* WXUNUSED(_cmd)) { wxLogTrace(TRACE_KEYS, "Selector %s for %s", wxDumpSelector((SEL)sel), wxDumpNSView(slf)); @@ -2155,23 +2155,25 @@ void wxWidgetCocoaImpl::doCommandBySelector(void* sel, WXWidget slf, void* WXUNU // it is also possible to map 1 keystroke to multiple commands, eg Ctrl-O on mac is translated to the bash-equivalent of // execute and move back in history, since this results in two commands, Ctrl-O was sent twice as a wx key down event. // we now track the sending of the events to avoid duplicates. - + + bool handled = false; + if ( IsInNativeKeyDown() && !WasKeyDownSent()) { // If we have a corresponding key event, send wxEVT_KEY_DOWN now. // (see also: wxWidgetCocoaImpl::DoHandleKeyEvent) wxKeyEvent wxevent(wxEVT_KEY_DOWN); SetupKeyEvent( wxevent, GetLastNativeKeyDownEvent() ); - bool result = GetWXPeer()->OSXHandleKeyEvent(wxevent); + handled = GetWXPeer()->OSXHandleKeyEvent(wxevent); - if (!result) + if (!handled) { // Generate wxEVT_CHAR if wxEVT_KEY_DOWN is not handled. wxKeyEvent wxevent2(wxevent) ; wxevent2.SetEventType(wxEVT_CHAR); SetupKeyEvent( wxevent2, GetLastNativeKeyDownEvent() ); - GetWXPeer()->OSXHandleKeyEvent(wxevent2); + handled = GetWXPeer()->OSXHandleKeyEvent(wxevent2); } SetKeyDownSent(); } @@ -2179,6 +2181,8 @@ void wxWidgetCocoaImpl::doCommandBySelector(void* sel, WXWidget slf, void* WXUNU { wxLogTrace(TRACE_KEYS, "Doing nothing in doCommandBySelector:"); } + + return handled; } bool wxWidgetCocoaImpl::acceptsFirstResponder(WXWidget slf, void *_cmd) diff --git a/src/osx/dataview_osx.cpp b/src/osx/dataview_osx.cpp index c79d04f3c1..7ac200d45b 100644 --- a/src/osx/dataview_osx.cpp +++ b/src/osx/dataview_osx.cpp @@ -765,16 +765,10 @@ wxSize wxDataViewCtrl::DoGetBestSize() const return best; } -void wxDataViewCtrl::OnMouse(wxMouseEvent& event) -{ - event.Skip(); -} - wxIMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl,wxDataViewCtrlBase); wxBEGIN_EVENT_TABLE(wxDataViewCtrl,wxDataViewCtrlBase) EVT_SIZE(wxDataViewCtrl::OnSize) - EVT_MOTION(wxDataViewCtrl::OnMouse) wxEND_EVENT_TABLE() #endif // !wxHAS_GENERIC_DATAVIEWCTRL