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
This commit is contained in:
Stefan Csomor
2002-08-14 18:41:12 +00:00
parent 41d368a4bb
commit 8095ef23e7
3 changed files with 125 additions and 12 deletions

View File

@@ -91,6 +91,7 @@ class WXDLLEXPORT wxComboBox: public wxChoice
virtual void Remove(long from, long to); virtual void Remove(long from, long to);
virtual void SetSelection(long from, long to); virtual void SetSelection(long from, long to);
virtual void SetEditable(bool editable); virtual void SetEditable(bool editable);
virtual int GetCount() const { return m_choice->GetCount() ; }
void MacHandleControlClick( WXWidget control , wxInt16 controlpart ) ; void MacHandleControlClick( WXWidget control , wxInt16 controlpart ) ;
protected: protected:
// the subcontrols // the subcontrols

View File

@@ -57,12 +57,62 @@ public:
} }
protected: protected:
void OnTextChange( wxCommandEvent& event ) void OnChar( wxKeyEvent& event )
{ {
wxString s = GetValue(); if ( event.KeyCode() == WXK_RETURN )
{
wxString value = GetValue();
if (!s.IsEmpty()) if ( m_cb->GetCount() == 0 )
m_cb->DelegateTextChanged( s ); {
// 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;
}
}
event.Skip(); event.Skip();
} }
@@ -74,7 +124,7 @@ private:
}; };
BEGIN_EVENT_TABLE(wxComboBoxText, wxTextCtrl) BEGIN_EVENT_TABLE(wxComboBoxText, wxTextCtrl)
EVT_TEXT(-1, wxComboBoxText::OnTextChange) EVT_CHAR( wxComboBoxText::OnChar)
END_EVENT_TABLE() END_EVENT_TABLE()
class wxComboBoxChoice : public wxChoice class wxComboBoxChoice : public wxChoice
@@ -92,6 +142,11 @@ protected:
wxString s = e.GetString(); wxString s = e.GetString();
m_cb->DelegateChoice( s ); 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: private:
@@ -187,6 +242,7 @@ void wxComboBox::SetFocus()
void wxComboBox::DelegateTextChanged( const wxString& value ) void wxComboBox::DelegateTextChanged( const wxString& value )
{ {
SetStringSelection( value );
} }

View File

@@ -57,12 +57,62 @@ public:
} }
protected: protected:
void OnTextChange( wxCommandEvent& event ) void OnChar( wxKeyEvent& event )
{ {
wxString s = GetValue(); if ( event.KeyCode() == WXK_RETURN )
{
wxString value = GetValue();
if (!s.IsEmpty()) if ( m_cb->GetCount() == 0 )
m_cb->DelegateTextChanged( s ); {
// 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;
}
}
event.Skip(); event.Skip();
} }
@@ -74,7 +124,7 @@ private:
}; };
BEGIN_EVENT_TABLE(wxComboBoxText, wxTextCtrl) BEGIN_EVENT_TABLE(wxComboBoxText, wxTextCtrl)
EVT_TEXT(-1, wxComboBoxText::OnTextChange) EVT_CHAR( wxComboBoxText::OnChar)
END_EVENT_TABLE() END_EVENT_TABLE()
class wxComboBoxChoice : public wxChoice class wxComboBoxChoice : public wxChoice
@@ -92,6 +142,11 @@ protected:
wxString s = e.GetString(); wxString s = e.GetString();
m_cb->DelegateChoice( s ); 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: private:
@@ -187,6 +242,7 @@ void wxComboBox::SetFocus()
void wxComboBox::DelegateTextChanged( const wxString& value ) void wxComboBox::DelegateTextChanged( const wxString& value )
{ {
SetStringSelection( value );
} }