1/////////////////////////////////////////////////////////////////////////////// 2// Name: src/common/ctrlsub.cpp 3// Purpose: wxItemContainer implementation 4// Author: Vadim Zeitlin 5// Modified by: 6// Created: 22.10.99 7// RCS-ID: $Id: ctrlsub.cpp 39077 2006-05-06 19:05:50Z VZ $ 8// Copyright: (c) wxWidgets team 9// Licence: wxWindows licence 10/////////////////////////////////////////////////////////////////////////////// 11 12// ============================================================================ 13// declarations 14// ============================================================================ 15 16// ---------------------------------------------------------------------------- 17// headers 18// ---------------------------------------------------------------------------- 19 20// For compilers that support precompilation, includes "wx.h". 21#include "wx/wxprec.h" 22 23#ifdef __BORLANDC__ 24 #pragma hdrstop 25#endif 26 27#if wxUSE_CONTROLS 28 29#ifndef WX_PRECOMP 30 #include "wx/ctrlsub.h" 31 #include "wx/arrstr.h" 32#endif 33 34IMPLEMENT_ABSTRACT_CLASS(wxControlWithItems, wxControl) 35 36// ============================================================================ 37// wxItemContainerImmutable implementation 38// ============================================================================ 39 40wxItemContainerImmutable::~wxItemContainerImmutable() 41{ 42 // this destructor is required for Darwin 43} 44 45// ---------------------------------------------------------------------------- 46// selection 47// ---------------------------------------------------------------------------- 48 49wxString wxItemContainerImmutable::GetStringSelection() const 50{ 51 wxString s; 52 53 int sel = GetSelection(); 54 if ( sel != wxNOT_FOUND ) 55 s = GetString((unsigned int)sel); 56 57 return s; 58} 59 60bool wxItemContainerImmutable::SetStringSelection(const wxString& s) 61{ 62 const int sel = FindString(s); 63 if ( sel == wxNOT_FOUND ) 64 return false; 65 66 SetSelection(sel); 67 68 return true; 69} 70 71wxArrayString wxItemContainerImmutable::GetStrings() const 72{ 73 wxArrayString result; 74 75 const unsigned int count = GetCount(); 76 result.Alloc(count); 77 for ( unsigned int n = 0; n < count; n++ ) 78 result.Add(GetString(n)); 79 80 return result; 81} 82 83// ============================================================================ 84// wxItemContainer implementation 85// ============================================================================ 86 87wxItemContainer::~wxItemContainer() 88{ 89 // this destructor is required for Darwin 90} 91 92// ---------------------------------------------------------------------------- 93// appending items 94// ---------------------------------------------------------------------------- 95 96void wxItemContainer::Append(const wxArrayString& strings) 97{ 98 const size_t count = strings.GetCount(); 99 for ( size_t n = 0; n < count; n++ ) 100 { 101 Append(strings[n]); 102 } 103} 104 105int wxItemContainer::Insert(const wxString& item, unsigned int pos, void *clientData) 106{ 107 int n = DoInsert(item, pos); 108 if ( n != wxNOT_FOUND ) 109 SetClientData(n, clientData); 110 111 return n; 112} 113 114int wxItemContainer::Insert(const wxString& item, unsigned int pos, wxClientData *clientData) 115{ 116 int n = DoInsert(item, pos); 117 if ( n != wxNOT_FOUND ) 118 SetClientObject(n, clientData); 119 120 return n; 121} 122 123// ---------------------------------------------------------------------------- 124// client data 125// ---------------------------------------------------------------------------- 126 127void wxItemContainer::SetClientObject(unsigned int n, wxClientData *data) 128{ 129 wxASSERT_MSG( m_clientDataItemsType != wxClientData_Void, 130 wxT("can't have both object and void client data") ); 131 132 // when we call SetClientObject() for the first time, m_clientDataItemsType 133 // is still wxClientData_None and so calling DoGetItemClientObject() would 134 // fail (in addition to being useless) - don't do it 135 if ( m_clientDataItemsType == wxClientData_Object ) 136 { 137 wxClientData *clientDataOld = DoGetItemClientObject(n); 138 if ( clientDataOld ) 139 delete clientDataOld; 140 } 141 else // m_clientDataItemsType == wxClientData_None 142 { 143 // now we have object client data 144 m_clientDataItemsType = wxClientData_Object; 145 } 146 147 DoSetItemClientObject(n, data); 148} 149 150wxClientData *wxItemContainer::GetClientObject(unsigned int n) const 151{ 152 wxASSERT_MSG( m_clientDataItemsType == wxClientData_Object, 153 wxT("this window doesn't have object client data") ); 154 155 return DoGetItemClientObject(n); 156} 157 158void wxItemContainer::SetClientData(unsigned int n, void *data) 159{ 160 wxASSERT_MSG( m_clientDataItemsType != wxClientData_Object, 161 wxT("can't have both object and void client data") ); 162 163 DoSetItemClientData(n, data); 164 m_clientDataItemsType = wxClientData_Void; 165} 166 167void *wxItemContainer::GetClientData(unsigned int n) const 168{ 169 wxASSERT_MSG( m_clientDataItemsType == wxClientData_Void, 170 wxT("this window doesn't have void client data") ); 171 172 return DoGetItemClientData(n); 173} 174 175// ============================================================================ 176// wxControlWithItems implementation 177// ============================================================================ 178 179void wxControlWithItems::InitCommandEventWithItems(wxCommandEvent& event, int n) 180{ 181 InitCommandEvent(event); 182 183 if ( n != wxNOT_FOUND ) 184 { 185 if ( HasClientObjectData() ) 186 event.SetClientObject(GetClientObject(n)); 187 else if ( HasClientUntypedData() ) 188 event.SetClientData(GetClientData(n)); 189 } 190} 191 192wxControlWithItems::~wxControlWithItems() 193{ 194 // this destructor is required for Darwin 195} 196 197#endif // wxUSE_CONTROLS 198