From 241cb04bd821f0810ef5dfdfd4b085a506f98402 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Tue, 28 Feb 2006 21:41:13 +0000 Subject: [PATCH 1/1] Don't delete model in views destructor as several views can have the same model and memory doesn't like getting freed several times. Sorting actually works. Not yet editing the sorted data. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37766 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- samples/dataview/dataview.cpp | 138 +++++++++++++++++++++++++++++++++- src/common/datavcmn.cpp | 5 -- 2 files changed, 136 insertions(+), 7 deletions(-) diff --git a/samples/dataview/dataview.cpp b/samples/dataview/dataview.cpp index 5633e1f542..69f21ce904 100644 --- a/samples/dataview/dataview.cpp +++ b/samples/dataview/dataview.cpp @@ -171,6 +171,49 @@ private: wxString m_colour; }; +// ------------------------------------- +// MyUnsortedTextModel +// ------------------------------------- + +class MyUnsortedTextModel: public wxDataViewListModel +{ +public: + MyUnsortedTextModel() + { + m_list.Add( wxT("This") ); + m_list.Add( wxT("is") ); + m_list.Add( wxT("an") ); + m_list.Add( wxT("unsorted") ); + m_list.Add( wxT("list") ); + m_list.Add( wxT("of") ); + m_list.Add( wxT("words.") ); + } + + virtual size_t GetNumberOfRows() { return m_list.GetCount(); } + virtual size_t GetNumberOfCols() { return 2; } + virtual wxString GetColType( size_t col ) { return wxT("string"); } + virtual wxVariant GetValue( size_t col, size_t row ) + { + if (col == 0) + return m_list[row]; + wxString tmp; + tmp.Printf( wxT("item(%d;%d)"), (int)row, (int)col ); + return tmp; + } + virtual bool SetValue( wxVariant &variant, size_t col, size_t row ) + { + if (col == 0) + { + m_list[row] = variant.GetString(); + return true; + } + return false; + + } + + wxArrayString m_list; +}; + // ------------------------------------- // MyApp // ------------------------------------- @@ -199,6 +242,24 @@ private: wxDataViewCtrl* dataview_right; }; +// ------------------------------------- +// MySortingFrame +// ------------------------------------- + +class MySortingFrame: public wxFrame +{ +public: + MySortingFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h); + +public: + void OnQuit(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); + +private: + wxDataViewCtrl* dataview_left; + wxDataViewCtrl* dataview_right; +}; + // ------------------------------------- // MyApp // ------------------------------------- @@ -210,10 +271,12 @@ IMPLEMENT_APP (MyApp) bool MyApp::OnInit(void) { - MyFrame *frame = new MyFrame(NULL, _T("Dynamic wxWidgets App"), 50, 50, 600, 340); - + MyFrame *frame = new MyFrame(NULL, wxT("wxDataViewCtrl test"), 10, 10, 800, 340); frame->Show(true); + MySortingFrame *frame2 = new MySortingFrame(NULL, wxT("wxDataViewCtrl test"), 10, 350, 400, 240); + frame2->Show(true); + SetTopWindow(frame); return true; @@ -309,4 +372,75 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) ) dialog.ShowModal(); } +// ------------------------------------- +// MySortingFrame +// ------------------------------------- + +MySortingFrame::MySortingFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h): + wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h)) +{ +#ifdef __WXMSW__ + SetIcon(wxIcon(_T("mondrian"))); +#else + SetIcon(wxIcon(mondrian_xpm)); +#endif + + wxMenu *file_menu = new wxMenu; + + file_menu->Append(DYNAMIC_ABOUT, _T("&About")); + file_menu->Append(DYNAMIC_QUIT, _T("E&xit")); + wxMenuBar *menu_bar = new wxMenuBar; + menu_bar->Append(file_menu, _T("&File")); + SetMenuBar(menu_bar); + + // You used to have to do some casting for param 4, but now there are type-safe handlers + Connect( DYNAMIC_QUIT, wxID_ANY, + wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MySortingFrame::OnQuit) ); + Connect( DYNAMIC_ABOUT, wxID_ANY, + wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MySortingFrame::OnAbout) ); + + CreateStatusBar(); + + + // Left wxDataViewCtrl + dataview_left = new wxDataViewCtrl( this, -1 ); + + MyUnsortedTextModel *model = new MyUnsortedTextModel; + dataview_left->AssociateModel( model ); + wxDataViewTextCell *text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE ); + wxDataViewColumn *column = new wxDataViewColumn( wxT("editable"), text_cell, 0 ); + dataview_left->AppendColumn( column ); + dataview_left->AppendTextColumn( wxT("second"), 1 ); + + // Right wxDataViewCtrl using the sorting model + dataview_right = new wxDataViewCtrl( this, -1 ); + wxDataViewSortedListModel *sorted_model = + new wxDataViewSortedListModel( model ); + dataview_right->AssociateModel( sorted_model ); + text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE ); + column = new wxDataViewColumn( wxT("editable"), text_cell, 0 ); + dataview_right->AppendColumn( column ); + dataview_right->AppendTextColumn( wxT("second"), 1 ); + + // layout dataview controls. + + wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL ); + sizer->Add( dataview_left, 1, wxGROW ); + sizer->Add(10,10); + sizer->Add( dataview_right, 1, wxGROW ); + SetSizer( sizer ); +} + +void MySortingFrame::OnQuit(wxCommandEvent& WXUNUSED(event) ) +{ + Close(true); +} + +void MySortingFrame::OnAbout(wxCommandEvent& WXUNUSED(event) ) +{ + wxMessageDialog dialog(this, _T("This demonstrates the dataview control sorting"), + _T("About DataView"), wxOK); + + dialog.ShowModal(); +} diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp index 6d9a39d736..28191f6789 100644 --- a/src/common/datavcmn.cpp +++ b/src/common/datavcmn.cpp @@ -431,15 +431,10 @@ wxDataViewCtrlBase::wxDataViewCtrlBase() wxDataViewCtrlBase::~wxDataViewCtrlBase() { - if (m_model) - delete m_model; } bool wxDataViewCtrlBase::AssociateModel( wxDataViewListModel *model ) { - if (m_model) - delete m_model; - m_model = model; return true; -- 2.45.2