From 2a648479df44228ca01da2cbffb389034c037d65 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 19 Jul 2011 22:35:53 +0000 Subject: [PATCH] Add wxDataViewEvent::IsEditCancelled() and support for vetoing edit events. Currently this is only implemented in the generic wxDataViewCtrl, the native GTK/OSX ports should be modified to support this later. Closes #13323. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@68307 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + include/wx/dataview.h | 11 +++++++++-- interface/wx/dataview.h | 20 ++++++++++++++++++++ src/common/datavcmn.cpp | 16 +++++++++++----- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index ee0d0fc1c0..9c0c96f63e 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -441,6 +441,7 @@ All (GUI): - Support float, double and file name values in wxGenericValidator (troelsk). - Fix keyboard navigation in wxGrid with hidden columns (ivan_14_32). +- Add wxDataViewEvent::IsEditCancelled() (Allonii). OSX: diff --git a/include/wx/dataview.h b/include/wx/dataview.h index d816a2c558..be3ce240a8 100644 --- a/include/wx/dataview.h +++ b/include/wx/dataview.h @@ -763,7 +763,8 @@ public: m_column(NULL), m_pos(-1,-1), m_cacheFrom(0), - m_cacheTo(0) + m_cacheTo(0), + m_editCancelled(false) #if wxUSE_DRAG_AND_DROP , m_dataObject(NULL), m_dataBuffer(NULL), @@ -780,7 +781,8 @@ public: m_column(event.m_column), m_pos(event.m_pos), m_cacheFrom(event.m_cacheFrom), - m_cacheTo(event.m_cacheTo) + m_cacheTo(event.m_cacheTo), + m_editCancelled(event.m_editCancelled) #if wxUSE_DRAG_AND_DROP , m_dataObject(event.m_dataObject), m_dataFormat(event.m_dataFormat), @@ -801,6 +803,10 @@ public: const wxVariant &GetValue() const { return m_value; } void SetValue( const wxVariant &value ) { m_value = value; } + // for wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE only + bool IsEditCancelled() const { return m_editCancelled; } + void SetEditCanceled(bool editCancelled) { m_editCancelled = editCancelled; } + // for wxEVT_DATAVIEW_COLUMN_HEADER_CLICKED only void SetDataViewColumn( wxDataViewColumn *col ) { m_column = col; } wxDataViewColumn *GetDataViewColumn() const { return m_column; } @@ -840,6 +846,7 @@ protected: wxPoint m_pos; int m_cacheFrom; int m_cacheTo; + bool m_editCancelled; #if wxUSE_DRAG_AND_DROP wxDataObject *m_dataObject; diff --git a/interface/wx/dataview.h b/interface/wx/dataview.h index dd6e049534..8779ef96f9 100644 --- a/interface/wx/dataview.h +++ b/interface/wx/dataview.h @@ -2715,6 +2715,26 @@ public: */ const wxVariant& GetValue() const; + /** + Can be used to determine whether the new value is going to be accepted + in wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE handler. + + Returns @true if editing the item was cancelled or if the user tried to + enter an invalid value (refused by wxDataViewRenderer::Validate()). If + this method returns @false, it means that the value in the model is + about to be changed to the new one. + + Notice that wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE event handler can + call wxNotifyEvent::Veto() to prevent this from happening. + + Currently support for setting this field and for vetoing the change is + only available in the generic version of wxDataViewCtrl, i.e. under MSW + but not GTK nor OS X. + + @since 2.9.3 + */ + bool IsEditCancelled() const; + /** Sets the column index associated with this event. */ diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp index 57c175af8c..611d3b1d5a 100644 --- a/src/common/datavcmn.cpp +++ b/src/common/datavcmn.cpp @@ -763,21 +763,27 @@ bool wxDataViewRendererBase::FinishEditing() DestroyEditControl(); - if (!Validate(value)) - return false; - + bool isValid = Validate(value); unsigned int col = GetOwner()->GetModelColumn(); - dv_ctrl->GetModel()->ChangeValue(value, m_item, col); // Now we should send Editing Done event wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE, dv_ctrl->GetId() ); event.SetDataViewColumn( GetOwner() ); event.SetModel( dv_ctrl->GetModel() ); event.SetItem( m_item ); + event.SetValue( value ); + event.SetColumn( col ); + event.SetEditCanceled( !isValid ); event.SetEventObject( dv_ctrl ); dv_ctrl->GetEventHandler()->ProcessEvent( event ); - return true; + if ( isValid && event.IsAllowed() ) + { + dv_ctrl->GetModel()->ChangeValue(value, m_item, col); + return true; + } + + return false; } void wxDataViewRendererBase::PrepareForItem(const wxDataViewModel *model,