]>
Commit | Line | Data |
---|---|---|
bd6169a6 RR |
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 | |
0bcd4039 | 20 | #include "wx/wx.h" |
bd6169a6 RR |
21 | #endif |
22 | ||
b910a8ad JS |
23 | #include "wx/datetime.h" |
24 | ||
bd6169a6 | 25 | #ifndef __WXMSW__ |
0bcd4039 | 26 | #include "../sample.xpm" |
bd6169a6 RR |
27 | #endif |
28 | ||
cbc9145c RR |
29 | #include "null.xpm" |
30 | ||
362d7fb9 | 31 | #include "wx/dataview.h" |
bd6169a6 | 32 | |
362d7fb9 RR |
33 | // ------------------------------------- |
34 | // MyTextModel | |
35 | // ------------------------------------- | |
bd6169a6 | 36 | |
4d496ecb RR |
37 | WX_DECLARE_LIST(wxDateTime,wxArrayDate); |
38 | #include <wx/listimpl.cpp> | |
004f4002 | 39 | WX_DEFINE_LIST(wxArrayDate) |
4d496ecb | 40 | |
362d7fb9 | 41 | class MyTextModel: public wxDataViewListModel |
bd6169a6 RR |
42 | { |
43 | public: | |
b910a8ad | 44 | MyTextModel() |
a7f61f76 | 45 | { |
0a71f9e9 | 46 | unsigned int i; |
a7f61f76 RR |
47 | for (i = 0; i < 1000; i++) |
48 | m_list.Add( wxT("Test") ); | |
605c2c4a RR |
49 | for (i = 0; i < 500; i++) |
50 | { m_bools.Add( 0 ); m_bools.Add( 1 ); } | |
e152afc3 RR |
51 | for (i = 0; i < 500; i++) |
52 | { m_colours.Add( wxT("red") ); m_colours.Add( wxT("green") ); } | |
ad63bf41 RR |
53 | for (i = 0; i < 1000; i++) |
54 | { m_progress.Add( i/10 ); } | |
4d496ecb | 55 | for (i = 0; i < 1000; i++) |
b910a8ad | 56 | { |
4d496ecb | 57 | wxDateTime *date = new wxDateTime( wxDateTime::Now() ); |
b910a8ad | 58 | m_dates.Append( date ); |
4d496ecb | 59 | } |
a7f61f76 | 60 | } |
b910a8ad | 61 | |
0a71f9e9 | 62 | virtual unsigned int GetNumberOfRows() |
362d7fb9 | 63 | { return 1000; } |
0a71f9e9 | 64 | virtual unsigned int GetNumberOfCols() |
4d496ecb | 65 | { return 7; } |
b910a8ad | 66 | |
362d7fb9 | 67 | // as reported by wxVariant |
0a71f9e9 | 68 | virtual wxString GetColType( unsigned int col ) |
605c2c4a | 69 | { |
4d496ecb RR |
70 | if (col == 6) |
71 | return wxT("datetime"); | |
b910a8ad | 72 | |
ad63bf41 RR |
73 | if (col == 5) |
74 | return wxT("long"); | |
b910a8ad | 75 | |
605c2c4a RR |
76 | if (col == 3) |
77 | return wxT("bool"); | |
b910a8ad JS |
78 | |
79 | return wxT("string"); | |
605c2c4a | 80 | } |
b910a8ad | 81 | |
0a71f9e9 | 82 | virtual void GetValue( wxVariant &variant, unsigned int col, unsigned int row ) |
605c2c4a | 83 | { |
4d496ecb RR |
84 | if (col == 6) |
85 | { | |
3f3af7e7 | 86 | variant = (wxDateTime) *m_dates[row]; |
4d496ecb | 87 | } else |
ad63bf41 | 88 | if (col == 5) |
605c2c4a | 89 | { |
3f3af7e7 | 90 | variant = (long) m_progress[row]; |
ad63bf41 | 91 | } else |
e152afc3 RR |
92 | if (col == 4) |
93 | { | |
3f3af7e7 | 94 | variant = m_colours[row]; |
ad63bf41 RR |
95 | } else |
96 | if (col == 3) | |
97 | { | |
3f3af7e7 | 98 | variant = (bool) m_bools[row]; |
b910a8ad | 99 | } else |
a7f61f76 RR |
100 | if (col == 2) |
101 | { | |
3f3af7e7 | 102 | variant = m_list[row]; |
a7f61f76 RR |
103 | } |
104 | else | |
105 | { | |
b910a8ad JS |
106 | wxString tmp; |
107 | tmp.Printf( wxT("item(%d;%d)"), (int)row, (int)col ); | |
3f3af7e7 | 108 | variant = tmp; |
a7f61f76 | 109 | } |
362d7fb9 | 110 | } |
0a71f9e9 | 111 | virtual bool SetValue( wxVariant &value, unsigned int col, unsigned int row ) |
a7f61f76 | 112 | { |
4d496ecb RR |
113 | if (col == 6) |
114 | { | |
115 | *m_dates[row] = value.GetDateTime(); | |
116 | } else | |
605c2c4a RR |
117 | if (col == 3) |
118 | { | |
119 | m_bools[row] = (int) value.GetBool(); | |
120 | } else | |
a7f61f76 RR |
121 | if (col == 2) |
122 | { | |
123 | m_list[row] = value.GetString(); | |
124 | } | |
125 | return true; | |
126 | } | |
b910a8ad | 127 | |
a7f61f76 | 128 | wxArrayString m_list; |
605c2c4a | 129 | wxArrayInt m_bools; |
e152afc3 | 130 | wxArrayString m_colours; |
ad63bf41 | 131 | wxArrayInt m_progress; |
4d496ecb | 132 | wxArrayDate m_dates; |
e152afc3 RR |
133 | }; |
134 | ||
135 | // ------------------------------------- | |
baa9ebc4 | 136 | // MyCustomRenderer |
e152afc3 RR |
137 | // ------------------------------------- |
138 | ||
baa9ebc4 | 139 | class MyCustomRenderer: public wxDataViewCustomRenderer |
e152afc3 RR |
140 | { |
141 | public: | |
baa9ebc4 RR |
142 | MyCustomRenderer() : |
143 | wxDataViewCustomRenderer( wxT("string"), wxDATAVIEW_CELL_ACTIVATABLE ) | |
b910a8ad JS |
144 | { |
145 | m_colour = wxT("black"); | |
e152afc3 RR |
146 | } |
147 | bool SetValue( const wxVariant &value ) | |
148 | { | |
149 | m_colour = value.GetString(); | |
150 | return true; | |
151 | } | |
f554a14b | 152 | bool Render( wxRect rect, wxDC *dc, int WXUNUSED(state) ) |
b910a8ad | 153 | { |
e152afc3 RR |
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 ); | |
b910a8ad | 159 | else |
e152afc3 RR |
160 | dc->SetBrush( *wxBLACK_BRUSH ); |
161 | dc->DrawRectangle( rect ); | |
162 | return true; | |
163 | } | |
164 | wxSize GetSize() | |
165 | { | |
166 | return wxSize(20,8); | |
167 | } | |
f554a14b WS |
168 | bool Activate( wxRect WXUNUSED(rect), |
169 | wxDataViewListModel *WXUNUSED(model), | |
0a71f9e9 RR |
170 | unsigned int WXUNUSED(col), |
171 | unsigned int WXUNUSED(row) ) | |
553f7d8f | 172 | { |
553f7d8f RR |
173 | return false; |
174 | } | |
e152afc3 RR |
175 | |
176 | private: | |
b910a8ad | 177 | wxString m_colour; |
0313c114 | 178 | }; |
bd6169a6 | 179 | |
241cb04b RR |
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.") ); | |
cbc9145c RR |
196 | |
197 | m_bitmap = wxBitmap( null_xpm ); | |
241cb04b RR |
198 | } |
199 | ||
0a71f9e9 RR |
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 ) | |
241cb04b RR |
204 | { |
205 | if (col == 0) | |
3f3af7e7 RR |
206 | { |
207 | variant = m_list[row]; | |
208 | return; | |
209 | } | |
979f71a3 | 210 | if ((col == 2) || (col == 3)) |
cbc9145c | 211 | { |
979f71a3 | 212 | variant << m_bitmap; |
cbc9145c RR |
213 | return; |
214 | } | |
241cb04b | 215 | wxString tmp; |
b910a8ad | 216 | tmp.Printf( wxT("item(%d;%d)"), (int)row, (int)col ); |
3f3af7e7 | 217 | variant = tmp; |
241cb04b | 218 | } |
0a71f9e9 | 219 | virtual bool SetValue( wxVariant &variant, unsigned int col, unsigned int row ) |
241cb04b RR |
220 | { |
221 | if (col == 0) | |
222 | { | |
223 | m_list[row] = variant.GetString(); | |
224 | return true; | |
225 | } | |
226 | return false; | |
b910a8ad | 227 | |
241cb04b RR |
228 | } |
229 | ||
4627af27 RR |
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 | ||
0a71f9e9 | 248 | void DeleteRow( unsigned int index ) |
4627af27 RR |
249 | { |
250 | m_list.RemoveAt( index ); | |
251 | RowDeleted( index ); | |
252 | } | |
253 | ||
241cb04b | 254 | wxArrayString m_list; |
cbc9145c | 255 | wxBitmap m_bitmap; |
241cb04b RR |
256 | }; |
257 | ||
362d7fb9 RR |
258 | // ------------------------------------- |
259 | // MyApp | |
260 | // ------------------------------------- | |
bd6169a6 RR |
261 | |
262 | class MyApp: public wxApp | |
263 | { | |
264 | public: | |
265 | bool OnInit(void); | |
266 | }; | |
267 | ||
362d7fb9 RR |
268 | // ------------------------------------- |
269 | // MyFrame | |
270 | // ------------------------------------- | |
271 | ||
bd6169a6 RR |
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); | |
b910a8ad | 280 | |
bd6169a6 | 281 | private: |
a7f61f76 RR |
282 | wxDataViewCtrl* dataview_left; |
283 | wxDataViewCtrl* dataview_right; | |
bd6169a6 RR |
284 | }; |
285 | ||
241cb04b RR |
286 | // ------------------------------------- |
287 | // MySortingFrame | |
288 | // ------------------------------------- | |
289 | ||
abd6692c RR |
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, | |
fc211fe5 RR |
297 | |
298 | ID_SELECT, | |
299 | ID_UNSELECT_ALL, | |
b910a8ad | 300 | |
abd6692c RR |
301 | ID_APPEND_ROW_RIGHT, |
302 | ID_PREPEND_ROW_RIGHT, | |
303 | ID_INSERT_ROW_RIGHT, | |
304 | ID_DELETE_ROW_RIGHT, | |
eb7f97f8 RR |
305 | ID_EDIT_ROW_RIGHT, |
306 | ||
307 | ID_SORTED, | |
f828871d RR |
308 | ID_UNSORTED, |
309 | ID_ACTIVATED | |
abd6692c RR |
310 | }; |
311 | ||
241cb04b RR |
312 | class MySortingFrame: public wxFrame |
313 | { | |
314 | public: | |
315 | MySortingFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h); | |
eb7f97f8 | 316 | ~MySortingFrame(); |
241cb04b RR |
317 | |
318 | public: | |
319 | void OnQuit(wxCommandEvent& event); | |
320 | void OnAbout(wxCommandEvent& event); | |
b910a8ad | 321 | |
abd6692c RR |
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); | |
b910a8ad | 327 | |
abd6692c RR |
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); | |
b910a8ad | 333 | |
fc211fe5 RR |
334 | void OnSelect(wxCommandEvent& event); |
335 | void OnUnselectAll(wxCommandEvent& event); | |
336 | ||
eb7f97f8 RR |
337 | void OnSelectedUnsorted(wxDataViewEvent &event); |
338 | void OnSelectedSorted(wxDataViewEvent &event); | |
f828871d | 339 | void OnActivatedUnsorted(wxDataViewEvent &event); |
eb7f97f8 | 340 | |
31fb32e1 RR |
341 | void OnHeaderClickSorted(wxDataViewEvent &event); |
342 | void OnHeaderClickUnsorted(wxDataViewEvent &event); | |
343 | ||
241cb04b RR |
344 | private: |
345 | wxDataViewCtrl* dataview_left; | |
346 | wxDataViewCtrl* dataview_right; | |
eb7f97f8 RR |
347 | |
348 | wxLog *m_logOld; | |
349 | wxTextCtrl *m_logWindow; | |
b910a8ad | 350 | |
31fb32e1 RR |
351 | MyUnsortedTextModel *m_unsorted_model; |
352 | wxDataViewSortedListModel *m_sorted_model; | |
4627af27 | 353 | |
abd6692c | 354 | DECLARE_EVENT_TABLE() |
241cb04b RR |
355 | }; |
356 | ||
362d7fb9 RR |
357 | // ------------------------------------- |
358 | // MyApp | |
359 | // ------------------------------------- | |
360 | ||
bd6169a6 RR |
361 | #define DYNAMIC_QUIT wxID_EXIT |
362 | #define DYNAMIC_ABOUT wxID_ABOUT | |
363 | ||
bd6169a6 RR |
364 | IMPLEMENT_APP (MyApp) |
365 | ||
bd6169a6 RR |
366 | bool MyApp::OnInit(void) |
367 | { | |
abd6692c | 368 | MyFrame *frame = new MyFrame(NULL, wxT("wxDataViewCtrl feature test"), 10, 10, 800, 340); |
bd6169a6 RR |
369 | frame->Show(true); |
370 | ||
eb7f97f8 | 371 | MySortingFrame *frame2 = new MySortingFrame(NULL, wxT("wxDataViewCtrl sorting test"), 10, 150, 600, 500); |
241cb04b RR |
372 | frame2->Show(true); |
373 | ||
bd6169a6 | 374 | SetTopWindow(frame); |
979f71a3 | 375 | |
bd6169a6 RR |
376 | return true; |
377 | } | |
378 | ||
379 | // ------------------------------------- | |
380 | // MyFrame | |
381 | // ------------------------------------- | |
382 | ||
bd6169a6 RR |
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 | { | |
0bcd4039 | 386 | SetIcon(wxICON(sample)); |
bd6169a6 | 387 | |
bd6169a6 RR |
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(); | |
b910a8ad | 403 | |
0bcd4039 | 404 | wxPanel *panel = new wxPanel( this, wxID_ANY ); |
b6339e0b | 405 | |
b910a8ad | 406 | |
a7f61f76 | 407 | // Left wxDataViewCtrl |
b6339e0b | 408 | dataview_left = new wxDataViewCtrl( panel, wxID_ANY ); |
b910a8ad | 409 | |
362d7fb9 | 410 | MyTextModel *model = new MyTextModel; |
a7f61f76 | 411 | dataview_left->AssociateModel( model ); |
b910a8ad | 412 | |
605c2c4a RR |
413 | dataview_left->AppendTextColumn( wxT("first"), 0 ); |
414 | dataview_left->AppendTextColumn( wxT("second"), 1 ); | |
553f7d8f | 415 | |
baa9ebc4 RR |
416 | wxDataViewTextRenderer *text_renderer = new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE ); |
417 | wxDataViewColumn *column = new wxDataViewColumn( wxT("editable"), text_renderer, 2 ); | |
a7f61f76 | 418 | dataview_left->AppendColumn( column ); |
b910a8ad | 419 | |
605c2c4a | 420 | dataview_left->AppendToggleColumn( wxT("fourth"), 3 ); |
b910a8ad | 421 | |
baa9ebc4 RR |
422 | MyCustomRenderer *custom_renderer = new MyCustomRenderer; |
423 | column = new wxDataViewColumn( wxT("custom"), custom_renderer, 4 ); | |
e152afc3 | 424 | dataview_left->AppendColumn( column ); |
b910a8ad | 425 | |
ad63bf41 | 426 | dataview_left->AppendProgressColumn( wxT("progress"), 5 ); |
b910a8ad | 427 | |
4d496ecb | 428 | dataview_left->AppendDateColumn( wxT("date"), 6 ); |
b910a8ad | 429 | |
a7f61f76 | 430 | // Right wxDataViewCtrl using the same model |
b6339e0b | 431 | dataview_right = new wxDataViewCtrl( panel, wxID_ANY ); |
a7f61f76 | 432 | dataview_right->AssociateModel( model ); |
553f7d8f | 433 | |
baa9ebc4 RR |
434 | text_renderer = new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE ); |
435 | column = new wxDataViewColumn( wxT("editable"), text_renderer, 2 ); | |
605c2c4a RR |
436 | dataview_right->AppendColumn( column ); |
437 | dataview_right->AppendTextColumn( wxT("first"), 0 ); | |
438 | dataview_right->AppendTextColumn( wxT("second"), 1 ); | |
baa9ebc4 RR |
439 | wxDataViewToggleRenderer *toggle_renderer = new wxDataViewToggleRenderer( wxT("bool"), wxDATAVIEW_CELL_ACTIVATABLE ); |
440 | column = new wxDataViewColumn( wxT("bool"), toggle_renderer, 3, 30 ); | |
a7f61f76 | 441 | dataview_right->AppendColumn( column ); |
553f7d8f | 442 | |
7ea3a0de | 443 | dataview_right->AppendDateColumn( wxT("date"), 6 ); |
b910a8ad | 444 | |
7ea3a0de | 445 | // layout dataview controls. |
b910a8ad | 446 | |
a7f61f76 | 447 | wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL ); |
4d496ecb | 448 | sizer->Add( dataview_left, 3, wxGROW ); |
a7f61f76 | 449 | sizer->Add(10,10); |
4d496ecb | 450 | sizer->Add( dataview_right, 2, wxGROW ); |
b6339e0b | 451 | panel->SetSizer( sizer ); |
bd6169a6 RR |
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 | ||
241cb04b RR |
467 | // ------------------------------------- |
468 | // MySortingFrame | |
469 | // ------------------------------------- | |
470 | ||
abd6692c RR |
471 | BEGIN_EVENT_TABLE(MySortingFrame,wxFrame) |
472 | EVT_BUTTON( ID_APPEND_ROW_LEFT, MySortingFrame::OnAppendRowLeft ) | |
4627af27 RR |
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 ) | |
fc211fe5 RR |
476 | EVT_BUTTON( ID_SELECT, MySortingFrame::OnSelect ) |
477 | EVT_BUTTON( ID_UNSELECT_ALL, MySortingFrame::OnUnselectAll ) | |
eb7f97f8 RR |
478 | EVT_DATAVIEW_ROW_SELECTED( ID_SORTED, MySortingFrame::OnSelectedSorted ) |
479 | EVT_DATAVIEW_ROW_SELECTED( ID_UNSORTED, MySortingFrame::OnSelectedUnsorted ) | |
f828871d | 480 | EVT_DATAVIEW_ROW_ACTIVATED( ID_UNSORTED, MySortingFrame::OnActivatedUnsorted ) |
31fb32e1 RR |
481 | EVT_DATAVIEW_COLUMN_HEADER_CLICK( ID_SORTED, MySortingFrame::OnHeaderClickSorted ) |
482 | EVT_DATAVIEW_COLUMN_HEADER_CLICK( ID_UNSORTED, MySortingFrame::OnHeaderClickUnsorted ) | |
abd6692c RR |
483 | END_EVENT_TABLE() |
484 | ||
241cb04b RR |
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 | { | |
eb7f97f8 RR |
488 | m_logOld = NULL; |
489 | ||
0bcd4039 | 490 | SetIcon(wxICON(sample)); |
241cb04b RR |
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(); | |
b910a8ad JS |
507 | |
508 | ||
241cb04b | 509 | // Left wxDataViewCtrl |
eb7f97f8 | 510 | dataview_left = new wxDataViewCtrl( this, ID_UNSORTED, wxDefaultPosition, wxDefaultSize, wxDV_MULTIPLE ); |
241cb04b | 511 | |
4627af27 RR |
512 | m_unsorted_model = new MyUnsortedTextModel; |
513 | dataview_left->AssociateModel( m_unsorted_model ); | |
baa9ebc4 RR |
514 | wxDataViewTextRenderer *text_renderer = new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE ); |
515 | wxDataViewColumn *column = new wxDataViewColumn( wxT("editable"), text_renderer, 0 ); | |
241cb04b RR |
516 | dataview_left->AppendColumn( column ); |
517 | dataview_left->AppendTextColumn( wxT("second"), 1 ); | |
07a84e7b | 518 | dataview_left->AppendColumn( new wxDataViewColumn( wxBitmap(null_xpm), new wxDataViewBitmapRenderer, 2, 25 ) ); |
baa9ebc4 | 519 | dataview_left->AppendColumn( new wxDataViewColumn( wxT("icon"), new wxDataViewBitmapRenderer, 3, 25 ) ); |
b910a8ad | 520 | |
241cb04b | 521 | // Right wxDataViewCtrl using the sorting model |
eb7f97f8 | 522 | dataview_right = new wxDataViewCtrl( this, ID_SORTED ); |
979f71a3 | 523 | |
31fb32e1 RR |
524 | m_sorted_model = new wxDataViewSortedListModel( m_unsorted_model ); |
525 | dataview_right->AssociateModel( m_sorted_model ); | |
baa9ebc4 RR |
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 ); | |
241cb04b | 528 | dataview_right->AppendColumn( column ); |
979f71a3 | 529 | |
241cb04b RR |
530 | dataview_right->AppendTextColumn( wxT("second"), 1 ); |
531 | ||
532 | // layout dataview controls. | |
b910a8ad | 533 | |
abd6692c RR |
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 ); | |
b910a8ad | 538 | |
abd6692c RR |
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 ); | |
cbc9145c | 545 | left_sizer->Add( new wxButton( this, ID_DELETE_ROW_LEFT, wxT("Delete second") ), 0, wxALL, 5 ); |
abd6692c | 546 | left_sizer->Add( new wxButton( this, ID_EDIT_ROW_LEFT, wxT("Edit") ), 0, wxALL, 5 ); |
fc211fe5 RR |
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 ); | |
abd6692c RR |
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 ); | |
cbc9145c | 556 | right_sizer->Add( new wxButton( this, ID_DELETE_ROW_RIGHT, wxT("Delete second") ), 0, wxALL, 5 ); |
abd6692c RR |
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 ); | |
b910a8ad | 560 | |
abd6692c RR |
561 | wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL ); |
562 | main_sizer->Add( top_sizer, 1, wxGROW ); | |
563 | main_sizer->Add( button_sizer, 0, wxGROW ); | |
eb7f97f8 RR |
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)); | |
b910a8ad | 572 | |
abd6692c | 573 | SetSizer( main_sizer ); |
241cb04b RR |
574 | } |
575 | ||
eb7f97f8 RR |
576 | MySortingFrame::~MySortingFrame() |
577 | { | |
578 | delete wxLog::SetActiveTarget(m_logOld); | |
579 | } | |
580 | ||
581 | void MySortingFrame::OnSelectedUnsorted(wxDataViewEvent &event) | |
582 | { | |
fc211fe5 RR |
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 ) ); | |
eb7f97f8 RR |
588 | } |
589 | ||
590 | void MySortingFrame::OnSelectedSorted(wxDataViewEvent &event) | |
591 | { | |
592 | wxLogMessage( wxT("OnSelected from sorted list, selected %d"), (int) event.GetRow() ); | |
593 | } | |
594 | ||
f828871d RR |
595 | void MySortingFrame::OnActivatedUnsorted(wxDataViewEvent &event) |
596 | { | |
597 | wxLogMessage( wxT("OnActivated from unsorted list, activated %d"), (int) event.GetRow() ); | |
598 | } | |
599 | ||
31fb32e1 RR |
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 | ||
241cb04b RR |
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 | } | |
bd6169a6 | 640 | |
fc211fe5 RR |
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 | ||
f554a14b | 651 | void MySortingFrame::OnAppendRowLeft(wxCommandEvent& WXUNUSED(event)) |
abd6692c | 652 | { |
4627af27 RR |
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 | } | |
abd6692c RR |
660 | } |
661 | ||
f554a14b | 662 | void MySortingFrame::OnPrependRowLeft(wxCommandEvent& WXUNUSED(event)) |
abd6692c | 663 | { |
4627af27 RR |
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 | } | |
abd6692c RR |
671 | } |
672 | ||
f554a14b | 673 | void MySortingFrame::OnInsertRowLeft(wxCommandEvent& WXUNUSED(event)) |
abd6692c | 674 | { |
cbc9145c | 675 | wxTextEntryDialog dialog( this, wxT("Enter text to insert before second") ); |
4627af27 RR |
676 | if (dialog.ShowModal() == wxID_OK) |
677 | { | |
678 | wxString value = dialog.GetValue(); | |
679 | if (!value.empty()) | |
680 | m_unsorted_model->InsertRowAt1( value ); | |
681 | } | |
abd6692c RR |
682 | } |
683 | ||
f554a14b | 684 | void MySortingFrame::OnDeleteRowLeft(wxCommandEvent& WXUNUSED(event)) |
abd6692c | 685 | { |
4627af27 | 686 | m_unsorted_model->DeleteRow( 1 ); |
abd6692c RR |
687 | } |
688 | ||
f554a14b | 689 | void MySortingFrame::OnEditRowLeft(wxCommandEvent& WXUNUSED(event)) |
abd6692c RR |
690 | { |
691 | } | |
692 | ||
f554a14b | 693 | void MySortingFrame::OnAppendRowRight(wxCommandEvent& WXUNUSED(event)) |
abd6692c RR |
694 | { |
695 | } | |
696 | ||
f554a14b | 697 | void MySortingFrame::OnPrependRowRight(wxCommandEvent& WXUNUSED(event)) |
abd6692c RR |
698 | { |
699 | } | |
700 | ||
f554a14b | 701 | void MySortingFrame::OnInsertRowRight(wxCommandEvent& WXUNUSED(event)) |
abd6692c RR |
702 | { |
703 | } | |
704 | ||
f554a14b | 705 | void MySortingFrame::OnDeleteRowRight(wxCommandEvent& WXUNUSED(event)) |
abd6692c RR |
706 | { |
707 | } | |
708 | ||
f554a14b | 709 | void MySortingFrame::OnEditRowRight(wxCommandEvent& WXUNUSED(event)) |
abd6692c RR |
710 | { |
711 | } | |
712 |