X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d0a84b63384ca1c1d8d20581fb56abbd1d826617..ce7208d49d5ce2ca1dc0b3b83f14f1d04f29c4bf:/src/common/bookctrl.cpp diff --git a/src/common/bookctrl.cpp b/src/common/bookctrl.cpp index a0c4781508..fef420180a 100644 --- a/src/common/bookctrl.cpp +++ b/src/common/bookctrl.cpp @@ -162,41 +162,61 @@ wxSize wxBookCtrlBase::DoGetBestSize() const } #if wxUSE_HELP + void wxBookCtrlBase::OnHelp(wxHelpEvent& event) { - // ignore the events not coming from the book control itself, otherwise we - // could attempt to redirect a help event generated by one of our pages - // back to the same page resulting in an infinite loop - if ( event.GetEventObject() != this ) + // determine where does this even originate from to avoid redirecting it + // back to the page which generated it (resulting in an infinite loop) + + // 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 != this && source->GetParent() != this ) { - event.Skip(); - return; + source = source->GetParent(); } - // find the corresponding page - wxWindow *page = NULL; - - if ( event.GetOrigin() == wxHelpEvent::Origin_HelpButton ) + if ( source && m_pages.Index(source) == wxNOT_FOUND ) { - // show help for the page under the mouse - const int pagePos = HitTest(ScreenToClient(event.GetPosition())); + // this event is for the book control itself, redirect it to the + // corresponding page + wxWindow *page = NULL; - if ( pagePos != wxNOT_FOUND) + if ( event.GetOrigin() == wxHelpEvent::Origin_HelpButton ) { - page = GetPage((size_t)pagePos); + // show help for the page under the mouse + const int pagePos = HitTest(ScreenToClient(event.GetPosition())); + + if ( pagePos != wxNOT_FOUND) + { + page = GetPage((size_t)pagePos); + } + } + else // event from keyboard or unknown source + { + // otherwise show the current page help + page = GetCurrentPage(); } - } - else // event.GetOrigin() != wxHelpEvent::Origin_HelpButton - { - // if event came from keyboard then show the current page help - page = GetCurrentPage(); - } - if ( !page || !page->GetEventHandler()->ProcessEvent(event) ) - { - event.Skip(); + if ( page ) + { + // 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 // ---------------------------------------------------------------------------- @@ -290,6 +310,8 @@ wxRect wxBookCtrlBase::GetPageRect() const case wxBK_BOTTOM: rectPage.height -= size.y + GetInternalBorder(); + if (rectPage.height < 0) + rectPage.height = 0; break; case wxBK_LEFT: @@ -298,6 +320,8 @@ wxRect wxBookCtrlBase::GetPageRect() const case wxBK_RIGHT: rectPage.width -= size.x + GetInternalBorder(); + if (rectPage.width < 0) + rectPage.width = 0; break; } @@ -399,4 +423,52 @@ wxSize wxBookCtrlBase::GetControllerSize() const return size; } +int wxBookCtrlBase::DoSetSelection(size_t n, int flags) +{ + wxCHECK_MSG( n < GetPageCount(), wxNOT_FOUND, + wxT("invalid page index in wxBookCtrlBase::DoSetSelection()") ); + + const int oldSel = GetSelection(); + + if ( n != (size_t)oldSel ) + { + wxBookCtrlBaseEvent *event = CreatePageChangingEvent(); + bool allowed = false; + + if ( flags & SetSelection_SendEvent ) + { + event->SetSelection(n); + event->SetOldSelection(oldSel); + event->SetEventObject(this); + + allowed = !GetEventHandler()->ProcessEvent(*event) || event->IsAllowed(); + } + + if ( !(flags & SetSelection_SendEvent) || allowed) + { + if ( oldSel != wxNOT_FOUND ) + m_pages[oldSel]->Hide(); + + wxWindow *page = m_pages[n]; + page->SetSize(GetPageRect()); + page->Show(); + + // change selection now to ignore the selection change event + UpdateSelectedPage(n); + + if ( flags & SetSelection_SendEvent ) + { + // program allows the page change + MakeChangedEvent(*event); + (void)GetEventHandler()->ProcessEvent(*event); + } + } + + delete event; + } + + return oldSel; +} + + #endif // wxUSE_BOOKCTRL