]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/common/datavcmn.cpp
on demand creation of native CGContexts , so that pure text measuring contexts don...
[wxWidgets.git] / src / common / datavcmn.cpp
... / ...
CommitLineData
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#ifndef WX_PRECOMP
23 #include "wx/log.h"
24#endif
25
26const wxChar wxDataViewCtrlNameStr[] = wxT("dataviewCtrl");
27
28// ---------------------------------------------------------
29// wxDataViewModel
30// ---------------------------------------------------------
31
32IMPLEMENT_ABSTRACT_CLASS(wxDataViewModel, wxObject)
33
34// ---------------------------------------------------------
35// wxDataViewListModel
36// ---------------------------------------------------------
37
38IMPLEMENT_ABSTRACT_CLASS(wxDataViewListModel, wxDataViewModel)
39
40wxDataViewListModel::wxDataViewListModel()
41{
42 m_viewingColumns.DeleteContents( true );
43 m_notifiers.DeleteContents( true );
44}
45
46wxDataViewListModel::~wxDataViewListModel()
47{
48}
49
50bool wxDataViewListModel::RowAppended()
51{
52 bool ret = true;
53
54 wxList::compatibility_iterator node = m_notifiers.GetFirst();
55 while (node)
56 {
57 wxDataViewListModelNotifier* notifier = (wxDataViewListModelNotifier*) node->GetData();
58 if (!notifier->RowAppended())
59 ret = false;
60 node = node->GetNext();
61 }
62
63 return ret;
64}
65
66bool wxDataViewListModel::RowPrepended()
67{
68 bool ret = true;
69
70 wxList::compatibility_iterator node = m_notifiers.GetFirst();
71 while (node)
72 {
73 wxDataViewListModelNotifier* notifier = (wxDataViewListModelNotifier*) node->GetData();
74 if (!notifier->RowPrepended())
75 ret = false;
76 node = node->GetNext();
77 }
78
79 return ret;
80}
81
82bool wxDataViewListModel::RowInserted( unsigned int before )
83{
84 bool ret = true;
85
86 wxList::compatibility_iterator node = m_notifiers.GetFirst();
87 while (node)
88 {
89 wxDataViewListModelNotifier* notifier = (wxDataViewListModelNotifier*) node->GetData();
90 if (!notifier->RowInserted(before))
91 ret = false;
92 node = node->GetNext();
93 }
94
95 return ret;
96}
97
98bool wxDataViewListModel::RowDeleted( unsigned int row )
99{
100 bool ret = true;
101
102 wxList::compatibility_iterator node = m_notifiers.GetFirst();
103 while (node)
104 {
105 wxDataViewListModelNotifier* notifier = (wxDataViewListModelNotifier*) node->GetData();
106 if (!notifier->RowDeleted( row ))
107 ret = false;
108 node = node->GetNext();
109 }
110
111 return ret;
112}
113
114bool wxDataViewListModel::RowChanged( unsigned int row )
115{
116 bool ret = true;
117
118 wxList::compatibility_iterator node = m_notifiers.GetFirst();
119 while (node)
120 {
121 wxDataViewListModelNotifier* notifier = (wxDataViewListModelNotifier*) node->GetData();
122 if (!notifier->RowChanged( row ))
123 ret = false;
124 node = node->GetNext();
125 }
126
127 return ret;
128}
129
130bool wxDataViewListModel::ValueChanged( unsigned int col, unsigned int row )
131{
132 bool ret = true;
133
134 wxList::compatibility_iterator node = m_notifiers.GetFirst();
135 while (node)
136 {
137 wxDataViewListModelNotifier* notifier = (wxDataViewListModelNotifier*) node->GetData();
138 if (!notifier->ValueChanged( col, row ))
139 ret = false;
140 node = node->GetNext();
141 }
142
143 return ret;
144}
145
146bool wxDataViewListModel::RowsReordered( unsigned int *new_order )
147{
148 bool ret = true;
149
150 wxList::compatibility_iterator node = m_notifiers.GetFirst();
151 while (node)
152 {
153 wxDataViewListModelNotifier* notifier = (wxDataViewListModelNotifier*) node->GetData();
154 if (!notifier->RowsReordered( new_order ))
155 ret = false;
156 node = node->GetNext();
157 }
158
159 return ret;
160}
161
162bool wxDataViewListModel::Cleared()
163{
164 bool ret = true;
165
166 wxList::compatibility_iterator node = m_notifiers.GetFirst();
167 while (node)
168 {
169 wxDataViewListModelNotifier* notifier = (wxDataViewListModelNotifier*) node->GetData();
170 if (!notifier->Cleared())
171 ret = false;
172 node = node->GetNext();
173 }
174
175 return ret;
176}
177
178void wxDataViewListModel::AddViewingColumn( wxDataViewColumn *view_column, unsigned int model_column )
179{
180 m_viewingColumns.Append( new wxDataViewViewingColumn( view_column, model_column ) );
181}
182
183void wxDataViewListModel::RemoveViewingColumn( wxDataViewColumn *column )
184{
185 wxList::compatibility_iterator node = m_viewingColumns.GetFirst();
186 while (node)
187 {
188 wxDataViewViewingColumn* tmp = (wxDataViewViewingColumn*) node->GetData();
189
190 if (tmp->m_viewColumn == column)
191 {
192 m_viewingColumns.DeleteObject( tmp );
193 return;
194 }
195
196 node = node->GetNext();
197 }
198}
199
200void wxDataViewListModel::AddNotifier( wxDataViewListModelNotifier *notifier )
201{
202 m_notifiers.Append( notifier );
203 notifier->SetOwner( this );
204}
205
206void wxDataViewListModel::RemoveNotifier( wxDataViewListModelNotifier *notifier )
207{
208 m_notifiers.DeleteObject( notifier );
209}
210
211// ---------------------------------------------------------
212// wxDataViewSortedListModelNotifier
213// ---------------------------------------------------------
214
215class wxDataViewSortedListModelNotifier: public wxDataViewListModelNotifier
216{
217public:
218 wxDataViewSortedListModelNotifier( wxDataViewSortedListModel *model )
219 { m_model = model; }
220
221 virtual bool RowAppended()
222 { return m_model->ChildRowAppended(); }
223
224 virtual bool RowPrepended()
225 { return m_model->ChildRowPrepended(); }
226
227 virtual bool RowInserted( unsigned int before )
228 { return m_model->ChildRowInserted( before ); }
229
230 virtual bool RowDeleted( unsigned int row )
231 { return m_model->ChildRowDeleted( row ); }
232
233 virtual bool RowChanged( unsigned int row )
234 { return m_model->ChildRowChanged( row ); }
235
236 virtual bool ValueChanged( unsigned int col, unsigned int row )
237 { return m_model->ChildValueChanged( col, row); }
238
239 virtual bool RowsReordered( unsigned int *new_order )
240 { return m_model->ChildRowsReordered( new_order ); }
241
242 virtual bool Cleared()
243 { return m_model->ChildCleared(); }
244
245 wxDataViewSortedListModel *m_model;
246};
247
248// ---------------------------------------------------------
249// wxDataViewSortedListModel compare function
250// ---------------------------------------------------------
251
252int wxCALLBACK wxDataViewListModelSortedDefaultCompare
253 (unsigned int row1, unsigned int row2, unsigned int col, wxDataViewListModel* model )
254{
255 wxVariant value1,value2;
256 model->GetValue( value1, col, row1 );
257 model->GetValue( value2, col, row2 );
258 if (value1.GetType() == wxT("string"))
259 {
260 wxString str1 = value1.GetString();
261 wxString str2 = value2.GetString();
262 return str1.Cmp( str2 );
263 }
264 if (value1.GetType() == wxT("long"))
265 {
266 long l1 = value1.GetLong();
267 long l2 = value2.GetLong();
268 return l1-l2;
269 }
270 if (value1.GetType() == wxT("double"))
271 {
272 double d1 = value1.GetDouble();
273 double d2 = value2.GetDouble();
274 if (d1 == d2) return 0;
275 if (d1 < d2) return 1;
276 return -1;
277 }
278 if (value1.GetType() == wxT("datetime"))
279 {
280 wxDateTime dt1 = value1.GetDateTime();
281 wxDateTime dt2 = value2.GetDateTime();
282 if (dt1.IsEqualTo(dt2)) return 0;
283 if (dt1.IsEarlierThan(dt2)) return 1;
284 return -1;
285 }
286
287 return 0;
288}
289
290int wxCALLBACK wxDataViewListModelSortedDefaultCompareDescending
291 (unsigned int row1, unsigned int row2, unsigned int col, wxDataViewListModel* model )
292{
293 return wxDataViewListModelSortedDefaultCompare( row2, row1, col, model );
294}
295
296static wxDataViewListModelCompare s_CmpFunc;
297static wxDataViewListModel *s_CmpModel;
298static unsigned int s_CmpCol;
299
300int LINKAGEMODE wxDataViewIntermediateCmp( unsigned int row1, unsigned int row2 )
301{
302 return s_CmpFunc( row1, row2, s_CmpCol, s_CmpModel );
303}
304
305// ---------------------------------------------------------
306// wxDataViewSortedListModel
307// ---------------------------------------------------------
308
309IMPLEMENT_ABSTRACT_CLASS(wxDataViewSortedListModel, wxDataViewListModel)
310
311wxDataViewSortedListModel::wxDataViewSortedListModel( wxDataViewListModel *child ) :
312 m_array( wxDataViewIntermediateCmp )
313{
314 m_child = child;
315
316 m_ascending = true;
317
318 m_notifierOnChild = new wxDataViewSortedListModelNotifier( this );
319 m_child->AddNotifier( m_notifierOnChild );
320
321 Resort();
322}
323
324wxDataViewSortedListModel::~wxDataViewSortedListModel()
325{
326 m_child->RemoveNotifier( m_notifierOnChild );
327}
328
329// FIXME
330void wxDataViewSortedListModel::InitStatics()
331{
332 s_CmpCol = 0;
333 s_CmpModel = m_child;
334 if (m_ascending)
335 s_CmpFunc = wxDataViewListModelSortedDefaultCompare;
336 else
337 s_CmpFunc = wxDataViewListModelSortedDefaultCompareDescending;
338}
339
340void wxDataViewSortedListModel::Resort()
341{
342 InitStatics();
343
344 m_array.Clear();
345 unsigned int n = m_child->GetNumberOfRows();
346 unsigned int i;
347 for (i = 0; i < n; i++)
348 m_array.Add( i );
349}
350
351#if 0
352static void Dump( wxDataViewListModel *model, unsigned int col )
353{
354 unsigned int n = model->GetNumberOfRows();
355 unsigned int i;
356 for (i = 0; i < n; i++)
357 {
358 wxVariant variant;
359 model->GetValue( variant, col, i );
360 wxString tmp;
361 tmp = variant.GetString();
362 wxPrintf( wxT("%d: %s\n"), (int) i, tmp.c_str() );
363 }
364}
365#endif
366
367bool wxDataViewSortedListModel::ChildRowAppended()
368{
369 // no need to fix up array
370
371 unsigned int len = m_array.GetCount();
372
373 unsigned int pos = m_array.Add( len );
374
375 if (pos == 0)
376 return wxDataViewListModel::RowPrepended();
377
378 if (pos == len)
379 return wxDataViewListModel::RowAppended();
380
381 return wxDataViewListModel::RowInserted( pos );
382}
383
384bool wxDataViewSortedListModel::ChildRowPrepended()
385{
386 // fix up array
387 unsigned int i;
388 unsigned int len = m_array.GetCount();
389 for (i = 0; i < len; i++)
390 {
391 unsigned int value = m_array[i];
392 m_array[i] = value+1;
393 }
394
395 unsigned int pos = m_array.Add( 0 );
396
397 if (pos == 0)
398 return wxDataViewListModel::RowPrepended();
399
400 if (pos == len)
401 return wxDataViewListModel::RowAppended();
402
403 return wxDataViewListModel::RowInserted( pos );
404}
405
406bool wxDataViewSortedListModel::ChildRowInserted( unsigned int before )
407{
408 // fix up array
409 unsigned int i;
410 unsigned int len = m_array.GetCount();
411 for (i = 0; i < len; i++)
412 {
413 unsigned int value = m_array[i];
414 if (value >= before)
415 m_array[i] = value+1;
416 }
417
418 unsigned int pos = m_array.Add( before );
419
420 if (pos == 0)
421 return wxDataViewListModel::RowPrepended();
422
423 if (pos == len)
424 return wxDataViewListModel::RowAppended();
425
426 return wxDataViewListModel::RowInserted( pos );
427}
428
429bool wxDataViewSortedListModel::ChildRowDeleted( unsigned int row )
430{
431 unsigned int i;
432 unsigned int len = m_array.GetCount();
433 int pos = -1;
434 for (i = 0; i < len; i++)
435 {
436 unsigned int value = m_array[i];
437 if (value == row)
438 {
439 // delete later
440 pos = (int) i;
441 }
442 else
443 {
444 // Fix up array
445 if (value > row)
446 m_array[i] = value-1;
447 }
448 }
449
450 if (pos == -1)
451 return false; // we should probably assert
452
453 // remove
454 m_array.RemoveAt( (unsigned int) pos );
455
456 return wxDataViewListModel::RowDeleted( (unsigned int) pos);
457}
458
459bool wxDataViewSortedListModel::ChildRowChanged( unsigned int row )
460{
461 unsigned int i;
462 unsigned int len = m_array.GetCount();
463
464 // Remove and readd sorted. Find out at which
465 // position it was and where it ended.
466 unsigned int start_pos = 0,end_pos = 0;
467 for (i = 0; i < len; i++)
468 if (m_array[i] == row)
469 {
470 start_pos = i;
471 break;
472 }
473 m_array.RemoveAt( start_pos );
474 m_array.Add( row );
475
476 for (i = 0; i < len; i++)
477 if (m_array[i] == row)
478 {
479 end_pos = i;
480 break;
481 }
482
483 if (end_pos == start_pos)
484 return wxDataViewListModel::RowChanged( start_pos );
485
486 // Create an array where order[old] -> new_pos, so that
487 // if nothing changed order[0] -> 0 etc.
488 unsigned int *order = new unsigned int[ len ];
489 // Fill up initial values.
490 for (i = 0; i < len; i++)
491 order[i] = i;
492
493 if (start_pos < end_pos)
494 {
495 for (i = start_pos; i < end_pos; i++)
496 order[i] = order[i+1];
497 order[end_pos] = start_pos;
498 }
499 else
500 {
501 for (i = end_pos; i > start_pos; i--)
502 order[i] = order[i-1];
503 order[start_pos] = end_pos;
504 }
505
506 wxDataViewListModel::RowsReordered( order );
507
508 delete [] order;
509
510 return true;
511}
512
513bool wxDataViewSortedListModel::ChildValueChanged( unsigned int col, unsigned int row )
514{
515 unsigned int i;
516 unsigned int len = m_array.GetCount();
517
518 // Remove and readd sorted. Find out at which
519 // position it was and where it ended.
520 unsigned int start_pos = 0,end_pos = 0;
521 for (i = 0; i < len; i++)
522 if (m_array[i] == row)
523 {
524 start_pos = i;
525 break;
526 }
527 m_array.RemoveAt( start_pos );
528 m_array.Add( row );
529
530 for (i = 0; i < len; i++)
531 if (m_array[i] == row)
532 {
533 end_pos = i;
534 break;
535 }
536
537 if (end_pos == start_pos)
538 return wxDataViewListModel::ValueChanged( col, start_pos );
539
540 // Create an array where order[old] -> new_pos, so that
541 // if nothing changed order[0] -> 0 etc.
542 unsigned int *order = new unsigned int[ len ];
543 // Fill up initial values.
544 for (i = 0; i < len; i++)
545 order[i] = i;
546
547 if (start_pos < end_pos)
548 {
549 for (i = start_pos; i < end_pos; i++)
550 order[i] = order[i+1];
551 order[end_pos] = start_pos;
552 }
553 else
554 {
555 for (i = end_pos; i > start_pos; i--)
556 order[i] = order[i-1];
557 order[start_pos] = end_pos;
558 }
559
560 wxDataViewListModel::RowsReordered( order );
561
562 delete [] order;
563
564 return true;
565}
566
567bool wxDataViewSortedListModel::ChildRowsReordered( unsigned int *WXUNUSED(new_order) )
568{
569 // Nothing needs to be done. If the sort criteria
570 // of this list don't change, the order of the
571 // items of the child list isn't relevant.
572 return true;
573}
574
575bool wxDataViewSortedListModel::ChildCleared()
576{
577 return wxDataViewListModel::Cleared();
578}
579
580unsigned int wxDataViewSortedListModel::GetNumberOfRows()
581{
582 return m_array.GetCount();
583}
584
585unsigned int wxDataViewSortedListModel::GetNumberOfCols()
586{
587 return m_child->GetNumberOfCols();
588}
589
590wxString wxDataViewSortedListModel::GetColType( unsigned int col )
591{
592 return m_child->GetColType( col );
593}
594
595void wxDataViewSortedListModel::GetValue( wxVariant &variant, unsigned int col, unsigned int row )
596{
597 unsigned int child_row = m_array[row];
598 m_child->GetValue( variant, col, child_row );
599}
600
601bool wxDataViewSortedListModel::SetValue( wxVariant &variant, unsigned int col, unsigned int row )
602{
603 unsigned int child_row = m_array[row];
604 bool ret = m_child->SetValue( variant, col, child_row );
605
606 // Do nothing here as the change in the
607 // child model will be reported back.
608
609 return ret;
610}
611
612bool wxDataViewSortedListModel::RowAppended()
613{
614 // you can only append
615 bool ret = m_child->RowAppended();
616
617 // Do nothing here as the change in the
618 // child model will be reported back.
619
620 return ret;
621}
622
623bool wxDataViewSortedListModel::RowPrepended()
624{
625 // you can only append
626 bool ret = m_child->RowAppended();
627
628 // Do nothing here as the change in the
629 // child model will be reported back.
630
631 return ret;
632}
633
634bool wxDataViewSortedListModel::RowInserted( unsigned int WXUNUSED(before) )
635{
636 // you can only append
637 bool ret = m_child->RowAppended();
638
639 // Do nothing here as the change in the
640 // child model will be reported back.
641
642 return ret;
643}
644
645bool wxDataViewSortedListModel::RowDeleted( unsigned int row )
646{
647 unsigned int child_row = m_array[row];
648
649 bool ret = m_child->RowDeleted( child_row );
650
651 // Do nothing here as the change in the
652 // child model will be reported back.
653
654 return ret;
655}
656
657bool wxDataViewSortedListModel::RowChanged( unsigned int row )
658{
659 unsigned int child_row = m_array[row];
660 bool ret = m_child->RowChanged( child_row );
661
662 // Do nothing here as the change in the
663 // child model will be reported back.
664
665 return ret;
666}
667
668bool wxDataViewSortedListModel::ValueChanged( unsigned int col, unsigned int row )
669{
670 unsigned int child_row = m_array[row];
671 bool ret = m_child->ValueChanged( col, child_row );
672
673 // Do nothing here as the change in the
674 // child model will be reported back.
675
676 return ret;
677}
678
679bool wxDataViewSortedListModel::RowsReordered( unsigned int *WXUNUSED(new_order) )
680{
681 // We sort them ourselves.
682
683 return false;
684}
685
686bool wxDataViewSortedListModel::Cleared()
687{
688 bool ret = m_child->Cleared();
689
690 // Do nothing here as the change in the
691 // child model will be reported back.
692
693 return ret;
694}
695
696// ---------------------------------------------------------
697// wxDataViewRendererBase
698// ---------------------------------------------------------
699
700IMPLEMENT_ABSTRACT_CLASS(wxDataViewRendererBase, wxObject)
701
702wxDataViewRendererBase::wxDataViewRendererBase( const wxString &varianttype, wxDataViewCellMode mode )
703{
704 m_variantType = varianttype;
705 m_mode = mode;
706}
707
708// ---------------------------------------------------------
709// wxDataViewColumnBase
710// ---------------------------------------------------------
711
712IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumnBase, wxObject)
713
714wxDataViewColumnBase::wxDataViewColumnBase(const wxString& title,
715 wxDataViewRenderer *renderer,
716 unsigned int model_column,
717 int WXUNUSED(width),
718 int flags )
719{
720 m_renderer = renderer;
721 m_model_column = model_column;
722 m_flags = flags;
723 m_title = title;
724 m_owner = NULL;
725 m_renderer->SetOwner( (wxDataViewColumn*) this );
726}
727
728wxDataViewColumnBase::wxDataViewColumnBase(const wxBitmap& bitmap,
729 wxDataViewRenderer *renderer,
730 unsigned int model_column,
731 int WXUNUSED(width),
732 int flags )
733{
734 m_renderer = renderer;
735 m_model_column = model_column;
736 m_flags = flags;
737 m_bitmap = bitmap;
738 m_owner = NULL;
739 m_renderer->SetOwner( (wxDataViewColumn*) this );
740}
741
742wxDataViewColumnBase::~wxDataViewColumnBase()
743{
744 if (m_renderer)
745 delete m_renderer;
746
747 if (GetOwner())
748 {
749 GetOwner()->GetModel()->RemoveViewingColumn( (wxDataViewColumn*) this );
750 }
751}
752
753void wxDataViewColumnBase::SetTitle( const wxString &title )
754{
755 m_title = title;
756}
757
758wxString wxDataViewColumnBase::GetTitle()
759{
760 return m_title;
761}
762
763void wxDataViewColumnBase::SetBitmap( const wxBitmap &bitmap )
764{
765 m_bitmap = bitmap;
766}
767
768const wxBitmap &wxDataViewColumnBase::GetBitmap()
769{
770 return m_bitmap;
771}
772
773// ---------------------------------------------------------
774// wxDataViewCtrlBase
775// ---------------------------------------------------------
776
777IMPLEMENT_ABSTRACT_CLASS(wxDataViewCtrlBase, wxControl)
778
779wxDataViewCtrlBase::wxDataViewCtrlBase()
780{
781 m_model = NULL;
782 m_cols.DeleteContents( true );
783}
784
785wxDataViewCtrlBase::~wxDataViewCtrlBase()
786{
787}
788
789bool wxDataViewCtrlBase::AssociateModel( wxDataViewListModel *model )
790{
791 m_model = model;
792
793 return true;
794}
795
796wxDataViewListModel* wxDataViewCtrlBase::GetModel()
797{
798 return m_model;
799}
800
801bool wxDataViewCtrlBase::AppendTextColumn( const wxString &label, unsigned int model_column,
802 wxDataViewCellMode mode, int width )
803{
804 return AppendColumn( new wxDataViewColumn( label,
805 new wxDataViewTextRenderer( wxT("string"), mode ), model_column, width ) );
806}
807
808bool wxDataViewCtrlBase::AppendToggleColumn( const wxString &label, unsigned int model_column,
809 wxDataViewCellMode mode, int width )
810{
811 return AppendColumn( new wxDataViewColumn( label,
812 new wxDataViewToggleRenderer( wxT("bool"), mode ), model_column, width ) );
813}
814
815bool wxDataViewCtrlBase::AppendProgressColumn( const wxString &label, unsigned int model_column,
816 wxDataViewCellMode mode, int width )
817{
818 return AppendColumn( new wxDataViewColumn( label,
819 new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode ), model_column, width ) );
820}
821
822bool wxDataViewCtrlBase::AppendDateColumn( const wxString &label, unsigned int model_column,
823 wxDataViewCellMode mode, int width )
824{
825 return AppendColumn( new wxDataViewColumn( label,
826 new wxDataViewDateRenderer( wxT("datetime"), mode), model_column, width ) );
827}
828
829bool wxDataViewCtrlBase::AppendBitmapColumn( const wxString &label, unsigned int model_column,
830 wxDataViewCellMode mode, int width )
831{
832 return AppendColumn( new wxDataViewColumn( label,
833 new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode ), model_column, width ) );
834}
835
836bool wxDataViewCtrlBase::AppendTextColumn( const wxBitmap &label, unsigned int model_column,
837 wxDataViewCellMode mode, int width )
838{
839 return AppendColumn( new wxDataViewColumn( label,
840 new wxDataViewTextRenderer( wxT("string"), mode ), model_column, width ) );
841}
842
843bool wxDataViewCtrlBase::AppendToggleColumn( const wxBitmap &label, unsigned int model_column,
844 wxDataViewCellMode mode, int width )
845{
846 return AppendColumn( new wxDataViewColumn( label,
847 new wxDataViewToggleRenderer( wxT("bool"), mode ), model_column, width ) );
848}
849
850bool wxDataViewCtrlBase::AppendProgressColumn( const wxBitmap &label, unsigned int model_column,
851 wxDataViewCellMode mode, int width )
852{
853 return AppendColumn( new wxDataViewColumn( label,
854 new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode ), model_column, width ) );
855}
856
857bool wxDataViewCtrlBase::AppendDateColumn( const wxBitmap &label, unsigned int model_column,
858 wxDataViewCellMode mode, int width )
859{
860 return AppendColumn( new wxDataViewColumn( label,
861 new wxDataViewDateRenderer( wxT("datetime"), mode ), model_column, width ) );
862}
863
864bool wxDataViewCtrlBase::AppendBitmapColumn( const wxBitmap &label, unsigned int model_column,
865 wxDataViewCellMode mode, int width )
866{
867 return AppendColumn( new wxDataViewColumn( label,
868 new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode ), model_column, width ) );
869}
870
871bool wxDataViewCtrlBase::AppendColumn( wxDataViewColumn *col )
872{
873 m_cols.Append( (wxObject*) col );
874 col->SetOwner( (wxDataViewCtrl*) this );
875 m_model->AddViewingColumn( col, col->GetModelColumn() );
876 return true;
877}
878
879unsigned int wxDataViewCtrlBase::GetNumberOfColumns()
880{
881 return m_cols.GetCount();
882}
883
884bool wxDataViewCtrlBase::DeleteColumn( unsigned int WXUNUSED(pos) )
885{
886 return false;
887}
888
889bool wxDataViewCtrlBase::ClearColumns()
890{
891 return false;
892}
893
894wxDataViewColumn* wxDataViewCtrlBase::GetColumn( unsigned int pos )
895{
896 return (wxDataViewColumn*) m_cols[ pos ];
897}
898
899// ---------------------------------------------------------
900// wxDataViewEvent
901// ---------------------------------------------------------
902
903IMPLEMENT_DYNAMIC_CLASS(wxDataViewEvent,wxNotifyEvent)
904
905DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ROW_SELECTED)
906DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ROW_ACTIVATED)
907DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK)
908DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK)
909
910
911#endif