wxTreebookPage *wxTreebook::DoRemovePage(size_t pagePos) { wxTreeItemId pageId = DoInternalGetPage(pagePos); wxCHECK_MSG( pageId.IsOk(), NULL, wxT("Invalid tree index") ); wxTreebookPage * oldPage = GetPage(pagePos); wxTreeCtrl *tree = GetTreeCtrl(); size_t subCount = tree->GetChildrenCount(pageId, true); wxASSERT_MSG ( IS_VALID_PAGE(pagePos + subCount), wxT("Internal error in wxTreebook::DoRemovePage") ); // here we are going to delete ALL the pages in the range // [pagePos, pagePos + subCount] -- the page and its children // deleting all the pages from the base class for ( size_t i = 0; i <= subCount; ++i ) { wxTreebookPage *page = wxBookCtrlBase::DoRemovePage(pagePos); // don't delete the page itself though -- it will be deleted in // DeletePage() when we return if ( i ) { delete page; } } DoInternalRemovePageRange(pagePos, subCount); tree->DeleteChildren( pageId ); tree->Delete( pageId ); return oldPage; }
bool wxTreebook::DoInsertSubPage(size_t pagePos, wxTreebookPage *page, const wxString& text, bool bSelect, int imageId) { wxTreeItemId parentId = DoInternalGetPage(pagePos); wxCHECK_MSG( parentId.IsOk(), false, wxT("invalid tree item") ); wxTreeCtrl *tree = GetTreeCtrl(); size_t newPos = pagePos + tree->GetChildrenCount(parentId, true) + 1; wxASSERT_MSG( newPos <= DoInternalGetPageCount(), wxT("Internal error in tree insert point calculation") ); if ( !wxBookCtrlBase::InsertPage(newPos, page, text, bSelect, imageId) ) return false; wxTreeItemId newId = tree->AppendItem(parentId, text, imageId); if ( !newId.IsOk() ) { (void)wxBookCtrlBase::DoRemovePage(newPos); wxFAIL_MSG( wxT("Failed to insert treebook page") ); return false; } DoInternalAddPage(newPos, page, newId); DoUpdateSelection(bSelect, newPos); return true; }
int wxTreebook::GetPageImage(size_t n) const { wxTreeItemId pageId = DoInternalGetPage(n); wxCHECK_MSG( pageId.IsOk(), wxNOT_FOUND, wxT("invalid tree item") ); return GetTreeCtrl()->GetItemImage(pageId); }
wxString wxTreebook::GetPageText(size_t n) const { wxTreeItemId pageId = DoInternalGetPage(n); wxCHECK_MSG( pageId.IsOk(), wxString(), wxT("invalid tree item") ); return GetTreeCtrl()->GetItemText(pageId); }
bool wxTreebook::IsNodeExpanded(size_t pagePos) const { wxTreeItemId pageId = DoInternalGetPage(pagePos); wxCHECK_MSG( pageId.IsOk(), false, wxT("invalid tree item") ); return GetTreeCtrl()->IsExpanded(pageId); }
int wxTreebook::GetPageParent(size_t pagePos) const { wxTreeItemId nodeId = DoInternalGetPage( pagePos ); wxCHECK_MSG( nodeId.IsOk(), wxNOT_FOUND, wxT("Invalid page index spacified!") ); const wxTreeItemId parent = GetTreeCtrl()->GetItemParent( nodeId ); return parent.IsOk() ? DoInternalFindPageById(parent) : wxNOT_FOUND; }
bool wxTreebook::SetPageImage(size_t n, int imageId) { wxTreeItemId pageId = DoInternalGetPage(n); wxCHECK_MSG( pageId.IsOk(), false, wxT("invalid tree item") ); GetTreeCtrl()->SetItemImage(pageId, imageId); return true; }
bool wxTreebook::SetPageText(size_t n, const wxString& strText) { wxTreeItemId pageId = DoInternalGetPage(n); wxCHECK_MSG( pageId.IsOk(), false, wxT("invalid tree item") ); GetTreeCtrl()->SetItemText(pageId, strText); return true; }
wxTreebookPage *wxTreebook::DoRemovePage(size_t pagePos) { wxTreeItemId pageId = DoInternalGetPage(pagePos); wxCHECK_MSG( pageId.IsOk(), NULL, wxT("Invalid tree index") ); wxTreebookPage * oldPage = GetPage(pagePos); wxTreeCtrl *tree = GetTreeCtrl(); size_t subCount = tree->GetChildrenCount(pageId, true); wxASSERT_MSG ( IS_VALID_PAGE(pagePos + subCount), wxT("Internal error in wxTreebook::DoRemovePage") ); // here we are going to delete ALL the pages in the range // [pagePos, pagePos + subCount] -- the page and its children // deleting all the pages from the base class #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 ( size_t i = 0; i <= subCount; ++i ) { wxTreebookPage *page = wxBookCtrlBase::DoRemovePage(pagePos); // don't delete the page itself though -- it will be deleted in // DeletePage() when we return if ( i ) { delete page; } } DoInternalRemovePageRange(pagePos, subCount); tree->DeleteChildren( pageId ); tree->Delete( pageId ); return oldPage; }
bool wxTreebook::ExpandNode(size_t pagePos, bool expand) { wxTreeItemId pageId = DoInternalGetPage(pagePos); wxCHECK_MSG( pageId.IsOk(), false, wxT("invalid tree item") ); if ( expand ) { GetTreeCtrl()->Expand( pageId ); } else // collapse { GetTreeCtrl()->Collapse( pageId ); // rely on the events generated by wxTreeCtrl to update selection } return true; }
int wxTreebook::DoSetSelection(size_t pagePos, int flags) { wxCHECK_MSG( IS_VALID_PAGE(pagePos), wxNOT_FOUND, wxT("invalid page index in wxListbook::DoSetSelection()") ); wxASSERT_MSG( GetPageCount() == DoInternalGetPageCount(), wxT("wxTreebook logic error: m_treeIds and m_pages not in sync!")); wxBookCtrlEvent event(wxEVT_COMMAND_TREEBOOK_PAGE_CHANGING, m_windowId); const int oldSel = m_selection; wxTreeCtrl *tree = GetTreeCtrl(); bool allowed = false; if (flags & SetSelection_SendEvent) { event.SetEventObject(this); event.SetSelection(pagePos); event.SetOldSelection(m_selection); // don't send the event if the old and new pages are the same; do send it // otherwise and be prepared for it to be vetoed allowed = (int)pagePos == m_selection || !GetEventHandler()->ProcessEvent(event) || event.IsAllowed(); } if ( !(flags & SetSelection_SendEvent) || allowed ) { // hide the previously shown page wxTreebookPage * const oldPage = DoGetCurrentPage(); if ( oldPage ) oldPage->Hide(); // then show the new one m_selection = pagePos; wxTreebookPage *page = wxBookCtrlBase::GetPage(m_selection); if ( !page ) { // 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]; int actualPagePos = pagePos; while ( !page && childId.IsOk() ) { wxTreeItemIdValue cookie; childId = tree->GetFirstChild( childId, cookie ); if ( childId.IsOk() ) { page = wxBookCtrlBase::GetPage(++actualPagePos); } } m_actualSelection = page ? actualPagePos : m_selection; } if ( page ) page->Show(); tree->SelectItem(DoInternalGetPage(pagePos)); if (flags & SetSelection_SendEvent) { // notify about the (now completed) page change event.SetEventType(wxEVT_COMMAND_TREEBOOK_PAGE_CHANGED); (void)GetEventHandler()->ProcessEvent(event); } } else if ( (flags & SetSelection_SendEvent) && !allowed) // page change vetoed { // tree selection might have already had changed if ( oldSel != wxNOT_FOUND ) tree->SelectItem(DoInternalGetPage(oldSel)); } return oldSel; }
void wxTreebook::UpdateSelectedPage(size_t newsel) { GetTreeCtrl()->SelectItem(DoInternalGetPage(newsel)); }