X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a57d600f1aa4bae88f4c9b8d89a35332c412939e..fb8d7eb7a880f1f2e32d8830f9c5e12b2536e05f:/src/univ/combobox.cpp?ds=sidebyside diff --git a/src/univ/combobox.cpp b/src/univ/combobox.cpp index b9b03b00c3..9d4118eaa2 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 @@ -79,6 +92,8 @@ protected: void OnLeftUp(wxMouseEvent& event); private: + friend class wxComboBox; // it accesses our DoGetItemClientData() + DECLARE_EVENT_TABLE() }; @@ -90,8 +105,6 @@ BEGIN_EVENT_TABLE(wxComboListBox, wxListBox) EVT_LEFT_UP(wxComboListBox::OnLeftUp) END_EVENT_TABLE() -IMPLEMENT_DYNAMIC_CLASS2(wxComboBox, wxControl, wxComboCtrl) - // ============================================================================ // implementation // ============================================================================ @@ -109,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 @@ -131,7 +144,10 @@ wxString wxComboListBox::GetStringValue() const void wxComboListBox::SetStringValue(const wxString& value) { if ( !value.empty() ) - wxListBox::SetStringSelection(value); + { + if (FindString(value) != wxNOT_FOUND) + wxListBox::SetStringSelection(value); + } else wxListBox::SetSelection(-1); } @@ -164,10 +180,10 @@ void wxComboListBox::OnLeftUp(wxMouseEvent& event) m_combo->SetValue(wxListBox::GetStringSelection()); // next let the user code have the event - wxCommandEvent evt(wxEVT_COMMAND_COMBOBOX_SELECTED,m_combo->GetId()); + wxCommandEvent evt(wxEVT_COMBOBOX,m_combo->GetId()); evt.SetInt(wxListBox::GetSelection()); evt.SetEventObject(m_combo); - m_combo->ProcessEvent(evt); + m_combo->ProcessWindowEvent(evt); event.Skip(); } @@ -187,7 +203,7 @@ wxSize wxComboListBox::GetAdjustedSize(int minWidth, void wxComboBox::Init() { - m_lbox = (wxListBox *)NULL; + m_lbox = NULL; } wxComboBox::wxComboBox(wxWindow *parent, @@ -255,14 +271,22 @@ wxComboBox::~wxComboBox() // wxComboBox methods forwarded to wxTextCtrl // ---------------------------------------------------------------------------- -wxString wxComboBox::GetValue() const +wxString wxComboBox::DoGetValue() const { - return wxComboCtrl::GetValue(); + return GetTextCtrl() ? GetTextCtrl()->GetValue() : m_valueString; } void wxComboBox::SetValue(const wxString& value) { - wxComboCtrl::SetValue(value); + if ( GetTextCtrl() ) + GetTextCtrl()->SetValue(value); + else + m_valueString = value; +} + +void wxComboBox::WriteText(const wxString& value) +{ + if ( GetTextCtrl() ) GetTextCtrl()->WriteText(value); } void wxComboBox::Copy() @@ -319,6 +343,11 @@ void wxComboBox::SetSelection(long from, long to) if ( GetTextCtrl() ) GetTextCtrl()->SetSelection(from, to); } +void wxComboBox::GetSelection(long *from, long *to) const +{ + if ( GetTextCtrl() ) GetTextCtrl()->GetSelection(from, to); +} + void wxComboBox::SetEditable(bool editable) { if ( GetTextCtrl() ) GetTextCtrl()->SetEditable(editable); @@ -328,18 +357,18 @@ void wxComboBox::SetEditable(bool editable) // wxComboBox methods forwarded to wxListBox // ---------------------------------------------------------------------------- -void wxComboBox::Clear() +void wxComboBox::DoClear() { GetLBox()->Clear(); - if ( GetTextCtrl() ) GetTextCtrl()->SetValue(wxEmptyString); + SetValue(wxEmptyString); } -void wxComboBox::Delete(unsigned int n) +void wxComboBox::DoDeleteOneItem(unsigned int n) { - wxCHECK_RET( IsValid(n), _T("invalid index in wxComboBox::Delete") ); + wxCHECK_RET( IsValid(n), wxT("invalid index in wxComboBox::Delete") ); if (GetSelection() == (int)n) - if ( GetTextCtrl() ) GetTextCtrl()->SetValue(wxEmptyString); + SetValue(wxEmptyString); GetLBox()->Delete(n); } @@ -351,14 +380,14 @@ unsigned int wxComboBox::GetCount() const wxString wxComboBox::GetString(unsigned int n) const { - wxCHECK_MSG( IsValid(n), wxEmptyString, _T("invalid index in wxComboBox::GetString") ); + wxCHECK_MSG( IsValid(n), wxEmptyString, wxT("invalid index in wxComboBox::GetString") ); return GetLBox()->GetString(n); } void wxComboBox::SetString(unsigned int n, const wxString& s) { - wxCHECK_RET( IsValid(n), _T("invalid index in wxComboBox::SetString") ); + wxCHECK_RET( IsValid(n), wxT("invalid index in wxComboBox::SetString") ); GetLBox()->SetString(n, s); } @@ -370,15 +399,20 @@ 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)), wxT("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 { -#if 1 // FIXME:: What is the correct behavior? +#if 1 // FIXME:: What is the correct behaviour? // if the current value isn't one of the listbox strings, return -1 return GetLBox()->GetSelection(); #else @@ -389,41 +423,36 @@ int wxComboBox::GetSelection() const #endif } -int wxComboBox::DoAppend(const wxString& item) +wxString wxComboBox::GetStringSelection() const { - return GetLBox()->Append(item); + return GetLBox()->GetStringSelection(); } -int wxComboBox::DoInsert(const wxString& item, unsigned int pos) +wxClientDataType wxComboBox::GetClientDataType() const { - 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()->GetClientDataType(); } -void wxComboBox::DoSetItemClientData(unsigned int n, void* clientData) +void wxComboBox::SetClientDataType(wxClientDataType clientDataItemsType) { - GetLBox()->SetClientData(n, clientData); + GetLBox()->SetClientDataType(clientDataItemsType); } -void *wxComboBox::DoGetItemClientData(unsigned int n) const +int wxComboBox::DoInsertItems(const wxArrayStringsAdapter & items, + unsigned int pos, + void **clientData, wxClientDataType type) { - return GetLBox()->GetClientData(n); + return GetLBox()->DoInsertItems(items, pos, clientData, type); } -void wxComboBox::DoSetItemClientObject(unsigned int n, wxClientData* clientData) +void wxComboBox::DoSetItemClientData(unsigned int n, void* clientData) { - GetLBox()->SetClientObject(n, clientData); + GetLBox()->DoSetItemClientData(n, clientData); } -wxClientData* wxComboBox::DoGetItemClientObject(unsigned int n) const +void *wxComboBox::DoGetItemClientData(unsigned int n) const { - return GetLBox()->GetClientObject(n); + return GetLBox()->DoGetItemClientData(n); } bool wxComboBox::IsEditable() const @@ -527,5 +556,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