⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tltree.c

📁 vc环境下的pgp源码
💻 C
📖 第 1 页 / 共 2 页
字号:
//: TreeList Tree linked list management routines
//
//	$Id: TLTree.c,v 1.18.4.1 1999/06/10 17:30:04 pbj Exp $
//

#include "TLintern.h"


//----------------------------------------------------|
//  Remove the specified item from the tree linked list

static VOID 
sRemoveItemFromTree (
		TLWndData* pWD, 
		TLTreeItem* p) 
{
	if (p->prevItem) 
		p->prevItem->nextItem = p->nextItem;
	else if (p->parentItem) 
		p->parentItem->childItem = p->nextItem;
	else 
		pWD->rootItem = p->nextItem;

	if (p->nextItem) 
		p->nextItem->prevItem = p->prevItem;

	if (p->parentItem) 
		p->parentItem->cChildren--;

	p->nextItem = NULL;
	p->prevItem = NULL;
}


//----------------------------------------------------|
//  Reinsert Tree item into list

HTLITEM TLReInsertTreeItem (TLWndData* pWD, LPTL_INSERTSTRUCT lpIns) {
	TLTreeItem* lpNew;

	if (lpIns->item.hItem) {
		lpNew = (TLTreeItem*)(lpIns->item.hItem);
		sRemoveItemFromTree (pWD, lpNew);
		return TLInsertTreeItem (pWD, lpIns);
	}

	return NULL;
}


//----------------------------------------------------|
//  Insert Tree item into list

