More work on getting wxLisBox events right

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@53827 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2008-05-29 23:13:47 +00:00
parent 4081eb6fe2
commit 13d843f1c1
2 changed files with 45 additions and 41 deletions

View File

@@ -111,6 +111,8 @@ public:
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
wxMacListControl* GetPeer() const; wxMacListControl* GetPeer() const;
bool MacGetBlockEvents() const { return m_blockEvents; }
protected: protected:
virtual void DoClear(); virtual void DoClear();
@@ -135,6 +137,8 @@ protected:
virtual wxSize DoGetBestSize() const; virtual wxSize DoGetBestSize() const;
bool m_blockEvents;
private: private:
DECLARE_DYNAMIC_CLASS(wxListBox) DECLARE_DYNAMIC_CLASS(wxListBox)
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()

View File

@@ -73,6 +73,7 @@ bool wxListBox::Create(
const wxValidator& validator, const wxValidator& validator,
const wxString& name ) const wxString& name )
{ {
m_blockEvents = false;
m_macIsUserPane = false; m_macIsUserPane = false;
wxASSERT_MSG( !(style & wxLB_MULTIPLE) || !(style & wxLB_EXTENDED), wxASSERT_MSG( !(style & wxLB_MULTIPLE) || !(style & wxLB_EXTENDED),
@@ -120,7 +121,9 @@ void wxListBox::DoDeleteOneItem(unsigned int n)
{ {
wxCHECK_RET( IsValid(n), wxT("invalid index in wxListBox::Delete") ); wxCHECK_RET( IsValid(n), wxT("invalid index in wxListBox::Delete") );
m_blockEvents = true;
GetPeer()->MacDelete( n ); GetPeer()->MacDelete( n );
m_blockEvents = false;
UpdateOldSelections(); UpdateOldSelections();
} }
@@ -158,7 +161,9 @@ int wxListBox::FindString(const wxString& s, bool bCase) const
void wxListBox::DoClear() void wxListBox::DoClear()
{ {
m_blockEvents = true;
FreeData(); FreeData();
m_blockEvents = false;
UpdateOldSelections(); UpdateOldSelections();
} }
@@ -168,10 +173,14 @@ void wxListBox::DoSetSelection(int n, bool select)
wxCHECK_RET( n == wxNOT_FOUND || IsValid(n), wxCHECK_RET( n == wxNOT_FOUND || IsValid(n),
wxT("invalid index in wxListBox::SetSelection") ); wxT("invalid index in wxListBox::SetSelection") );
m_blockEvents = true;
if ( n == wxNOT_FOUND ) if ( n == wxNOT_FOUND )
GetPeer()->MacDeselectAll(); GetPeer()->MacDeselectAll();
else else
GetPeer()->MacSetSelection( n, select, HasMultipleSelection() ); GetPeer()->MacSetSelection( n, select, HasMultipleSelection() );
m_blockEvents = false;
UpdateOldSelections(); UpdateOldSelections();
} }
@@ -419,41 +428,10 @@ void wxMacListBoxItem::Notification(wxMacDataItemBrowserControl *owner ,
wxListBox *list = wxDynamicCast( owner->GetPeer() , wxListBox ); wxListBox *list = wxDynamicCast( owner->GetPeer() , wxListBox );
wxCHECK_RET( list != NULL , wxT("Listbox expected")); wxCHECK_RET( list != NULL , wxT("Listbox expected"));
#if 0
// Doesn't work
if (list->HasMultipleSelection() && (message == kDataBrowserSelectionSetChanged))
{
list->CalcAndSendEvent();
return;
}
#else
if (list->HasMultipleSelection() && ((message == kDataBrowserItemSelected) || (message == kDataBrowserItemDeselected)))
{
list->CalcAndSendEvent();
return;
}
#endif
bool trigger = false; if (message == kDataBrowserItemDoubleClicked)
wxCommandEvent event( wxEVT_COMMAND_LISTBOX_SELECTED, list->GetId() );
switch (message)
{
case kDataBrowserItemSelected:
trigger = !lb->IsSelectionSuppressed();
break;
case kDataBrowserItemDoubleClicked:
event.SetEventType( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED );
trigger = true;
break;
default:
break;
}
if ( trigger )
{ {
wxCommandEvent event( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, list->GetId() );
event.SetEventObject( list ); event.SetEventObject( list );
if ( list->HasClientObjectData() ) if ( list->HasClientObjectData() )
event.SetClientObject( (wxClientData*) m_data ); event.SetClientObject( (wxClientData*) m_data );
@@ -461,13 +439,9 @@ void wxMacListBoxItem::Notification(wxMacDataItemBrowserControl *owner ,
event.SetClientData( m_data ); event.SetClientData( m_data );
event.SetString( m_label ); event.SetString( m_label );
event.SetInt( owner->GetLineFromItem( this ) ); event.SetInt( owner->GetLineFromItem( this ) );
event.SetExtraLong( list->HasMultipleSelection() ? message == kDataBrowserItemSelected : true ); event.SetExtraLong( 1 );
list->HandleWindowEvent(event);
// direct notification is not always having the listbox GetSelection() return;
// having in synch with event, so use wxPostEvent instead
// list->HandleWindowEvent(event);
wxPostEvent( list->GetEventHandler(), event );
} }
} }
@@ -561,7 +535,33 @@ void wxMacDataBrowserListControl::ItemNotification(
DataBrowserItemNotification message, DataBrowserItemNotification message,
DataBrowserItemDataRef itemData) DataBrowserItemDataRef itemData)
{ {
// hook specific browser-level (not item-level) processing here wxListBox *list = wxDynamicCast( GetPeer() , wxListBox );
wxCHECK_RET( list != NULL , wxT("Listbox expected"));
if (list->HasMultipleSelection() && (message == kDataBrowserSelectionSetChanged) && (!list->MacGetBlockEvents()))
{
list->CalcAndSendEvent();
return;
}
if ((message == kDataBrowserSelectionSetChanged) && (!list->MacGetBlockEvents()))
{
wxCommandEvent event( wxEVT_COMMAND_LISTBOX_SELECTED, list->GetId() );
int sel = list->GetSelection();
if ((sel < 0) || (sel > list->GetCount())) // OS X can select an item below the last item (why?)
return;
event.SetEventObject( list );
if ( list->HasClientObjectData() )
event.SetClientObject( list->GetClientObject( sel ) );
else if ( list->HasClientUntypedData() )
event.SetClientData( list->GetClientData( sel ) );
event.SetString( list->GetString( sel ) );
event.SetInt( sel );
event.SetExtraLong( 1 );
list->HandleWindowEvent(event);
return;
}
// call super for item level(wxMacDataItem->Notification) callback processing // call super for item level(wxMacDataItem->Notification) callback processing
wxMacDataItemBrowserControl::ItemNotification( itemID, message, itemData); wxMacDataItemBrowserControl::ItemNotification( itemID, message, itemData);