X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9861f022c31f3f46b694f77cb166b02452a63b6d..8019a673052f9257fa31ae42a26f2920454093f7:/samples/dataview/dataview.cpp?ds=sidebyside diff --git a/samples/dataview/dataview.cpp b/samples/dataview/dataview.cpp index 73daada988..0d488672aa 100644 --- a/samples/dataview/dataview.cpp +++ b/samples/dataview/dataview.cpp @@ -26,6 +26,7 @@ #include "wx/choicdlg.h" #include "wx/numdlg.h" #include "wx/dataview.h" +#include "wx/spinctrl.h" #ifndef __WXMSW__ #include "../sample.xpm" @@ -117,7 +118,7 @@ public: variant = tmp; } } - virtual bool SetValue( wxVariant &value, unsigned int col, unsigned int row ) + virtual bool SetValue( const wxVariant &value, unsigned int col, unsigned int row ) { if (col == 6) { @@ -133,6 +134,12 @@ public: } return true; } + + virtual void GetAttr( wxListItemAttr &attr, unsigned int col, unsigned int row ) + { + if (row == 4) + attr.SetBackgroundColour( *wxGREEN ); + } wxArrayString m_list; wxArrayInt m_bools; @@ -141,6 +148,32 @@ public: wxArrayDate m_dates; }; +// ------------------------------------- +// MyTextRenderer +// ------------------------------------- + +class MyTextRenderer: public wxDataViewTextRenderer +{ +public: + MyTextRenderer( const wxString varianttype = wxT("string"), + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT ) + : wxDataViewTextRenderer( varianttype, mode ) { } + + virtual bool Validate( wxVariant &value ) + { + wxString str = value; + if (str.Length() > 10) + { + wxMessageDialog dlg( NULL, wxT("string too long") , wxT("Error") ); + dlg.ShowModal(); + return false; + } + + return true; + } +}; + + // ------------------------------------- // MyCustomRenderer // ------------------------------------- @@ -193,6 +226,63 @@ private: wxString m_colour; }; +// ------------------------------------- +// 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, 0, 100, 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; +}; + // ------------------------------------- // MyUnsortedTextModel // ------------------------------------- @@ -210,6 +300,14 @@ public: m_list.Add( wxT("of") ); m_list.Add( wxT("words.") ); + m_ilist.Add( 0 ); + m_ilist.Add( 1); + m_ilist.Add( 2 ); + m_ilist.Add( 3 ); + m_ilist.Add( 4 ); + m_ilist.Add( 5 ); + m_ilist.Add( 6 ); + m_bitmap = wxBitmap( null_xpm ); } @@ -220,7 +318,7 @@ public: virtual unsigned int GetColumnCount() const { - return 2; + return 4; } virtual wxString GetColumnType( unsigned int WXUNUSED(col) ) const @@ -234,23 +332,34 @@ public: { variant = m_list[row]; return; - } + } else if ((col == 2) || (col == 3)) { variant << m_bitmap; return; + } else + if (col == 4) + { + variant = (long) m_ilist[row]; + return; } + wxString tmp; tmp.Printf( wxT("item(%d;%d)"), (int)row, (int)col ); variant = tmp; } - virtual bool SetValue( wxVariant &variant, unsigned int col, unsigned int row ) + virtual bool SetValue( const wxVariant &variant, unsigned int col, unsigned int row ) { if (col == 0) { m_list[row] = variant.GetString(); return true; + } else + if (col == 4) + { + m_ilist[row] = variant.GetLong(); + return true; } return false; @@ -259,28 +368,33 @@ public: void AppendRow( const wxString &text ) { m_list.Add( text ); + m_ilist.Add( 0 ); RowAppended(); } void PrependRow( const wxString &text ) { m_list.Insert( text, 0 ); + m_ilist.Insert( 0, 0 ); RowPrepended(); } void InsertRowAt1( const wxString &text ) { m_list.Insert( text, 1 ); + m_ilist.Insert( 0, 1 ); RowInserted( 1 ); } void DeleteRow( unsigned int index ) { m_list.RemoveAt( index ); + m_ilist.RemoveAt( index ); RowDeleted( index ); } wxArrayString m_list; + wxArrayInt m_ilist; wxBitmap m_bitmap; }; @@ -574,10 +688,12 @@ void MyFrame::CreateDataViewControls() style |= wxDV_MULTIPLE; if (GetMenuBar()->FindItem(ID_NO_HEADER_MODE)->IsChecked()) style |= wxDV_NO_HEADER; +#if 0 if (GetMenuBar()->FindItem(ID_HORIZ_RULES_MODE)->IsChecked()) style |= wxDV_HORIZ_RULES; if (GetMenuBar()->FindItem(ID_VERT_RULES_MODE)->IsChecked()) style |= wxDV_VERT_RULES; +#endif // Left wxDataViewCtrl @@ -585,6 +701,9 @@ void MyFrame::CreateDataViewControls() wxDefaultSize, style ); + wxDataViewTextRenderer *text_renderer; + wxDataViewColumn *column; + wxObjectDataPtr model(new MyTextModel); dataview_left->AssociateModel( model.get() ); @@ -593,10 +712,8 @@ void MyFrame::CreateDataViewControls() dataview_left->AppendTextColumn( wxT("Second"), 1, wxDATAVIEW_CELL_INERT, -1, DEFAULT_ALIGN ); - wxDataViewTextRenderer *text_renderer = - new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE ); - wxDataViewColumn *column = new wxDataViewColumn( wxT("editable"), text_renderer, 2, - -1, DEFAULT_ALIGN ); + text_renderer = new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE ); + column = new wxDataViewColumn( wxT("editable"), text_renderer, 2, -1, DEFAULT_ALIGN ); dataview_left->AppendColumn( column ); dataview_left->AppendToggleColumn( wxT("fourth"), 3, wxDATAVIEW_CELL_INERT, -1, @@ -611,7 +728,6 @@ void MyFrame::CreateDataViewControls() dataview_left->AppendDateColumn( wxT("date"), 6, wxDATAVIEW_CELL_INERT, -1, DEFAULT_ALIGN ); - // Right wxDataViewCtrl using the same model dataview_right = new wxDataViewCtrl( m_panelRight, wxID_ANY ); dataview_right->AssociateModel( model.get() ); @@ -895,11 +1011,11 @@ MySortingFrame::MySortingFrame(wxFrame *frame, wxChar *title, int x, int y, int dataview_left = new wxDataViewCtrl( main, ID_UNSORTED, wxDefaultPosition, wxDefaultSize, wxDV_MULTIPLE ); - m_unsorted_model.reset(new MyUnsortedTextModel); + m_unsorted_model = new MyUnsortedTextModel; dataview_left->AssociateModel( m_unsorted_model.get() ); wxDataViewTextRenderer *text_renderer = - new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE ); + new MyTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE ); wxDataViewColumn *column = new wxDataViewColumn( wxT("editable"), text_renderer, 0 ); dataview_left->AppendColumn( column ); dataview_left->AppendTextColumn( wxT("second"), 1 ); @@ -911,7 +1027,7 @@ MySortingFrame::MySortingFrame(wxFrame *frame, wxChar *title, int x, int y, int // Right wxDataViewCtrl using the sorting model dataview_right = new wxDataViewCtrl( main, ID_SORTED ); - m_sorted_model.reset(new wxDataViewSortedListModel( m_unsorted_model.get() )); + m_sorted_model = new wxDataViewSortedListModel( m_unsorted_model.get() ); dataview_right->AssociateModel( m_sorted_model.get() ); text_renderer = new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE ); @@ -921,6 +1037,10 @@ MySortingFrame::MySortingFrame(wxFrame *frame, wxChar *title, int x, int y, int dataview_right->AppendColumn( column ); dataview_right->AppendTextColumn( wxT("second"), 1 ); + + MySpinCtrlInPlaceRenderer *sr = new MySpinCtrlInPlaceRenderer; + column = new wxDataViewColumn( wxT("spin"), sr, 4, -1, wxALIGN_CENTER ); + dataview_right->AppendColumn( column ); // layout dataview controls.