From 8095ef23e7b800e88cfdae4991f474c34175e9e4 Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Wed, 14 Aug 2002 18:41:12 +0000 Subject: [PATCH] attempt to bring event system in synch with MSW git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16509 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/mac/combobox.h | 1 + src/mac/carbon/combobox.cpp | 68 +++++++++++++++++++++++++++++++++---- src/mac/combobox.cpp | 68 +++++++++++++++++++++++++++++++++---- 3 files changed, 125 insertions(+), 12 deletions(-) diff --git a/include/wx/mac/combobox.h b/include/wx/mac/combobox.h index eec2b6360a..2f9d8e2f5c 100644 --- a/include/wx/mac/combobox.h +++ b/include/wx/mac/combobox.h @@ -91,6 +91,7 @@ class WXDLLEXPORT wxComboBox: public wxChoice virtual void Remove(long from, long to); virtual void SetSelection(long from, long to); virtual void SetEditable(bool editable); + virtual int GetCount() const { return m_choice->GetCount() ; } void MacHandleControlClick( WXWidget control , wxInt16 controlpart ) ; protected: // the subcontrols diff --git a/src/mac/carbon/combobox.cpp b/src/mac/carbon/combobox.cpp index a3de1918ca..8ea92291e2 100644 --- a/src/mac/carbon/combobox.cpp +++ b/src/mac/carbon/combobox.cpp @@ -57,13 +57,63 @@ public: } protected: - void OnTextChange( wxCommandEvent& event ) + void OnChar( wxKeyEvent& event ) { - wxString s = GetValue(); + if ( event.KeyCode() == WXK_RETURN ) + { + wxString value = GetValue(); + + if ( m_cb->GetCount() == 0 ) + { + // make Enter generate "selected" event if there is only one item + // in the combobox - without it, it's impossible to select it at + // all! + wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, m_cb->GetId() ); + event.SetInt( 0 ); + event.SetString( value ); + event.SetEventObject( m_cb ); + m_cb->GetEventHandler()->ProcessEvent( event ); + } + else + { + // add the item to the list if it's not there yet + if ( m_cb->FindString(value) == wxNOT_FOUND ) + { + m_cb->Append(value); + m_cb->SetStringSelection(value); + + // and generate the selected event for it + wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, m_cb->GetId() ); + event.SetInt( m_cb->GetCount() - 1 ); + event.SetString( value ); + event.SetEventObject( m_cb ); + m_cb->GetEventHandler()->ProcessEvent( event ); + } + + // This will invoke the dialog default action, such + // as the clicking the default button. + + wxWindow *parent = GetParent(); + while( parent && !parent->IsTopLevel() && parent->GetDefaultItem() == NULL ) { + parent = parent->GetParent() ; + } + if ( parent && parent->GetDefaultItem() ) + { + wxButton *def = wxDynamicCast(parent->GetDefaultItem(), + wxButton); + if ( def && def->IsEnabled() ) + { + wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, def->GetId() ); + event.SetEventObject(def); + def->Command(event); + return ; + } + } + + return; + } + } - if (!s.IsEmpty()) - m_cb->DelegateTextChanged( s ); - event.Skip(); } @@ -74,7 +124,7 @@ private: }; BEGIN_EVENT_TABLE(wxComboBoxText, wxTextCtrl) - EVT_TEXT(-1, wxComboBoxText::OnTextChange) + EVT_CHAR( wxComboBoxText::OnChar) END_EVENT_TABLE() class wxComboBoxChoice : public wxChoice @@ -92,6 +142,11 @@ protected: wxString s = e.GetString(); m_cb->DelegateChoice( s ); + wxCommandEvent event2(wxEVT_COMMAND_COMBOBOX_SELECTED, m_cb->GetId() ); + event2.SetInt(m_cb->GetSelection()); + event2.SetEventObject(m_cb); + event2.SetString(m_cb->GetStringSelection()); + m_cb->ProcessCommand(event2); } private: @@ -187,6 +242,7 @@ void wxComboBox::SetFocus() void wxComboBox::DelegateTextChanged( const wxString& value ) { + SetStringSelection( value ); } diff --git a/src/mac/combobox.cpp b/src/mac/combobox.cpp index a3de1918ca..8ea92291e2 100644 --- a/src/mac/combobox.cpp +++ b/src/mac/combobox.cpp @@ -57,13 +57,63 @@ public: } protected: - void OnTextChange( wxCommandEvent& event ) + void OnChar( wxKeyEvent& event ) { - wxString s = GetValue(); + if ( event.KeyCode() == WXK_RETURN ) + { + wxString value = GetValue(); + + if ( m_cb->GetCount() == 0 ) + { + // make Enter generate "selected" event if there is only one item + // in the combobox - without it, it's impossible to select it at + // all! + wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, m_cb->GetId() ); + event.SetInt( 0 ); + event.SetString( value ); + event.SetEventObject( m_cb ); + m_cb->GetEventHandler()->ProcessEvent( event ); + } + else + { + // add the item to the list if it's not there yet + if ( m_cb->FindString(value) == wxNOT_FOUND ) + { + m_cb->Append(value); + m_cb->SetStringSelection(value); + + // and generate the selected event for it + wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, m_cb->GetId() ); + event.SetInt( m_cb->GetCount() - 1 ); + event.SetString( value ); + event.SetEventObject( m_cb ); + m_cb->GetEventHandler()->ProcessEvent( event ); + } + + // This will invoke the dialog default action, such + // as the clicking the default button. + + wxWindow *parent = GetParent(); + while( parent && !parent->IsTopLevel() && parent->GetDefaultItem() == NULL ) { + parent = parent->GetParent() ; + } + if ( parent && parent->GetDefaultItem() ) + { + wxButton *def = wxDynamicCast(parent->GetDefaultItem(), + wxButton); + if ( def && def->IsEnabled() ) + { + wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, def->GetId() ); + event.SetEventObject(def); + def->Command(event); + return ; + } + } + + return; + } + } - if (!s.IsEmpty()) - m_cb->DelegateTextChanged( s ); - event.Skip(); } @@ -74,7 +124,7 @@ private: }; BEGIN_EVENT_TABLE(wxComboBoxText, wxTextCtrl) - EVT_TEXT(-1, wxComboBoxText::OnTextChange) + EVT_CHAR( wxComboBoxText::OnChar) END_EVENT_TABLE() class wxComboBoxChoice : public wxChoice @@ -92,6 +142,11 @@ protected: wxString s = e.GetString(); m_cb->DelegateChoice( s ); + wxCommandEvent event2(wxEVT_COMMAND_COMBOBOX_SELECTED, m_cb->GetId() ); + event2.SetInt(m_cb->GetSelection()); + event2.SetEventObject(m_cb); + event2.SetString(m_cb->GetStringSelection()); + m_cb->ProcessCommand(event2); } private: @@ -187,6 +242,7 @@ void wxComboBox::SetFocus() void wxComboBox::DelegateTextChanged( const wxString& value ) { + SetStringSelection( value ); } -- 2.47.2