From: Vadim Zeitlin Date: Fri, 2 Nov 2001 17:44:55 +0000 (+0000) Subject: support for vetoing grid cell editing (patch 469049) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/fe7b9ed6fdffb7dd72c9d7d4a1070e433189954f support for vetoing grid cell editing (patch 469049) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12270 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/changes.txt b/docs/changes.txt index 41eb52d4e7..27731995c3 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -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: diff --git a/include/wx/generic/grid.h b/include/wx/generic/grid.h index b0a62e87d7..7b929ad6b8 100644 --- a/include/wx/generic/grid.h +++ b/include/wx/generic/grid.h @@ -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(), diff --git a/samples/newgrid/griddemo.cpp b/samples/newgrid/griddemo.cpp index aaf3bebcd5..e78e342be9 100644 --- a/samples/newgrid/griddemo.cpp +++ b/samples/newgrid/griddemo.cpp @@ -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(); diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 4581b3cf38..dfb0cece64 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -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); + } } } }