Merge branch 'find-dialog-parent'

Use correct parent for the generic "Find" dialog, even when it is not
shown yet.

See https://github.com/wxWidgets/wxWidgets/pull/2486
This commit is contained in:
Vadim Zeitlin
2021-08-24 17:04:29 +02:00
4 changed files with 51 additions and 16 deletions

View File

@@ -105,7 +105,10 @@ public:
// check whether it contains wxDIALOG_NO_PARENT bit.
//
// This function always returns a valid top level window or NULL.
wxWindow *GetParentForModalDialog(wxWindow *parent, long style) const;
wxWindow *GetParentForModalDialog(wxWindow *parent, long style) const
{
return DoGetParentForDialog(wxDIALOG_MODALITY_APP_MODAL, parent, style);
}
// This overload can only be used for already initialized windows, i.e. not
// from the ctor. It uses the current window parent and style.
@@ -114,6 +117,16 @@ public:
return GetParentForModalDialog(GetParent(), GetWindowStyle());
}
// This function is similar to GetParentForModalDialog() but should be used
// for modeless dialogs and skips the checks irrelevant for them (currently
// just the one checking that the candidate parent window is visible, as it
// is possible to create a modeless dialog before its parent is shown if it
// is only shown later, after showing the parent).
wxWindow *GetParentForModelessDialog(wxWindow *parent, long style) const
{
return DoGetParentForDialog(wxDIALOG_MODALITY_NONE, parent, style);
}
#if wxUSE_STATTEXT // && wxUSE_TEXTCTRL
// splits text up at newlines and places the lines into a vertical
// wxBoxSizer, with the given maximum width, lines will not be wrapped
@@ -243,9 +256,15 @@ protected:
static bool sm_layoutAdaptation;
private:
// helper of GetParentForModalDialog(): returns the passed in window if it
// can be used as our parent or NULL if it can't
wxWindow *CheckIfCanBeUsedAsParent(wxWindow *parent) const;
// Common implementation of GetParentFor{Modal,Modeless}Dialog().
wxWindow *DoGetParentForDialog(wxDialogModality modality,
wxWindow *parent,
long style) const;
// helper of DoGetParentForDialog(): returns the passed in window if it
// can be used as parent for this kind of dialog or NULL if it can't
wxWindow *CheckIfCanBeUsedAsParent(wxDialogModality modality,
wxWindow *parent) const;
// Helper of OnCharHook() and OnCloseWindow(): find the appropriate button
// for closing the dialog and send a click event for it.

View File

@@ -128,7 +128,9 @@ wxDialogBase::wxDialogBase()
SetExtraStyle(GetExtraStyle() | wxWS_EX_BLOCK_EVENTS);
}
wxWindow *wxDialogBase::CheckIfCanBeUsedAsParent(wxWindow *parent) const
wxWindow *
wxDialogBase::CheckIfCanBeUsedAsParent(wxDialogModality modality,
wxWindow *parent) const
{
if ( !parent )
return NULL;
@@ -148,11 +150,22 @@ wxWindow *wxDialogBase::CheckIfCanBeUsedAsParent(wxWindow *parent) const
return NULL;
}
// This check is done for modal dialogs only because modeless dialogs can
// be created before their parent is shown and only shown later.
switch ( modality )
{
case wxDIALOG_MODALITY_NONE:
break;
case wxDIALOG_MODALITY_APP_MODAL:
case wxDIALOG_MODALITY_WINDOW_MODAL:
if ( !parent->IsShownOnScreen() )
{
// using hidden parent won't work correctly neither
return NULL;
}
break;
}
if ( parent == this )
{
@@ -165,7 +178,9 @@ wxWindow *wxDialogBase::CheckIfCanBeUsedAsParent(wxWindow *parent) const
}
wxWindow *
wxDialogBase::GetParentForModalDialog(wxWindow *parent, long style) const
wxDialogBase::DoGetParentForDialog(wxDialogModality modality,
wxWindow *parent,
long style) const
{
// creating a parent-less modal dialog will result (under e.g. wxGTK2)
// in an unfocused dialog, so try to find a valid parent for it unless we
@@ -175,16 +190,16 @@ wxDialogBase::GetParentForModalDialog(wxWindow *parent, long style) const
// first try the given parent
if ( parent )
parent = CheckIfCanBeUsedAsParent(wxGetTopLevelParent(parent));
parent = CheckIfCanBeUsedAsParent(modality, wxGetTopLevelParent(parent));
// then the currently active window
if ( !parent )
parent = CheckIfCanBeUsedAsParent(
parent = CheckIfCanBeUsedAsParent(modality,
wxGetTopLevelParent(wxGetActiveWindow()));
// and finally the application main window
if ( !parent )
parent = CheckIfCanBeUsedAsParent(wxApp::GetMainTopWindow());
parent = CheckIfCanBeUsedAsParent(modality, wxApp::GetMainTopWindow());
return parent;
}

View File

@@ -84,13 +84,14 @@ void wxFindReplaceDialogBase::Send(wxFindDialogEvent& event)
}
}
if ( !GetEventHandler()->ProcessEvent(event) )
if ( !ProcessWindowEvent(event) )
{
// the event is not propagated upwards to the parent automatically
// because the dialog is a top level window, so do it manually as
// in 9 cases of 10 the message must be processed by the dialog
// in 9 cases out of 10 the message must be processed by the dialog
// owner and not the dialog itself
(void)GetParent()->GetEventHandler()->ProcessEvent(event);
if ( GetParent() )
(void)GetParent()->ProcessWindowEvent(event);
}
}

View File

@@ -83,7 +83,7 @@ bool wxGenericFindReplaceDialog::Create(wxWindow *parent,
const wxString& title,
int style)
{
parent = GetParentForModalDialog(parent, style);
parent = GetParentForModelessDialog(parent, style);
if ( !wxDialog::Create(parent, wxID_ANY, title,
wxDefaultPosition, wxDefaultSize,