]> git.saurik.com Git - wxWidgets.git/commitdiff
Add wxDataViewEvent::IsEditCancelled() and support for vetoing edit events.
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 19 Jul 2011 22:35:53 +0000 (22:35 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 19 Jul 2011 22:35:53 +0000 (22:35 +0000)
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
include/wx/dataview.h
interface/wx/dataview.h
src/common/datavcmn.cpp

index ee0d0fc1c0cc3c74977f8156c4f329f4c37c1ecf..9c0c96f63e821c73afa4875ae773f549a0deeb4a 100644 (file)
@@ -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:
 
index d816a2c5583b9a05bb087ebd0eda36124bbfdf2b..be3ce240a8923416c67e35c393c0cea55926234f 100644 (file)
@@ -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;
index dd6e0495341f336f60dca4e2f4ae6c7cb14d2092..8779ef96f9c243c42583e770685cba3e6006f4d6 100644 (file)
@@ -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.
     */
index 57c175af8ccb19eff35fd750f31bab2bdb95018d..611d3b1d5a637c4f147501f5559c4cef997a029a 100644 (file)
@@ -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,