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"
24 #include "wx/settings.h"
29 #include "wx/spinctrl.h"
30 #include "wx/choice.h"
31 #include "wx/imaglist.h"
33 const char wxDataViewCtrlNameStr
[] = "dataviewCtrl";
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
) const
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
);
253 else if (value1
.GetType() == wxT("long"))
255 long l1
= value1
.GetLong();
256 long l2
= value2
.GetLong();
261 else if (value1
.GetType() == wxT("double"))
263 double d1
= value1
.GetDouble();
264 double d2
= value2
.GetDouble();
270 else if (value1
.GetType() == wxT("datetime"))
272 wxDateTime dt1
= value1
.GetDateTime();
273 wxDateTime dt2
= value2
.GetDateTime();
274 if (dt1
.IsEarlierThan(dt2
))
276 if (dt2
.IsEarlierThan(dt1
))
280 // items must be different
281 wxUIntPtr id1
= wxPtrToUInt(item1
.GetID()),
282 id2
= wxPtrToUInt(item2
.GetID());
284 return ascending
? id1
- id2
: id2
- id1
;
287 // ---------------------------------------------------------
288 // wxDataViewIndexListModel
289 // ---------------------------------------------------------
291 static int my_sort( int *v1
, int *v2
)
297 wxDataViewIndexListModel::wxDataViewIndexListModel( unsigned int initial_size
)
299 // IDs are ordered until an item gets deleted or inserted
302 // build initial index
304 for (i
= 1; i
< initial_size
+1; i
++)
305 m_hash
.Add( wxUIntToPtr(i
) );
306 m_nextFreeID
= initial_size
+ 1;
309 void wxDataViewIndexListModel::Reset( unsigned int new_size
)
313 // IDs are ordered until an item gets deleted or inserted
316 // build initial index
318 for (i
= 1; i
< new_size
+1; i
++)
319 m_hash
.Add( wxUIntToPtr(i
) );
321 m_nextFreeID
= new_size
+ 1;
323 wxDataViewModel::Cleared();
326 void wxDataViewIndexListModel::RowPrepended()
330 unsigned int id
= m_nextFreeID
;
333 m_hash
.Insert( wxUIntToPtr(id
), 0 );
334 wxDataViewItem
item( wxUIntToPtr(id
) );
335 ItemAdded( wxDataViewItem(0), item
);
339 void wxDataViewIndexListModel::RowInserted( unsigned int before
)
343 unsigned int id
= m_nextFreeID
;
346 m_hash
.Insert( wxUIntToPtr(id
), before
);
347 wxDataViewItem
item( wxUIntToPtr(id
) );
348 ItemAdded( wxDataViewItem(0), item
);
351 void wxDataViewIndexListModel::RowAppended()
353 unsigned int id
= m_nextFreeID
;
356 m_hash
.Add( wxUIntToPtr(id
) );
357 wxDataViewItem
item( wxUIntToPtr(id
) );
358 ItemAdded( wxDataViewItem(0), item
);
361 void wxDataViewIndexListModel::RowDeleted( unsigned int row
)
365 wxDataViewItem
item( m_hash
[row
] );
366 wxDataViewModel::ItemDeleted( wxDataViewItem(0), item
);
367 m_hash
.RemoveAt( row
);
370 void wxDataViewIndexListModel::RowsDeleted( const wxArrayInt
&rows
)
372 wxArrayInt sorted
= rows
;
373 sorted
.Sort( my_sort
);
377 wxDataViewItemArray array
;
379 for (i
= 0; i
< rows
.GetCount(); i
++)
381 wxDataViewItem
item( m_hash
[rows
[i
]] );
384 wxDataViewModel::ItemsDeleted( wxDataViewItem(0), array
);
386 for (i
= 0; i
< sorted
.GetCount(); i
++)
387 m_hash
.RemoveAt( sorted
[i
] );
390 void wxDataViewIndexListModel::RowChanged( unsigned int row
)
392 wxDataViewModel::ItemChanged( GetItem(row
) );
395 void wxDataViewIndexListModel::RowValueChanged( unsigned int row
, unsigned int col
)
397 wxDataViewModel::ValueChanged( GetItem(row
), col
);
400 unsigned int wxDataViewIndexListModel::GetRow( const wxDataViewItem
&item
) const
403 return wxPtrToUInt(item
.GetID())-1;
405 // assert for not found
406 return (unsigned int) m_hash
.Index( item
.GetID() );
409 wxDataViewItem
wxDataViewIndexListModel::GetItem( unsigned int row
) const
411 wxASSERT( row
< m_hash
.GetCount() );
412 return wxDataViewItem( m_hash
[row
] );
415 bool wxDataViewIndexListModel::HasDefaultCompare() const
420 int wxDataViewIndexListModel::Compare(const wxDataViewItem
& item1
,
421 const wxDataViewItem
& item2
,
422 unsigned int WXUNUSED(column
),
423 bool ascending
) const
427 unsigned int pos1
= wxPtrToUInt(item1
.GetID()); // -1 not needed here
428 unsigned int pos2
= wxPtrToUInt(item2
.GetID()); // -1 not needed here
437 return GetRow(item1
) - GetRow(item2
);
439 return GetRow(item2
) - GetRow(item1
);
442 unsigned int wxDataViewIndexListModel::GetChildren( const wxDataViewItem
&item
, wxDataViewItemArray
&children
) const
449 return m_hash
.GetCount();
452 // ---------------------------------------------------------
453 // wxDataViewVirtualListModel
454 // ---------------------------------------------------------
458 wxDataViewVirtualListModel::wxDataViewVirtualListModel( unsigned int initial_size
)
460 m_size
= initial_size
;
463 void wxDataViewVirtualListModel::Reset( unsigned int new_size
)
467 wxDataViewModel::Cleared();
470 void wxDataViewVirtualListModel::RowPrepended()
473 wxDataViewItem
item( wxUIntToPtr(1) );
474 ItemAdded( wxDataViewItem(0), item
);
477 void wxDataViewVirtualListModel::RowInserted( unsigned int before
)
480 wxDataViewItem
item( wxUIntToPtr(before
+1) );
481 ItemAdded( wxDataViewItem(0), item
);
484 void wxDataViewVirtualListModel::RowAppended()
487 wxDataViewItem
item( wxUIntToPtr(m_size
) );
488 ItemAdded( wxDataViewItem(0), item
);
491 void wxDataViewVirtualListModel::RowDeleted( unsigned int row
)
494 wxDataViewItem
item( wxUIntToPtr(row
+1) );
495 wxDataViewModel::ItemDeleted( wxDataViewItem(0), item
);
498 void wxDataViewVirtualListModel::RowsDeleted( const wxArrayInt
&rows
)
500 m_size
-= rows
.GetCount();
502 wxArrayInt sorted
= rows
;
503 sorted
.Sort( my_sort
);
505 wxDataViewItemArray array
;
507 for (i
= 0; i
< sorted
.GetCount(); i
++)
509 wxDataViewItem
item( wxUIntToPtr(sorted
[i
]+1) );
512 wxDataViewModel::ItemsDeleted( wxDataViewItem(0), array
);
515 void wxDataViewVirtualListModel::RowChanged( unsigned int row
)
517 wxDataViewModel::ItemChanged( GetItem(row
) );
520 void wxDataViewVirtualListModel::RowValueChanged( unsigned int row
, unsigned int col
)
522 wxDataViewModel::ValueChanged( GetItem(row
), col
);
525 unsigned int wxDataViewVirtualListModel::GetRow( const wxDataViewItem
&item
) const
527 return wxPtrToUInt( item
.GetID() ) -1;
530 wxDataViewItem
wxDataViewVirtualListModel::GetItem( unsigned int row
) const
532 return wxDataViewItem( wxUIntToPtr(row
+1) );
535 bool wxDataViewVirtualListModel::HasDefaultCompare() const
540 int wxDataViewVirtualListModel::Compare(const wxDataViewItem
& item1
,
541 const wxDataViewItem
& item2
,
542 unsigned int WXUNUSED(column
),
543 bool ascending
) const
545 unsigned int pos1
= wxPtrToUInt(item1
.GetID()); // -1 not needed here
546 unsigned int pos2
= wxPtrToUInt(item2
.GetID()); // -1 not needed here
554 unsigned int wxDataViewVirtualListModel::GetChildren( const wxDataViewItem
&WXUNUSED(item
), wxDataViewItemArray
&WXUNUSED(children
) ) const
556 return 0; // should we report an error ?
561 //-----------------------------------------------------------------------------
562 // wxDataViewIconText
563 //-----------------------------------------------------------------------------
565 IMPLEMENT_DYNAMIC_CLASS(wxDataViewIconText
,wxObject
)
567 IMPLEMENT_VARIANT_OBJECT_EXPORTED(wxDataViewIconText
, WXDLLIMPEXP_ADV
)
569 // ---------------------------------------------------------
570 // wxDataViewRendererBase
571 // ---------------------------------------------------------
573 IMPLEMENT_ABSTRACT_CLASS(wxDataViewRendererBase
, wxObject
)
575 wxDataViewRendererBase::wxDataViewRendererBase( const wxString
&varianttype
,
576 wxDataViewCellMode
WXUNUSED(mode
),
577 int WXUNUSED(align
) )
579 m_variantType
= varianttype
;
583 wxDataViewRendererBase::~wxDataViewRendererBase()
587 const wxDataViewCtrl
* wxDataViewRendererBase::GetView() const
589 return const_cast<wxDataViewRendererBase
*>(this)->GetOwner()->GetOwner();
592 class wxKillRef
: public wxWindowRef
595 wxKillRef( wxWindow
*win
) : wxWindowRef( win
) { }
596 virtual void OnObjectDestroy()
598 get()->PopEventHandler( true );
604 bool wxDataViewRendererBase::StartEditing( const wxDataViewItem
&item
, wxRect labelRect
)
606 wxDataViewCtrl
* dv_ctrl
= GetOwner()->GetOwner();
608 // Before doing anything we send an event asking if editing of this item is really wanted.
609 wxDataViewEvent
start_event( wxEVT_COMMAND_DATAVIEW_ITEM_START_EDITING
, dv_ctrl
->GetId() );
610 start_event
.SetDataViewColumn( GetOwner() );
611 start_event
.SetModel( dv_ctrl
->GetModel() );
612 start_event
.SetItem( item
);
613 start_event
.SetEventObject( dv_ctrl
);
614 dv_ctrl
->GetEventHandler()->ProcessEvent( start_event
);
615 if( !start_event
.IsAllowed() )
618 m_item
= item
; // remember for later
620 unsigned int col
= GetOwner()->GetModelColumn();
622 dv_ctrl
->GetModel()->GetValue( value
, item
, col
);
624 m_editorCtrl
= CreateEditorCtrl( dv_ctrl
->GetMainWindow(), labelRect
, value
);
626 // there might be no editor control for the given item
630 (void) new wxKillRef( m_editorCtrl
.get() );
632 wxDataViewEditorCtrlEvtHandler
*handler
=
633 new wxDataViewEditorCtrlEvtHandler( m_editorCtrl
, (wxDataViewRenderer
*) this );
635 m_editorCtrl
->PushEventHandler( handler
);
637 #if defined(__WXGTK20__) && !defined(wxUSE_GENERICDATAVIEWCTRL)
638 handler
->SetFocusOnIdle();
640 m_editorCtrl
->SetFocus();
643 // Now we should send Editing Started event
644 wxDataViewEvent
event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED
, dv_ctrl
->GetId() );
645 event
.SetDataViewColumn( GetOwner() );
646 event
.SetModel( dv_ctrl
->GetModel() );
647 event
.SetItem( item
);
648 event
.SetEventObject( dv_ctrl
);
649 dv_ctrl
->GetEventHandler()->ProcessEvent( event
);
654 void wxDataViewRendererBase::CancelEditing()
659 GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
661 m_editorCtrl
->Hide();
662 wxPendingDelete
.Append( m_editorCtrl
);
665 bool wxDataViewRendererBase::FinishEditing()
671 GetValueFromEditorCtrl( m_editorCtrl
, value
);
673 wxDataViewCtrl
* dv_ctrl
= GetOwner()->GetOwner();
675 dv_ctrl
->GetMainWindow()->SetFocus();
677 m_editorCtrl
->Hide();
678 wxPendingDelete
.Append( m_editorCtrl
);
680 if (!Validate(value
))
683 unsigned int col
= GetOwner()->GetModelColumn();
684 dv_ctrl
->GetModel()->ChangeValue(value
, m_item
, col
);
686 // Now we should send Editing Done event
687 wxDataViewEvent
event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE
, dv_ctrl
->GetId() );
688 event
.SetDataViewColumn( GetOwner() );
689 event
.SetModel( dv_ctrl
->GetModel() );
690 event
.SetItem( m_item
);
691 event
.SetEventObject( dv_ctrl
);
692 dv_ctrl
->GetEventHandler()->ProcessEvent( event
);
697 //-----------------------------------------------------------------------------
698 // wxDataViewEditorCtrlEvtHandler
699 //-----------------------------------------------------------------------------
701 BEGIN_EVENT_TABLE(wxDataViewEditorCtrlEvtHandler
, wxEvtHandler
)
702 EVT_CHAR (wxDataViewEditorCtrlEvtHandler::OnChar
)
703 EVT_KILL_FOCUS (wxDataViewEditorCtrlEvtHandler::OnKillFocus
)
704 EVT_IDLE (wxDataViewEditorCtrlEvtHandler::OnIdle
)
705 EVT_TEXT_ENTER (-1, wxDataViewEditorCtrlEvtHandler::OnTextEnter
)
708 wxDataViewEditorCtrlEvtHandler::wxDataViewEditorCtrlEvtHandler(
709 wxControl
*editorCtrl
,
710 wxDataViewRenderer
*owner
)
713 m_editorCtrl
= editorCtrl
;
718 void wxDataViewEditorCtrlEvtHandler::OnIdle( wxIdleEvent
&event
)
722 m_focusOnIdle
= false;
723 if (wxWindow::FindFocus() != m_editorCtrl
)
724 m_editorCtrl
->SetFocus();
730 void wxDataViewEditorCtrlEvtHandler::OnTextEnter( wxCommandEvent
&WXUNUSED(event
) )
733 m_owner
->FinishEditing();
736 void wxDataViewEditorCtrlEvtHandler::OnChar( wxKeyEvent
&event
)
738 switch ( event
.m_keyCode
)
742 m_owner
->FinishEditing();
748 m_owner
->CancelEditing();
756 void wxDataViewEditorCtrlEvtHandler::OnKillFocus( wxFocusEvent
&event
)
761 m_owner
->FinishEditing();
767 // ---------------------------------------------------------
768 // wxDataViewColumnBase
769 // ---------------------------------------------------------
771 void wxDataViewColumnBase::Init(wxDataViewRenderer
*renderer
,
772 unsigned int model_column
)
774 m_renderer
= renderer
;
775 m_model_column
= model_column
;
777 m_renderer
->SetOwner( (wxDataViewColumn
*) this );
780 wxDataViewColumnBase::~wxDataViewColumnBase()
785 // ---------------------------------------------------------
786 // wxDataViewCtrlBase
787 // ---------------------------------------------------------
789 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCtrlBase
, wxControl
)
791 wxDataViewCtrlBase::wxDataViewCtrlBase()
794 m_expander_column
= 0;
798 wxDataViewCtrlBase::~wxDataViewCtrlBase()
807 bool wxDataViewCtrlBase::AssociateModel( wxDataViewModel
*model
)
811 m_model
->DecRef(); // discard old model, if any
814 // add our own reference to the new model:
824 wxDataViewModel
* wxDataViewCtrlBase::GetModel()
829 const wxDataViewModel
* wxDataViewCtrlBase::GetModel() const
834 void wxDataViewCtrlBase::ExpandAncestors( const wxDataViewItem
& item
)
836 if (!m_model
) return;
838 if (!item
.IsOk()) return;
840 wxVector
<wxDataViewItem
> parentChain
;
842 // at first we get all the parents of the selected item
843 wxDataViewItem parent
= m_model
->GetParent(item
);
844 while (parent
.IsOk())
846 parentChain
.push_back(parent
);
847 parent
= m_model
->GetParent(parent
);
850 // then we expand the parents, starting at the root
851 while (!parentChain
.empty())
853 Expand(parentChain
.back());
854 parentChain
.pop_back();
859 wxDataViewCtrlBase::AppendTextColumn( const wxString
&label
, unsigned int model_column
,
860 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
862 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
863 new wxDataViewTextRenderer( wxT("string"), mode
),
864 model_column
, width
, align
, flags
);
870 wxDataViewCtrlBase::AppendIconTextColumn( const wxString
&label
, unsigned int model_column
,
871 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
873 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
874 new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode
),
875 model_column
, width
, align
, flags
);
881 wxDataViewCtrlBase::AppendToggleColumn( const wxString
&label
, unsigned int model_column
,
882 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
884 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
885 new wxDataViewToggleRenderer( wxT("bool"), mode
),
886 model_column
, width
, align
, flags
);
892 wxDataViewCtrlBase::AppendProgressColumn( const wxString
&label
, unsigned int model_column
,
893 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
895 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
896 new wxDataViewProgressRenderer( wxEmptyString
, wxT("long"), mode
),
897 model_column
, width
, align
, flags
);
903 wxDataViewCtrlBase::AppendDateColumn( const wxString
&label
, unsigned int model_column
,
904 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
906 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
907 new wxDataViewDateRenderer( wxT("datetime"), mode
),
908 model_column
, width
, align
, flags
);
914 wxDataViewCtrlBase::AppendBitmapColumn( const wxString
&label
, unsigned int model_column
,
915 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
917 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
918 new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode
),
919 model_column
, width
, align
, flags
);
925 wxDataViewCtrlBase::AppendTextColumn( const wxBitmap
&label
, unsigned int model_column
,
926 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
928 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
929 new wxDataViewTextRenderer( wxT("string"), mode
),
930 model_column
, width
, align
, flags
);
936 wxDataViewCtrlBase::AppendIconTextColumn( const wxBitmap
&label
, unsigned int model_column
,
937 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
939 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
940 new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode
),
941 model_column
, width
, align
, flags
);
947 wxDataViewCtrlBase::AppendToggleColumn( const wxBitmap
&label
, unsigned int model_column
,
948 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
950 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
951 new wxDataViewToggleRenderer( wxT("bool"), mode
),
952 model_column
, width
, align
, flags
);
958 wxDataViewCtrlBase::AppendProgressColumn( const wxBitmap
&label
, unsigned int model_column
,
959 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
961 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
962 new wxDataViewProgressRenderer( wxEmptyString
, wxT("long"), mode
),
963 model_column
, width
, align
, flags
);
969 wxDataViewCtrlBase::AppendDateColumn( const wxBitmap
&label
, unsigned int model_column
,
970 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
972 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
973 new wxDataViewDateRenderer( wxT("datetime"), mode
),
974 model_column
, width
, align
, flags
);
980 wxDataViewCtrlBase::AppendBitmapColumn( const wxBitmap
&label
, unsigned int model_column
,
981 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
983 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
984 new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode
),
985 model_column
, width
, align
, flags
);
991 wxDataViewCtrlBase::PrependTextColumn( const wxString
&label
, unsigned int model_column
,
992 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
994 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
995 new wxDataViewTextRenderer( wxT("string"), mode
),
996 model_column
, width
, align
, flags
);
997 PrependColumn( ret
);
1002 wxDataViewCtrlBase::PrependIconTextColumn( const wxString
&label
, unsigned int model_column
,
1003 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1005 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
1006 new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode
),
1007 model_column
, width
, align
, flags
);
1008 PrependColumn( ret
);
1013 wxDataViewCtrlBase::PrependToggleColumn( const wxString
&label
, unsigned int model_column
,
1014 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1017 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
1018 new wxDataViewToggleRenderer( wxT("bool"), mode
),
1019 model_column
, width
, align
, flags
);
1020 PrependColumn( ret
);
1025 wxDataViewCtrlBase::PrependProgressColumn( const wxString
&label
, unsigned int model_column
,
1026 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1028 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
1029 new wxDataViewProgressRenderer( wxEmptyString
, wxT("long"), mode
),
1030 model_column
, width
, align
, flags
);
1031 PrependColumn( ret
);
1036 wxDataViewCtrlBase::PrependDateColumn( const wxString
&label
, unsigned int model_column
,
1037 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1039 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
1040 new wxDataViewDateRenderer( wxT("datetime"), mode
),
1041 model_column
, width
, align
, flags
);
1042 PrependColumn( ret
);
1047 wxDataViewCtrlBase::PrependBitmapColumn( const wxString
&label
, unsigned int model_column
,
1048 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1050 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
1051 new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode
),
1052 model_column
, width
, align
, flags
);
1053 PrependColumn( ret
);
1058 wxDataViewCtrlBase::PrependTextColumn( const wxBitmap
&label
, unsigned int model_column
,
1059 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1061 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
1062 new wxDataViewTextRenderer( wxT("string"), mode
),
1063 model_column
, width
, align
, flags
);
1064 PrependColumn( ret
);
1069 wxDataViewCtrlBase::PrependIconTextColumn( const wxBitmap
&label
, unsigned int model_column
,
1070 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1072 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
1073 new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode
),
1074 model_column
, width
, align
, flags
);
1075 PrependColumn( ret
);
1080 wxDataViewCtrlBase::PrependToggleColumn( const wxBitmap
&label
, unsigned int model_column
,
1081 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1083 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
1084 new wxDataViewToggleRenderer( wxT("bool"), mode
),
1085 model_column
, width
, align
, flags
);
1086 PrependColumn( ret
);
1091 wxDataViewCtrlBase::PrependProgressColumn( const wxBitmap
&label
, unsigned int model_column
,
1092 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1094 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
1095 new wxDataViewProgressRenderer( wxEmptyString
, wxT("long"), mode
),
1096 model_column
, width
, align
, flags
);
1097 PrependColumn( ret
);
1102 wxDataViewCtrlBase::PrependDateColumn( const wxBitmap
&label
, unsigned int model_column
,
1103 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1105 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
1106 new wxDataViewDateRenderer( wxT("datetime"), mode
),
1107 model_column
, width
, align
, flags
);
1108 PrependColumn( ret
);
1113 wxDataViewCtrlBase::PrependBitmapColumn( const wxBitmap
&label
, unsigned int model_column
,
1114 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1116 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
1117 new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode
),
1118 model_column
, width
, align
, flags
);
1119 PrependColumn( ret
);
1124 wxDataViewCtrlBase::AppendColumn( wxDataViewColumn
*col
)
1126 col
->SetOwner( (wxDataViewCtrl
*) this );
1131 wxDataViewCtrlBase::PrependColumn( wxDataViewColumn
*col
)
1133 col
->SetOwner( (wxDataViewCtrl
*) this );
1138 wxDataViewCtrlBase::InsertColumn( unsigned int WXUNUSED(pos
), wxDataViewColumn
*col
)
1140 col
->SetOwner( (wxDataViewCtrl
*) this );
1144 // ---------------------------------------------------------
1146 // ---------------------------------------------------------
1148 IMPLEMENT_DYNAMIC_CLASS(wxDataViewEvent
,wxNotifyEvent
)
1150 wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED
, wxDataViewEvent
);
1152 wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED
, wxDataViewEvent
);
1153 wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING
, wxDataViewEvent
);
1154 wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED
, wxDataViewEvent
);
1155 wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING
, wxDataViewEvent
);
1156 wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED
, wxDataViewEvent
);
1157 wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED
, wxDataViewEvent
);
1158 wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_START_EDITING
, wxDataViewEvent
);
1159 wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE
, wxDataViewEvent
);
1160 wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED
, wxDataViewEvent
);
1162 wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU
, wxDataViewEvent
);
1164 wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK
, wxDataViewEvent
);
1165 wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK
, wxDataViewEvent
);
1166 wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED
, wxDataViewEvent
);
1167 wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_COLUMN_REORDERED
, wxDataViewEvent
);
1169 wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_CACHE_HINT
, wxDataViewEvent
);
1171 wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG
, wxDataViewEvent
);
1172 wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE
, wxDataViewEvent
);
1173 wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_DROP
, wxDataViewEvent
);
1177 // -------------------------------------
1178 // wxDataViewSpinRenderer
1179 // -------------------------------------
1181 wxDataViewSpinRenderer::wxDataViewSpinRenderer( int min
, int max
, wxDataViewCellMode mode
, int alignment
) :
1182 wxDataViewCustomRenderer(wxT("long"), mode
, alignment
)
1188 wxControl
* wxDataViewSpinRenderer::CreateEditorCtrl( wxWindow
*parent
, wxRect labelRect
, const wxVariant
&value
)
1191 wxSize size
= labelRect
.GetSize();
1193 size
= wxSize( wxMax(70,labelRect
.width
), -1 );
1196 str
.Printf( wxT("%d"), (int) l
);
1197 wxSpinCtrl
*sc
= new wxSpinCtrl( parent
, wxID_ANY
, str
,
1198 labelRect
.GetTopLeft(), size
, wxSP_ARROW_KEYS
|wxTE_PROCESS_ENTER
, m_min
, m_max
, l
);
1200 size
= sc
->GetSize();
1201 wxPoint pt
= sc
->GetPosition();
1202 sc
->SetSize( pt
.x
- 4, pt
.y
- 4, size
.x
, size
.y
);
1208 bool wxDataViewSpinRenderer::GetValueFromEditorCtrl( wxControl
* editor
, wxVariant
&value
)
1210 wxSpinCtrl
*sc
= (wxSpinCtrl
*) editor
;
1211 long l
= sc
->GetValue();
1216 bool wxDataViewSpinRenderer::Render( wxRect rect
, wxDC
*dc
, int state
)
1219 str
.Printf(wxT("%d"), (int) m_data
);
1220 RenderText( str
, 0, rect
, dc
, state
);
1224 wxSize
wxDataViewSpinRenderer::GetSize() const
1226 return wxSize(80,16);
1229 bool wxDataViewSpinRenderer::SetValue( const wxVariant
&value
)
1231 m_data
= value
.GetLong();
1235 bool wxDataViewSpinRenderer::GetValue( wxVariant
&value
) const
1241 // -------------------------------------
1242 // wxDataViewChoiceRenderer
1243 // -------------------------------------
1245 #if defined(wxHAS_GENERIC_DATAVIEWCTRL) || defined(__WXOSX_CARBON__)
1247 wxDataViewChoiceRenderer::wxDataViewChoiceRenderer( const wxArrayString
& choices
, wxDataViewCellMode mode
, int alignment
) :
1248 wxDataViewCustomRenderer(wxT("string"), mode
, alignment
)
1250 m_choices
= choices
;
1253 wxControl
* wxDataViewChoiceRenderer::CreateEditorCtrl( wxWindow
*parent
, wxRect labelRect
, const wxVariant
&value
)
1256 wxSize size
= labelRect
.GetSize();
1258 size
= wxSize( wxMax(70,labelRect
.width
), -1 );
1260 wxChoice
*c
= new wxChoice( parent
, wxID_ANY
, labelRect
.GetTopLeft(), size
, m_choices
);
1261 c
->SetStringSelection( value
.GetString() );
1266 bool wxDataViewChoiceRenderer::GetValueFromEditorCtrl( wxControl
* editor
, wxVariant
&value
)
1268 wxChoice
*c
= (wxChoice
*) editor
;
1269 wxString s
= c
->GetStringSelection();
1274 bool wxDataViewChoiceRenderer::Render( wxRect rect
, wxDC
*dc
, int state
)
1276 RenderText( m_data
, 0, rect
, dc
, state
);
1280 wxSize
wxDataViewChoiceRenderer::GetSize() const
1282 return wxSize(80,16);
1285 bool wxDataViewChoiceRenderer::SetValue( const wxVariant
&value
)
1287 m_data
= value
.GetString();
1291 bool wxDataViewChoiceRenderer::GetValue( wxVariant
&value
) const
1299 //-----------------------------------------------------------------------------
1300 // wxDataViewListStore
1301 //-----------------------------------------------------------------------------
1303 wxDataViewListStore::wxDataViewListStore()
1307 wxDataViewListStore::~wxDataViewListStore()
1309 wxVector
<wxDataViewListStoreLine
*>::iterator it
;
1310 for (it
= m_data
.begin(); it
!= m_data
.end(); ++it
)
1312 wxDataViewListStoreLine
* line
= *it
;
1317 void wxDataViewListStore::PrependColumn( const wxString
&varianttype
)
1319 m_cols
.Insert( varianttype
, 0 );
1322 void wxDataViewListStore::InsertColumn( unsigned int pos
, const wxString
&varianttype
)
1324 m_cols
.Insert( varianttype
, pos
);
1327 void wxDataViewListStore::AppendColumn( const wxString
&varianttype
)
1329 m_cols
.Add( varianttype
);
1332 unsigned int wxDataViewListStore::GetColumnCount() const
1334 return m_cols
.GetCount();
1337 wxString
wxDataViewListStore::GetColumnType( unsigned int pos
) const
1342 void wxDataViewListStore::AppendItem( const wxVector
<wxVariant
> &values
, wxClientData
*data
)
1344 wxDataViewListStoreLine
*line
= new wxDataViewListStoreLine( data
);
1345 line
->m_values
= values
;
1346 m_data
.push_back( line
);
1351 void wxDataViewListStore::PrependItem( const wxVector
<wxVariant
> &values
, wxClientData
*data
)
1353 wxDataViewListStoreLine
*line
= new wxDataViewListStoreLine( data
);
1354 line
->m_values
= values
;
1355 m_data
.insert( m_data
.begin(), line
);
1360 void wxDataViewListStore::InsertItem( unsigned int row
, const wxVector
<wxVariant
> &values
,
1361 wxClientData
*data
)
1363 wxDataViewListStoreLine
*line
= new wxDataViewListStoreLine( data
);
1364 line
->m_values
= values
;
1365 m_data
.insert( m_data
.begin()+row
, line
);
1370 void wxDataViewListStore::DeleteItem( unsigned int row
)
1372 wxVector
<wxDataViewListStoreLine
*>::iterator it
= m_data
.begin() + row
;
1378 void wxDataViewListStore::DeleteAllItems()
1380 wxVector
<wxDataViewListStoreLine
*>::iterator it
;
1381 for (it
= m_data
.begin(); it
!= m_data
.end(); ++it
)
1383 wxDataViewListStoreLine
* line
= *it
;
1392 void wxDataViewListStore::GetValueByRow( wxVariant
&value
, unsigned int row
, unsigned int col
) const
1394 wxDataViewListStoreLine
*line
= m_data
[row
];
1395 value
= line
->m_values
[col
];
1398 bool wxDataViewListStore::SetValueByRow( const wxVariant
&value
, unsigned int row
, unsigned int col
)
1400 wxDataViewListStoreLine
*line
= m_data
[row
];
1401 line
->m_values
[col
] = value
;
1406 //-----------------------------------------------------------------------------
1407 // wxDataViewListCtrl
1408 //-----------------------------------------------------------------------------
1410 IMPLEMENT_DYNAMIC_CLASS(wxDataViewListCtrl
,wxDataViewCtrl
)
1412 BEGIN_EVENT_TABLE(wxDataViewListCtrl
,wxDataViewCtrl
)
1413 EVT_SIZE( wxDataViewListCtrl::OnSize
)
1416 wxDataViewListCtrl::wxDataViewListCtrl()
1420 wxDataViewListCtrl::wxDataViewListCtrl( wxWindow
*parent
, wxWindowID id
,
1421 const wxPoint
& pos
, const wxSize
& size
, long style
,
1422 const wxValidator
& validator
)
1424 Create( parent
, id
, pos
, size
, style
, validator
);
1426 wxDataViewListStore
*store
= new wxDataViewListStore
;
1427 AssociateModel( store
);
1431 wxDataViewListCtrl::~wxDataViewListCtrl()
1436 bool wxDataViewListCtrl::Create( wxWindow
*parent
, wxWindowID id
,
1437 const wxPoint
& pos
, const wxSize
& size
, long style
,
1438 const wxValidator
& validator
)
1440 return wxDataViewCtrl::Create( parent
, id
, pos
, size
, style
, validator
);
1443 bool wxDataViewListCtrl::AppendColumn( wxDataViewColumn
*column
, const wxString
&varianttype
)
1445 GetStore()->AppendColumn( varianttype
);
1446 return wxDataViewCtrl::AppendColumn( column
);
1449 bool wxDataViewListCtrl::PrependColumn( wxDataViewColumn
*column
, const wxString
&varianttype
)
1451 GetStore()->PrependColumn( varianttype
);
1452 return wxDataViewCtrl::PrependColumn( column
);
1455 bool wxDataViewListCtrl::InsertColumn( unsigned int pos
, wxDataViewColumn
*column
, const wxString
&varianttype
)
1457 GetStore()->InsertColumn( pos
, varianttype
);
1458 return wxDataViewCtrl::InsertColumn( pos
, column
);
1461 bool wxDataViewListCtrl::PrependColumn( wxDataViewColumn
*col
)
1463 return PrependColumn( col
, "string" );
1466 bool wxDataViewListCtrl::InsertColumn( unsigned int pos
, wxDataViewColumn
*col
)
1468 return InsertColumn( pos
, col
, "string" );
1471 bool wxDataViewListCtrl::AppendColumn( wxDataViewColumn
*col
)
1473 return AppendColumn( col
, "string" );
1476 wxDataViewColumn
*wxDataViewListCtrl::AppendTextColumn( const wxString
&label
,
1477 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1479 GetStore()->AppendColumn( wxT("string") );
1481 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
1482 new wxDataViewTextRenderer( wxT("string"), mode
),
1483 GetStore()->GetColumnCount()-1, width
, align
, flags
);
1485 wxDataViewCtrl::AppendColumn( ret
);
1490 wxDataViewColumn
*wxDataViewListCtrl::AppendToggleColumn( const wxString
&label
,
1491 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1493 GetStore()->AppendColumn( wxT("bool") );
1495 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
1496 new wxDataViewToggleRenderer( wxT("bool"), mode
),
1497 GetStore()->GetColumnCount()-1, width
, align
, flags
);
1499 wxDataViewCtrl::AppendColumn( ret
);
1504 wxDataViewColumn
*wxDataViewListCtrl::AppendProgressColumn( const wxString
&label
,
1505 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1507 GetStore()->AppendColumn( wxT("long") );
1509 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
1510 new wxDataViewProgressRenderer( wxEmptyString
, wxT("long"), mode
),
1511 GetStore()->GetColumnCount()-1, width
, align
, flags
);
1513 wxDataViewCtrl::AppendColumn( ret
);
1518 wxDataViewColumn
*wxDataViewListCtrl::AppendIconTextColumn( const wxString
&label
,
1519 wxDataViewCellMode mode
, int width
, wxAlignment align
, int flags
)
1521 GetStore()->AppendColumn( wxT("wxDataViewIconText") );
1523 wxDataViewColumn
*ret
= new wxDataViewColumn( label
,
1524 new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode
),
1525 GetStore()->GetColumnCount()-1, width
, align
, flags
);
1527 wxDataViewCtrl::AppendColumn( ret
);
1532 void wxDataViewListCtrl::OnSize( wxSizeEvent
&event
)
1537 //-----------------------------------------------------------------------------
1538 // wxDataViewTreeStore
1539 //-----------------------------------------------------------------------------
1541 wxDataViewTreeStoreNode::wxDataViewTreeStoreNode(
1542 wxDataViewTreeStoreNode
*parent
,
1543 const wxString
&text
, const wxIcon
&icon
, wxClientData
*data
)
1551 wxDataViewTreeStoreNode::~wxDataViewTreeStoreNode()
1557 #include "wx/listimpl.cpp"
1558 WX_DEFINE_LIST(wxDataViewTreeStoreNodeList
)
1560 wxDataViewTreeStoreContainerNode::wxDataViewTreeStoreContainerNode(
1561 wxDataViewTreeStoreNode
*parent
, const wxString
&text
,
1562 const wxIcon
&icon
, const wxIcon
&expanded
, wxClientData
*data
) :
1563 wxDataViewTreeStoreNode( parent
, text
, icon
, data
)
1565 m_iconExpanded
= expanded
;
1566 m_isExpanded
= false;
1567 m_children
.DeleteContents(true);
1570 wxDataViewTreeStoreContainerNode::~wxDataViewTreeStoreContainerNode()
1574 //-----------------------------------------------------------------------------
1576 wxDataViewTreeStore::wxDataViewTreeStore()
1578 m_root
= new wxDataViewTreeStoreContainerNode( NULL
, wxEmptyString
);
1581 wxDataViewTreeStore::~wxDataViewTreeStore()
1586 wxDataViewItem
wxDataViewTreeStore::AppendItem( const wxDataViewItem
& parent
,
1587 const wxString
&text
, const wxIcon
&icon
, wxClientData
*data
)
1589 wxDataViewTreeStoreContainerNode
*parent_node
= FindContainerNode( parent
);
1590 if (!parent_node
) return wxDataViewItem(0);
1592 wxDataViewTreeStoreNode
*node
=
1593 new wxDataViewTreeStoreNode( parent_node
, text
, icon
, data
);
1594 parent_node
->GetChildren().Append( node
);
1596 return node
->GetItem();
1599 wxDataViewItem
wxDataViewTreeStore::PrependItem( const wxDataViewItem
& parent
,
1600 const wxString
&text
, const wxIcon
&icon
, wxClientData
*data
)
1602 wxDataViewTreeStoreContainerNode
*parent_node
= FindContainerNode( parent
);
1603 if (!parent_node
) return wxDataViewItem(0);
1605 wxDataViewTreeStoreNode
*node
=
1606 new wxDataViewTreeStoreNode( parent_node
, text
, icon
, data
);
1607 parent_node
->GetChildren().Insert( node
);
1609 return node
->GetItem();
1613 wxDataViewTreeStore::InsertItem(const wxDataViewItem
& parent
,
1614 const wxDataViewItem
& previous
,
1615 const wxString
& text
,
1619 wxDataViewTreeStoreContainerNode
*parent_node
= FindContainerNode( parent
);
1620 if (!parent_node
) return wxDataViewItem(0);
1622 wxDataViewTreeStoreNode
*previous_node
= FindNode( previous
);
1623 int pos
= parent_node
->GetChildren().IndexOf( previous_node
);
1624 if (pos
== wxNOT_FOUND
) return wxDataViewItem(0);
1626 wxDataViewTreeStoreNode
*node
=
1627 new wxDataViewTreeStoreNode( parent_node
, text
, icon
, data
);
1628 parent_node
->GetChildren().Insert( (size_t) pos
, node
);
1630 return node
->GetItem();
1633 wxDataViewItem
wxDataViewTreeStore::PrependContainer( const wxDataViewItem
& parent
,
1634 const wxString
&text
, const wxIcon
&icon
, const wxIcon
&expanded
,
1635 wxClientData
*data
)
1637 wxDataViewTreeStoreContainerNode
*parent_node
= FindContainerNode( parent
);
1638 if (!parent_node
) return wxDataViewItem(0);
1640 wxDataViewTreeStoreContainerNode
*node
=
1641 new wxDataViewTreeStoreContainerNode( parent_node
, text
, icon
, expanded
, data
);
1642 parent_node
->GetChildren().Insert( node
);
1644 return node
->GetItem();
1648 wxDataViewTreeStore::AppendContainer(const wxDataViewItem
& parent
,
1649 const wxString
&text
,
1651 const wxIcon
& expanded
,
1652 wxClientData
* data
)
1654 wxDataViewTreeStoreContainerNode
*parent_node
= FindContainerNode( parent
);
1655 if (!parent_node
) return wxDataViewItem(0);
1657 wxDataViewTreeStoreContainerNode
*node
=
1658 new wxDataViewTreeStoreContainerNode( parent_node
, text
, icon
, expanded
, data
);
1659 parent_node
->GetChildren().Append( node
);
1661 return node
->GetItem();
1665 wxDataViewTreeStore::InsertContainer(const wxDataViewItem
& parent
,
1666 const wxDataViewItem
& previous
,
1667 const wxString
& text
,
1669 const wxIcon
& expanded
,
1670 wxClientData
* data
)
1672 wxDataViewTreeStoreContainerNode
*parent_node
= FindContainerNode( parent
);
1673 if (!parent_node
) return wxDataViewItem(0);
1675 wxDataViewTreeStoreNode
*previous_node
= FindNode( previous
);
1676 int pos
= parent_node
->GetChildren().IndexOf( previous_node
);
1677 if (pos
== wxNOT_FOUND
) return wxDataViewItem(0);
1679 wxDataViewTreeStoreContainerNode
*node
=
1680 new wxDataViewTreeStoreContainerNode( parent_node
, text
, icon
, expanded
, data
);
1681 parent_node
->GetChildren().Insert( (size_t) pos
, node
);
1683 return node
->GetItem();
1686 wxDataViewItem
wxDataViewTreeStore::GetNthChild( const wxDataViewItem
& parent
, unsigned int pos
) const
1688 wxDataViewTreeStoreContainerNode
*parent_node
= FindContainerNode( parent
);
1689 if (!parent_node
) return wxDataViewItem(0);
1691 wxDataViewTreeStoreNodeList::compatibility_iterator node
= parent_node
->GetChildren().Item( pos
);
1693 return node
->GetData();
1695 return wxDataViewItem(0);
1698 int wxDataViewTreeStore::GetChildCount( const wxDataViewItem
& parent
) const
1700 wxDataViewTreeStoreNode
*node
= FindNode( parent
);
1701 if (!node
) return -1;
1703 if (!node
->IsContainer())
1706 wxDataViewTreeStoreContainerNode
*container_node
= (wxDataViewTreeStoreContainerNode
*) node
;
1707 return (int) container_node
->GetChildren().GetCount();
1710 void wxDataViewTreeStore::SetItemText( const wxDataViewItem
& item
, const wxString
&text
)
1712 wxDataViewTreeStoreNode
*node
= FindNode( item
);
1715 node
->SetText( text
);
1718 wxString
wxDataViewTreeStore::GetItemText( const wxDataViewItem
& item
) const
1720 wxDataViewTreeStoreNode
*node
= FindNode( item
);
1721 if (!node
) return wxEmptyString
;
1723 return node
->GetText();
1726 void wxDataViewTreeStore::SetItemIcon( const wxDataViewItem
& item
, const wxIcon
&icon
)
1728 wxDataViewTreeStoreNode
*node
= FindNode( item
);
1731 node
->SetIcon( icon
);
1734 const wxIcon
&wxDataViewTreeStore::GetItemIcon( const wxDataViewItem
& item
) const
1736 wxDataViewTreeStoreNode
*node
= FindNode( item
);
1737 if (!node
) return wxNullIcon
;
1739 return node
->GetIcon();
1742 void wxDataViewTreeStore::SetItemExpandedIcon( const wxDataViewItem
& item
, const wxIcon
&icon
)
1744 wxDataViewTreeStoreContainerNode
*node
= FindContainerNode( item
);
1747 node
->SetExpandedIcon( icon
);
1750 const wxIcon
&wxDataViewTreeStore::GetItemExpandedIcon( const wxDataViewItem
& item
) const
1752 wxDataViewTreeStoreContainerNode
*node
= FindContainerNode( item
);
1753 if (!node
) return wxNullIcon
;
1755 return node
->GetExpandedIcon();
1758 void wxDataViewTreeStore::SetItemData( const wxDataViewItem
& item
, wxClientData
*data
)
1760 wxDataViewTreeStoreNode
*node
= FindNode( item
);
1763 node
->SetData( data
);
1766 wxClientData
*wxDataViewTreeStore::GetItemData( const wxDataViewItem
& item
) const
1768 wxDataViewTreeStoreNode
*node
= FindNode( item
);
1769 if (!node
) return NULL
;
1771 return node
->GetData();
1774 void wxDataViewTreeStore::DeleteItem( const wxDataViewItem
& item
)
1776 if (!item
.IsOk()) return;
1778 wxDataViewItem parent_item
= GetParent( item
);
1780 wxDataViewTreeStoreContainerNode
*parent_node
= FindContainerNode( parent_item
);
1781 if (!parent_node
) return;
1783 wxDataViewTreeStoreContainerNode
*node
= FindContainerNode( item
);
1786 parent_node
->GetChildren().DeleteObject( node
);
1789 void wxDataViewTreeStore::DeleteChildren( const wxDataViewItem
& item
)
1791 wxDataViewTreeStoreContainerNode
*node
= FindContainerNode( item
);
1794 node
->GetChildren().clear();
1797 void wxDataViewTreeStore::DeleteAllItems()
1799 DeleteChildren(m_root
);
1803 wxDataViewTreeStore::GetValue(wxVariant
&variant
,
1804 const wxDataViewItem
&item
,
1805 unsigned int WXUNUSED(col
)) const
1807 // if (col != 0) return;
1809 wxDataViewTreeStoreNode
*node
= FindNode( item
);
1812 wxIcon
icon( node
->GetIcon());
1813 if (node
->IsContainer())
1815 wxDataViewTreeStoreContainerNode
*container
= (wxDataViewTreeStoreContainerNode
*) node
;
1816 if (container
->IsExpanded() && container
->GetExpandedIcon().IsOk())
1817 icon
= container
->GetExpandedIcon();
1820 wxDataViewIconText
data( node
->GetText(), icon
);
1826 wxDataViewTreeStore::SetValue(const wxVariant
& variant
,
1827 const wxDataViewItem
& item
,
1828 unsigned int WXUNUSED(col
))
1830 // if (col != 0) return false;
1832 wxDataViewTreeStoreNode
*node
= FindNode( item
);
1833 if (!node
) return false;
1835 wxDataViewIconText data
;
1839 node
->SetText( data
.GetText() );
1840 node
->SetIcon( data
.GetIcon() );
1845 wxDataViewItem
wxDataViewTreeStore::GetParent( const wxDataViewItem
&item
) const
1847 wxDataViewTreeStoreNode
*node
= FindNode( item
);
1848 if (!node
) return wxDataViewItem(0);
1850 wxDataViewTreeStoreNode
*parent
= node
->GetParent();
1851 if (!parent
) return wxDataViewItem(0);
1853 if (parent
== m_root
)
1854 return wxDataViewItem(0);
1856 return parent
->GetItem();
1859 bool wxDataViewTreeStore::IsContainer( const wxDataViewItem
&item
) const
1861 wxDataViewTreeStoreNode
*node
= FindNode( item
);
1862 if (!node
) return false;
1864 return node
->IsContainer();
1867 unsigned int wxDataViewTreeStore::GetChildren( const wxDataViewItem
&item
, wxDataViewItemArray
&children
) const
1869 wxDataViewTreeStoreContainerNode
*node
= FindContainerNode( item
);
1870 if (!node
) return 0;
1872 wxDataViewTreeStoreNodeList::iterator iter
;
1873 for (iter
= node
->GetChildren().begin(); iter
!= node
->GetChildren().end(); iter
++)
1875 wxDataViewTreeStoreNode
* child
= *iter
;
1876 children
.Add( child
->GetItem() );
1879 return node
->GetChildren().GetCount();
1882 int wxDataViewTreeStore::Compare( const wxDataViewItem
&item1
, const wxDataViewItem
&item2
,
1883 unsigned int WXUNUSED(column
), bool WXUNUSED(ascending
) ) const
1885 wxDataViewTreeStoreNode
*node1
= FindNode( item1
);
1886 wxDataViewTreeStoreNode
*node2
= FindNode( item2
);
1888 if (!node1
|| !node2
)
1891 wxDataViewTreeStoreContainerNode
* parent1
=
1892 (wxDataViewTreeStoreContainerNode
*) node1
->GetParent();
1893 wxDataViewTreeStoreContainerNode
* parent2
=
1894 (wxDataViewTreeStoreContainerNode
*) node2
->GetParent();
1896 if (parent1
!= parent2
)
1898 wxLogError( wxT("Comparing items with different parent.") );
1902 if (node1
->IsContainer() && !!node2
->IsContainer())
1905 if (node2
->IsContainer() && !!node1
->IsContainer())
1908 return parent1
->GetChildren().IndexOf( node1
) - parent1
->GetChildren().IndexOf( node2
);
1911 wxDataViewTreeStoreNode
*wxDataViewTreeStore::FindNode( const wxDataViewItem
&item
) const
1916 return (wxDataViewTreeStoreNode
*) item
.GetID();
1919 wxDataViewTreeStoreContainerNode
*wxDataViewTreeStore::FindContainerNode( const wxDataViewItem
&item
) const
1922 return (wxDataViewTreeStoreContainerNode
*) m_root
;
1924 wxDataViewTreeStoreNode
* node
= (wxDataViewTreeStoreNode
*) item
.GetID();
1926 if (!node
->IsContainer())
1929 return (wxDataViewTreeStoreContainerNode
*) node
;
1932 //-----------------------------------------------------------------------------
1933 // wxDataViewTreeCtrl
1934 //-----------------------------------------------------------------------------
1936 IMPLEMENT_DYNAMIC_CLASS(wxDataViewTreeCtrl
,wxDataViewCtrl
)
1938 BEGIN_EVENT_TABLE(wxDataViewTreeCtrl
,wxDataViewCtrl
)
1939 EVT_DATAVIEW_ITEM_EXPANDED(-1, wxDataViewTreeCtrl::OnExpanded
)
1940 EVT_DATAVIEW_ITEM_COLLAPSED(-1, wxDataViewTreeCtrl::OnCollapsed
)
1941 EVT_SIZE( wxDataViewTreeCtrl::OnSize
)
1944 wxDataViewTreeCtrl::~wxDataViewTreeCtrl()
1949 bool wxDataViewTreeCtrl::Create( wxWindow
*parent
, wxWindowID id
,
1950 const wxPoint
& pos
, const wxSize
& size
, long style
, const wxValidator
& validator
)
1952 if ( !wxDataViewCtrl::Create( parent
, id
, pos
, size
, style
, validator
) )
1955 // create the standard model and a column in the tree
1956 wxDataViewTreeStore
*store
= new wxDataViewTreeStore
;
1957 AssociateModel( store
);
1960 AppendIconTextColumn(wxString(),0,wxDATAVIEW_CELL_EDITABLE
,-1);
1965 void wxDataViewTreeCtrl::SetImageList( wxImageList
*imagelist
)
1969 m_imageList
= imagelist
;
1972 wxDataViewItem
wxDataViewTreeCtrl::AppendItem( const wxDataViewItem
& parent
,
1973 const wxString
&text
, int iconIndex
, wxClientData
*data
)
1975 wxIcon icon
= wxNullIcon
;
1976 if (m_imageList
&& (iconIndex
!= -1))
1977 icon
= m_imageList
->GetIcon( iconIndex
);
1979 wxDataViewItem res
= GetStore()->AppendItem( parent
, text
, icon
, data
);
1981 GetStore()->ItemAdded( parent
, res
);
1986 wxDataViewItem
wxDataViewTreeCtrl::PrependItem( const wxDataViewItem
& parent
,
1987 const wxString
&text
, int iconIndex
, wxClientData
*data
)
1989 wxIcon icon
= wxNullIcon
;
1990 if (m_imageList
&& (iconIndex
!= -1))
1991 icon
= m_imageList
->GetIcon( iconIndex
);
1993 wxDataViewItem res
= GetStore()->PrependItem( parent
, text
, icon
, data
);
1995 GetStore()->ItemAdded( parent
, res
);
2000 wxDataViewItem
wxDataViewTreeCtrl::InsertItem( const wxDataViewItem
& parent
, const wxDataViewItem
& previous
,
2001 const wxString
&text
, int iconIndex
, wxClientData
*data
)
2003 wxIcon icon
= wxNullIcon
;
2004 if (m_imageList
&& (iconIndex
!= -1))
2005 icon
= m_imageList
->GetIcon( iconIndex
);
2007 wxDataViewItem res
= GetStore()->InsertItem( parent
, previous
, text
, icon
, data
);
2009 GetStore()->ItemAdded( parent
, res
);
2014 wxDataViewItem
wxDataViewTreeCtrl::PrependContainer( const wxDataViewItem
& parent
,
2015 const wxString
&text
, int iconIndex
, int expandedIndex
, wxClientData
*data
)
2017 wxIcon icon
= wxNullIcon
;
2018 if (m_imageList
&& (iconIndex
!= -1))
2019 icon
= m_imageList
->GetIcon( iconIndex
);
2021 wxIcon expanded
= wxNullIcon
;
2022 if (m_imageList
&& (expandedIndex
!= -1))
2023 expanded
= m_imageList
->GetIcon( expandedIndex
);
2025 wxDataViewItem res
= GetStore()->PrependContainer( parent
, text
, icon
, expanded
, data
);
2027 GetStore()->ItemAdded( parent
, res
);
2032 wxDataViewItem
wxDataViewTreeCtrl::AppendContainer( const wxDataViewItem
& parent
,
2033 const wxString
&text
, int iconIndex
, int expandedIndex
, wxClientData
*data
)
2035 wxIcon icon
= wxNullIcon
;
2036 if (m_imageList
&& (iconIndex
!= -1))
2037 icon
= m_imageList
->GetIcon( iconIndex
);
2039 wxIcon expanded
= wxNullIcon
;
2040 if (m_imageList
&& (expandedIndex
!= -1))
2041 expanded
= m_imageList
->GetIcon( expandedIndex
);
2043 wxDataViewItem res
= GetStore()->AppendContainer( parent
, text
, icon
, expanded
, data
);
2045 GetStore()->ItemAdded( parent
, res
);
2050 wxDataViewItem
wxDataViewTreeCtrl::InsertContainer( const wxDataViewItem
& parent
, const wxDataViewItem
& previous
,
2051 const wxString
&text
, int iconIndex
, int expandedIndex
, wxClientData
*data
)
2053 wxIcon icon
= wxNullIcon
;
2054 if (m_imageList
&& (iconIndex
!= -1))
2055 icon
= m_imageList
->GetIcon( iconIndex
);
2057 wxIcon expanded
= wxNullIcon
;
2058 if (m_imageList
&& (expandedIndex
!= -1))
2059 expanded
= m_imageList
->GetIcon( expandedIndex
);
2061 wxDataViewItem res
= GetStore()->InsertContainer( parent
, previous
, text
, icon
, expanded
, data
);
2063 GetStore()->ItemAdded( parent
, res
);
2068 void wxDataViewTreeCtrl::SetItemText( const wxDataViewItem
& item
, const wxString
&text
)
2070 GetStore()->SetItemText(item
,text
);
2073 GetStore()->ValueChanged( item
, 0 );
2076 void wxDataViewTreeCtrl::SetItemIcon( const wxDataViewItem
& item
, const wxIcon
&icon
)
2078 GetStore()->SetItemIcon(item
,icon
);
2081 GetStore()->ValueChanged( item
, 0 );
2084 void wxDataViewTreeCtrl::SetItemExpandedIcon( const wxDataViewItem
& item
, const wxIcon
&icon
)
2086 GetStore()->SetItemExpandedIcon(item
,icon
);
2089 GetStore()->ValueChanged( item
, 0 );
2092 void wxDataViewTreeCtrl::DeleteItem( const wxDataViewItem
& item
)
2094 wxDataViewItem parent_item
= GetStore()->GetParent( item
);
2096 GetStore()->DeleteItem(item
);
2099 GetStore()->ItemDeleted( parent_item
, item
);
2102 void wxDataViewTreeCtrl::DeleteChildren( const wxDataViewItem
& item
)
2104 wxDataViewTreeStoreContainerNode
*node
= GetStore()->FindContainerNode( item
);
2107 wxDataViewItemArray array
;
2108 wxDataViewTreeStoreNodeList::iterator iter
;
2109 for (iter
= node
->GetChildren().begin(); iter
!= node
->GetChildren().end(); iter
++)
2111 wxDataViewTreeStoreNode
* child
= *iter
;
2112 array
.Add( child
->GetItem() );
2115 GetStore()->DeleteChildren( item
);
2118 GetStore()->ItemsDeleted( item
, array
);
2121 void wxDataViewTreeCtrl::DeleteAllItems()
2123 GetStore()->DeleteAllItems();
2125 GetStore()->Cleared();
2128 void wxDataViewTreeCtrl::OnExpanded( wxDataViewEvent
&event
)
2130 if (m_imageList
) return;
2132 wxDataViewTreeStoreContainerNode
* container
= GetStore()->FindContainerNode( event
.GetItem() );
2133 if (!container
) return;
2135 container
->SetExpanded( true );
2137 GetStore()->ItemChanged( event
.GetItem() );
2140 void wxDataViewTreeCtrl::OnCollapsed( wxDataViewEvent
&event
)
2142 if (m_imageList
) return;
2144 wxDataViewTreeStoreContainerNode
* container
= GetStore()->FindContainerNode( event
.GetItem() );
2145 if (!container
) return;
2147 container
->SetExpanded( false );
2149 GetStore()->ItemChanged( event
.GetItem() );
2152 void wxDataViewTreeCtrl::OnSize( wxSizeEvent
&event
)
2154 #if defined(wxUSE_GENERICDATAVIEWCTRL)
2155 // automatically resize our only column to take the entire control width
2156 if ( GetColumnCount() )
2158 wxSize size
= GetClientSize();
2159 GetColumn(0)->SetWidth(size
.x
);
2165 #endif // wxUSE_DATAVIEWCTRL