diff --git a/include/wx/generic/dvrenderer.h b/include/wx/generic/dvrenderer.h index 59e8a5782d..3abf273181 100644 --- a/include/wx/generic/dvrenderer.h +++ b/include/wx/generic/dvrenderer.h @@ -47,12 +47,24 @@ public: // intentionally returns NULL for all the other renderer classes as the // user should _not_ be able to override Activate/LeftClick() when deriving // from them for consistency with the other ports and while we can't - // prevent this from working at compile-time because all renderer are + // prevent this from working at compile-time because all renderers are // custom renderers in the generic implementation, we at least make sure // that it doesn't work at run-time because Activate/LeftClick() would // never be called virtual wxDataViewCustomRenderer *WXGetAsCustom() { return NULL; } + // The generic implementation of some standard renderers reacts to item + // activation, so provide this internal function which is called by + // wxDataViewCtrl for them. It is called with the old value of the cell and + // is passed the model and cell coordinates to be able to change the model + // value for this cell. + virtual void WXOnActivate(wxDataViewModel * WXUNUSED(model), + const wxVariant& WXUNUSED(valueOld), + const wxDataViewItem& WXUNUSED(item), + unsigned int WXUNUSED(col)) + { + } + private: int m_align; wxDataViewCellMode m_mode; diff --git a/include/wx/generic/dvrenderers.h b/include/wx/generic/dvrenderers.h index 3ebe0d0f3e..62670c787b 100644 --- a/include/wx/generic/dvrenderers.h +++ b/include/wx/generic/dvrenderers.h @@ -100,10 +100,13 @@ public: bool GetValue( wxVariant &value ) const; bool Render( wxRect cell, wxDC *dc, int state ); - bool Activate( wxRect cell, wxDataViewModel *model, const wxDataViewItem & item, - unsigned int col ); wxSize GetSize() const; + // Implementation only, don't use nor override + virtual void WXOnActivate(wxDataViewModel *model, + const wxVariant& valueOld, + const wxDataViewItem& item, + unsigned int col); private: bool m_toggle; @@ -182,10 +185,12 @@ public: virtual bool Render( wxRect cell, wxDC *dc, int state ); virtual wxSize GetSize() const; - virtual bool Activate( wxRect cell, - wxDataViewModel *model, - const wxDataViewItem& item, - unsigned int col ); + + // Implementation only, don't use nor override + virtual void WXOnActivate(wxDataViewModel *model, + const wxVariant& valueOld, + const wxDataViewItem& item, + unsigned int col); private: wxDateTime m_date; diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 0823c1752b..dc1bf273c0 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -844,12 +844,12 @@ bool wxDataViewToggleRenderer::Render( wxRect cell, wxDC *dc, int WXUNUSED(state return true; } -bool wxDataViewToggleRenderer::Activate( wxRect WXUNUSED(cell), - wxDataViewModel *model, - const wxDataViewItem & item, unsigned int col) +void wxDataViewToggleRenderer::WXOnActivate(wxDataViewModel *model, + const wxVariant& valueOld, + const wxDataViewItem & item, + unsigned int col) { - model->ChangeValue(!m_toggle, item, col); - return true; + model->ChangeValue(!valueOld.GetBool(), item, col); } wxSize wxDataViewToggleRenderer::GetSize() const @@ -1005,24 +1005,23 @@ wxSize wxDataViewDateRenderer::GetSize() const return wxSize(x,y+d); } -bool wxDataViewDateRenderer::Activate( wxRect WXUNUSED(cell), wxDataViewModel *model, - const wxDataViewItem & item, unsigned int col ) +void wxDataViewDateRenderer::WXOnActivate(wxDataViewModel *model, + const wxVariant& valueOld, + const wxDataViewItem & item, + unsigned int col ) { - wxVariant variant; - model->GetValue( variant, item, col ); - wxDateTime value = variant.GetDateTime(); + wxDateTime dtOld = valueOld.GetDateTime(); #if wxUSE_DATE_RENDERER_POPUP wxDataViewDateRendererPopupTransient *popup = new wxDataViewDateRendererPopupTransient( - GetOwner()->GetOwner()->GetParent(), &value, model, item, col); + GetOwner()->GetOwner()->GetParent(), &dtOld, model, item, col); wxPoint pos = wxGetMousePosition(); popup->Move( pos ); popup->Layout(); popup->Popup( popup->m_cal ); #else // !wxUSE_DATE_RENDERER_POPUP - wxMessageBox(value.Format()); + wxMessageBox(dtOld.Format()); #endif // wxUSE_DATE_RENDERER_POPUP/!wxUSE_DATE_RENDERER_POPUP - return true; } // --------------------------------------------------------- @@ -3585,14 +3584,20 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) { if ((!ignore_other_columns) && (cell->GetMode() == wxDATAVIEW_CELL_ACTIVATABLE)) { + const unsigned colIdx = col->GetModelColumn(); + + wxVariant value; + model->GetValue( value, item, colIdx ); + + cell->WXOnActivate(model, value, item, colIdx); + if ( wxDataViewCustomRenderer *custom = cell->WXGetAsCustom() ) { - wxVariant value; - model->GetValue( value, item, col->GetModelColumn() ); - custom->SetValue( value ); + cell->SetValue( value ); + wxRect cell_rect( xpos, GetLineStart( current ), col->GetWidth(), GetLineHeight( current ) ); - custom->Activate( cell_rect, model, item, col->GetModelColumn() ); + custom->Activate( cell_rect, model, item, colIdx ); } } else