X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1b489359c4051c23262e3118b4489054ef7f3843..aa99e0cd2242db04fe1f9bb7d91aea545def2422:/src/univ/combobox.cpp diff --git a/src/univ/combobox.cpp b/src/univ/combobox.cpp index ea372f27c2..494df2c0b8 100644 --- a/src/univ/combobox.cpp +++ b/src/univ/combobox.cpp @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "univcombobox.h" #endif @@ -41,6 +41,7 @@ #include "wx/validate.h" #endif +#include "wx/tooltip.h" #include "wx/popupwin.h" #include "wx/univ/renderer.h" @@ -92,7 +93,7 @@ public: } protected: - void OnButton(wxCommandEvent& event) { m_combo->ShowPopup(); } + void OnButton(wxCommandEvent& WXUNUSED(event)) { m_combo->ShowPopup(); } virtual wxSize DoGetBestClientSize() const { @@ -122,8 +123,11 @@ public: // implement wxComboPopup methods virtual bool SetSelection(const wxString& value); + virtual void SetSelection(int n, bool select) + { wxListBox::SetSelection( n, select); }; virtual wxControl *GetControl() { return this; } virtual void OnShow(); + virtual wxCoord GetBestWidth() const; protected: // we shouldn't return height too big from here @@ -276,7 +280,7 @@ wxComboControl::~wxComboControl() { // as the button and the text control are the parent's children and not // ours, we have to delete them manually - they are not deleted - // automatically by wxWindows when we're deleted + // automatically by wxWidgets when we're deleted delete m_btn; delete m_text; @@ -288,7 +292,7 @@ wxComboControl::~wxComboControl() // ---------------------------------------------------------------------------- void wxComboControl::DoSetSize(int x, int y, - int width, int height, + int width, int WXUNUSED(height), int sizeFlags) { // combo height is always fixed @@ -299,8 +303,15 @@ wxSize wxComboControl::DoGetBestClientSize() const { wxSize sizeBtn = m_btn->GetBestSize(), sizeText = m_text->GetBestSize(); + wxCoord widthPopup = 0; - return wxSize(sizeText.x + g_comboMargin + sizeBtn.x, wxMax(sizeBtn.y, sizeText.y)); + if (m_popup) + { + widthPopup = m_popup->GetBestWidth(); + } + + return wxSize(wxMax(sizeText.x + g_comboMargin + sizeBtn.x, widthPopup), + wxMax(sizeBtn.y, sizeText.y)); } void wxComboControl::DoMoveWindow(int x, int y, int width, int height) @@ -351,6 +362,29 @@ bool wxComboControl::Show(bool show) return TRUE; } +#if wxUSE_TOOLTIPS +void wxComboControl::DoSetToolTip(wxToolTip *tooltip) +{ + wxControl::DoSetToolTip(tooltip); + + // Set tool tip for button and text box + if (m_text && m_btn) + { + if (tooltip) + { + const wxString &tip = tooltip->GetTip(); + m_text->SetToolTip(tip); + m_btn->SetToolTip(tip); + } + else + { + m_text->SetToolTip(NULL); + m_btn->SetToolTip(NULL); + } + } +} +#endif // wxUSE_TOOLTIPS + // ---------------------------------------------------------------------------- // popup window handling // ---------------------------------------------------------------------------- @@ -591,6 +625,12 @@ void wxComboListBox::OnMouseMove(wxMouseEvent& event) } } +wxCoord wxComboListBox::GetBestWidth() const +{ + wxSize size = wxListBox::GetBestSize(); + return size.x; +} + wxSize wxComboListBox::DoGetBestClientSize() const { // don't return size too big or we risk to not fit on the screen @@ -617,13 +657,44 @@ void wxComboBox::Init() m_lbox = (wxListBox *)NULL; } +wxComboBox::wxComboBox(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style, + const wxValidator& validator, + const wxString& name) +{ + Init(); + + Create(parent, id, value, pos, size, choices, style, validator, name); +} + +bool wxComboBox::Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style, + const wxValidator& validator, + const wxString& name) +{ + wxCArrayString chs(choices); + + return Create(parent, id, value, pos, size, chs.GetCount(), + chs.GetStrings(), style, validator, name); +} + bool wxComboBox::Create(wxWindow *parent, wxWindowID id, const wxString& value, const wxPoint& pos, const wxSize& size, int n, - const wxString *choices, + const wxString choices[], long style, const wxValidator& validator, const wxString& name) @@ -724,10 +795,16 @@ void wxComboBox::SetEditable(bool editable) void wxComboBox::Clear() { GetLBox()->Clear(); + GetText()->SetValue(wxEmptyString); } void wxComboBox::Delete(int n) { + wxCHECK_RET( (n >= 0) && (n < GetCount()), _T("invalid index in wxComboBox::Delete") ); + + if (GetSelection() == n) + GetText()->SetValue(wxEmptyString); + GetLBox()->Delete(n); } @@ -738,11 +815,15 @@ int wxComboBox::GetCount() const wxString wxComboBox::GetString(int n) const { + wxCHECK_MSG( (n >= 0) && (n < GetCount()), wxEmptyString, _T("invalid index in wxComboBox::GetString") ); + return GetLBox()->GetString(n); } void wxComboBox::SetString(int n, const wxString& s) { + wxCHECK_RET( (n >= 0) && (n < GetCount()), _T("invalid index in wxComboBox::SetString") ); + GetLBox()->SetString(n, s); } @@ -753,7 +834,7 @@ int wxComboBox::FindString(const wxString& s) const void wxComboBox::Select(int n) { - wxCHECK_RET( (n >= 0) && (n < GetCount()), _T("invalid combobox index") ); + wxCHECK_RET( (n >= 0) && (n < GetCount()), _T("invalid index in wxComboBox::Select") ); GetLBox()->SetSelection(n); GetText()->SetValue(GetLBox()->GetString(n)); @@ -761,8 +842,15 @@ void wxComboBox::Select(int n) int wxComboBox::GetSelection() const { +#if 1 // FIXME:: What is the correct behavior? // if the current value isn't one of the listbox strings, return -1 + return GetLBox()->GetSelection(); +#else + // Why oh why is this done this way? + // It is not because the value displayed in the text can be found + // in the list that it is the item that is selected! return FindString(GetText()->GetValue()); +#endif } int wxComboBox::DoAppend(const wxString& item) @@ -770,6 +858,18 @@ int wxComboBox::DoAppend(const wxString& item) return GetLBox()->Append(item); } +int wxComboBox::DoInsert(const wxString& item, int pos) +{ + wxCHECK_MSG(!(GetWindowStyle() & wxCB_SORT), -1, wxT("can't insert into sorted list")); + wxCHECK_MSG((pos>=0) && (pos<=GetCount()), -1, wxT("invalid index")); + + if (pos == GetCount()) + return DoAppend(item); + + GetLBox()->Insert(item, pos); + return pos; +} + void wxComboBox::DoSetItemClientData(int n, void* clientData) { GetLBox()->SetClientData(n, clientData);