]> git.saurik.com Git - wxWidgets.git/blob - src/common/datavcmn.cpp
Added wxDataViewSortedListModel, which doesn't work
[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 #include "wx/defs.h"
19
20 #if wxUSE_DATAVIEWCTRL
21
22 #include "wx/object.h"
23 #include "wx/dataview.h"
24 #include "wx/log.h"
25 #include "wx/image.h"
26
27 // ---------------------------------------------------------
28 // wxDataViewModel
29 // ---------------------------------------------------------
30
31 IMPLEMENT_ABSTRACT_CLASS(wxDataViewModel, wxObject)
32
33 // ---------------------------------------------------------
34 // wxDataViewListModel
35 // ---------------------------------------------------------
36
37 class wxDataViewViewingColumn: public wxObject
38 {
39 public:
40 wxDataViewViewingColumn( wxDataViewColumn *view_column, size_t model_column )
41 {
42 m_viewColumn = view_column;
43 m_modelColumn = model_column;
44 }
45
46 wxDataViewColumn *m_viewColumn;
47 size_t m_modelColumn;
48 };
49
50
51 IMPLEMENT_ABSTRACT_CLASS(wxDataViewListModel, wxDataViewModel)
52
53 wxDataViewListModel::wxDataViewListModel()
54 {
55 m_notifier = NULL;
56 m_viewingColumns.DeleteContents( true );
57 }
58
59 wxDataViewListModel::~wxDataViewListModel()
60 {
61 if (m_notifier)
62 delete m_notifier;
63 }
64
65 bool wxDataViewListModel::RowAppended()
66 {
67 if (m_notifier)
68 return m_notifier->RowAppended();
69
70 return false;
71 }
72
73 bool wxDataViewListModel::RowPrepended()
74 {
75 if (m_notifier)
76 return m_notifier->RowPrepended();
77
78 return false;
79 }
80
81 bool wxDataViewListModel::RowInserted( size_t before )
82 {
83 if (m_notifier)
84 return m_notifier->RowInserted( before );
85
86 return false;
87 }
88
89 bool wxDataViewListModel::RowDeleted( size_t row )
90 {
91 if (m_notifier)
92 return m_notifier->RowDeleted( row );
93
94 return false;
95 }
96
97 bool wxDataViewListModel::RowChanged( size_t row )
98 {
99 if (m_notifier)
100 return m_notifier->RowChanged( row );
101
102 return false;
103 }
104
105 bool wxDataViewListModel::ValueChanged( size_t col, size_t row )
106 {
107 bool ret = false;
108
109 if (m_notifier)
110 ret = m_notifier->ValueChanged( col, row );
111
112 wxNode *node = m_viewingColumns.GetFirst();
113 while (node)
114 {
115 wxDataViewViewingColumn* tmp = (wxDataViewViewingColumn*) node->GetData();
116
117 if (tmp->m_modelColumn == col)
118 m_notifier->ValueChanged( tmp->m_viewColumn, col, row );
119
120 node = node->GetNext();
121 }
122
123 return ret;
124 }
125
126 bool wxDataViewListModel::Cleared()
127 {
128 if (m_notifier)
129 return m_notifier->Cleared();
130
131 return false;
132 }
133
134 void wxDataViewListModel::AddViewingColumn( wxDataViewColumn *view_column, size_t model_column )
135 {
136 m_viewingColumns.Append( new wxDataViewViewingColumn( view_column, model_column ) );
137 }
138
139 void wxDataViewListModel::RemoveViewingColumn( wxDataViewColumn *column )
140 {
141 wxNode *node = m_viewingColumns.GetFirst();
142 while (node)
143 {
144 wxDataViewViewingColumn* tmp = (wxDataViewViewingColumn*) node->GetData();
145
146 if (tmp->m_viewColumn == column)
147 {
148 m_viewingColumns.DeleteObject( tmp );
149 return;
150 }
151
152 node = node->GetNext();
153 }
154 }
155
156 void wxDataViewListModel::SetNotifier( wxDataViewListModelNotifier *notifier )
157 {
158 if (m_notifier)
159 delete m_notifier;
160
161 m_notifier = notifier;
162 }
163
164 wxDataViewListModelNotifier* wxDataViewListModel::GetNotifier()
165 {
166 return m_notifier;
167 }
168
169 // ---------------------------------------------------------
170 // wxDataViewSortedListModel
171 // ---------------------------------------------------------
172
173 int wxCALLBACK wxDataViewListModelSortedDefaultCompare
174 (size_t row1, size_t row2, size_t col, wxDataViewListModel* model )
175 {
176 wxVariant value1 = model->GetValue( col, row1 );
177 wxVariant value2 = model->GetValue( col, row2 );
178 if (value1.GetType() == wxT("string"))
179 {
180 wxString str1 = value1.GetString();
181 wxString str2 = value2.GetString();
182 return str1.Cmp( str2 );
183 }
184 if (value1.GetType() == wxT("long"))
185 {
186 long l1 = value1.GetLong();
187 long l2 = value2.GetLong();
188 return l1-l2;
189 }
190 if (value1.GetType() == wxT("double"))
191 {
192 double d1 = value1.GetDouble();
193 double d2 = value2.GetDouble();
194 if (d1 == d2) return 0;
195 if (d1 < d2) return 1;
196 return -1;
197 }
198 if (value1.GetType() == wxT("datetime"))
199 {
200 wxDateTime dt1 = value1.GetDateTime();
201 wxDateTime dt2 = value2.GetDateTime();
202 if (dt1.IsEqualTo(dt2)) return 0;
203 if (dt1.IsEarlierThan(dt2)) return 1;
204 return -1;
205 }
206
207 return 0;
208 }
209
210 static wxDataViewListModelCompare s_CmpFunc;
211 static wxDataViewListModel *s_CmpModel;
212 static size_t s_CmpCol;
213
214 int LINKAGEMODE wxDataViewIntermediateCmp( size_t row1, size_t row2 )
215 {
216 return s_CmpFunc( row1, row2, s_CmpCol, s_CmpModel );
217 }
218
219
220 IMPLEMENT_ABSTRACT_CLASS(wxDataViewSortedListModel, wxDataViewListModel)
221
222 wxDataViewSortedListModel::wxDataViewSortedListModel( wxDataViewListModel *child ) :
223 m_array( wxDataViewIntermediateCmp )
224 {
225 m_child = child;
226 s_CmpCol = 0;
227 s_CmpModel = child;
228 s_CmpFunc = wxDataViewListModelSortedDefaultCompare;
229 }
230
231 wxDataViewSortedListModel::~wxDataViewSortedListModel()
232 {
233 }
234
235 size_t wxDataViewSortedListModel::GetNumberOfRows()
236 {
237 return m_child->GetNumberOfRows();
238 }
239
240 size_t wxDataViewSortedListModel::GetNumberOfCols()
241 {
242 return m_child->GetNumberOfCols();
243 }
244
245 wxString wxDataViewSortedListModel::GetColType( size_t col )
246 {
247 return m_child->GetColType( col );
248 }
249
250 wxVariant wxDataViewSortedListModel::GetValue( size_t col, size_t row )
251 {
252 size_t child_row = m_array[row];
253 return m_child->GetValue( col, child_row );
254 }
255
256 bool wxDataViewSortedListModel::SetValue( wxVariant &variant, size_t col, size_t row )
257 {
258 size_t child_row = m_array[row];
259 bool ret = m_child->SetValue( variant, col, child_row );
260 // resort in ::ValueChanged()
261 return ret;
262 }
263
264 bool wxDataViewSortedListModel::RowAppended()
265 {
266 // you can only append
267 bool ret = m_child->RowAppended();
268
269 // report RowInsrted
270
271 return ret;
272 }
273
274 bool wxDataViewSortedListModel::RowPrepended()
275 {
276 // you can only append
277 bool ret = m_child->RowAppended();
278
279 // report RowInsrted
280
281 return ret;
282 }
283
284 bool wxDataViewSortedListModel::RowInserted( size_t before )
285 {
286 // you can only append
287 bool ret = m_child->RowAppended();
288
289 // report different RowInsrted
290
291 return ret;
292 }
293
294 bool wxDataViewSortedListModel::RowDeleted( size_t row )
295 {
296 size_t child_row = m_array[row];
297
298 bool ret = m_child->RowDeleted( child_row );
299
300 wxDataViewListModel::RowDeleted( row );
301
302 return ret;
303 }
304
305 bool wxDataViewSortedListModel::RowChanged( size_t row )
306 {
307 size_t child_row = m_array[row];
308 bool ret = m_child->RowChanged( child_row );
309
310 // report delete old pos, inserted new pos
311
312 return ret;
313 }
314
315 bool wxDataViewSortedListModel::ValueChanged( size_t col, size_t row )
316 {
317 size_t child_row = m_array[row];
318 bool ret = m_child->ValueChanged( col, child_row );
319
320 // Do nothing if not the sorted col..
321 // report delete old pos, inserted new pos
322
323 return ret;
324 }
325
326 bool wxDataViewSortedListModel::Cleared()
327 {
328 bool ret = m_child->Cleared();
329
330 wxDataViewListModel::Cleared();
331
332 return ret;
333 }
334
335 void wxDataViewSortedListModel::SetNotifier( wxDataViewListModelNotifier *notifier )
336 {
337 wxDataViewListModel::SetNotifier( notifier );
338 }
339
340 wxDataViewListModelNotifier* wxDataViewSortedListModel::GetNotifier()
341 {
342 return wxDataViewListModel::GetNotifier();
343 }
344
345 // ---------------------------------------------------------
346 // wxDataViewCellBase
347 // ---------------------------------------------------------
348
349 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCellBase, wxObject)
350
351 wxDataViewCellBase::wxDataViewCellBase( const wxString &varianttype, wxDataViewCellMode mode )
352 {
353 m_variantType = varianttype;
354 m_mode = mode;
355 }
356
357 // ---------------------------------------------------------
358 // wxDataViewColumnBase
359 // ---------------------------------------------------------
360
361 IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumnBase, wxObject)
362
363 wxDataViewColumnBase::wxDataViewColumnBase( const wxString &title, wxDataViewCell *cell, size_t model_column, int flags)
364 {
365 m_cell = cell;
366 m_model_column = model_column;
367 m_flags = flags;
368 m_title = title;
369 m_owner = NULL;
370 m_cell->SetOwner( (wxDataViewColumn*) this );
371 }
372
373 wxDataViewColumnBase::~wxDataViewColumnBase()
374 {
375 if (m_cell)
376 delete m_cell;
377
378 if (GetOwner())
379 {
380 GetOwner()->GetModel()->RemoveViewingColumn( (wxDataViewColumn*) this );
381 }
382 }
383
384 void wxDataViewColumnBase::SetTitle( const wxString &title )
385 {
386 m_title = title;
387 }
388
389 wxString wxDataViewColumnBase::GetTitle()
390 {
391 return m_title;
392 }
393
394 // ---------------------------------------------------------
395 // wxDataViewCtrlBase
396 // ---------------------------------------------------------
397
398 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCtrlBase, wxControl)
399
400 wxDataViewCtrlBase::wxDataViewCtrlBase()
401 {
402 m_model = NULL;
403 m_cols.DeleteContents( true );
404 }
405
406 wxDataViewCtrlBase::~wxDataViewCtrlBase()
407 {
408 if (m_model)
409 delete m_model;
410 }
411
412 bool wxDataViewCtrlBase::AssociateModel( wxDataViewListModel *model )
413 {
414 if (m_model)
415 delete m_model;
416
417 m_model = model;
418
419 return true;
420 }
421
422 wxDataViewListModel* wxDataViewCtrlBase::GetModel()
423 {
424 return m_model;
425 }
426
427 bool wxDataViewCtrlBase::AppendTextColumn( const wxString &label, size_t model_column )
428 {
429 return AppendColumn( new wxDataViewColumn( label, new wxDataViewTextCell(), model_column ) );
430 }
431
432 bool wxDataViewCtrlBase::AppendToggleColumn( const wxString &label, size_t model_column )
433 {
434 return AppendColumn( new wxDataViewColumn( label, new wxDataViewToggleCell(), model_column ) );
435 }
436
437 bool wxDataViewCtrlBase::AppendProgressColumn( const wxString &label, size_t model_column )
438 {
439 return AppendColumn( new wxDataViewColumn( label, new wxDataViewProgressCell(), model_column ) );
440 }
441
442 bool wxDataViewCtrlBase::AppendDateColumn( const wxString &label, size_t model_column )
443 {
444 return AppendColumn( new wxDataViewColumn( label, new wxDataViewDateCell(), model_column ) );
445 }
446
447 bool wxDataViewCtrlBase::AppendColumn( wxDataViewColumn *col )
448 {
449 m_cols.Append( (wxObject*) col );
450 col->SetOwner( (wxDataViewCtrl*) this );
451 m_model->AddViewingColumn( col, col->GetModelColumn() );
452 return true;
453 }
454
455 size_t wxDataViewCtrlBase::GetNumberOfColumns()
456 {
457 return m_cols.GetCount();
458 }
459
460 bool wxDataViewCtrlBase::DeleteColumn( size_t pos )
461 {
462 return false;
463 }
464
465 bool wxDataViewCtrlBase::ClearColumns()
466 {
467 return false;
468 }
469
470 wxDataViewColumn* wxDataViewCtrlBase::GetColumn( size_t pos )
471 {
472 return (wxDataViewColumn*) m_cols[ pos ];
473 }
474
475 #endif