X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c84030e020e56735cb4b7c1534e99d21a8bb48c0..64ea838d8f4d1853b7d850db93ee565e901d099a:/src/osx/combobox_osx.cpp diff --git a/src/osx/combobox_osx.cpp b/src/osx/combobox_osx.cpp index 91bc6fa638..00a8e571fe 100644 --- a/src/osx/combobox_osx.cpp +++ b/src/osx/combobox_osx.cpp @@ -4,7 +4,7 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: combobox_osx.cpp 58318 2009-01-23 08:36:16Z RR $ +// RCS-ID: $Id$ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -21,16 +21,10 @@ // work in progress -IMPLEMENT_DYNAMIC_CLASS(wxComboBox, wxControl) - wxComboBox::~wxComboBox() { } -void wxComboBox::Init() -{ -} - bool wxComboBox::Create(wxWindow *parent, wxWindowID id, const wxString& value, const wxPoint& pos, @@ -55,28 +49,27 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, const wxValidator& validator, const wxString& name) { + DontCreatePeer(); + m_text = NULL; m_choice = NULL; - - m_macIsUserPane = false; - + if ( !wxControl::Create( parent, id, pos, size, style, validator, name ) ) return false; - - if (style & wxCB_READONLY) - wxLogWarning("wxCB_READONLY style not supported by OS X Cocoa. Use wxChoice instead."); - - if (style & wxCB_SORT) - wxLogWarning("wxCB_SORT style not currently supported by OS X Cocoa."); - - m_peer = wxWidgetImpl::CreateComboBox( this, parent, id, NULL, pos, size, style, GetExtraStyle() ); + + wxASSERT_MSG( !(style & wxCB_SORT), + "wxCB_SORT not currently supported by wxOSX/Cocoa"); + + SetPeer(wxWidgetImpl::CreateComboBox( this, parent, id, NULL, pos, size, style, GetExtraStyle() )); MacPostControlCreate( pos, size ); Append(n, choices); - // Set the first item as being selected - if (n > 0) + // Set up the initial value, by default the first item is selected. + if ( !value.empty() ) + SetValue(value); + else if (n > 0) SetSelection( 0 ); // Needed because it is a wxControlWithItems @@ -113,7 +106,7 @@ int wxComboBox::DoInsertItems(const wxArrayStringsAdapter& items, AssignNewItemClientData(idx, clientData, i, type); } - m_peer->SetMaximum( GetCount() ); + GetPeer()->SetMaximum( GetCount() ); return pos - 1; } @@ -123,39 +116,36 @@ int wxComboBox::DoInsertItems(const wxArrayStringsAdapter& items, // ---------------------------------------------------------------------------- void wxComboBox::DoSetItemClientData(unsigned int n, void* clientData) { - wxCHECK_RET( IsValid(n), wxT("wxChoice::DoSetItemClientData: invalid index") ); - m_datas[n] = (char*)clientData ; } void * wxComboBox::DoGetItemClientData(unsigned int n) const { - wxCHECK_MSG( IsValid(n), NULL, wxT("wxChoice::DoGetClientData: invalid index") ); - return (void *)m_datas[n]; } -unsigned int wxComboBox::GetCount() const +unsigned int wxComboBox::GetCount() const { return GetComboPeer()->GetNumberOfItems(); } void wxComboBox::DoDeleteOneItem(unsigned int n) { + m_datas.RemoveAt(n); GetComboPeer()->RemoveItem(n); } void wxComboBox::DoClear() { + m_datas.Clear(); GetComboPeer()->Clear(); - SetValue(wxEmptyString); } void wxComboBox::GetSelection(long *from, long *to) const { wxTextEntry::GetSelection(from, to); } - + int wxComboBox::GetSelection() const { return GetComboPeer()->GetSelectedItem(); @@ -174,34 +164,48 @@ void wxComboBox::SetSelection(long from, long to) int wxComboBox::FindString(const wxString& s, bool bCase) const { if (!bCase) - wxLogWarning("wxComboBox::FindString on Mac doesn't currently support case insensitive search."); - + { + for (unsigned i = 0; i < GetCount(); i++) + { + if (s.IsSameAs(GetString(i), false)) + return i; + } + return wxNOT_FOUND; + } + return GetComboPeer()->FindString(s); } wxString wxComboBox::GetString(unsigned int n) const { + wxCHECK_MSG( n < GetCount(), wxString(), "Invalid combobox index" ); + return GetComboPeer()->GetStringAtIndex(n); } wxString wxComboBox::GetStringSelection() const { - return GetString(GetSelection()); + const int sel = GetSelection(); + return sel == wxNOT_FOUND ? wxString() : GetString(sel); } void wxComboBox::SetString(unsigned int n, const wxString& s) { - Delete(n); - Insert(s, n); + // Notice that we shouldn't delete and insert the item in this control + // itself as this would also affect the client data which we need to + // preserve here. + GetComboPeer()->RemoveItem(n); + GetComboPeer()->InsertItem(n, s); SetValue(s); // changing the item in the list won't update the display item } -void wxComboBox::EnableTextChangedEvents(bool enable) +void wxComboBox::EnableTextChangedEvents(bool WXUNUSED(enable)) { - wxFAIL_MSG("Method Not Implemented."); + // nothing to do here, events are never generated when we change the + // control value programmatically anyhow by Cocoa } -bool wxComboBox::OSXHandleClicked( double timestampsec ) +bool wxComboBox::OSXHandleClicked( double WXUNUSED(timestampsec) ) { wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_SELECTED, m_windowId ); event.SetInt(GetSelection()); @@ -211,14 +215,19 @@ bool wxComboBox::OSXHandleClicked( double timestampsec ) return true; } -wxTextWidgetImpl* wxComboBox::GetTextPeer() const +wxComboWidgetImpl* wxComboBox::GetComboPeer() const { - return dynamic_cast (m_peer); + return dynamic_cast (GetPeer()); } -wxComboWidgetImpl* wxComboBox::GetComboPeer() const +void wxComboBox::Popup() +{ + GetComboPeer()->Popup(); +} + +void wxComboBox::Dismiss() { - return dynamic_cast (m_peer); + GetComboPeer()->Dismiss(); } #endif // wxUSE_COMBOBOX && wxOSX_USE_COCOA