1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        dataview.cpp
3 // Purpose:     DataVewCtrl  wxWidgets sample
4 // Author:      Robert Roebling
5 // Modified by:
6 // Created:     06/01/06
7 // RCS-ID:      $Id: dataview.cpp 41659 2006-10-06 09:50:45Z RR $
8 // Copyright:   (c) Robert Roebling
9 // Licence:     wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11 
12 // For compilers that support precompilation, includes "wx/wx.h".
13 #include "wx/wxprec.h"
14 
15 #ifdef __BORLANDC__
16 #pragma hdrstop
17 #endif
18 
19 #ifndef WX_PRECOMP
20     #include "wx/wx.h"
21 #endif
22 
23 #include "wx/datetime.h"
24 
25 #ifndef __WXMSW__
26     #include "../sample.xpm"
27 #endif
28 
29 #include "null.xpm"
30 
31 #include "wx/dataview.h"
32 
33 // -------------------------------------
34 // MyTextModel
35 // -------------------------------------
36 
37 WX_DECLARE_LIST(wxDateTime,wxArrayDate);
38 #include <wx/listimpl.cpp>
39 WX_DEFINE_LIST(wxArrayDate)
40 
41 class MyTextModel: public wxDataViewListModel
42 {
43 public:
MyTextModel()44     MyTextModel()
45     {
46         unsigned int i;
47         for (i = 0; i < 1000; i++)
48             m_list.Add( wxT("Test") );
49         for (i = 0; i < 500; i++)
50             { m_bools.Add( 0 ); m_bools.Add( 1 ); }
51         for (i = 0; i < 500; i++)
52             { m_colours.Add( wxT("red") ); m_colours.Add( wxT("green") ); }
53         for (i = 0; i < 1000; i++)
54             { m_progress.Add( i/10 ); }
55         for (i = 0; i < 1000; i++)
56             {
57                 wxDateTime *date = new wxDateTime( wxDateTime::Now() );
58                 m_dates.Append( date );
59             }
60     }
61 
GetNumberOfRows()62     virtual unsigned int GetNumberOfRows()
63         { return 1000; }
GetNumberOfCols()64     virtual unsigned int GetNumberOfCols()
65         { return 7; }
66 
67     // as reported by wxVariant
GetColType(unsigned int col)68     virtual wxString GetColType( unsigned int col )
69         {
70             if (col == 6)
71                 return wxT("datetime");
72 
73             if (col == 5)
74                 return wxT("long");
75 
76             if (col == 3)
77                 return wxT("bool");
78 
79             return wxT("string");
80         }
81 
GetValue(wxVariant & variant,unsigned int col,unsigned int row)82     virtual void GetValue( wxVariant &variant, unsigned int col, unsigned int row )
83         {
84             if (col == 6)
85             {
86                 variant = (wxDateTime) *m_dates[row];
87             } else
88             if (col == 5)
89             {
90                 variant = (long) m_progress[row];
91             } else
92             if (col == 4)
93             {
94                 variant = m_colours[row];
95             } else
96             if (col == 3)
97             {
98                 variant = (bool) m_bools[row];
99             } else
100             if (col == 2)
101             {
102                 variant = m_list[row];
103             }
104             else
105             {
106                 wxString tmp;
107                 tmp.Printf( wxT("item(%d;%d)"), (int)row, (int)col );
108                 variant = tmp;
109             }
110         }
SetValue(wxVariant & value,unsigned int col,unsigned int row)111     virtual bool SetValue( wxVariant &value, unsigned int col, unsigned int row )
112         {
113             if (col == 6)
114             {
115                 *m_dates[row] = value.GetDateTime();
116             } else
117             if (col == 3)
118             {
119                 m_bools[row] = (int) value.GetBool();
120             } else
121             if (col == 2)
122             {
123                 m_list[row] = value.GetString();
124             }
125             return true;
126         }
127 
128     wxArrayString m_list;
129     wxArrayInt    m_bools;
130     wxArrayString m_colours;
131     wxArrayInt    m_progress;
132     wxArrayDate   m_dates;
133 };
134 
135 // -------------------------------------
136 // MyCustomRenderer
137 // -------------------------------------
138 
139 class MyCustomRenderer: public wxDataViewCustomRenderer
140 {
141 public:
MyCustomRenderer()142     MyCustomRenderer() :
143         wxDataViewCustomRenderer( wxT("string"), wxDATAVIEW_CELL_ACTIVATABLE )
144     {
145         m_colour = wxT("black");
146     }
SetValue(const wxVariant & value)147     bool SetValue( const wxVariant &value )
148     {
149         m_colour = value.GetString();
150         return true;
151     }
Render(wxRect rect,wxDC * dc,int WXUNUSED (state))152     bool Render( wxRect rect, wxDC *dc, int WXUNUSED(state) )
153     {
154         dc->SetPen( *wxBLACK_PEN );
155         if (m_colour == wxT("red"))
156             dc->SetBrush( *wxRED_BRUSH );
157         else if (m_colour == wxT("green"))
158             dc->SetBrush( *wxGREEN_BRUSH );
159         else
160             dc->SetBrush( *wxBLACK_BRUSH );
161         dc->DrawRectangle( rect );
162         return true;
163     }
GetSize()164     wxSize GetSize()
165     {
166         return wxSize(20,8);
167     }
Activate(wxRect WXUNUSED (rect),wxDataViewListModel * WXUNUSED (model),unsigned int WXUNUSED (col),unsigned int WXUNUSED (row))168     bool Activate( wxRect WXUNUSED(rect),
169                    wxDataViewListModel *WXUNUSED(model),
170                    unsigned int WXUNUSED(col),
171                    unsigned int WXUNUSED(row) )
172     {
173         return false;
174     }
175 
176 private:
177     wxString m_colour;
178 };
179 
180 // -------------------------------------
181 // MyUnsortedTextModel
182 // -------------------------------------
183 
184 class MyUnsortedTextModel: public wxDataViewListModel
185 {
186 public:
MyUnsortedTextModel()187     MyUnsortedTextModel()
188     {
189         m_list.Add( wxT("This") );
190         m_list.Add( wxT("is") );
191         m_list.Add( wxT("an") );
192         m_list.Add( wxT("unsorted") );
193         m_list.Add( wxT("list") );
194         m_list.Add( wxT("of") );
195         m_list.Add( wxT("words.") );
196 
197         m_bitmap = wxBitmap( null_xpm );
198     }
199 
GetNumberOfRows()200     virtual unsigned int GetNumberOfRows() { return m_list.GetCount(); }
GetNumberOfCols()201     virtual unsigned int GetNumberOfCols() { return 2; }
GetColType(unsigned int WXUNUSED (col))202     virtual wxString GetColType( unsigned int WXUNUSED(col) ) { return wxT("string"); }
GetValue(wxVariant & variant,unsigned int col,unsigned int row)203     virtual void GetValue( wxVariant &variant, unsigned int col, unsigned int row )
204     {
205         if (col == 0)
206         {
207             variant = m_list[row];
208             return;
209         }
210         if ((col == 2) || (col == 3))
211         {
212             variant << m_bitmap;
213             return;
214         }
215         wxString tmp;
216         tmp.Printf( wxT("item(%d;%d)"), (int)row, (int)col );
217         variant = tmp;
218     }
SetValue(wxVariant & variant,unsigned int col,unsigned int row)219     virtual bool SetValue( wxVariant &variant, unsigned int col, unsigned int row )
220     {
221         if (col == 0)
222         {
223             m_list[row] = variant.GetString();
224             return true;
225         }
226         return false;
227 
228     }
229 
AppendRow(const wxString & text)230     void AppendRow( const wxString &text )
231     {
232         m_list.Add( text );
233         RowAppended();
234     }
235 
PrependRow(const wxString & text)236     void PrependRow( const wxString &text )
237     {
238         m_list.Insert( text, 0 );
239         RowPrepended();
240     }
241 
InsertRowAt1(const wxString & text)242     void InsertRowAt1( const wxString &text )
243     {
244         m_list.Insert( text, 1 );
245         RowInserted( 1 );
246     }
247 
DeleteRow(unsigned int index)248     void DeleteRow( unsigned int index )
249     {
250         m_list.RemoveAt( index );
251         RowDeleted( index );
252     }
253 
254     wxArrayString m_list;
255     wxBitmap m_bitmap;
256 };
257 
258 // -------------------------------------
259 // MyApp
260 // -------------------------------------
261 
262 class MyApp: public wxApp
263 {
264 public:
265     bool OnInit(void);
266 };
267 
268 // -------------------------------------
269 // MyFrame
270 // -------------------------------------
271 
272 class MyFrame: public wxFrame
273 {
274 public:
275     MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h);
276 
277 public:
278     void OnQuit(wxCommandEvent& event);
279     void OnAbout(wxCommandEvent& event);
280 
281 private:
282     wxDataViewCtrl* dataview_left;
283     wxDataViewCtrl* dataview_right;
284 };
285 
286 // -------------------------------------
287 // MySortingFrame
288 // -------------------------------------
289 
290 enum my_events
291 {
292     ID_APPEND_ROW_LEFT = 1000,
293     ID_PREPEND_ROW_LEFT,
294     ID_INSERT_ROW_LEFT,
295     ID_DELETE_ROW_LEFT,
296     ID_EDIT_ROW_LEFT,
297 
298     ID_SELECT,
299     ID_UNSELECT_ALL,
300 
301     ID_APPEND_ROW_RIGHT,
302     ID_PREPEND_ROW_RIGHT,
303     ID_INSERT_ROW_RIGHT,
304     ID_DELETE_ROW_RIGHT,
305     ID_EDIT_ROW_RIGHT,
306 
307     ID_SORTED,
308     ID_UNSORTED,
309     ID_ACTIVATED
310 };
311 
312 class MySortingFrame: public wxFrame
313 {
314 public:
315     MySortingFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h);
316     ~MySortingFrame();
317 
318 public:
319     void OnQuit(wxCommandEvent& event);
320     void OnAbout(wxCommandEvent& event);
321 
322     void OnAppendRowLeft(wxCommandEvent& event);
323     void OnPrependRowLeft(wxCommandEvent& event);
324     void OnInsertRowLeft(wxCommandEvent& event);
325     void OnDeleteRowLeft(wxCommandEvent& event);
326     void OnEditRowLeft(wxCommandEvent& event);
327 
328     void OnAppendRowRight(wxCommandEvent& event);
329     void OnPrependRowRight(wxCommandEvent& event);
330     void OnInsertRowRight(wxCommandEvent& event);
331     void OnDeleteRowRight(wxCommandEvent& event);
332     void OnEditRowRight(wxCommandEvent& event);
333 
334     void OnSelect(wxCommandEvent& event);
335     void OnUnselectAll(wxCommandEvent& event);
336 
337     void OnSelectedUnsorted(wxDataViewEvent &event);
338     void OnSelectedSorted(wxDataViewEvent &event);
339     void OnActivatedUnsorted(wxDataViewEvent &event);
340 
341     void OnHeaderClickSorted(wxDataViewEvent &event);
342     void OnHeaderClickUnsorted(wxDataViewEvent &event);
343 
344 private:
345     wxDataViewCtrl* dataview_left;
346     wxDataViewCtrl* dataview_right;
347 
348     wxLog          *m_logOld;
349     wxTextCtrl     *m_logWindow;
350 
351     MyUnsortedTextModel        *m_unsorted_model;
352     wxDataViewSortedListModel  *m_sorted_model;
353 
354     DECLARE_EVENT_TABLE()
355 };
356 
357 // -------------------------------------
358 // MyApp
359 // -------------------------------------
360 
361 #define DYNAMIC_QUIT   wxID_EXIT
362 #define DYNAMIC_ABOUT  wxID_ABOUT
363 
IMPLEMENT_APP(MyApp)364 IMPLEMENT_APP  (MyApp)
365 
366 bool MyApp::OnInit(void)
367 {
368     MyFrame *frame = new MyFrame(NULL, wxT("wxDataViewCtrl feature test"), 10, 10, 800, 340);
369     frame->Show(true);
370 
371     MySortingFrame *frame2 = new MySortingFrame(NULL, wxT("wxDataViewCtrl sorting test"), 10, 150, 600, 500);
372     frame2->Show(true);
373 
374     SetTopWindow(frame);
375 
376     return true;
377 }
378 
379 // -------------------------------------
380 // MyFrame
381 // -------------------------------------
382 
MyFrame(wxFrame * frame,wxChar * title,int x,int y,int w,int h)383 MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h):
384   wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))
385 {
386     SetIcon(wxICON(sample));
387 
388     wxMenu *file_menu = new wxMenu;
389 
390     file_menu->Append(DYNAMIC_ABOUT, _T("&About"));
391     file_menu->Append(DYNAMIC_QUIT, _T("E&xit"));
392     wxMenuBar *menu_bar = new wxMenuBar;
393     menu_bar->Append(file_menu, _T("&File"));
394     SetMenuBar(menu_bar);
395 
396     // You used to have to do some casting for param 4, but now there are type-safe handlers
397     Connect( DYNAMIC_QUIT,  wxID_ANY,
398                     wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MyFrame::OnQuit) );
399     Connect( DYNAMIC_ABOUT, wxID_ANY,
400                     wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MyFrame::OnAbout) );
401 
402     CreateStatusBar();
403 
404     wxPanel *panel = new wxPanel( this, wxID_ANY );
405 
406 
407     // Left wxDataViewCtrl
408     dataview_left = new wxDataViewCtrl( panel, wxID_ANY );
409 
410     MyTextModel *model = new MyTextModel;
411     dataview_left->AssociateModel( model );
412 
413     dataview_left->AppendTextColumn( wxT("first"), 0 );
414     dataview_left->AppendTextColumn( wxT("second"), 1 );
415 
416     wxDataViewTextRenderer *text_renderer = new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
417     wxDataViewColumn *column = new wxDataViewColumn( wxT("editable"), text_renderer, 2 );
418     dataview_left->AppendColumn( column );
419 
420     dataview_left->AppendToggleColumn( wxT("fourth"), 3 );
421 
422     MyCustomRenderer *custom_renderer = new MyCustomRenderer;
423     column = new wxDataViewColumn( wxT("custom"), custom_renderer, 4 );
424     dataview_left->AppendColumn( column );
425 
426     dataview_left->AppendProgressColumn( wxT("progress"), 5 );
427 
428     dataview_left->AppendDateColumn( wxT("date"), 6 );
429 
430     // Right wxDataViewCtrl using the same model
431     dataview_right = new wxDataViewCtrl( panel, wxID_ANY );
432     dataview_right->AssociateModel( model );
433 
434     text_renderer = new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
435     column = new wxDataViewColumn( wxT("editable"), text_renderer, 2 );
436     dataview_right->AppendColumn( column );
437     dataview_right->AppendTextColumn( wxT("first"), 0 );
438     dataview_right->AppendTextColumn( wxT("second"), 1 );
439     wxDataViewToggleRenderer *toggle_renderer = new wxDataViewToggleRenderer( wxT("bool"), wxDATAVIEW_CELL_ACTIVATABLE );
440     column = new wxDataViewColumn( wxT("bool"), toggle_renderer, 3, 30 );
441     dataview_right->AppendColumn( column );
442 
443     dataview_right->AppendDateColumn( wxT("date"), 6 );
444 
445     // layout dataview controls.
446 
447     wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL );
448     sizer->Add( dataview_left, 3, wxGROW );
449     sizer->Add(10,10);
450     sizer->Add( dataview_right, 2, wxGROW );
451     panel->SetSizer( sizer );
452 }
453 
OnQuit(wxCommandEvent & WXUNUSED (event))454 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
455 {
456     Close(true);
457 }
458 
OnAbout(wxCommandEvent & WXUNUSED (event))459 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
460 {
461     wxMessageDialog dialog(this, _T("This demonstrates the dataview control handling"),
462         _T("About DataView"), wxOK);
463 
464     dialog.ShowModal();
465 }
466 
467 // -------------------------------------
468 // MySortingFrame
469 // -------------------------------------
470 
BEGIN_EVENT_TABLE(MySortingFrame,wxFrame)471 BEGIN_EVENT_TABLE(MySortingFrame,wxFrame)
472     EVT_BUTTON( ID_APPEND_ROW_LEFT, MySortingFrame::OnAppendRowLeft )
473     EVT_BUTTON( ID_PREPEND_ROW_LEFT, MySortingFrame::OnPrependRowLeft )
474     EVT_BUTTON( ID_INSERT_ROW_LEFT, MySortingFrame::OnInsertRowLeft )
475     EVT_BUTTON( ID_DELETE_ROW_LEFT, MySortingFrame::OnDeleteRowLeft )
476     EVT_BUTTON( ID_SELECT, MySortingFrame::OnSelect )
477     EVT_BUTTON( ID_UNSELECT_ALL, MySortingFrame::OnUnselectAll )
478     EVT_DATAVIEW_ROW_SELECTED( ID_SORTED, MySortingFrame::OnSelectedSorted )
479     EVT_DATAVIEW_ROW_SELECTED( ID_UNSORTED, MySortingFrame::OnSelectedUnsorted )
480     EVT_DATAVIEW_ROW_ACTIVATED( ID_UNSORTED, MySortingFrame::OnActivatedUnsorted )
481     EVT_DATAVIEW_COLUMN_HEADER_CLICK( ID_SORTED, MySortingFrame::OnHeaderClickSorted )
482     EVT_DATAVIEW_COLUMN_HEADER_CLICK( ID_UNSORTED, MySortingFrame::OnHeaderClickUnsorted )
483 END_EVENT_TABLE()
484 
485 MySortingFrame::MySortingFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h):
486   wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))
487 {
488     m_logOld = NULL;
489 
490     SetIcon(wxICON(sample));
491 
492     wxMenu *file_menu = new wxMenu;
493 
494     file_menu->Append(DYNAMIC_ABOUT, _T("&About"));
495     file_menu->Append(DYNAMIC_QUIT, _T("E&xit"));
496     wxMenuBar *menu_bar = new wxMenuBar;
497     menu_bar->Append(file_menu, _T("&File"));
498     SetMenuBar(menu_bar);
499 
500     // You used to have to do some casting for param 4, but now there are type-safe handlers
501     Connect( DYNAMIC_QUIT,  wxID_ANY,
502                     wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MySortingFrame::OnQuit) );
503     Connect( DYNAMIC_ABOUT, wxID_ANY,
504                     wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MySortingFrame::OnAbout) );
505 
506     CreateStatusBar();
507 
508 
509     // Left wxDataViewCtrl
510     dataview_left = new wxDataViewCtrl( this, ID_UNSORTED, wxDefaultPosition, wxDefaultSize, wxDV_MULTIPLE );
511 
512     m_unsorted_model = new MyUnsortedTextModel;
513     dataview_left->AssociateModel( m_unsorted_model );
514     wxDataViewTextRenderer *text_renderer = new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
515     wxDataViewColumn *column = new wxDataViewColumn( wxT("editable"), text_renderer, 0 );
516     dataview_left->AppendColumn( column );
517     dataview_left->AppendTextColumn( wxT("second"), 1 );
518     dataview_left->AppendColumn( new wxDataViewColumn( wxBitmap(null_xpm), new wxDataViewBitmapRenderer, 2, 25 ) );
519     dataview_left->AppendColumn( new wxDataViewColumn( wxT("icon"), new wxDataViewBitmapRenderer, 3, 25 ) );
520 
521     // Right wxDataViewCtrl using the sorting model
522     dataview_right = new wxDataViewCtrl( this, ID_SORTED );
523 
524     m_sorted_model = new wxDataViewSortedListModel( m_unsorted_model );
525     dataview_right->AssociateModel( m_sorted_model );
526     text_renderer = new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
527     column = new wxDataViewColumn( wxT("editable"), text_renderer, 0, -1, wxDATAVIEW_COL_SORTABLE|wxDATAVIEW_COL_RESIZABLE );
528     dataview_right->AppendColumn( column );
529 
530     dataview_right->AppendTextColumn( wxT("second"), 1 );
531 
532     // layout dataview controls.
533 
534     wxBoxSizer *top_sizer = new wxBoxSizer( wxHORIZONTAL );
535     top_sizer->Add( dataview_left, 1, wxGROW );
536     top_sizer->Add(10,10);
537     top_sizer->Add( dataview_right, 1, wxGROW );
538 
539     wxBoxSizer *button_sizer = new wxBoxSizer( wxHORIZONTAL );
540     button_sizer->Add( 10, 10, 1 );
541     wxFlexGridSizer *left_sizer = new wxFlexGridSizer( 2 );
542     left_sizer->Add( new wxButton( this, ID_APPEND_ROW_LEFT, wxT("Append") ), 0, wxALL, 5 );
543     left_sizer->Add( new wxButton( this, ID_PREPEND_ROW_LEFT, wxT("Prepend") ), 0, wxALL, 5 );
544     left_sizer->Add( new wxButton( this, ID_INSERT_ROW_LEFT, wxT("Insert") ), 0, wxALL, 5 );
545     left_sizer->Add( new wxButton( this, ID_DELETE_ROW_LEFT, wxT("Delete second") ), 0, wxALL, 5 );
546     left_sizer->Add( new wxButton( this, ID_EDIT_ROW_LEFT, wxT("Edit") ), 0, wxALL, 5 );
547     left_sizer->Add( 5,5 );
548     left_sizer->Add( new wxButton( this, ID_SELECT, wxT("Select third") ), 0, wxALL, 5 );
549     left_sizer->Add( new wxButton( this, ID_UNSELECT_ALL, wxT("Unselect all") ), 0, wxALL, 5 );
550     button_sizer->Add( left_sizer );
551     button_sizer->Add( 10, 10, 2 );
552     wxFlexGridSizer *right_sizer = new wxFlexGridSizer( 2 );
553     right_sizer->Add( new wxButton( this, ID_APPEND_ROW_RIGHT, wxT("Append") ), 0, wxALL, 5 );
554     right_sizer->Add( new wxButton( this, ID_PREPEND_ROW_RIGHT, wxT("Prepend") ), 0, wxALL, 5 );
555     right_sizer->Add( new wxButton( this, ID_INSERT_ROW_RIGHT, wxT("Insert") ), 0, wxALL, 5 );
556     right_sizer->Add( new wxButton( this, ID_DELETE_ROW_RIGHT, wxT("Delete second") ), 0, wxALL, 5 );
557     right_sizer->Add( new wxButton( this, ID_EDIT_ROW_RIGHT, wxT("Edit") ), 0, wxALL, 5 );
558     button_sizer->Add( right_sizer );
559     button_sizer->Add( 10, 10, 1 );
560 
561     wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
562     main_sizer->Add( top_sizer, 1, wxGROW );
563     main_sizer->Add( button_sizer, 0, wxGROW );
564 
565     m_logWindow = new wxTextCtrl(this, wxID_ANY, wxEmptyString,
566                                  wxDefaultPosition, wxDefaultSize,
567                                  wxTE_MULTILINE | wxSUNKEN_BORDER);
568     main_sizer->Add( 20,20 );
569     main_sizer->Add( m_logWindow, 1, wxGROW );
570 
571     m_logOld = wxLog::SetActiveTarget(new wxLogTextCtrl(m_logWindow));
572 
573     SetSizer( main_sizer );
574 }
575 
~MySortingFrame()576 MySortingFrame::~MySortingFrame()
577 {
578     delete wxLog::SetActiveTarget(m_logOld);
579 }
580 
OnSelectedUnsorted(wxDataViewEvent & event)581 void MySortingFrame::OnSelectedUnsorted(wxDataViewEvent &event)
582 {
583     int row = event.GetRow();
584     wxLogMessage( wxT("OnSelected from unsorted list, selected %d"), row );
585     if (row >= 0)
586         wxLogMessage( wxT("wxDataViewCtrl::IsSelected( %d ): %d (as int)"),
587                     row, (int) dataview_right->IsSelected( row ) );
588 }
589 
OnSelectedSorted(wxDataViewEvent & event)590 void MySortingFrame::OnSelectedSorted(wxDataViewEvent &event)
591 {
592     wxLogMessage( wxT("OnSelected from sorted list, selected %d"), (int) event.GetRow() );
593 }
594 
OnActivatedUnsorted(wxDataViewEvent & event)595 void MySortingFrame::OnActivatedUnsorted(wxDataViewEvent &event)
596 {
597     wxLogMessage( wxT("OnActivated from unsorted list, activated %d"), (int) event.GetRow() );
598 }
599 
OnHeaderClickSorted(wxDataViewEvent & event)600 void MySortingFrame::OnHeaderClickSorted(wxDataViewEvent &event)
601 {
602     wxDataViewColumn *col = event.GetDataViewColumn();
603     wxLogMessage( wxT("OnHeaderClick from sorted list, column %s"), col->GetTitle().c_str() );
604 
605     if (col->GetTitle() == wxT("editable"))
606     {
607         // this is the sorting column
608         if (col->IsSortOrderAscending())
609         {
610             col->SetSortOrder( false );
611             m_sorted_model->SetAscending( false );
612             m_sorted_model->Resort();
613         }
614         else
615         {
616             col->SetSortOrder( true );
617             m_sorted_model->SetAscending( true );
618             m_sorted_model->Resort();
619         }
620     }
621 }
622 
OnHeaderClickUnsorted(wxDataViewEvent & event)623 void MySortingFrame::OnHeaderClickUnsorted(wxDataViewEvent &event)
624 {
625     wxLogMessage( wxT("OnHeaderClick from unsorted list, column %s"), event.GetDataViewColumn()->GetTitle().c_str() );
626 }
627 
OnQuit(wxCommandEvent & WXUNUSED (event))628 void MySortingFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
629 {
630     Close(true);
631 }
632 
OnAbout(wxCommandEvent & WXUNUSED (event))633 void MySortingFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
634 {
635     wxMessageDialog dialog(this, _T("This demonstrates the dataview control sorting"),
636         _T("About DataView"), wxOK);
637 
638     dialog.ShowModal();
639 }
640 
OnSelect(wxCommandEvent & WXUNUSED (event))641 void MySortingFrame::OnSelect(wxCommandEvent& WXUNUSED(event))
642 {
643     dataview_left->SetSelection( 2 );
644 }
645 
OnUnselectAll(wxCommandEvent & WXUNUSED (event))646 void MySortingFrame::OnUnselectAll(wxCommandEvent& WXUNUSED(event))
647 {
648     dataview_left->ClearSelection();
649 }
650 
OnAppendRowLeft(wxCommandEvent & WXUNUSED (event))651 void MySortingFrame::OnAppendRowLeft(wxCommandEvent& WXUNUSED(event))
652 {
653     wxTextEntryDialog dialog( this, wxT("Enter text to append") );
654     if (dialog.ShowModal() == wxID_OK)
655     {
656         wxString value = dialog.GetValue();
657         if (!value.empty())
658             m_unsorted_model->AppendRow( value );
659     }
660 }
661 
OnPrependRowLeft(wxCommandEvent & WXUNUSED (event))662 void MySortingFrame::OnPrependRowLeft(wxCommandEvent& WXUNUSED(event))
663 {
664     wxTextEntryDialog dialog( this, wxT("Enter text to prepend") );
665     if (dialog.ShowModal() == wxID_OK)
666     {
667         wxString value = dialog.GetValue();
668         if (!value.empty())
669             m_unsorted_model->PrependRow( value );
670     }
671 }
672 
OnInsertRowLeft(wxCommandEvent & WXUNUSED (event))673 void MySortingFrame::OnInsertRowLeft(wxCommandEvent& WXUNUSED(event))
674 {
675     wxTextEntryDialog dialog( this, wxT("Enter text to insert before second") );
676     if (dialog.ShowModal() == wxID_OK)
677     {
678         wxString value = dialog.GetValue();
679         if (!value.empty())
680             m_unsorted_model->InsertRowAt1( value );
681     }
682 }
683 
OnDeleteRowLeft(wxCommandEvent & WXUNUSED (event))684 void MySortingFrame::OnDeleteRowLeft(wxCommandEvent& WXUNUSED(event))
685 {
686     m_unsorted_model->DeleteRow( 1 );
687 }
688 
OnEditRowLeft(wxCommandEvent & WXUNUSED (event))689 void MySortingFrame::OnEditRowLeft(wxCommandEvent& WXUNUSED(event))
690 {
691 }
692 
OnAppendRowRight(wxCommandEvent & WXUNUSED (event))693 void MySortingFrame::OnAppendRowRight(wxCommandEvent& WXUNUSED(event))
694 {
695 }
696 
OnPrependRowRight(wxCommandEvent & WXUNUSED (event))697 void MySortingFrame::OnPrependRowRight(wxCommandEvent& WXUNUSED(event))
698 {
699 }
700 
OnInsertRowRight(wxCommandEvent & WXUNUSED (event))701 void MySortingFrame::OnInsertRowRight(wxCommandEvent& WXUNUSED(event))
702 {
703 }
704 
OnDeleteRowRight(wxCommandEvent & WXUNUSED (event))705 void MySortingFrame::OnDeleteRowRight(wxCommandEvent& WXUNUSED(event))
706 {
707 }
708 
OnEditRowRight(wxCommandEvent & WXUNUSED (event))709 void MySortingFrame::OnEditRowRight(wxCommandEvent& WXUNUSED(event))
710 {
711 }
712 
713