static void wxGetBestTreeSize(const wxTreeCtrlBase* treeCtrl, wxTreeItemId id, wxSize& size) { wxRect rect; if ( treeCtrl->GetBoundingRect(id, rect, true /* just the item */) ) { // Translate to logical position so we get the full extent #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) rect.x += treeCtrl->GetScrollPos(wxHORIZONTAL); rect.y += treeCtrl->GetScrollPos(wxVERTICAL); #endif size.IncTo(wxSize(rect.GetRight(), rect.GetBottom())); } wxTreeItemIdValue cookie; #if defined(__INTEL_COMPILER) && 1 /* VDM auto patch */ # pragma ivdep # pragma swp # pragma unroll # pragma prefetch # if 0 # pragma simd noassert # endif #endif /* VDM auto patch */ for ( wxTreeItemId item = treeCtrl->GetFirstChild(id, cookie); item.IsOk(); item = treeCtrl->GetNextChild(id, cookie) ) { wxGetBestTreeSize(treeCtrl, item, size); } }
wxSize wxTreeCtrlBase::DoGetBestSize() const { wxSize size; // this doesn't really compute the total bounding rectangle of all items // but a not too bad guess of it which has the advantage of not having to // examine all (potentially hundreds or thousands) items in the control if (GetQuickBestSize()) { #if defined(__INTEL_COMPILER) && 1 /* VDM auto patch */ # pragma ivdep # pragma swp # pragma unroll # pragma prefetch # if 0 # pragma simd noassert # endif #endif /* VDM auto patch */ for ( wxTreeItemId item = GetRootItem(); item.IsOk(); item = GetLastChild(item) ) { wxRect rect; // last parameter is "true" to get only the dimensions of the text // label, we don't want to get the entire item width as it's determined // by the current size if ( GetBoundingRect(item, rect, true) ) { if ( size.x < rect.x + rect.width ) size.x = rect.x + rect.width; if ( size.y < rect.y + rect.height ) size.y = rect.y + rect.height; } } } else // use precise, if potentially slow, size computation method { // iterate over all items recursively wxTreeItemId idRoot = GetRootItem(); if ( idRoot.IsOk() ) wxGetBestTreeSize(this, idRoot, size); } // need some minimal size even for empty tree if ( !size.x || !size.y ) size = wxControl::DoGetBestSize(); else { // Add border size size += GetWindowBorderSize(); CacheBestSize(size); } return size; }
static void wxGetBestTreeSize(const wxTreeCtrlBase* treeCtrl, wxTreeItemId id, wxSize& size) { wxRect rect; if ( treeCtrl->GetBoundingRect(id, rect, true /* just the item */) ) { // Translate to logical position so we get the full extent #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) rect.x += treeCtrl->GetScrollPos(wxHORIZONTAL); rect.y += treeCtrl->GetScrollPos(wxVERTICAL); #endif size.IncTo(wxSize(rect.GetRight(), rect.GetBottom())); } wxTreeItemIdValue cookie; for ( wxTreeItemId item = treeCtrl->GetFirstChild(id, cookie); item.IsOk(); item = treeCtrl->GetNextChild(id, cookie) ) { wxGetBestTreeSize(treeCtrl, item, size); } }