]>
Commit | Line | Data |
---|---|---|
239eaa41 RR |
1 | ///////////////////////////////////////////////////////////////////////////// |
2 | // Name: src/common/datavcmn.cpp | |
3 | // Purpose: wxDataViewCtrl base classes and common parts | |
4 | // Author: Robert Roebling | |
5 | // Created: 2006/02/20 | |
6 | // RCS-ID: $Id$ | |
7 | // Copyright: (c) 2006, Robert Roebling | |
8 | // Licence: wxWindows licence | |
9 | ///////////////////////////////////////////////////////////////////////////// | |
10 | ||
11 | // For compilers that support precompilation, includes "wx.h". | |
12 | #include "wx/wxprec.h" | |
13 | ||
14 | #ifdef __BORLANDC__ | |
15 | #pragma hdrstop | |
16 | #endif | |
17 | ||
8045736e RR |
18 | #if wxUSE_DATAVIEWCTRL |
19 | ||
e7445ff8 PC |
20 | #include "wx/dataview.h" |
21 | ||
52e750fc RR |
22 | #include "wx/spinctrl.h" |
23 | #include "wx/dc.h" | |
24 | #include "wx/settings.h" | |
25 | ||
f554a14b | 26 | #ifndef WX_PRECOMP |
f554a14b | 27 | #include "wx/log.h" |
e94d0c1e | 28 | #include "wx/icon.h" |
f554a14b WS |
29 | #endif |
30 | ||
4a2e5ee8 | 31 | const wxChar wxDataViewCtrlNameStr[] = wxT("dataviewCtrl"); |
239eaa41 | 32 | |
239eaa41 | 33 | |
d5025dc0 RR |
34 | bool operator == (const wxDataViewItem &left, const wxDataViewItem &right) |
35 | { | |
36 | return (left.GetID() == right.GetID() ); | |
37 | } | |
38 | ||
39 | ||
f554a14b | 40 | // --------------------------------------------------------- |
854cdb09 | 41 | // wxDataViewModelNotifier |
f554a14b | 42 | // --------------------------------------------------------- |
239eaa41 | 43 | |
8ab03001 | 44 | #include "wx/listimpl.cpp" |
9d8fe14a RR |
45 | WX_DEFINE_LIST(wxDataViewModelNotifiers); |
46 | ||
854cdb09 RR |
47 | bool wxDataViewModelNotifier::ItemsAdded( const wxDataViewItem &parent, const wxDataViewItemArray &items ) |
48 | { | |
49 | size_t count = items.GetCount(); | |
50 | size_t i; | |
51 | for (i = 0; i < count; i++) | |
52 | if (!ItemAdded( parent, items[i] )) return false; | |
b5ec7dd6 | 53 | |
854cdb09 RR |
54 | return true; |
55 | } | |
56 | ||
57 | bool wxDataViewModelNotifier::ItemsDeleted( const wxDataViewItem &parent, const wxDataViewItemArray &items ) | |
58 | { | |
59 | size_t count = items.GetCount(); | |
60 | size_t i; | |
61 | for (i = 0; i < count; i++) | |
62 | if (!ItemDeleted( parent, items[i] )) return false; | |
b5ec7dd6 | 63 | |
854cdb09 RR |
64 | return true; |
65 | } | |
66 | ||
67 | bool wxDataViewModelNotifier::ItemsChanged( const wxDataViewItemArray &items ) | |
68 | { | |
69 | size_t count = items.GetCount(); | |
70 | size_t i; | |
71 | for (i = 0; i < count; i++) | |
72 | if (!ItemChanged( items[i] )) return false; | |
b5ec7dd6 | 73 | |
854cdb09 RR |
74 | return true; |
75 | } | |
76 | ||
77 | // --------------------------------------------------------- | |
78 | // wxDataViewModel | |
79 | // --------------------------------------------------------- | |
80 | ||
e0062c04 | 81 | wxDataViewModel::wxDataViewModel() |
239eaa41 | 82 | { |
8f850e28 | 83 | m_notifiers.DeleteContents( true ); |
239eaa41 RR |
84 | } |
85 | ||
e0062c04 | 86 | bool wxDataViewModel::ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item ) |
239eaa41 | 87 | { |
8f850e28 RR |
88 | bool ret = true; |
89 | ||
9d8fe14a RR |
90 | wxDataViewModelNotifiers::iterator iter; |
91 | for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter) | |
8f850e28 | 92 | { |
9d8fe14a | 93 | wxDataViewModelNotifier* notifier = *iter; |
e0062c04 | 94 | if (!notifier->ItemAdded( parent, item )) |
8f850e28 | 95 | ret = false; |
8f850e28 | 96 | } |
f554a14b | 97 | |
8f850e28 | 98 | return ret; |
239eaa41 RR |
99 | } |
100 | ||
469d3e9b | 101 | bool wxDataViewModel::ItemDeleted( const wxDataViewItem &parent, const wxDataViewItem &item ) |
239eaa41 | 102 | { |
8f850e28 RR |
103 | bool ret = true; |
104 | ||
9d8fe14a RR |
105 | wxDataViewModelNotifiers::iterator iter; |
106 | for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter) | |
8f850e28 | 107 | { |
9d8fe14a | 108 | wxDataViewModelNotifier* notifier = *iter; |
469d3e9b | 109 | if (!notifier->ItemDeleted( parent, item )) |
8f850e28 | 110 | ret = false; |
8f850e28 | 111 | } |
f554a14b | 112 | |
8f850e28 | 113 | return ret; |
239eaa41 RR |
114 | } |
115 | ||
e0062c04 | 116 | bool wxDataViewModel::ItemChanged( const wxDataViewItem &item ) |
239eaa41 | 117 | { |
8f850e28 RR |
118 | bool ret = true; |
119 | ||
9d8fe14a RR |
120 | wxDataViewModelNotifiers::iterator iter; |
121 | for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter) | |
8f850e28 | 122 | { |
9d8fe14a | 123 | wxDataViewModelNotifier* notifier = *iter; |
e0062c04 | 124 | if (!notifier->ItemChanged( item )) |
8f850e28 | 125 | ret = false; |
8f850e28 | 126 | } |
f554a14b | 127 | |
8f850e28 | 128 | return ret; |
239eaa41 RR |
129 | } |
130 | ||
854cdb09 RR |
131 | bool wxDataViewModel::ItemsAdded( const wxDataViewItem &parent, const wxDataViewItemArray &items ) |
132 | { | |
133 | bool ret = true; | |
134 | ||
135 | wxDataViewModelNotifiers::iterator iter; | |
136 | for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter) | |
137 | { | |
138 | wxDataViewModelNotifier* notifier = *iter; | |
139 | if (!notifier->ItemsAdded( parent, items )) | |
140 | ret = false; | |
141 | } | |
142 | ||
143 | return ret; | |
144 | } | |
145 | ||
146 | bool wxDataViewModel::ItemsDeleted( const wxDataViewItem &parent, const wxDataViewItemArray &items ) | |
147 | { | |
148 | bool ret = true; | |
149 | ||
150 | wxDataViewModelNotifiers::iterator iter; | |
151 | for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter) | |
152 | { | |
153 | wxDataViewModelNotifier* notifier = *iter; | |
154 | if (!notifier->ItemsDeleted( parent, items )) | |
155 | ret = false; | |
156 | } | |
157 | ||
158 | return ret; | |
159 | } | |
160 | ||
161 | bool wxDataViewModel::ItemsChanged( const wxDataViewItemArray &items ) | |
162 | { | |
163 | bool ret = true; | |
164 | ||
165 | wxDataViewModelNotifiers::iterator iter; | |
166 | for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter) | |
167 | { | |
168 | wxDataViewModelNotifier* notifier = *iter; | |
169 | if (!notifier->ItemsChanged( items )) | |
170 | ret = false; | |
171 | } | |
172 | ||
173 | return ret; | |
174 | } | |
175 | ||
e0062c04 | 176 | bool wxDataViewModel::ValueChanged( const wxDataViewItem &item, unsigned int col ) |
239eaa41 | 177 | { |
8f850e28 | 178 | bool ret = true; |
b5d777c7 | 179 | |
9d8fe14a RR |
180 | wxDataViewModelNotifiers::iterator iter; |
181 | for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter) | |
b5d777c7 | 182 | { |
9d8fe14a | 183 | wxDataViewModelNotifier* notifier = *iter; |
e0062c04 | 184 | if (!notifier->ValueChanged( item, col )) |
8f850e28 | 185 | ret = false; |
b5d777c7 | 186 | } |
f554a14b | 187 | |
b5d777c7 | 188 | return ret; |
239eaa41 RR |
189 | } |
190 | ||
e0062c04 | 191 | bool wxDataViewModel::Cleared() |
4eccd3a1 RR |
192 | { |
193 | bool ret = true; | |
194 | ||
9d8fe14a RR |
195 | wxDataViewModelNotifiers::iterator iter; |
196 | for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter) | |
4eccd3a1 | 197 | { |
9d8fe14a | 198 | wxDataViewModelNotifier* notifier = *iter; |
8f850e28 RR |
199 | if (!notifier->Cleared()) |
200 | ret = false; | |
8f850e28 | 201 | } |
f554a14b | 202 | |
8f850e28 | 203 | return ret; |
239eaa41 RR |
204 | } |
205 | ||
ef427989 RR |
206 | void wxDataViewModel::Resort() |
207 | { | |
9d8fe14a RR |
208 | wxDataViewModelNotifiers::iterator iter; |
209 | for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter) | |
ef427989 | 210 | { |
9d8fe14a | 211 | wxDataViewModelNotifier* notifier = *iter; |
ef427989 | 212 | notifier->Resort(); |
ef427989 RR |
213 | } |
214 | } | |
215 | ||
e0062c04 | 216 | void wxDataViewModel::AddNotifier( wxDataViewModelNotifier *notifier ) |
239eaa41 | 217 | { |
9d8fe14a | 218 | m_notifiers.push_back( notifier ); |
8f850e28 | 219 | notifier->SetOwner( this ); |
239eaa41 RR |
220 | } |
221 | ||
e0062c04 | 222 | void wxDataViewModel::RemoveNotifier( wxDataViewModelNotifier *notifier ) |
239eaa41 | 223 | { |
8f850e28 | 224 | m_notifiers.DeleteObject( notifier ); |
239eaa41 RR |
225 | } |
226 | ||
7ee7191c RR |
227 | int wxDataViewModel::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2, |
228 | unsigned int column, bool ascending ) | |
ef427989 | 229 | { |
cf283a47 | 230 | // sort branches before leaves |
ed903e42 RR |
231 | bool item1_is_container = IsContainer(item1); |
232 | bool item2_is_container = IsContainer(item2); | |
900af470 | 233 | |
ed903e42 | 234 | if (item1_is_container && !item2_is_container) |
cf283a47 | 235 | return 1; |
ed903e42 | 236 | if (item2_is_container && !item1_is_container) |
cf283a47 | 237 | return -1; |
900af470 | 238 | |
ef427989 | 239 | wxVariant value1,value2; |
7ee7191c RR |
240 | GetValue( value1, item1, column ); |
241 | GetValue( value2, item2, column ); | |
242 | ||
243 | if (!ascending) | |
244 | { | |
245 | wxVariant temp = value1; | |
246 | value1 = value2; | |
247 | value2 = temp; | |
248 | } | |
cf283a47 | 249 | |
ef427989 RR |
250 | if (value1.GetType() == wxT("string")) |
251 | { | |
252 | wxString str1 = value1.GetString(); | |
253 | wxString str2 = value2.GetString(); | |
0be79c8a | 254 | int res = str1.Cmp( str2 ); |
cf283a47 RR |
255 | if (res) return res; |
256 | } else | |
ef427989 RR |
257 | if (value1.GetType() == wxT("long")) |
258 | { | |
259 | long l1 = value1.GetLong(); | |
260 | long l2 = value2.GetLong(); | |
cf283a47 RR |
261 | long res = l1-l2; |
262 | if (res) return res; | |
263 | } else | |
ef427989 RR |
264 | if (value1.GetType() == wxT("double")) |
265 | { | |
266 | double d1 = value1.GetDouble(); | |
267 | double d2 = value2.GetDouble(); | |
ef427989 | 268 | if (d1 < d2) return 1; |
cf283a47 RR |
269 | if (d1 > d2) return -1; |
270 | } else | |
ef427989 RR |
271 | if (value1.GetType() == wxT("datetime")) |
272 | { | |
273 | wxDateTime dt1 = value1.GetDateTime(); | |
274 | wxDateTime dt2 = value2.GetDateTime(); | |
ef427989 | 275 | if (dt1.IsEarlierThan(dt2)) return 1; |
cf283a47 | 276 | if (dt2.IsEarlierThan(dt1)) return -11; |
ef427989 RR |
277 | } |
278 | ||
cf283a47 | 279 | // items must be different |
900af470 JS |
280 | unsigned long litem1 = (unsigned long) item1.GetID(); |
281 | unsigned long litem2 = (unsigned long) item2.GetID(); | |
b7fe2261 | 282 | |
7ee7191c RR |
283 | if (!ascending) |
284 | return litem2-litem2; | |
cf283a47 | 285 | |
cf283a47 | 286 | return litem1-litem2; |
ef427989 RR |
287 | } |
288 | ||
c534e696 RR |
289 | // --------------------------------------------------------- |
290 | // wxDataViewIndexListModel | |
291 | // --------------------------------------------------------- | |
292 | ||
293 | wxDataViewIndexListModel::wxDataViewIndexListModel( unsigned int initial_size ) | |
294 | { | |
295 | // build initial index | |
296 | unsigned int i; | |
297 | for (i = 1; i < initial_size+1; i++) | |
298 | m_hash.Add( (void*) i ); | |
299 | m_lastIndex = initial_size + 1; | |
300 | } | |
301 | ||
302 | wxDataViewIndexListModel::~wxDataViewIndexListModel() | |
303 | { | |
304 | } | |
305 | ||
306 | void wxDataViewIndexListModel::RowPrepended() | |
307 | { | |
308 | unsigned int id = m_lastIndex++; | |
309 | m_hash.Insert( (void*) id, 0 ); | |
310 | wxDataViewItem item( (void*) id ); | |
311 | ItemAdded( wxDataViewItem(0), item ); | |
312 | } | |
313 | ||
314 | void wxDataViewIndexListModel::RowInserted( unsigned int before ) | |
315 | { | |
316 | unsigned int id = m_lastIndex++; | |
317 | m_hash.Insert( (void*) id, before ); | |
318 | wxDataViewItem item( (void*) id ); | |
319 | ItemAdded( wxDataViewItem(0), item ); | |
320 | } | |
321 | ||
322 | void wxDataViewIndexListModel::RowAppended() | |
323 | { | |
324 | unsigned int id = m_lastIndex++; | |
325 | m_hash.Add( (void*) id ); | |
326 | wxDataViewItem item( (void*) id ); | |
327 | ItemAdded( wxDataViewItem(0), item ); | |
328 | } | |
329 | ||
330 | void wxDataViewIndexListModel::RowDeleted( unsigned int row ) | |
331 | { | |
332 | wxDataViewItem item( m_hash[row] ); | |
469d3e9b | 333 | wxDataViewModel::ItemDeleted( wxDataViewItem(0), item ); |
d3f00f59 | 334 | m_hash.RemoveAt( row ); |
c534e696 RR |
335 | } |
336 | ||
337 | void wxDataViewIndexListModel::RowChanged( unsigned int row ) | |
338 | { | |
339 | wxDataViewModel::ItemChanged( GetItem(row) ); | |
340 | } | |
341 | ||
342 | void wxDataViewIndexListModel::RowValueChanged( unsigned int row, unsigned int col ) | |
343 | { | |
344 | wxDataViewModel::ValueChanged( GetItem(row), col ); | |
345 | } | |
346 | ||
347 | unsigned int wxDataViewIndexListModel::GetRow( const wxDataViewItem &item ) const | |
348 | { | |
349 | // assert for not found | |
350 | return (unsigned int) m_hash.Index( item.GetID() ); | |
351 | } | |
352 | ||
353 | wxDataViewItem wxDataViewIndexListModel::GetItem( unsigned int row ) const | |
354 | { | |
fbda518c | 355 | wxASSERT( row < m_hash.GetCount() ); |
c534e696 RR |
356 | return wxDataViewItem( m_hash[row] ); |
357 | } | |
358 | ||
b7fe2261 VZ |
359 | int wxDataViewIndexListModel::Compare(const wxDataViewItem& item1, |
360 | const wxDataViewItem& item2, | |
361 | unsigned int WXUNUSED(column), | |
362 | bool ascending) | |
c534e696 | 363 | { |
7ee7191c RR |
364 | if (ascending) |
365 | return GetRow(item1) - GetRow(item2); | |
b7fe2261 | 366 | |
7ee7191c | 367 | return GetRow(item2) - GetRow(item1); |
c534e696 RR |
368 | } |
369 | ||
900af470 | 370 | void wxDataViewIndexListModel::GetValue( wxVariant &variant, |
c534e696 RR |
371 | const wxDataViewItem &item, unsigned int col ) const |
372 | { | |
900af470 | 373 | GetValue( variant, GetRow(item), col ); |
c534e696 RR |
374 | } |
375 | ||
900af470 | 376 | bool wxDataViewIndexListModel::SetValue( const wxVariant &variant, |
c534e696 RR |
377 | const wxDataViewItem &item, unsigned int col ) |
378 | { | |
379 | return SetValue( variant, GetRow(item), col ); | |
380 | } | |
381 | ||
900af470 | 382 | wxDataViewItem wxDataViewIndexListModel::GetParent( const wxDataViewItem & WXUNUSED(item) ) const |
c534e696 RR |
383 | { |
384 | return wxDataViewItem(0); | |
385 | } | |
386 | ||
387 | bool wxDataViewIndexListModel::IsContainer( const wxDataViewItem &item ) const | |
388 | { | |
389 | // only the invisible root item has children | |
390 | if (!item.IsOk()) | |
391 | return true; | |
900af470 | 392 | |
c534e696 RR |
393 | return false; |
394 | } | |
395 | ||
74fe973b | 396 | unsigned int wxDataViewIndexListModel::GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const |
c534e696 | 397 | { |
74fe973b RR |
398 | if (item.IsOk()) |
399 | return 0; | |
c534e696 | 400 | |
74fe973b | 401 | children = m_hash; |
b7fe2261 | 402 | |
74fe973b | 403 | return m_hash.GetCount(); |
c534e696 RR |
404 | } |
405 | ||
89352653 RR |
406 | //----------------------------------------------------------------------------- |
407 | // wxDataViewIconText | |
408 | //----------------------------------------------------------------------------- | |
409 | ||
410 | IMPLEMENT_DYNAMIC_CLASS(wxDataViewIconText,wxObject) | |
411 | ||
d350fbec | 412 | IMPLEMENT_VARIANT_OBJECT_EXPORTED(wxDataViewIconText, WXDLLIMPEXP_ADV) |
89352653 RR |
413 | |
414 | bool operator == (const wxDataViewIconText &one, const wxDataViewIconText &two) | |
415 | { | |
416 | if (one.GetText() != two.GetText()) return false; | |
417 | if (one.IsSameAs(two)) return false; | |
418 | return true; | |
419 | } | |
420 | ||
f554a14b | 421 | // --------------------------------------------------------- |
baa9ebc4 | 422 | // wxDataViewRendererBase |
f554a14b | 423 | // --------------------------------------------------------- |
6842a71a | 424 | |
baa9ebc4 | 425 | IMPLEMENT_ABSTRACT_CLASS(wxDataViewRendererBase, wxObject) |
6842a71a | 426 | |
900af470 | 427 | wxDataViewRendererBase::wxDataViewRendererBase( const wxString &varianttype, |
9861f022 RR |
428 | wxDataViewCellMode WXUNUSED(mode), |
429 | int WXUNUSED(align) ) | |
6842a71a RR |
430 | { |
431 | m_variantType = varianttype; | |
1e510b1e | 432 | m_editorCtrl = NULL; |
9861f022 RR |
433 | } |
434 | ||
435 | const wxDataViewCtrl* wxDataViewRendererBase::GetView() const | |
436 | { | |
437 | return wx_const_cast(wxDataViewRendererBase*, this)->GetOwner()->GetOwner(); | |
6842a71a | 438 | } |
f554a14b | 439 | |
e0062c04 | 440 | bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect labelRect ) |
1e510b1e | 441 | { |
e0062c04 | 442 | m_item = item; // remember for later |
900af470 | 443 | |
1e510b1e RR |
444 | unsigned int col = GetOwner()->GetModelColumn(); |
445 | wxVariant value; | |
e0062c04 | 446 | GetOwner()->GetOwner()->GetModel()->GetValue( value, item, col ); |
900af470 | 447 | |
1e510b1e | 448 | m_editorCtrl = CreateEditorCtrl( GetOwner()->GetOwner()->GetMainWindow(), labelRect, value ); |
900af470 JS |
449 | |
450 | wxDataViewEditorCtrlEvtHandler *handler = | |
30715fa1 | 451 | new wxDataViewEditorCtrlEvtHandler( m_editorCtrl, (wxDataViewRenderer*) this ); |
900af470 | 452 | |
30715fa1 | 453 | m_editorCtrl->PushEventHandler( handler ); |
900af470 | 454 | |
30715fa1 RR |
455 | #if defined(__WXGTK20__) && !defined(wxUSE_GENERICDATAVIEWCTRL) |
456 | handler->SetFocusOnIdle(); | |
457 | #else | |
1e510b1e | 458 | m_editorCtrl->SetFocus(); |
30715fa1 RR |
459 | #endif |
460 | ||
afebb87b RR |
461 | // Now we should send Editing Started event |
462 | wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED, GetOwner()->GetOwner()->GetId() ); | |
463 | event.SetDataViewColumn( GetOwner() ); | |
464 | event.SetModel( GetOwner()->GetOwner()->GetModel() ); | |
465 | event.SetItem( item ); | |
afebb87b RR |
466 | GetOwner()->GetOwner()->GetEventHandler()->ProcessEvent( event ); |
467 | ||
1e510b1e RR |
468 | return true; |
469 | } | |
470 | ||
471 | void wxDataViewRendererBase::CancelEditing() | |
472 | { | |
2fa73716 | 473 | wxPendingDelete.Append( m_editorCtrl ); |
900af470 | 474 | |
1e510b1e | 475 | GetOwner()->GetOwner()->GetMainWindow()->SetFocus(); |
900af470 | 476 | |
2fa73716 | 477 | // m_editorCtrl->PopEventHandler( true ); |
1e510b1e RR |
478 | } |
479 | ||
480 | bool wxDataViewRendererBase::FinishEditing() | |
481 | { | |
1e510b1e RR |
482 | wxVariant value; |
483 | GetValueFromEditorCtrl( m_editorCtrl, value ); | |
484 | ||
2fa73716 | 485 | wxPendingDelete.Append( m_editorCtrl ); |
900af470 | 486 | |
1e510b1e | 487 | GetOwner()->GetOwner()->GetMainWindow()->SetFocus(); |
900af470 | 488 | |
1e510b1e RR |
489 | if (!Validate(value)) |
490 | return false; | |
900af470 | 491 | |
1e510b1e | 492 | unsigned int col = GetOwner()->GetModelColumn(); |
e0062c04 RR |
493 | GetOwner()->GetOwner()->GetModel()->SetValue( value, m_item, col ); |
494 | GetOwner()->GetOwner()->GetModel()->ValueChanged( m_item, col ); | |
900af470 | 495 | |
2fa73716 | 496 | // m_editorCtrl->PopEventHandler( true ); |
b7fe2261 | 497 | |
afebb87b RR |
498 | // Now we should send Editing Done event |
499 | wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE, GetOwner()->GetOwner()->GetId() ); | |
500 | event.SetDataViewColumn( GetOwner() ); | |
501 | event.SetModel( GetOwner()->GetOwner()->GetModel() ); | |
8fdaf7de | 502 | event.SetItem( m_item ); |
afebb87b | 503 | GetOwner()->GetOwner()->GetEventHandler()->ProcessEvent( event ); |
900af470 | 504 | |
1e510b1e RR |
505 | return true; |
506 | } | |
507 | ||
508 | //----------------------------------------------------------------------------- | |
509 | // wxDataViewEditorCtrlEvtHandler | |
510 | //----------------------------------------------------------------------------- | |
511 | ||
512 | BEGIN_EVENT_TABLE(wxDataViewEditorCtrlEvtHandler, wxEvtHandler) | |
513 | EVT_CHAR (wxDataViewEditorCtrlEvtHandler::OnChar) | |
514 | EVT_KILL_FOCUS (wxDataViewEditorCtrlEvtHandler::OnKillFocus) | |
30715fa1 | 515 | EVT_IDLE (wxDataViewEditorCtrlEvtHandler::OnIdle) |
1e510b1e RR |
516 | END_EVENT_TABLE() |
517 | ||
518 | wxDataViewEditorCtrlEvtHandler::wxDataViewEditorCtrlEvtHandler( | |
519 | wxControl *editorCtrl, | |
520 | wxDataViewRenderer *owner ) | |
521 | { | |
522 | m_owner = owner; | |
523 | m_editorCtrl = editorCtrl; | |
524 | ||
525 | m_finished = false; | |
526 | } | |
527 | ||
30715fa1 RR |
528 | void wxDataViewEditorCtrlEvtHandler::OnIdle( wxIdleEvent &event ) |
529 | { | |
530 | if (m_focusOnIdle) | |
531 | { | |
532 | m_focusOnIdle = false; | |
533 | if (wxWindow::FindFocus() != m_editorCtrl) | |
534 | m_editorCtrl->SetFocus(); | |
535 | } | |
900af470 | 536 | |
30715fa1 RR |
537 | event.Skip(); |
538 | } | |
539 | ||
1e510b1e RR |
540 | void wxDataViewEditorCtrlEvtHandler::OnChar( wxKeyEvent &event ) |
541 | { | |
542 | switch ( event.m_keyCode ) | |
543 | { | |
544 | case WXK_RETURN: | |
545 | m_finished = true; | |
546 | m_owner->FinishEditing(); | |
547 | break; | |
548 | ||
549 | case WXK_ESCAPE: | |
550 | m_finished = true; | |
551 | m_owner->CancelEditing(); | |
552 | break; | |
553 | ||
554 | default: | |
555 | event.Skip(); | |
556 | } | |
557 | } | |
558 | ||
559 | void wxDataViewEditorCtrlEvtHandler::OnKillFocus( wxFocusEvent &event ) | |
560 | { | |
561 | if (!m_finished) | |
562 | { | |
563 | m_finished = true; | |
564 | m_owner->FinishEditing(); | |
565 | } | |
566 | ||
1e510b1e RR |
567 | event.Skip(); |
568 | } | |
569 | ||
f554a14b | 570 | // --------------------------------------------------------- |
fa28826d | 571 | // wxDataViewColumnBase |
f554a14b | 572 | // --------------------------------------------------------- |
fa28826d RR |
573 | |
574 | IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumnBase, wxObject) | |
575 | ||
9861f022 | 576 | wxDataViewColumnBase::wxDataViewColumnBase(const wxString& WXUNUSED(title), |
baa9ebc4 | 577 | wxDataViewRenderer *renderer, |
0a71f9e9 | 578 | unsigned int model_column, |
008b5a66 | 579 | int WXUNUSED(width), |
87f0efe2 | 580 | wxAlignment WXUNUSED(align), |
900af470 | 581 | int WXUNUSED(flags)) |
fa28826d | 582 | { |
baa9ebc4 | 583 | m_renderer = renderer; |
6842a71a | 584 | m_model_column = model_column; |
6842a71a | 585 | m_owner = NULL; |
baa9ebc4 | 586 | m_renderer->SetOwner( (wxDataViewColumn*) this ); |
9861f022 RR |
587 | |
588 | // NOTE: the wxDataViewColumn's ctor must store the width, align, flags | |
589 | // parameters inside the native control! | |
6842a71a RR |
590 | } |
591 | ||
07a84e7b RR |
592 | wxDataViewColumnBase::wxDataViewColumnBase(const wxBitmap& bitmap, |
593 | wxDataViewRenderer *renderer, | |
594 | unsigned int model_column, | |
595 | int WXUNUSED(width), | |
87f0efe2 | 596 | wxAlignment WXUNUSED(align), |
900af470 | 597 | int WXUNUSED(flags) ) |
07a84e7b RR |
598 | { |
599 | m_renderer = renderer; | |
600 | m_model_column = model_column; | |
07a84e7b RR |
601 | m_bitmap = bitmap; |
602 | m_owner = NULL; | |
603 | m_renderer->SetOwner( (wxDataViewColumn*) this ); | |
604 | } | |
605 | ||
6842a71a RR |
606 | wxDataViewColumnBase::~wxDataViewColumnBase() |
607 | { | |
baa9ebc4 RR |
608 | if (m_renderer) |
609 | delete m_renderer; | |
fa28826d RR |
610 | } |
611 | ||
9861f022 | 612 | int wxDataViewColumnBase::GetFlags() const |
fa28826d | 613 | { |
9861f022 | 614 | int ret = 0; |
fa28826d | 615 | |
9861f022 RR |
616 | if (IsSortable()) |
617 | ret |= wxDATAVIEW_COL_SORTABLE; | |
618 | if (IsResizeable()) | |
619 | ret |= wxDATAVIEW_COL_RESIZABLE; | |
620 | if (IsHidden()) | |
621 | ret |= wxDATAVIEW_COL_HIDDEN; | |
fa28826d | 622 | |
9861f022 | 623 | return ret; |
07a84e7b RR |
624 | } |
625 | ||
9861f022 | 626 | void wxDataViewColumnBase::SetFlags(int flags) |
07a84e7b | 627 | { |
9861f022 RR |
628 | SetSortable((flags & wxDATAVIEW_COL_SORTABLE) != 0); |
629 | SetResizeable((flags & wxDATAVIEW_COL_RESIZABLE) != 0); | |
630 | SetHidden((flags & wxDATAVIEW_COL_HIDDEN) != 0); | |
07a84e7b RR |
631 | } |
632 | ||
f554a14b | 633 | // --------------------------------------------------------- |
239eaa41 | 634 | // wxDataViewCtrlBase |
f554a14b | 635 | // --------------------------------------------------------- |
239eaa41 RR |
636 | |
637 | IMPLEMENT_ABSTRACT_CLASS(wxDataViewCtrlBase, wxControl) | |
638 | ||
639 | wxDataViewCtrlBase::wxDataViewCtrlBase() | |
640 | { | |
641 | m_model = NULL; | |
3b6280be RR |
642 | m_expander_column = 0; |
643 | m_indent = 8; | |
239eaa41 RR |
644 | } |
645 | ||
646 | wxDataViewCtrlBase::~wxDataViewCtrlBase() | |
647 | { | |
87f0efe2 RR |
648 | if (m_model) |
649 | { | |
650 | m_model->DecRef(); | |
651 | m_model = NULL; | |
652 | } | |
239eaa41 RR |
653 | } |
654 | ||
e0062c04 | 655 | bool wxDataViewCtrlBase::AssociateModel( wxDataViewModel *model ) |
239eaa41 | 656 | { |
1821abd1 RR |
657 | if (m_model) |
658 | { | |
87f0efe2 | 659 | m_model->DecRef(); // discard old model, if any |
1821abd1 | 660 | } |
87f0efe2 RR |
661 | |
662 | // add our own reference to the new model: | |
239eaa41 | 663 | m_model = model; |
1821abd1 RR |
664 | if (m_model) |
665 | { | |
900af470 | 666 | m_model->IncRef(); |
1821abd1 | 667 | } |
f554a14b | 668 | |
239eaa41 RR |
669 | return true; |
670 | } | |
671 | ||
e0062c04 | 672 | wxDataViewModel* wxDataViewCtrlBase::GetModel() |
239eaa41 RR |
673 | { |
674 | return m_model; | |
675 | } | |
676 | ||
c7074d44 RR |
677 | wxDataViewColumn * |
678 | wxDataViewCtrlBase::AppendTextColumn( const wxString &label, unsigned int model_column, | |
87f0efe2 | 679 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
fa28826d | 680 | { |
c7074d44 | 681 | wxDataViewColumn *ret = new wxDataViewColumn( label, |
900af470 | 682 | new wxDataViewTextRenderer( wxT("string"), mode, (int)align ), |
c7074d44 RR |
683 | model_column, width, align, flags ); |
684 | AppendColumn( ret ); | |
685 | return ret; | |
fa28826d RR |
686 | } |
687 | ||
b04fcede RR |
688 | wxDataViewColumn * |
689 | wxDataViewCtrlBase::AppendIconTextColumn( const wxString &label, unsigned int model_column, | |
690 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) | |
691 | { | |
692 | wxDataViewColumn *ret = new wxDataViewColumn( label, | |
693 | new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode, (int)align ), | |
694 | model_column, width, align, flags ); | |
695 | AppendColumn( ret ); | |
696 | return ret; | |
697 | } | |
698 | ||
c7074d44 RR |
699 | wxDataViewColumn * |
700 | wxDataViewCtrlBase::AppendToggleColumn( const wxString &label, unsigned int model_column, | |
87f0efe2 | 701 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
605c2c4a | 702 | { |
b7fe2261 | 703 | |
c7074d44 | 704 | wxDataViewColumn *ret = new wxDataViewColumn( label, |
900af470 | 705 | new wxDataViewToggleRenderer( wxT("bool"), mode, (int)align ), |
c7074d44 RR |
706 | model_column, width, align, flags ); |
707 | AppendColumn( ret ); | |
708 | return ret; | |
605c2c4a RR |
709 | } |
710 | ||
c7074d44 RR |
711 | wxDataViewColumn * |
712 | wxDataViewCtrlBase::AppendProgressColumn( const wxString &label, unsigned int model_column, | |
87f0efe2 | 713 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
ad63bf41 | 714 | { |
c7074d44 | 715 | wxDataViewColumn *ret = new wxDataViewColumn( label, |
900af470 | 716 | new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode, (int)align ), |
c7074d44 RR |
717 | model_column, width, align, flags ); |
718 | AppendColumn( ret ); | |
719 | return ret; | |
ad63bf41 RR |
720 | } |
721 | ||
c7074d44 RR |
722 | wxDataViewColumn * |
723 | wxDataViewCtrlBase::AppendDateColumn( const wxString &label, unsigned int model_column, | |
87f0efe2 | 724 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
4d496ecb | 725 | { |
c7074d44 | 726 | wxDataViewColumn *ret = new wxDataViewColumn( label, |
900af470 | 727 | new wxDataViewDateRenderer( wxT("datetime"), mode, (int)align ), |
c7074d44 RR |
728 | model_column, width, align, flags ); |
729 | AppendColumn( ret ); | |
730 | return ret; | |
4d496ecb RR |
731 | } |
732 | ||
c7074d44 RR |
733 | wxDataViewColumn * |
734 | wxDataViewCtrlBase::AppendBitmapColumn( const wxString &label, unsigned int model_column, | |
87f0efe2 | 735 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
07a84e7b | 736 | { |
c7074d44 | 737 | wxDataViewColumn *ret = new wxDataViewColumn( label, |
900af470 | 738 | new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode, (int)align ), |
c7074d44 RR |
739 | model_column, width, align, flags ); |
740 | AppendColumn( ret ); | |
741 | return ret; | |
07a84e7b RR |
742 | } |
743 | ||
c7074d44 RR |
744 | wxDataViewColumn * |
745 | wxDataViewCtrlBase::AppendTextColumn( const wxBitmap &label, unsigned int model_column, | |
87f0efe2 | 746 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
07a84e7b | 747 | { |
c7074d44 | 748 | wxDataViewColumn *ret = new wxDataViewColumn( label, |
900af470 | 749 | new wxDataViewTextRenderer( wxT("string"), mode, (int)align ), |
c7074d44 RR |
750 | model_column, width, align, flags ); |
751 | AppendColumn( ret ); | |
752 | return ret; | |
b04fcede RR |
753 | } |
754 | ||
755 | wxDataViewColumn * | |
756 | wxDataViewCtrlBase::AppendIconTextColumn( const wxBitmap &label, unsigned int model_column, | |
757 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) | |
758 | { | |
759 | wxDataViewColumn *ret = new wxDataViewColumn( label, | |
760 | new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode, (int)align ), | |
761 | model_column, width, align, flags ); | |
762 | AppendColumn( ret ); | |
763 | return ret; | |
07a84e7b RR |
764 | } |
765 | ||
c7074d44 RR |
766 | wxDataViewColumn * |
767 | wxDataViewCtrlBase::AppendToggleColumn( const wxBitmap &label, unsigned int model_column, | |
87f0efe2 | 768 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
07a84e7b | 769 | { |
c7074d44 | 770 | wxDataViewColumn *ret = new wxDataViewColumn( label, |
900af470 | 771 | new wxDataViewToggleRenderer( wxT("bool"), mode, (int)align ), |
c7074d44 RR |
772 | model_column, width, align, flags ); |
773 | AppendColumn( ret ); | |
774 | return ret; | |
07a84e7b RR |
775 | } |
776 | ||
c7074d44 RR |
777 | wxDataViewColumn * |
778 | wxDataViewCtrlBase::AppendProgressColumn( const wxBitmap &label, unsigned int model_column, | |
87f0efe2 | 779 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
07a84e7b | 780 | { |
c7074d44 | 781 | wxDataViewColumn *ret = new wxDataViewColumn( label, |
900af470 | 782 | new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode, (int)align ), |
c7074d44 RR |
783 | model_column, width, align, flags ); |
784 | AppendColumn( ret ); | |
785 | return ret; | |
07a84e7b RR |
786 | } |
787 | ||
c7074d44 RR |
788 | wxDataViewColumn * |
789 | wxDataViewCtrlBase::AppendDateColumn( const wxBitmap &label, unsigned int model_column, | |
87f0efe2 | 790 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
07a84e7b | 791 | { |
c7074d44 | 792 | wxDataViewColumn *ret = new wxDataViewColumn( label, |
900af470 | 793 | new wxDataViewDateRenderer( wxT("datetime"), mode, (int)align ), |
c7074d44 RR |
794 | model_column, width, align, flags ); |
795 | AppendColumn( ret ); | |
796 | return ret; | |
07a84e7b RR |
797 | } |
798 | ||
c7074d44 RR |
799 | wxDataViewColumn * |
800 | wxDataViewCtrlBase::AppendBitmapColumn( const wxBitmap &label, unsigned int model_column, | |
87f0efe2 | 801 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
07a84e7b | 802 | { |
c7074d44 | 803 | wxDataViewColumn *ret = new wxDataViewColumn( label, |
900af470 | 804 | new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode, (int)align ), |
c7074d44 RR |
805 | model_column, width, align, flags ); |
806 | AppendColumn( ret ); | |
807 | return ret; | |
07a84e7b RR |
808 | } |
809 | ||
736fe67c RR |
810 | wxDataViewColumn * |
811 | wxDataViewCtrlBase::PrependTextColumn( const wxString &label, unsigned int model_column, | |
812 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) | |
813 | { | |
814 | wxDataViewColumn *ret = new wxDataViewColumn( label, | |
815 | new wxDataViewTextRenderer( wxT("string"), mode, (int)align ), | |
816 | model_column, width, align, flags ); | |
817 | PrependColumn( ret ); | |
818 | return ret; | |
819 | } | |
820 | ||
821 | wxDataViewColumn * | |
822 | wxDataViewCtrlBase::PrependIconTextColumn( const wxString &label, unsigned int model_column, | |
823 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) | |
824 | { | |
825 | wxDataViewColumn *ret = new wxDataViewColumn( label, | |
826 | new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode, (int)align ), | |
827 | model_column, width, align, flags ); | |
828 | PrependColumn( ret ); | |
829 | return ret; | |
830 | } | |
831 | ||
832 | wxDataViewColumn * | |
833 | wxDataViewCtrlBase::PrependToggleColumn( const wxString &label, unsigned int model_column, | |
834 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) | |
835 | { | |
836 | ||
837 | wxDataViewColumn *ret = new wxDataViewColumn( label, | |
838 | new wxDataViewToggleRenderer( wxT("bool"), mode, (int)align ), | |
839 | model_column, width, align, flags ); | |
840 | PrependColumn( ret ); | |
841 | return ret; | |
842 | } | |
843 | ||
844 | wxDataViewColumn * | |
845 | wxDataViewCtrlBase::PrependProgressColumn( const wxString &label, unsigned int model_column, | |
846 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) | |
847 | { | |
848 | wxDataViewColumn *ret = new wxDataViewColumn( label, | |
849 | new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode, (int)align ), | |
850 | model_column, width, align, flags ); | |
851 | PrependColumn( ret ); | |
852 | return ret; | |
853 | } | |
854 | ||
855 | wxDataViewColumn * | |
856 | wxDataViewCtrlBase::PrependDateColumn( const wxString &label, unsigned int model_column, | |
857 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) | |
858 | { | |
859 | wxDataViewColumn *ret = new wxDataViewColumn( label, | |
860 | new wxDataViewDateRenderer( wxT("datetime"), mode, (int)align ), | |
861 | model_column, width, align, flags ); | |
862 | PrependColumn( ret ); | |
863 | return ret; | |
864 | } | |
865 | ||
866 | wxDataViewColumn * | |
867 | wxDataViewCtrlBase::PrependBitmapColumn( const wxString &label, unsigned int model_column, | |
868 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) | |
869 | { | |
870 | wxDataViewColumn *ret = new wxDataViewColumn( label, | |
871 | new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode, (int)align ), | |
872 | model_column, width, align, flags ); | |
873 | PrependColumn( ret ); | |
874 | return ret; | |
875 | } | |
876 | ||
877 | wxDataViewColumn * | |
878 | wxDataViewCtrlBase::PrependTextColumn( const wxBitmap &label, unsigned int model_column, | |
879 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) | |
880 | { | |
881 | wxDataViewColumn *ret = new wxDataViewColumn( label, | |
882 | new wxDataViewTextRenderer( wxT("string"), mode, (int)align ), | |
883 | model_column, width, align, flags ); | |
884 | PrependColumn( ret ); | |
885 | return ret; | |
886 | } | |
887 | ||
888 | wxDataViewColumn * | |
889 | wxDataViewCtrlBase::PrependIconTextColumn( const wxBitmap &label, unsigned int model_column, | |
890 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) | |
891 | { | |
892 | wxDataViewColumn *ret = new wxDataViewColumn( label, | |
893 | new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode, (int)align ), | |
894 | model_column, width, align, flags ); | |
895 | PrependColumn( ret ); | |
896 | return ret; | |
897 | } | |
898 | ||
899 | wxDataViewColumn * | |
900 | wxDataViewCtrlBase::PrependToggleColumn( const wxBitmap &label, unsigned int model_column, | |
901 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) | |
902 | { | |
903 | wxDataViewColumn *ret = new wxDataViewColumn( label, | |
904 | new wxDataViewToggleRenderer( wxT("bool"), mode, (int)align ), | |
905 | model_column, width, align, flags ); | |
906 | PrependColumn( ret ); | |
907 | return ret; | |
908 | } | |
909 | ||
910 | wxDataViewColumn * | |
911 | wxDataViewCtrlBase::PrependProgressColumn( const wxBitmap &label, unsigned int model_column, | |
912 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) | |
913 | { | |
914 | wxDataViewColumn *ret = new wxDataViewColumn( label, | |
915 | new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode, (int)align ), | |
916 | model_column, width, align, flags ); | |
917 | PrependColumn( ret ); | |
918 | return ret; | |
919 | } | |
920 | ||
921 | wxDataViewColumn * | |
922 | wxDataViewCtrlBase::PrependDateColumn( const wxBitmap &label, unsigned int model_column, | |
923 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) | |
924 | { | |
925 | wxDataViewColumn *ret = new wxDataViewColumn( label, | |
926 | new wxDataViewDateRenderer( wxT("datetime"), mode, (int)align ), | |
927 | model_column, width, align, flags ); | |
928 | PrependColumn( ret ); | |
929 | return ret; | |
930 | } | |
931 | ||
932 | wxDataViewColumn * | |
933 | wxDataViewCtrlBase::PrependBitmapColumn( const wxBitmap &label, unsigned int model_column, | |
934 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) | |
935 | { | |
936 | wxDataViewColumn *ret = new wxDataViewColumn( label, | |
937 | new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode, (int)align ), | |
938 | model_column, width, align, flags ); | |
939 | PrependColumn( ret ); | |
940 | return ret; | |
941 | } | |
942 | ||
c7074d44 RR |
943 | bool |
944 | wxDataViewCtrlBase::AppendColumn( wxDataViewColumn *col ) | |
fa28826d | 945 | { |
6842a71a | 946 | col->SetOwner( (wxDataViewCtrl*) this ); |
fa28826d RR |
947 | return true; |
948 | } | |
949 | ||
736fe67c RR |
950 | bool |
951 | wxDataViewCtrlBase::PrependColumn( wxDataViewColumn *col ) | |
952 | { | |
953 | col->SetOwner( (wxDataViewCtrl*) this ); | |
954 | return true; | |
955 | } | |
956 | ||
eb7f97f8 RR |
957 | // --------------------------------------------------------- |
958 | // wxDataViewEvent | |
959 | // --------------------------------------------------------- | |
960 | ||
961 | IMPLEMENT_DYNAMIC_CLASS(wxDataViewEvent,wxNotifyEvent) | |
962 | ||
d86c1870 RR |
963 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED) |
964 | ||
e0062c04 | 965 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED) |
6977c3bf | 966 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING) |
3ecb8a53 | 967 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED) |
6977c3bf | 968 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING) |
3ecb8a53 | 969 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED) |
e0000f94 RR |
970 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED) |
971 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE) | |
6608fdab | 972 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED) |
e0000f94 | 973 | |
31fb32e1 RR |
974 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK) |
975 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK) | |
c0a66d92 | 976 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED) |
eb7f97f8 | 977 | |
52e750fc RR |
978 | |
979 | // ------------------------------------- | |
980 | // wxDataViewSpinRenderer | |
981 | // ------------------------------------- | |
982 | ||
983 | wxDataViewSpinRenderer::wxDataViewSpinRenderer( int min, int max, wxDataViewCellMode mode, int alignment ) : | |
b5ec7dd6 VZ |
984 | wxDataViewCustomRenderer( "long", mode, alignment ) |
985 | { | |
52e750fc RR |
986 | m_min = min; |
987 | m_max = max; | |
988 | } | |
b5ec7dd6 | 989 | |
52e750fc | 990 | wxControl* wxDataViewSpinRenderer::CreateEditorCtrl( wxWindow *parent, wxRect labelRect, const wxVariant &value ) |
b5ec7dd6 | 991 | { |
52e750fc | 992 | long l = value; |
b5ec7dd6 | 993 | return new wxSpinCtrl( parent, wxID_ANY, wxEmptyString, |
52e750fc RR |
994 | labelRect.GetTopLeft(), labelRect.GetSize(), wxSP_ARROW_KEYS, m_min, m_max, l ); |
995 | } | |
b5ec7dd6 | 996 | |
52e750fc | 997 | bool wxDataViewSpinRenderer::GetValueFromEditorCtrl( wxControl* editor, wxVariant &value ) |
b5ec7dd6 | 998 | { |
52e750fc RR |
999 | wxSpinCtrl *sc = (wxSpinCtrl*) editor; |
1000 | long l = sc->GetValue(); | |
1001 | value = l; | |
1002 | return true; | |
1003 | } | |
b5ec7dd6 | 1004 | |
52e750fc RR |
1005 | bool wxDataViewSpinRenderer::Render( wxRect rect, wxDC *dc, int state ) |
1006 | { | |
1007 | wxString str; | |
1008 | str.Printf( "%d", (int) m_data ); | |
1009 | RenderText( str, 0, rect, dc, state ); | |
1010 | return true; | |
1011 | } | |
b5ec7dd6 | 1012 | |
52e750fc RR |
1013 | wxSize wxDataViewSpinRenderer::GetSize() const |
1014 | { | |
1015 | return wxSize(80,16); | |
1016 | } | |
b5ec7dd6 | 1017 | |
52e750fc RR |
1018 | bool wxDataViewSpinRenderer::SetValue( const wxVariant &value ) |
1019 | { | |
1020 | m_data = value.GetLong(); | |
1021 | return true; | |
1022 | } | |
b5ec7dd6 | 1023 | |
52e750fc RR |
1024 | bool wxDataViewSpinRenderer::GetValue( wxVariant &value ) const |
1025 | { | |
1026 | value = m_data; | |
1027 | return true; | |
1028 | } | |
1029 | ||
e94d0c1e RR |
1030 | //----------------------------------------------------------------------------- |
1031 | // wxDataViewTreeStore | |
1032 | //----------------------------------------------------------------------------- | |
1033 | ||
b5ec7dd6 VZ |
1034 | wxDataViewTreeStoreNode::wxDataViewTreeStoreNode( |
1035 | wxDataViewTreeStoreNode *parent, | |
e94d0c1e RR |
1036 | const wxString &text, const wxIcon &icon, wxClientData *data ) |
1037 | { | |
1038 | m_parent = parent; | |
1039 | m_text = text; | |
1040 | m_icon = icon; | |
1041 | m_data = data; | |
1042 | } | |
1043 | ||
1044 | wxDataViewTreeStoreNode::~wxDataViewTreeStoreNode() | |
1045 | { | |
1046 | if (m_data) | |
1047 | delete m_data; | |
1048 | } | |
b5ec7dd6 | 1049 | |
e94d0c1e RR |
1050 | #include "wx/listimpl.cpp" |
1051 | WX_DEFINE_LIST(wxDataViewTreeStoreNodeList); | |
1052 | ||
b5ec7dd6 VZ |
1053 | wxDataViewTreeStoreContainerNode::wxDataViewTreeStoreContainerNode( |
1054 | wxDataViewTreeStoreNode *parent, const wxString &text, | |
e94d0c1e RR |
1055 | const wxIcon &icon, const wxIcon &expanded, wxClientData *data ) : |
1056 | wxDataViewTreeStoreNode( parent, text, icon, data ) | |
1057 | { | |
1058 | m_iconExpanded = expanded; | |
1059 | m_children.DeleteContents(true); | |
1060 | } | |
1061 | ||
1062 | wxDataViewTreeStoreContainerNode::~wxDataViewTreeStoreContainerNode() | |
1063 | { | |
1064 | } | |
1065 | ||
1066 | //----------------------------------------------------------------------------- | |
1067 | ||
1068 | wxDataViewTreeStore::wxDataViewTreeStore() | |
1069 | { | |
1070 | m_root = new wxDataViewTreeStoreContainerNode( NULL, wxEmptyString ); | |
1071 | } | |
1072 | ||
1073 | wxDataViewTreeStore::~wxDataViewTreeStore() | |
1074 | { | |
1075 | delete m_root; | |
1076 | } | |
1077 | ||
b5ec7dd6 | 1078 | wxDataViewItem wxDataViewTreeStore::AppendItem( const wxDataViewItem& parent, |
e94d0c1e RR |
1079 | const wxString &text, const wxIcon &icon, wxClientData *data ) |
1080 | { | |
1081 | wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent ); | |
1082 | if (!parent_node) return wxDataViewItem(0); | |
b5ec7dd6 VZ |
1083 | |
1084 | wxDataViewTreeStoreNode *node = | |
e94d0c1e RR |
1085 | new wxDataViewTreeStoreNode( parent_node, text, icon, data ); |
1086 | parent_node->GetChildren().Append( node ); | |
b5ec7dd6 | 1087 | |
e94d0c1e RR |
1088 | // notify control |
1089 | ItemAdded( parent, node->GetItem() ); | |
b5ec7dd6 | 1090 | |
e94d0c1e RR |
1091 | return node->GetItem(); |
1092 | } | |
1093 | ||
1094 | wxDataViewItem wxDataViewTreeStore::PrependItem( const wxDataViewItem& parent, | |
1095 | const wxString &text, const wxIcon &icon, wxClientData *data ) | |
1096 | { | |
1097 | wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent ); | |
1098 | if (!parent_node) return wxDataViewItem(0); | |
b5ec7dd6 VZ |
1099 | |
1100 | wxDataViewTreeStoreNode *node = | |
e94d0c1e RR |
1101 | new wxDataViewTreeStoreNode( parent_node, text, icon, data ); |
1102 | parent_node->GetChildren().Insert( node ); | |
b5ec7dd6 | 1103 | |
e94d0c1e RR |
1104 | // notify control |
1105 | ItemAdded( parent, node->GetItem() ); | |
b5ec7dd6 | 1106 | |
e94d0c1e RR |
1107 | return node->GetItem(); |
1108 | } | |
1109 | ||
b5ec7dd6 VZ |
1110 | wxDataViewItem |
1111 | wxDataViewTreeStore::InsertItem(const wxDataViewItem& WXUNUSED(parent), | |
1112 | const wxDataViewItem& WXUNUSED(previous), | |
1113 | const wxString& WXUNUSED(text), | |
1114 | const wxIcon& WXUNUSED(icon), | |
1115 | wxClientData * WXUNUSED(data)) | |
e94d0c1e RR |
1116 | { |
1117 | return wxDataViewItem(0); | |
1118 | } | |
1119 | ||
b5ec7dd6 VZ |
1120 | wxDataViewItem wxDataViewTreeStore::PrependContainer( const wxDataViewItem& parent, |
1121 | const wxString &text, const wxIcon &icon, const wxIcon &expanded, | |
e94d0c1e RR |
1122 | wxClientData *data ) |
1123 | { | |
1124 | wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent ); | |
1125 | if (!parent_node) return wxDataViewItem(0); | |
b5ec7dd6 VZ |
1126 | |
1127 | wxDataViewTreeStoreContainerNode *node = | |
e94d0c1e RR |
1128 | new wxDataViewTreeStoreContainerNode( parent_node, text, icon, expanded, data ); |
1129 | parent_node->GetChildren().Insert( node ); | |
b5ec7dd6 | 1130 | |
e94d0c1e RR |
1131 | // notify control |
1132 | ItemAdded( parent, node->GetItem() ); | |
b5ec7dd6 | 1133 | |
e94d0c1e RR |
1134 | return node->GetItem(); |
1135 | } | |
1136 | ||
b5ec7dd6 VZ |
1137 | wxDataViewItem |
1138 | wxDataViewTreeStore::AppendContainer(const wxDataViewItem& parent, | |
1139 | const wxString &text, | |
1140 | const wxIcon& icon, | |
1141 | const wxIcon& expanded, | |
1142 | wxClientData * data) | |
e94d0c1e RR |
1143 | { |
1144 | wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent ); | |
1145 | if (!parent_node) return wxDataViewItem(0); | |
b5ec7dd6 VZ |
1146 | |
1147 | wxDataViewTreeStoreContainerNode *node = | |
e94d0c1e RR |
1148 | new wxDataViewTreeStoreContainerNode( parent_node, text, icon, expanded, data ); |
1149 | parent_node->GetChildren().Append( node ); | |
b5ec7dd6 | 1150 | |
e94d0c1e RR |
1151 | // notify control |
1152 | ItemAdded( parent, node->GetItem() ); | |
b5ec7dd6 | 1153 | |
e94d0c1e RR |
1154 | return node->GetItem(); |
1155 | } | |
1156 | ||
b5ec7dd6 VZ |
1157 | wxDataViewItem |
1158 | wxDataViewTreeStore::InsertContainer(const wxDataViewItem& WXUNUSED(parent), | |
1159 | const wxDataViewItem& WXUNUSED(previous), | |
1160 | const wxString& WXUNUSED(text), | |
1161 | const wxIcon& WXUNUSED(icon), | |
1162 | const wxIcon& WXUNUSED(expanded), | |
1163 | wxClientData * WXUNUSED(data)) | |
e94d0c1e RR |
1164 | { |
1165 | return wxDataViewItem(0); | |
1166 | } | |
1167 | ||
1168 | wxDataViewItem wxDataViewTreeStore::GetNthChild( const wxDataViewItem& parent, unsigned int pos ) const | |
1169 | { | |
1170 | wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent ); | |
1171 | if (!parent_node) return wxDataViewItem(0); | |
b5ec7dd6 | 1172 | |
e94d0c1e RR |
1173 | wxDataViewTreeStoreNodeList::compatibility_iterator node = parent_node->GetChildren().Item( pos ); |
1174 | if (node) | |
1175 | return node->GetData(); | |
b5ec7dd6 | 1176 | |
e94d0c1e RR |
1177 | return wxDataViewItem(0); |
1178 | } | |
1179 | ||
1180 | int wxDataViewTreeStore::GetChildCount( const wxDataViewItem& parent ) const | |
1181 | { | |
1182 | wxDataViewTreeStoreNode *node = FindNode( parent ); | |
1183 | if (!node) return -1; | |
b5ec7dd6 | 1184 | |
e94d0c1e RR |
1185 | if (!node->IsContainer()) |
1186 | return 0; | |
b5ec7dd6 | 1187 | |
e94d0c1e | 1188 | wxDataViewTreeStoreContainerNode *container_node = (wxDataViewTreeStoreContainerNode*) node; |
b5ec7dd6 | 1189 | return (int) container_node->GetChildren().GetCount(); |
e94d0c1e RR |
1190 | } |
1191 | ||
1192 | void wxDataViewTreeStore::SetItemText( const wxDataViewItem& item, const wxString &text ) | |
1193 | { | |
1194 | wxDataViewTreeStoreNode *node = FindNode( item ); | |
1195 | if (!node) return; | |
b5ec7dd6 | 1196 | |
e94d0c1e | 1197 | node->SetText( text ); |
b5ec7dd6 | 1198 | |
e94d0c1e RR |
1199 | // notify control |
1200 | ValueChanged( item, 0 ); | |
1201 | } | |
1202 | ||
1203 | wxString wxDataViewTreeStore::GetItemText( const wxDataViewItem& item ) const | |
1204 | { | |
1205 | wxDataViewTreeStoreNode *node = FindNode( item ); | |
1206 | if (!node) return wxEmptyString; | |
b5ec7dd6 | 1207 | |
e94d0c1e RR |
1208 | return node->GetText(); |
1209 | } | |
1210 | ||
1211 | void wxDataViewTreeStore::SetItemIcon( const wxDataViewItem& item, const wxIcon &icon ) | |
1212 | { | |
1213 | wxDataViewTreeStoreNode *node = FindNode( item ); | |
1214 | if (!node) return; | |
b5ec7dd6 | 1215 | |
e94d0c1e | 1216 | node->SetIcon( icon ); |
b5ec7dd6 | 1217 | |
e94d0c1e RR |
1218 | // notify control |
1219 | ValueChanged( item, 0 ); | |
1220 | } | |
1221 | ||
1222 | const wxIcon &wxDataViewTreeStore::GetItemIcon( const wxDataViewItem& item ) const | |
1223 | { | |
1224 | wxDataViewTreeStoreNode *node = FindNode( item ); | |
1225 | if (!node) return wxNullIcon; | |
b5ec7dd6 | 1226 | |
e94d0c1e RR |
1227 | return node->GetIcon(); |
1228 | } | |
1229 | ||
1230 | void wxDataViewTreeStore::SetItemExpandedIcon( const wxDataViewItem& item, const wxIcon &icon ) | |
1231 | { | |
1232 | wxDataViewTreeStoreContainerNode *node = FindContainerNode( item ); | |
1233 | if (!node) return; | |
b5ec7dd6 | 1234 | |
e94d0c1e | 1235 | node->SetExpandedIcon( icon ); |
b5ec7dd6 | 1236 | |
e94d0c1e RR |
1237 | // notify control |
1238 | ValueChanged( item, 0 ); | |
1239 | } | |
1240 | ||
1241 | const wxIcon &wxDataViewTreeStore::GetItemExpandedIcon( const wxDataViewItem& item ) const | |
1242 | { | |
1243 | wxDataViewTreeStoreContainerNode *node = FindContainerNode( item ); | |
1244 | if (!node) return wxNullIcon; | |
b5ec7dd6 | 1245 | |
e94d0c1e RR |
1246 | return node->GetExpandedIcon(); |
1247 | } | |
1248 | ||
1249 | void wxDataViewTreeStore::SetItemData( const wxDataViewItem& item, wxClientData *data ) | |
1250 | { | |
1251 | wxDataViewTreeStoreNode *node = FindNode( item ); | |
1252 | if (!node) return; | |
b5ec7dd6 | 1253 | |
e94d0c1e | 1254 | node->SetData( data ); |
b5ec7dd6 | 1255 | |
e94d0c1e RR |
1256 | // notify control? only sensible when sorting on client data |
1257 | // ValueChanged( item, 0 ); | |
1258 | } | |
1259 | ||
1260 | wxClientData *wxDataViewTreeStore::GetItemData( const wxDataViewItem& item ) const | |
1261 | { | |
1262 | wxDataViewTreeStoreNode *node = FindNode( item ); | |
1263 | if (!node) return NULL; | |
b5ec7dd6 | 1264 | |
e94d0c1e RR |
1265 | return node->GetData(); |
1266 | } | |
1267 | ||
1268 | void wxDataViewTreeStore::DeleteItem( const wxDataViewItem& item ) | |
1269 | { | |
1270 | if (!item.IsOk()) return; | |
1271 | ||
1272 | wxDataViewItem parent_item = GetParent( item ); | |
1273 | ||
1274 | wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent_item ); | |
1275 | if (!parent_node) return; | |
b5ec7dd6 | 1276 | |
e94d0c1e RR |
1277 | wxDataViewTreeStoreContainerNode *node = FindContainerNode( item ); |
1278 | if (!node) return; | |
b5ec7dd6 | 1279 | |
e94d0c1e | 1280 | parent_node->GetChildren().DeleteObject( node ); |
b5ec7dd6 | 1281 | |
e94d0c1e RR |
1282 | // notify control |
1283 | ItemDeleted( parent_item, item ); | |
1284 | } | |
1285 | ||
1286 | void wxDataViewTreeStore::DeleteChildren( const wxDataViewItem& item ) | |
1287 | { | |
1288 | wxDataViewTreeStoreContainerNode *node = FindContainerNode( item ); | |
1289 | if (!node) return; | |
b5ec7dd6 | 1290 | |
e94d0c1e RR |
1291 | wxDataViewItemArray array; |
1292 | wxDataViewTreeStoreNodeList::iterator iter; | |
1293 | for (iter = node->GetChildren().begin(); iter != node->GetChildren().end(); iter++) | |
1294 | { | |
1295 | wxDataViewTreeStoreNode* child = *iter; | |
1296 | array.Add( child->GetItem() ); | |
1297 | } | |
b5ec7dd6 | 1298 | |
e94d0c1e | 1299 | node->GetChildren().clear(); |
b5ec7dd6 | 1300 | |
e94d0c1e RR |
1301 | // notify control |
1302 | ItemsDeleted( item, array ); | |
1303 | } | |
1304 | ||
1305 | void wxDataViewTreeStore::DeleteAllItems() | |
1306 | { | |
1307 | // TODO | |
1308 | } | |
1309 | ||
b5ec7dd6 VZ |
1310 | void |
1311 | wxDataViewTreeStore::GetValue(wxVariant &variant, | |
1312 | const wxDataViewItem &item, | |
1313 | unsigned int WXUNUSED(col)) const | |
e94d0c1e RR |
1314 | { |
1315 | // if (col != 0) return; | |
b5ec7dd6 | 1316 | |
e94d0c1e RR |
1317 | wxDataViewTreeStoreNode *node = FindNode( item ); |
1318 | if (!node) return; | |
b5ec7dd6 | 1319 | |
e94d0c1e | 1320 | wxDataViewIconText data( node->GetText(), node->GetIcon() ); |
b5ec7dd6 | 1321 | |
e94d0c1e RR |
1322 | variant << data; |
1323 | } | |
1324 | ||
b5ec7dd6 VZ |
1325 | bool |
1326 | wxDataViewTreeStore::SetValue(const wxVariant& variant, | |
1327 | const wxDataViewItem& item, | |
1328 | unsigned int WXUNUSED(col)) | |
e94d0c1e RR |
1329 | { |
1330 | // if (col != 0) return false; | |
b5ec7dd6 | 1331 | |
e94d0c1e RR |
1332 | wxDataViewTreeStoreNode *node = FindNode( item ); |
1333 | if (!node) return false; | |
b5ec7dd6 | 1334 | |
e94d0c1e | 1335 | wxDataViewIconText data; |
b5ec7dd6 | 1336 | |
e94d0c1e | 1337 | data << variant; |
b5ec7dd6 | 1338 | |
e94d0c1e RR |
1339 | node->SetText( data.GetText() ); |
1340 | node->SetIcon( data.GetIcon() ); | |
b5ec7dd6 | 1341 | |
e94d0c1e RR |
1342 | return true; |
1343 | } | |
1344 | ||
1345 | wxDataViewItem wxDataViewTreeStore::GetParent( const wxDataViewItem &item ) const | |
1346 | { | |
1347 | wxDataViewTreeStoreNode *node = FindNode( item ); | |
1348 | if (!node) return wxDataViewItem(0); | |
b5ec7dd6 | 1349 | |
e94d0c1e RR |
1350 | wxDataViewTreeStoreNode *parent = node->GetParent(); |
1351 | if (!parent) return wxDataViewItem(0); | |
b5ec7dd6 | 1352 | |
e94d0c1e RR |
1353 | if (parent == m_root) |
1354 | return wxDataViewItem(0); | |
b5ec7dd6 | 1355 | |
e94d0c1e RR |
1356 | return parent->GetItem(); |
1357 | } | |
1358 | ||
1359 | bool wxDataViewTreeStore::IsContainer( const wxDataViewItem &item ) const | |
1360 | { | |
1361 | wxDataViewTreeStoreNode *node = FindNode( item ); | |
1362 | if (!node) return false; | |
b5ec7dd6 | 1363 | |
e94d0c1e RR |
1364 | return node->IsContainer(); |
1365 | } | |
1366 | ||
1367 | unsigned int wxDataViewTreeStore::GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const | |
1368 | { | |
1369 | wxDataViewTreeStoreContainerNode *node = FindContainerNode( item ); | |
1370 | if (!node) return 0; | |
1371 | ||
1372 | wxDataViewTreeStoreNodeList::iterator iter; | |
1373 | for (iter = node->GetChildren().begin(); iter != node->GetChildren().end(); iter++) | |
1374 | { | |
1375 | wxDataViewTreeStoreNode* child = *iter; | |
1376 | children.Add( child->GetItem() ); | |
1377 | } | |
b5ec7dd6 | 1378 | |
e94d0c1e RR |
1379 | return node->GetChildren().GetCount(); |
1380 | } | |
1381 | ||
b5ec7dd6 | 1382 | int wxDataViewTreeStore::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2, |
e94d0c1e RR |
1383 | unsigned int WXUNUSED(column), bool WXUNUSED(ascending) ) |
1384 | { | |
1385 | wxDataViewTreeStoreNode *node1 = FindNode( item1 ); | |
1386 | wxDataViewTreeStoreNode *node2 = FindNode( item2 ); | |
b5ec7dd6 | 1387 | |
e94d0c1e RR |
1388 | if (!node1 || !node2) |
1389 | return 0; | |
b5ec7dd6 VZ |
1390 | |
1391 | wxDataViewTreeStoreContainerNode* parent1 = | |
e94d0c1e | 1392 | (wxDataViewTreeStoreContainerNode*) node1->GetParent(); |
b5ec7dd6 | 1393 | wxDataViewTreeStoreContainerNode* parent2 = |
e94d0c1e | 1394 | (wxDataViewTreeStoreContainerNode*) node2->GetParent(); |
b5ec7dd6 | 1395 | |
e94d0c1e RR |
1396 | if (parent1 != parent2) |
1397 | { | |
1398 | wxLogError( wxT("Comparing items with different parent.") ); | |
1399 | return 0; | |
1400 | } | |
b5ec7dd6 | 1401 | |
e94d0c1e RR |
1402 | if (node1->IsContainer() && !!node2->IsContainer()) |
1403 | return 1; | |
b5ec7dd6 | 1404 | |
e94d0c1e RR |
1405 | if (node2->IsContainer() && !!node1->IsContainer()) |
1406 | return -1; | |
b5ec7dd6 | 1407 | |
e94d0c1e RR |
1408 | return parent1->GetChildren().IndexOf( node1 ) - parent1->GetChildren().IndexOf( node2 ); |
1409 | } | |
1410 | ||
1411 | wxDataViewTreeStoreNode *wxDataViewTreeStore::FindNode( const wxDataViewItem &item ) const | |
1412 | { | |
1413 | if (!item.IsOk()) | |
1414 | return m_root; | |
b5ec7dd6 | 1415 | |
e94d0c1e RR |
1416 | return (wxDataViewTreeStoreNode*) item.GetID(); |
1417 | } | |
1418 | ||
1419 | wxDataViewTreeStoreContainerNode *wxDataViewTreeStore::FindContainerNode( const wxDataViewItem &item ) const | |
1420 | { | |
1421 | if (!item.IsOk()) | |
1422 | return (wxDataViewTreeStoreContainerNode*) m_root; | |
1423 | ||
1424 | wxDataViewTreeStoreNode* node = (wxDataViewTreeStoreNode*) item.GetID(); | |
b5ec7dd6 | 1425 | |
e94d0c1e RR |
1426 | if (!node->IsContainer()) |
1427 | return NULL; | |
b5ec7dd6 | 1428 | |
e94d0c1e RR |
1429 | return (wxDataViewTreeStoreContainerNode*) node; |
1430 | } | |
1431 | ||
b5ec7dd6 | 1432 | #endif // wxUSE_DATAVIEWCTRL |
e0000f94 | 1433 |