Make the wxComboCtrl's wxTextEntry interface more complete and consistent. All text is no longer selected on SetValue(), but only when user selects an item from the drop-down list.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66394 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Jaakko Salli 2010-12-17 11:20:50 +00:00
parent 708cc39462
commit 0306e73e63
3 changed files with 88 additions and 26 deletions

View File

@ -199,14 +199,32 @@ public:
virtual bool Show(bool show = true); virtual bool Show(bool show = true);
virtual bool SetFont(const wxFont& font); virtual bool SetFont(const wxFont& font);
// wxTextCtrl methods - for readonly combo they should return //
// without errors. // wxTextEntry methods
virtual void SetValue(const wxString& value); //
// NB: We basically need to override all of them because there is
// no guarantee how platform-specific wxTextEntry is implemented.
//
virtual void SetValue(const wxString& value)
{ wxTextEntryBase::SetValue(value); }
virtual void ChangeValue(const wxString& value)
{ wxTextEntryBase::ChangeValue(value); }
// wxTextEntry methods - we basically need to override all of them
virtual void WriteText(const wxString& text); virtual void WriteText(const wxString& text);
virtual void AppendText(const wxString& text)
{ wxTextEntryBase::AppendText(text); }
virtual wxString GetValue() const
{ return wxTextEntryBase::GetValue(); }
virtual wxString GetRange(long from, long to) const
{ return wxTextEntryBase::GetRange(from, to); }
// Replace() and DoSetValue() need to be fully re-implemented since
// EventSuppressor utility class does not work with the way
// wxComboCtrl is implemented.
virtual void Replace(long from, long to, const wxString& value); virtual void Replace(long from, long to, const wxString& value);
virtual void Remove(long from, long to); virtual void Remove(long from, long to);
virtual void Copy(); virtual void Copy();
@ -237,7 +255,13 @@ public:
// This method sets value and also optionally sends EVT_TEXT // This method sets value and also optionally sends EVT_TEXT
// (needed by combo popups) // (needed by combo popups)
void SetValueWithEvent(const wxString& value, bool withEvent = true); wxDEPRECATED( void SetValueWithEvent(const wxString& value,
bool withEvent = true) );
// Changes value of the control as if user had done it by selecting an
// item from a combo box drop-down list. Needs to be public so that
// derived popup classes can call it.
void SetValueByUser(const wxString& value);
// //
// Popup customization methods // Popup customization methods
@ -464,6 +488,10 @@ protected:
// extraStyle: Extra style parameters // extraStyle: Extra style parameters
void CreateTextCtrl( int extraStyle ); void CreateTextCtrl( int extraStyle );
// Called when text was changed programmatically
// (e.g. from WriteText())
void OnSetValue(const wxString& value);
// Installs standard input handler to combo (and optionally to the textctrl) // Installs standard input handler to combo (and optionally to the textctrl)
void InstallInputHandlers(); void InstallInputHandlers();
@ -558,6 +586,7 @@ protected:
#endif #endif
// protected wxTextEntry methods // protected wxTextEntry methods
virtual void DoSetValue(const wxString& value, int flags);
virtual wxString DoGetValue() const; virtual wxString DoGetValue() const;
virtual wxWindow *GetEditableWindow() { return this; } virtual wxWindow *GetEditableWindow() { return this; }

View File

@ -2388,7 +2388,7 @@ void wxComboCtrlBase::HidePopup(bool generateEvent)
// transfer value and show it in textctrl, if any // transfer value and show it in textctrl, if any
if ( !IsPopupWindowState(Animating) ) if ( !IsPopupWindowState(Animating) )
SetValue( m_popupInterface->GetStringValue() ); SetValueByUser( m_popupInterface->GetStringValue() );
m_winPopup->Hide(); m_winPopup->Hide();
@ -2555,18 +2555,16 @@ wxString wxComboCtrlBase::DoGetValue() const
return m_valueString; return m_valueString;
} }
void wxComboCtrlBase::SetValueWithEvent(const wxString& value, bool withEvent) void wxComboCtrlBase::SetValueWithEvent(const wxString& value,
bool withEvent)
{ {
if ( m_text ) DoSetValue(value, withEvent ? SetValue_SendEvent : 0);
{ }
if ( !withEvent )
m_ignoreEvtText++;
m_text->SetValue(value); void wxComboCtrlBase::OnSetValue(const wxString& value)
{
if ( !(m_iFlags & wxCC_NO_TEXT_AUTO_SELECT) ) // Note: before wxComboCtrl inherited from wxTextEntry,
m_text->SelectAll(); // this code used to be in SetValueWithEvent().
}
// Since wxComboPopup may want to paint the combo as well, we need // Since wxComboPopup may want to paint the combo as well, we need
// to set the string value here (as well as sometimes in ShowPopup). // to set the string value here (as well as sometimes in ShowPopup).
@ -2583,9 +2581,20 @@ void wxComboCtrlBase::SetValueWithEvent(const wxString& value, bool withEvent)
Refresh(); Refresh();
} }
void wxComboCtrlBase::SetValue(const wxString& value) void wxComboCtrlBase::SetValueByUser(const wxString& value)
{ {
SetValueWithEvent(value, false); // NB: Order of function calls is important here. Otherwise
// the SelectAll() may not work.
if ( m_text )
{
m_text->SetValue(value);
if ( !(m_iFlags & wxCC_NO_TEXT_AUTO_SELECT) )
m_text->SelectAll();
}
OnSetValue(value);
} }
// In this SetValue variant wxComboPopup::SetStringValue is not called // In this SetValue variant wxComboPopup::SetStringValue is not called
@ -2646,24 +2655,48 @@ long wxComboCtrlBase::GetLastPosition() const
return 0; return 0;
} }
void wxComboCtrlBase::Replace(long from, long to, const wxString& value)
{
if ( m_text )
m_text->Replace(from, to, value);
}
void wxComboCtrlBase::WriteText(const wxString& text) void wxComboCtrlBase::WriteText(const wxString& text)
{ {
if ( m_text ) if ( m_text )
{
m_text->WriteText(text); m_text->WriteText(text);
OnSetValue(m_text->GetValue());
}
else else
SetText(m_valueString + text); {
OnSetValue(text);
}
}
void wxComboCtrlBase::DoSetValue(const wxString& value, int flags)
{
if ( m_text )
{
if ( flags & SetValue_SendEvent )
m_text->SetValue(value);
else
m_text->ChangeValue(value);
}
OnSetValue(value);
}
void wxComboCtrlBase::Replace(long from, long to, const wxString& value)
{
if ( m_text )
{
m_text->Replace(from, to, value);
OnSetValue(m_text->GetValue());
}
} }
void wxComboCtrlBase::Remove(long from, long to) void wxComboCtrlBase::Remove(long from, long to)
{ {
if ( m_text ) if ( m_text )
{
m_text->Remove(from, to); m_text->Remove(from, to);
OnSetValue(m_text->GetValue());
}
} }
void wxComboCtrlBase::SetSelection(long from, long to) void wxComboCtrlBase::SetSelection(long from, long to)

View File

@ -228,7 +228,7 @@ void wxVListBoxComboPopup::DismissWithEvent()
m_stringValue = wxEmptyString; m_stringValue = wxEmptyString;
if ( m_stringValue != m_combo->GetValue() ) if ( m_stringValue != m_combo->GetValue() )
m_combo->SetValueWithEvent(m_stringValue); m_combo->SetValueByUser(m_stringValue);
m_value = selection; m_value = selection;