HTLITEM TLInsertTreeItem (TLWndData* pWD, LPTL_INSERTSTRUCT lpIns) {
	TLTreeItem* lpParent;
	TLTreeItem* lpPrev;
	TLTreeItem* lpNew;
	TLListItem* pli;
	int i;

	// allocate new linked list structure if needed
	if (!lpIns->item.hItem) {
		lpNew = TLAlloc (sizeof (TLTreeItem));
		if (!lpNew) return NULL;
		lpNew->state = 0;
		lpNew->childItem = NULL;
		lpNew->listItem = NULL;
		lpNew->cChildren = 0;
	}
	else {
		lpNew = (TLTreeItem*)(lpIns->item.hItem);
	}

	// get parent item
	lpParent = (TLTreeItem*)lpIns->hParent;
	lpNew->parentItem = lpParent;

	// Insert item into list at appropriate spot
	if (lpParent) {

	//not a root item
		if (lpIns->hInsertAfter == TLI_FIRST) {
			lpNew->nextItem = lpParent->childItem;
			if (lpNew->nextItem) lpNew->nextItem->prevItem = lpNew;
			lpParent->childItem = lpNew;
			lpNew->prevItem = NULL;
		}
		else if (lpIns->hInsertAfter == TLI_LAST) {
			lpPrev = lpParent->childItem;
			if (lpPrev) {
				while (lpPrev->nextItem) lpPrev = lpPrev->nextItem;
				lpPrev->nextItem = lpNew;
				lpNew->prevItem = lpPrev;
				lpNew->nextItem = NULL;
			}
			else {
				lpParent->childItem = lpNew;
				lpNew->nextItem = NULL;
				lpNew->prevItem = NULL;
			}
		}
		else if (lpIns->hInsertAfter == TLI_SORT) {
			lpPrev = lpParent->childItem;
			if (!lpPrev) {
				lpParent->childItem = lpNew;
				lpNew->nextItem = NULL;
				lpNew->prevItem = NULL;
			}
			else {
				if (lstrcmp (lpPrev->pszText, lpIns->item.pszText) >= 0) {
					lpNew->nextItem = lpParent->childItem;
					if (lpNew->nextItem) lpNew->nextItem->prevItem = lpNew;
					lpParent->childItem = lpNew;
					lpNew->prevItem = NULL;
				}
				else {
					while (lpPrev->nextItem && 
						(lstrcmp (lpPrev->nextItem->pszText, 
								  lpIns->item.pszText) < 0)) 
						lpPrev = lpPrev->nextItem;
					lpNew->nextItem = lpPrev->nextItem;
					if (lpNew->nextItem) lpNew->nextItem->prevItem = lpNew;
					lpPrev->nextItem = lpNew;
					lpNew->prevItem = lpPrev;
				}
			}
		}
		else if (lpIns->hInsertAfter == TLI_SORTREVERSE) {
			lpPrev = lpParent->childItem;
			if (!lpPrev) {
				lpParent->childItem = lpNew;
				lpNew->nextItem = NULL;
				lpNew->prevItem = NULL;
			}
			else {
				if (lstrcmp (lpPrev->pszText, lpIns->item.pszText) <= 0) {
					lpNew->nextItem = lpParent->childItem;
					if (lpNew->nextItem) lpNew->nextItem->prevItem = lpNew;
					lpParent->childItem = lpNew;
					lpNew->prevItem = NULL;
				}
				else {
					while (lpPrev->nextItem && 
						(lstrcmp (lpPrev->nextItem->pszText, 
								  lpIns->item.pszText) > 0)) 
						lpPrev = lpPrev->nextItem;
					lpNew->nextItem = lpPrev->nextItem;
					if (lpNew->nextItem) lpNew->nextItem->prevItem = lpNew;
					lpPrev->nextItem = lpNew;
					lpNew->prevItem = lpPrev;
				}
			}
		}
		else {
			lpPrev = (TLTreeItem*)lpIns->hInsertAfter;
			if (lpPrev) {
				lpNew->prevItem = lpPrev;
				lpNew->nextItem = lpPrev->nextItem;
				lpPrev->nextItem = lpNew;
				if (lpNew->nextItem) lpNew->nextItem->prevItem = lpNew;
			}
		}

		lpParent->cChildren++;
	}

	// this is a root item
	else {
		if (lpIns->hInsertAfter == TLI_FIRST) {
			lpNew->nextItem = pWD->rootItem;
			if (lpNew->nextItem) lpNew->nextItem->prevItem = lpNew;
			lpNew->prevItem = NULL;
			pWD->rootItem = lpNew;
		}
		else if (lpIns->hInsertAfter == TLI_LAST) {
			lpPrev = pWD->rootItem;
			if (lpPrev) {
				while (lpPrev->nextItem) lpPrev = lpPrev->nextItem;
				lpPrev->nextItem = lpNew;
				lpNew->prevItem = lpPrev;
				lpNew->nextItem = NULL;
			}
			else {
				pWD->rootItem = lpNew;
				lpNew->nextItem = NULL;
				lpNew->prevItem = NULL;
			}
		}
		else if (lpIns->hInsertAfter == TLI_SORT) {
			lpPrev = pWD->rootItem;
			if (!lpPrev) {
				pWD->rootItem = lpNew;
				lpNew->nextItem = NULL;
				lpNew->prevItem = NULL;
			}
			else {
				if (lstrcmp (lpPrev->pszText, lpIns->item.pszText) >= 0) {
					lpNew->nextItem = pWD->rootItem;
					if (lpNew->nextItem) lpNew->nextItem->prevItem = lpNew;
					pWD->rootItem = lpNew;
					lpNew->prevItem = NULL;
				}
				else {
					while (lpPrev->nextItem && 
						(lstrcmp (lpPrev->nextItem->pszText, 
								  lpIns->item.pszText) < 0)) 
						lpPrev = lpPrev->nextItem;
					lpNew->nextItem = lpPrev->nextItem;
					if (lpNew->nextItem) lpNew->nextItem->prevItem = lpNew;
					lpPrev->nextItem = lpNew;
					lpNew->prevItem = lpPrev;
				}
			}		
		}
		else if (lpIns->hInsertAfter == TLI_SORTREVERSE) {
			lpPrev = pWD->rootItem;
			if (!lpPrev) {
				pWD->rootItem = lpNew;
				lpNew->nextItem = NULL;
				lpNew->prevItem = NULL;
			}
			else {
				if (lstrcmp (lpPrev->pszText, lpIns->item.pszText) <= 0) {
					lpNew->nextItem = pWD->rootItem;
					if (lpNew->nextItem) lpNew->nextItem->prevItem = lpNew;
					pWD->rootItem = lpNew;
					lpNew->prevItem = NULL;
				}
				else {
					while (lpPrev->nextItem && 
						(lstrcmp (lpPrev->nextItem->pszText, 
								  lpIns->item.pszText) > 0)) 
						lpPrev = lpPrev->nextItem;
					lpNew->nextItem = lpPrev->nextItem;
					if (lpNew->nextItem) lpNew->nextItem->prevItem = lpNew;
					lpPrev->nextItem = lpNew;
					lpNew->prevItem = lpPrev;
				}
			}		
		}
		else {
			lpPrev = (TLTreeItem*)lpIns->hInsertAfter;
			if (lpPrev) {
				lpNew->prevItem = lpPrev;
				lpNew->nextItem = lpPrev->nextItem;
				lpPrev->nextItem = lpNew;
				if (lpNew->nextItem) lpNew->nextItem->prevItem = lpNew;
			}
		}

	}

	// only do the following if this is a new item
	if (!lpIns->item.hItem) {		
		if (lpIns->item.mask & TLIF_TEXT) {
			lpNew->pszText = TLAlloc (lstrlen (lpIns->item.pszText) +1);
			if (lpNew->pszText) lstrcpy (lpNew->pszText, lpIns->item.pszText);
		}
		else lpNew->pszText = NULL;
	
		if (lpIns->item.mask & TLIF_IMAGE) lpNew->iImage = lpIns->item.iImage;
		else lpNew->iImage = 0;
	
		if (lpIns->item.mask & TLIF_PARAM) lpNew->lParam = lpIns->item.lParam;
		else lpNew->lParam = 0;
	
		if (lpIns->item.mask & TLIF_STATE) {
			lpNew->state &= ~lpIns->item.stateMask;
			lpNew->state |= (lpIns->item.stateMask & lpIns->item.state);
		}
	
		if (pWD->iNumberColumns > 1) {
			lpNew->listItem = TLAlloc (sizeof (TLListItem));
			pli = lpNew->listItem;
			for (i=2; i<pWD->iNumberColumns; i++) {
				pli->nextItem = TLAlloc (sizeof (TLListItem));
				pli = pli->nextItem;
			}
		}
	}

	return (HTLITEM)lpNew;

}


