CPropTreeItem* CPropTree::InsertItem(CPropTreeItem* pItem, CPropTreeItem* pParent) { if (!pItem) return NULL; if (!pParent) pParent = &m_Root; if (!pParent->GetChild()) pParent->SetChild(pItem); else { // add to end of the sibling list CPropTreeItem* pNext; pNext = pParent->GetChild(); while (pNext->GetSibling()) pNext = pNext->GetSibling(); pNext->SetSibling(pItem); } pItem->SetParent(pParent); pItem->SetPropOwner(this); // auto generate a default ID pItem->SetCtrlID(m_nLastUID++); SendNotify(PTN_INSERTITEM, pItem); UpdatedItems(); return pItem; }
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 CPropTreeList::OnPaint() { CPaintDC dc(this); CDC memdc; CBitmap* pOldBitmap; ASSERT(m_pProp!=NULL); m_pProp->ClearVisibleList(); memdc.CreateCompatibleDC(&dc); pOldBitmap = memdc.SelectObject(&m_BackBuffer); CRect rc; GetClientRect(rc); // draw control background memdc.SelectObject(GetSysColorBrush(COLOR_BTNFACE)); memdc.PatBlt(rc.left, rc.top, rc.Width(), rc.Height(), PATCOPY); // draw control inside fill color rc.DeflateRect(2,2); memdc.PatBlt(rc.left, rc.top, rc.Width(), rc.Height(), m_pProp->IsWindowEnabled() ? WHITENESS : PATCOPY); rc.InflateRect(2,2); // draw expand column memdc.SelectObject(GetSysColorBrush(COLOR_BTNFACE)); memdc.PatBlt(0, 0, PROPTREEITEM_EXPANDCOLUMN, rc.Height(), PATCOPY); // draw edge memdc.DrawEdge(&rc, BDR_SUNKENOUTER, BF_RECT); CPropTreeItem* pItem; LONG nTotal = 0; ASSERT(m_pProp->GetRootItem()!=NULL); rc.DeflateRect(2,2); // create clip region HRGN hRgn = CreateRectRgn(rc.left, rc.top, rc.right, rc.bottom); SelectClipRgn(memdc.m_hDC, hRgn); // draw all items for (pItem = m_pProp->GetRootItem()->GetChild(); pItem; pItem = pItem->GetSibling()) { LONG nHeight = pItem->DrawItem(&memdc, rc, 0, nTotal); nTotal += nHeight; } // remove clip region SelectClipRgn(memdc.m_hDC, NULL); DeleteObject(hRgn); // copy back buffer to the display dc.GetClipBox(&rc); dc.BitBlt(rc.left, rc.top, rc.Width(), rc.Height(), &memdc, rc.left, rc.top, SRCCOPY); memdc.DeleteDC(); }
void MaterialPreviewPropView::OnPropertyButtonClick(NMHDR *nmhdr, LRESULT *lresult) { NMPROPTREE *nmProp; CPropTreeItem *item; nmProp = (NMPROPTREE *)nmhdr; item = nmProp->pItem; idStr itemLabel = item->GetLabelText(); if (itemLabel == "Preview Lights") { AddLight(); } else if (itemLabel.Left(5) == "Light") { CPropTreeItem *light; int lightId = item->GetCtrlID(); int testLightNum = 0; m_Tree.DeleteItem(item); for (light = m_Tree.GetRootItem()->GetChild(); light != NULL; light = light->GetSibling()) { idStr label = light->GetLabelText(); if (label.Left(5) == "Light") { testLightNum++; light->SetLabelText(_T(va("Light #%d", testLightNum))); light->SetInfoText(_T(va("Parameters for light number %d.", testLightNum))); light->SetCtrlID(testLightNum - 1); } } materialPreview->OnDeleteLight(lightId); numLights--; } else if (itemLabel == "Custom Model") { CFileDialog dlg(TRUE); dlg.m_ofn.Flags |= OFN_FILEMUSTEXIST; item->Check(FALSE); if (dlg.DoModal()== IDOK) { item->Check(FALSE); item->SetItemValue((LPARAM)fileSystem->OSPathToRelativePath(dlg.m_ofn.lpstrFile)); m_Tree.SendNotify(PTN_ITEMCHANGED, item); } } }
BOOL CPropTree::EnumItems(CPropTreeItem* pItem, ENUMPROPITEMPROC proc, LPARAM lParam) { if (!pItem || !proc) return FALSE; CPropTreeItem* pNext; // don't count the root item in any enumerations if (pItem!=&m_Root && !proc(this, pItem, lParam)) return FALSE; // recurse thru all child items pNext = pItem->GetChild(); while (pNext) { if (!EnumItems(pNext, proc, lParam)) return FALSE; pNext = pNext->GetSibling(); } return TRUE; }
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; // 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()); UINT nSiblingID = 0; CPropTreeItem* pItemID = pItem->GetParent()->GetChild(); while ( pItemID ) { pItemID->SetSiblingID( nSiblingID++ ); pItemID = pItemID->GetSibling(); } } else { pIter = pItem->GetParent()->GetChild(); while (pIter->GetSibling() && pIter->GetSibling()!=pItem) pIter = pIter->GetSibling(); CPropTreeItem* pItemID = pIter->GetSibling(); if ( pItemID ) { UINT nSiblingID = pItem->GetSiblingID(); while ( pItemID ) { pItemID = pItemID->GetSibling(); if ( pItemID ) pItemID->SetSiblingID( nSiblingID++ ); } pIter->SetSibling(pItem->GetSibling()); } } } if (pItem!=&m_Root) { if (pItem==GetFocusedItem()) SetFocusedItem(NULL); delete pItem; } }