X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d14e1c3a1a2a960356d9e54d8376ab5483343f6a..f3955fdff68ba2684368e0537436f7268b0ad1ca:/samples/dataview/dataview.cpp diff --git a/samples/dataview/dataview.cpp b/samples/dataview/dataview.cpp index 6877ef4627..adb6e6f49e 100644 --- a/samples/dataview/dataview.cpp +++ b/samples/dataview/dataview.cpp @@ -39,6 +39,63 @@ #define DATAVIEW_DEFAULT_STYLE (wxDV_MULTIPLE|wxDV_HORIZ_RULES|wxDV_VERT_RULES) +// ------------------------------------- +// MySpinCtrlInPlaceRenderer +// ------------------------------------- + +class MySpinCtrlInPlaceRenderer: public wxDataViewCustomRenderer +{ +public: + MySpinCtrlInPlaceRenderer() : + wxDataViewCustomRenderer( wxT("long"), wxDATAVIEW_CELL_EDITABLE ) { } + + + virtual bool HasEditorCtrl() + { + return true; + } + virtual wxControl* CreateEditorCtrl( wxWindow *parent, wxRect labelRect, const wxVariant &value ) + { + long l = value; + return new wxSpinCtrl( parent, wxID_ANY, wxEmptyString, + labelRect.GetTopLeft(), labelRect.GetSize(), -0, -1, 2010, l ); + } + virtual bool GetValueFromEditorCtrl( wxControl* editor, wxVariant &value ) + { + wxSpinCtrl *sc = (wxSpinCtrl*) editor; + long l = sc->GetValue(); + value = l; + return true; + } + + bool Render( wxRect rect, wxDC *dc, int WXUNUSED(state) ) + { + wxString str; + str.Printf( wxT("%d"), (int) m_data ); + dc->SetTextForeground( *wxBLACK ); + dc->DrawText( str, rect.x, rect.y ); + return true; + } + wxSize GetSize() const + { + return wxSize(80,16); + } + bool SetValue( const wxVariant &value ) + { + m_data = value.GetLong(); + return true; + } + bool GetValue( wxVariant &value ) const + { + value = m_data; + return true; + } + +private: + long m_data; +}; + + // ------------------------------------- // MyMusicModel @@ -66,7 +123,7 @@ class MyMusicModelNode { public: MyMusicModelNode( MyMusicModelNode* parent, - const wxString &title, const wxString &artist, const wxString &year ) + const wxString &title, const wxString &artist, int year ) { m_parent = parent; m_title = title; @@ -80,6 +137,7 @@ public: { m_parent = parent; m_title = branch; + m_year = -1; m_isContainer = true; } @@ -106,7 +164,7 @@ public: public: wxString m_title; wxString m_artist; - wxString m_year; + int m_year; private: MyMusicModelNode *m_parent; @@ -127,21 +185,21 @@ public: m_pop = new MyMusicModelNode( m_root, "Pop music" ); m_root->Append( m_pop ); m_pop->Append( new MyMusicModelNode( m_pop, - "You are not alone", "Michael Jackson", "1995" ) ); + "You are not alone", "Michael Jackson", 1995 ) ); m_pop->Append( new MyMusicModelNode( m_pop, - "Take a bow", "Madonna", "1994" ) ); + "Take a bow", "Madonna", 1994 ) ); m_classical = new MyMusicModelNode( m_root, "Classical music" ); m_root->Append( m_classical ); m_classical->Append( new MyMusicModelNode( m_classical, - "Ninth symphony", "Ludwig van Beethoven", "1824" ) ); + "Ninth symphony", "Ludwig van Beethoven", 1824 ) ); m_classical->Append( new MyMusicModelNode( m_classical, - "German Requiem", "Johannes Brahms", "1868" ) ); + "German Requiem", "Johannes Brahms", 1868 ) ); m_classicalMusicIsKnownToControl = false; } // helper methods to change the model - void AddToClassical( const wxString &title, const wxString &artist, const wxString &year ) + void AddToClassical( const wxString &title, const wxString &artist, int year ) { // add to data MyMusicModelNode *child_node = @@ -163,15 +221,11 @@ public: MyMusicModelNode *node = (MyMusicModelNode*) item.GetID(); wxDataViewItem parent( node->GetParent() ); - // notify control - ItemDeleted( parent, item ); - //We must delete the node after we call ItemDeleted - //The reason is that: - //When we use wxSortedArray, the array find a node through binary search for speed. - //And when the array is searching for some node, it call the model's compare function. - //The compare function need the node to be compared. So we should delete the node later, here. node->GetParent()->GetChildren().Remove( node ); delete node; + + // notify control + ItemDeleted( parent, item ); } // override sorting to always sort branches ascendingly @@ -209,6 +263,9 @@ public: virtual wxString GetColumnType( unsigned int col ) const { + if (col == 2) + return "long"; + return "string"; } @@ -220,10 +277,12 @@ public: { case 0: variant = node->m_title; break; case 1: variant = node->m_artist; break; - case 2: variant = node->m_year; break; + case 2: variant = (long) node->m_year; break; default: { wxLogError( "MyMusicModel::GetValue: wrong column" ); + + // provoke a crash when mouse button down wxMouseState state = wxGetMouseState(); if (state.ShiftDown()) { @@ -240,11 +299,12 @@ public: MyMusicModelNode *node = (MyMusicModelNode*) item.GetID(); switch (col) { - case 0: node->m_title = variant.GetString(); break; - case 1: node->m_artist = variant.GetString(); break; - case 2: node->m_year = variant.GetString(); break; + case 0: node->m_title = variant.GetString(); return true; + case 1: node->m_artist = variant.GetString(); return true; + case 2: node->m_year = variant.GetLong(); return true; default: wxLogError( "MyMusicModel::SetValue: wrong column" ); } + return false; } virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const @@ -273,48 +333,36 @@ public: return node->IsContainer(); } - virtual wxDataViewItem GetFirstChild( const wxDataViewItem &parent ) const + virtual unsigned int GetChildren( const wxDataViewItem &parent, wxDataViewItemArray &array ) const { MyMusicModelNode *node = (MyMusicModelNode*) parent.GetID(); if (!node) - return wxDataViewItem( (void*) m_root ); + { + array.Add( wxDataViewItem( (void*) m_root ) ); + return 1; + } - if (node->GetChildCount() == 0) - return wxDataViewItem( 0 ); - if (node == m_classical) { MyMusicModel *model = (MyMusicModel*)(const MyMusicModel*) this; model->m_classicalMusicIsKnownToControl = true; } - MyMusicModelNode *first_child = node->GetChildren().Item( 0 ); - return wxDataViewItem( (void*) first_child ); + if (node->GetChildCount() == 0) + { + return 0; + } + + unsigned int count = node->GetChildren().GetCount(); + unsigned int pos; + for (pos = 0; pos < count; pos++) + { + MyMusicModelNode *child = node->GetChildren().Item( pos ); + array.Add( wxDataViewItem( (void*) child ) ); + } + return count; } - virtual wxDataViewItem GetNextSibling( const wxDataViewItem &item ) const - { - MyMusicModelNode *node = (MyMusicModelNode*) item.GetID(); - - // "MyMusic" has no siblings in our model - if (node == m_root) - return wxDataViewItem(0); - - MyMusicModelNode *parent = node->GetParent(); - int pos = parent->GetChildren().Index( node ); - - // Something went wrong - if (pos == wxNOT_FOUND) - return wxDataViewItem(0); - - // No more children - if (pos == parent->GetChildCount()-1) - return wxDataViewItem(0); - - node = parent->GetChildren().Item( pos+1 ); - return wxDataViewItem( (void*) node ); - } - private: MyMusicModelNode* m_root; MyMusicModelNode* m_pop; @@ -335,6 +383,8 @@ public: str.Printf( "row number %d", i ); m_array.Add( str ); } + + m_icon = wxIcon( null_xpm ); } // helper methods to change the model @@ -356,11 +406,14 @@ public: virtual unsigned int GetColumnCount() const { - return 2; + return 3; } virtual wxString GetColumnType( unsigned int col ) const { + if (col == 1) + return "wxDataViewIconText"; + return "string"; } @@ -375,6 +428,11 @@ public: if (col==0) { variant = m_array[ row ]; + } else + if (col==1) + { + wxDataViewIconText data( "test", m_icon ); + variant << data; } else { @@ -397,6 +455,7 @@ public: } wxArrayString m_array; + wxIcon m_icon; }; // ------------------------------------- @@ -479,7 +538,7 @@ bool MyApp::OnInit(void) // build the first frame MyFrame *frame = - new MyFrame(NULL, wxT("wxDataViewCtrl feature test"), 40, 40, 700, 440); + new MyFrame(NULL, wxT("wxDataViewCtrl feature test"), 40, 40, 800, 440); frame->Show(true); SetTopWindow(frame); @@ -509,7 +568,7 @@ enum ID_PREPEND_LIST = 200, ID_DELETE_LIST = 201, - ID_GOTO = 202 + ID_GOTO = 202 }; BEGIN_EVENT_TABLE(MyFrame, wxFrame) @@ -585,10 +644,12 @@ MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h): col->SetSortOrder( true ); #endif - m_musicCtrl->AppendTextColumn( "Artist", 1, wxDATAVIEW_CELL_EDITABLE, 200, + m_musicCtrl->AppendTextColumn( "Artist", 1, wxDATAVIEW_CELL_EDITABLE, 150, DEFAULT_ALIGN, wxDATAVIEW_COL_SORTABLE ); - m_musicCtrl->AppendTextColumn( "Year", 2, wxDATAVIEW_CELL_INERT, 50, - DEFAULT_ALIGN ); + + MySpinCtrlInPlaceRenderer *sr = new MySpinCtrlInPlaceRenderer; + wxDataViewColumn *column = new wxDataViewColumn( "year", sr, 2, -1, wxALIGN_CENTRE, wxDATAVIEW_COL_SORTABLE ); + m_musicCtrl->AppendColumn( column ); data_sizer->Add( m_musicCtrl, 3, wxGROW ); @@ -603,7 +664,8 @@ MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h): m_listCtrl->AssociateModel( m_list_model.get() ); m_listCtrl->AppendTextColumn( "editable string", 0, wxDATAVIEW_CELL_EDITABLE, 120 ); - m_col = m_listCtrl->AppendTextColumn( "index", 1, wxDATAVIEW_CELL_INERT, 120 ); + m_listCtrl->AppendIconTextColumn( "icon", 1, wxDATAVIEW_CELL_INERT, 60 ); + m_listCtrl->AppendTextColumn( "index", 2, wxDATAVIEW_CELL_INERT, 120 ); data_sizer->Add( m_listCtrl, 2, wxGROW ); @@ -638,7 +700,7 @@ void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) ) void MyFrame::OnAddMozart(wxCommandEvent& WXUNUSED(event) ) { - m_music_model->AddToClassical( "Kleine Nachtmusik", "Wolfgang Mozart", "1787" ); + m_music_model->AddToClassical( "Kleine Nachtmusik", "Wolfgang Mozart", 1787 ); } void MyFrame::OnDeleteMusic(wxCommandEvent& WXUNUSED(event) )