1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/common/datavcmn.cpp
3 // Purpose: wxDataViewCtrl base classes and common parts
4 // Author: Robert Roebling
7 // Copyright: (c) 2006, Robert Roebling
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
11 // For compilers that support precompilation, includes "wx.h".
12 #include "wx/wxprec.h"
18 #if wxUSE_DATAVIEWCTRL
20 #include "wx/dataview.h"
26 const wxChar wxDataViewCtrlNameStr
[] = wxT("dataviewCtrl");
29 // ---------------------------------------------------------
30 // wxDataViewListModel
31 // ---------------------------------------------------------
33 wxDataViewListModel::wxDataViewListModel()
35 m_notifiers
.DeleteContents( true );
38 wxDataViewListModel::~wxDataViewListModel()
42 bool wxDataViewListModel::RowAppended()
46 wxList::compatibility_iterator node
= m_notifiers
.GetFirst();
49 wxDataViewListModelNotifier
* notifier
= (wxDataViewListModelNotifier
*) node
->GetData();
50 if (!notifier
->RowAppended())
52 node
= node
->GetNext();
58 bool wxDataViewListModel::RowPrepended()
62 wxList::compatibility_iterator node
= m_notifiers
.GetFirst();
65 wxDataViewListModelNotifier
* notifier
= (wxDataViewListModelNotifier
*) node
->GetData();
66 if (!notifier
->RowPrepended())
68 node
= node
->GetNext();
74 bool wxDataViewListModel::RowInserted( unsigned int before
)
78 wxList::compatibility_iterator node
= m_notifiers
.GetFirst();
81 wxDataViewListModelNotifier
* notifier
= (wxDataViewListModelNotifier
*) node
->GetData();
82 if (!notifier
->RowInserted(before
))
84 node
= node
->GetNext();
90 bool wxDataViewListModel::RowDeleted( unsigned int row
)
94 wxList::compatibility_iterator node
= m_notifiers
.GetFirst();
97 wxDataViewListModelNotifier
* notifier
= (wxDataViewListModelNotifier
*) node
->GetData();
98 if (!notifier
->RowDeleted( row
))
100 node
= node
->GetNext();
106 bool wxDataViewListModel::RowChanged( unsigned int row
)
110 wxList::compatibility_iterator node
= m_notifiers
.GetFirst();
113 wxDataViewListModelNotifier
* notifier
= (wxDataViewListModelNotifier
*) node
->GetData();
114 if (!notifier
->RowChanged( row
))
116 node
= node
->GetNext();
122 bool wxDataViewListModel::ValueChanged( unsigned int col
, unsigned int row
)
126 wxList::compatibility_iterator node
= m_notifiers
.GetFirst();
129 wxDataViewListModelNotifier
* notifier
= (wxDataViewListModelNotifier
*) node
->GetData();
130 if (!notifier
->ValueChanged( col
, row
))
132 node
= node
->GetNext();
138 bool wxDataViewListModel::RowsReordered( unsigned int *new_order
)
142 wxList::compatibility_iterator node
= m_notifiers
.GetFirst();
145 wxDataViewListModelNotifier
* notifier
= (wxDataViewListModelNotifier
*) node
->GetData();
146 if (!notifier
->RowsReordered( new_order
))
148 node
= node
->GetNext();
154 bool wxDataViewListModel::Cleared()
158 wxList::compatibility_iterator node
= m_notifiers
.GetFirst();
161 wxDataViewListModelNotifier
* notifier
= (wxDataViewListModelNotifier
*) node
->GetData();
162 if (!notifier
->Cleared())
164 node
= node
->GetNext();
170 void wxDataViewListModel::AddNotifier( wxDataViewListModelNotifier
*notifier
)
172 m_notifiers
.Append( notifier
);
173 notifier
->SetOwner( this );
176 void wxDataViewListModel::RemoveNotifier( wxDataViewListModelNotifier
*notifier
)
178 m_notifiers
.DeleteObject( notifier
);
181 // ---------------------------------------------------------
182 // wxDataViewSortedListModelNotifier
183 // ---------------------------------------------------------
185 class wxDataViewSortedListModelNotifier
: public wxDataViewListModelNotifier
188 wxDataViewSortedListModelNotifier( wxDataViewSortedListModel
*model
)
191 ~wxDataViewSortedListModelNotifier()
192 { m_model
->DetachChild(); }
194 virtual bool RowAppended()
195 { return m_model
->ChildRowAppended(); }
197 virtual bool RowPrepended()
198 { return m_model
->ChildRowPrepended(); }
200 virtual bool RowInserted( unsigned int before
)
201 { return m_model
->ChildRowInserted( before
); }
203 virtual bool RowDeleted( unsigned int row
)
204 { return m_model
->ChildRowDeleted( row
); }
206 virtual bool RowChanged( unsigned int row
)
207 { return m_model
->ChildRowChanged( row
); }
209 virtual bool ValueChanged( unsigned int col
, unsigned int row
)
210 { return m_model
->ChildValueChanged( col
, row
); }
212 virtual bool RowsReordered( unsigned int *new_order
)
213 { return m_model
->ChildRowsReordered( new_order
); }
215 virtual bool Cleared()
216 { return m_model
->ChildCleared(); }
218 wxDataViewSortedListModel
*m_model
;
221 // ---------------------------------------------------------
222 // wxDataViewSortedListModel compare function
223 // ---------------------------------------------------------
225 int wxCALLBACK wxDataViewListModelSortedDefaultCompare
226 (unsigned int row1
, unsigned int row2
, unsigned int col
, wxDataViewListModel
* model
)
228 wxVariant value1
,value2
;
229 model
->GetValue( value1
, col
, row1
);
230 model
->GetValue( value2
, col
, row2
);
231 if (value1
.GetType() == wxT("string"))
233 wxString str1
= value1
.GetString();
234 wxString str2
= value2
.GetString();
235 return str1
.Cmp( str2
);
237 if (value1
.GetType() == wxT("long"))
239 long l1
= value1
.GetLong();
240 long l2
= value2
.GetLong();
243 if (value1
.GetType() == wxT("double"))
245 double d1
= value1
.GetDouble();
246 double d2
= value2
.GetDouble();
247 if (d1
== d2
) return 0;
248 if (d1
< d2
) return 1;
251 if (value1
.GetType() == wxT("datetime"))
253 wxDateTime dt1
= value1
.GetDateTime();
254 wxDateTime dt2
= value2
.GetDateTime();
255 if (dt1
.IsEqualTo(dt2
)) return 0;
256 if (dt1
.IsEarlierThan(dt2
)) return 1;
263 int wxCALLBACK wxDataViewListModelSortedDefaultCompareDescending
264 (unsigned int row1
, unsigned int row2
, unsigned int col
, wxDataViewListModel
* model
)
266 return wxDataViewListModelSortedDefaultCompare( row2
, row1
, col
, model
);
269 static wxDataViewListModelCompare s_CmpFunc
;
270 static wxDataViewListModel
*s_CmpModel
;
271 static unsigned int s_CmpCol
;
273 int LINKAGEMODE
wxDataViewIntermediateCmp( unsigned int row1
, unsigned int row2
)
275 return s_CmpFunc( row1
, row2
, s_CmpCol
, s_CmpModel
);
278 // ---------------------------------------------------------
279 // wxDataViewSortedListModel
280 // ---------------------------------------------------------
282 wxDataViewSortedListModel::wxDataViewSortedListModel( wxDataViewListModel
*child
) :
283 m_array( wxDataViewIntermediateCmp
)
289 m_notifierOnChild
= new wxDataViewSortedListModelNotifier( this );
290 m_child
->AddNotifier( m_notifierOnChild
);
295 wxDataViewSortedListModel::~wxDataViewSortedListModel()
298 m_child
->RemoveNotifier( m_notifierOnChild
);
301 void wxDataViewSortedListModel::DetachChild()
307 void wxDataViewSortedListModel::InitStatics()
310 s_CmpModel
= m_child
;
312 s_CmpFunc
= wxDataViewListModelSortedDefaultCompare
;
314 s_CmpFunc
= wxDataViewListModelSortedDefaultCompareDescending
;
317 void wxDataViewSortedListModel::Resort()
322 unsigned int n
= m_child
->GetRowCount();
324 for (i
= 0; i
< n
; i
++)
327 // do we need the neworder?
328 wxDataViewListModel::RowsReordered( NULL
);
332 static void Dump( wxDataViewListModel
*model
, unsigned int col
)
334 unsigned int n
= model
->GetRowCount();
336 for (i
= 0; i
< n
; i
++)
339 model
->GetValue( variant
, col
, i
);
341 tmp
= variant
.GetString();
342 wxPrintf( wxT("%d: %s\n"), (int) i
, tmp
.c_str() );
347 bool wxDataViewSortedListModel::ChildRowAppended()
349 // no need to fix up array
351 unsigned int len
= m_array
.GetCount();
353 unsigned int pos
= m_array
.Add( len
);
356 return wxDataViewListModel::RowPrepended();
359 return wxDataViewListModel::RowAppended();
361 return wxDataViewListModel::RowInserted( pos
);
364 bool wxDataViewSortedListModel::ChildRowPrepended()
368 unsigned int len
= m_array
.GetCount();
369 for (i
= 0; i
< len
; i
++)
371 unsigned int value
= m_array
[i
];
372 m_array
[i
] = value
+1;
375 unsigned int pos
= m_array
.Add( 0 );
378 return wxDataViewListModel::RowPrepended();
381 return wxDataViewListModel::RowAppended();
383 return wxDataViewListModel::RowInserted( pos
);
386 bool wxDataViewSortedListModel::ChildRowInserted( unsigned int before
)
390 unsigned int len
= m_array
.GetCount();
391 for (i
= 0; i
< len
; i
++)
393 unsigned int value
= m_array
[i
];
395 m_array
[i
] = value
+1;
398 unsigned int pos
= m_array
.Add( before
);
401 return wxDataViewListModel::RowPrepended();
404 return wxDataViewListModel::RowAppended();
406 return wxDataViewListModel::RowInserted( pos
);
409 bool wxDataViewSortedListModel::ChildRowDeleted( unsigned int row
)
412 unsigned int len
= m_array
.GetCount();
414 for (i
= 0; i
< len
; i
++)
416 unsigned int value
= m_array
[i
];
426 m_array
[i
] = value
-1;
431 return false; // we should probably assert
434 m_array
.RemoveAt( (unsigned int) pos
);
436 return wxDataViewListModel::RowDeleted( (unsigned int) pos
);
439 bool wxDataViewSortedListModel::ChildRowChanged( unsigned int row
)
442 unsigned int len
= m_array
.GetCount();
444 // Remove and readd sorted. Find out at which
445 // position it was and where it ended.
446 unsigned int start_pos
= 0,end_pos
= 0;
447 for (i
= 0; i
< len
; i
++)
448 if (m_array
[i
] == row
)
453 m_array
.RemoveAt( start_pos
);
456 for (i
= 0; i
< len
; i
++)
457 if (m_array
[i
] == row
)
463 if (end_pos
== start_pos
)
464 return wxDataViewListModel::RowChanged( start_pos
);
466 // Create an array where order[old] -> new_pos, so that
467 // if nothing changed order[0] -> 0 etc.
468 unsigned int *order
= new unsigned int[ len
];
469 // Fill up initial values.
470 for (i
= 0; i
< len
; i
++)
473 if (start_pos
< end_pos
)
475 for (i
= start_pos
; i
< end_pos
; i
++)
476 order
[i
] = order
[i
+1];
477 order
[end_pos
] = start_pos
;
481 for (i
= end_pos
; i
> start_pos
; i
--)
482 order
[i
] = order
[i
-1];
483 order
[start_pos
] = end_pos
;
486 wxDataViewListModel::RowsReordered( order
);
493 bool wxDataViewSortedListModel::ChildValueChanged( unsigned int col
, unsigned int row
)
496 unsigned int len
= m_array
.GetCount();
498 // Remove and readd sorted. Find out at which
499 // position it was and where it ended.
500 unsigned int start_pos
= 0,end_pos
= 0;
501 for (i
= 0; i
< len
; i
++)
502 if (m_array
[i
] == row
)
507 m_array
.RemoveAt( start_pos
);
510 for (i
= 0; i
< len
; i
++)
511 if (m_array
[i
] == row
)
517 if (end_pos
== start_pos
)
518 return wxDataViewListModel::ValueChanged( col
, start_pos
);
520 // Create an array where order[old] -> new_pos, so that
521 // if nothing changed order[0] -> 0 etc.
522 unsigned int *order
= new unsigned int[ len
];
523 // Fill up initial values.
524 for (i
= 0; i
< len
; i
++)
527 if (start_pos
< end_pos
)
529 for (i
= start_pos
; i
< end_pos
; i
++)
530 order
[i
] = order
[i
+1];
531 order
[end_pos
] = start_pos
;
535 for (i
= end_pos
; i
> start_pos
; i
--)
536 order
[i
] = order
[i
-1];
537 order
[start_pos
] = end_pos
;
540 wxDataViewListModel::RowsReordered( order
);
547 bool wxDataViewSortedListModel::ChildRowsReordered( unsigned int *WXUNUSED(new_order
) )
549 // Nothing needs to be done. If the sort criteria
550 // of this list don't change, the order of the
551 // items of the child list isn't relevant.
555 bool wxDataViewSortedListModel::ChildCleared()
557 return wxDataViewListModel::Cleared();
560 unsigned int wxDataViewSortedListModel::GetRowCount() const
562 return m_array
.GetCount();
565 unsigned int wxDataViewSortedListModel::GetColumnCount() const
567 return m_child
->GetColumnCount();
570 wxString
wxDataViewSortedListModel::GetColumnType( unsigned int col
) const
572 return m_child
->GetColumnType( col
);
575 void wxDataViewSortedListModel::GetValue( wxVariant
&variant
, unsigned int col
, unsigned int row
) const
577 unsigned int child_row
= m_array
[row
];
578 m_child
->GetValue( variant
, col
, child_row
);
581 bool wxDataViewSortedListModel::SetValue( const wxVariant
&variant
, unsigned int col
, unsigned int row
)
583 unsigned int child_row
= m_array
[row
];
584 bool ret
= m_child
->SetValue( variant
, col
, child_row
);
586 // Do nothing here as the change in the
587 // child model will be reported back.
592 bool wxDataViewSortedListModel::RowAppended()
594 // you can only append
595 bool ret
= m_child
->RowAppended();
597 // Do nothing here as the change in the
598 // child model will be reported back.
603 bool wxDataViewSortedListModel::RowPrepended()
605 // you can only append
606 bool ret
= m_child
->RowAppended();
608 // Do nothing here as the change in the
609 // child model will be reported back.
614 bool wxDataViewSortedListModel::RowInserted( unsigned int WXUNUSED(before
) )
616 // you can only append
617 bool ret
= m_child
->RowAppended();
619 // Do nothing here as the change in the
620 // child model will be reported back.
625 bool wxDataViewSortedListModel::RowDeleted( unsigned int row
)
627 unsigned int child_row
= m_array
[row
];
629 bool ret
= m_child
->RowDeleted( child_row
);
631 // Do nothing here as the change in the
632 // child model will be reported back.
637 bool wxDataViewSortedListModel::RowChanged( unsigned int row
)
639 unsigned int child_row
= m_array
[row
];
640 bool ret
= m_child
->RowChanged( child_row
);
642 // Do nothing here as the change in the
643 // child model will be reported back.
648 bool wxDataViewSortedListModel::ValueChanged( unsigned int col
, unsigned int row
)
650 unsigned int child_row
= m_array
[row
];
651 bool ret
= m_child
->ValueChanged( col
, child_row
);
653 // Do nothing here as the change in the
654 // child model will be reported back.
659 bool wxDataViewSortedListModel::RowsReordered( unsigned int *WXUNUSED(new_order
) )
661 // We sort them ourselves.
666 bool wxDataViewSortedListModel::Cleared()
668 bool ret
= m_child
->Cleared();
670 // Do nothing here as the change in the
671 // child model will be reported back.
676 // ---------------------------------------------------------
677 // wxDataViewRendererBase
678 // ---------------------------------------------------------
680 IMPLEMENT_ABSTRACT_CLASS(wxDataViewRendererBase
, wxObject
)
682 wxDataViewRendererBase::wxDataViewRendererBase( const wxString
&varianttype
,
683 wxDataViewCellMode
WXUNUSED(mode
),
684 int WXUNUSED(align
) )
686 m_variantType
= varianttype
;
688 m_row
= (unsigned int) -1;
691 const wxDataViewCtrl
* wxDataViewRendererBase::GetView() const
693 return wx_const_cast(wxDataViewRendererBase
*, this)->GetOwner()->GetOwner();
696 bool wxDataViewRendererBase::StartEditing( unsigned int row
, wxRect labelRect
)
698 m_row
= row
; // remember for later
700 unsigned int col
= GetOwner()->GetModelColumn();
702 GetOwner()->GetOwner()->GetModel()->GetValue( value
, col
, row
);
704 m_editorCtrl
= CreateEditorCtrl( GetOwner()->GetOwner()->GetMainWindow(), labelRect
, value
);
706 wxDataViewEditorCtrlEvtHandler
*handler
=
707 new wxDataViewEditorCtrlEvtHandler( m_editorCtrl
, (wxDataViewRenderer
*) this );
709 m_editorCtrl
->PushEventHandler( handler
);
711 #if defined(__WXGTK20__) && !defined(wxUSE_GENERICDATAVIEWCTRL)
712 handler
->SetFocusOnIdle();
714 m_editorCtrl
->SetFocus();
720 void wxDataViewRendererBase::CancelEditing()
722 wxPendingDelete
.Append( m_editorCtrl
);
724 GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
726 // m_editorCtrl->PopEventHandler( true );
729 bool wxDataViewRendererBase::FinishEditing()
732 GetValueFromEditorCtrl( m_editorCtrl
, value
);
734 wxPendingDelete
.Append( m_editorCtrl
);
736 GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
738 if (!Validate(value
))
741 unsigned int col
= GetOwner()->GetModelColumn();
742 GetOwner()->GetOwner()->GetModel()->SetValue( value
, col
, m_row
);
743 GetOwner()->GetOwner()->GetModel()->ValueChanged( col
, m_row
);
745 // m_editorCtrl->PopEventHandler( true );
750 //-----------------------------------------------------------------------------
751 // wxDataViewEditorCtrlEvtHandler
752 //-----------------------------------------------------------------------------
754 BEGIN_EVENT_TABLE(wxDataViewEditorCtrlEvtHandler
, wxEvtHandler
)
755 EVT_CHAR (wxDataViewEditorCtrlEvtHandler::OnChar
)
756 EVT_KILL_FOCUS (wxDataViewEditorCtrlEvtHandler::OnKillFocus
)
757 EVT_IDLE (wxDataViewEditorCtrlEvtHandler::OnIdle
)
760 wxDataViewEditorCtrlEvtHandler::wxDataViewEditorCtrlEvtHandler(
761 wxControl
*editorCtrl
,
762 wxDataViewRenderer
*owner
)
765 m_editorCtrl
= editorCtrl
;
770 void wxDataViewEditorCtrlEvtHandler::OnIdle( wxIdleEvent
&event
)
774 m_focusOnIdle
= false;
775 if (wxWindow::FindFocus() != m_editorCtrl
)
776 m_editorCtrl
->SetFocus();
782 void wxDataViewEditorCtrlEvtHandler::OnChar( wxKeyEvent
&event
)
784 switch ( event
.m_keyCode
)
788 m_owner
->FinishEditing();
793 m_owner
->CancelEditing();
801 void wxDataViewEditorCtrlEvtHandler::OnKillFocus( wxFocusEvent
&event
)
806 m_owner
->FinishEditing();
812 // ---------------------------------------------------------
813 // wxDataViewColumnBase
814 // ---------------------------------------------------------
816 IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumnBase
, wxObject
)
818 wxDataViewColumnBase::wxDataViewColumnBase(const wxString
& WXUNUSED(title
),
819 wxDataViewRenderer
*renderer
,
820 unsigned int model_column
,
822 wxAlignment
WXUNUSED(align
),
825 m_renderer
= renderer
;
826 m_model_column
= model_column
;
828 m_renderer
->SetOwner( (wxDataViewColumn
*) this );
830 // NOTE: the wxDataViewColumn's ctor must store the width, align, flags
831 // parameters inside the native control!
834 wxDataViewColumnBase::wxDataViewColumnBase(const wxBitmap
& bitmap
,
835 wxDataViewRenderer
*renderer
,
836 unsigned int model_column
,
838 wxAlignment
WXUNUSED(align
),
839 int WXUNUSED(flags
) )
841 m_renderer
= renderer
;
842 m_model_column
= model_column
;
845 m_renderer
->SetOwner( (wxDataViewColumn
*) this );
848 wxDataViewColumnBase::~wxDataViewColumnBase()
854 int wxDataViewColumnBase::GetFlags() const
859 ret
|= wxDATAVIEW_COL_SORTABLE
;
861 ret
|= wxDATAVIEW_COL_RESIZABLE
;
863 ret
|= wxDATAVIEW_COL_HIDDEN
;
868 void wxDataViewColumnBase::SetFlags(int flags
)
870 SetSortable((flags
& wxDATAVIEW_COL_SORTABLE
) != 0);
871 SetResizeable((flags
& wxDATAVIEW_COL_RESIZABLE
) != 0);
872 SetHidden((flags
& wxDATAVIEW_COL_HIDDEN
) != 0);
875 // ---------------------------------------------------------
876 // wxDataViewEventListModelNotifier
877 // ---------------------------------------------------------
879 class WXDLLIMPEXP_ADV wxDataViewEventListModelNotifier
: public wxDataViewListModelNotifier
882 wxDataViewEventListModelNotifier( wxDataViewCtrl
*ctrl
) { m_ctrl
= ctrl
; }
884 bool SendEvent( wxEventType event_type
, unsigned int row
= 0, unsigned int col
= 0 )
886 wxDataViewEvent
event( event_type
, m_ctrl
->GetId() );
887 event
.SetEventObject( m_ctrl
);
888 event
.SetModel( m_ctrl
->GetModel() );
890 event
.SetColumn( col
);
891 m_ctrl
->GetEventHandler()->ProcessEvent( event
);
895 virtual bool RowAppended() { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ROW_APPENDED
); }
896 virtual bool RowPrepended() { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ROW_PREPENDED
); }
897 virtual bool RowInserted( unsigned int before
)
898 { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ROW_INSERTED
, before
); }
899 virtual bool RowDeleted( unsigned int row
)
900 { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ROW_DELETED
, row
); }
901 virtual bool RowChanged( unsigned int row
)
902 { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ROW_CHANGED
, row
); }
903 virtual bool ValueChanged( unsigned int col
, unsigned int row
)
904 { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_VALUE_CHANGED
, row
, col
); }
905 virtual bool RowsReordered( unsigned int *new_order
)
906 { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ROWS_REORDERED
); }
907 virtual bool Cleared() { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_CLEARED
); }
910 wxDataViewCtrl
*m_ctrl
;
914 // ---------------------------------------------------------
915 // wxDataViewCtrlBase
916 // ---------------------------------------------------------
918 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCtrlBase
, wxControl
)
920 wxDataViewCtrlBase::wxDataViewCtrlBase()
923 m_cols
.DeleteContents( true );
924 m_eventNotifier
= NULL
;
927 wxDataViewCtrlBase::~wxDataViewCtrlBase()
929 // IMPORTANT: before calling DecRef() on our model (since it may
930 // result in a free() call), erase all columns (since
931 // they hold a pointer to our model)
937 m_model
->RemoveNotifier( m_eventNotifier
);
938 m_eventNotifier
= NULL
;
945 bool wxDataViewCtrlBase::AssociateModel( wxDataViewListModel
*model
)
950 m_model
->RemoveNotifier( m_eventNotifier
);
951 m_eventNotifier
= NULL
;
953 m_model
->DecRef(); // discard old model, if any
956 // add our own reference to the new model:
961 m_eventNotifier
= new wxDataViewEventListModelNotifier( (wxDataViewCtrl
*) this );
962 m_model
->AddNotifier( m_eventNotifier
);
968 wxDataViewListModel
* wxDataViewCtrlBase::GetModel()
973 bool wxDataViewCtrlBase::AppendTextColumn( const wxString
&label
, unsigned int model_column
,
974 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
976 return AppendColumn( new wxDataViewColumn( label
,
977 new wxDataViewTextRenderer( wxT("string"), mode
, (int)align
),
978 model_column
, width
, align
, flags
) );
981 bool wxDataViewCtrlBase::AppendToggleColumn( const wxString
&label
, unsigned int model_column
,
982 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
984 return AppendColumn( new wxDataViewColumn( label
,
985 new wxDataViewToggleRenderer( wxT("bool"), mode
, (int)align
),
986 model_column
, width
, align
, flags
) );
989 bool wxDataViewCtrlBase::AppendProgressColumn( const wxString
&label
, unsigned int model_column
,
990 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
992 return AppendColumn( new wxDataViewColumn( label
,
993 new wxDataViewProgressRenderer( wxEmptyString
, wxT("long"), mode
, (int)align
),
994 model_column
, width
, align
, flags
) );
997 bool wxDataViewCtrlBase::AppendDateColumn( const wxString
&label
, unsigned int model_column
,
998 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1000 return AppendColumn( new wxDataViewColumn( label
,
1001 new wxDataViewDateRenderer( wxT("datetime"), mode
, (int)align
),
1002 model_column
, width
, align
, flags
) );
1005 bool wxDataViewCtrlBase::AppendBitmapColumn( const wxString
&label
, unsigned int model_column
,
1006 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1008 return AppendColumn( new wxDataViewColumn( label
,
1009 new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode
, (int)align
),
1010 model_column
, width
, align
, flags
) );
1013 bool wxDataViewCtrlBase::AppendTextColumn( const wxBitmap
&label
, unsigned int model_column
,
1014 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1016 return AppendColumn( new wxDataViewColumn( label
,
1017 new wxDataViewTextRenderer( wxT("string"), mode
, (int)align
),
1018 model_column
, width
, align
, flags
) );
1021 bool wxDataViewCtrlBase::AppendToggleColumn( const wxBitmap
&label
, unsigned int model_column
,
1022 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1024 return AppendColumn( new wxDataViewColumn( label
,
1025 new wxDataViewToggleRenderer( wxT("bool"), mode
, (int)align
),
1026 model_column
, width
, align
, flags
) );
1029 bool wxDataViewCtrlBase::AppendProgressColumn( const wxBitmap
&label
, unsigned int model_column
,
1030 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1032 return AppendColumn( new wxDataViewColumn( label
,
1033 new wxDataViewProgressRenderer( wxEmptyString
, wxT("long"), mode
, (int)align
),
1034 model_column
, width
, align
, flags
) );
1037 bool wxDataViewCtrlBase::AppendDateColumn( const wxBitmap
&label
, unsigned int model_column
,
1038 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1040 return AppendColumn( new wxDataViewColumn( label
,
1041 new wxDataViewDateRenderer( wxT("datetime"), mode
, (int)align
),
1042 model_column
, width
, align
, flags
) );
1045 bool wxDataViewCtrlBase::AppendBitmapColumn( const wxBitmap
&label
, unsigned int model_column
,
1046 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1048 return AppendColumn( new wxDataViewColumn( label
,
1049 new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode
, (int)align
),
1050 model_column
, width
, align
, flags
) );
1053 bool wxDataViewCtrlBase::AppendColumn( wxDataViewColumn
*col
)
1055 m_cols
.Append( (wxObject
*) col
);
1056 col
->SetOwner( (wxDataViewCtrl
*) this );
1060 unsigned int wxDataViewCtrlBase::GetColumnCount() const
1062 return m_cols
.GetCount();
1065 bool wxDataViewCtrlBase::DeleteColumn( unsigned int WXUNUSED(pos
) )
1070 bool wxDataViewCtrlBase::ClearColumns()
1075 wxDataViewColumn
* wxDataViewCtrlBase::GetColumn( unsigned int pos
)
1077 return (wxDataViewColumn
*) m_cols
[ pos
];
1080 // ---------------------------------------------------------
1082 // ---------------------------------------------------------
1084 IMPLEMENT_DYNAMIC_CLASS(wxDataViewEvent
,wxNotifyEvent
)
1086 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ROW_SELECTED
)
1087 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ROW_ACTIVATED
)
1088 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK
)
1089 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK
)
1091 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ROW_APPENDED
)
1092 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ROW_PREPENDED
)
1093 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ROW_INSERTED
)
1094 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ROW_DELETED
)
1095 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ROW_CHANGED
)
1096 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_VALUE_CHANGED
)
1097 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ROWS_REORDERED
)
1098 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_CLEARED
)