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

📄 gmnotprc.c

📁 PGP8.0源码 请认真阅读您的文件包然后写出其具体功能
💻 C
字号:
/*____________________________________________________________________________
	Copyright (C) 2002 PGP Corporation
	All rights reserved.
	
	GMNotProc - notification processing and associated routines
	
	$Id: GMNotPrc.c,v 1.10 2002/11/19 14:11:29 pbj Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"

// project header files
#include "PGPgmx.h"
#include "PGPkeysx.h"

// constant definitions
#define STATUS_MSG_PANE 1

// External globals
extern HINSTANCE g_hinst;

// typedefs
typedef struct {
	FARPROC	pfnCallback;
	INT		iObjectCount;
} SELOBJECTCOUNT;


//	________________________________________
//
//  Count a single object
//
//	lptli	= pointer to TreeList item to delete

static BOOL CALLBACK 
sCountSingleObject (
		TL_TREEITEM*	lptli, 
		LPARAM			lParam) 
{
	SELOBJECTCOUNT*	psoc = (SELOBJECTCOUNT*)lParam;
	++(psoc->iObjectCount);
	return TRUE;
}

//	____________________________________________
//
//  Update status bar text on basis of selection

static VOID 
sUpdateStatusBarText (PGROUPMAN pGM) 
{
	CHAR sz1[128];
	CHAR sz2[128];
	INT ids;
	SELOBJECTCOUNT soc;

	if (!pGM->hwndStatusBar) 
		return;

	switch (pGM->uSelectedFlags) {
		case 0 :				ids = 0;					break;
		case PGPGM_GROUPFLAG :	ids = IDS_GROUPSELECTED;	break;
		case PGPGM_KEYFLAG :	ids = IDS_KEYSELECTED;		break;
		default :				ids = IDS_MULTISELECTED;	break;
	}

	if (pGM->bMultipleSelected) 
	{
		soc.pfnCallback = sCountSingleObject;
		soc.iObjectCount = 0;
		TreeList_IterateSelected (pGM->hwndTree, &soc);
	}
	else 
		soc.iObjectCount = 1;

	if (ids) 
	{
		LoadString (g_hinst, ids, sz1, sizeof(sz1));
		wsprintf (sz2, sz1, soc.iObjectCount);
	}
	else
		lstrcpy (sz2, "");

	SendMessage (pGM->hwndStatusBar,
			SB_SETTEXT, STATUS_MSG_PANE, (LPARAM)sz2);
}

//	________________________________________
//
//  Set handle of selected item.
//  Type and pointer to object are retrieved from 
//  TreeList as imagelist index.

VOID 
GMSetFocus (
		PGROUPMAN	pGM, 
		HTLITEM		hFocused, 
		BOOL		bMultiple,
		BOOL		bDragging) 
{
	TL_TREEITEM tli;

	pGM->hFocusedItem = hFocused;
	pGM->bMultipleSelected = bMultiple;

	if (!bMultiple) 
		pGM->uSelectedFlags = 0;

	if (hFocused) 
	{ 
		tli.hItem = hFocused;
		tli.mask = TLIF_IMAGE | TLIF_PARAM;
		if (!TreeList_GetItem (pGM->hwndTree, &tli)) 
			return;
		pGM->iFocusedItemType = tli.iImage;
		pGM->pFocusedObject = (void*)tli.lParam;

		switch (pGM->iFocusedItemType) {
			case IDX_NONE : 
				pGM->iFocusedObjectType = OBJECT_NONE; 
				break;

			case IDX_RSAPUBKEY :
			case IDX_RSAPUBDISKEY :
			case IDX_RSAPUBREVKEY :
			case IDX_RSAPUBEXPKEY :
			case IDX_RSASECKEY :
			case IDX_RSASECDISKEY :
			case IDX_RSASECREVKEY :
			case IDX_RSASECEXPKEY :
			case IDX_RSASECSHRKEY :
			case IDX_DSAPUBKEY :
			case IDX_DSAPUBDISKEY :
			case IDX_DSAPUBREVKEY :
			case IDX_DSAPUBEXPKEY :
			case IDX_DSASECKEY :
			case IDX_DSASECDISKEY :
			case IDX_DSASECREVKEY :
			case IDX_DSASECEXPKEY : 
			case IDX_DSASECSHRKEY :
			case IDX_RSAV4PUBKEY :
			case IDX_RSAV4PUBDISKEY :
			case IDX_RSAV4PUBREVKEY :
			case IDX_RSAV4PUBEXPKEY :
			case IDX_RSAV4SECKEY :
			case IDX_RSAV4SECDISKEY :
			case IDX_RSAV4SECREVKEY :
			case IDX_RSAV4SECEXPKEY :
			case IDX_RSAV4SECSHRKEY :
			case IDX_RSATOKKEY :
			case IDX_RSATOKDISKEY :
			case IDX_RSATOKREVKEY :
			case IDX_RSATOKEXPKEY :
			case IDX_RSAV4TOKKEY :
			case IDX_RSAV4TOKDISKEY :
			case IDX_RSAV4TOKREVKEY :
			case IDX_RSAV4TOKEXPKEY :
			case IDX_ECPUBKEY :
			case IDX_ECPUBDISKEY :
			case IDX_ECPUBREVKEY :
			case IDX_ECPUBEXPKEY :
			case IDX_ECSECKEY :
			case IDX_ECSECDISKEY :
			case IDX_ECSECREVKEY :
			case IDX_ECSECEXPKEY :
			case IDX_ECSECSHRKEY :
				pGM->iFocusedObjectType = OBJECT_KEY; 
				pGM->uSelectedFlags |= PGPGM_KEYFLAG;
				break;

			case IDX_GROUP :
				pGM->iFocusedObjectType = OBJECT_GROUP; 
				pGM->uSelectedFlags |= PGPGM_GROUPFLAG;
				break;
		}
	}
	else 
	{
		pGM->iFocusedItemType = IDX_NONE;
		pGM->iFocusedObjectType = OBJECT_NONE;
		pGM->pFocusedObject = NULL;
	}

	if (!bDragging)
		sUpdateStatusBarText (pGM);
}

//	________________________________________
//
//	Get type of focused item

INT 
GMFocusedItemType (PGROUPMAN pGM) 
{
	return pGM->iFocusedItemType;
}

//	________________________________________
//
//	Get type of focused object

INT 
GMFocusedObjectType (PGROUPMAN pGM) 
{
	return pGM->iFocusedObjectType;
}

//	________________________________________
//
//	Get handle of focused item

HTLITEM 
GMFocusedItem (PGROUPMAN pGM) 
{
	return pGM->hFocusedItem;
}

//	________________________________________
//
//	Get pointer to focused object

VOID* GMFocusedObject (PGROUPMAN pGM) 
{
	return pGM->pFocusedObject;
}

//	________________________________________
//
//	Get type of focused object

BOOL 
GMMultipleSelected (PGROUPMAN pGM) 
{
	return pGM->bMultipleSelected;
}

//	________________________________________
//
//	Get type of focused object

UINT 
GMSelectedFlags (PGROUPMAN pGM) 
{
	return pGM->uSelectedFlags;
}

//	___________________________________________________
//
//	Return TRUE if more than one type of object selected

BOOL 
GMPromiscuousSelected (PGROUPMAN pGM) 
{
	if (!pGM->bMultipleSelected) 
		return FALSE;

	switch (pGM->uSelectedFlags) {
	case 0 :
	case PGPGM_KEYFLAG :
	case PGPGM_GROUPFLAG :
		return FALSE;

	default :
		return TRUE;
	}
}

//	___________________________________________________
//
//  create drag image

static VOID 
sBeginDrag (PGROUPMAN pGM) 
{
	HIMAGELIST			hIml;
	TL_DRAGBITMAP		tldb;
	NONCLIENTMETRICS	ncm;
	DWORD				dwPos;
	POINTS				pts;

	// get offset number to convert client to window coordinates
	ncm.cbSize = sizeof(NONCLIENTMETRICS);
	SystemParametersInfo (SPI_GETNONCLIENTMETRICS, 
			sizeof(NONCLIENTMETRICS), &ncm, 0);
	pGM->iXCursorOffset = ncm.iBorderWidth;
	pGM->iYCursorOffset = ncm.iBorderWidth + ncm.iCaptionHeight;
	if (GetMenu (pGM->hwndParent))
		pGM->iYCursorOffset += ncm.iMenuHeight;

	dwPos = GetMessagePos ();
	pts = MAKEPOINTS (dwPos);
	tldb.ptCursorPos.x = pts.x;
	tldb.ptCursorPos.y = pts.y;
	ScreenToClient (pGM->hwndTree, &tldb.ptCursorPos);

	tldb.ulFlags = 0;
	TreeList_RenderDragBitmap (pGM->hwndTree, &tldb);
	hIml = ImageList_Create (tldb.sizeDrag.cx, 
			tldb.sizeDrag.cy, ILC_MASK|ILC_COLORDDB, 1, 1);
	ImageList_AddMasked (hIml, tldb.hbmDrag, GetSysColor (COLOR_WINDOW));
	DeleteObject (tldb.hbmDrag);
 
	ImageList_BeginDrag (hIml, 0, tldb.ptHotSpot.x, tldb.ptHotSpot.y);
	ImageList_Destroy (hIml);

	ImageList_DragEnter (pGM->hwndParent, 
			tldb.ptCursorPos.x, tldb.ptCursorPos.y);
}

static VOID
sEndDrag (PGROUPMAN pGM) 
{
	ImageList_DragLeave (pGM->hwndParent);
	ImageList_EndDrag ();
}

//	___________________________________________________
//
//  reorder columns according to new header order

static VOID  
sReorderColumns (PGROUPMAN pGM)
{
	INT		iOrderArray[NUMBERFIELDS];
	WORD	wColumnField[NUMBERFIELDS];
	INT		i, iNumCols;

	// save order
	GMSetColumnPreferences (pGM);
	iNumCols = 1;
	for (i=0; i<NUMBERFIELDS; i++) 
	{
		wColumnField[i] = pGM->wColumnField[i];
		if (wColumnField[i]) 
			iNumCols++;
	}

	TreeList_GetOrderArray (pGM->hwndTree, iNumCols, &iOrderArray);

	for (i=0; i<iNumCols; i++) 
	{
		pGM->wColumnField[i] = wColumnField[iOrderArray[i]];
	}

	TreeList_DeleteTree (pGM->hwndTree, TRUE);
	TreeList_DeleteAllColumns (pGM->hwndTree);
	InvalidateRect (pGM->hwndTree, NULL, TRUE);
	UpdateWindow (pGM->hwndTree);
	GMAddColumns (pGM);
	GMLoadGroupsIntoTree (pGM, FALSE, FALSE, TRUE);
	InvalidateRect (pGM->hwndTree, NULL, TRUE);

	GMSetColumnPreferences (pGM);
}

//	___________________________________________________
//
//  Group manager notification processing procedure

PGPError PGPgmExport 
PGPgmDefaultNotificationProc (
		HGROUPMAN	hGM, 
		LPARAM		lParam) 
{
	PGROUPMAN	pGM = (PGROUPMAN)hGM;

	static BOOL	bMultiple;
	HTLITEM		hFocused;
	INT			iField;
	POINT		pt;

	if (!hGM) 
		return kPGPError_BadParams;

	switch (((LPNM_TREELIST)lParam)->hdr.code) {

	case TLN_SELCHANGED :
		bMultiple = (((LPNM_TREELIST)lParam)->flags & TLC_MULTIPLE);
		hFocused = ((LPNM_TREELIST)lParam)->itemNew.hItem;
		GMSetFocus (pGM, hFocused, bMultiple, FALSE);
		((LPNM_TREELIST)lParam)->flags = GMSelectedFlags (pGM);
		break;

	case TLN_ITEMDBLCLICKED :
		if (PGPgmIsActionEnabled (hGM, GM_PROPERTIES)) 
		{
			PGPgmPerformAction (hGM, GM_LOCATEKEYS);
			PKObjectProperties (pGM->ppks); 
		}
		break;

	case TLN_DRAGGEDOVER :
		hFocused = ((LPNM_TREELIST)lParam)->itemNew.hItem;
		if (GMFocusedItem (pGM) != hFocused) 
		{
			GMSetFocus (pGM, hFocused, bMultiple, TRUE);
			((LPNM_TREELIST)lParam)->flags = GMSelectedFlags (pGM);

			ImageList_DragLeave (pGM->hwndParent);
			TreeList_Invalidate (pGM->hwndTree, FALSE);
			UpdateWindow (pGM->hwndTree);
			ImageList_DragEnter (pGM->hwndParent, 0, 0);
		}
		pt = ((LPNM_TREELIST)lParam)->ptDrag;
		MapWindowPoints (pGM->hwndTree, pGM->hwndParent, &pt, 1);
		ImageList_DragMove (pt.x + pGM->iXCursorOffset, 
							pt.y + pGM->iYCursorOffset);
		break;

	case TLN_AUTOSCROLLED :
		ImageList_DragLeave (pGM->hwndParent);
		InvalidateRect (pGM->hwndTree, NULL, TRUE);
		UpdateWindow (pGM->hwndTree);
		ImageList_DragEnter (pGM->hwndParent, 0, 0);
		break;

	case TLN_KEYDOWN :
		switch (((TL_KEYDOWN*)lParam)->wVKey) {
		case VK_DELETE :
			GMDeleteObject (pGM);
			break;
		}
		break;

	case TLN_CONTEXTMENU :
		((LPNM_TREELIST)lParam)->flags = GMSelectedFlags (pGM);
		break;

	case TLN_HEADERREORDERED :
		sReorderColumns (pGM);
		break;

	case TLN_BEGINDRAG :
		pGM->hFocusedItemDragging = GMFocusedItem (pGM);
		PKEnableDropTarget (pGM->pDropTarget, FALSE);
		sBeginDrag (pGM);
		break;

	case TLN_DROP :
	{
		TL_TREEITEM		tli;

		if (((LPNM_TREELIST)lParam)->index) 
			GMAddSelectedToFocused (pGM);
		sEndDrag (pGM);
		PKEnableDropTarget (pGM->pDropTarget, TRUE);
		GMSetFocus (pGM, pGM->hFocusedItemDragging, bMultiple, FALSE);

		tli.hItem = pGM->hFocusedItemDragging;
		TreeList_Select (pGM->hwndTree, &tli, FALSE);
		SetFocus (pGM->hwndTree);
		break;
	}

	case TLN_HEADERCLICKED :
		iField = pGM->wColumnField[((LPNM_TREELIST)lParam)->index];
		switch (iField) {
			case GMI_NAME : 
				if (pGM->lKeyListSortField == kPGPKeyOrdering_UserID)
					pGM->bSortReverse = TRUE;
				else 
				{
					pGM->lKeyListSortField = kPGPKeyOrdering_UserID;
					pGM->bSortReverse = FALSE;
				}
				break;

			case GMI_VALIDITY :
				if (pGM->lKeyListSortField == kPGPKeyOrdering_Validity)
					pGM->bSortReverse = TRUE;
				else 
				{
					pGM->lKeyListSortField = kPGPKeyOrdering_Validity;
					pGM->bSortReverse = FALSE;
				}
				break;

			default : break;
		}

		TreeList_DeleteTree (pGM->hwndTree, FALSE);
		InvalidateRect (pGM->hwndTree, NULL, TRUE);
		UpdateWindow (pGM->hwndTree);
		GMSortGroupSet (pGM);
		GMLoadGroupsIntoTree (pGM, TRUE, FALSE, FALSE);
		InvalidateRect (pGM->hwndTree, NULL, TRUE);
		break;
	}

	return 0;
}

⌨️ 快捷键说明

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