diff --git a/include/wx/osx/listbox.h b/include/wx/osx/listbox.h index e96b186d7a..2882c2eff9 100644 --- a/include/wx/osx/listbox.h +++ b/include/wx/osx/listbox.h @@ -122,9 +122,11 @@ public: wxListWidgetImpl* GetListPeer() const; - bool MacGetBlockEvents() const { return m_blockEvents; } - virtual void HandleLineEvent( unsigned int n, bool doubleClick ); + + // This is called by wxNSTableView + void MacHandleSelectionChange(int row); + protected: // callback for derived classes which may have to insert additional data // at a certain line - which cannot be predetermined for sorted list data diff --git a/src/osx/cocoa/listbox.mm b/src/osx/cocoa/listbox.mm index 2078be5035..d8847e5ae3 100644 --- a/src/osx/cocoa/listbox.mm +++ b/src/osx/cocoa/listbox.mm @@ -297,24 +297,12 @@ protected: int row = [self selectedRow]; - if (row == -1) - { - // no row selected - } - else - { - wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); - wxListBox *list = static_cast ( impl->GetWXPeer()); - wxCHECK_RET( list != NULL , wxT("Listbox expected")); + wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); + wxListBox* const list = wxDynamicCast(impl->GetWXPeer(), wxListBox); + wxCHECK_RET( list != NULL , "Associated control should be a wxListBox" ); - if ((row < 0) || (row > (int) list->GetCount())) // OS X can select an item below the last item - return; - - if ( !list->MacGetBlockEvents() ) - list->HandleLineEvent( row, false ); - } - -} + list->MacHandleSelectionChange(row); +} - (void)setFont:(NSFont *)aFont { diff --git a/src/osx/listbox_osx.cpp b/src/osx/listbox_osx.cpp index f824848ec0..ff41b53a37 100644 --- a/src/osx/listbox_osx.cpp +++ b/src/osx/listbox_osx.cpp @@ -420,6 +420,40 @@ void wxListBox::HandleLineEvent( unsigned int n, bool doubleClick ) HandleWindowEvent(event); } +void wxListBox::MacHandleSelectionChange(int row) +{ + if ( m_blockEvents ) + return; + + // Correct notification events for multiselection list. + if ( HasMultipleSelection() ) + { + CalcAndSendEvent(); + return; + } + + // OS X can select an item below the last item. In that case keep the old + // selection because in wxWidgets API there is no notification event for + // removing the selection from a single-selection list box. + // + // Otherwise call DoChangeSingleSelection so GetOldSelection() will return + // the correct value if row < 0 later. + const int count = static_cast(GetCount()); + if ( row < 0 || row >= count ) + { + if ( !m_oldSelections.empty() ) + { + const int oldsel = m_oldSelections[0]; + if ( oldsel >= 0 && oldsel < count ) + SetSelection(oldsel); + } + } + else if ( DoChangeSingleSelection(row) ) + { + HandleLineEvent( row, false ); + } +} + // // common list cell value operations //