X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c482b99ec93fc52a1a10507d4b338ac217a28364..cda66071f17f062779a7009065e5ff7dd958440b:/src/univ/notebook.cpp?ds=sidebyside diff --git a/src/univ/notebook.cpp b/src/univ/notebook.cpp index 39bf56b228..5865b1baf4 100644 --- a/src/univ/notebook.cpp +++ b/src/univ/notebook.cpp @@ -212,6 +212,17 @@ int wxNotebook::SetSelection(int nPage) return m_sel; } + // event handling + wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId); + event.SetSelection(nPage); + event.SetOldSelection(m_sel); + event.SetEventObject(this); + if ( GetEventHandler()->ProcessEvent(event) && !event.IsAllowed() ) + { + // program doesn't allow the page change + return m_sel; + } + // we need to change m_sel first, before calling RefreshTab() below as // otherwise the previously selected tab wouldn't be redrawn properly under // wxGTK which calls Refresh() immediately and not during the next event @@ -255,33 +266,11 @@ int wxNotebook::SetSelection(int nPage) m_pages[m_sel]->Show(); } - return m_sel; -} - -void wxNotebook::ChangePage(int nPage) -{ - wxCHECK_RET( IS_VALID_PAGE(nPage), _T("invalid notebook page") ); - - if ( (size_t)nPage == m_sel ) - { - // nothing to do - return; - } - - wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId); - event.SetSelection(nPage); - event.SetOldSelection(m_sel); - event.SetEventObject(this); - if ( GetEventHandler()->ProcessEvent(event) && !event.IsAllowed() ) - { - // program doesn't allow the page change - return; - } - - SetSelection(nPage); - + // event handling event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED); GetEventHandler()->ProcessEvent(event); + + return selOld; } // ---------------------------------------------------------------------------- @@ -330,6 +319,7 @@ bool wxNotebook::InsertPage(int nPage, bSelect = TRUE; Relayout(); + Refresh(); } else // not the first tab { @@ -518,10 +508,20 @@ void wxNotebook::DoDraw(wxControlRenderer *renderer) wxSize sizeSpinBtn = m_spinbtn->GetSize(); if ( IsVertical() ) + { rectTabs.height -= sizeSpinBtn.y; + + // Allow for erasing the line under selected tab + rectTabs.width += 2; + } else + { rectTabs.width -= sizeSpinBtn.x; + // Allow for erasing the line under selected tab + rectTabs.height += 2; + } + dc.SetClippingRegion(rectTabs); } @@ -566,14 +566,19 @@ void wxNotebook::DoDraw(wxControlRenderer *renderer) { DoDrawTab(dc, rectSel, m_sel); } + + dc.DestroyClippingRegion(); } // ---------------------------------------------------------------------------- // wxNotebook geometry // ---------------------------------------------------------------------------- -int wxNotebook::HitTest(const wxPoint& pt) const +int wxNotebook::HitTest(const wxPoint& pt, long *flags) const { + if ( flags ) + *flags = wxNB_HITTEST_NOWHERE; + // first check that it is in this window at all if ( !GetClientRect().Inside(pt) ) { @@ -614,7 +619,15 @@ int wxNotebook::HitTest(const wxPoint& pt) const GetTabSize(n, &rectTabs.width, &rectTabs.height); if ( rectTabs.Inside(pt) ) + { + if ( flags ) + { + // TODO: be more precise + *flags = wxNB_HITTEST_ONITEM; + } + return n; + } // move the rectTabs to the next tab if ( IsVertical() ) @@ -949,7 +962,7 @@ void wxNotebook::SetPageSize(const wxSize& size) SetClientSize(GetSizeForPage(size)); } -wxSize wxNotebook::CalcSizeFromPage(const wxSize& sizePage) +wxSize wxNotebook::CalcSizeFromPage(const wxSize& sizePage) const { return AdjustSize(GetSizeForPage(sizePage)); } @@ -1279,11 +1292,11 @@ bool wxNotebook::PerformAction(const wxControlAction& action, const wxString& strArg) { if ( action == wxACTION_NOTEBOOK_NEXT ) - ChangePage(GetNextPage(TRUE)); + SetSelection(GetNextPage(TRUE)); else if ( action == wxACTION_NOTEBOOK_PREV ) - ChangePage(GetNextPage(FALSE)); + SetSelection(GetNextPage(FALSE)); else if ( action == wxACTION_NOTEBOOK_GOTO ) - ChangePage((int)numArg); + SetSelection((int)numArg); else return wxControl::PerformAction(action, numArg, strArg);