]> git.saurik.com Git - wxWidgets.git/blob - samples/dataview/dataview.cpp
Most of FM's wxDataViewCtrl patch.
[wxWidgets.git] / samples / dataview / dataview.cpp
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$
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 #include "wx/splitter.h"
25 #include "wx/aboutdlg.h"
26
27 #ifndef __WXMSW__
28 #include "../sample.xpm"
29 #endif
30
31 #include "null.xpm"
32
33 #include "wx/dataview.h"
34
35 // -------------------------------------
36 // MyTextModel
37 // -------------------------------------
38
39 WX_DECLARE_OBJARRAY(wxDateTime,wxArrayDate);
40 #include <wx/arrimpl.cpp>
41 WX_DEFINE_OBJARRAY(wxArrayDate)
42
43 class MyTextModel: public wxDataViewListModel
44 {
45 public:
46 MyTextModel()
47 {
48 unsigned int i;
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++)
58 {
59 wxDateTime date( wxDateTime::Now() );
60 m_dates.Add( date );
61 }
62 }
63
64 virtual unsigned int GetNumberOfRows()
65 { return 1000; }
66 virtual unsigned int GetNumberOfCols()
67 { return 7; }
68
69 // as reported by wxVariant
70 virtual wxString GetColType( unsigned int col )
71 {
72 if (col == 6)
73 return wxT("datetime");
74
75 if (col == 5)
76 return wxT("long");
77
78 if (col == 3)
79 return wxT("bool");
80
81 return wxT("string");
82 }
83
84 virtual void GetValue( wxVariant &variant, unsigned int col, unsigned int row )
85 {
86 if (col == 6)
87 {
88 variant = (wxDateTime) m_dates[row];
89 } else
90 if (col == 5)
91 {
92 variant = (long) m_progress[row];
93 } else
94 if (col == 4)
95 {
96 variant = m_colours[row];
97 } else
98 if (col == 3)
99 {
100 variant = (bool) (m_bools[row] != 0);
101 } else
102 if (col == 2)
103 {
104 variant = m_list[row];
105 }
106 else
107 {
108 wxString tmp;
109 tmp.Printf( wxT("item(%d;%d)"), (int)row, (int)col );
110 variant = tmp;
111 }
112 }
113 virtual bool SetValue( wxVariant &value, unsigned int col, unsigned int row )
114 {
115 if (col == 6)
116 {
117 m_dates[row] = value.GetDateTime();
118 } else
119 if (col == 3)
120 {
121 m_bools[row] = (int) value.GetBool();
122 } else
123 if (col == 2)
124 {
125 m_list[row] = value.GetString();
126 }
127 return true;
128 }
129
130 wxArrayString m_list;
131 wxArrayInt m_bools;
132 wxArrayString m_colours;
133 wxArrayInt m_progress;
134 wxArrayDate m_dates;
135 };
136
137 // -------------------------------------
138 // MyCustomRenderer
139 // -------------------------------------
140
141 class MyCustomRenderer: public wxDataViewCustomRenderer
142 {
143 public:
144 MyCustomRenderer() :
145 wxDataViewCustomRenderer( wxT("string"), wxDATAVIEW_CELL_ACTIVATABLE )
146 {
147 m_colour = wxT("black");
148 }
149 bool SetValue( const wxVariant &value )
150 {
151 m_colour = value.GetString();
152 return true;
153 }
154 bool Render( wxRect rect, wxDC *dc, int WXUNUSED(state) )
155 {
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 );
161 else
162 dc->SetBrush( *wxBLACK_BRUSH );
163 dc->DrawRectangle( rect );
164 return true;
165 }
166 wxSize GetSize()
167 {
168 return wxSize(20,8);
169 }
170 bool Activate( wxRect WXUNUSED(rect),
171 wxDataViewListModel *WXUNUSED(model),
172 unsigned int WXUNUSED(col),
173 unsigned int WXUNUSED(row) )
174 {
175 return false;
176 }
177
178 private:
179 wxString m_colour;
180 };
181
182 // -------------------------------------
183 // MyUnsortedTextModel
184 // -------------------------------------
185
186 class MyUnsortedTextModel: public wxDataViewListModel
187 {
188 public:
189 MyUnsortedTextModel()
190 {
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.") );
198
199 m_bitmap = wxBitmap( null_xpm );
200 }
201
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 )
206 {
207 if (col == 0)
208 {
209 variant = m_list[row];
210 return;
211 }
212 if ((col == 2) || (col == 3))
213 {
214 variant << m_bitmap;
215 return;
216 }
217 wxString tmp;
218 tmp.Printf( wxT("item(%d;%d)"), (int)row, (int)col );
219 variant = tmp;
220 }
221 virtual bool SetValue( wxVariant &variant, unsigned int col, unsigned int row )
222 {
223 if (col == 0)
224 {
225 m_list[row] = variant.GetString();
226 return true;
227 }
228 return false;
229
230 }
231
232 void AppendRow( const wxString &text )
233 {
234 m_list.Add( text );
235 RowAppended();
236 }
237
238 void PrependRow( const wxString &text )
239 {
240 m_list.Insert( text, 0 );
241 RowPrepended();
242 }
243
244 void InsertRowAt1( const wxString &text )
245 {
246 m_list.Insert( text, 1 );
247 RowInserted( 1 );
248 }
249
250 void DeleteRow( unsigned int index )
251 {
252 m_list.RemoveAt( index );
253 RowDeleted( index );
254 }
255
256 wxArrayString m_list;
257 wxBitmap m_bitmap;
258 };
259
260 // -------------------------------------
261 // MyApp
262 // -------------------------------------
263
264 class MyApp: public wxApp
265 {
266 public:
267 bool OnInit(void);
268 int OnExit();
269 };
270
271 // -------------------------------------
272 // MyFrame
273 // -------------------------------------
274
275 class MyFrame : public wxFrame
276 {
277 public:
278 MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h);
279
280 public:
281 void OnQuit(wxCommandEvent& event);
282 void OnAbout(wxCommandEvent& event);
283 void OnNewSortingFrame(wxCommandEvent& event);
284
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);
291
292 private:
293 wxDataViewCtrl* dataview_left;
294 wxDataViewCtrl* dataview_right;
295 wxSplitterWindow *m_splitter;
296
297 wxAlignment m_align;
298
299 void CreateControls();
300
301 private:
302 DECLARE_EVENT_TABLE()
303 };
304
305 // -------------------------------------
306 // MySortingFrame
307 // -------------------------------------
308
309 enum my_events
310 {
311 ID_APPEND_ROW_LEFT = 1000,
312 ID_PREPEND_ROW_LEFT,
313 ID_INSERT_ROW_LEFT,
314 ID_DELETE_ROW_LEFT,
315 ID_EDIT_ROW_LEFT,
316
317 ID_SELECT,
318 ID_UNSELECT_ALL,
319
320 ID_APPEND_ROW_RIGHT,
321 ID_PREPEND_ROW_RIGHT,
322 ID_INSERT_ROW_RIGHT,
323 ID_DELETE_ROW_RIGHT,
324 ID_EDIT_ROW_RIGHT,
325
326 ID_SORTED,
327 ID_UNSORTED,
328 ID_ACTIVATED
329 };
330
331 class MySortingFrame: public wxFrame
332 {
333 public:
334 MySortingFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h);
335 ~MySortingFrame();
336
337 public:
338 void OnQuit(wxCommandEvent& event);
339 void OnAbout(wxCommandEvent& event);
340
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);
346
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);
352
353 void OnSelect(wxCommandEvent& event);
354 void OnUnselectAll(wxCommandEvent& event);
355
356 void OnSelectedUnsorted(wxDataViewEvent &event);
357 void OnSelectedSorted(wxDataViewEvent &event);
358 void OnActivatedUnsorted(wxDataViewEvent &event);
359
360 void OnHeaderClickSorted(wxDataViewEvent &event);
361 void OnHeaderClickUnsorted(wxDataViewEvent &event);
362
363 private:
364 wxDataViewCtrl* dataview_left;
365 wxDataViewCtrl* dataview_right;
366
367 wxLog *m_logOld;
368 wxTextCtrl *m_logWindow;
369
370 MyUnsortedTextModel *m_unsorted_model;
371 wxDataViewSortedListModel *m_sorted_model;
372
373 DECLARE_EVENT_TABLE()
374 };
375
376 // -------------------------------------
377 // MyApp
378 // -------------------------------------
379
380 IMPLEMENT_APP(MyApp)
381
382 bool MyApp::OnInit(void)
383 {
384 if ( !wxApp::OnInit() )
385 return false;
386
387 // build the first frame
388 MyFrame *frame =
389 new MyFrame(NULL, wxT("wxDataViewCtrl feature test"), 10, 10, 800, 340);
390 frame->Show(true);
391
392 SetTopWindow(frame);
393 return true;
394 }
395
396 int MyApp::OnExit()
397 {
398 return 0;
399 }
400
401
402 // -------------------------------------
403 // MyFrame
404 // -------------------------------------
405
406 enum
407 {
408 // file menu
409 ID_ABOUT = wxID_ABOUT,
410 ID_NEW_SORT_FRAME,
411 ID_EXIT = wxID_EXIT,
412
413 // dataviewctrl menu
414 ID_SINGLE_SEL_MODE,
415 ID_MULTIPLE_SEL_MODE,
416
417 ID_RESIZEABLE_COLUMNS,
418 ID_SORTABLE_COLUMNS,
419 ID_HIDDEN_COLUMNS,
420
421 ID_CHOOSE_ALIGNMENT
422 };
423
424 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
425
426 // file menu
427 EVT_MENU( ID_ABOUT, MyFrame::OnAbout )
428 EVT_MENU( ID_NEW_SORT_FRAME, MyFrame::OnNewSortingFrame )
429 EVT_MENU( ID_EXIT, MyFrame::OnQuit )
430
431 // dataviewctrl menu
432 EVT_MENU( ID_SINGLE_SEL_MODE, MyFrame::OnSingleSelMode )
433 EVT_MENU( ID_MULTIPLE_SEL_MODE, MyFrame::OnMultipleSelMode )
434
435 EVT_MENU( ID_RESIZEABLE_COLUMNS, MyFrame::OnResizeableColumn )
436 EVT_MENU( ID_SORTABLE_COLUMNS, MyFrame::OnSortableColumn )
437 EVT_MENU( ID_HIDDEN_COLUMNS, MyFrame::OnHideColumn )
438
439 EVT_MENU( ID_CHOOSE_ALIGNMENT, MyFrame::OnChooseAlign )
440
441 END_EVENT_TABLE()
442
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))
445 {
446 SetIcon(wxICON(sample));
447
448 // build the menus:
449
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"));
456
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..."));
466
467 wxMenuBar *menu_bar = new wxMenuBar;
468 menu_bar->Append(file_menu, _T("&File"));
469 menu_bar->Append(data_menu, _T("&DataViewCtrl"));
470
471 SetMenuBar(menu_bar);
472 CreateStatusBar();
473
474
475 // build the other controls:
476
477 m_splitter = new wxSplitterWindow( this, wxID_ANY );
478 m_splitter->SetSashGravity(0.5);
479
480 m_align = wxALIGN_CENTER;
481 dataview_left = dataview_right = NULL;
482 CreateControls();
483
484 m_splitter->SplitVertically(dataview_left, dataview_right);
485 }
486
487 void MyFrame::CreateControls()
488 {
489 wxDataViewCtrl *old1 = NULL, *old2 = NULL;
490
491 if (dataview_left)
492 old1 = dataview_left;
493 if (dataview_right)
494 old2 = dataview_right;
495
496 // styles:
497
498 long style = 0;
499 if (GetMenuBar()->FindItem(ID_MULTIPLE_SEL_MODE)->IsChecked())
500 style |= wxDV_MULTIPLE;
501
502 int flags = 0;
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;
509
510
511 // Left wxDataViewCtrl
512 dataview_left = new wxDataViewCtrl( m_splitter, wxID_ANY, wxDefaultPosition,
513 wxDefaultSize, style );
514
515 MyTextModel *model = new MyTextModel;
516 dataview_left->AssociateModel( model );
517 model->DecRef(); // don't leak memory
518
519 dataview_left->AppendTextColumn( wxT("first"), 0, wxDATAVIEW_CELL_INERT, -1,
520 m_align, flags );
521 dataview_left->AppendTextColumn( wxT("second"), 1, wxDATAVIEW_CELL_INERT, -1,
522 m_align, flags );
523
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 );
529
530 dataview_left->AppendToggleColumn( wxT("fourth"), 3, wxDATAVIEW_CELL_INERT, -1,
531 m_align, flags );
532
533 MyCustomRenderer *custom_renderer = new MyCustomRenderer;
534 column = new wxDataViewColumn( wxT("custom"), custom_renderer, 4, -1,
535 m_align, flags );
536 dataview_left->AppendColumn( column );
537
538 dataview_left->AppendProgressColumn( wxT("progress"), 5, wxDATAVIEW_CELL_INERT, -1,
539 m_align, flags );
540
541 dataview_left->AppendDateColumn( wxT("date"), 6, wxDATAVIEW_CELL_INERT, -1,
542 m_align, flags );
543
544
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 );
549
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 );
559
560 dataview_right->AppendDateColumn( wxT("date"), 6 );
561
562 // layout dataview controls
563 if (old1)
564 {
565 m_splitter->ReplaceWindow(old1, dataview_left);
566 delete old1;
567 }
568
569 if (old2)
570 {
571 m_splitter->ReplaceWindow(old2, dataview_right);
572 delete old2;
573 }
574 }
575
576 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
577 {
578 Close(true);
579 }
580
581 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
582 {
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"));
587
588 wxAboutBox(info);
589 }
590
591 void MyFrame::OnNewSortingFrame(wxCommandEvent& WXUNUSED(event) )
592 {
593 MySortingFrame *frame2 =
594 new MySortingFrame(NULL, wxT("wxDataViewCtrl sorting test"), 10, 150, 600, 500);
595 frame2->Show(true);
596 }
597
598 void MyFrame::OnSingleSelMode(wxCommandEvent& event)
599 {
600 CreateControls();
601 }
602
603 void MyFrame::OnMultipleSelMode(wxCommandEvent& event)
604 {
605 CreateControls();
606 }
607
608 void MyFrame::OnResizeableColumn(wxCommandEvent& event)
609 {
610 CreateControls();
611 }
612
613 void MyFrame::OnSortableColumn(wxCommandEvent& event)
614 {
615 CreateControls();
616 }
617
618 void MyFrame::OnHideColumn(wxCommandEvent& event)
619 {
620 CreateControls();
621 }
622
623 void MyFrame::OnChooseAlign(wxCommandEvent& event)
624 {
625 const wxString choices[] =
626 {
627 wxT("Left"),
628 wxT("Center horizontally"),
629 wxT("Right"),
630 wxT("Top"),
631 wxT("Center vertically"),
632 wxT("Bottom"),
633 wxT("Center")
634 };
635
636 wxAlignment flags[] =
637 {
638 wxALIGN_LEFT,
639 wxALIGN_CENTER_HORIZONTAL,
640 wxALIGN_RIGHT,
641 wxALIGN_TOP,
642 wxALIGN_CENTER_VERTICAL,
643 wxALIGN_BOTTOM,
644 wxALIGN_CENTER
645 };
646
647 int choice = wxGetSingleChoiceIndex(
648 wxT("Select the alignment for the cells of the wxDataViewCtrl:"),
649 wxT("Alignment"),
650 WXSIZEOF(choices), choices,
651 this);
652
653 if (choice == wxNOT_FOUND)
654 return;
655
656 m_align = flags[choice];
657 CreateControls();
658 }
659
660
661 // -------------------------------------
662 // MySortingFrame
663 // -------------------------------------
664
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 )
677 END_EVENT_TABLE()
678
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))
681 {
682 m_logOld = NULL;
683
684 SetIcon(wxICON(sample));
685 CreateStatusBar();
686
687 wxPanel *main = new wxPanel(this);
688
689 // Left wxDataViewCtrl
690 dataview_left = new wxDataViewCtrl( main, ID_UNSORTED, wxDefaultPosition,
691 wxDefaultSize, wxDV_MULTIPLE );
692
693 m_unsorted_model = new MyUnsortedTextModel;
694 dataview_left->AssociateModel( m_unsorted_model );
695 m_unsorted_model->DecRef(); // don't leak memory
696
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 ) );
706
707 // Right wxDataViewCtrl using the sorting model
708 dataview_right = new wxDataViewCtrl( main, ID_SORTED );
709
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
713
714 text_renderer = new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
715 column = new wxDataViewColumn( wxT("editable"), text_renderer, 0, -1,
716 wxALIGN_CENTER,
717 wxDATAVIEW_COL_SORTABLE|wxDATAVIEW_COL_RESIZABLE );
718 dataview_right->AppendColumn( column );
719
720 dataview_right->AppendTextColumn( wxT("second"), 1 );
721
722 // layout dataview controls.
723
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 );
728
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 );
750
751 wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
752 main_sizer->Add( top_sizer, 1, wxGROW );
753 main_sizer->Add( button_sizer, 0, wxGROW );
754
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 );
760
761 m_logOld = wxLog::SetActiveTarget(new wxLogTextCtrl(m_logWindow));
762
763 main->SetSizer( main_sizer );
764 }
765
766 MySortingFrame::~MySortingFrame()
767 {
768 delete wxLog::SetActiveTarget(m_logOld);
769 }
770
771 void MySortingFrame::OnSelectedUnsorted(wxDataViewEvent &event)
772 {
773 int row = event.GetRow();
774 wxLogMessage( wxT("OnSelected from unsorted list, selected %d"), row );
775 if (row >= 0)
776 wxLogMessage( wxT("wxDataViewCtrl::IsSelected( %d ): %d (as int)"),
777 row, (int) dataview_right->IsSelected( row ) );
778 }
779
780 void MySortingFrame::OnSelectedSorted(wxDataViewEvent &event)
781 {
782 wxLogMessage( wxT("OnSelected from sorted list, selected %d"), (int) event.GetRow() );
783 }
784
785 void MySortingFrame::OnActivatedUnsorted(wxDataViewEvent &event)
786 {
787 wxLogMessage( wxT("OnActivated from unsorted list, activated %d"), (int) event.GetRow() );
788 }
789
790 void MySortingFrame::OnHeaderClickSorted(wxDataViewEvent &event)
791 {
792 wxDataViewColumn *col = event.GetDataViewColumn();
793 wxLogMessage( wxT("OnHeaderClick from sorted list, column %s"), col->GetTitle().c_str() );
794
795 if (col->GetTitle() == wxT("editable"))
796 {
797 // this is the sorting column
798 if (col->IsSortOrderAscending())
799 {
800 col->SetSortOrder( false );
801 m_sorted_model->SetAscending( false );
802 m_sorted_model->Resort();
803 }
804 else
805 {
806 col->SetSortOrder( true );
807 m_sorted_model->SetAscending( true );
808 m_sorted_model->Resort();
809 }
810 }
811 }
812
813 void MySortingFrame::OnHeaderClickUnsorted(wxDataViewEvent &event)
814 {
815 wxLogMessage( wxT("OnHeaderClick from unsorted list, column %s"),
816 event.GetDataViewColumn()->GetTitle().c_str() );
817 }
818
819 void MySortingFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
820 {
821 Close(true);
822 }
823
824 void MySortingFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
825 {
826 wxMessageDialog dialog(this, _T("This demonstrates the dataview control sorting"),
827 _T("About DataView"), wxOK);
828
829 dialog.ShowModal();
830 }
831
832 void MySortingFrame::OnSelect(wxCommandEvent& WXUNUSED(event))
833 {
834 dataview_left->SetSelection( 2 );
835 }
836
837 void MySortingFrame::OnUnselectAll(wxCommandEvent& WXUNUSED(event))
838 {
839 dataview_left->ClearSelection();
840 }
841
842 void MySortingFrame::OnAppendRowLeft(wxCommandEvent& WXUNUSED(event))
843 {
844 wxTextEntryDialog dialog( this, wxT("Enter text to append") );
845 if (dialog.ShowModal() == wxID_OK)
846 {
847 wxString value = dialog.GetValue();
848 if (!value.empty())
849 m_unsorted_model->AppendRow( value );
850 }
851 }
852
853 void MySortingFrame::OnPrependRowLeft(wxCommandEvent& WXUNUSED(event))
854 {
855 wxTextEntryDialog dialog( this, wxT("Enter text to prepend") );
856 if (dialog.ShowModal() == wxID_OK)
857 {
858 wxString value = dialog.GetValue();
859 if (!value.empty())
860 m_unsorted_model->PrependRow( value );
861 }
862 }
863
864 void MySortingFrame::OnInsertRowLeft(wxCommandEvent& WXUNUSED(event))
865 {
866 wxTextEntryDialog dialog( this, wxT("Enter text to insert before second") );
867 if (dialog.ShowModal() == wxID_OK)
868 {
869 wxString value = dialog.GetValue();
870 if (!value.empty())
871 m_unsorted_model->InsertRowAt1( value );
872 }
873 }
874
875 void MySortingFrame::OnDeleteRowLeft(wxCommandEvent& WXUNUSED(event))
876 {
877 m_unsorted_model->DeleteRow( 1 );
878 }
879
880 void MySortingFrame::OnEditRowLeft(wxCommandEvent& WXUNUSED(event))
881 {
882 }
883
884 void MySortingFrame::OnAppendRowRight(wxCommandEvent& WXUNUSED(event))
885 {
886 }
887
888 void MySortingFrame::OnPrependRowRight(wxCommandEvent& WXUNUSED(event))
889 {
890 }
891
892 void MySortingFrame::OnInsertRowRight(wxCommandEvent& WXUNUSED(event))
893 {
894 }
895
896 void MySortingFrame::OnDeleteRowRight(wxCommandEvent& WXUNUSED(event))
897 {
898 }
899
900 void MySortingFrame::OnEditRowRight(wxCommandEvent& WXUNUSED(event))
901 {
902 }
903