]>
Commit | Line | Data |
---|---|---|
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 | ||
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: | |
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 | ||
62 | virtual unsigned int GetNumberOfRows() | |
63 | { return 1000; } | |
64 | virtual unsigned int GetNumberOfCols() | |
65 | { return 7; } | |
66 | ||
67 | // as reported by wxVariant | |
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 | ||
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 | } | |
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: | |
142 | MyCustomRenderer() : | |
143 | wxDataViewCustomRenderer( wxT("string"), wxDATAVIEW_CELL_ACTIVATABLE ) | |
144 | { | |
145 | m_colour = wxT("black"); | |
146 | } | |
147 | bool SetValue( const wxVariant &value ) | |
148 | { | |
149 | m_colour = value.GetString(); | |
150 | return true; | |
151 | } | |
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 | } | |
164 | wxSize GetSize() | |
165 | { | |
166 | return wxSize(20,8); | |
167 | } | |
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: | |
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 | ||
200 | virtual unsigned int GetNumberOfRows() { return m_list.GetCount(); } | |
201 | virtual unsigned int GetNumberOfCols() { return 2; } | |
202 | virtual wxString GetColType( unsigned int WXUNUSED(col) ) { return wxT("string"); } | |
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 | } | |
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 | ||
230 | void AppendRow( const wxString &text ) | |
231 | { | |
232 | m_list.Add( text ); | |
233 | RowAppended(); | |
234 | } | |
235 | ||
236 | void PrependRow( const wxString &text ) | |
237 | { | |
238 | m_list.Insert( text, 0 ); | |
239 | RowPrepended(); | |
240 | } | |
241 | ||
242 | void InsertRowAt1( const wxString &text ) | |
243 | { | |
244 | m_list.Insert( text, 1 ); | |
245 | RowInserted( 1 ); | |
246 | } | |
247 | ||
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 | ||
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 | ||
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 | ||
454 | void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) ) | |
455 | { | |
456 | Close(true); | |
457 | } | |
458 | ||
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 | ||
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 | ||
576 | MySortingFrame::~MySortingFrame() | |
577 | { | |
578 | delete wxLog::SetActiveTarget(m_logOld); | |
579 | } | |
580 | ||
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 | ||
590 | void MySortingFrame::OnSelectedSorted(wxDataViewEvent &event) | |
591 | { | |
592 | wxLogMessage( wxT("OnSelected from sorted list, selected %d"), (int) event.GetRow() ); | |
593 | } | |
594 | ||
595 | void MySortingFrame::OnActivatedUnsorted(wxDataViewEvent &event) | |
596 | { | |
597 | wxLogMessage( wxT("OnActivated from unsorted list, activated %d"), (int) event.GetRow() ); | |
598 | } | |
599 | ||
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 | ||
623 | void MySortingFrame::OnHeaderClickUnsorted(wxDataViewEvent &event) | |
624 | { | |
625 | wxLogMessage( wxT("OnHeaderClick from unsorted list, column %s"), event.GetDataViewColumn()->GetTitle().c_str() ); | |
626 | } | |
627 | ||
628 | void MySortingFrame::OnQuit(wxCommandEvent& WXUNUSED(event) ) | |
629 | { | |
630 | Close(true); | |
631 | } | |
632 | ||
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 | ||
641 | void MySortingFrame::OnSelect(wxCommandEvent& WXUNUSED(event)) | |
642 | { | |
643 | dataview_left->SetSelection( 2 ); | |
644 | } | |
645 | ||
646 | void MySortingFrame::OnUnselectAll(wxCommandEvent& WXUNUSED(event)) | |
647 | { | |
648 | dataview_left->ClearSelection(); | |
649 | } | |
650 | ||
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 | ||
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 | ||
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 | ||
684 | void MySortingFrame::OnDeleteRowLeft(wxCommandEvent& WXUNUSED(event)) | |
685 | { | |
686 | m_unsorted_model->DeleteRow( 1 ); | |
687 | } | |
688 | ||
689 | void MySortingFrame::OnEditRowLeft(wxCommandEvent& WXUNUSED(event)) | |
690 | { | |
691 | } | |
692 | ||
693 | void MySortingFrame::OnAppendRowRight(wxCommandEvent& WXUNUSED(event)) | |
694 | { | |
695 | } | |
696 | ||
697 | void MySortingFrame::OnPrependRowRight(wxCommandEvent& WXUNUSED(event)) | |
698 | { | |
699 | } | |
700 | ||
701 | void MySortingFrame::OnInsertRowRight(wxCommandEvent& WXUNUSED(event)) | |
702 | { | |
703 | } | |
704 | ||
705 | void MySortingFrame::OnDeleteRowRight(wxCommandEvent& WXUNUSED(event)) | |
706 | { | |
707 | } | |
708 | ||
709 | void MySortingFrame::OnEditRowRight(wxCommandEvent& WXUNUSED(event)) | |
710 | { | |
711 | } | |
712 |