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 class wxDataViewViewingColumn
: public wxObject
40 wxDataViewViewingColumn( wxDataViewColumn
*view_column
, size_t model_column
)
42 m_viewColumn
= view_column
;
43 m_modelColumn
= model_column
;
46 wxDataViewColumn
*m_viewColumn
;
51 IMPLEMENT_ABSTRACT_CLASS(wxDataViewListModel
, wxDataViewModel
)
53 wxDataViewListModel::wxDataViewListModel()
56 m_viewingColumns
.DeleteContents( true );
59 wxDataViewListModel::~wxDataViewListModel()
65 bool wxDataViewListModel::RowAppended()
68 return m_notifier
->RowAppended();
73 bool wxDataViewListModel::RowPrepended()
76 return m_notifier
->RowPrepended();
81 bool wxDataViewListModel::RowInserted( size_t before
)
84 return m_notifier
->RowInserted( before
);
89 bool wxDataViewListModel::RowDeleted( size_t row
)
92 return m_notifier
->RowDeleted( row
);
97 bool wxDataViewListModel::RowChanged( size_t row
)
100 return m_notifier
->RowChanged( row
);
105 bool wxDataViewListModel::ValueChanged( size_t col
, size_t row
)
110 ret
= m_notifier
->ValueChanged( col
, row
);
112 wxNode
*node
= m_viewingColumns
.GetFirst();
115 wxDataViewViewingColumn
* tmp
= (wxDataViewViewingColumn
*) node
->GetData();
117 if (tmp
->m_modelColumn
== col
)
118 m_notifier
->ValueChanged( tmp
->m_viewColumn
, col
, row
);
120 node
= node
->GetNext();
126 bool wxDataViewListModel::Cleared()
129 return m_notifier
->Cleared();
134 void wxDataViewListModel::AddViewingColumn( wxDataViewColumn
*view_column
, size_t model_column
)
136 m_viewingColumns
.Append( new wxDataViewViewingColumn( view_column
, model_column
) );
139 void wxDataViewListModel::RemoveViewingColumn( wxDataViewColumn
*column
)
141 wxNode
*node
= m_viewingColumns
.GetFirst();
144 wxDataViewViewingColumn
* tmp
= (wxDataViewViewingColumn
*) node
->GetData();
146 if (tmp
->m_viewColumn
== column
)
148 m_viewingColumns
.DeleteObject( tmp
);
152 node
= node
->GetNext();
156 void wxDataViewListModel::SetNotifier( wxDataViewListModelNotifier
*notifier
)
161 m_notifier
= notifier
;
164 wxDataViewListModelNotifier
* wxDataViewListModel::GetNotifier()
169 // ---------------------------------------------------------
170 // wxDataViewSortedListModel
171 // ---------------------------------------------------------
173 int wxCALLBACK wxDataViewListModelSortedDefaultCompare
174 (size_t row1
, size_t row2
, size_t col
, wxDataViewListModel
* model
)
176 wxVariant value1
= model
->GetValue( col
, row1
);
177 wxVariant value2
= model
->GetValue( col
, row2
);
178 if (value1
.GetType() == wxT("string"))
180 wxString str1
= value1
.GetString();
181 wxString str2
= value2
.GetString();
182 return str1
.Cmp( str2
);
184 if (value1
.GetType() == wxT("long"))
186 long l1
= value1
.GetLong();
187 long l2
= value2
.GetLong();
190 if (value1
.GetType() == wxT("double"))
192 double d1
= value1
.GetDouble();
193 double d2
= value2
.GetDouble();
194 if (d1
== d2
) return 0;
195 if (d1
< d2
) return 1;
198 if (value1
.GetType() == wxT("datetime"))
200 wxDateTime dt1
= value1
.GetDateTime();
201 wxDateTime dt2
= value2
.GetDateTime();
202 if (dt1
.IsEqualTo(dt2
)) return 0;
203 if (dt1
.IsEarlierThan(dt2
)) return 1;
210 static wxDataViewListModelCompare s_CmpFunc
;
211 static wxDataViewListModel
*s_CmpModel
;
212 static size_t s_CmpCol
;
214 int LINKAGEMODE
wxDataViewIntermediateCmp( size_t row1
, size_t row2
)
216 return s_CmpFunc( row1
, row2
, s_CmpCol
, s_CmpModel
);
220 IMPLEMENT_ABSTRACT_CLASS(wxDataViewSortedListModel
, wxDataViewListModel
)
222 wxDataViewSortedListModel::wxDataViewSortedListModel( wxDataViewListModel
*child
) :
223 m_array( wxDataViewIntermediateCmp
)
228 s_CmpFunc
= wxDataViewListModelSortedDefaultCompare
;
231 wxDataViewSortedListModel::~wxDataViewSortedListModel()
235 size_t wxDataViewSortedListModel::GetNumberOfRows()
237 return m_child
->GetNumberOfRows();
240 size_t wxDataViewSortedListModel::GetNumberOfCols()
242 return m_child
->GetNumberOfCols();
245 wxString
wxDataViewSortedListModel::GetColType( size_t col
)
247 return m_child
->GetColType( col
);
250 wxVariant
wxDataViewSortedListModel::GetValue( size_t col
, size_t row
)
252 size_t child_row
= m_array
[row
];
253 return m_child
->GetValue( col
, child_row
);
256 bool wxDataViewSortedListModel::SetValue( wxVariant
&variant
, size_t col
, size_t row
)
258 size_t child_row
= m_array
[row
];
259 bool ret
= m_child
->SetValue( variant
, col
, child_row
);
260 // resort in ::ValueChanged()
264 bool wxDataViewSortedListModel::RowAppended()
266 // you can only append
267 bool ret
= m_child
->RowAppended();
274 bool wxDataViewSortedListModel::RowPrepended()
276 // you can only append
277 bool ret
= m_child
->RowAppended();
284 bool wxDataViewSortedListModel::RowInserted( size_t before
)
286 // you can only append
287 bool ret
= m_child
->RowAppended();
289 // report different RowInsrted
294 bool wxDataViewSortedListModel::RowDeleted( size_t row
)
296 size_t child_row
= m_array
[row
];
298 bool ret
= m_child
->RowDeleted( child_row
);
300 wxDataViewListModel::RowDeleted( row
);
305 bool wxDataViewSortedListModel::RowChanged( size_t row
)
307 size_t child_row
= m_array
[row
];
308 bool ret
= m_child
->RowChanged( child_row
);
310 // report delete old pos, inserted new pos
315 bool wxDataViewSortedListModel::ValueChanged( size_t col
, size_t row
)
317 size_t child_row
= m_array
[row
];
318 bool ret
= m_child
->ValueChanged( col
, child_row
);
320 // Do nothing if not the sorted col..
321 // report delete old pos, inserted new pos
326 bool wxDataViewSortedListModel::Cleared()
328 bool ret
= m_child
->Cleared();
330 wxDataViewListModel::Cleared();
335 void wxDataViewSortedListModel::SetNotifier( wxDataViewListModelNotifier
*notifier
)
337 wxDataViewListModel::SetNotifier( notifier
);
340 wxDataViewListModelNotifier
* wxDataViewSortedListModel::GetNotifier()
342 return wxDataViewListModel::GetNotifier();
345 // ---------------------------------------------------------
346 // wxDataViewCellBase
347 // ---------------------------------------------------------
349 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCellBase
, wxObject
)
351 wxDataViewCellBase::wxDataViewCellBase( const wxString
&varianttype
, wxDataViewCellMode mode
)
353 m_variantType
= varianttype
;
357 // ---------------------------------------------------------
358 // wxDataViewColumnBase
359 // ---------------------------------------------------------
361 IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumnBase
, wxObject
)
363 wxDataViewColumnBase::wxDataViewColumnBase( const wxString
&title
, wxDataViewCell
*cell
, size_t model_column
, int flags
)
366 m_model_column
= model_column
;
370 m_cell
->SetOwner( (wxDataViewColumn
*) this );
373 wxDataViewColumnBase::~wxDataViewColumnBase()
380 GetOwner()->GetModel()->RemoveViewingColumn( (wxDataViewColumn
*) this );
384 void wxDataViewColumnBase::SetTitle( const wxString
&title
)
389 wxString
wxDataViewColumnBase::GetTitle()
394 // ---------------------------------------------------------
395 // wxDataViewCtrlBase
396 // ---------------------------------------------------------
398 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCtrlBase
, wxControl
)
400 wxDataViewCtrlBase::wxDataViewCtrlBase()
403 m_cols
.DeleteContents( true );
406 wxDataViewCtrlBase::~wxDataViewCtrlBase()
412 bool wxDataViewCtrlBase::AssociateModel( wxDataViewListModel
*model
)
422 wxDataViewListModel
* wxDataViewCtrlBase::GetModel()
427 bool wxDataViewCtrlBase::AppendTextColumn( const wxString
&label
, size_t model_column
)
429 return AppendColumn( new wxDataViewColumn( label
, new wxDataViewTextCell(), model_column
) );
432 bool wxDataViewCtrlBase::AppendToggleColumn( const wxString
&label
, size_t model_column
)
434 return AppendColumn( new wxDataViewColumn( label
, new wxDataViewToggleCell(), model_column
) );
437 bool wxDataViewCtrlBase::AppendProgressColumn( const wxString
&label
, size_t model_column
)
439 return AppendColumn( new wxDataViewColumn( label
, new wxDataViewProgressCell(), model_column
) );
442 bool wxDataViewCtrlBase::AppendDateColumn( const wxString
&label
, size_t model_column
)
444 return AppendColumn( new wxDataViewColumn( label
, new wxDataViewDateCell(), model_column
) );
447 bool wxDataViewCtrlBase::AppendColumn( wxDataViewColumn
*col
)
449 m_cols
.Append( (wxObject
*) col
);
450 col
->SetOwner( (wxDataViewCtrl
*) this );
451 m_model
->AddViewingColumn( col
, col
->GetModelColumn() );
455 size_t wxDataViewCtrlBase::GetNumberOfColumns()
457 return m_cols
.GetCount();
460 bool wxDataViewCtrlBase::DeleteColumn( size_t pos
)
465 bool wxDataViewCtrlBase::ClearColumns()
470 wxDataViewColumn
* wxDataViewCtrlBase::GetColumn( size_t pos
)
472 return (wxDataViewColumn
*) m_cols
[ pos
];