]> git.saurik.com Git - wxWidgets.git/blob - samples/dataview/dataview.cpp
Don't delete model in views destructor as several
[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 wxVariant GetValue( size_t col, size_t row )
79 {
80 if (col == 6)
81 {
82 return (wxDateTime) *m_dates[row];
83 } else
84 if (col == 5)
85 {
86 return (long) m_progress[row];
87 } else
88 if (col == 4)
89 {
90 return m_colours[row];
91 } else
92 if (col == 3)
93 {
94 return (bool) m_bools[row];
95 } else
96 if (col == 2)
97 {
98 return m_list[row];
99 }
100 else
101 {
102 wxString tmp;
103 tmp.Printf( wxT("item(%d;%d)"), (int)row, (int)col );
104 return 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 wxVariant GetValue( size_t col, size_t row )
196 {
197 if (col == 0)
198 return m_list[row];
199 wxString tmp;
200 tmp.Printf( wxT("item(%d;%d)"), (int)row, (int)col );
201 return tmp;
202 }
203 virtual bool SetValue( wxVariant &variant, size_t col, size_t row )
204 {
205 if (col == 0)
206 {
207 m_list[row] = variant.GetString();
208 return true;
209 }
210 return false;
211
212 }
213
214 wxArrayString m_list;
215 };
216
217 // -------------------------------------
218 // MyApp
219 // -------------------------------------
220
221 class MyApp: public wxApp
222 {
223 public:
224 bool OnInit(void);
225 };
226
227 // -------------------------------------
228 // MyFrame
229 // -------------------------------------
230
231 class MyFrame: public wxFrame
232 {
233 public:
234 MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h);
235
236 public:
237 void OnQuit(wxCommandEvent& event);
238 void OnAbout(wxCommandEvent& event);
239
240 private:
241 wxDataViewCtrl* dataview_left;
242 wxDataViewCtrl* dataview_right;
243 };
244
245 // -------------------------------------
246 // MySortingFrame
247 // -------------------------------------
248
249 class MySortingFrame: public wxFrame
250 {
251 public:
252 MySortingFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h);
253
254 public:
255 void OnQuit(wxCommandEvent& event);
256 void OnAbout(wxCommandEvent& event);
257
258 private:
259 wxDataViewCtrl* dataview_left;
260 wxDataViewCtrl* dataview_right;
261 };
262
263 // -------------------------------------
264 // MyApp
265 // -------------------------------------
266
267 #define DYNAMIC_QUIT wxID_EXIT
268 #define DYNAMIC_ABOUT wxID_ABOUT
269
270 IMPLEMENT_APP (MyApp)
271
272 bool MyApp::OnInit(void)
273 {
274 MyFrame *frame = new MyFrame(NULL, wxT("wxDataViewCtrl test"), 10, 10, 800, 340);
275 frame->Show(true);
276
277 MySortingFrame *frame2 = new MySortingFrame(NULL, wxT("wxDataViewCtrl test"), 10, 350, 400, 240);
278 frame2->Show(true);
279
280 SetTopWindow(frame);
281
282 return true;
283 }
284
285 // -------------------------------------
286 // MyFrame
287 // -------------------------------------
288
289 MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h):
290 wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))
291 {
292 #ifdef __WXMSW__
293 SetIcon(wxIcon(_T("mondrian")));
294 #else
295 SetIcon(wxIcon(mondrian_xpm));
296 #endif
297
298 wxMenu *file_menu = new wxMenu;
299
300 file_menu->Append(DYNAMIC_ABOUT, _T("&About"));
301 file_menu->Append(DYNAMIC_QUIT, _T("E&xit"));
302 wxMenuBar *menu_bar = new wxMenuBar;
303 menu_bar->Append(file_menu, _T("&File"));
304 SetMenuBar(menu_bar);
305
306 // You used to have to do some casting for param 4, but now there are type-safe handlers
307 Connect( DYNAMIC_QUIT, wxID_ANY,
308 wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MyFrame::OnQuit) );
309 Connect( DYNAMIC_ABOUT, wxID_ANY,
310 wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MyFrame::OnAbout) );
311
312 CreateStatusBar();
313
314
315 // Left wxDataViewCtrl
316 dataview_left = new wxDataViewCtrl( this, -1 );
317
318 MyTextModel *model = new MyTextModel;
319 dataview_left->AssociateModel( model );
320
321 dataview_left->AppendTextColumn( wxT("first"), 0 );
322 dataview_left->AppendTextColumn( wxT("second"), 1 );
323
324 wxDataViewTextCell *text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
325 wxDataViewColumn *column = new wxDataViewColumn( wxT("editable"), text_cell, 2 );
326 dataview_left->AppendColumn( column );
327
328 dataview_left->AppendToggleColumn( wxT("fourth"), 3 );
329
330 MyCustomCell *custom_cell = new MyCustomCell;
331 column = new wxDataViewColumn( wxT("custom"), custom_cell, 4 );
332 dataview_left->AppendColumn( column );
333
334 dataview_left->AppendProgressColumn( wxT("progress"), 5 );
335
336 dataview_left->AppendDateColumn( wxT("date"), 6 );
337
338 // Right wxDataViewCtrl using the same model
339 dataview_right = new wxDataViewCtrl( this, -1 );
340 dataview_right->AssociateModel( model );
341
342 text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
343 column = new wxDataViewColumn( wxT("editable"), text_cell, 2 );
344 dataview_right->AppendColumn( column );
345 dataview_right->AppendTextColumn( wxT("first"), 0 );
346 dataview_right->AppendTextColumn( wxT("second"), 1 );
347 wxDataViewToggleCell *toggle_cell = new wxDataViewToggleCell( wxT("bool"), wxDATAVIEW_CELL_EDITABLE );
348 column = new wxDataViewColumn( wxT("bool"), toggle_cell, 3 );
349 dataview_right->AppendColumn( column );
350
351 dataview_right->AppendDateColumn( wxT("date"), 6 );
352
353 // layout dataview controls.
354
355 wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL );
356 sizer->Add( dataview_left, 3, wxGROW );
357 sizer->Add(10,10);
358 sizer->Add( dataview_right, 2, wxGROW );
359 SetSizer( sizer );
360 }
361
362 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
363 {
364 Close(true);
365 }
366
367 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
368 {
369 wxMessageDialog dialog(this, _T("This demonstrates the dataview control handling"),
370 _T("About DataView"), wxOK);
371
372 dialog.ShowModal();
373 }
374
375 // -------------------------------------
376 // MySortingFrame
377 // -------------------------------------
378
379 MySortingFrame::MySortingFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h):
380 wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))
381 {
382 #ifdef __WXMSW__
383 SetIcon(wxIcon(_T("mondrian")));
384 #else
385 SetIcon(wxIcon(mondrian_xpm));
386 #endif
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(MySortingFrame::OnQuit) );
399 Connect( DYNAMIC_ABOUT, wxID_ANY,
400 wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MySortingFrame::OnAbout) );
401
402 CreateStatusBar();
403
404
405 // Left wxDataViewCtrl
406 dataview_left = new wxDataViewCtrl( this, -1 );
407
408 MyUnsortedTextModel *model = new MyUnsortedTextModel;
409 dataview_left->AssociateModel( model );
410 wxDataViewTextCell *text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
411 wxDataViewColumn *column = new wxDataViewColumn( wxT("editable"), text_cell, 0 );
412 dataview_left->AppendColumn( column );
413 dataview_left->AppendTextColumn( wxT("second"), 1 );
414
415 // Right wxDataViewCtrl using the sorting model
416 dataview_right = new wxDataViewCtrl( this, -1 );
417 wxDataViewSortedListModel *sorted_model =
418 new wxDataViewSortedListModel( model );
419 dataview_right->AssociateModel( sorted_model );
420 text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
421 column = new wxDataViewColumn( wxT("editable"), text_cell, 0 );
422 dataview_right->AppendColumn( column );
423 dataview_right->AppendTextColumn( wxT("second"), 1 );
424
425 // layout dataview controls.
426
427 wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL );
428 sizer->Add( dataview_left, 1, wxGROW );
429 sizer->Add(10,10);
430 sizer->Add( dataview_right, 1, wxGROW );
431 SetSizer( sizer );
432 }
433
434 void MySortingFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
435 {
436 Close(true);
437 }
438
439 void MySortingFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
440 {
441 wxMessageDialog dialog(this, _T("This demonstrates the dataview control sorting"),
442 _T("About DataView"), wxOK);
443
444 dialog.ShowModal();
445 }
446