📄 xhtmltree.cpp
字号:
lResult = pWnd->SendMessage(nMessage, (WPARAM)&msgdata, lParam);
}
return lResult;
}
//=============================================================================
int CXHtmlTree::GetStateImage(HTREEITEM hItem)
//=============================================================================
{
int nState = 0;
ASSERT(hItem);
XHTMLTREEDATA *pXTCD = GetItemDataStruct(hItem);
if (pXTCD)
{
if (m_bSmartCheck && (pXTCD->nChildren != 0))
{
if (pXTCD->nChecked == 0)
nState = UNCHECKED;
else if (pXTCD->nChecked == (pXTCD->nChildren - pXTCD->nSeparators)) //+++1.6
nState = CHECKED;
else
nState = TRISTATE;
}
else
{
if (pXTCD->bChecked)
nState = CHECKED;
else
nState = UNCHECKED;
}
if (!pXTCD->bEnabled)
nState |= HDCheckboxImageList::DISABLED_INDEX;
}
TRACE(_T("GetStateImage returning %d ~~~~~\n"), nState);
return nState;
}
//=============================================================================
int CXHtmlTree::SetCheckParent(HTREEITEM hItem, int nCount)
//=============================================================================
{
TRACE(_T("in CXHtmlTree::SetCheckParent: nCount=%d <%s>\n"), nCount, GetItemText(hItem));
ASSERT(hItem);
int nState = 0;
XHTMLTREEDATA *pXTCD = GetItemDataStruct(hItem);
if (pXTCD)
{
TRACE(_T("pXTCD->nChecked=%d pXTCD->nChildren=%d \n"), pXTCD->nChecked, pXTCD->nChildren);
pXTCD->nChecked += nCount;
if (pXTCD->nChecked < 0)
pXTCD->nChecked = 0;
BOOL bOldCheck = pXTCD->bChecked;
if (pXTCD->nChecked == (pXTCD->nChildren - pXTCD->nSeparators)) //+++1.6
pXTCD->bChecked = TRUE;
else
pXTCD->bChecked = FALSE;
if (pXTCD->bChecked != bOldCheck)
nCount += pXTCD->bChecked ? 1 : -1;
nState = GetStateImage(hItem);
SetItemState(hItem, INDEXTOSTATEIMAGEMASK(nState), TVIS_STATEIMAGEMASK);
TRACE(_T("nState=%d\n"), nState);
}
return nCount;
}
//=============================================================================
CXHtmlTree& CXHtmlTree::SetCheckChildren(HTREEITEM hItem, BOOL fCheck)
//=============================================================================
{
TRACE(_T("in CXHtmlTree::SetCheckChildren\n"));
// first set item state for this item
SetItemStateChildren(hItem, fCheck);
HTREEITEM hNext = GetChildItem(hItem);
// loop to set item state for children
while (hNext)
{
TRACE(_T("SetCheckChildren: %d <%s>\n"), fCheck, GetItemText(hNext));
// recurse into children
if (ItemHasChildren(hNext))
SetCheckChildren(hNext, fCheck);
SetItemStateChildren(hNext, fCheck);
hNext = GetNextItem(hNext, TVGN_NEXT);
}
return *this;
}
//=============================================================================
CXHtmlTree& CXHtmlTree::SetItemStateChildren(HTREEITEM hItem, BOOL fCheck)
//=============================================================================
{
TRACE(_T("in CXHtmlTree::SetItemStateChildren\n"));
XHTMLTREEDATA *pXTCD = GetItemDataStruct(hItem);
if (pXTCD && pXTCD->bEnabled)
{
int nState = GetStateImage(hItem);
if (pXTCD->bSeparator) //+++1.6
{
nState = 0;
}
else
{
int nStateHot = nState & HDCheckboxImageList::HOT_INDEX; // save hot
int nStateDisabled = nState & HDCheckboxImageList::DISABLED_INDEX; // save disabled
nState &= ~(HDCheckboxImageList::HOT_INDEX |
HDCheckboxImageList::DISABLED_INDEX); // remove hot & disabled
pXTCD->bChecked = fCheck;
if (fCheck)
{
pXTCD->nChecked = pXTCD->nChildren - pXTCD->nSeparators; //+++1.6
if (pXTCD->nChecked < 0)
pXTCD->nChecked = 0;
nState = CHECKED;
}
else
{
pXTCD->nChecked = 0;
nState = UNCHECKED;
}
nState |= nStateHot; // restore hot
nState |= nStateDisabled; // restore disabled
TRACE(_T("setting state to %d\n"), nState);
}
SetItemState(hItem, INDEXTOSTATEIMAGEMASK(nState), TVIS_STATEIMAGEMASK);
}
return *this;
}
//=============================================================================
BOOL CXHtmlTree::EnableItem(HTREEITEM hItem, BOOL bEnabled)
//=============================================================================
{
BOOL rc = TRUE;
ASSERT(hItem);
XHTMLTREEDATA *pXTCD = GetItemDataStruct(hItem);
if (pXTCD)
{
rc = pXTCD->bEnabled;
pXTCD->bEnabled = bEnabled;
int nState = GetStateImage(hItem);
if (bEnabled)
nState &= ~HDCheckboxImageList::DISABLED_INDEX;
else
nState |= HDCheckboxImageList::DISABLED_INDEX;
// set enabled state
SetItemState(hItem, INDEXTOSTATEIMAGEMASK(nState), TVIS_STATEIMAGEMASK);
}
return rc;
}
//=============================================================================
BOOL CXHtmlTree::EnableBranch(HTREEITEM hItem, BOOL bEnabled)
//=============================================================================
{
BOOL rc = TRUE;
if (hItem && !IsSeparator(hItem)) //+++1.6
{
rc = EnableItem(hItem, bEnabled);
hItem = GetChildItem(hItem);
if (hItem)
{
do
{
EnableBranch(hItem, bEnabled);
} while ((hItem = GetNextSiblingItem(hItem)) != NULL);
}
}
return rc; // return state of first item
}
//=============================================================================
BOOL CXHtmlTree::GetCheck(HTREEITEM hItem)
//=============================================================================
{
BOOL rc = FALSE;
ASSERT(hItem);
if (m_bCheckBoxes && hItem)
{
XHTMLTREEDATA *pXTCD = GetItemDataStruct(hItem);
if (pXTCD)
{
if (m_bSmartCheck)
{
if (pXTCD->nChildren == 0)
{
rc = pXTCD->bChecked;
}
else
{
if (pXTCD->nChecked == 0)
rc = FALSE; // no children are checked
else if (pXTCD->nChecked == (pXTCD->nChildren - pXTCD->nSeparators)) //+++1.6
rc = TRUE; // all children are checked
else
rc = FALSE; // not all children are checked
}
}
else
{
rc = pXTCD->bChecked;
}
}
}
return rc;
}
//=============================================================================
HTREEITEM CXHtmlTree::GetFirstCheckedItem()
//=============================================================================
{
if (m_bCheckBoxes)
{
for (HTREEITEM hItem = GetRootItem();
hItem != NULL;
hItem = GetNextItem(hItem))
{
if (GetCheck(hItem))
return hItem;
}
}
return NULL;
}
//=============================================================================
HTREEITEM CXHtmlTree::GetNextCheckedItem(HTREEITEM hItem)
//=============================================================================
{
if (m_bCheckBoxes)
{
for (hItem = GetNextItem(hItem);
hItem != NULL;
hItem = GetNextItem(hItem))
{
if (GetCheck(hItem))
return hItem;
}
}
return NULL;
}
//=============================================================================
HTREEITEM CXHtmlTree::GetPrevCheckedItem(HTREEITEM hItem)
//=============================================================================
{
if (m_bCheckBoxes)
{
for (hItem = GetPrevItem(hItem);
hItem != NULL;
hItem = GetPrevItem(hItem))
{
if (GetCheck(hItem))
return hItem;
}
}
return NULL;
}
//=============================================================================
BOOL CXHtmlTree::DeleteItem(HTREEITEM hItem)
//=============================================================================
{
TRACE(_T("in CXHtmlTree::DeleteItem\n"));
BOOL bOldDestroyingTree = m_bDestroyingTree;
if (hItem && ItemHasChildren(hItem))
{
DeleteBranch(hItem);
}
else if (hItem)
{
XHTMLTREEDATA *pXTCD = GetItemDataStruct(hItem);
if (pXTCD)
{
if (pXTCD->bChecked)
m_nDeletedChecked++;
HTREEITEM hParent = hItem;
// find all parents, decrement their children counts,
// adjust their checked counts and separator counts
while ((hParent = GetParentItem(hParent)) != NULL)
{
IncrementChildren(hParent, -1);
if (pXTCD->bChecked)
SetCheckParent(hParent, -1);
if (pXTCD->bSeparator) //+++1.6
IncrementSeparators(hParent, -1);
}
m_bDestroyingTree = TRUE;
m_DataMap.RemoveKey(hItem);
delete pXTCD;
}
}
m_bDestroyingTree = bOldDestroyingTree;
m_nDeleted++;
return CTreeCtrl::DeleteItem(hItem);
}
//=============================================================================
void CXHtmlTree::DeleteBranch(HTREEITEM hItem)
//=============================================================================
{
if (hItem)
{
HTREEITEM hChild = GetChildItem(hItem);
while (hChild)
{
// recursively delete all the items
HTREEITEM hNext = GetNextSiblingItem(hChild);
DeleteBranch(hChild);
hChild = hNext;
}
DeleteItem(hItem);
}
}
//=============================================================================
CString CXHtmlTree::GetItemNote(HTREEITEM hItem, BOOL bStripHtml /*= FALSE*/)
//=============================================================================
{
CString strNote = _T("");
XHTMLTREEDATA *pXTCD = GetItemDataStruct(hItem);
if (pXTCD && pXTCD->pszNote)
{
strNote = pXTCD->pszNote;
if (bStripHtml)
{
#ifdef XHTMLHTML
// remove html tags
CXHtmlDraw hd;
int n = strNote.GetLength();
if (n > 3) // minimum html string
{
TCHAR *s = new TCHAR [n + 16];
hd.GetPlainText(strNote, s, n+4);
strNote = s;
delete [] s;
}
#endif // XHTMLHTML
}
}
return strNote;
}
//=============================================================================
int CXHtmlTree::GetItemNoteWidth(HTREEITEM hItem)
//=============================================================================
{
int nWidth = 0;
XHTMLTREEDATA *pXTCD = GetItemDataStruct(hItem);
if (pXTCD && pXTCD->pszNote)
{
nWidth = pXTCD->nTipWidth;
}
return nWidth;
}
//=============================================================================
CXHtmlTree& CXHtmlTree::SetItemNote(HTREEITEM hItem,
LPCTSTR lpszNote,
int nTipWidth /*= 0*/)
//=============================================================================
{
ASSERT(hItem);
ASSERT(lpszNote);
if (hItem && lpszNote)
{
XHTMLTREEDATA *pXTCD = GetItemDataStruct(hItem);
if (pXTCD)
{
if (pXTCD->pszNote)
delete [] pXTCD->pszNote;
pXTCD->pszNote = NULL;
size_t len = _tcslen(lpszNote);
pXTCD->pszNote = new TCHAR [len + 4];
if (pXTCD->pszNote)
{
memset(pXTCD->pszNote, 0, len+4);
_tcsncpy(pXTCD->pszNote, lpszNote, len+1);
pXTCD->nTipWidth = nTipWidth;
}
}
}
return *this;
}
//=============================================================================
HTREEITEM CXHtmlTree::InsertItem(LPTVINSERTSTRUCT lpInsertStruct,
XHTMLTREEDATA * pData /*= NULL*/)
//=============================================================================
{
XHTMLTREEDATA *pXTCD = new XHTMLTREEDATA;
ASSERT(pXTCD);
if (!pXTCD)
{
ASSERT(FALSE);
return 0;
}
if (pData)
{
// copy user items for XHTMLTREEDATA
pXTCD->bChecked = pData->bChecked;
pXTCD->bEnabled = pData->bEnabled;
pXTCD->bSeparator = pData->bSeparator; //+++1.6
// copy user items for XHTMLDRAWSTRUCT
pXTCD->ds.crText = pData->ds.crText;
pXTCD->ds.crAnchorText = pData->ds.crAnchorText;
pXTCD->ds.crBackground = pData->ds.crBackground;
pXTCD->ds.crTextBackground = pData->ds.crTextBackground;
pXTCD->ds.bIgnoreColorTag = pData->ds.bIgnoreColorTag;
pXTCD->ds.bTransparent = pData->ds.bTransparent;
pXTCD->ds.bBold = pData->ds.bBold;
pXTCD->ds.bItalic = pData->ds.bItalic;
pXTCD->ds.bUnderline = pData->ds.bUnderline;
pXTCD->ds.bStrikeThrough = pData->ds.bStrikeThrough;
pXTCD->ds.bUseEllipsis = pData->ds.bUseEllipsis;
pXTCD->ds.bLogFont = pData->ds.bLogFont;
pXTCD->ds.uFormat = pData->ds.uFormat;
pXTCD->ds.lf = pData->ds.lf;
}
pXTCD->hTreeCtrl = m_hWnd;
TVINSERTSTRUCT tvis;
memcpy(&tvis, lpInsertStruct, sizeof(TVINSERTSTRUCT));
if (!m_bImages)
{
tvis.i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -