void wxTreebook::DoInternalRemovePageRange(size_t pagePos, size_t subCount) { // Attention: this function is only for a situation when we delete a node // with all its children so pagePos is the node's index and subCount is the // node children count wxASSERT_MSG( pagePos + subCount < m_treeIds.size(), wxT("Invalid page index") ); wxTreeItemId pageId = m_treeIds[pagePos]; wxVector<wxTreeItemId>::iterator itPos = m_treeIds.begin() + pagePos; m_treeIds.erase(itPos, itPos + subCount + 1); if ( m_selection != wxNOT_FOUND ) { if ( (size_t)m_selection > pagePos + subCount) { // selection is far after the deleted page, so just update the index and move on m_selection -= 1 + subCount; } else if ( (size_t)m_selection >= pagePos ) { wxTreeCtrl *tree = GetTreeCtrl(); // as selected page is going to be deleted, try to select the next // sibling if exists, if not then the parent wxTreeItemId nodeId = tree->GetNextSibling(pageId); m_selection = wxNOT_FOUND; if ( nodeId.IsOk() ) { // selecting next siblings tree->SelectItem(nodeId); } else // no next sibling, select the parent { wxTreeItemId parentId = tree->GetItemParent(pageId); if ( parentId.IsOk() && parentId != tree->GetRootItem() ) { tree->SelectItem(parentId); } else // parent is root { // we can't select it as it's hidden DoUpdateSelection(false, wxNOT_FOUND); } } } //else: nothing to do -- selection is before the deleted node } else { DoUpdateSelection(false, wxNOT_FOUND); } }
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; }
bool wxTreebook::DoInsertPage(size_t pagePos, wxWindow *page, const wxString& text, bool bSelect, int imageId) { wxCHECK_MSG( pagePos <= DoInternalGetPageCount(), false, wxT("Invalid treebook page position") ); if ( !wxBookCtrlBase::InsertPage(pagePos, page, text, bSelect, imageId) ) return false; wxTreeCtrl *tree = GetTreeCtrl(); wxTreeItemId newId; if ( pagePos == DoInternalGetPageCount() ) { // append the page to the end wxTreeItemId rootId = tree->GetRootItem(); newId = tree->AppendItem(rootId, text, imageId); } else // insert the new page before the given one { wxTreeItemId nodeId = m_treeIds[pagePos]; wxTreeItemId previousId = tree->GetPrevSibling(nodeId); wxTreeItemId parentId = tree->GetItemParent(nodeId); if ( previousId.IsOk() ) { // insert before the sibling - previousId newId = tree->InsertItem(parentId, previousId, text, imageId); } else // no prev siblings -- insert as a first child { wxASSERT_MSG( parentId.IsOk(), wxT( "Tree has no root node?" ) ); newId = tree->PrependItem(parentId, text, imageId); } } if ( !newId.IsOk() ) { //something wrong -> cleaning and returning with false (void)wxBookCtrlBase::DoRemovePage(pagePos); wxFAIL_MSG( wxT("Failed to insert treebook page") ); return false; } DoInternalAddPage(pagePos, page, newId); DoUpdateSelection(bSelect, pagePos); return true; }
void wxTreebook::DoInternalRemovePageRange(size_t pagePos, size_t subCount) { // Attention: this function is only for a situation when we delete a node // with all its children so pagePos is the node's index and subCount is the // node children count wxASSERT_MSG( pagePos + subCount < m_treeIds.GetCount(), wxT("Ivalid page index") ); wxTreeItemId pageId = m_treeIds[pagePos]; m_treeIds.RemoveAt(pagePos, subCount + 1); if ( m_selection != wxNOT_FOUND ) { if ( (size_t)m_selection > pagePos + subCount) { // selection is far after the deleted page, so just update the index and move on m_selection -= 1 + subCount; if ( m_actualSelection != wxNOT_FOUND) { m_actualSelection -= subCount + 1; } } else if ( (size_t)m_selection >= pagePos ) { wxTreeCtrl *tree = GetTreeCtrl(); // as selected page is going to be deleted, try to select the next // sibling if exists, if not then the parent wxTreeItemId nodeId = tree->GetNextSibling(pageId); m_selection = wxNOT_FOUND; m_actualSelection = wxNOT_FOUND; if ( nodeId.IsOk() ) { // selecting next siblings tree->SelectItem(nodeId); } else // no next sibling, select the parent { wxTreeItemId parentId = tree->GetItemParent(pageId); if ( parentId.IsOk() && parentId != tree->GetRootItem() ) { tree->SelectItem(parentId); } else // parent is root { // we can't select it as it's hidden DoUpdateSelection(false, wxNOT_FOUND); } } } else if ( m_actualSelection != wxNOT_FOUND && (size_t)m_actualSelection >= pagePos ) { // nothing to do -- selection is before the deleted node, but // actually shown page (the first (sub)child with page != NULL) is // already deleted m_actualSelection = m_selection; // send event as documented DoSetSelection(m_selection, SetSelection_SendEvent); } //else: nothing to do -- selection is before the deleted node } else { DoUpdateSelection(false, wxNOT_FOUND); } }