Ignore focus events within composite editor control in wxDataViewRenderer

Internal focused state and focused events of the subcontrols of the composite editor control should not be taken into account.

Closes #18394.
This commit is contained in:
Artur Wieczorek
2019-11-07 22:30:07 +01:00
parent 6b00cc80f1
commit ab86e28484

View File

@@ -62,6 +62,8 @@ protected:
void OnIdle( wxIdleEvent &event );
private:
bool IsEditorSubControl(wxWindow* win) const;
wxDataViewRenderer *m_owner;
wxWindow *m_editorCtrl;
bool m_finished;
@@ -1113,8 +1115,13 @@ void wxDataViewEditorCtrlEvtHandler::OnIdle( wxIdleEvent &event )
if (m_focusOnIdle)
{
m_focusOnIdle = false;
if (wxWindow::FindFocus() != m_editorCtrl)
// Ignore focused items within the compound editor control
wxWindow* win = wxWindow::FindFocus();
if ( !IsEditorSubControl(win) )
{
m_editorCtrl->SetFocus();
}
}
event.Skip();
@@ -1151,6 +1158,14 @@ void wxDataViewEditorCtrlEvtHandler::OnChar( wxKeyEvent &event )
void wxDataViewEditorCtrlEvtHandler::OnKillFocus( wxFocusEvent &event )
{
// Ignore focus changes within the compound editor control
wxWindow* win = event.GetWindow();
if ( IsEditorSubControl(win) )
{
event.Skip();
return;
}
if (!m_finished)
{
m_finished = true;
@@ -1160,6 +1175,23 @@ void wxDataViewEditorCtrlEvtHandler::OnKillFocus( wxFocusEvent &event )
event.Skip();
}
bool wxDataViewEditorCtrlEvtHandler::IsEditorSubControl(wxWindow* win) const
{
// Checks whether the given window belongs to the editor control
// (is either the editor itself or a child of the compound editor).
while ( win )
{
if ( win == m_editorCtrl )
{
return true;
}
win = win->GetParent();
}
return false;
}
// ---------------------------------------------------------
// wxDataViewColumnBase
// ---------------------------------------------------------