more fixes to OnHelp() to avoid infinite recursion when handling help events
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39729 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -162,18 +162,25 @@ wxSize wxBookCtrlBase::DoGetBestSize() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if wxUSE_HELP
|
#if wxUSE_HELP
|
||||||
|
|
||||||
void wxBookCtrlBase::OnHelp(wxHelpEvent& event)
|
void wxBookCtrlBase::OnHelp(wxHelpEvent& event)
|
||||||
{
|
{
|
||||||
// ignore the events not coming from the book control itself, otherwise we
|
// determine where does this even originate from to avoid redirecting it
|
||||||
// could attempt to redirect a help event generated by one of our pages
|
// back to the page which generated it (resulting in an infinite loop)
|
||||||
// back to the same page resulting in an infinite loop
|
|
||||||
if ( event.GetEventObject() != this )
|
// notice that we have to check in the hard(er) way instead of just testing
|
||||||
|
// if the event object == this because the book control can have other
|
||||||
|
// subcontrols inside it (e.g. wxSpinButton in case of a notebook in wxUniv)
|
||||||
|
wxWindow *source = wxStaticCast(event.GetEventObject(), wxWindow);
|
||||||
|
while ( source && source->GetParent() != this )
|
||||||
{
|
{
|
||||||
event.Skip();
|
source = source->GetParent();
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// find the corresponding page
|
if ( source && m_pages.Index(source) == wxNOT_FOUND )
|
||||||
|
{
|
||||||
|
// this event is for the book control itself, redirect it to the
|
||||||
|
// corresponding page
|
||||||
wxWindow *page = NULL;
|
wxWindow *page = NULL;
|
||||||
|
|
||||||
if ( event.GetOrigin() == wxHelpEvent::Origin_HelpButton )
|
if ( event.GetOrigin() == wxHelpEvent::Origin_HelpButton )
|
||||||
@@ -186,17 +193,30 @@ void wxBookCtrlBase::OnHelp(wxHelpEvent& event)
|
|||||||
page = GetPage((size_t)pagePos);
|
page = GetPage((size_t)pagePos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // event.GetOrigin() != wxHelpEvent::Origin_HelpButton
|
else // event from keyboard or unknown source
|
||||||
{
|
{
|
||||||
// if event came from keyboard then show the current page help
|
// otherwise show the current page help
|
||||||
page = GetCurrentPage();
|
page = GetCurrentPage();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !page || !page->GetEventHandler()->ProcessEvent(event) )
|
if ( page )
|
||||||
{
|
{
|
||||||
event.Skip();
|
// change event object to the page to avoid infinite recursion if
|
||||||
|
// we get this event ourselves if the page doesn't handle it
|
||||||
|
event.SetEventObject(page);
|
||||||
|
|
||||||
|
if ( page->GetEventHandler()->ProcessEvent(event) )
|
||||||
|
{
|
||||||
|
// don't call event.Skip()
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//else: event coming from one of our pages already
|
||||||
|
|
||||||
|
event.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // wxUSE_HELP
|
#endif // wxUSE_HELP
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user