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 bool operator == (const wxDataViewItem
&left
, const wxDataViewItem
&right
)
31 return (left
.GetID() == right
.GetID() );
35 // ---------------------------------------------------------
36 // wxDataViewModelNotifier
37 // ---------------------------------------------------------
39 #include "wx/listimpl.cpp"
40 WX_DEFINE_LIST(wxDataViewModelNotifiers
);
42 bool wxDataViewModelNotifier::ItemsAdded( const wxDataViewItem
&parent
, const wxDataViewItemArray
&items
)
44 size_t count
= items
.GetCount();
46 for (i
= 0; i
< count
; i
++)
47 if (!ItemAdded( parent
, items
[i
] )) return false;
52 bool wxDataViewModelNotifier::ItemsDeleted( const wxDataViewItem
&parent
, const wxDataViewItemArray
&items
)
54 size_t count
= items
.GetCount();
56 for (i
= 0; i
< count
; i
++)
57 if (!ItemDeleted( parent
, items
[i
] )) return false;
62 bool wxDataViewModelNotifier::ItemsChanged( const wxDataViewItemArray
&items
)
64 size_t count
= items
.GetCount();
66 for (i
= 0; i
< count
; i
++)
67 if (!ItemChanged( items
[i
] )) return false;
72 // ---------------------------------------------------------
74 // ---------------------------------------------------------
76 wxDataViewModel::wxDataViewModel()
78 m_notifiers
.DeleteContents( true );
81 bool wxDataViewModel::ItemAdded( const wxDataViewItem
&parent
, const wxDataViewItem
&item
)
85 wxDataViewModelNotifiers::iterator iter
;
86 for (iter
= m_notifiers
.begin(); iter
!= m_notifiers
.end(); ++iter
)
88 wxDataViewModelNotifier
* notifier
= *iter
;
89 if (!notifier
->ItemAdded( parent
, item
))
96 bool wxDataViewModel::ItemDeleted( const wxDataViewItem
&parent
, const wxDataViewItem
&item
)
100 wxDataViewModelNotifiers::iterator iter
;
101 for (iter
= m_notifiers
.begin(); iter
!= m_notifiers
.end(); ++iter
)
103 wxDataViewModelNotifier
* notifier
= *iter
;
104 if (!notifier
->ItemDeleted( parent
, item
))
111 bool wxDataViewModel::ItemChanged( const wxDataViewItem
&item
)
115 wxDataViewModelNotifiers::iterator iter
;
116 for (iter
= m_notifiers
.begin(); iter
!= m_notifiers
.end(); ++iter
)
118 wxDataViewModelNotifier
* notifier
= *iter
;
119 if (!notifier
->ItemChanged( item
))
126 bool wxDataViewModel::ItemsAdded( const wxDataViewItem
&parent
, const wxDataViewItemArray
&items
)
130 wxDataViewModelNotifiers::iterator iter
;
131 for (iter
= m_notifiers
.begin(); iter
!= m_notifiers
.end(); ++iter
)
133 wxDataViewModelNotifier
* notifier
= *iter
;
134 if (!notifier
->ItemsAdded( parent
, items
))
141 bool wxDataViewModel::ItemsDeleted( const wxDataViewItem
&parent
, const wxDataViewItemArray
&items
)
145 wxDataViewModelNotifiers::iterator iter
;
146 for (iter
= m_notifiers
.begin(); iter
!= m_notifiers
.end(); ++iter
)
148 wxDataViewModelNotifier
* notifier
= *iter
;
149 if (!notifier
->ItemsDeleted( parent
, items
))
156 bool wxDataViewModel::ItemsChanged( const wxDataViewItemArray
&items
)
160 wxDataViewModelNotifiers::iterator iter
;
161 for (iter
= m_notifiers
.begin(); iter
!= m_notifiers
.end(); ++iter
)
163 wxDataViewModelNotifier
* notifier
= *iter
;
164 if (!notifier
->ItemsChanged( items
))
171 bool wxDataViewModel::ValueChanged( const wxDataViewItem
&item
, unsigned int col
)
175 wxDataViewModelNotifiers::iterator iter
;
176 for (iter
= m_notifiers
.begin(); iter
!= m_notifiers
.end(); ++iter
)
178 wxDataViewModelNotifier
* notifier
= *iter
;
179 if (!notifier
->ValueChanged( item
, col
))
186 bool wxDataViewModel::Cleared()
190 wxDataViewModelNotifiers::iterator iter
;
191 for (iter
= m_notifiers
.begin(); iter
!= m_notifiers
.end(); ++iter
)
193 wxDataViewModelNotifier
* notifier
= *iter
;
194 if (!notifier
->Cleared())
201 void wxDataViewModel::Resort()
203 wxDataViewModelNotifiers::iterator iter
;
204 for (iter
= m_notifiers
.begin(); iter
!= m_notifiers
.end(); ++iter
)
206 wxDataViewModelNotifier
* notifier
= *iter
;
211 void wxDataViewModel::AddNotifier( wxDataViewModelNotifier
*notifier
)
213 m_notifiers
.push_back( notifier
);
214 notifier
->SetOwner( this );
217 void wxDataViewModel::RemoveNotifier( wxDataViewModelNotifier
*notifier
)
219 m_notifiers
.DeleteObject( notifier
);
222 int wxDataViewModel::Compare( const wxDataViewItem
&item1
, const wxDataViewItem
&item2
,
223 unsigned int column
, bool ascending
)
225 // sort branches before leaves
226 bool item1_is_container
= IsContainer(item1
);
227 bool item2_is_container
= IsContainer(item2
);
229 if (item1_is_container
&& !item2_is_container
)
231 if (item2_is_container
&& !item1_is_container
)
234 wxVariant value1
,value2
;
235 GetValue( value1
, item1
, column
);
236 GetValue( value2
, item2
, column
);
240 wxVariant temp
= value1
;
245 if (value1
.GetType() == wxT("string"))
247 wxString str1
= value1
.GetString();
248 wxString str2
= value2
.GetString();
249 int res
= str1
.Cmp( str2
);
252 if (value1
.GetType() == wxT("long"))
254 long l1
= value1
.GetLong();
255 long l2
= value2
.GetLong();
259 if (value1
.GetType() == wxT("double"))
261 double d1
= value1
.GetDouble();
262 double d2
= value2
.GetDouble();
263 if (d1
< d2
) return 1;
264 if (d1
> d2
) return -1;
266 if (value1
.GetType() == wxT("datetime"))
268 wxDateTime dt1
= value1
.GetDateTime();
269 wxDateTime dt2
= value2
.GetDateTime();
270 if (dt1
.IsEarlierThan(dt2
)) return 1;
271 if (dt2
.IsEarlierThan(dt1
)) return -11;
274 // items must be different
275 unsigned long litem1
= (unsigned long) item1
.GetID();
276 unsigned long litem2
= (unsigned long) item2
.GetID();
279 return litem2
-litem2
;
281 return litem1
-litem2
;
284 // ---------------------------------------------------------
285 // wxDataViewIndexListModel
286 // ---------------------------------------------------------
288 wxDataViewIndexListModel::wxDataViewIndexListModel( unsigned int initial_size
)
290 // build initial index
292 for (i
= 1; i
< initial_size
+1; i
++)
293 m_hash
.Add( (void*) i
);
294 m_lastIndex
= initial_size
+ 1;
297 wxDataViewIndexListModel::~wxDataViewIndexListModel()
301 void wxDataViewIndexListModel::RowPrepended()
303 unsigned int id
= m_lastIndex
++;
304 m_hash
.Insert( (void*) id
, 0 );
305 wxDataViewItem
item( (void*) id
);
306 ItemAdded( wxDataViewItem(0), item
);
309 void wxDataViewIndexListModel::RowInserted( unsigned int before
)
311 unsigned int id
= m_lastIndex
++;
312 m_hash
.Insert( (void*) id
, before
);
313 wxDataViewItem
item( (void*) id
);
314 ItemAdded( wxDataViewItem(0), item
);
317 void wxDataViewIndexListModel::RowAppended()
319 unsigned int id
= m_lastIndex
++;
320 m_hash
.Add( (void*) id
);
321 wxDataViewItem
item( (void*) id
);
322 ItemAdded( wxDataViewItem(0), item
);
325 void wxDataViewIndexListModel::RowDeleted( unsigned int row
)
327 wxDataViewItem
item( m_hash
[row
] );
328 wxDataViewModel::ItemDeleted( wxDataViewItem(0), item
);
329 m_hash
.RemoveAt( row
);
332 void wxDataViewIndexListModel::RowChanged( unsigned int row
)
334 wxDataViewModel::ItemChanged( GetItem(row
) );
337 void wxDataViewIndexListModel::RowValueChanged( unsigned int row
, unsigned int col
)
339 wxDataViewModel::ValueChanged( GetItem(row
), col
);
342 unsigned int wxDataViewIndexListModel::GetRow( const wxDataViewItem
&item
) const
344 // assert for not found
345 return (unsigned int) m_hash
.Index( item
.GetID() );
348 wxDataViewItem
wxDataViewIndexListModel::GetItem( unsigned int row
) const
350 wxASSERT( row
< m_hash
.GetCount() );
351 return wxDataViewItem( m_hash
[row
] );
354 int wxDataViewIndexListModel::Compare(const wxDataViewItem
& item1
,
355 const wxDataViewItem
& item2
,
356 unsigned int WXUNUSED(column
),
360 return GetRow(item1
) - GetRow(item2
);
362 return GetRow(item2
) - GetRow(item1
);
365 void wxDataViewIndexListModel::GetValue( wxVariant
&variant
,
366 const wxDataViewItem
&item
, unsigned int col
) const
368 GetValue( variant
, GetRow(item
), col
);
371 bool wxDataViewIndexListModel::SetValue( const wxVariant
&variant
,
372 const wxDataViewItem
&item
, unsigned int col
)
374 return SetValue( variant
, GetRow(item
), col
);
377 wxDataViewItem
wxDataViewIndexListModel::GetParent( const wxDataViewItem
& WXUNUSED(item
) ) const
379 return wxDataViewItem(0);
382 bool wxDataViewIndexListModel::IsContainer( const wxDataViewItem
&item
) const
384 // only the invisible root item has children
391 unsigned int wxDataViewIndexListModel::GetChildren( const wxDataViewItem
&item
, wxDataViewItemArray
&children
) const
398 return m_hash
.GetCount();
401 //-----------------------------------------------------------------------------
402 // wxDataViewIconText
403 //-----------------------------------------------------------------------------
405 IMPLEMENT_DYNAMIC_CLASS(wxDataViewIconText
,wxObject
)
407 IMPLEMENT_VARIANT_OBJECT(wxDataViewIconText
)
409 bool operator == (const wxDataViewIconText
&one
, const wxDataViewIconText
&two
)
411 if (one
.GetText() != two
.GetText()) return false;
412 if (one
.IsSameAs(two
)) return false;
416 // ---------------------------------------------------------
417 // wxDataViewRendererBase
418 // ---------------------------------------------------------
420 IMPLEMENT_ABSTRACT_CLASS(wxDataViewRendererBase
, wxObject
)
422 wxDataViewRendererBase::wxDataViewRendererBase( const wxString
&varianttype
,
423 wxDataViewCellMode
WXUNUSED(mode
),
424 int WXUNUSED(align
) )
426 m_variantType
= varianttype
;
430 const wxDataViewCtrl
* wxDataViewRendererBase::GetView() const
432 return wx_const_cast(wxDataViewRendererBase
*, this)->GetOwner()->GetOwner();
435 bool wxDataViewRendererBase::StartEditing( const wxDataViewItem
&item
, wxRect labelRect
)
437 m_item
= item
; // remember for later
439 unsigned int col
= GetOwner()->GetModelColumn();
441 GetOwner()->GetOwner()->GetModel()->GetValue( value
, item
, col
);
443 m_editorCtrl
= CreateEditorCtrl( GetOwner()->GetOwner()->GetMainWindow(), labelRect
, value
);
445 wxDataViewEditorCtrlEvtHandler
*handler
=
446 new wxDataViewEditorCtrlEvtHandler( m_editorCtrl
, (wxDataViewRenderer
*) this );
448 m_editorCtrl
->PushEventHandler( handler
);
450 #if defined(__WXGTK20__) && !defined(wxUSE_GENERICDATAVIEWCTRL)
451 handler
->SetFocusOnIdle();
453 m_editorCtrl
->SetFocus();
456 // Now we should send Editing Started event
457 wxDataViewEvent
event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED
, GetOwner()->GetOwner()->GetId() );
458 event
.SetDataViewColumn( GetOwner() );
459 event
.SetModel( GetOwner()->GetOwner()->GetModel() );
460 event
.SetItem( item
);
461 GetOwner()->GetOwner()->GetEventHandler()->ProcessEvent( event
);
466 void wxDataViewRendererBase::CancelEditing()
468 wxPendingDelete
.Append( m_editorCtrl
);
470 GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
472 // m_editorCtrl->PopEventHandler( true );
475 bool wxDataViewRendererBase::FinishEditing()
478 GetValueFromEditorCtrl( m_editorCtrl
, value
);
480 wxPendingDelete
.Append( m_editorCtrl
);
482 GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
484 if (!Validate(value
))
487 unsigned int col
= GetOwner()->GetModelColumn();
488 GetOwner()->GetOwner()->GetModel()->SetValue( value
, m_item
, col
);
489 GetOwner()->GetOwner()->GetModel()->ValueChanged( m_item
, col
);
491 // m_editorCtrl->PopEventHandler( true );
493 // Now we should send Editing Done event
494 wxDataViewEvent
event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE
, GetOwner()->GetOwner()->GetId() );
495 event
.SetDataViewColumn( GetOwner() );
496 event
.SetModel( GetOwner()->GetOwner()->GetModel() );
497 event
.SetItem( m_item
);
498 GetOwner()->GetOwner()->GetEventHandler()->ProcessEvent( event
);
503 //-----------------------------------------------------------------------------
504 // wxDataViewEditorCtrlEvtHandler
505 //-----------------------------------------------------------------------------
507 BEGIN_EVENT_TABLE(wxDataViewEditorCtrlEvtHandler
, wxEvtHandler
)
508 EVT_CHAR (wxDataViewEditorCtrlEvtHandler::OnChar
)
509 EVT_KILL_FOCUS (wxDataViewEditorCtrlEvtHandler::OnKillFocus
)
510 EVT_IDLE (wxDataViewEditorCtrlEvtHandler::OnIdle
)
513 wxDataViewEditorCtrlEvtHandler::wxDataViewEditorCtrlEvtHandler(
514 wxControl
*editorCtrl
,
515 wxDataViewRenderer
*owner
)
518 m_editorCtrl
= editorCtrl
;
523 void wxDataViewEditorCtrlEvtHandler::OnIdle( wxIdleEvent
&event
)
527 m_focusOnIdle
= false;
528 if (wxWindow::FindFocus() != m_editorCtrl
)
529 m_editorCtrl
->SetFocus();
535 void wxDataViewEditorCtrlEvtHandler::OnChar( wxKeyEvent
&event
)
537 switch ( event
.m_keyCode
)
541 m_owner
->FinishEditing();
546 m_owner
->CancelEditing();
554 void wxDataViewEditorCtrlEvtHandler::OnKillFocus( wxFocusEvent
&event
)
559 m_owner
->FinishEditing();
565 // ---------------------------------------------------------
566 // wxDataViewColumnBase
567 // ---------------------------------------------------------
569 IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumnBase
, wxObject
)
571 wxDataViewColumnBase::wxDataViewColumnBase(const wxString
& WXUNUSED(title
),
572 wxDataViewRenderer
*renderer
,
573 unsigned int model_column
,
575 wxAlignment
WXUNUSED(align
),
578 m_renderer
= renderer
;
579 m_model_column
= model_column
;
581 m_renderer
->SetOwner( (wxDataViewColumn
*) this );
583 // NOTE: the wxDataViewColumn's ctor must store the width, align, flags
584 // parameters inside the native control!
587 wxDataViewColumnBase::wxDataViewColumnBase(const wxBitmap
& bitmap
,
588 wxDataViewRenderer
*renderer
,
589 unsigned int model_column
,
591 wxAlignment
WXUNUSED(align
),
592 int WXUNUSED(flags
) )
594 m_renderer
= renderer
;
595 m_model_column
= model_column
;
598 m_renderer
->SetOwner( (wxDataViewColumn
*) this );
601 wxDataViewColumnBase::~wxDataViewColumnBase()
607 int wxDataViewColumnBase::GetFlags() const
612 ret
|= wxDATAVIEW_COL_SORTABLE
;
614 ret
|= wxDATAVIEW_COL_RESIZABLE
;
616 ret
|= wxDATAVIEW_COL_HIDDEN
;
621 void wxDataViewColumnBase::SetFlags(int flags
)
623 SetSortable((flags
& wxDATAVIEW_COL_SORTABLE
) != 0);
624 SetResizeable((flags
& wxDATAVIEW_COL_RESIZABLE
) != 0);
625 SetHidden((flags
& wxDATAVIEW_COL_HIDDEN
) != 0);
628 // ---------------------------------------------------------
629 // wxDataViewCtrlBase
630 // ---------------------------------------------------------
632 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCtrlBase
, wxControl
)
634 wxDataViewCtrlBase::wxDataViewCtrlBase()
637 m_expander_column
= 0;
641 wxDataViewCtrlBase::~wxDataViewCtrlBase()
650 bool wxDataViewCtrlBase::AssociateModel( wxDataViewModel
*model
)
654 m_model
->DecRef(); // discard old model, if any
657 // add our own reference to the new model:
667 wxDataViewModel
* wxDataViewCtrlBase::GetModel()
673 wxDataViewCtrlBase::AppendTextColumn( const wxString
&label
, unsigned int model_column
,
674 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
676 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
677 new wxDataViewTextRenderer( wxT("string"), mode
, (int)align
),
678 model_column
, width
, align
, flags
);
684 wxDataViewCtrlBase::AppendIconTextColumn( const wxString
&label
, unsigned int model_column
,
685 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
687 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
688 new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode
, (int)align
),
689 model_column
, width
, align
, flags
);
695 wxDataViewCtrlBase::AppendToggleColumn( const wxString
&label
, unsigned int model_column
,
696 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
699 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
700 new wxDataViewToggleRenderer( wxT("bool"), mode
, (int)align
),
701 model_column
, width
, align
, flags
);
707 wxDataViewCtrlBase::AppendProgressColumn( const wxString
&label
, unsigned int model_column
,
708 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
710 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
711 new wxDataViewProgressRenderer( wxEmptyString
, wxT("long"), mode
, (int)align
),
712 model_column
, width
, align
, flags
);
718 wxDataViewCtrlBase::AppendDateColumn( const wxString
&label
, unsigned int model_column
,
719 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
721 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
722 new wxDataViewDateRenderer( wxT("datetime"), mode
, (int)align
),
723 model_column
, width
, align
, flags
);
729 wxDataViewCtrlBase::AppendBitmapColumn( const wxString
&label
, unsigned int model_column
,
730 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
732 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
733 new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode
, (int)align
),
734 model_column
, width
, align
, flags
);
740 wxDataViewCtrlBase::AppendTextColumn( const wxBitmap
&label
, unsigned int model_column
,
741 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
743 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
744 new wxDataViewTextRenderer( wxT("string"), mode
, (int)align
),
745 model_column
, width
, align
, flags
);
751 wxDataViewCtrlBase::AppendIconTextColumn( const wxBitmap
&label
, unsigned int model_column
,
752 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
754 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
755 new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode
, (int)align
),
756 model_column
, width
, align
, flags
);
762 wxDataViewCtrlBase::AppendToggleColumn( const wxBitmap
&label
, unsigned int model_column
,
763 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
765 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
766 new wxDataViewToggleRenderer( wxT("bool"), mode
, (int)align
),
767 model_column
, width
, align
, flags
);
773 wxDataViewCtrlBase::AppendProgressColumn( const wxBitmap
&label
, unsigned int model_column
,
774 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
776 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
777 new wxDataViewProgressRenderer( wxEmptyString
, wxT("long"), mode
, (int)align
),
778 model_column
, width
, align
, flags
);
784 wxDataViewCtrlBase::AppendDateColumn( const wxBitmap
&label
, unsigned int model_column
,
785 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
787 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
788 new wxDataViewDateRenderer( wxT("datetime"), mode
, (int)align
),
789 model_column
, width
, align
, flags
);
795 wxDataViewCtrlBase::AppendBitmapColumn( const wxBitmap
&label
, unsigned int model_column
,
796 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
798 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
799 new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode
, (int)align
),
800 model_column
, width
, align
, flags
);
806 wxDataViewCtrlBase::AppendColumn( wxDataViewColumn
*col
)
808 col
->SetOwner( (wxDataViewCtrl
*) this );
812 // ---------------------------------------------------------
814 // ---------------------------------------------------------
816 IMPLEMENT_DYNAMIC_CLASS(wxDataViewEvent
,wxNotifyEvent
)
818 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED
)
820 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED
)
821 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING
)
822 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED
)
823 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING
)
824 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED
)
825 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED
)
826 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE
)
827 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED
)
829 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK
)
830 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK
)
831 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED
)