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 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

View File

@ -57,13 +57,63 @@ public:
}
protected:
void OnTextChange( wxCommandEvent& event )
void OnChar( wxKeyEvent& event )
{
wxString s = GetValue();
if (!s.IsEmpty())
m_cb->DelegateTextChanged( s );
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;
}
}
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 );
}

View File

@ -57,13 +57,63 @@ public:
}
protected:
void OnTextChange( wxCommandEvent& event )
void OnChar( wxKeyEvent& event )
{
wxString s = GetValue();
if (!s.IsEmpty())
m_cb->DelegateTextChanged( s );
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;
}
}
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 );
}