]> git.saurik.com Git - wxWidgets.git/blame - src/common/datavcmn.cpp
rewrite FilterInValue() using iterators, this results iin 12x performance improvement...
[wxWidgets.git] / src / common / datavcmn.cpp
CommitLineData
239eaa41
RR
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
8045736e
RR
18#if wxUSE_DATAVIEWCTRL
19
e7445ff8
PC
20#include "wx/dataview.h"
21
f554a14b 22#ifndef WX_PRECOMP
f554a14b
WS
23 #include "wx/log.h"
24#endif
25
4a2e5ee8 26const wxChar wxDataViewCtrlNameStr[] = wxT("dataviewCtrl");
239eaa41 27
239eaa41 28
d5025dc0
RR
29bool operator == (const wxDataViewItem &left, const wxDataViewItem &right)
30{
31 return (left.GetID() == right.GetID() );
32}
33
34
f554a14b 35// ---------------------------------------------------------
d5025dc0 36// wxDataViewModel
f554a14b 37// ---------------------------------------------------------
239eaa41 38
e0062c04 39wxDataViewModel::wxDataViewModel()
239eaa41 40{
8f850e28 41 m_notifiers.DeleteContents( true );
ef427989 42 m_sortingColumn = 0;
9a45b5d5 43 m_ascending = true;
239eaa41
RR
44}
45
e0062c04 46bool wxDataViewModel::ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item )
239eaa41 47{
8f850e28
RR
48 bool ret = true;
49
85e5bb6a 50 wxList::compatibility_iterator node = m_notifiers.GetFirst();
8f850e28
RR
51 while (node)
52 {
e0062c04
RR
53 wxDataViewModelNotifier* notifier = (wxDataViewModelNotifier*) node->GetData();
54 if (!notifier->ItemAdded( parent, item ))
8f850e28
RR
55 ret = false;
56 node = node->GetNext();
57 }
f554a14b 58
8f850e28 59 return ret;
239eaa41
RR
60}
61
e0062c04 62bool wxDataViewModel::ItemDeleted( const wxDataViewItem &item )
239eaa41 63{
8f850e28
RR
64 bool ret = true;
65
85e5bb6a 66 wxList::compatibility_iterator node = m_notifiers.GetFirst();
8f850e28
RR
67 while (node)
68 {
e0062c04
RR
69 wxDataViewModelNotifier* notifier = (wxDataViewModelNotifier*) node->GetData();
70 if (!notifier->ItemDeleted( item ))
8f850e28
RR
71 ret = false;
72 node = node->GetNext();
73 }
f554a14b 74
8f850e28 75 return ret;
239eaa41
RR
76}
77
e0062c04 78bool wxDataViewModel::ItemChanged( const wxDataViewItem &item )
239eaa41 79{
8f850e28
RR
80 bool ret = true;
81
85e5bb6a 82 wxList::compatibility_iterator node = m_notifiers.GetFirst();
8f850e28
RR
83 while (node)
84 {
e0062c04
RR
85 wxDataViewModelNotifier* notifier = (wxDataViewModelNotifier*) node->GetData();
86 if (!notifier->ItemChanged( item ))
8f850e28
RR
87 ret = false;
88 node = node->GetNext();
89 }
f554a14b 90
8f850e28 91 return ret;
239eaa41
RR
92}
93
e0062c04 94bool wxDataViewModel::ValueChanged( const wxDataViewItem &item, unsigned int col )
239eaa41 95{
8f850e28 96 bool ret = true;
b5d777c7 97
85e5bb6a 98 wxList::compatibility_iterator node = m_notifiers.GetFirst();
b5d777c7
RR
99 while (node)
100 {
e0062c04
RR
101 wxDataViewModelNotifier* notifier = (wxDataViewModelNotifier*) node->GetData();
102 if (!notifier->ValueChanged( item, col ))
8f850e28 103 ret = false;
b5d777c7
RR
104 node = node->GetNext();
105 }
f554a14b 106
b5d777c7 107 return ret;
239eaa41
RR
108}
109
e0062c04 110bool wxDataViewModel::Cleared()
4eccd3a1
RR
111{
112 bool ret = true;
113
85e5bb6a 114 wxList::compatibility_iterator node = m_notifiers.GetFirst();
4eccd3a1
RR
115 while (node)
116 {
e0062c04 117 wxDataViewModelNotifier* notifier = (wxDataViewModelNotifier*) node->GetData();
8f850e28
RR
118 if (!notifier->Cleared())
119 ret = false;
120 node = node->GetNext();
121 }
f554a14b 122
8f850e28 123 return ret;
239eaa41
RR
124}
125
ef427989
RR
126void wxDataViewModel::Resort()
127{
128 wxList::compatibility_iterator node = m_notifiers.GetFirst();
129 while (node)
130 {
131 wxDataViewModelNotifier* notifier = (wxDataViewModelNotifier*) node->GetData();
132 notifier->Resort();
133 node = node->GetNext();
134 }
135}
136
e0062c04 137void wxDataViewModel::AddNotifier( wxDataViewModelNotifier *notifier )
239eaa41 138{
8f850e28
RR
139 m_notifiers.Append( notifier );
140 notifier->SetOwner( this );
239eaa41
RR
141}
142
e0062c04 143void wxDataViewModel::RemoveNotifier( wxDataViewModelNotifier *notifier )
239eaa41 144{
8f850e28 145 m_notifiers.DeleteObject( notifier );
239eaa41
RR
146}
147
ef427989
RR
148int wxDataViewModel::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2 )
149{
cf283a47
RR
150 // sort branches before leaves
151 bool item1_has_children = HasChildren(item1);
152 bool item2_has_children = HasChildren(item2);
153
154 if (item1_has_children && !item2_has_children)
155 return 1;
156 if (item2_has_children && !item1_has_children)
157 return -1;
158
ef427989
RR
159 wxVariant value1,value2;
160 GetValue( value1, item1, m_sortingColumn );
161 GetValue( value2, item2, m_sortingColumn );
cf283a47 162
4508fcd2
RR
163 if (!m_ascending)
164 {
165 wxVariant temp = value1;
166 value1 = value2;
167 value2 = temp;
168 }
169
ef427989
RR
170 if (value1.GetType() == wxT("string"))
171 {
172 wxString str1 = value1.GetString();
173 wxString str2 = value2.GetString();
0be79c8a 174 int res = str1.Cmp( str2 );
cf283a47
RR
175 if (res) return res;
176 } else
ef427989
RR
177 if (value1.GetType() == wxT("long"))
178 {
179 long l1 = value1.GetLong();
180 long l2 = value2.GetLong();
cf283a47
RR
181 long res = l1-l2;
182 if (res) return res;
183 } else
ef427989
RR
184 if (value1.GetType() == wxT("double"))
185 {
186 double d1 = value1.GetDouble();
187 double d2 = value2.GetDouble();
ef427989 188 if (d1 < d2) return 1;
cf283a47
RR
189 if (d1 > d2) return -1;
190 } else
ef427989
RR
191 if (value1.GetType() == wxT("datetime"))
192 {
193 wxDateTime dt1 = value1.GetDateTime();
194 wxDateTime dt2 = value2.GetDateTime();
ef427989 195 if (dt1.IsEarlierThan(dt2)) return 1;
cf283a47 196 if (dt2.IsEarlierThan(dt1)) return -11;
ef427989
RR
197 }
198
cf283a47
RR
199 // items must be different
200 unsigned long litem1 = (unsigned long) item1.GetID();
201 unsigned long litem2 = (unsigned long) item2.GetID();
202
203 if (!m_ascending)
204 return litem2-litem1;
205 return litem1-litem2;
ef427989
RR
206}
207
f554a14b 208// ---------------------------------------------------------
baa9ebc4 209// wxDataViewRendererBase
f554a14b 210// ---------------------------------------------------------
6842a71a 211
baa9ebc4 212IMPLEMENT_ABSTRACT_CLASS(wxDataViewRendererBase, wxObject)
6842a71a 213
9861f022
RR
214wxDataViewRendererBase::wxDataViewRendererBase( const wxString &varianttype,
215 wxDataViewCellMode WXUNUSED(mode),
216 int WXUNUSED(align) )
6842a71a
RR
217{
218 m_variantType = varianttype;
1e510b1e 219 m_editorCtrl = NULL;
9861f022
RR
220}
221
222const wxDataViewCtrl* wxDataViewRendererBase::GetView() const
223{
224 return wx_const_cast(wxDataViewRendererBase*, this)->GetOwner()->GetOwner();
6842a71a 225}
f554a14b 226
e0062c04 227bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect labelRect )
1e510b1e 228{
e0062c04 229 m_item = item; // remember for later
1e510b1e
RR
230
231 unsigned int col = GetOwner()->GetModelColumn();
232 wxVariant value;
e0062c04 233 GetOwner()->GetOwner()->GetModel()->GetValue( value, item, col );
1e510b1e
RR
234
235 m_editorCtrl = CreateEditorCtrl( GetOwner()->GetOwner()->GetMainWindow(), labelRect, value );
236
30715fa1
RR
237 wxDataViewEditorCtrlEvtHandler *handler =
238 new wxDataViewEditorCtrlEvtHandler( m_editorCtrl, (wxDataViewRenderer*) this );
239
240 m_editorCtrl->PushEventHandler( handler );
1e510b1e 241
30715fa1
RR
242#if defined(__WXGTK20__) && !defined(wxUSE_GENERICDATAVIEWCTRL)
243 handler->SetFocusOnIdle();
244#else
1e510b1e 245 m_editorCtrl->SetFocus();
30715fa1
RR
246#endif
247
1e510b1e
RR
248 return true;
249}
250
251void wxDataViewRendererBase::CancelEditing()
252{
2fa73716 253 wxPendingDelete.Append( m_editorCtrl );
1e510b1e
RR
254
255 GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
2fa73716
RR
256
257 // m_editorCtrl->PopEventHandler( true );
1e510b1e
RR
258}
259
260bool wxDataViewRendererBase::FinishEditing()
261{
1e510b1e
RR
262 wxVariant value;
263 GetValueFromEditorCtrl( m_editorCtrl, value );
264
2fa73716 265 wxPendingDelete.Append( m_editorCtrl );
1e510b1e
RR
266
267 GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
268
269 if (!Validate(value))
270 return false;
271
272 unsigned int col = GetOwner()->GetModelColumn();
e0062c04
RR
273 GetOwner()->GetOwner()->GetModel()->SetValue( value, m_item, col );
274 GetOwner()->GetOwner()->GetModel()->ValueChanged( m_item, col );
1e510b1e 275
2fa73716
RR
276 // m_editorCtrl->PopEventHandler( true );
277
1e510b1e
RR
278 return true;
279}
280
281//-----------------------------------------------------------------------------
282// wxDataViewEditorCtrlEvtHandler
283//-----------------------------------------------------------------------------
284
285BEGIN_EVENT_TABLE(wxDataViewEditorCtrlEvtHandler, wxEvtHandler)
286 EVT_CHAR (wxDataViewEditorCtrlEvtHandler::OnChar)
287 EVT_KILL_FOCUS (wxDataViewEditorCtrlEvtHandler::OnKillFocus)
30715fa1 288 EVT_IDLE (wxDataViewEditorCtrlEvtHandler::OnIdle)
1e510b1e
RR
289END_EVENT_TABLE()
290
291wxDataViewEditorCtrlEvtHandler::wxDataViewEditorCtrlEvtHandler(
292 wxControl *editorCtrl,
293 wxDataViewRenderer *owner )
294{
295 m_owner = owner;
296 m_editorCtrl = editorCtrl;
297
298 m_finished = false;
299}
300
30715fa1
RR
301void wxDataViewEditorCtrlEvtHandler::OnIdle( wxIdleEvent &event )
302{
303 if (m_focusOnIdle)
304 {
305 m_focusOnIdle = false;
306 if (wxWindow::FindFocus() != m_editorCtrl)
307 m_editorCtrl->SetFocus();
308 }
309
310 event.Skip();
311}
312
1e510b1e
RR
313void wxDataViewEditorCtrlEvtHandler::OnChar( wxKeyEvent &event )
314{
315 switch ( event.m_keyCode )
316 {
317 case WXK_RETURN:
318 m_finished = true;
319 m_owner->FinishEditing();
320 break;
321
322 case WXK_ESCAPE:
323 m_finished = true;
324 m_owner->CancelEditing();
325 break;
326
327 default:
328 event.Skip();
329 }
330}
331
332void wxDataViewEditorCtrlEvtHandler::OnKillFocus( wxFocusEvent &event )
333{
334 if (!m_finished)
335 {
336 m_finished = true;
337 m_owner->FinishEditing();
338 }
339
1e510b1e
RR
340 event.Skip();
341}
342
f554a14b 343// ---------------------------------------------------------
fa28826d 344// wxDataViewColumnBase
f554a14b 345// ---------------------------------------------------------
fa28826d
RR
346
347IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumnBase, wxObject)
348
9861f022 349wxDataViewColumnBase::wxDataViewColumnBase(const wxString& WXUNUSED(title),
baa9ebc4 350 wxDataViewRenderer *renderer,
0a71f9e9 351 unsigned int model_column,
008b5a66 352 int WXUNUSED(width),
87f0efe2 353 wxAlignment WXUNUSED(align),
9861f022 354 int WXUNUSED(flags))
fa28826d 355{
baa9ebc4 356 m_renderer = renderer;
6842a71a 357 m_model_column = model_column;
6842a71a 358 m_owner = NULL;
baa9ebc4 359 m_renderer->SetOwner( (wxDataViewColumn*) this );
9861f022
RR
360
361 // NOTE: the wxDataViewColumn's ctor must store the width, align, flags
362 // parameters inside the native control!
6842a71a
RR
363}
364
07a84e7b
RR
365wxDataViewColumnBase::wxDataViewColumnBase(const wxBitmap& bitmap,
366 wxDataViewRenderer *renderer,
367 unsigned int model_column,
368 int WXUNUSED(width),
87f0efe2 369 wxAlignment WXUNUSED(align),
9861f022 370 int WXUNUSED(flags) )
07a84e7b
RR
371{
372 m_renderer = renderer;
373 m_model_column = model_column;
07a84e7b
RR
374 m_bitmap = bitmap;
375 m_owner = NULL;
376 m_renderer->SetOwner( (wxDataViewColumn*) this );
377}
378
6842a71a
RR
379wxDataViewColumnBase::~wxDataViewColumnBase()
380{
baa9ebc4
RR
381 if (m_renderer)
382 delete m_renderer;
fa28826d
RR
383}
384
9861f022 385int wxDataViewColumnBase::GetFlags() const
fa28826d 386{
9861f022 387 int ret = 0;
fa28826d 388
9861f022
RR
389 if (IsSortable())
390 ret |= wxDATAVIEW_COL_SORTABLE;
391 if (IsResizeable())
392 ret |= wxDATAVIEW_COL_RESIZABLE;
393 if (IsHidden())
394 ret |= wxDATAVIEW_COL_HIDDEN;
fa28826d 395
9861f022 396 return ret;
07a84e7b
RR
397}
398
9861f022 399void wxDataViewColumnBase::SetFlags(int flags)
07a84e7b 400{
9861f022
RR
401 SetSortable((flags & wxDATAVIEW_COL_SORTABLE) != 0);
402 SetResizeable((flags & wxDATAVIEW_COL_RESIZABLE) != 0);
403 SetHidden((flags & wxDATAVIEW_COL_HIDDEN) != 0);
07a84e7b
RR
404}
405
1821abd1 406// ---------------------------------------------------------
e0062c04 407// wxDataViewEventModelNotifier
1821abd1
RR
408// ---------------------------------------------------------
409
e0062c04 410class WXDLLIMPEXP_ADV wxDataViewEventModelNotifier: public wxDataViewModelNotifier
1821abd1
RR
411{
412public:
e0062c04 413 wxDataViewEventModelNotifier( wxDataViewCtrl *ctrl ) { m_ctrl = ctrl; }
1821abd1 414
e0062c04 415 bool SendEvent( wxEventType event_type, const wxDataViewItem &item, unsigned int col = 0 )
1821abd1
RR
416 {
417 wxDataViewEvent event( event_type, m_ctrl->GetId() );
418 event.SetEventObject( m_ctrl );
419 event.SetModel( m_ctrl->GetModel() );
e0062c04 420 event.SetItem( item );
1821abd1
RR
421 event.SetColumn( col );
422 m_ctrl->GetEventHandler()->ProcessEvent( event );
423 return true;
424 }
425
e0062c04
RR
426 virtual bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item )
427 { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_ADDED, item ); }
428 virtual bool ItemDeleted( const wxDataViewItem &item )
429 { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_DELETED, item ); }
430 virtual bool ItemChanged( const wxDataViewItem &item )
431 { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_CHANGED, item ); }
432 virtual bool ValueChanged( const wxDataViewItem &item, unsigned int col )
433 { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_VALUE_CHANGED, item, col ); }
434 virtual bool Cleared()
435 { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_CLEARED, wxDataViewItem(0) ); }
1821abd1
RR
436
437private:
438 wxDataViewCtrl *m_ctrl;
439};
440
9861f022 441
f554a14b 442// ---------------------------------------------------------
239eaa41 443// wxDataViewCtrlBase
f554a14b 444// ---------------------------------------------------------
239eaa41
RR
445
446IMPLEMENT_ABSTRACT_CLASS(wxDataViewCtrlBase, wxControl)
447
448wxDataViewCtrlBase::wxDataViewCtrlBase()
449{
450 m_model = NULL;
fa28826d 451 m_cols.DeleteContents( true );
1821abd1 452 m_eventNotifier = NULL;
3b6280be
RR
453 m_expander_column = 0;
454 m_indent = 8;
239eaa41
RR
455}
456
457wxDataViewCtrlBase::~wxDataViewCtrlBase()
458{
87f0efe2
RR
459 // IMPORTANT: before calling DecRef() on our model (since it may
460 // result in a free() call), erase all columns (since
461 // they hold a pointer to our model)
462 m_cols.Clear();
463
464 if (m_model)
465 {
1821abd1
RR
466 if (m_eventNotifier)
467 m_model->RemoveNotifier( m_eventNotifier );
468 m_eventNotifier = NULL;
469
87f0efe2
RR
470 m_model->DecRef();
471 m_model = NULL;
472 }
239eaa41
RR
473}
474
e0062c04 475bool wxDataViewCtrlBase::AssociateModel( wxDataViewModel *model )
239eaa41 476{
1821abd1
RR
477 if (m_model)
478 {
479 if (m_eventNotifier)
480 m_model->RemoveNotifier( m_eventNotifier );
481 m_eventNotifier = NULL;
482
87f0efe2 483 m_model->DecRef(); // discard old model, if any
1821abd1 484 }
87f0efe2
RR
485
486 // add our own reference to the new model:
239eaa41 487 m_model = model;
1821abd1
RR
488 if (m_model)
489 {
87f0efe2 490 m_model->IncRef();
e0062c04 491 m_eventNotifier = new wxDataViewEventModelNotifier( (wxDataViewCtrl*) this );
1821abd1
RR
492 m_model->AddNotifier( m_eventNotifier );
493 }
f554a14b 494
239eaa41
RR
495 return true;
496}
497
e0062c04 498wxDataViewModel* wxDataViewCtrlBase::GetModel()
239eaa41
RR
499{
500 return m_model;
501}
502
1286b7ba 503bool wxDataViewCtrlBase::AppendTextColumn( const wxString &label, unsigned int model_column,
87f0efe2 504 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
fa28826d 505{
1286b7ba 506 return AppendColumn( new wxDataViewColumn( label,
9861f022
RR
507 new wxDataViewTextRenderer( wxT("string"), mode, (int)align ),
508 model_column, width, align, flags ) );
fa28826d
RR
509}
510
1286b7ba 511bool wxDataViewCtrlBase::AppendToggleColumn( const wxString &label, unsigned int model_column,
87f0efe2 512 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
605c2c4a 513{
1286b7ba 514 return AppendColumn( new wxDataViewColumn( label,
9861f022
RR
515 new wxDataViewToggleRenderer( wxT("bool"), mode, (int)align ),
516 model_column, width, align, flags ) );
605c2c4a
RR
517}
518
1286b7ba 519bool wxDataViewCtrlBase::AppendProgressColumn( const wxString &label, unsigned int model_column,
87f0efe2 520 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
ad63bf41 521{
1286b7ba 522 return AppendColumn( new wxDataViewColumn( label,
9861f022
RR
523 new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode, (int)align ),
524 model_column, width, align, flags ) );
ad63bf41
RR
525}
526
1286b7ba 527bool wxDataViewCtrlBase::AppendDateColumn( const wxString &label, unsigned int model_column,
87f0efe2 528 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
4d496ecb 529{
1286b7ba 530 return AppendColumn( new wxDataViewColumn( label,
9861f022
RR
531 new wxDataViewDateRenderer( wxT("datetime"), mode, (int)align ),
532 model_column, width, align, flags ) );
4d496ecb
RR
533}
534
1286b7ba 535bool wxDataViewCtrlBase::AppendBitmapColumn( const wxString &label, unsigned int model_column,
87f0efe2 536 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
07a84e7b 537{
1286b7ba 538 return AppendColumn( new wxDataViewColumn( label,
9861f022
RR
539 new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode, (int)align ),
540 model_column, width, align, flags ) );
07a84e7b
RR
541}
542
1286b7ba 543bool wxDataViewCtrlBase::AppendTextColumn( const wxBitmap &label, unsigned int model_column,
87f0efe2 544 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
07a84e7b 545{
1286b7ba 546 return AppendColumn( new wxDataViewColumn( label,
9861f022
RR
547 new wxDataViewTextRenderer( wxT("string"), mode, (int)align ),
548 model_column, width, align, flags ) );
07a84e7b
RR
549}
550
1286b7ba 551bool wxDataViewCtrlBase::AppendToggleColumn( const wxBitmap &label, unsigned int model_column,
87f0efe2 552 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
07a84e7b 553{
1286b7ba 554 return AppendColumn( new wxDataViewColumn( label,
9861f022
RR
555 new wxDataViewToggleRenderer( wxT("bool"), mode, (int)align ),
556 model_column, width, align, flags ) );
07a84e7b
RR
557}
558
1286b7ba 559bool wxDataViewCtrlBase::AppendProgressColumn( const wxBitmap &label, unsigned int model_column,
87f0efe2 560 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
07a84e7b 561{
1286b7ba 562 return AppendColumn( new wxDataViewColumn( label,
9861f022
RR
563 new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode, (int)align ),
564 model_column, width, align, flags ) );
07a84e7b
RR
565}
566
1286b7ba 567bool wxDataViewCtrlBase::AppendDateColumn( const wxBitmap &label, unsigned int model_column,
87f0efe2 568 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
07a84e7b 569{
1286b7ba 570 return AppendColumn( new wxDataViewColumn( label,
9861f022
RR
571 new wxDataViewDateRenderer( wxT("datetime"), mode, (int)align ),
572 model_column, width, align, flags ) );
07a84e7b
RR
573}
574
1286b7ba 575bool wxDataViewCtrlBase::AppendBitmapColumn( const wxBitmap &label, unsigned int model_column,
87f0efe2 576 wxDataViewCellMode mode, int width, wxAlignment align, int flags )
07a84e7b 577{
1286b7ba 578 return AppendColumn( new wxDataViewColumn( label,
9861f022
RR
579 new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode, (int)align ),
580 model_column, width, align, flags ) );
07a84e7b
RR
581}
582
fa28826d
RR
583bool wxDataViewCtrlBase::AppendColumn( wxDataViewColumn *col )
584{
585 m_cols.Append( (wxObject*) col );
6842a71a 586 col->SetOwner( (wxDataViewCtrl*) this );
fa28826d
RR
587 return true;
588}
589
9861f022 590unsigned int wxDataViewCtrlBase::GetColumnCount() const
fa28826d
RR
591{
592 return m_cols.GetCount();
593}
594
0a71f9e9 595bool wxDataViewCtrlBase::DeleteColumn( unsigned int WXUNUSED(pos) )
fa28826d
RR
596{
597 return false;
598}
599
600bool wxDataViewCtrlBase::ClearColumns()
601{
602 return false;
603}
604
0a71f9e9 605wxDataViewColumn* wxDataViewCtrlBase::GetColumn( unsigned int pos )
fa28826d
RR
606{
607 return (wxDataViewColumn*) m_cols[ pos ];
608}
609
eb7f97f8
RR
610// ---------------------------------------------------------
611// wxDataViewEvent
612// ---------------------------------------------------------
613
614IMPLEMENT_DYNAMIC_CLASS(wxDataViewEvent,wxNotifyEvent)
615
e0062c04
RR
616DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_SELECTED)
617DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED)
31fb32e1
RR
618DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK)
619DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK)
c0a66d92 620DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED)
eb7f97f8 621
e0062c04
RR
622DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_ADDED)
623DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_DELETED)
624DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_CHANGED)
1821abd1 625DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_VALUE_CHANGED)
1821abd1 626DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_CLEARED)
eb7f97f8 627
8045736e 628#endif