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 
IMPLEMENT_ABSTRACT_CLASS(wxControlWithItems,wxControl)34 IMPLEMENT_ABSTRACT_CLASS(wxControlWithItems, wxControl)
35 
36 // ============================================================================
37 // wxItemContainerImmutable implementation
38 // ============================================================================
39 
40 wxItemContainerImmutable::~wxItemContainerImmutable()
41 {
42     // this destructor is required for Darwin
43 }
44 
45 // ----------------------------------------------------------------------------
46 // selection
47 // ----------------------------------------------------------------------------
48 
GetStringSelection() const49 wxString 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 
SetStringSelection(const wxString & s)60 bool 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 
GetStrings() const71 wxArrayString 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 
~wxItemContainer()87 wxItemContainer::~wxItemContainer()
88 {
89     // this destructor is required for Darwin
90 }
91 
92 // ----------------------------------------------------------------------------
93 // appending items
94 // ----------------------------------------------------------------------------
95 
Append(const wxArrayString & strings)96 void 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 
Insert(const wxString & item,unsigned int pos,void * clientData)105 int 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 
Insert(const wxString & item,unsigned int pos,wxClientData * clientData)114 int 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 
SetClientObject(unsigned int n,wxClientData * data)127 void 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 
GetClientObject(unsigned int n) const150 wxClientData *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 
SetClientData(unsigned int n,void * data)158 void 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 
GetClientData(unsigned int n) const167 void *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 
InitCommandEventWithItems(wxCommandEvent & event,int n)179 void 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 
~wxControlWithItems()192 wxControlWithItems::~wxControlWithItems()
193 {
194     // this destructor is required for Darwin
195 }
196 
197 #endif // wxUSE_CONTROLS
198