X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6d0ce565ff6a0db2e7c6e3240ef4cf6fe7950a35..5bf3f27fc91ff3288000c0134ac4bdfdf2e7db4f:/src/univ/combobox.cpp?ds=sidebyside diff --git a/src/univ/combobox.cpp b/src/univ/combobox.cpp index b884e8482d..1ca6ffd795 100644 --- a/src/univ/combobox.cpp +++ b/src/univ/combobox.cpp @@ -44,6 +44,19 @@ #include "wx/univ/inphand.h" #include "wx/univ/theme.h" +// ---------------------------------------------------------------------------- +// wxStdComboBoxInputHandler: allows the user to open/close the combo from kbd +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxStdComboBoxInputHandler : public wxStdInputHandler +{ +public: + wxStdComboBoxInputHandler(wxInputHandler *inphand); + + virtual bool HandleKey(wxInputConsumer *consumer, + const wxKeyEvent& event, + bool pressed); +}; // ---------------------------------------------------------------------------- // wxComboListBox is a listbox modified to be used as a popup window in a @@ -54,7 +67,7 @@ class wxComboListBox : public wxListBox, public wxComboPopup { public: // ctor and dtor - wxComboListBox(wxComboControlBase *combo); + wxComboListBox(); virtual ~wxComboListBox(); // implement wxComboPopup methods @@ -90,7 +103,7 @@ BEGIN_EVENT_TABLE(wxComboListBox, wxListBox) EVT_LEFT_UP(wxComboListBox::OnLeftUp) END_EVENT_TABLE() -IMPLEMENT_DYNAMIC_CLASS2(wxComboBox, wxControl, wxComboControl) +IMPLEMENT_DYNAMIC_CLASS2(wxComboBox, wxControl, wxComboCtrl) // ============================================================================ // implementation @@ -100,9 +113,7 @@ IMPLEMENT_DYNAMIC_CLASS2(wxComboBox, wxControl, wxComboControl) // wxComboListBox // ---------------------------------------------------------------------------- -wxComboListBox::wxComboListBox(wxComboControlBase *combo) - : wxListBox(), - wxComboPopup(combo) +wxComboListBox::wxComboListBox() : wxListBox(), wxComboPopup() { } @@ -111,8 +122,8 @@ bool wxComboListBox::Create(wxWindow* parent) if ( !wxListBox::Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, - wxBORDER_SIMPLE | wxLB_INT_HEIGHT | - m_combo->GetWindowStyle() & wxCB_SORT ? wxLB_SORT : 0) ) + wxBORDER_SIMPLE | + ( m_combo->GetWindowStyle() & wxCB_SORT ? wxLB_SORT : 0 ) ) ) return false; // we don't react to the mouse events outside the window at all @@ -133,28 +144,12 @@ wxString wxComboListBox::GetStringValue() const void wxComboListBox::SetStringValue(const wxString& value) { if ( !value.empty() ) - wxListBox::SetStringSelection(value); - else - wxListBox::SetSelection(-1); - - /* - // PRE-GLOBAL WXCOMBOCONTROL CODE: - - // FindItem() would just find the current item for an empty string (it - // always matches), but we want to show the first one in such case - if ( value.empty() ) - { - if ( GetCount() > 0 ) - { - wxListBox::SetSelection(0); - } - //else: empty listbox - nothing to do - } - else if ( !FindItem(value) ) { - // no match att all + if (FindString(value) != wxNOT_FOUND) + wxListBox::SetStringSelection(value); } - */ + else + wxListBox::SetSelection(-1); } void wxComboListBox::OnPopup() @@ -170,7 +165,7 @@ bool wxComboListBox::PerformAction(const wxControlAction& action, { // we don't let the listbox handle this as instead of just using the // single key presses, as usual, we use the text ctrl value as prefix - // and this is done by wxComboControl itself + // and this is done by wxComboCtrl itself return true; } @@ -253,13 +248,13 @@ bool wxComboBox::Create(wxWindow *parent, const wxValidator& validator, const wxString& name) { - if ( !wxComboControl::Create(parent, id, value, pos, size, style, + if ( !wxComboCtrl::Create(parent, id, value, pos, size, style, validator, name) ) { return false; } - wxComboListBox *combolbox = new wxComboListBox(this); + wxComboListBox *combolbox = new wxComboListBox(); SetPopupControl(combolbox); m_lbox = combolbox; @@ -278,12 +273,12 @@ wxComboBox::~wxComboBox() wxString wxComboBox::GetValue() const { - return wxComboControl::GetValue(); + return wxComboCtrl::GetValue(); } void wxComboBox::SetValue(const wxString& value) { - wxComboControl::SetValue(value); + wxComboCtrl::SetValue(value); } void wxComboBox::Copy() @@ -349,13 +344,13 @@ void wxComboBox::SetEditable(bool editable) // wxComboBox methods forwarded to wxListBox // ---------------------------------------------------------------------------- -void wxComboBox::Clear() +void wxComboBox::DoClear() { GetLBox()->Clear(); if ( GetTextCtrl() ) GetTextCtrl()->SetValue(wxEmptyString); } -void wxComboBox::Delete(unsigned int n) +void wxComboBox::DoDeleteOneItem(unsigned int n) { wxCHECK_RET( IsValid(n), _T("invalid index in wxComboBox::Delete") ); @@ -391,10 +386,15 @@ int wxComboBox::FindString(const wxString& s, bool bCase) const void wxComboBox::SetSelection(int n) { - wxCHECK_RET( IsValid(n), _T("invalid index in wxComboBox::Select") ); + wxCHECK_RET( (n == wxNOT_FOUND || IsValid(n)), _T("invalid index in wxComboBox::Select") ); GetLBox()->SetSelection(n); - if ( GetTextCtrl() ) GetTextCtrl()->SetValue(GetLBox()->GetString(n)); + + wxString str; + if ( n != wxNOT_FOUND ) + str = GetLBox()->GetString(n); + + SetText(str); } int wxComboBox::GetSelection() const @@ -410,21 +410,11 @@ int wxComboBox::GetSelection() const #endif } -int wxComboBox::DoAppend(const wxString& item) -{ - return GetLBox()->Append(item); -} - -int wxComboBox::DoInsert(const wxString& item, unsigned int pos) +int wxComboBox::DoInsertItems(const wxArrayStringsAdapter & items, + unsigned int pos, + void **clientData, wxClientDataType type) { - wxCHECK_MSG(!(GetWindowStyle() & wxCB_SORT), -1, wxT("can't insert into sorted list")); - wxCHECK_MSG(IsValidInsert(pos), -1, wxT("invalid index")); - - if (pos == GetCount()) - return DoAppend(item); - - GetLBox()->Insert(item, pos); - return pos; + return GetLBox()->DoInsertItems(items, pos, clientData, type); } void wxComboBox::DoSetItemClientData(unsigned int n, void* clientData) @@ -437,16 +427,6 @@ void *wxComboBox::DoGetItemClientData(unsigned int n) const return GetLBox()->GetClientData(n); } -void wxComboBox::DoSetItemClientObject(unsigned int n, wxClientData* clientData) -{ - GetLBox()->SetClientObject(n, clientData); -} - -wxClientData* wxComboBox::DoGetItemClientObject(unsigned int n) const -{ - return GetLBox()->GetClientObject(n); -} - bool wxComboBox::IsEditable() const { return GetTextCtrl() != NULL && (!HasFlag(wxCB_READONLY) || GetTextCtrl()->IsEditable() ); @@ -548,5 +528,12 @@ bool wxStdComboBoxInputHandler::HandleKey(wxInputConsumer *consumer, return wxStdInputHandler::HandleKey(consumer, event, pressed); } +/* static */ +wxInputHandler *wxComboBox::GetStdInputHandler(wxInputHandler *handlerDef) +{ + static wxStdComboBoxInputHandler s_handler(handlerDef); + + return &s_handler; +} #endif // wxUSE_COMBOBOX