]> git.saurik.com Git - wxWidgets.git/commitdiff
support for vetoing grid cell editing (patch 469049)
authorVadim Zeitlin <vadim@wxwidgets.org>
Fri, 2 Nov 2001 17:44:55 +0000 (17:44 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Fri, 2 Nov 2001 17:44:55 +0000 (17:44 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12270 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/generic/grid.h
samples/newgrid/griddemo.cpp
src/generic/grid.cpp

index 41eb52d4e737f4aa3afaa4435b65d02137cdf762..27731995c3e01158288a6b3d54d40d53c9d120f6 100644 (file)
@@ -48,6 +48,7 @@ All (GUI):
 - new wxCalendarCtrl styles added (Søren Erland Vestø)
 - wxWizard changes: loading from WXR support, help button (Robert Cavanaugh)
 - wxDirSelector() added (Paul A. Thiessen)
+- wxGrid cell editing veto support (Roger Gammans)
 
 wxHTML:
 
index b0a62e87d7bab59b60e2cc8d977a83a95d99b3cb..7b929ad6b8743e9737c9b02c0394c50aa111d97c 100644 (file)
@@ -1775,9 +1775,9 @@ protected:
     bool Redimension( wxGridTableMessage& );
 
 
-    bool SendEvent( const wxEventType, int row, int col, wxMouseEvent& );
-    bool SendEvent( const wxEventType, int row, int col );
-    bool SendEvent( const wxEventType type)
+    int SendEvent( const wxEventType, int row, int col, wxMouseEvent& );
+    int SendEvent( const wxEventType, int row, int col );
+    int SendEvent( const wxEventType type)
     {
         return SendEvent(type,
                          m_currentCellCoords.GetRow(),
index aaf3bebcd5e048dcc9f106cf9043b8c55082a56c..e78e342be9a6107e299fcff95f876471cfc08449 100644 (file)
@@ -249,6 +249,8 @@ GridFrame::GridFrame()
     grid->SetCellValue( 0, 2, "Blah" );
     grid->SetCellValue( 0, 3, "Read only" );
     grid->SetReadOnly( 0, 3 );
+    
+    grid->SetCellValue( 0, 4, "Can veto edit this cell" );
 
     grid->SetCellValue( 0, 5, "Press\nCtrl+arrow\nto skip over\ncells" );
 
@@ -808,6 +810,17 @@ void GridFrame::OnCellValueChanged( wxGridEvent& ev )
 
 void GridFrame::OnEditorShown( wxGridEvent& ev )
 {
+
+    if ( (ev.GetCol() == 4) &&
+         (ev.GetRow() == 0) &&
+        (wxMessageBox(_T("Are you sure you wish to edit this cell"),
+                      _T("Checking"),wxYES_NO) == wxNO ) ) {
+
+        ev.Veto();
+        return;
+    }
+                     
+       
     wxLogMessage( wxT("Cell editor shown.") );
 
     ev.Skip();
@@ -815,6 +828,16 @@ void GridFrame::OnEditorShown( wxGridEvent& ev )
 
 void GridFrame::OnEditorHidden( wxGridEvent& ev )
 {
+   
+    if ( (ev.GetCol() == 4) &&
+         (ev.GetRow() == 0) &&
+        (wxMessageBox(_T("Are you sure you wish to finish editing this cell"),
+                      _T("Checking"),wxYES_NO) == wxNO ) ) {
+
+        ev.Veto();
+        return;
+    }
+
     wxLogMessage( wxT("Cell editor hidden.") );
 
     ev.Skip();
index 4581b3cf389e1b7afb635cbacfc4bc5f51db9383..dfb0cece64836c74e8da2a545587e75d17bc52cd 100644 (file)
@@ -5449,11 +5449,14 @@ bool wxGrid::DeleteCols( int pos, int numCols, bool WXUNUSED(updateLabels) )
 // Generate a grid event based on a mouse event and
 // return the result of ProcessEvent()
 //
-bool wxGrid::SendEvent( const wxEventType type,
+int wxGrid::SendEvent( const wxEventType type,
                         int row, int col,
                         wxMouseEvent& mouseEv )
 {
-    if ( type == wxEVT_GRID_ROW_SIZE || type == wxEVT_GRID_COL_SIZE )
+   bool claimed;
+   bool vetoed= false;
+       
+   if ( type == wxEVT_GRID_ROW_SIZE || type == wxEVT_GRID_COL_SIZE )
     {
         int rowOrCol = (row == -1 ? col : row);
 
@@ -5467,9 +5470,12 @@ bool wxGrid::SendEvent( const wxEventType type,
                                  mouseEv.ShiftDown(),
                                  mouseEv.AltDown(),
                                  mouseEv.MetaDown() );
-        return GetEventHandler()->ProcessEvent(gridEvt);
+    
+        claimed = GetEventHandler()->ProcessEvent(gridEvt);
+       vetoed = !gridEvt.IsAllowed();
+
     }
-    else if ( type == wxEVT_GRID_RANGE_SELECT )
+   else if ( type == wxEVT_GRID_RANGE_SELECT )
     {
         // Right now, it should _never_ end up here!
         wxGridRangeSelectEvent gridEvt( GetId(),
@@ -5483,9 +5489,11 @@ bool wxGrid::SendEvent( const wxEventType type,
                                         mouseEv.AltDown(),
                                         mouseEv.MetaDown() );
 
-        return GetEventHandler()->ProcessEvent(gridEvt);
+        claimed = GetEventHandler()->ProcessEvent(gridEvt);
+       vetoed = !gridEvt.IsAllowed();
+       
     }
-    else
+   else
     {
         wxGridEvent gridEvt( GetId(),
                              type,
@@ -5498,17 +5506,27 @@ bool wxGrid::SendEvent( const wxEventType type,
                              mouseEv.ShiftDown(),
                              mouseEv.AltDown(),
                              mouseEv.MetaDown() );
-        return GetEventHandler()->ProcessEvent(gridEvt);
+         claimed = GetEventHandler()->ProcessEvent(gridEvt);
+        vetoed = !gridEvt.IsAllowed();
     }
+  // A Veto'd event may not be `claimed' so test this first 
+  if (vetoed) return -1;
+  return claimed ? 1 : 0;
+
+    
 }
 
 
 // Generate a grid event of specified type and return the result
 // of ProcessEvent().
 //
-bool wxGrid::SendEvent( const wxEventType type,
+int wxGrid::SendEvent( const wxEventType type,
                         int row, int col )
 {
+   bool claimed;
+   bool vetoed= false;
+
     if ( type == wxEVT_GRID_ROW_SIZE || type == wxEVT_GRID_COL_SIZE )
     {
         int rowOrCol = (row == -1 ? col : row);
@@ -5518,7 +5536,8 @@ bool wxGrid::SendEvent( const wxEventType type,
                                  this,
                                  rowOrCol );
 
-        return GetEventHandler()->ProcessEvent(gridEvt);
+        claimed = GetEventHandler()->ProcessEvent(gridEvt);
+        vetoed  = !gridEvt.IsAllowed();
     }
     else
     {
@@ -5527,8 +5546,14 @@ bool wxGrid::SendEvent( const wxEventType type,
                              this,
                              row, col );
 
-        return GetEventHandler()->ProcessEvent(gridEvt);
-    }
+        claimed = GetEventHandler()->ProcessEvent(gridEvt);
+        vetoed  = !gridEvt.IsAllowed();
+     }
+
+       // A Veto'd event may not be `claimed' so test this first 
+       if (vetoed) return -1;
+       return claimed ? 1 : 0;
+
 }
 
 
@@ -6578,12 +6603,12 @@ void wxGrid::EnableCellEditControl( bool enable )
 
     if ( enable != m_cellEditCtrlEnabled )
     {
-        // TODO allow the app to Veto() this event?
-        SendEvent(enable ? wxEVT_GRID_EDITOR_SHOWN : wxEVT_GRID_EDITOR_HIDDEN);
-
         if ( enable )
         {
-            // this should be checked by the caller!
+           if (SendEvent( wxEVT_GRID_EDITOR_SHOWN) <0) 
+               return; 
+
+           // this should be checked by the caller!
             wxASSERT_MSG( CanEnableCellControl(),
                           _T("can't enable editing for this cell!") );
 
@@ -6594,7 +6619,10 @@ void wxGrid::EnableCellEditControl( bool enable )
         }
         else
         {
-            HideCellEditControl();
+           //FIXME:add veto support
+           SendEvent( wxEVT_GRID_EDITOR_HIDDEN);
+
+           HideCellEditControl();
             SaveEditControlValue();
 
             // do it after HideCellEditControl()
@@ -6740,6 +6768,8 @@ void wxGrid::SaveEditControlValue()
         int row = m_currentCellCoords.GetRow();
         int col = m_currentCellCoords.GetCol();
 
+        wxString oldval = GetCellValue(row,col);
+
         wxGridCellAttr* attr = GetCellAttr(row, col);
         wxGridCellEditor* editor = attr->GetEditor(this, row, col);
         bool changed = editor->EndEdit(row, col, this);
@@ -6749,9 +6779,13 @@ void wxGrid::SaveEditControlValue()
 
         if (changed)
         {
-            SendEvent( wxEVT_GRID_CELL_CHANGE,
+            if ( SendEvent( wxEVT_GRID_CELL_CHANGE,
                        m_currentCellCoords.GetRow(),
-                       m_currentCellCoords.GetCol() );
+                       m_currentCellCoords.GetCol() ) < 0 ) {
+
+                             //Event has been veto set the data back.
+                              SetCellValue(row,col,oldval);
+              }
         }
     }
 }