]> git.saurik.com Git - wxWidgets.git/blob - samples/dataview/dataview.cpp
Change wxVariant GetValue() to GetValue( wxVariant & ).
[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 #ifndef __WXMSW__
24 #include "mondrian.xpm"
25 #endif
26
27 #include "wx/dataview.h"
28
29 // -------------------------------------
30 // MyTextModel
31 // -------------------------------------
32
33 WX_DECLARE_LIST(wxDateTime,wxArrayDate);
34 #include <wx/listimpl.cpp>
35 WX_DEFINE_LIST(wxArrayDate);
36
37 class MyTextModel: public wxDataViewListModel
38 {
39 public:
40 MyTextModel()
41 {
42 size_t i;
43 for (i = 0; i < 1000; i++)
44 m_list.Add( wxT("Test") );
45 for (i = 0; i < 500; i++)
46 { m_bools.Add( 0 ); m_bools.Add( 1 ); }
47 for (i = 0; i < 500; i++)
48 { m_colours.Add( wxT("red") ); m_colours.Add( wxT("green") ); }
49 for (i = 0; i < 1000; i++)
50 { m_progress.Add( i/10 ); }
51 for (i = 0; i < 1000; i++)
52 {
53 wxDateTime *date = new wxDateTime( wxDateTime::Now() );
54 m_dates.Append( date );
55 }
56 }
57
58 virtual size_t GetNumberOfRows()
59 { return 1000; }
60 virtual size_t GetNumberOfCols()
61 { return 7; }
62
63 // as reported by wxVariant
64 virtual wxString GetColType( size_t col )
65 {
66 if (col == 6)
67 return wxT("datetime");
68
69 if (col == 5)
70 return wxT("long");
71
72 if (col == 3)
73 return wxT("bool");
74
75 return wxT("string");
76 }
77
78 virtual void GetValue( wxVariant &variant, size_t col, size_t row )
79 {
80 if (col == 6)
81 {
82 variant = (wxDateTime) *m_dates[row];
83 } else
84 if (col == 5)
85 {
86 variant = (long) m_progress[row];
87 } else
88 if (col == 4)
89 {
90 variant = m_colours[row];
91 } else
92 if (col == 3)
93 {
94 variant = (bool) m_bools[row];
95 } else
96 if (col == 2)
97 {
98 variant = m_list[row];
99 }
100 else
101 {
102 wxString tmp;
103 tmp.Printf( wxT("item(%d;%d)"), (int)row, (int)col );
104 variant = tmp;
105 }
106 }
107 virtual bool SetValue( wxVariant &value, size_t col, size_t row )
108 {
109 if (col == 6)
110 {
111 *m_dates[row] = value.GetDateTime();
112 } else
113 if (col == 3)
114 {
115 m_bools[row] = (int) value.GetBool();
116 } else
117 if (col == 2)
118 {
119 m_list[row] = value.GetString();
120 }
121 return true;
122 }
123
124 wxArrayString m_list;
125 wxArrayInt m_bools;
126 wxArrayString m_colours;
127 wxArrayInt m_progress;
128 wxArrayDate m_dates;
129 };
130
131 // -------------------------------------
132 // MyCustomCell
133 // -------------------------------------
134
135 class MyCustomCell: public wxDataViewCustomCell
136 {
137 public:
138 MyCustomCell() :
139 wxDataViewCustomCell( wxT("string"), wxDATAVIEW_CELL_ACTIVATABLE )
140 {
141 m_colour = wxT("black");
142 }
143 bool SetValue( const wxVariant &value )
144 {
145 m_colour = value.GetString();
146 return true;
147 }
148 bool Render( wxRect rect, wxDC *dc, int state )
149 {
150 dc->SetPen( *wxBLACK_PEN );
151 if (m_colour == wxT("red"))
152 dc->SetBrush( *wxRED_BRUSH );
153 else if (m_colour == wxT("green"))
154 dc->SetBrush( *wxGREEN_BRUSH );
155 else
156 dc->SetBrush( *wxBLACK_BRUSH );
157 dc->DrawRectangle( rect );
158 return true;
159 }
160 wxSize GetSize()
161 {
162 return wxSize(20,8);
163 }
164 bool Activate( wxRect rect,
165 wxDataViewListModel *model, size_t col, size_t row )
166 {
167 return false;
168 }
169
170 private:
171 wxString m_colour;
172 };
173
174 // -------------------------------------
175 // MyUnsortedTextModel
176 // -------------------------------------
177
178 class MyUnsortedTextModel: public wxDataViewListModel
179 {
180 public:
181 MyUnsortedTextModel()
182 {
183 m_list.Add( wxT("This") );
184 m_list.Add( wxT("is") );
185 m_list.Add( wxT("an") );
186 m_list.Add( wxT("unsorted") );
187 m_list.Add( wxT("list") );
188 m_list.Add( wxT("of") );
189 m_list.Add( wxT("words.") );
190 }
191
192 virtual size_t GetNumberOfRows() { return m_list.GetCount(); }
193 virtual size_t GetNumberOfCols() { return 2; }
194 virtual wxString GetColType( size_t col ) { return wxT("string"); }
195 virtual void GetValue( wxVariant &variant, size_t col, size_t row )
196 {
197 if (col == 0)
198 {
199 variant = m_list[row];
200 return;
201 }
202 wxString tmp;
203 tmp.Printf( wxT("item(%d;%d)"), (int)row, (int)col );
204 variant = tmp;
205 }
206 virtual bool SetValue( wxVariant &variant, size_t col, size_t row )
207 {
208 if (col == 0)
209 {
210 m_list[row] = variant.GetString();
211 return true;
212 }
213 return false;
214
215 }
216
217 wxArrayString m_list;
218 };
219
220 // -------------------------------------
221 // MyApp
222 // -------------------------------------
223
224 class MyApp: public wxApp
225 {
226 public:
227 bool OnInit(void);
228 };
229
230 // -------------------------------------
231 // MyFrame
232 // -------------------------------------
233
234 class MyFrame: public wxFrame
235 {
236 public:
237 MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h);
238
239 public:
240 void OnQuit(wxCommandEvent& event);
241 void OnAbout(wxCommandEvent& event);
242
243 private:
244 wxDataViewCtrl* dataview_left;
245 wxDataViewCtrl* dataview_right;
246 };
247
248 // -------------------------------------
249 // MySortingFrame
250 // -------------------------------------
251
252 enum my_events
253 {
254 ID_APPEND_ROW_LEFT = 1000,
255 ID_PREPEND_ROW_LEFT,
256 ID_INSERT_ROW_LEFT,
257 ID_DELETE_ROW_LEFT,
258 ID_EDIT_ROW_LEFT,
259
260 ID_APPEND_ROW_RIGHT,
261 ID_PREPEND_ROW_RIGHT,
262 ID_INSERT_ROW_RIGHT,
263 ID_DELETE_ROW_RIGHT,
264 ID_EDIT_ROW_RIGHT
265 };
266
267 class MySortingFrame: public wxFrame
268 {
269 public:
270 MySortingFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h);
271
272 public:
273 void OnQuit(wxCommandEvent& event);
274 void OnAbout(wxCommandEvent& event);
275
276 void OnAppendRowLeft(wxCommandEvent& event);
277 void OnPrependRowLeft(wxCommandEvent& event);
278 void OnInsertRowLeft(wxCommandEvent& event);
279 void OnDeleteRowLeft(wxCommandEvent& event);
280 void OnEditRowLeft(wxCommandEvent& event);
281
282 void OnAppendRowRight(wxCommandEvent& event);
283 void OnPrependRowRight(wxCommandEvent& event);
284 void OnInsertRowRight(wxCommandEvent& event);
285 void OnDeleteRowRight(wxCommandEvent& event);
286 void OnEditRowRight(wxCommandEvent& event);
287
288 private:
289 wxDataViewCtrl* dataview_left;
290 wxDataViewCtrl* dataview_right;
291
292 DECLARE_EVENT_TABLE()
293 };
294
295 // -------------------------------------
296 // MyApp
297 // -------------------------------------
298
299 #define DYNAMIC_QUIT wxID_EXIT
300 #define DYNAMIC_ABOUT wxID_ABOUT
301
302 IMPLEMENT_APP (MyApp)
303
304 bool MyApp::OnInit(void)
305 {
306 MyFrame *frame = new MyFrame(NULL, wxT("wxDataViewCtrl feature test"), 10, 10, 800, 340);
307 frame->Show(true);
308
309 MySortingFrame *frame2 = new MySortingFrame(NULL, wxT("wxDataViewCtrl sorting test"), 10, 350, 600, 300);
310 frame2->Show(true);
311
312 SetTopWindow(frame);
313
314 return true;
315 }
316
317 // -------------------------------------
318 // MyFrame
319 // -------------------------------------
320
321 MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h):
322 wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))
323 {
324 #ifdef __WXMSW__
325 SetIcon(wxIcon(_T("mondrian")));
326 #else
327 SetIcon(wxIcon(mondrian_xpm));
328 #endif
329
330 wxMenu *file_menu = new wxMenu;
331
332 file_menu->Append(DYNAMIC_ABOUT, _T("&About"));
333 file_menu->Append(DYNAMIC_QUIT, _T("E&xit"));
334 wxMenuBar *menu_bar = new wxMenuBar;
335 menu_bar->Append(file_menu, _T("&File"));
336 SetMenuBar(menu_bar);
337
338 // You used to have to do some casting for param 4, but now there are type-safe handlers
339 Connect( DYNAMIC_QUIT, wxID_ANY,
340 wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MyFrame::OnQuit) );
341 Connect( DYNAMIC_ABOUT, wxID_ANY,
342 wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MyFrame::OnAbout) );
343
344 CreateStatusBar();
345
346
347 // Left wxDataViewCtrl
348 dataview_left = new wxDataViewCtrl( this, -1 );
349
350 MyTextModel *model = new MyTextModel;
351 dataview_left->AssociateModel( model );
352
353 dataview_left->AppendTextColumn( wxT("first"), 0 );
354 dataview_left->AppendTextColumn( wxT("second"), 1 );
355
356 wxDataViewTextCell *text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
357 wxDataViewColumn *column = new wxDataViewColumn( wxT("editable"), text_cell, 2 );
358 dataview_left->AppendColumn( column );
359
360 dataview_left->AppendToggleColumn( wxT("fourth"), 3 );
361
362 MyCustomCell *custom_cell = new MyCustomCell;
363 column = new wxDataViewColumn( wxT("custom"), custom_cell, 4 );
364 dataview_left->AppendColumn( column );
365
366 dataview_left->AppendProgressColumn( wxT("progress"), 5 );
367
368 dataview_left->AppendDateColumn( wxT("date"), 6 );
369
370 // Right wxDataViewCtrl using the same model
371 dataview_right = new wxDataViewCtrl( this, -1 );
372 dataview_right->AssociateModel( model );
373
374 text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
375 column = new wxDataViewColumn( wxT("editable"), text_cell, 2 );
376 dataview_right->AppendColumn( column );
377 dataview_right->AppendTextColumn( wxT("first"), 0 );
378 dataview_right->AppendTextColumn( wxT("second"), 1 );
379 wxDataViewToggleCell *toggle_cell = new wxDataViewToggleCell( wxT("bool"), wxDATAVIEW_CELL_EDITABLE );
380 column = new wxDataViewColumn( wxT("bool"), toggle_cell, 3 );
381 dataview_right->AppendColumn( column );
382
383 dataview_right->AppendDateColumn( wxT("date"), 6 );
384
385 // layout dataview controls.
386
387 wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL );
388 sizer->Add( dataview_left, 3, wxGROW );
389 sizer->Add(10,10);
390 sizer->Add( dataview_right, 2, wxGROW );
391 SetSizer( sizer );
392 }
393
394 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
395 {
396 Close(true);
397 }
398
399 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
400 {
401 wxMessageDialog dialog(this, _T("This demonstrates the dataview control handling"),
402 _T("About DataView"), wxOK);
403
404 dialog.ShowModal();
405 }
406
407 // -------------------------------------
408 // MySortingFrame
409 // -------------------------------------
410
411 BEGIN_EVENT_TABLE(MySortingFrame,wxFrame)
412 EVT_BUTTON( ID_APPEND_ROW_LEFT, MySortingFrame::OnAppendRowLeft )
413 END_EVENT_TABLE()
414
415 MySortingFrame::MySortingFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h):
416 wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))
417 {
418 #ifdef __WXMSW__
419 SetIcon(wxIcon(_T("mondrian")));
420 #else
421 SetIcon(wxIcon(mondrian_xpm));
422 #endif
423
424 wxMenu *file_menu = new wxMenu;
425
426 file_menu->Append(DYNAMIC_ABOUT, _T("&About"));
427 file_menu->Append(DYNAMIC_QUIT, _T("E&xit"));
428 wxMenuBar *menu_bar = new wxMenuBar;
429 menu_bar->Append(file_menu, _T("&File"));
430 SetMenuBar(menu_bar);
431
432 // You used to have to do some casting for param 4, but now there are type-safe handlers
433 Connect( DYNAMIC_QUIT, wxID_ANY,
434 wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MySortingFrame::OnQuit) );
435 Connect( DYNAMIC_ABOUT, wxID_ANY,
436 wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MySortingFrame::OnAbout) );
437
438 CreateStatusBar();
439
440
441 // Left wxDataViewCtrl
442 dataview_left = new wxDataViewCtrl( this, -1 );
443
444 MyUnsortedTextModel *model = new MyUnsortedTextModel;
445 dataview_left->AssociateModel( model );
446 wxDataViewTextCell *text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
447 wxDataViewColumn *column = new wxDataViewColumn( wxT("editable"), text_cell, 0 );
448 dataview_left->AppendColumn( column );
449 dataview_left->AppendTextColumn( wxT("second"), 1 );
450
451 // Right wxDataViewCtrl using the sorting model
452 dataview_right = new wxDataViewCtrl( this, -1 );
453 wxDataViewSortedListModel *sorted_model =
454 new wxDataViewSortedListModel( model );
455 dataview_right->AssociateModel( sorted_model );
456 text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
457 column = new wxDataViewColumn( wxT("editable"), text_cell, 0 );
458 dataview_right->AppendColumn( column );
459 dataview_right->AppendTextColumn( wxT("second"), 1 );
460
461 // layout dataview controls.
462
463 wxBoxSizer *top_sizer = new wxBoxSizer( wxHORIZONTAL );
464 top_sizer->Add( dataview_left, 1, wxGROW );
465 top_sizer->Add(10,10);
466 top_sizer->Add( dataview_right, 1, wxGROW );
467
468 wxBoxSizer *button_sizer = new wxBoxSizer( wxHORIZONTAL );
469 button_sizer->Add( 10, 10, 1 );
470 wxFlexGridSizer *left_sizer = new wxFlexGridSizer( 2 );
471 left_sizer->Add( new wxButton( this, ID_APPEND_ROW_LEFT, wxT("Append") ), 0, wxALL, 5 );
472 left_sizer->Add( new wxButton( this, ID_PREPEND_ROW_LEFT, wxT("Prepend") ), 0, wxALL, 5 );
473 left_sizer->Add( new wxButton( this, ID_INSERT_ROW_LEFT, wxT("Insert") ), 0, wxALL, 5 );
474 left_sizer->Add( new wxButton( this, ID_DELETE_ROW_LEFT, wxT("Delete") ), 0, wxALL, 5 );
475 left_sizer->Add( new wxButton( this, ID_EDIT_ROW_LEFT, wxT("Edit") ), 0, wxALL, 5 );
476 button_sizer->Add( left_sizer );
477 button_sizer->Add( 10, 10, 2 );
478 wxFlexGridSizer *right_sizer = new wxFlexGridSizer( 2 );
479 right_sizer->Add( new wxButton( this, ID_APPEND_ROW_RIGHT, wxT("Append") ), 0, wxALL, 5 );
480 right_sizer->Add( new wxButton( this, ID_PREPEND_ROW_RIGHT, wxT("Prepend") ), 0, wxALL, 5 );
481 right_sizer->Add( new wxButton( this, ID_INSERT_ROW_RIGHT, wxT("Insert") ), 0, wxALL, 5 );
482 right_sizer->Add( new wxButton( this, ID_DELETE_ROW_RIGHT, wxT("Delete") ), 0, wxALL, 5 );
483 right_sizer->Add( new wxButton( this, ID_EDIT_ROW_RIGHT, wxT("Edit") ), 0, wxALL, 5 );
484 button_sizer->Add( right_sizer );
485 button_sizer->Add( 10, 10, 1 );
486
487 wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
488 main_sizer->Add( top_sizer, 1, wxGROW );
489 main_sizer->Add( button_sizer, 0, wxGROW );
490
491 SetSizer( main_sizer );
492 }
493
494 void MySortingFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
495 {
496 Close(true);
497 }
498
499 void MySortingFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
500 {
501 wxMessageDialog dialog(this, _T("This demonstrates the dataview control sorting"),
502 _T("About DataView"), wxOK);
503
504 dialog.ShowModal();
505 }
506
507 void MySortingFrame::OnAppendRowLeft(wxCommandEvent& event)
508 {
509 }
510
511 void MySortingFrame::OnPrependRowLeft(wxCommandEvent& event)
512 {
513 }
514
515 void MySortingFrame::OnInsertRowLeft(wxCommandEvent& event)
516 {
517 }
518
519 void MySortingFrame::OnDeleteRowLeft(wxCommandEvent& event)
520 {
521 }
522
523 void MySortingFrame::OnEditRowLeft(wxCommandEvent& event)
524 {
525 }
526
527 void MySortingFrame::OnAppendRowRight(wxCommandEvent& event)
528 {
529 }
530
531 void MySortingFrame::OnPrependRowRight(wxCommandEvent& event)
532 {
533 }
534
535 void MySortingFrame::OnInsertRowRight(wxCommandEvent& event)
536 {
537 }
538
539 void MySortingFrame::OnDeleteRowRight(wxCommandEvent& event)
540 {
541 }
542
543 void MySortingFrame::OnEditRowRight(wxCommandEvent& event)
544 {
545 }
546