void PropertyTree::OnPaint() { CPaintDC dc(this); ClearVisibleList(); // get client rect CRect rc; GetClientRect( rc ); // draw control background CMemDC memdc( &dc ); memdc.FillSolidRect( rc, Globals::Preferences->GetBtnFaceColor() ); PropertyTreeItem* pItem; LONG nTotal = 0; ASSERT(GetRootItem()!=NULL); // create clip region HRGN hRgn = CreateRectRgn( rc.left, rc.top, rc.right, rc.bottom ); SelectClipRgn( memdc.m_hDC, hRgn ); // build a list of visible items prior to drawing. if // we decide to later implement trees with more than // one level, we will need a recursive function call // to do this. pItem = GetRootItem()->GetChild(); while ( pItem ) { m_pVisibleList.push_back( pItem ); if ( pItem->IsExpanded() && pItem->GetChild() ) { PropertyTreeItem* pNext = pItem->GetChild(); while ( pNext ) { m_pVisibleList.push_back( pNext ); pNext = pNext->GetNext(); } } pItem = pItem->GetNext(); } // determine if the scrollbar is visible CheckScrollVisible(); // actually draw the items for ( size_t i = 0; i < m_pVisibleList.size(); i++ ) { LONG nHeight = m_pVisibleList.at( i )->DrawItem(&memdc, rc, 0, nTotal); nTotal += nHeight; } // remove clip region SelectClipRgn(memdc.m_hDC, NULL); DeleteObject(hRgn); }
void CPropTree::Delete(CPropTreeItem* pItem) { if (pItem && pItem!=&m_Root && SendNotify(PTN_DELETEITEM, pItem)) return; // passing in a NULL item is the same as calling DeleteAllItems if (!pItem) pItem = &m_Root; // Clear the visible list before anything gets deleted ClearVisibleList(); // delete children CPropTreeItem* pIter; CPropTreeItem* pNext; pIter = pItem->GetChild(); while (pIter) { pNext = pIter->GetSibling(); DeleteItem(pIter); pIter = pNext; } // unlink from tree if (pItem->GetParent()) { if (pItem->GetParent()->GetChild()==pItem) pItem->GetParent()->SetChild(pItem->GetSibling()); else { pIter = pItem->GetParent()->GetChild(); while (pIter->GetSibling() && pIter->GetSibling()!=pItem) pIter = pIter->GetSibling(); if (pIter->GetSibling()) pIter->SetSibling(pItem->GetSibling()); } } if (pItem!=&m_Root) { if (pItem==GetFocusedItem()) SetFocusedItem(NULL); delete pItem; } }
void COptionTree::Delete(COptionTreeItem *otiItem) { // Declare variables COptionTreeItem* otiIter; COptionTreeItem* otiNext; // Clear visible list ClearVisibleList(); // Send notify to user SendNotify(OT_NOTIFY_DELETEITEM, otiItem); // Passing in a NULL deletes frm root if (otiItem == NULL) { otiItem = &m_otiRoot; } // Delete children otiIter = otiItem->GetChild(); while (otiIter != NULL) { // -- Get sibling otiNext = otiIter->GetSibling(); // -- Delete DeleteItem(otiIter); // -- Get next otiIter = otiNext; } // Unlink from tree if (otiItem->GetParent() != NULL) { if (otiItem->GetParent()->GetChild() == otiItem) { otiItem->GetParent()->SetChild(otiItem->GetSibling()); } else { otiIter = otiItem->GetParent()->GetChild(); while (otiIter->GetSibling() && otiIter->GetSibling() != otiItem) { otiIter = otiIter->GetSibling(); } if (otiIter->GetSibling()) { otiIter->SetSibling(otiItem->GetSibling()); } } } // Delete item if (otiItem != &m_otiRoot) { if (otiItem == GetFocusedItem()) { SetFocusedItem(NULL); } otiItem->CleanDestroyWindow(); delete otiItem; } }