www.gusucode.com > vc++在下拉选框中使用树形菜单源码程序 > vc++在下拉选框中使用树形菜单源码程序\code\CheckTreeData.cpp
//####################################################################################### //## CheckTreeData.cpp : implementation file //## [Magerusan G. Cosmin] 13-apr-2002 //####################################################################################### #include "stdafx.h" #include "sample.h" //Download by http://www.NewXing.com #include "CheckTreeData.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //## ==================================================================================== CCheckTreeNode::CCheckTreeNode(LPCTSTR lpszString) { //## DEFAULT nID = INVALID_ID; nLevel = ROOT_LEVEL; bChecked = FALSE; bIsLeaf = FALSE; //## SET String strCaption = lpszString; } //####################################################################################### CCheckTreeData::CCheckTreeData() { //## INITIALIZE Data Reset(); } //## ==================================================================================== CCheckTreeData::~CCheckTreeData() { //## RESET Reset(); } //## ==================================================================================== void CCheckTreeData::Reset() { //## RESET Content RemoveAll(); //## INITIALIZE m_nMaxLevel = ROOT_LEVEL; } //####################################################################################### void CCheckTreeData::AddString(LPCTSTR lpszString, long nID, long nLevel) { //## ASSERT ASSERT(nLevel < TREE_MAX_LEVELS); //## INITIALIZE Node CCheckTreeNode node(lpszString); node.nID = nID; node.nLevel = nLevel; node.bIsLeaf = (nID != INVALID_ID) ? TRUE : FALSE; //## UPDATE MaxLevel if (nLevel > m_nMaxLevel) m_nMaxLevel = nLevel; //## ADD Node Add( node ); } //####################################################################################### void CCheckTreeData::UpdateChecksDown(long nIndex) { //## GET Current level long nIndexLevel = ElementAt(nIndex).nLevel; BOOL bIndexChecked = ElementAt(nIndex).bChecked; //## SCAN & Update for(long i=nIndex+1; (i < GetSize()) && (ElementAt(i).nLevel > nIndexLevel); i++) ElementAt(i).bChecked = bIndexChecked; } //## ==================================================================================== void CCheckTreeData::UpdateChecksUp(long nLevel) { //## DECLARE long nChecked = 0L, nUnChecked = 0L, nItemLevel = 0L; //## SCAN up -> down for(long i = (GetSize() - 1); i >= 0; i--){ //## GET Item Level nItemLevel = ElementAt( i ).nLevel; //## COUNT checked/unchecked items if (nItemLevel == nLevel) if (ElementAt( i ).bChecked) nChecked++; else nUnChecked++; //## UP node if ((nItemLevel + 1) == nLevel){ if ((nChecked > 0) || (nUnChecked > 0)){ if (nUnChecked == 0) ElementAt( i ).bChecked = TRUE; if (nUnChecked > 0) ElementAt( i ).bChecked = FALSE; } nChecked = nUnChecked = 0L; } } } //## ==================================================================================== void CCheckTreeData::UpdateChecksUp() { //## UPDATE Levels for(long i=m_nMaxLevel; i > 0; i--){ UpdateChecksUp( i ); } } //####################################################################################### void CCheckTreeData::UpdateChecks(long nIndex) { //## PROPAGATE Checks DOWN UpdateChecksDown(nIndex); //## PROPAGATE Checks UP UpdateChecksUp(); } //####################################################################################### void CCheckTreeData::CheckAll(BOOL bCheck) { //## CHECK All Items for(long i=0; i<GetSize(); i++){ ElementAt(i).bChecked = bCheck; } } //## ==================================================================================== BOOL CCheckTreeData::GetCheck(long nID) { //## GET check for(long i=0; i<GetSize(); i++) if (ElementAt(i).nID == nID) return ElementAt(i).bChecked; //## ITEM not found return FALSE; } //## ==================================================================================== BOOL CCheckTreeData::GetCheckAtIndex(long nIndex) { return ElementAt(nIndex).bChecked; } //## ==================================================================================== void CCheckTreeData::SetCheck(long nID, BOOL bCheck) { //## CHECK Item for(long i=0; i<GetSize(); i++) if (ElementAt(i).nID == nID){ ElementAt(i).bChecked = bCheck; break; } //## UPDATE Checks on levels, starting with node i if (i < GetSize()) UpdateChecks(i); } //####################################################################################### CString CCheckTreeData::GetCheckedTexts() { //## ASSERT if (GetSize() <= 0) return TEXT(""); //## CASE: when only a single element is in the list CString str; if ((GetSize() == 2) && (ElementAt(ROOT_INDEX).bChecked)){ str = ElementAt(1).strCaption; return str; } //## CHECK if all items were Checked if (ElementAt(ROOT_INDEX).bChecked){ str = ROOT_CAPTION; return str; } //## COLLECT all Checked items in a single string long nCount = 0; for(long i=0; i<GetSize(); i++) if ((ElementAt(i).bIsLeaf) && (ElementAt(i).bChecked)){ str += ElementAt(i).strCaption + ", "; nCount++; } //## ADJUST String if (str.GetLength() > 2) str = str.Mid(0, str.GetLength()-2); if (nCount > 1) str = (CString)"(" + str + ")"; //## RETURN return str; } //## ==================================================================================== CString CCheckTreeData::GetCheckedIDs() { //## ASSERT if (GetSize() <= 0) return TEXT(""); //## CHECK if all items were checked CString str, strID; if (ElementAt(ROOT_INDEX).bChecked){ str = ROOT_CAPTION; return str; } //## COLLECT all checked items in a single string long nCount = 0; for(long i=0; i<GetSize(); i++) if ((ElementAt(i).bIsLeaf) && (ElementAt(i).bChecked)){ strID.Format(TEXT("%d"), ElementAt(i).nID); str += strID + ", "; nCount++; } //## ADJUST String if (str.GetLength() > 2) str = str.Mid(0, str.GetLength()-2); if (nCount > 0) str = (CString)"(" + str + ")"; //## RETURN return str; } //#######################################################################################