//----------------------------------------------------|
//  Delete all children of item

BOOL TLDeleteChildren (TLWndData* pWD, TL_TREEITEM* lpti) {
	TLTreeItem* p;

	p = (TLTreeItem*) lpti->hItem;
	if (!p) return FALSE;

	if (p->childItem) {
		TLDeleteTreeList (pWD, p->childItem);
		p->childItem = NULL;
		p->cChildren = 0;
		return TRUE;
	}
	else
		return FALSE;
}


//----------------------------------------------------|
//  Delete Tree item

BOOL TLDeleteTreeItem (TLWndData* pWD, TL_TREEITEM* lpti) {
	TLTreeItem* p;
	TLListItem* pli;
	TLListItem* opli;

	p = (TLTreeItem*) lpti->hItem;
	if (!p) return FALSE;

	sRemoveItemFromTree (pWD, p);

	if (p->childItem) TLDeleteTreeList (pWD, p->childItem);

	if (pWD->focusItem == p) pWD->focusItem = NULL;
	if (pWD->firstSelectItem == p) pWD->firstSelectItem = NULL;

	pli = p->listItem;
	while (pli) {
		TLFree (pli->pszText);
		opli = pli;
		pli = pli->nextItem;
		TLFree (opli);
	}

	TLFree (p->pszText);
	TLFree (p);

	return TRUE;
}


//----------------------------------------------------|
//  Get Tree item information

BOOL TLGetTreeItem (TLWndData* pWD, TL_TREEITEM* lpti) {
	TLTreeItem* p;

	p = (TLTreeItem*) lpti->hItem;
	if (!p) return FALSE;

	if (lpti->mask & TLIF_TEXT) {
		if (lpti->cchTextMax > lstrlen (p->pszText)) 
			lstrcpy (lpti->pszText, p->pszText);
		else {
			lpti->pszText = NULL;
			return FALSE;
		}
	}

	if (lpti->mask & TLIF_IMAGE) lpti->iImage = p->iImage;

	if (lpti->mask & TLIF_PARAM) lpti->lParam = p->lParam;

	if (lpti->mask & TLIF_STATE) lpti->state = p->state;

	if (lpti->mask & TLIF_NEXTHANDLE) lpti->hItem = (HTLITEM)p->nextItem;
	else if (lpti->mask & TLIF_PREVHANDLE) lpti->hItem = (HTLITEM)p->prevItem;
	else if (lpti->mask & TLIF_PARENTHANDLE) lpti->hItem = 
												(HTLITEM)p->parentItem;
	else if (lpti->mask & TLIF_CHILDHANDLE) lpti->hItem = 
												(HTLITEM)p->childItem;

	return TRUE;
}


//----------------------------------------------------|
//  Set Tree item information

BOOL TLSetTreeItem (TLWndData* pWD, TL_TREEITEM* lpti) {
	TLTreeItem* p;

	p = (TLTreeItem*) lpti->hItem;
	if (!p) return FALSE;

	if (lpti->mask & TLIF_TEXT) {
		p->pszText = TLReAlloc (p->pszText, lstrlen (lpti->pszText) +1);
		lstrcpy (p->pszText, lpti->pszText);
	}

	if (lpti->mask & TLIF_IMAGE) p->iImage = lpti->iImage;

	if (lpti->mask & TLIF_PARAM)  p->lParam = lpti->lParam;

	if (lpti->mask & TLIF_STATE) {
		p->state &= ~(lpti->stateMask);
		p->state |= (lpti->state & lpti->stateMask);
	}

	TLInvalidateItem (pWD, p);
	return TRUE;
}


//----------------------------------------------------|
//  Deselect Tree

BOOL TLDeselectTree (TLWndData* pWD, TLTreeItem* p, TLTreeItem* pExcept) {
	BOOL bDeselected = FALSE;

	while (p) {
		if (p->childItem) 
			bDeselected = TLDeselectTree (pWD, p->childItem, pExcept);
		if (p != pExcept) {
			if (p->state & TLIS_SELECTED) {
				p->state &= ~TLIS_SELECTED;
				pWD->iNumberSelected--;
				TLInvalidateItem (pWD, p);
				bDeselected = TRUE;
			}
			if (p->state & TLIS_FOCUSED) {
				p->state &= ~TLIS_FOCUSED;
				pWD->nmTreeList.flags = 0;
				pWD->nmTreeList.itemOld.hItem = NULL;
				pWD->nmTreeList.itemNew.hItem = NULL;
				pWD->nmTreeList.itemNew.state = 0;
				pWD->nmTreeList.hdr.code = TLN_SELCHANGED;
				SendMessage (pWD->hWndParent, WM_NOTIFY, pWD->id, 
								(LPARAM)&(pWD->nmTreeList));
			}
		}
		p = p->nextItem;
	}
	return bDeselected;
}


//----------------------------------------------------|
//  Expand Tree

void TLExpandTree (TLTreeItem* p) {
	while (p) {
		if (p->childItem) {
			p->state |= TLIS_EXPANDED;
			TLExpandTree (p->childItem);
		}
		p = p->nextItem;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -