]> git.saurik.com Git - wxWidgets.git/blob - src/common/datavcmn.cpp
Added wxDataViewCustomRenderer::RenderText() for renderer simple text in platform...
[wxWidgets.git] / src / common / datavcmn.cpp
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
18 #if wxUSE_DATAVIEWCTRL
19
20 #include "wx/dataview.h"
21
22 #include "wx/spinctrl.h"
23 #include "wx/dc.h"
24 #include "wx/settings.h"
25
26 #ifndef WX_PRECOMP
27 #include "wx/log.h"
28 #include "wx/icon.h"
29 #endif
30
31 const wxChar wxDataViewCtrlNameStr[] = wxT("dataviewCtrl");
32
33
34 bool operator == (const wxDataViewItem &left, const wxDataViewItem &right)
35 {
36 return (left.GetID() == right.GetID() );
37 }
38
39
40 // ---------------------------------------------------------
41 // wxDataViewModelNotifier
42 // ---------------------------------------------------------
43
44 #include "wx/listimpl.cpp"
45 WX_DEFINE_LIST(wxDataViewModelNotifiers);
46
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;
53
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;
63
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;
73
74 return true;
75 }
76
77 // ---------------------------------------------------------
78 // wxDataViewModel
79 // ---------------------------------------------------------
80
81 wxDataViewModel::wxDataViewModel()
82 {
83 m_notifiers.DeleteContents( true );
84 }
85
86 bool wxDataViewModel::ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item )
87 {
88 bool ret = true;
89
90 wxDataViewModelNotifiers::iterator iter;
91 for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter)
92 {
93 wxDataViewModelNotifier* notifier = *iter;
94 if (!notifier->ItemAdded( parent, item ))
95 ret = false;
96 }
97
98 return ret;
99 }
100
101 bool wxDataViewModel::ItemDeleted( const wxDataViewItem &parent, const wxDataViewItem &item )
102 {
103 bool ret = true;
104
105 wxDataViewModelNotifiers::iterator iter;
106 for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter)
107 {
108 wxDataViewModelNotifier* notifier = *iter;
109 if (!notifier->ItemDeleted( parent, item ))
110 ret = false;
111 }
112
113 return ret;
114 }
115
116 bool wxDataViewModel::ItemChanged( const wxDataViewItem &item )
117 {
118 bool ret = true;
119
120 wxDataViewModelNotifiers::iterator iter;
121 for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter)
122 {
123 wxDataViewModelNotifier* notifier = *iter;
124 if (!notifier->ItemChanged( item ))
125 ret = false;
126 }
127
128 return ret;
129 }
130
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
176 bool wxDataViewModel::ValueChanged( const wxDataViewItem &item, unsigned int col )
177 {
178 bool ret = true;
179
180 wxDataViewModelNotifiers::iterator iter;
181 for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter)
182 {
183 wxDataViewModelNotifier* notifier = *iter;
184 if (!notifier->ValueChanged( item, col ))
185 ret = false;
186 }
187
188 return ret;
189 }
190
191 bool wxDataViewModel::Cleared()
192 {
193 bool ret = true;
194
195 wxDataViewModelNotifiers::iterator iter;
196 for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter)
197 {
198 wxDataViewModelNotifier* notifier = *iter;
199 if (!notifier->Cleared())
200 ret = false;
201 }
202
203 return ret;
204 }
205
206 void wxDataViewModel::Resort()
207 {
208 wxDataViewModelNotifiers::iterator iter;
209 for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter)
210 {
211 wxDataViewModelNotifier* notifier = *iter;
212 notifier->Resort();
213 }
214 }
215
216 void wxDataViewModel::AddNotifier( wxDataViewModelNotifier *notifier )
217 {
218 m_notifiers.push_back( notifier );
219 notifier->SetOwner( this );
220 }
221
222 void wxDataViewModel::RemoveNotifier( wxDataViewModelNotifier *notifier )
223 {
224 m_notifiers.DeleteObject( notifier );
225 }
226
227 int wxDataViewModel::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,
228 unsigned int column, bool ascending )
229 {
230 // sort branches before leaves
231 bool item1_is_container = IsContainer(item1);
232 bool item2_is_container = IsContainer(item2);
233
234 if (item1_is_container && !item2_is_container)
235 return 1;
236 if (item2_is_container && !item1_is_container)
237 return -1;
238
239 wxVariant value1,value2;
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 }
249
250 if (value1.GetType() == wxT("string"))
251 {
252 wxString str1 = value1.GetString();
253 wxString str2 = value2.GetString();
254 int res = str1.Cmp( str2 );
255 if (res) return res;
256 } else
257 if (value1.GetType() == wxT("long"))
258 {
259 long l1 = value1.GetLong();
260 long l2 = value2.GetLong();
261 long res = l1-l2;
262 if (res) return res;
263 } else
264 if (value1.GetType() == wxT("double"))
265 {
266 double d1 = value1.GetDouble();
267 double d2 = value2.GetDouble();
268 if (d1 < d2) return 1;
269 if (d1 > d2) return -1;
270 } else
271 if (value1.GetType() == wxT("datetime"))
272 {
273 wxDateTime dt1 = value1.GetDateTime();
274 wxDateTime dt2 = value2.GetDateTime();
275 if (dt1.IsEarlierThan(dt2)) return 1;
276 if (dt2.IsEarlierThan(dt1)) return -11;
277 }
278
279 // items must be different
280 unsigned long litem1 = (unsigned long) item1.GetID();
281 unsigned long litem2 = (unsigned long) item2.GetID();
282
283 if (!ascending)
284 return litem2-litem2;
285
286 return litem1-litem2;
287 }
288
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] );
333 wxDataViewModel::ItemDeleted( wxDataViewItem(0), item );
334 m_hash.RemoveAt( row );
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 {
355 wxASSERT( row < m_hash.GetCount() );
356 return wxDataViewItem( m_hash[row] );
357 }
358
359 int wxDataViewIndexListModel::Compare(const wxDataViewItem& item1,
360 const wxDataViewItem& item2,
361 unsigned int WXUNUSED(column),
362 bool ascending)
363 {
364 if (ascending)
365 return GetRow(item1) - GetRow(item2);
366
367 return GetRow(item2) - GetRow(item1);
368 }
369
370 void wxDataViewIndexListModel::GetValue( wxVariant &variant,
371 const wxDataViewItem &item, unsigned int col ) const
372 {
373 GetValue( variant, GetRow(item), col );
374 }
375
376 bool wxDataViewIndexListModel::SetValue( const wxVariant &variant,
377 const wxDataViewItem &item, unsigned int col )
378 {
379 return SetValue( variant, GetRow(item), col );
380 }
381
382 wxDataViewItem wxDataViewIndexListModel::GetParent( const wxDataViewItem & WXUNUSED(item) ) const
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;
392
393 return false;
394 }
395
396 unsigned int wxDataViewIndexListModel::GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const
397 {
398 if (item.IsOk())
399 return 0;
400
401 children = m_hash;
402
403 return m_hash.GetCount();
404 }
405
406 //-----------------------------------------------------------------------------
407 // wxDataViewIconText
408 //-----------------------------------------------------------------------------
409
410 IMPLEMENT_DYNAMIC_CLASS(wxDataViewIconText,wxObject)
411
412 IMPLEMENT_VARIANT_OBJECT_EXPORTED(wxDataViewIconText, WXDLLIMPEXP_ADV)
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
421 // ---------------------------------------------------------
422 // wxDataViewRendererBase
423 // ---------------------------------------------------------
424
425 IMPLEMENT_ABSTRACT_CLASS(wxDataViewRendererBase, wxObject)
426
427 wxDataViewRendererBase::wxDataViewRendererBase( const wxString &varianttype,
428 wxDataViewCellMode WXUNUSED(mode),
429 int WXUNUSED(align) )
430 {
431 m_variantType = varianttype;
432 m_editorCtrl = NULL;
433 }
434
435 const wxDataViewCtrl* wxDataViewRendererBase::GetView() const
436 {
437 return wx_const_cast(wxDataViewRendererBase*, this)->GetOwner()->GetOwner();
438 }
439
440 bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect labelRect )
441 {
442 m_item = item; // remember for later
443
444 unsigned int col = GetOwner()->GetModelColumn();
445 wxVariant value;
446 GetOwner()->GetOwner()->GetModel()->GetValue( value, item, col );
447
448 m_editorCtrl = CreateEditorCtrl( GetOwner()->GetOwner()->GetMainWindow(), labelRect, value );
449
450 wxDataViewEditorCtrlEvtHandler *handler =
451 new wxDataViewEditorCtrlEvtHandler( m_editorCtrl, (wxDataViewRenderer*) this );
452
453 m_editorCtrl->PushEventHandler( handler );
454
455 #if defined(__WXGTK20__) && !defined(wxUSE_GENERICDATAVIEWCTRL)
456 handler->SetFocusOnIdle();
457 #else
458 m_editorCtrl->SetFocus();
459 #endif
460
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 );
466 GetOwner()->GetOwner()->GetEventHandler()->ProcessEvent( event );
467
468 return true;
469 }
470
471 void wxDataViewRendererBase::CancelEditing()
472 {
473 wxPendingDelete.Append( m_editorCtrl );
474
475 GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
476
477 // m_editorCtrl->PopEventHandler( true );
478 }
479
480 bool wxDataViewRendererBase::FinishEditing()
481 {
482 wxVariant value;
483 GetValueFromEditorCtrl( m_editorCtrl, value );
484
485 wxPendingDelete.Append( m_editorCtrl );
486
487 GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
488
489 if (!Validate(value))
490 return false;
491
492 unsigned int col = GetOwner()->GetModelColumn();
493 GetOwner()->GetOwner()->GetModel()->SetValue( value, m_item, col );
494 GetOwner()->GetOwner()->GetModel()->ValueChanged( m_item, col );
495
496 // m_editorCtrl->PopEventHandler( true );
497
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() );
502 event.SetItem( m_item );
503 GetOwner()->GetOwner()->GetEventHandler()->ProcessEvent( event );
504
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)
515 EVT_IDLE (wxDataViewEditorCtrlEvtHandler::OnIdle)
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
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 }
536
537 event.Skip();
538 }
539
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
567 event.Skip();
568 }
569
570 // ---------------------------------------------------------
571 // wxDataViewColumnBase
572 // ---------------------------------------------------------
573
574 IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumnBase, wxObject)
575
576 wxDataViewColumnBase::wxDataViewColumnBase(const wxString& WXUNUSED(title),
577 wxDataViewRenderer *renderer,
578 unsigned int model_column,
579 int WXUNUSED(width),
580 wxAlignment WXUNUSED(align),
581 int WXUNUSED(flags))
582 {
583 m_renderer = renderer;
584 m_model_column = model_column;
585 m_owner = NULL;
586 m_renderer->SetOwner( (wxDataViewColumn*) this );
587
588 // NOTE: the wxDataViewColumn's ctor must store the width, align, flags
589 // parameters inside the native control!
590 }
591
592 wxDataViewColumnBase::wxDataViewColumnBase(const wxBitmap& bitmap,
593 wxDataViewRenderer *renderer,
594 unsigned int model_column,
595 int WXUNUSED(width),
596 wxAlignment WXUNUSED(align),
597 int WXUNUSED(flags) )
598 {
599 m_renderer = renderer;
600 m_model_column = model_column;
601 m_bitmap = bitmap;
602 m_owner = NULL;
603 m_renderer->SetOwner( (wxDataViewColumn*) this );
604 }
605
606 wxDataViewColumnBase::~wxDataViewColumnBase()
607 {
608 if (m_renderer)
609 delete m_renderer;
610 }
611
612 int wxDataViewColumnBase::GetFlags() const
613 {
614 int ret = 0;
615
616 if (IsSortable())
617 ret |= wxDATAVIEW_COL_SORTABLE;
618 if (IsResizeable())
619 ret |= wxDATAVIEW_COL_RESIZABLE;
620 if (IsHidden())
621 ret |= wxDATAVIEW_COL_HIDDEN;
622
623 return ret;
624 }
625
626 void wxDataViewColumnBase::SetFlags(int flags)
627 {
628 SetSortable((flags & wxDATAVIEW_COL_SORTABLE) != 0);
629 SetResizeable((flags & wxDATAVIEW_COL_RESIZABLE) != 0);
630 SetHidden((flags & wxDATAVIEW_COL_HIDDEN) != 0);
631 }
632
633 // ---------------------------------------------------------
634 // wxDataViewCtrlBase
635 // ---------------------------------------------------------
636
637 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCtrlBase, wxControl)
638
639 wxDataViewCtrlBase::wxDataViewCtrlBase()
640 {
641 m_model = NULL;
642 m_expander_column = 0;
643 m_indent = 8;
644 }
645
646 wxDataViewCtrlBase::~wxDataViewCtrlBase()
647 {
648 if (m_model)
649 {
650 m_model->DecRef();
651 m_model = NULL;
652 }
653 }
654
655 bool wxDataViewCtrlBase::AssociateModel( wxDataViewModel *model )
656 {
657 if (m_model)
658 {
659 m_model->DecRef(); // discard old model, if any
660 }
661
662 // add our own reference to the new model:
663 m_model = model;
664 if (m_model)
665 {
666 m_model->IncRef();
667 }
668
669 return true;
670 }
671
672 wxDataViewModel* wxDataViewCtrlBase::GetModel()
673 {
674 return m_model;
675 }
676
677 wxDataViewColumn *
678 wxDataViewCtrlBase::AppendTextColumn( const wxString &label, unsigned int model_column,
679 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
680 {
681 wxDataViewColumn *ret = new wxDataViewColumn( label,
682 new wxDataViewTextRenderer( wxT("string"), mode, (int)align ),
683 model_column, width, align, flags );
684 AppendColumn( ret );
685 return ret;
686 }
687
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
699 wxDataViewColumn *
700 wxDataViewCtrlBase::AppendToggleColumn( const wxString &label, unsigned int model_column,
701 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
702 {
703
704 wxDataViewColumn *ret = new wxDataViewColumn( label,
705 new wxDataViewToggleRenderer( wxT("bool"), mode, (int)align ),
706 model_column, width, align, flags );
707 AppendColumn( ret );
708 return ret;
709 }
710
711 wxDataViewColumn *
712 wxDataViewCtrlBase::AppendProgressColumn( const wxString &label, unsigned int model_column,
713 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
714 {
715 wxDataViewColumn *ret = new wxDataViewColumn( label,
716 new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode, (int)align ),
717 model_column, width, align, flags );
718 AppendColumn( ret );
719 return ret;
720 }
721
722 wxDataViewColumn *
723 wxDataViewCtrlBase::AppendDateColumn( const wxString &label, unsigned int model_column,
724 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
725 {
726 wxDataViewColumn *ret = new wxDataViewColumn( label,
727 new wxDataViewDateRenderer( wxT("datetime"), mode, (int)align ),
728 model_column, width, align, flags );
729 AppendColumn( ret );
730 return ret;
731 }
732
733 wxDataViewColumn *
734 wxDataViewCtrlBase::AppendBitmapColumn( const wxString &label, unsigned int model_column,
735 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
736 {
737 wxDataViewColumn *ret = new wxDataViewColumn( label,
738 new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode, (int)align ),
739 model_column, width, align, flags );
740 AppendColumn( ret );
741 return ret;
742 }
743
744 wxDataViewColumn *
745 wxDataViewCtrlBase::AppendTextColumn( const wxBitmap &label, unsigned int model_column,
746 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
747 {
748 wxDataViewColumn *ret = new wxDataViewColumn( label,
749 new wxDataViewTextRenderer( wxT("string"), mode, (int)align ),
750 model_column, width, align, flags );
751 AppendColumn( ret );
752 return ret;
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;
764 }
765
766 wxDataViewColumn *
767 wxDataViewCtrlBase::AppendToggleColumn( const wxBitmap &label, unsigned int model_column,
768 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
769 {
770 wxDataViewColumn *ret = new wxDataViewColumn( label,
771 new wxDataViewToggleRenderer( wxT("bool"), mode, (int)align ),
772 model_column, width, align, flags );
773 AppendColumn( ret );
774 return ret;
775 }
776
777 wxDataViewColumn *
778 wxDataViewCtrlBase::AppendProgressColumn( const wxBitmap &label, unsigned int model_column,
779 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
780 {
781 wxDataViewColumn *ret = new wxDataViewColumn( label,
782 new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode, (int)align ),
783 model_column, width, align, flags );
784 AppendColumn( ret );
785 return ret;
786 }
787
788 wxDataViewColumn *
789 wxDataViewCtrlBase::AppendDateColumn( const wxBitmap &label, unsigned int model_column,
790 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
791 {
792 wxDataViewColumn *ret = new wxDataViewColumn( label,
793 new wxDataViewDateRenderer( wxT("datetime"), mode, (int)align ),
794 model_column, width, align, flags );
795 AppendColumn( ret );
796 return ret;
797 }
798
799 wxDataViewColumn *
800 wxDataViewCtrlBase::AppendBitmapColumn( const wxBitmap &label, unsigned int model_column,
801 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
802 {
803 wxDataViewColumn *ret = new wxDataViewColumn( label,
804 new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode, (int)align ),
805 model_column, width, align, flags );
806 AppendColumn( ret );
807 return ret;
808 }
809
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
943 bool
944 wxDataViewCtrlBase::AppendColumn( wxDataViewColumn *col )
945 {
946 col->SetOwner( (wxDataViewCtrl*) this );
947 return true;
948 }
949
950 bool
951 wxDataViewCtrlBase::PrependColumn( wxDataViewColumn *col )
952 {
953 col->SetOwner( (wxDataViewCtrl*) this );
954 return true;
955 }
956
957 // ---------------------------------------------------------
958 // wxDataViewEvent
959 // ---------------------------------------------------------
960
961 IMPLEMENT_DYNAMIC_CLASS(wxDataViewEvent,wxNotifyEvent)
962
963 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED)
964
965 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED)
966 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING)
967 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED)
968 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING)
969 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED)
970 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED)
971 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE)
972 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED)
973
974 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK)
975 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK)
976 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED)
977
978
979 // -------------------------------------
980 // wxDataViewSpinRenderer
981 // -------------------------------------
982
983 wxDataViewSpinRenderer::wxDataViewSpinRenderer( int min, int max, wxDataViewCellMode mode, int alignment ) :
984 wxDataViewCustomRenderer( "long", mode, alignment )
985 {
986 m_min = min;
987 m_max = max;
988 }
989
990 wxControl* wxDataViewSpinRenderer::CreateEditorCtrl( wxWindow *parent, wxRect labelRect, const wxVariant &value )
991 {
992 long l = value;
993 return new wxSpinCtrl( parent, wxID_ANY, wxEmptyString,
994 labelRect.GetTopLeft(), labelRect.GetSize(), wxSP_ARROW_KEYS, m_min, m_max, l );
995 }
996
997 bool wxDataViewSpinRenderer::GetValueFromEditorCtrl( wxControl* editor, wxVariant &value )
998 {
999 wxSpinCtrl *sc = (wxSpinCtrl*) editor;
1000 long l = sc->GetValue();
1001 value = l;
1002 return true;
1003 }
1004
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 }
1012
1013 wxSize wxDataViewSpinRenderer::GetSize() const
1014 {
1015 return wxSize(80,16);
1016 }
1017
1018 bool wxDataViewSpinRenderer::SetValue( const wxVariant &value )
1019 {
1020 m_data = value.GetLong();
1021 return true;
1022 }
1023
1024 bool wxDataViewSpinRenderer::GetValue( wxVariant &value ) const
1025 {
1026 value = m_data;
1027 return true;
1028 }
1029
1030 //-----------------------------------------------------------------------------
1031 // wxDataViewTreeStore
1032 //-----------------------------------------------------------------------------
1033
1034 wxDataViewTreeStoreNode::wxDataViewTreeStoreNode(
1035 wxDataViewTreeStoreNode *parent,
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 }
1049
1050 #include "wx/listimpl.cpp"
1051 WX_DEFINE_LIST(wxDataViewTreeStoreNodeList);
1052
1053 wxDataViewTreeStoreContainerNode::wxDataViewTreeStoreContainerNode(
1054 wxDataViewTreeStoreNode *parent, const wxString &text,
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
1078 wxDataViewItem wxDataViewTreeStore::AppendItem( const wxDataViewItem& parent,
1079 const wxString &text, const wxIcon &icon, wxClientData *data )
1080 {
1081 wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent );
1082 if (!parent_node) return wxDataViewItem(0);
1083
1084 wxDataViewTreeStoreNode *node =
1085 new wxDataViewTreeStoreNode( parent_node, text, icon, data );
1086 parent_node->GetChildren().Append( node );
1087
1088 // notify control
1089 ItemAdded( parent, node->GetItem() );
1090
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);
1099
1100 wxDataViewTreeStoreNode *node =
1101 new wxDataViewTreeStoreNode( parent_node, text, icon, data );
1102 parent_node->GetChildren().Insert( node );
1103
1104 // notify control
1105 ItemAdded( parent, node->GetItem() );
1106
1107 return node->GetItem();
1108 }
1109
1110 wxDataViewItem wxDataViewTreeStore::InsertItem( const wxDataViewItem& parent, const wxDataViewItem& previous,
1111 const wxString &text, const wxIcon &icon, wxClientData *data )
1112 {
1113 return wxDataViewItem(0);
1114 }
1115
1116 wxDataViewItem wxDataViewTreeStore::PrependContainer( const wxDataViewItem& parent,
1117 const wxString &text, const wxIcon &icon, const wxIcon &expanded,
1118 wxClientData *data )
1119 {
1120 wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent );
1121 if (!parent_node) return wxDataViewItem(0);
1122
1123 wxDataViewTreeStoreContainerNode *node =
1124 new wxDataViewTreeStoreContainerNode( parent_node, text, icon, expanded, data );
1125 parent_node->GetChildren().Insert( node );
1126
1127 // notify control
1128 ItemAdded( parent, node->GetItem() );
1129
1130 return node->GetItem();
1131 }
1132
1133 wxDataViewItem wxDataViewTreeStore::AppendContainer( const wxDataViewItem& parent,
1134 const wxString &text, const wxIcon &icon, const wxIcon &expanded,
1135 wxClientData *data )
1136 {
1137 wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent );
1138 if (!parent_node) return wxDataViewItem(0);
1139
1140 wxDataViewTreeStoreContainerNode *node =
1141 new wxDataViewTreeStoreContainerNode( parent_node, text, icon, expanded, data );
1142 parent_node->GetChildren().Append( node );
1143
1144 // notify control
1145 ItemAdded( parent, node->GetItem() );
1146
1147 return node->GetItem();
1148 }
1149
1150 wxDataViewItem wxDataViewTreeStore::InsertContainer( const wxDataViewItem& parent, const wxDataViewItem& previous,
1151 const wxString &text, const wxIcon &icon, const wxIcon &expanded,
1152 wxClientData *data )
1153 {
1154 return wxDataViewItem(0);
1155 }
1156
1157 wxDataViewItem wxDataViewTreeStore::GetNthChild( const wxDataViewItem& parent, unsigned int pos ) const
1158 {
1159 wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent );
1160 if (!parent_node) return wxDataViewItem(0);
1161
1162 wxDataViewTreeStoreNodeList::compatibility_iterator node = parent_node->GetChildren().Item( pos );
1163 if (node)
1164 return node->GetData();
1165
1166 return wxDataViewItem(0);
1167 }
1168
1169 int wxDataViewTreeStore::GetChildCount( const wxDataViewItem& parent ) const
1170 {
1171 wxDataViewTreeStoreNode *node = FindNode( parent );
1172 if (!node) return -1;
1173
1174 if (!node->IsContainer())
1175 return 0;
1176
1177 wxDataViewTreeStoreContainerNode *container_node = (wxDataViewTreeStoreContainerNode*) node;
1178 return (int) container_node->GetChildren().GetCount();
1179 }
1180
1181 void wxDataViewTreeStore::SetItemText( const wxDataViewItem& item, const wxString &text )
1182 {
1183 wxDataViewTreeStoreNode *node = FindNode( item );
1184 if (!node) return;
1185
1186 node->SetText( text );
1187
1188 // notify control
1189 ValueChanged( item, 0 );
1190 }
1191
1192 wxString wxDataViewTreeStore::GetItemText( const wxDataViewItem& item ) const
1193 {
1194 wxDataViewTreeStoreNode *node = FindNode( item );
1195 if (!node) return wxEmptyString;
1196
1197 return node->GetText();
1198 }
1199
1200 void wxDataViewTreeStore::SetItemIcon( const wxDataViewItem& item, const wxIcon &icon )
1201 {
1202 wxDataViewTreeStoreNode *node = FindNode( item );
1203 if (!node) return;
1204
1205 node->SetIcon( icon );
1206
1207 // notify control
1208 ValueChanged( item, 0 );
1209 }
1210
1211 const wxIcon &wxDataViewTreeStore::GetItemIcon( const wxDataViewItem& item ) const
1212 {
1213 wxDataViewTreeStoreNode *node = FindNode( item );
1214 if (!node) return wxNullIcon;
1215
1216 return node->GetIcon();
1217 }
1218
1219 void wxDataViewTreeStore::SetItemExpandedIcon( const wxDataViewItem& item, const wxIcon &icon )
1220 {
1221 wxDataViewTreeStoreContainerNode *node = FindContainerNode( item );
1222 if (!node) return;
1223
1224 node->SetExpandedIcon( icon );
1225
1226 // notify control
1227 ValueChanged( item, 0 );
1228 }
1229
1230 const wxIcon &wxDataViewTreeStore::GetItemExpandedIcon( const wxDataViewItem& item ) const
1231 {
1232 wxDataViewTreeStoreContainerNode *node = FindContainerNode( item );
1233 if (!node) return wxNullIcon;
1234
1235 return node->GetExpandedIcon();
1236 }
1237
1238 void wxDataViewTreeStore::SetItemData( const wxDataViewItem& item, wxClientData *data )
1239 {
1240 wxDataViewTreeStoreNode *node = FindNode( item );
1241 if (!node) return;
1242
1243 node->SetData( data );
1244
1245 // notify control? only sensible when sorting on client data
1246 // ValueChanged( item, 0 );
1247 }
1248
1249 wxClientData *wxDataViewTreeStore::GetItemData( const wxDataViewItem& item ) const
1250 {
1251 wxDataViewTreeStoreNode *node = FindNode( item );
1252 if (!node) return NULL;
1253
1254 return node->GetData();
1255 }
1256
1257 void wxDataViewTreeStore::DeleteItem( const wxDataViewItem& item )
1258 {
1259 if (!item.IsOk()) return;
1260
1261 wxDataViewItem parent_item = GetParent( item );
1262
1263 wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent_item );
1264 if (!parent_node) return;
1265
1266 wxDataViewTreeStoreContainerNode *node = FindContainerNode( item );
1267 if (!node) return;
1268
1269 parent_node->GetChildren().DeleteObject( node );
1270
1271 // notify control
1272 ItemDeleted( parent_item, item );
1273 }
1274
1275 void wxDataViewTreeStore::DeleteChildren( const wxDataViewItem& item )
1276 {
1277 wxDataViewTreeStoreContainerNode *node = FindContainerNode( item );
1278 if (!node) return;
1279
1280 wxDataViewItemArray array;
1281 wxDataViewTreeStoreNodeList::iterator iter;
1282 for (iter = node->GetChildren().begin(); iter != node->GetChildren().end(); iter++)
1283 {
1284 wxDataViewTreeStoreNode* child = *iter;
1285 array.Add( child->GetItem() );
1286 }
1287
1288 node->GetChildren().clear();
1289
1290 // notify control
1291 ItemsDeleted( item, array );
1292 }
1293
1294 void wxDataViewTreeStore::DeleteAllItems()
1295 {
1296 // TODO
1297 }
1298
1299 void wxDataViewTreeStore::GetValue( wxVariant &variant,
1300 const wxDataViewItem &item, unsigned int col ) const
1301 {
1302 // if (col != 0) return;
1303
1304 wxDataViewTreeStoreNode *node = FindNode( item );
1305 if (!node) return;
1306
1307 wxDataViewIconText data( node->GetText(), node->GetIcon() );
1308
1309 variant << data;
1310 }
1311
1312 bool wxDataViewTreeStore::SetValue( const wxVariant &variant,
1313 const wxDataViewItem &item, unsigned int col )
1314 {
1315 // if (col != 0) return false;
1316
1317 wxDataViewTreeStoreNode *node = FindNode( item );
1318 if (!node) return false;
1319
1320 wxDataViewIconText data;
1321
1322 data << variant;
1323
1324 node->SetText( data.GetText() );
1325 node->SetIcon( data.GetIcon() );
1326
1327 return true;
1328 }
1329
1330 wxDataViewItem wxDataViewTreeStore::GetParent( const wxDataViewItem &item ) const
1331 {
1332 wxDataViewTreeStoreNode *node = FindNode( item );
1333 if (!node) return wxDataViewItem(0);
1334
1335 wxDataViewTreeStoreNode *parent = node->GetParent();
1336 if (!parent) return wxDataViewItem(0);
1337
1338 if (parent == m_root)
1339 return wxDataViewItem(0);
1340
1341 return parent->GetItem();
1342 }
1343
1344 bool wxDataViewTreeStore::IsContainer( const wxDataViewItem &item ) const
1345 {
1346 wxDataViewTreeStoreNode *node = FindNode( item );
1347 if (!node) return false;
1348
1349 return node->IsContainer();
1350 }
1351
1352 unsigned int wxDataViewTreeStore::GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const
1353 {
1354 wxDataViewTreeStoreContainerNode *node = FindContainerNode( item );
1355 if (!node) return 0;
1356
1357 wxDataViewTreeStoreNodeList::iterator iter;
1358 for (iter = node->GetChildren().begin(); iter != node->GetChildren().end(); iter++)
1359 {
1360 wxDataViewTreeStoreNode* child = *iter;
1361 children.Add( child->GetItem() );
1362 }
1363
1364 return node->GetChildren().GetCount();
1365 }
1366
1367 int wxDataViewTreeStore::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,
1368 unsigned int WXUNUSED(column), bool WXUNUSED(ascending) )
1369 {
1370 wxDataViewTreeStoreNode *node1 = FindNode( item1 );
1371 wxDataViewTreeStoreNode *node2 = FindNode( item2 );
1372
1373 if (!node1 || !node2)
1374 return 0;
1375
1376 wxDataViewTreeStoreContainerNode* parent1 =
1377 (wxDataViewTreeStoreContainerNode*) node1->GetParent();
1378 wxDataViewTreeStoreContainerNode* parent2 =
1379 (wxDataViewTreeStoreContainerNode*) node2->GetParent();
1380
1381 if (parent1 != parent2)
1382 {
1383 wxLogError( wxT("Comparing items with different parent.") );
1384 return 0;
1385 }
1386
1387 if (node1->IsContainer() && !!node2->IsContainer())
1388 return 1;
1389
1390 if (node2->IsContainer() && !!node1->IsContainer())
1391 return -1;
1392
1393 return parent1->GetChildren().IndexOf( node1 ) - parent1->GetChildren().IndexOf( node2 );
1394 }
1395
1396 wxDataViewTreeStoreNode *wxDataViewTreeStore::FindNode( const wxDataViewItem &item ) const
1397 {
1398 if (!item.IsOk())
1399 return m_root;
1400
1401 return (wxDataViewTreeStoreNode*) item.GetID();
1402 }
1403
1404 wxDataViewTreeStoreContainerNode *wxDataViewTreeStore::FindContainerNode( const wxDataViewItem &item ) const
1405 {
1406 if (!item.IsOk())
1407 return (wxDataViewTreeStoreContainerNode*) m_root;
1408
1409 wxDataViewTreeStoreNode* node = (wxDataViewTreeStoreNode*) item.GetID();
1410
1411 if (!node->IsContainer())
1412 return NULL;
1413
1414 return (wxDataViewTreeStoreContainerNode*) node;
1415 }
1416
1417 #endif
1418