1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: DataVewCtrl wxWidgets sample
4 // Author: Robert Roebling
8 // Copyright: (c) Robert Roebling
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 // For compilers that support precompilation, includes "wx/wx.h".
13 #include "wx/wxprec.h"
23 #include "wx/datetime.h"
24 #include "wx/splitter.h"
25 #include "wx/aboutdlg.h"
28 #include "../sample.xpm"
33 #include "wx/dataview.h"
35 // -------------------------------------
37 // -------------------------------------
39 WX_DECLARE_OBJARRAY(wxDateTime
,wxArrayDate
);
40 #include <wx/arrimpl.cpp>
41 WX_DEFINE_OBJARRAY(wxArrayDate
)
43 class MyTextModel
: public wxDataViewListModel
49 for (i
= 0; i
< 1000; i
++)
50 m_list
.Add( wxT("Test") );
51 for (i
= 0; i
< 500; i
++)
52 { m_bools
.Add( 0 ); m_bools
.Add( 1 ); }
53 for (i
= 0; i
< 500; i
++)
54 { m_colours
.Add( wxT("red") ); m_colours
.Add( wxT("green") ); }
55 for (i
= 0; i
< 1000; i
++)
56 { m_progress
.Add( i
/10 ); }
57 for (i
= 0; i
< 1000; i
++)
59 wxDateTime
date( wxDateTime::Now() );
64 virtual unsigned int GetNumberOfRows()
66 virtual unsigned int GetNumberOfCols()
69 // as reported by wxVariant
70 virtual wxString
GetColType( unsigned int col
)
73 return wxT("datetime");
84 virtual void GetValue( wxVariant
&variant
, unsigned int col
, unsigned int row
)
88 variant
= (wxDateTime
) m_dates
[row
];
92 variant
= (long) m_progress
[row
];
96 variant
= m_colours
[row
];
100 variant
= (bool) (m_bools
[row
] != 0);
104 variant
= m_list
[row
];
109 tmp
.Printf( wxT("item(%d;%d)"), (int)row
, (int)col
);
113 virtual bool SetValue( wxVariant
&value
, unsigned int col
, unsigned int row
)
117 m_dates
[row
] = value
.GetDateTime();
121 m_bools
[row
] = (int) value
.GetBool();
125 m_list
[row
] = value
.GetString();
130 wxArrayString m_list
;
132 wxArrayString m_colours
;
133 wxArrayInt m_progress
;
137 // -------------------------------------
139 // -------------------------------------
141 class MyCustomRenderer
: public wxDataViewCustomRenderer
145 wxDataViewCustomRenderer( wxT("string"), wxDATAVIEW_CELL_ACTIVATABLE
)
147 m_colour
= wxT("black");
149 bool SetValue( const wxVariant
&value
)
151 m_colour
= value
.GetString();
154 bool Render( wxRect rect
, wxDC
*dc
, int WXUNUSED(state
) )
156 dc
->SetPen( *wxBLACK_PEN
);
157 if (m_colour
== wxT("red"))
158 dc
->SetBrush( *wxRED_BRUSH
);
159 else if (m_colour
== wxT("green"))
160 dc
->SetBrush( *wxGREEN_BRUSH
);
162 dc
->SetBrush( *wxBLACK_BRUSH
);
163 dc
->DrawRectangle( rect
);
170 bool Activate( wxRect
WXUNUSED(rect
),
171 wxDataViewListModel
*WXUNUSED(model
),
172 unsigned int WXUNUSED(col
),
173 unsigned int WXUNUSED(row
) )
182 // -------------------------------------
183 // MyUnsortedTextModel
184 // -------------------------------------
186 class MyUnsortedTextModel
: public wxDataViewListModel
189 MyUnsortedTextModel()
191 m_list
.Add( wxT("This") );
192 m_list
.Add( wxT("is") );
193 m_list
.Add( wxT("an") );
194 m_list
.Add( wxT("unsorted") );
195 m_list
.Add( wxT("list") );
196 m_list
.Add( wxT("of") );
197 m_list
.Add( wxT("words.") );
199 m_bitmap
= wxBitmap( null_xpm
);
202 virtual unsigned int GetNumberOfRows() { return m_list
.GetCount(); }
203 virtual unsigned int GetNumberOfCols() { return 2; }
204 virtual wxString
GetColType( unsigned int WXUNUSED(col
) ) { return wxT("string"); }
205 virtual void GetValue( wxVariant
&variant
, unsigned int col
, unsigned int row
)
209 variant
= m_list
[row
];
212 if ((col
== 2) || (col
== 3))
218 tmp
.Printf( wxT("item(%d;%d)"), (int)row
, (int)col
);
221 virtual bool SetValue( wxVariant
&variant
, unsigned int col
, unsigned int row
)
225 m_list
[row
] = variant
.GetString();
232 void AppendRow( const wxString
&text
)
238 void PrependRow( const wxString
&text
)
240 m_list
.Insert( text
, 0 );
244 void InsertRowAt1( const wxString
&text
)
246 m_list
.Insert( text
, 1 );
250 void DeleteRow( unsigned int index
)
252 m_list
.RemoveAt( index
);
256 wxArrayString m_list
;
260 // -------------------------------------
262 // -------------------------------------
264 class MyApp
: public wxApp
271 // -------------------------------------
273 // -------------------------------------
275 class MyFrame
: public wxFrame
278 MyFrame(wxFrame
*frame
, wxChar
*title
, int x
, int y
, int w
, int h
);
281 void OnQuit(wxCommandEvent
& event
);
282 void OnAbout(wxCommandEvent
& event
);
283 void OnNewSortingFrame(wxCommandEvent
& event
);
285 void OnSingleSelMode(wxCommandEvent
& event
);
286 void OnMultipleSelMode(wxCommandEvent
& event
);
287 void OnResizeableColumn(wxCommandEvent
& event
);
288 void OnSortableColumn(wxCommandEvent
& event
);
289 void OnHideColumn(wxCommandEvent
& event
);
290 void OnChooseAlign(wxCommandEvent
& event
);
293 wxDataViewCtrl
* dataview_left
;
294 wxDataViewCtrl
* dataview_right
;
295 wxSplitterWindow
*m_splitter
;
299 void CreateControls();
302 DECLARE_EVENT_TABLE()
305 // -------------------------------------
307 // -------------------------------------
311 ID_APPEND_ROW_LEFT
= 1000,
321 ID_PREPEND_ROW_RIGHT
,
331 class MySortingFrame
: public wxFrame
334 MySortingFrame(wxFrame
*frame
, wxChar
*title
, int x
, int y
, int w
, int h
);
338 void OnQuit(wxCommandEvent
& event
);
339 void OnAbout(wxCommandEvent
& event
);
341 void OnAppendRowLeft(wxCommandEvent
& event
);
342 void OnPrependRowLeft(wxCommandEvent
& event
);
343 void OnInsertRowLeft(wxCommandEvent
& event
);
344 void OnDeleteRowLeft(wxCommandEvent
& event
);
345 void OnEditRowLeft(wxCommandEvent
& event
);
347 void OnAppendRowRight(wxCommandEvent
& event
);
348 void OnPrependRowRight(wxCommandEvent
& event
);
349 void OnInsertRowRight(wxCommandEvent
& event
);
350 void OnDeleteRowRight(wxCommandEvent
& event
);
351 void OnEditRowRight(wxCommandEvent
& event
);
353 void OnSelect(wxCommandEvent
& event
);
354 void OnUnselectAll(wxCommandEvent
& event
);
356 void OnSelectedUnsorted(wxDataViewEvent
&event
);
357 void OnSelectedSorted(wxDataViewEvent
&event
);
358 void OnActivatedUnsorted(wxDataViewEvent
&event
);
360 void OnHeaderClickSorted(wxDataViewEvent
&event
);
361 void OnHeaderClickUnsorted(wxDataViewEvent
&event
);
364 wxDataViewCtrl
* dataview_left
;
365 wxDataViewCtrl
* dataview_right
;
368 wxTextCtrl
*m_logWindow
;
370 MyUnsortedTextModel
*m_unsorted_model
;
371 wxDataViewSortedListModel
*m_sorted_model
;
373 DECLARE_EVENT_TABLE()
376 // -------------------------------------
378 // -------------------------------------
382 bool MyApp::OnInit(void)
384 if ( !wxApp::OnInit() )
387 // build the first frame
389 new MyFrame(NULL
, wxT("wxDataViewCtrl feature test"), 10, 10, 800, 340);
402 // -------------------------------------
404 // -------------------------------------
409 ID_ABOUT
= wxID_ABOUT
,
415 ID_MULTIPLE_SEL_MODE
,
417 ID_RESIZEABLE_COLUMNS
,
424 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
427 EVT_MENU( ID_ABOUT
, MyFrame::OnAbout
)
428 EVT_MENU( ID_NEW_SORT_FRAME
, MyFrame::OnNewSortingFrame
)
429 EVT_MENU( ID_EXIT
, MyFrame::OnQuit
)
432 EVT_MENU( ID_SINGLE_SEL_MODE
, MyFrame::OnSingleSelMode
)
433 EVT_MENU( ID_MULTIPLE_SEL_MODE
, MyFrame::OnMultipleSelMode
)
435 EVT_MENU( ID_RESIZEABLE_COLUMNS
, MyFrame::OnResizeableColumn
)
436 EVT_MENU( ID_SORTABLE_COLUMNS
, MyFrame::OnSortableColumn
)
437 EVT_MENU( ID_HIDDEN_COLUMNS
, MyFrame::OnHideColumn
)
439 EVT_MENU( ID_CHOOSE_ALIGNMENT
, MyFrame::OnChooseAlign
)
443 MyFrame::MyFrame(wxFrame
*frame
, wxChar
*title
, int x
, int y
, int w
, int h
):
444 wxFrame(frame
, wxID_ANY
, title
, wxPoint(x
, y
), wxSize(w
, h
))
446 SetIcon(wxICON(sample
));
450 wxMenu
*file_menu
= new wxMenu
;
451 file_menu
->Append(ID_NEW_SORT_FRAME
, _T("&New sorting frame"));
452 file_menu
->AppendSeparator();
453 file_menu
->Append(ID_ABOUT
, _T("&About"));
454 file_menu
->AppendSeparator();
455 file_menu
->Append(ID_EXIT
, _T("E&xit"));
457 wxMenu
*data_menu
= new wxMenu
;
458 data_menu
->AppendRadioItem(ID_SINGLE_SEL_MODE
, _T("&Single selection mode"));
459 data_menu
->AppendRadioItem(ID_MULTIPLE_SEL_MODE
, _T("&Multiple selection mode"));
460 data_menu
->AppendSeparator();
461 data_menu
->AppendCheckItem(ID_RESIZEABLE_COLUMNS
, _T("Make columns resizeable"));
462 data_menu
->AppendCheckItem(ID_SORTABLE_COLUMNS
, _T("Make columns sortable"));
463 data_menu
->AppendCheckItem(ID_HIDDEN_COLUMNS
, _T("Make columns hidden"));
464 data_menu
->AppendSeparator();
465 data_menu
->Append(ID_CHOOSE_ALIGNMENT
, _T("Set alignment..."));
467 wxMenuBar
*menu_bar
= new wxMenuBar
;
468 menu_bar
->Append(file_menu
, _T("&File"));
469 menu_bar
->Append(data_menu
, _T("&DataViewCtrl"));
471 SetMenuBar(menu_bar
);
475 // build the other controls:
477 m_splitter
= new wxSplitterWindow( this, wxID_ANY
);
478 m_splitter
->SetSashGravity(0.5);
480 m_align
= wxALIGN_CENTER
;
481 dataview_left
= dataview_right
= NULL
;
484 m_splitter
->SplitVertically(dataview_left
, dataview_right
);
487 void MyFrame::CreateControls()
489 wxDataViewCtrl
*old1
= NULL
, *old2
= NULL
;
492 old1
= dataview_left
;
494 old2
= dataview_right
;
499 if (GetMenuBar()->FindItem(ID_MULTIPLE_SEL_MODE
)->IsChecked())
500 style
|= wxDV_MULTIPLE
;
503 if (GetMenuBar()->FindItem(ID_RESIZEABLE_COLUMNS
)->IsChecked())
504 flags
|= wxDATAVIEW_COL_RESIZABLE
;
505 if (GetMenuBar()->FindItem(ID_SORTABLE_COLUMNS
)->IsChecked())
506 flags
|= wxDATAVIEW_COL_SORTABLE
;
507 if (GetMenuBar()->FindItem(ID_HIDDEN_COLUMNS
)->IsChecked())
508 flags
|= wxDATAVIEW_COL_HIDDEN
;
511 // Left wxDataViewCtrl
512 dataview_left
= new wxDataViewCtrl( m_splitter
, wxID_ANY
, wxDefaultPosition
,
513 wxDefaultSize
, style
);
515 MyTextModel
*model
= new MyTextModel
;
516 dataview_left
->AssociateModel( model
);
517 model
->DecRef(); // don't leak memory
519 dataview_left
->AppendTextColumn( wxT("first"), 0, wxDATAVIEW_CELL_INERT
, -1,
521 dataview_left
->AppendTextColumn( wxT("second"), 1, wxDATAVIEW_CELL_INERT
, -1,
524 wxDataViewTextRenderer
*text_renderer
=
525 new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE
);
526 wxDataViewColumn
*column
= new wxDataViewColumn( wxT("editable"), text_renderer
, 2,
527 -1, m_align
, flags
);
528 dataview_left
->AppendColumn( column
);
530 dataview_left
->AppendToggleColumn( wxT("fourth"), 3, wxDATAVIEW_CELL_INERT
, -1,
533 MyCustomRenderer
*custom_renderer
= new MyCustomRenderer
;
534 column
= new wxDataViewColumn( wxT("custom"), custom_renderer
, 4, -1,
536 dataview_left
->AppendColumn( column
);
538 dataview_left
->AppendProgressColumn( wxT("progress"), 5, wxDATAVIEW_CELL_INERT
, -1,
541 dataview_left
->AppendDateColumn( wxT("date"), 6, wxDATAVIEW_CELL_INERT
, -1,
545 // Right wxDataViewCtrl using the same model
546 dataview_right
= new wxDataViewCtrl( m_splitter
, wxID_ANY
, wxDefaultPosition
,
547 wxDefaultSize
, style
);
548 dataview_right
->AssociateModel( model
);
550 text_renderer
= new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE
);
551 column
= new wxDataViewColumn( wxT("editable"), text_renderer
, 2 );
552 dataview_right
->AppendColumn( column
);
553 dataview_right
->AppendTextColumn( wxT("first"), 0 );
554 dataview_right
->AppendTextColumn( wxT("second"), 1 );
555 wxDataViewToggleRenderer
*toggle_renderer
=
556 new wxDataViewToggleRenderer( wxT("bool"), wxDATAVIEW_CELL_ACTIVATABLE
);
557 column
= new wxDataViewColumn( wxT("bool"), toggle_renderer
, 3, 30 );
558 dataview_right
->AppendColumn( column
);
560 dataview_right
->AppendDateColumn( wxT("date"), 6 );
562 // layout dataview controls
565 m_splitter
->ReplaceWindow(old1
, dataview_left
);
571 m_splitter
->ReplaceWindow(old2
, dataview_right
);
576 void MyFrame::OnQuit(wxCommandEvent
& WXUNUSED(event
) )
581 void MyFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
) )
583 wxAboutDialogInfo info
;
584 info
.SetName(_("DataView sample"));
585 info
.SetDescription(_("This sample demonstrates the dataview control handling"));
586 info
.SetCopyright(_T("(C) 2007 Robert Roebling"));
591 void MyFrame::OnNewSortingFrame(wxCommandEvent
& WXUNUSED(event
) )
593 MySortingFrame
*frame2
=
594 new MySortingFrame(NULL
, wxT("wxDataViewCtrl sorting test"), 10, 150, 600, 500);
598 void MyFrame::OnSingleSelMode(wxCommandEvent
& event
)
603 void MyFrame::OnMultipleSelMode(wxCommandEvent
& event
)
608 void MyFrame::OnResizeableColumn(wxCommandEvent
& event
)
613 void MyFrame::OnSortableColumn(wxCommandEvent
& event
)
618 void MyFrame::OnHideColumn(wxCommandEvent
& event
)
623 void MyFrame::OnChooseAlign(wxCommandEvent
& event
)
625 const wxString choices
[] =
628 wxT("Center horizontally"),
631 wxT("Center vertically"),
636 wxAlignment flags
[] =
639 wxALIGN_CENTER_HORIZONTAL
,
642 wxALIGN_CENTER_VERTICAL
,
647 int choice
= wxGetSingleChoiceIndex(
648 wxT("Select the alignment for the cells of the wxDataViewCtrl:"),
650 WXSIZEOF(choices
), choices
,
653 if (choice
== wxNOT_FOUND
)
656 m_align
= flags
[choice
];
661 // -------------------------------------
663 // -------------------------------------
665 BEGIN_EVENT_TABLE(MySortingFrame
,wxFrame
)
666 EVT_BUTTON( ID_APPEND_ROW_LEFT
, MySortingFrame::OnAppendRowLeft
)
667 EVT_BUTTON( ID_PREPEND_ROW_LEFT
, MySortingFrame::OnPrependRowLeft
)
668 EVT_BUTTON( ID_INSERT_ROW_LEFT
, MySortingFrame::OnInsertRowLeft
)
669 EVT_BUTTON( ID_DELETE_ROW_LEFT
, MySortingFrame::OnDeleteRowLeft
)
670 EVT_BUTTON( ID_SELECT
, MySortingFrame::OnSelect
)
671 EVT_BUTTON( ID_UNSELECT_ALL
, MySortingFrame::OnUnselectAll
)
672 EVT_DATAVIEW_ROW_SELECTED( ID_SORTED
, MySortingFrame::OnSelectedSorted
)
673 EVT_DATAVIEW_ROW_SELECTED( ID_UNSORTED
, MySortingFrame::OnSelectedUnsorted
)
674 EVT_DATAVIEW_ROW_ACTIVATED( ID_UNSORTED
, MySortingFrame::OnActivatedUnsorted
)
675 EVT_DATAVIEW_COLUMN_HEADER_CLICK( ID_SORTED
, MySortingFrame::OnHeaderClickSorted
)
676 EVT_DATAVIEW_COLUMN_HEADER_CLICK( ID_UNSORTED
, MySortingFrame::OnHeaderClickUnsorted
)
679 MySortingFrame::MySortingFrame(wxFrame
*frame
, wxChar
*title
, int x
, int y
, int w
, int h
):
680 wxFrame(frame
, wxID_ANY
, title
, wxPoint(x
, y
), wxSize(w
, h
))
684 SetIcon(wxICON(sample
));
687 wxPanel
*main
= new wxPanel(this);
689 // Left wxDataViewCtrl
690 dataview_left
= new wxDataViewCtrl( main
, ID_UNSORTED
, wxDefaultPosition
,
691 wxDefaultSize
, wxDV_MULTIPLE
);
693 m_unsorted_model
= new MyUnsortedTextModel
;
694 dataview_left
->AssociateModel( m_unsorted_model
);
695 m_unsorted_model
->DecRef(); // don't leak memory
697 wxDataViewTextRenderer
*text_renderer
=
698 new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE
);
699 wxDataViewColumn
*column
= new wxDataViewColumn( wxT("editable"), text_renderer
, 0 );
700 dataview_left
->AppendColumn( column
);
701 dataview_left
->AppendTextColumn( wxT("second"), 1 );
702 dataview_left
->AppendColumn( new wxDataViewColumn( wxBitmap(null_xpm
),
703 new wxDataViewBitmapRenderer
, 2, 25 ) );
704 dataview_left
->AppendColumn( new wxDataViewColumn( wxT("icon"),
705 new wxDataViewBitmapRenderer
, 3, 25 ) );
707 // Right wxDataViewCtrl using the sorting model
708 dataview_right
= new wxDataViewCtrl( main
, ID_SORTED
);
710 m_sorted_model
= new wxDataViewSortedListModel( m_unsorted_model
);
711 dataview_right
->AssociateModel( m_sorted_model
);
712 m_sorted_model
->DecRef(); // don't leak memory
714 text_renderer
= new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE
);
715 column
= new wxDataViewColumn( wxT("editable"), text_renderer
, 0, -1,
717 wxDATAVIEW_COL_SORTABLE
|wxDATAVIEW_COL_RESIZABLE
);
718 dataview_right
->AppendColumn( column
);
720 dataview_right
->AppendTextColumn( wxT("second"), 1 );
722 // layout dataview controls.
724 wxBoxSizer
*top_sizer
= new wxBoxSizer( wxHORIZONTAL
);
725 top_sizer
->Add( dataview_left
, 1, wxGROW
);
726 top_sizer
->Add(10,10);
727 top_sizer
->Add( dataview_right
, 1, wxGROW
);
729 wxBoxSizer
*button_sizer
= new wxBoxSizer( wxHORIZONTAL
);
730 button_sizer
->Add( 10, 10, 1 );
731 wxFlexGridSizer
*left_sizer
= new wxFlexGridSizer( 2 );
732 left_sizer
->Add( new wxButton( main
, ID_APPEND_ROW_LEFT
, wxT("Append") ), 0, wxALL
, 5 );
733 left_sizer
->Add( new wxButton( main
, ID_PREPEND_ROW_LEFT
, wxT("Prepend") ), 0, wxALL
, 5 );
734 left_sizer
->Add( new wxButton( main
, ID_INSERT_ROW_LEFT
, wxT("Insert") ), 0, wxALL
, 5 );
735 left_sizer
->Add( new wxButton( main
, ID_DELETE_ROW_LEFT
, wxT("Delete second") ), 0, wxALL
, 5 );
736 left_sizer
->Add( new wxButton( main
, ID_EDIT_ROW_LEFT
, wxT("Edit") ), 0, wxALL
, 5 );
737 left_sizer
->Add( 5,5 );
738 left_sizer
->Add( new wxButton( main
, ID_SELECT
, wxT("Select third") ), 0, wxALL
, 5 );
739 left_sizer
->Add( new wxButton( main
, ID_UNSELECT_ALL
, wxT("Unselect all") ), 0, wxALL
, 5 );
740 button_sizer
->Add( left_sizer
);
741 button_sizer
->Add( 10, 10, 2 );
742 wxFlexGridSizer
*right_sizer
= new wxFlexGridSizer( 2 );
743 right_sizer
->Add( new wxButton( main
, ID_APPEND_ROW_RIGHT
, wxT("Append") ), 0, wxALL
, 5 );
744 right_sizer
->Add( new wxButton( main
, ID_PREPEND_ROW_RIGHT
, wxT("Prepend") ), 0, wxALL
, 5 );
745 right_sizer
->Add( new wxButton( main
, ID_INSERT_ROW_RIGHT
, wxT("Insert") ), 0, wxALL
, 5 );
746 right_sizer
->Add( new wxButton( main
, ID_DELETE_ROW_RIGHT
, wxT("Delete second") ), 0, wxALL
, 5 );
747 right_sizer
->Add( new wxButton( main
, ID_EDIT_ROW_RIGHT
, wxT("Edit") ), 0, wxALL
, 5 );
748 button_sizer
->Add( right_sizer
);
749 button_sizer
->Add( 10, 10, 1 );
751 wxBoxSizer
*main_sizer
= new wxBoxSizer( wxVERTICAL
);
752 main_sizer
->Add( top_sizer
, 1, wxGROW
);
753 main_sizer
->Add( button_sizer
, 0, wxGROW
);
755 m_logWindow
= new wxTextCtrl(main
, wxID_ANY
, wxEmptyString
,
756 wxDefaultPosition
, wxDefaultSize
,
757 wxTE_MULTILINE
| wxSUNKEN_BORDER
);
758 main_sizer
->Add( 20,20 );
759 main_sizer
->Add( m_logWindow
, 1, wxGROW
);
761 m_logOld
= wxLog::SetActiveTarget(new wxLogTextCtrl(m_logWindow
));
763 main
->SetSizer( main_sizer
);
766 MySortingFrame::~MySortingFrame()
768 delete wxLog::SetActiveTarget(m_logOld
);
771 void MySortingFrame::OnSelectedUnsorted(wxDataViewEvent
&event
)
773 int row
= event
.GetRow();
774 wxLogMessage( wxT("OnSelected from unsorted list, selected %d"), row
);
776 wxLogMessage( wxT("wxDataViewCtrl::IsSelected( %d ): %d (as int)"),
777 row
, (int) dataview_right
->IsSelected( row
) );
780 void MySortingFrame::OnSelectedSorted(wxDataViewEvent
&event
)
782 wxLogMessage( wxT("OnSelected from sorted list, selected %d"), (int) event
.GetRow() );
785 void MySortingFrame::OnActivatedUnsorted(wxDataViewEvent
&event
)
787 wxLogMessage( wxT("OnActivated from unsorted list, activated %d"), (int) event
.GetRow() );
790 void MySortingFrame::OnHeaderClickSorted(wxDataViewEvent
&event
)
792 wxDataViewColumn
*col
= event
.GetDataViewColumn();
793 wxLogMessage( wxT("OnHeaderClick from sorted list, column %s"), col
->GetTitle().c_str() );
795 if (col
->GetTitle() == wxT("editable"))
797 // this is the sorting column
798 if (col
->IsSortOrderAscending())
800 col
->SetSortOrder( false );
801 m_sorted_model
->SetAscending( false );
802 m_sorted_model
->Resort();
806 col
->SetSortOrder( true );
807 m_sorted_model
->SetAscending( true );
808 m_sorted_model
->Resort();
813 void MySortingFrame::OnHeaderClickUnsorted(wxDataViewEvent
&event
)
815 wxLogMessage( wxT("OnHeaderClick from unsorted list, column %s"),
816 event
.GetDataViewColumn()->GetTitle().c_str() );
819 void MySortingFrame::OnQuit(wxCommandEvent
& WXUNUSED(event
) )
824 void MySortingFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
) )
826 wxMessageDialog
dialog(this, _T("This demonstrates the dataview control sorting"),
827 _T("About DataView"), wxOK
);
832 void MySortingFrame::OnSelect(wxCommandEvent
& WXUNUSED(event
))
834 dataview_left
->SetSelection( 2 );
837 void MySortingFrame::OnUnselectAll(wxCommandEvent
& WXUNUSED(event
))
839 dataview_left
->ClearSelection();
842 void MySortingFrame::OnAppendRowLeft(wxCommandEvent
& WXUNUSED(event
))
844 wxTextEntryDialog
dialog( this, wxT("Enter text to append") );
845 if (dialog
.ShowModal() == wxID_OK
)
847 wxString value
= dialog
.GetValue();
849 m_unsorted_model
->AppendRow( value
);
853 void MySortingFrame::OnPrependRowLeft(wxCommandEvent
& WXUNUSED(event
))
855 wxTextEntryDialog
dialog( this, wxT("Enter text to prepend") );
856 if (dialog
.ShowModal() == wxID_OK
)
858 wxString value
= dialog
.GetValue();
860 m_unsorted_model
->PrependRow( value
);
864 void MySortingFrame::OnInsertRowLeft(wxCommandEvent
& WXUNUSED(event
))
866 wxTextEntryDialog
dialog( this, wxT("Enter text to insert before second") );
867 if (dialog
.ShowModal() == wxID_OK
)
869 wxString value
= dialog
.GetValue();
871 m_unsorted_model
->InsertRowAt1( value
);
875 void MySortingFrame::OnDeleteRowLeft(wxCommandEvent
& WXUNUSED(event
))
877 m_unsorted_model
->DeleteRow( 1 );
880 void MySortingFrame::OnEditRowLeft(wxCommandEvent
& WXUNUSED(event
))
884 void MySortingFrame::OnAppendRowRight(wxCommandEvent
& WXUNUSED(event
))
888 void MySortingFrame::OnPrependRowRight(wxCommandEvent
& WXUNUSED(event
))
892 void MySortingFrame::OnInsertRowRight(wxCommandEvent
& WXUNUSED(event
))
896 void MySortingFrame::OnDeleteRowRight(wxCommandEvent
& WXUNUSED(event
))
900 void MySortingFrame::OnEditRowRight(wxCommandEvent
& WXUNUSED(event
))