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: dataview.cpp 41659 2006-10-06 09:50:45Z RR $ 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 37WX_DECLARE_LIST(wxDateTime,wxArrayDate); 38#include <wx/listimpl.cpp> 39WX_DEFINE_LIST(wxArrayDate) 40 41class MyTextModel: public wxDataViewListModel 42{ 43public: 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 139class MyCustomRenderer: public wxDataViewCustomRenderer 140{ 141public: 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 176private: 177 wxString m_colour; 178}; 179 180// ------------------------------------- 181// MyUnsortedTextModel 182// ------------------------------------- 183 184class MyUnsortedTextModel: public wxDataViewListModel 185{ 186public: 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 262class MyApp: public wxApp 263{ 264public: 265 bool OnInit(void); 266}; 267 268// ------------------------------------- 269// MyFrame 270// ------------------------------------- 271 272class MyFrame: public wxFrame 273{ 274public: 275 MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h); 276 277public: 278 void OnQuit(wxCommandEvent& event); 279 void OnAbout(wxCommandEvent& event); 280 281private: 282 wxDataViewCtrl* dataview_left; 283 wxDataViewCtrl* dataview_right; 284}; 285 286// ------------------------------------- 287// MySortingFrame 288// ------------------------------------- 289 290enum 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 312class MySortingFrame: public wxFrame 313{ 314public: 315 MySortingFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h); 316 ~MySortingFrame(); 317 318public: 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 344private: 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 364IMPLEMENT_APP (MyApp) 365 366bool 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 383MyFrame::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 454void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) ) 455{ 456 Close(true); 457} 458 459void 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 471BEGIN_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 ) 483END_EVENT_TABLE() 484 485MySortingFrame::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 576MySortingFrame::~MySortingFrame() 577{ 578 delete wxLog::SetActiveTarget(m_logOld); 579} 580 581void 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 590void MySortingFrame::OnSelectedSorted(wxDataViewEvent &event) 591{ 592 wxLogMessage( wxT("OnSelected from sorted list, selected %d"), (int) event.GetRow() ); 593} 594 595void MySortingFrame::OnActivatedUnsorted(wxDataViewEvent &event) 596{ 597 wxLogMessage( wxT("OnActivated from unsorted list, activated %d"), (int) event.GetRow() ); 598} 599 600void 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 623void MySortingFrame::OnHeaderClickUnsorted(wxDataViewEvent &event) 624{ 625 wxLogMessage( wxT("OnHeaderClick from unsorted list, column %s"), event.GetDataViewColumn()->GetTitle().c_str() ); 626} 627 628void MySortingFrame::OnQuit(wxCommandEvent& WXUNUSED(event) ) 629{ 630 Close(true); 631} 632 633void 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 641void MySortingFrame::OnSelect(wxCommandEvent& WXUNUSED(event)) 642{ 643 dataview_left->SetSelection( 2 ); 644} 645 646void MySortingFrame::OnUnselectAll(wxCommandEvent& WXUNUSED(event)) 647{ 648 dataview_left->ClearSelection(); 649} 650 651void 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 662void 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 673void 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 684void MySortingFrame::OnDeleteRowLeft(wxCommandEvent& WXUNUSED(event)) 685{ 686 m_unsorted_model->DeleteRow( 1 ); 687} 688 689void MySortingFrame::OnEditRowLeft(wxCommandEvent& WXUNUSED(event)) 690{ 691} 692 693void MySortingFrame::OnAppendRowRight(wxCommandEvent& WXUNUSED(event)) 694{ 695} 696 697void MySortingFrame::OnPrependRowRight(wxCommandEvent& WXUNUSED(event)) 698{ 699} 700 701void MySortingFrame::OnInsertRowRight(wxCommandEvent& WXUNUSED(event)) 702{ 703} 704 705void MySortingFrame::OnDeleteRowRight(wxCommandEvent& WXUNUSED(event)) 706{ 707} 708 709void MySortingFrame::OnEditRowRight(wxCommandEvent& WXUNUSED(event)) 710{ 711} 712 713