Add DoHideCellEditControl() for symmetry

This also allows to reset m_cellEditCtrlEnabled earlier, as we don't
have to keep it true for the duration of HideCellEditControl()
execution.

No real changes, as with the previous commit, this one is best viewed
ignoring whitespace changes.
This commit is contained in:
Vadim Zeitlin 2020-06-28 00:40:09 +02:00
parent c73634c520
commit 2d9112bd9b
2 changed files with 46 additions and 42 deletions

View File

@ -2908,11 +2908,12 @@ private:
); );
} }
// Show the cell editor for the current cell unconditionally. // Show/hide the cell editor for the current cell unconditionally.
void DoShowCellEditControl(); void DoShowCellEditControl();
void DoHideCellEditControl();
// Accept the changes in the edit control, i.e. save them to the table and // Accept the changes in the edit control, i.e. save them to the table and
// dismiss the editor. // dismiss the editor. Also reset m_cellEditCtrlEnabled.
void DoAcceptCellEditControl(); void DoAcceptCellEditControl();
// As above, but do nothing if the control is not currently shown. // As above, but do nothing if the control is not currently shown.

View File

@ -7344,49 +7344,54 @@ void wxGrid::HideCellEditControl()
{ {
if ( IsCellEditControlEnabled() ) if ( IsCellEditControlEnabled() )
{ {
wxGridCellEditorPtr editor = GetCurrentCellEditorPtr(); DoHideCellEditControl();
const bool editorHadFocus = editor->GetWindow()->IsDescendant(FindFocus()); }
}
if ( editor->GetWindow()->GetParent() != m_gridWin ) void wxGrid::DoHideCellEditControl()
editor->GetWindow()->Reparent(m_gridWin); {
wxGridCellEditorPtr editor = GetCurrentCellEditorPtr();
const bool editorHadFocus = editor->GetWindow()->IsDescendant(FindFocus());
editor->Show( false ); if ( editor->GetWindow()->GetParent() != m_gridWin )
editor->GetWindow()->Reparent(m_gridWin);
wxGridWindow *gridWindow = CellToGridWindow(m_currentCellCoords); editor->Show( false );
// return the focus to the grid itself if the editor had it
//
// note that we must not do this unconditionally to avoid stealing
// focus from the window which just received it if we are hiding the
// editor precisely because we lost focus
if ( editorHadFocus )
gridWindow->SetFocus();
// refresh whole row to the right wxGridWindow *gridWindow = CellToGridWindow(m_currentCellCoords);
wxRect rect( CellToRect(m_currentCellCoords) ); // return the focus to the grid itself if the editor had it
rect.Offset( -GetGridWindowOffset(gridWindow) ); //
CalcGridWindowScrolledPosition(rect.x, rect.y, &rect.x, &rect.y, gridWindow); // note that we must not do this unconditionally to avoid stealing
rect.width = gridWindow->GetClientSize().GetWidth() - rect.x; // focus from the window which just received it if we are hiding the
// editor precisely because we lost focus
if ( editorHadFocus )
gridWindow->SetFocus();
// refresh whole row to the right
wxRect rect( CellToRect(m_currentCellCoords) );
rect.Offset( -GetGridWindowOffset(gridWindow) );
CalcGridWindowScrolledPosition(rect.x, rect.y, &rect.x, &rect.y, gridWindow);
rect.width = gridWindow->GetClientSize().GetWidth() - rect.x;
#ifdef __WXMAC__ #ifdef __WXMAC__
// ensure that the pixels under the focus ring get refreshed as well // ensure that the pixels under the focus ring get refreshed as well
rect.Inflate(10, 10); rect.Inflate(10, 10);
#endif #endif
gridWindow->Refresh( false, &rect ); gridWindow->Refresh( false, &rect );
// refresh also the grid to the right // refresh also the grid to the right
wxGridWindow *rightGridWindow = NULL; wxGridWindow *rightGridWindow = NULL;
if ( gridWindow->GetType() == wxGridWindow::wxGridWindowFrozenCorner ) if ( gridWindow->GetType() == wxGridWindow::wxGridWindowFrozenCorner )
rightGridWindow = m_frozenRowGridWin; rightGridWindow = m_frozenRowGridWin;
else if ( gridWindow->GetType() == wxGridWindow::wxGridWindowFrozenCol ) else if ( gridWindow->GetType() == wxGridWindow::wxGridWindowFrozenCol )
rightGridWindow = m_gridWin; rightGridWindow = m_gridWin;
if ( rightGridWindow ) if ( rightGridWindow )
{ {
rect.x = 0; rect.x = 0;
rect.width = rightGridWindow->GetClientSize().GetWidth(); rect.width = rightGridWindow->GetClientSize().GetWidth();
rightGridWindow->Refresh( false, &rect ); rightGridWindow->Refresh( false, &rect );
}
} }
} }
@ -7400,15 +7405,13 @@ void wxGrid::AcceptCellEditControlIfShown()
void wxGrid::DoAcceptCellEditControl() void wxGrid::DoAcceptCellEditControl()
{ {
HideCellEditControl(); // Reset it first to avoid any problems with recursion via
// DisableCellEditControl() if it's called from the user-defined event
// do it after HideCellEditControl() but before invoking // handlers.
// user-defined handlers invoked by DoSaveEditControlValue() to
// ensure that we don't enter infinite loop if any of them try to
// disable the edit control again by calling DisableCellEditControl()
// from which we can be called
m_cellEditCtrlEnabled = false; m_cellEditCtrlEnabled = false;
DoHideCellEditControl();
DoSaveEditControlValue(); DoSaveEditControlValue();
} }