X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9cf0f6ae4f20919ec35834109914f825f10a4363..841f23e18a9d9e3d987b60422c3a220571868337:/src/generic/treebkg.cpp diff --git a/src/generic/treebkg.cpp b/src/generic/treebkg.cpp index 32e8250290..fcf10b9d35 100644 --- a/src/generic/treebkg.cpp +++ b/src/generic/treebkg.cpp @@ -27,8 +27,12 @@ #if wxUSE_TREEBOOK #include "wx/treebook.h" + +#ifndef WX_PRECOMP + #include "wx/settings.h" +#endif + #include "wx/imaglist.h" -#include "wx/settings.h" // ---------------------------------------------------------------------------- // various wxWidgets macros @@ -100,11 +104,14 @@ wxTreebook::Create(wxWindow *parent, wxID_TREEBOOKTREEVIEW, wxDefaultPosition, wxDefaultSize, - wxBORDER_SIMPLE | +#ifndef __WXMSW__ + wxBORDER_SIMPLE | // On wxMSW this produces a black border which is wrong +#endif wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT | wxTR_SINGLE ); + GetTreeCtrl()->SetQuickBestSize(false); // do full size calculation GetTreeCtrl()->AddRoot(wxEmptyString); // label doesn't matter, it's hidden #ifdef __WXMSW__ @@ -203,8 +210,6 @@ bool wxTreebook::DoInsertPage(size_t pagePos, DoUpdateSelection(bSelect, pagePos); - m_bookctrl->InvalidateBestSize(); - return true; } @@ -246,6 +251,8 @@ bool wxTreebook::DoInsertSubPage(size_t pagePos, wxTreeItemId newId = tree->AppendItem(parentId, text, imageId); + tree->InvalidateBestSize(); + if ( !newId.IsOk() ) { (void)wxBookCtrlBase::DoRemovePage(newPos); @@ -258,8 +265,6 @@ bool wxTreebook::DoInsertSubPage(size_t pagePos, DoUpdateSelection(bSelect, newPos); - m_bookctrl->InvalidateBestSize(); - return true; } @@ -308,7 +313,6 @@ wxTreebookPage *wxTreebook::DoRemovePage(size_t pagePos) tree->DeleteChildren( pageId ); tree->Delete( pageId ); - tree->InvalidateBestSize(); return oldPage; } @@ -614,25 +618,22 @@ int wxTreebook::DoSetSelection(size_t pagePos) // find the next page suitable to be shown: the first (grand)child // of this one with a non-NULL associated page wxTreeItemId childId = m_treeIds[pagePos]; - m_actualSelection = pagePos; + int actualPagePos = pagePos; while ( !page && childId.IsOk() ) { wxTreeItemIdValue cookie; childId = tree->GetFirstChild( childId, cookie ); if ( childId.IsOk() ) { - page = wxBookCtrlBase::GetPage(++m_actualSelection); + page = wxBookCtrlBase::GetPage(++actualPagePos); } } - wxASSERT_MSG( page, wxT("no page to show found!") ); + m_actualSelection = page ? actualPagePos : m_selection; } if ( page ) - { - page->SetSize(GetPageRect()); page->Show(); - } tree->SelectItem(DoInternalGetPage(pagePos)); @@ -649,6 +650,20 @@ int wxTreebook::DoSetSelection(size_t pagePos) return oldSel; } +wxTreebookPage *wxTreebook::DoGetCurrentPage() const +{ + if ( m_selection == wxNOT_FOUND ) + return NULL; + + wxTreebookPage *page = wxBookCtrlBase::GetPage(m_selection); + if ( !page && m_actualSelection != wxNOT_FOUND ) + { + page = wxBookCtrlBase::GetPage(m_actualSelection); + } + + return page; +} + void wxTreebook::SetImageList(wxImageList *imageList) { wxBookCtrlBase::SetImageList(imageList); @@ -708,18 +723,49 @@ void wxTreebook::OnTreeNodeExpandedCollapsed(wxTreeEvent & event) // wxTreebook geometry management // ---------------------------------------------------------------------------- -wxTreebookPage * wxTreebook::DoGetCurrentPage() const +int wxTreebook::HitTest(wxPoint const & pt, long * flags) const { - if ( m_selection == wxNOT_FOUND ) - return NULL; + int pagePos = wxNOT_FOUND; - wxTreebookPage *page = wxBookCtrlBase::GetPage(m_selection); - if ( !page && m_actualSelection != wxNOT_FOUND ) + if ( flags ) + *flags = wxNB_HITTEST_NOWHERE; + + // convert from wxTreebook coorindates to wxTreeCtrl ones + const wxTreeCtrl * const tree = GetTreeCtrl(); + const wxPoint treePt = tree->ScreenToClient(ClientToScreen(pt)); + + // is it over the tree? + if ( wxRect(tree->GetSize()).Inside(treePt) ) { - page = wxBookCtrlBase::GetPage(m_actualSelection); + int flagsTree; + wxTreeItemId id = tree->HitTest(treePt, flagsTree); + + if ( id.IsOk() && (flagsTree & wxTREE_HITTEST_ONITEM) ) + { + pagePos = DoInternalFindPageById(id); + } + + if ( flags ) + { + if ( pagePos != wxNOT_FOUND ) + *flags = 0; + + if ( flagsTree & (wxTREE_HITTEST_ONITEMBUTTON | + wxTREE_HITTEST_ONITEMICON | + wxTREE_HITTEST_ONITEMSTATEICON) ) + *flags |= wxNB_HITTEST_ONICON; + + if ( flagsTree & wxTREE_HITTEST_ONITEMLABEL ) + *flags |= wxNB_HITTEST_ONLABEL; + } + } + else // not over the tree + { + if ( flags && GetPageRect().Inside( pt ) ) + *flags |= wxNB_HITTEST_ONPAGE; } - return page; + return pagePos; } #endif // wxUSE_TREEBOOK