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"
20 #if wxUSE_DATAVIEWCTRL
22 #include "wx/object.h"
23 #include "wx/dataview.h"
27 // ---------------------------------------------------------
29 // ---------------------------------------------------------
31 IMPLEMENT_ABSTRACT_CLASS(wxDataViewModel
, wxObject
)
33 // ---------------------------------------------------------
34 // wxDataViewListModel
35 // ---------------------------------------------------------
37 IMPLEMENT_ABSTRACT_CLASS(wxDataViewListModel
, wxDataViewModel
)
39 wxDataViewListModel::wxDataViewListModel()
41 m_viewingColumns
.DeleteContents( true );
42 m_notifiers
.DeleteContents( true );
45 wxDataViewListModel::~wxDataViewListModel()
49 bool wxDataViewListModel::RowAppended()
53 wxNode
*node
= m_notifiers
.GetFirst();
56 wxDataViewListModelNotifier
* notifier
= (wxDataViewListModelNotifier
*) node
->GetData();
57 if (!notifier
->RowAppended())
59 node
= node
->GetNext();
65 bool wxDataViewListModel::RowPrepended()
69 wxNode
*node
= m_notifiers
.GetFirst();
72 wxDataViewListModelNotifier
* notifier
= (wxDataViewListModelNotifier
*) node
->GetData();
73 if (!notifier
->RowPrepended())
75 node
= node
->GetNext();
81 bool wxDataViewListModel::RowInserted( size_t before
)
85 wxNode
*node
= m_notifiers
.GetFirst();
88 wxDataViewListModelNotifier
* notifier
= (wxDataViewListModelNotifier
*) node
->GetData();
89 if (!notifier
->RowInserted(before
))
91 node
= node
->GetNext();
97 bool wxDataViewListModel::RowDeleted( size_t row
)
101 wxNode
*node
= m_notifiers
.GetFirst();
104 wxDataViewListModelNotifier
* notifier
= (wxDataViewListModelNotifier
*) node
->GetData();
105 if (!notifier
->RowDeleted( row
))
107 node
= node
->GetNext();
113 bool wxDataViewListModel::RowChanged( size_t row
)
117 wxNode
*node
= m_notifiers
.GetFirst();
120 wxDataViewListModelNotifier
* notifier
= (wxDataViewListModelNotifier
*) node
->GetData();
121 if (!notifier
->RowChanged( row
))
123 node
= node
->GetNext();
129 bool wxDataViewListModel::ValueChanged( size_t col
, size_t row
)
133 wxNode
*node
= m_notifiers
.GetFirst();
136 wxDataViewListModelNotifier
* notifier
= (wxDataViewListModelNotifier
*) node
->GetData();
137 if (!notifier
->ValueChanged( col
, row
))
139 node
= node
->GetNext();
145 bool wxDataViewListModel::Cleared()
149 wxNode
*node
= m_notifiers
.GetFirst();
152 wxDataViewListModelNotifier
* notifier
= (wxDataViewListModelNotifier
*) node
->GetData();
153 if (!notifier
->Cleared())
155 node
= node
->GetNext();
161 void wxDataViewListModel::AddViewingColumn( wxDataViewColumn
*view_column
, size_t model_column
)
163 m_viewingColumns
.Append( new wxDataViewViewingColumn( view_column
, model_column
) );
166 void wxDataViewListModel::RemoveViewingColumn( wxDataViewColumn
*column
)
168 wxNode
*node
= m_viewingColumns
.GetFirst();
171 wxDataViewViewingColumn
* tmp
= (wxDataViewViewingColumn
*) node
->GetData();
173 if (tmp
->m_viewColumn
== column
)
175 m_viewingColumns
.DeleteObject( tmp
);
179 node
= node
->GetNext();
183 void wxDataViewListModel::AddNotifier( wxDataViewListModelNotifier
*notifier
)
185 m_notifiers
.Append( notifier
);
186 notifier
->SetOwner( this );
189 void wxDataViewListModel::RemoveNotifier( wxDataViewListModelNotifier
*notifier
)
191 m_notifiers
.DeleteObject( notifier
);
194 // ---------------------------------------------------------
195 // wxDataViewSortedListModel
196 // ---------------------------------------------------------
198 int wxCALLBACK wxDataViewListModelSortedDefaultCompare
199 (size_t row1
, size_t row2
, size_t col
, wxDataViewListModel
* model
)
201 wxVariant value1
= model
->GetValue( col
, row1
);
202 wxVariant value2
= model
->GetValue( col
, row2
);
203 if (value1
.GetType() == wxT("string"))
205 wxString str1
= value1
.GetString();
206 wxString str2
= value2
.GetString();
207 return str1
.Cmp( str2
);
209 if (value1
.GetType() == wxT("long"))
211 long l1
= value1
.GetLong();
212 long l2
= value2
.GetLong();
215 if (value1
.GetType() == wxT("double"))
217 double d1
= value1
.GetDouble();
218 double d2
= value2
.GetDouble();
219 if (d1
== d2
) return 0;
220 if (d1
< d2
) return 1;
223 if (value1
.GetType() == wxT("datetime"))
225 wxDateTime dt1
= value1
.GetDateTime();
226 wxDateTime dt2
= value2
.GetDateTime();
227 if (dt1
.IsEqualTo(dt2
)) return 0;
228 if (dt1
.IsEarlierThan(dt2
)) return 1;
235 static wxDataViewListModelCompare s_CmpFunc
;
236 static wxDataViewListModel
*s_CmpModel
;
237 static size_t s_CmpCol
;
239 int LINKAGEMODE
wxDataViewIntermediateCmp( size_t row1
, size_t row2
)
241 return s_CmpFunc( row1
, row2
, s_CmpCol
, s_CmpModel
);
245 IMPLEMENT_ABSTRACT_CLASS(wxDataViewSortedListModel
, wxDataViewListModel
)
247 wxDataViewSortedListModel::wxDataViewSortedListModel( wxDataViewListModel
*child
) :
248 m_array( wxDataViewIntermediateCmp
)
253 s_CmpFunc
= wxDataViewListModelSortedDefaultCompare
;
258 wxDataViewSortedListModel::~wxDataViewSortedListModel()
262 void wxDataViewSortedListModel::Resort()
265 size_t n
= m_child
->GetNumberOfRows();
267 for (i
= 0; i
< n
; i
++)
271 size_t wxDataViewSortedListModel::GetNumberOfRows()
273 return m_child
->GetNumberOfRows();
276 size_t wxDataViewSortedListModel::GetNumberOfCols()
278 return m_child
->GetNumberOfCols();
281 wxString
wxDataViewSortedListModel::GetColType( size_t col
)
283 return m_child
->GetColType( col
);
286 wxVariant
wxDataViewSortedListModel::GetValue( size_t col
, size_t row
)
288 size_t child_row
= m_array
[row
];
289 return m_child
->GetValue( col
, child_row
);
292 bool wxDataViewSortedListModel::SetValue( wxVariant
&variant
, size_t col
, size_t row
)
294 size_t child_row
= m_array
[row
];
295 bool ret
= m_child
->SetValue( variant
, col
, child_row
);
296 // resort in ::ValueChanged()
300 bool wxDataViewSortedListModel::RowAppended()
302 // you can only append
303 bool ret
= m_child
->RowAppended();
310 bool wxDataViewSortedListModel::RowPrepended()
312 // you can only append
313 bool ret
= m_child
->RowAppended();
320 bool wxDataViewSortedListModel::RowInserted( size_t before
)
322 // you can only append
323 bool ret
= m_child
->RowAppended();
325 // report different RowInsrted
330 bool wxDataViewSortedListModel::RowDeleted( size_t row
)
332 size_t child_row
= m_array
[row
];
334 bool ret
= m_child
->RowDeleted( child_row
);
336 wxDataViewListModel::RowDeleted( row
);
341 bool wxDataViewSortedListModel::RowChanged( size_t row
)
343 size_t child_row
= m_array
[row
];
344 bool ret
= m_child
->RowChanged( child_row
);
346 // report delete old pos, inserted new pos
351 bool wxDataViewSortedListModel::ValueChanged( size_t col
, size_t row
)
353 size_t child_row
= m_array
[row
];
354 bool ret
= m_child
->ValueChanged( col
, child_row
);
356 // Do nothing if not the sorted col..
357 // report delete old pos, inserted new pos
362 bool wxDataViewSortedListModel::Cleared()
364 bool ret
= m_child
->Cleared();
366 wxDataViewListModel::Cleared();
371 // ---------------------------------------------------------
372 // wxDataViewCellBase
373 // ---------------------------------------------------------
375 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCellBase
, wxObject
)
377 wxDataViewCellBase::wxDataViewCellBase( const wxString
&varianttype
, wxDataViewCellMode mode
)
379 m_variantType
= varianttype
;
383 // ---------------------------------------------------------
384 // wxDataViewColumnBase
385 // ---------------------------------------------------------
387 IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumnBase
, wxObject
)
389 wxDataViewColumnBase::wxDataViewColumnBase( const wxString
&title
, wxDataViewCell
*cell
, size_t model_column
, int flags
)
392 m_model_column
= model_column
;
396 m_cell
->SetOwner( (wxDataViewColumn
*) this );
399 wxDataViewColumnBase::~wxDataViewColumnBase()
406 GetOwner()->GetModel()->RemoveViewingColumn( (wxDataViewColumn
*) this );
410 void wxDataViewColumnBase::SetTitle( const wxString
&title
)
415 wxString
wxDataViewColumnBase::GetTitle()
420 // ---------------------------------------------------------
421 // wxDataViewCtrlBase
422 // ---------------------------------------------------------
424 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCtrlBase
, wxControl
)
426 wxDataViewCtrlBase::wxDataViewCtrlBase()
429 m_cols
.DeleteContents( true );
432 wxDataViewCtrlBase::~wxDataViewCtrlBase()
436 bool wxDataViewCtrlBase::AssociateModel( wxDataViewListModel
*model
)
443 wxDataViewListModel
* wxDataViewCtrlBase::GetModel()
448 bool wxDataViewCtrlBase::AppendTextColumn( const wxString
&label
, size_t model_column
)
450 return AppendColumn( new wxDataViewColumn( label
, new wxDataViewTextCell(), model_column
) );
453 bool wxDataViewCtrlBase::AppendToggleColumn( const wxString
&label
, size_t model_column
)
455 return AppendColumn( new wxDataViewColumn( label
, new wxDataViewToggleCell(), model_column
) );
458 bool wxDataViewCtrlBase::AppendProgressColumn( const wxString
&label
, size_t model_column
)
460 return AppendColumn( new wxDataViewColumn( label
, new wxDataViewProgressCell(), model_column
) );
463 bool wxDataViewCtrlBase::AppendDateColumn( const wxString
&label
, size_t model_column
)
465 return AppendColumn( new wxDataViewColumn( label
, new wxDataViewDateCell(), model_column
) );
468 bool wxDataViewCtrlBase::AppendColumn( wxDataViewColumn
*col
)
470 m_cols
.Append( (wxObject
*) col
);
471 col
->SetOwner( (wxDataViewCtrl
*) this );
472 m_model
->AddViewingColumn( col
, col
->GetModelColumn() );
476 size_t wxDataViewCtrlBase::GetNumberOfColumns()
478 return m_cols
.GetCount();
481 bool wxDataViewCtrlBase::DeleteColumn( size_t pos
)
486 bool wxDataViewCtrlBase::ClearColumns()
491 wxDataViewColumn
* wxDataViewCtrlBase::GetColumn( size_t pos
)
493 return (wxDataViewColumn
*) m_cols
[ pos
];