COptionTreeItem * COptionTree::InsertItem(COptionTreeItem *otiItem, COptionTreeItem *otiParent) { // Declare variables COptionTreeItem* otiNext; // Make sure item is not NULL if (otiItem == NULL) { return NULL; } // If parent is NULL, becomes root if (otiParent == NULL) { otiParent = &m_otiRoot; } // Set child if (otiParent->GetChild() == NULL) { otiParent->SetChild(otiItem); } else { // -- Add to end of the sibling list otiNext = otiParent->GetChild(); while (otiNext->GetSibling() != NULL) { otiNext = otiNext->GetSibling(); } otiNext->SetSibling(otiItem); } // Auto generate a default ID m_uLastUID++; otiItem->SetCtrlID(m_uLastUID); // Set item information otiItem->SetParent(otiParent); otiItem->SetOptionsOwner(this); // Send notification to user SendNotify(OT_NOTIFY_INSERTITEM, otiItem); //// Updated items //UpdatedItems(); //// Force redraw //Invalidate(); //// Update window //UpdateWindow(); return otiItem; }
BOOL COptionTree::EnumItems(COptionTreeItem* otiItem, ENUM_OPTIONITEMPROC enumProc, LPARAM lParam) { // Declare variables COptionTreeItem* otiNext; BOOL bRet = TRUE; // Validate items if (!otiItem || !enumProc) { return FALSE; } // Don't count the root item in any enumerations if (otiItem != &m_otiRoot && !enumProc(this, otiItem, lParam)) { return FALSE; } // Recurse thru all child items otiNext = otiItem->GetChild(); while (otiNext != NULL) { if (!EnumItems(otiNext, enumProc, lParam)) { bRet = FALSE; } otiNext = otiNext->GetSibling(); } return bRet; }
void COptionTreeList::OnPaint() { // Make sure valid if (m_otOption == NULL) { return; } // Declare variables CPaintDC dc(this); CDC* pDCMem = new CDC; CBitmap bpMem; CBitmap *bmOld; COptionTreeItem* otiItem; CRect rcClient; HGDIOBJ hOldBrush; long lTotal, lHeight; HRGN hRgn; // Get client rectangle GetClientRect(rcClient); // Clear visible list m_otOption->ClearVisibleList(); // Clear all label rectangle m_otOption->ClearAllLabelRect(); // Create DC pDCMem->CreateCompatibleDC(&dc); // Create bitmap bpMem.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height()); // Select bitmap bmOld = pDCMem->SelectObject(&bpMem); // Draw control background hOldBrush = pDCMem->SelectObject(GetSysColorBrush(COLOR_BTNFACE)); pDCMem->PatBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), PATCOPY); // Draw control inside fill color rcClient.DeflateRect(2, 2); if (m_otOption->IsWindowEnabled() == TRUE) { pDCMem->SelectObject(GetSysColorBrush(COLOR_WINDOW)); } else { pDCMem->SelectObject(GetSysColorBrush(COLOR_3DFACE)); } pDCMem->PatBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), PATCOPY); rcClient.InflateRect(2, 2); // Draw expand column if (m_otOption->GetShadeExpandColumn() == TRUE || m_otOption->IsWindowEnabled() == FALSE) { pDCMem->SelectObject(GetSysColorBrush(COLOR_BTNFACE)); } else { pDCMem->SelectObject(GetSysColorBrush(COLOR_WINDOW)); } pDCMem->PatBlt(0, 0, OT_EXPANDCOLUMN, rcClient.Height(), PATCOPY); // Create clip region hRgn = CreateRectRgn(rcClient.left, rcClient.top, rcClient.right, rcClient.bottom); SelectClipRgn(pDCMem->m_hDC, hRgn); // Draw all items lTotal = 0; for (otiItem = m_otOption->GetRootItem()->GetChild(); otiItem != NULL; otiItem = otiItem->GetSibling()) { lHeight = otiItem->DrawItem(pDCMem, rcClient, 0, lTotal); lTotal += lHeight; } // Remove clip region SelectClipRgn(pDCMem->GetSafeHdc(), NULL); DeleteObject(hRgn); // Draw vertical sep _DrawDarkVLine(pDCMem->GetSafeHdc(), OT_EXPANDCOLUMN, 0, rcClient.bottom); // Draw edge pDCMem->DrawEdge(&rcClient, BDR_SUNKENOUTER, BF_RECT); // Draw draw column if (m_bColDrag == TRUE) { _DrawXorBar(pDCMem->GetSafeHdc(), m_lColumn - OT_COLRNG / 2, 0, 4, rcClient.bottom); } // Copy back buffer to the display dc.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), pDCMem, 0, 0, SRCCOPY); // Select old objects pDCMem->SelectObject(hOldBrush); pDCMem->SelectObject(bmOld); // Delete objects if (pDCMem->GetSafeHdc() != NULL) { pDCMem->DeleteDC(); } delete pDCMem; if (bpMem.GetSafeHandle() != NULL) { bpMem.DeleteObject(); } }
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; } }
void COptionTreeWrapper::SerializeIn(IArchive &Archive, CHashString name) { CHashString basicType(_T("")); CHashString OptionTreeItemType(_T("")); // get the first option tree item in tree COptionTreeItem *item = m_mTrees[name.GetUniqueID()].m_Root->GetChild(); if (item == NULL) { return; } for (UINT i=0; i<m_mViewOList[name.GetUniqueID()].size(); i++) { VIEWOBJECTLIST::iterator volIter = m_mViewOList[name.GetUniqueID()][i]->begin(); for(; volIter != m_mViewOList[name.GetUniqueID()][i]->end(); volIter++) { ViewFormatObject *vo; vo = *volIter; basicType = vo->GetBasicType().c_str(); OptionTreeItemType = vo->GetViewType().c_str(); MAPTYPETOFUNCMAP::iterator mttfmIter; // find the map from basicType to write option tree item mttfmIter = m_TypeFuncMap.find(OptionTreeItemType.GetUniqueID()); if (mttfmIter == m_TypeFuncMap.end()) { // warning, continue.... // Sorry, that type of item is not known! StdString error = _T("COptionTreeItem of this type is unknown: "); error += OptionTreeItemType.GetString(); ::MessageBox(NULL, error, _T("INVALID OPERATION"), MB_OK); continue; } MAPTYPECREATEFUNC *createFuncs; createFuncs = mttfmIter->second; MAPTYPECREATEFUNC::iterator mtcfIter; // find the function that writes the option tree item w/ this basicType mtcfIter = createFuncs->find(basicType.GetUniqueID()); if (mtcfIter == createFuncs->end()) { // warning, continue // Sorry this item does not accept items of type %s, OptionTreeItemType StdString error = _T("This basic type is unknown: "); error += basicType.GetString(); ::MessageBox(NULL, error, _T("INVALID OPERATION"), MB_OK); } OTCREATETYPEFUNC funcPtr; funcPtr = mtcfIter->second; // call the function that writes the value from option tree item into the archive (this->*funcPtr)(Archive, item, true); item = item->GetSibling(); } } }