📄 supergridctrl.cpp
字号:
return;
}
}
}
POSITION pos = pItem->m_listChild.GetHeadPosition();
while (pos)
{
CTreeItem *pChild = (CTreeItem*)pItem->m_listChild.GetNext(pos);
ExpandUntil(pChild, pStopAt);
}
}
void CSuperGridCtrl::DeleteItemEx(CTreeItem *pSelItem, int nItem)
{
SetRedraw(0);
DeleteItem(nItem);//delete cur item in listview
//delete/hide all children in pSelItem
HideChildren(pSelItem, TRUE, nItem);
//delete all internal nodes
Delete(pSelItem);
InternaleUpdateTree();
if(nItem-1<0)//no more items in list
{
SetRedraw(1);
InvalidateRect(NULL);
UpdateWindow();
return;
}
UINT uflag = LVIS_SELECTED | LVIS_FOCUSED;
CRect rcTestIfItemIsValidToSelectOtherWiseSubtrackOneFromItem;//just to get the documention right :)
GetItemRect(nItem, rcTestIfItemIsValidToSelectOtherWiseSubtrackOneFromItem ,LVIR_LABEL) ? SetItemState(nItem, uflag, uflag) : SetItemState(nItem-1, uflag, uflag);
SetRedraw(1);
InvalidateRect(NULL);
UpdateWindow();
}
void CSuperGridCtrl::CleanMe(CTreeItem *pItem)
{
// delete child nodes
POSITION pos = pItem->m_listChild.GetHeadPosition();
while (pos != NULL)
{
CTreeItem* pItem =(CTreeItem*)pItem->m_listChild.GetNext(pos);
if(pItem!=NULL)
{
if(pItem->m_lpNodeInfo!=NULL)
delete pItem->m_lpNodeInfo;
delete pItem;
}
}
pItem->m_listChild.RemoveAll();
}
CSuperGridCtrl::CTreeItem* CSuperGridCtrl::GetNextSiblingItem(CTreeItem* pNode, BOOL bInit, BOOL bDontIncludeHidden)
{
return _GetNext(GetRootItem(), pNode, bInit, bDontIncludeHidden);
}
CSuperGridCtrl::CTreeItem* CSuperGridCtrl::_GetNext(CTreeItem* pStartAt, CTreeItem* pNode, BOOL bInit, BOOL bDontIncludeHidden)
{
static BOOL bFound;
if (bInit)
bFound = FALSE;
if (pNode == pStartAt)
bFound = TRUE;
if(bDontIncludeHidden)
{
if (!IsCollapsed(pStartAt))
{
POSITION pos = pStartAt->m_listChild.GetHeadPosition();
while (pos != NULL)
{
CTreeItem* pChild = (CTreeItem*)pStartAt->m_listChild.GetNext(pos);
if (bFound)
return pChild;
pChild = _GetNext(pChild,pNode, FALSE, TRUE);
if (pChild != NULL)
return pChild;
}
}
}
else {
POSITION pos = pStartAt->m_listChild.GetHeadPosition();
while (pos != NULL)
{
CTreeItem* pChild = (CTreeItem*)pStartAt->m_listChild.GetNext(pos);
if (bFound)
return pChild;
pChild = _GetNext(pChild,pNode, FALSE,FALSE);
if (pChild != NULL)
return pChild;
}
}
// if reached top and last level return original
if (bInit)
return pNode;
else
return NULL;
}
CSuperGridCtrl::CTreeItem* CSuperGridCtrl::GetPrevSiblingItem(CTreeItem* pNode, BOOL bInit, BOOL bDontIncludeHidden)
{
return _GetPrev(GetRootItem(), pNode, bInit, bDontIncludeHidden);
}
CSuperGridCtrl::CTreeItem* CSuperGridCtrl::_GetPrev(CTreeItem* pStartAt, CTreeItem* pNode, BOOL bInit, BOOL bDontIncludeHidden)
{
static CTreeItem* pPrev;
if (bInit)
pPrev = pStartAt;
if (pNode == pStartAt)
return pPrev;
pPrev = pStartAt;
if(bDontIncludeHidden)
{
if (!IsCollapsed(pStartAt))
{
POSITION pos = pStartAt->m_listChild.GetHeadPosition();
while (pos != NULL)
{
CTreeItem* pCur = (CTreeItem*)pStartAt->m_listChild.GetNext(pos);
CTreeItem* pChild = _GetPrev(pCur,pNode, FALSE,TRUE);
if (pChild != NULL)
return pChild;
}
}
}
else {
POSITION pos = pStartAt->m_listChild.GetHeadPosition();
while (pos != NULL)
{
CTreeItem* pCur = (CTreeItem*)pStartAt->m_listChild.GetNext(pos);
CTreeItem* pChild = _GetPrev(pCur,pNode, FALSE,FALSE);
if (pChild != NULL)
return pChild;
}
}
if (bInit)
return pPrev;
else
return NULL;
}
int CSuperGridCtrl::_NodeToIndex(CTreeItem *pStartpos, CTreeItem* pNode, int& nIndex, BOOL binit)
{
static BOOL bFound;
if(binit)
bFound=FALSE;
if(pStartpos==pNode)
bFound=TRUE;
if(!IsCollapsed(pStartpos))
{
POSITION pos = GetHeadPosition(pStartpos);
while (pos)
{
CTreeItem *pChild = GetNextChild(pStartpos, pos);
if(bFound)
return nIndex;
nIndex=_NodeToIndex(pChild, pNode, nIndex, binit);
nIndex++;
}
}
if(binit)
return nIndex;
else
return -1;
}
BOOL CSuperGridCtrl::Delete(CTreeItem* pNode, BOOL bClean)
{
return _Delete(GetRootItem(),pNode,bClean);
}
BOOL CSuperGridCtrl::_Delete(CTreeItem* pStartAt, CTreeItem* pNode, BOOL bClean)
{
POSITION pos = pStartAt->m_listChild.GetHeadPosition();
while (pos != NULL)
{
POSITION posPrev = pos;
CTreeItem *pChild = (CTreeItem*)pStartAt->m_listChild.GetNext(pos);
if (pChild == pNode)
{
pStartAt->m_listChild.RemoveAt(posPrev);
if(bClean)
{
if(GetData(pNode)!=NULL)
delete GetData(pNode);
delete pNode;
}
return TRUE;
}
if (_Delete(pChild, pNode) == TRUE)
return TRUE;
}
return FALSE;
}
BOOL CSuperGridCtrl::IsChildOf(const CTreeItem* pParent, const CTreeItem* pChild) const
{
if (pChild == pParent)
return TRUE;
POSITION pos = pParent->m_listChild.GetHeadPosition();
while (pos != NULL)
{
CTreeItem* pNode = (CTreeItem*)pParent->m_listChild.GetNext(pos);
if (IsChildOf(pNode, pChild))
return TRUE;
}
return FALSE;
}
inline int StrComp(const CString* pElement1, const CString* pElement2)
{
return pElement1->Compare(*pElement2);
}
int CSuperGridCtrl::CompareChildren(const void* p1, const void* p2)
{
CTreeItem * pChild1 = *(CTreeItem**)p1;
CTreeItem * pChild2 = *((CTreeItem**)p2);
CItemInfo *pItem1=(*pChild1).m_lpNodeInfo;
CItemInfo *pItem2=(*pChild2).m_lpNodeInfo;
return StrComp(&(pItem1->GetItemText()), &(pItem2->GetItemText()));
}
POSITION CSuperGridCtrl::GetHeadPosition(CTreeItem* pItem) const
{
return pItem->m_listChild.GetHeadPosition();
}
CSuperGridCtrl::CTreeItem* CSuperGridCtrl::GetNextChild(CTreeItem *pItem, POSITION& pos) const
{
return (CTreeItem*)pItem->m_listChild.GetNext(pos);
}
CSuperGridCtrl::CTreeItem* CSuperGridCtrl::GetPrevChild(CTreeItem *pItem, POSITION& pos) const
{
return (CTreeItem*)pItem->m_listChild.GetPrev(pos);
}
POSITION CSuperGridCtrl::GetTailPosition(CTreeItem *pItem) const
{
return pItem->m_listChild.GetTailPosition();
}
void CSuperGridCtrl::AddChild(CTreeItem *pParent, CTreeItem *pChild)
{
pParent->m_listChild.AddTail(pChild);
}
void CSuperGridCtrl::Sort(CTreeItem* pParent, BOOL bSortChildren)
{
const int nChildren = NumChildren(pParent);
if (nChildren > 1)
{
CTreeItem** ppSortArray = new CTreeItem*[nChildren];
// Fill in array with pointers to our children.
POSITION pos = pParent->m_listChild.GetHeadPosition();
for (int i=0; pos; i++)
{
ASSERT(i < nChildren);
ppSortArray[i] = (CTreeItem*)pParent->m_listChild.GetAt(pos);
pParent->m_listChild.GetNext(pos);
}
qsort(ppSortArray, nChildren, sizeof(CTreeItem*), CompareChildren);
// reorg children with new sorted list
pos = pParent->m_listChild.GetHeadPosition();
for (i=0; pos; i++)
{
ASSERT(i < nChildren);
pParent->m_listChild.SetAt(pos, ppSortArray[i]);
pParent->m_listChild.GetNext(pos);
}
delete [] ppSortArray;
}
if(bSortChildren)
{
POSITION pos = pParent->m_listChild.GetHeadPosition();
while (pos)
{
CTreeItem *pChild = (CTreeItem*)pParent->m_listChild.GetNext(pos);
Sort(pChild, TRUE);
}
}
}
int CSuperGridCtrl::NumChildren(const CTreeItem *pItem) const
{
return pItem->m_listChild.GetCount();
}
BOOL CSuperGridCtrl::ItemHasChildren(const CTreeItem* pItem) const
{
return pItem->m_listChild.GetCount() != 0;
}
BOOL CSuperGridCtrl::IsCollapsed(const CTreeItem* pItem) const
{
return pItem->m_bHideChildren;
}
int CSuperGridCtrl::GetIndent(const CTreeItem* pItem) const
{
return pItem->m_nIndent;
}
void CSuperGridCtrl::SetIndent(CTreeItem *pItem, int iIndent)
{
pItem->m_nIndent = iIndent;
}
void CSuperGridCtrl::Hide(CTreeItem* pItem, BOOL bFlag)
{
pItem->m_bHideChildren=bFlag;
}
int CSuperGridCtrl::GetCurIndex(const CTreeItem *pItem) const
{
return pItem->m_nIndex;
}
void CSuperGridCtrl::SetCurIndex(CTreeItem* pItem, int nIndex)
{
pItem->m_nIndex = nIndex;
}
void CSuperGridCtrl::SetParentItem(CTreeItem*pItem, CTreeItem* pParent)
{
pItem->m_pParent=pParent;
}
CSuperGridCtrl::CTreeItem* CSuperGridCtrl::GetParentItem(const CTreeItem* pItem)
{
return pItem->m_pParent;
};
CItemInfo* CSuperGridCtrl::GetData(const CTreeItem* pItem)
{
return pItem->m_lpNodeInfo;
}
void CSuperGridCtrl::UpdateData(CTreeItem* pItem, CItemInfo* lpInfo)
{
pItem->m_lpNodeInfo = lpInfo;
}
//override
CItemInfo* CSuperGridCtrl::CopyData(CItemInfo* lpSrc)
{
ASSERT(FALSE);//debug
return NULL; //release
}
//////////////////////////////////////////////////////////////////////////
//
// not much but ...
//
CSuperGridCtrl::CTreeItem::~CTreeItem()
{
// delete child nodes
POSITION pos = m_listChild.GetHeadPosition();
while (pos != NULL)
{
CTreeItem* pItem =(CTreeItem*)m_listChild.GetNext(pos);
if(pItem!=NULL)
{
if(pItem->m_lpNodeInfo!=NULL)
delete pItem->m_lpNodeInfo;
delete pItem;
}
}
m_listChild.RemoveAll();
}
void CSuperGridCtrl::DeleteOneItem(bool bSelected)
{
if (GetItemCount()==0)
return;
int nItem;
if (bSelected)
nItem = GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);
else
nItem = 0;
if(nItem!=-1)
{
CTreeItem*pSelItem = reinterpret_cast<CTreeItem*>(GetItemData(nItem));
if(pSelItem!=NULL)
{
SetRedraw(0);
DeleteItem(nItem);//delete cur item in listview
//delete/hide all children in pSelItem
HideChildren(pSelItem, TRUE, nItem);
//delete all internal nodes
Delete(pSelItem);
InternaleUpdateTree();
if(nItem-1<0)//no more items in list
{
if(GetData(m_pRoot)!=NULL)
delete GetData(m_pRoot);
delete m_pRoot;
m_pRoot = NULL;
SetRedraw(1);
InvalidateRect(NULL);
UpdateWindow();
return;
}
UINT uflag = LVIS_SELECTED | LVIS_FOCUSED;
CRect rcTestIfItemIsValidToSelectOtherWiseSubtrackOneFromItem;//just to get the documention right :)
GetItemRect(nItem, rcTestIfItemIsValidToSelectOtherWiseSubtrackOneFromItem ,LVIR_LABEL) ? SetItemState(nItem, uflag, uflag) : SetItemState(nItem-1, uflag, uflag);
SetRedraw(1);
InvalidateRect(NULL);
UpdateWindow();
//why not call DeleteItemEx(pSelItem,nItem); :-)
}
}
}
void CSuperGridCtrl::OnRButtonDown(UINT nFlags, CPoint point)
{
CListCtrl::OnRButtonDown(nFlags, point);
//Update owner
//GetOwner()->SendMessage(WM_FOLDER_SELECTED, 0,0);
}
void CSuperGridCtrl::RedrawOpenedItems(CTreeItem* pItem)
{
//if (!IsCollapsed(pItem))
{
CTreeItem *pCur, *pLast;
pLast = pItem;
CDWordArray wordArray;
//GetNext ....loop through all children
for(;;)
{
pCur= GetNextSiblingItem(pLast, TRUE, TRUE/*regardless of the item are hidden or not, set to TRUE if only visible items must be included in the search*/);
if(!IsChildOf(pItem, pCur))
break;
else if(pCur==pLast)
break;
if (!IsCollapsed(pCur))
{
wordArray.Add((DWORD)pCur);
RedrawOpenedItems(pCur);
}
pLast=pCur;//next;
}
Collapse(pItem);
Expand(pItem, GetCurIndex(pItem));
int nSize = wordArray.GetSize();
for (int i=0;i<nSize; i++)
{
pCur = (CTreeItem*)wordArray.GetAt(i);
Expand(pCur, GetCurIndex(pCur));
}
wordArray.RemoveAll();
}
}
void CSuperGridCtrl::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
GetOwner()->SendMessage(WM_FOLDER_SELECTED, 0,0);
*pResult = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -