clselect.c

来自「PGP8.0源码 请认真阅读您的文件包然后写出其具体功能」· C语言 代码 · 共 488 行

C
488
字号
/*____________________________________________________________________________
	Copyright (C) 2002 PGP Corporation
	All rights reserved.

	CLselect.c - key selection dialog
	
	$Id: CLselect.c,v 1.15 2002/08/06 20:09:20 dallen Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"

// project header files
#include "PGPclx.h"
#include "PGPklx.h"

// system header files
#include <zmouse.h>

// External globals
extern HINSTANCE	g_hInst;
extern UINT			g_uMouseWheelMessage;

typedef struct {
	PGPContextRef		context;
	PGPtlsContextRef	tlscontext;
	LPSTR				pszPrompt;
	PGPKeySetRef		keysetToDisplay;
	PGPKeyDBRef			keydbMain;
	PGPKeySetRef		keysetSelected;
	HKEYLIST			hKL;
	PGPclKeyListConfig	klConfig;
	HWND				hwndTree;
	INT					iyOffset;
	INT					iyTop;
	UINT				uFlags;
} SELECTSTRUCT;

#define IDC_QUERYTREELIST		0x0101
#define BUTTONOFFSETY			10
#define DIALOGMINWIDTH			400

#define BOTTOM_BUTTON_OFFSET	10
#define BUTTON_SPACING			8
#define HOR_OFFSET				4

// local globals
static DWORD aIds[] = {			// Help IDs
	IDOK,				IDH_PGPKL_SELECT,
	IDC_SELECTALL,		IDH_PGPKL_SELECTSELALL,
	IDC_UNSELECTALL,	IDH_PGPKL_SELECTUNSELALL,
	IDC_QUERYTREELIST,	IDH_PGPKL_SELECTLIST,
	0,0 
}; 

//	___________________________________________________
//
//  Put up appropriate context menu on basis of selection flags.
//  Called in response to right mouse click.
//
//	hwnd		= handle of parent window
//	uSelFlags	= bits indicate what types of objects are selected
//	x, y		= mouse position when right button clicked (screen coords)

static VOID 
sQueryContextMenu (
		HWND		hwnd, 
		HKEYLIST	hKL, 
		UINT		uSelFlags, 
		INT			x, 
		INT			y) 
{
	HMENU		hMC;
	HMENU		hMenuTrackPopup;
	PKEYLIST	pKL = (PKEYLIST)hKL;

	switch (uSelFlags) {
	case kPGPclKeyList_Key :
		hMC = LoadMenu (g_hInst, MAKEINTRESOURCE (IDR_MENUIMPORT));
		break;

	default :
		hMC = NULL;
		break;
	}

	if (!hMC) return;
  	hMenuTrackPopup = GetSubMenu (hMC, 0);
	if (KLMultipleSelected (pKL)) 
	{
		EnableMenuItem (hMenuTrackPopup, IDM_KEYPROPERTIES, 
			MF_BYCOMMAND|MF_GRAYED);
	}

	TrackPopupMenu (hMenuTrackPopup, TPM_LEFTALIGN | TPM_RIGHTBUTTON,
					x, y, 0, hwnd, NULL);

	DestroyMenu (hMC);
}

//	____________________________________
//
//  get number of wheel scroll lines and pass to treelist controls

static VOID
sUpdateWheelScrollLines (SELECTSTRUCT* pss)
{
	UINT uLines;

	if (!SystemParametersInfo (SPI_GETWHEELSCROLLLINES, 0, &uLines, 0)) 
	{
		HWND hwnd = NULL;
		UINT umsg = 0;

		umsg = RegisterWindowMessage (MSH_SCROLL_LINES);
		hwnd = FindWindow (MSH_WHEELMODULE_CLASS, MSH_WHEELMODULE_TITLE);

		if (hwnd && umsg) 
			uLines = (UINT)SendMessage (hwnd, umsg, 0, 0);
	}

	TreeList_SetWheelScrollLines (pss->hwndTree, uLines);
}

//	____________________________________
//
//	we're resizing -- move all the buttons 

static VOID
sMoveButtons (
		HWND	hwnd,
		WORD	wXsize,
		WORD	wYsize)
{
	HDWP	hdwp; 
	INT		iButtonWidth, iButtonHeight;
	RECT	rc;

	GetWindowRect (GetDlgItem (hwnd, IDOK), &rc);
	iButtonWidth = rc.right - rc.left;
	iButtonHeight = rc.bottom - rc.top;

	hdwp = BeginDeferWindowPos (4);

	// position the "cancel" button
	DeferWindowPos (hdwp, 
		GetDlgItem (hwnd, IDCANCEL), NULL, 
		wXsize - HOR_OFFSET - iButtonWidth, 
		wYsize - BOTTOM_BUTTON_OFFSET - iButtonHeight, 
		0, 0, SWP_NOSIZE|SWP_NOZORDER);

	// position the "OK" button
	DeferWindowPos (hdwp, 
		GetDlgItem (hwnd, IDOK), NULL, 
		wXsize - HOR_OFFSET - BUTTON_SPACING - 2*iButtonWidth, 
		wYsize - BOTTOM_BUTTON_OFFSET - iButtonHeight, 
		0, 0, SWP_NOSIZE|SWP_NOZORDER);

	// position the "unselectall" button
	DeferWindowPos (hdwp, 
		GetDlgItem (hwnd, IDC_UNSELECTALL), NULL, 
		wXsize - HOR_OFFSET - 2*BUTTON_SPACING - 3*iButtonWidth, 
		wYsize - BOTTOM_BUTTON_OFFSET - iButtonHeight, 
		0, 0, SWP_NOSIZE|SWP_NOZORDER);

	// position the "selectall" button
	DeferWindowPos (hdwp, 
		GetDlgItem (hwnd, IDC_SELECTALL), NULL, 
		wXsize - HOR_OFFSET - 3*BUTTON_SPACING - 4*iButtonWidth, 
		wYsize - BOTTOM_BUTTON_OFFSET - iButtonHeight, 
		0, 0, SWP_NOSIZE|SWP_NOZORDER);

	EndDeferWindowPos(hdwp);
}

//	___________________________________________________
//
//  Select keys dialog message procedure

static BOOL CALLBACK 
sSelectKeysDlgProc (
		HWND	hwnd, 
		UINT	uMsg, 
		WPARAM	wParam, 
		LPARAM	lParam) 
{
	SELECTSTRUCT*	pss;

	switch (uMsg) {

	case WM_INITDIALOG :
	{
		PGPPrefRef	prefRef			= kInvalidPGPPrefRef;
		UINT		uFlags			= kPGPclKeyList_ShowSelection;
		HWND		hwndControl;
		PGPBoolean	b;
		RECT		rc;
		POINT		pt;
		INT			iy;

		SetWindowLong (hwnd, GWL_USERDATA, lParam);
		pss = (SELECTSTRUCT*)lParam;

		// set window title
		hwndControl = GetDlgItem (hwnd, IDC_PROMPT);
		SetWindowText (hwndControl, pss->pszPrompt);

		// create keymanager window
		GetWindowRect (hwndControl, &rc);
		pt.x = rc.left;
		pt.y = rc.bottom;
		ScreenToClient (hwnd, &pt);
		pss->iyTop = pt.y;

		hwndControl = GetDlgItem (hwnd, IDC_SELECTALL);
		GetWindowRect (hwndControl, &rc);
		pt.x = rc.left;
		pt.y = rc.top;
		ScreenToClient (hwnd, &pt);
		iy = pt.y;
		GetClientRect (hwnd, &rc);
		pss->iyOffset = rc.bottom - (iy - BUTTONOFFSETY) + pss->iyTop;

		if (pss->uFlags & kPGPclSingleSelection)
		{
			ShowWindow (GetDlgItem (hwnd, IDC_SELECTALL), SW_HIDE);
			EnableWindow (GetDlgItem (hwnd, IDC_SELECTALL), FALSE);
			ShowWindow (GetDlgItem (hwnd, IDC_UNSELECTALL), SW_HIDE);
			EnableWindow (GetDlgItem (hwnd, IDC_UNSELECTALL), FALSE);
			uFlags |= kPGPclKeyList_SingleSelection;
		}

		pss->hKL = PGPclKeyListCreate (pss->context, pss->tlscontext,
				hwnd, IDC_QUERYTREELIST, 
				0, pss->iyTop, rc.right-rc.left, rc.bottom-pss->iyOffset,
				uFlags, &pss->hwndTree);

		// configure key manager window
		pss->klConfig.keyserver.protocol = kPGPKeyServerProtocol_Invalid;
		pss->klConfig.hwndStatusBar = NULL;
		pss->klConfig.uOptions = 
				kPGPclKeyList_SelectKeysOnly | kPGPclKeyList_ReadOnly;

		// get those options which are based on prefs
		if (IsntPGPError (PGPclPeekClientLibPrefRefs (&prefRef, NULL)))
		{
			PGPGetPrefBoolean (prefRef, kPGPPrefDisplayMarginalValidity, &b);
			if (!b) 
				pss->klConfig.uOptions |= kPGPclKeyList_GreenDotMode;
			PGPGetPrefBoolean (prefRef, kPGPPrefMarginalIsInvalid, &b);
			if (b) 
				pss->klConfig.uOptions |= kPGPclKeyList_MarginalIsInvalid;
		}

		pss->klConfig.uMask = kPGPclKeyList_ConfigureAll;
		PGPclKeyListConfigure (pss->hKL, &pss->klConfig);

		// initialize keymanager
		PGPclKeyListLoadKeys (pss->hKL, pss->keydbMain, pss->keysetToDisplay);

		// initialize wheel scrolling
		sUpdateWheelScrollLines (pss);

		// position buttons
		GetClientRect (hwnd, &rc);
		sMoveButtons (hwnd, (WORD)rc.right, (WORD)rc.bottom);

		// no keys initially selected => disable "OK" button
		EnableWindow (GetDlgItem (hwnd, IDOK), FALSE);

		// post message to sync keysets
		PostMessage (hwnd, WM_APP, 0, 0);

		return FALSE;
	}

	case WM_APP :
	{
		HCURSOR		hcursorOld;

		// this syncs the import keyset with the main one
		pss = (SELECTSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);

		hcursorOld = SetCursor (LoadCursor (NULL, IDC_WAIT));
		PGPCheckKeyRingSigs (pss->keysetToDisplay, 
				pss->keydbMain, TRUE, NULL, NULL);
		PGPclKeyListLoadKeys (pss->hKL, pss->keydbMain, pss->keysetToDisplay);
		SetCursor (hcursorOld);

		SetForegroundWindow (hwnd);
		SetFocus (pss->hwndTree);
		break;
	}

	case WM_ACTIVATE :
		pss = (SELECTSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
		SetFocus (pss->hwndTree);
		break;

	case WM_SIZING :
		{
			LPRECT prc = (LPRECT)lParam;
			switch (wParam) {
			case WMSZ_TOPLEFT :
			case WMSZ_LEFT :
			case WMSZ_BOTTOMLEFT :
				if ((prc->right - prc->left) < DIALOGMINWIDTH)
					prc->left = prc->right - DIALOGMINWIDTH;
				break;

			case WMSZ_TOPRIGHT :
			case WMSZ_RIGHT :
			case WMSZ_BOTTOMRIGHT :
				if ((prc->right - prc->left) < DIALOGMINWIDTH)
					prc->right = prc->left + DIALOGMINWIDTH;
				break;
			}
		}
		break;

	case WM_SIZE :
		pss = (SELECTSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
		// resize keymanager window
		SetWindowPos (pss->hwndTree, NULL, 0, pss->iyTop, 
			LOWORD(lParam), HIWORD(lParam) - pss->iyOffset, 
			SWP_NOMOVE|SWP_NOZORDER);

		sMoveButtons (hwnd, LOWORD(lParam), HIWORD(lParam));
		return 0;

	case WM_SYSCOLORCHANGE :
		pss = (SELECTSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
		PostMessage (pss->hwndTree, WM_SYSCOLORCHANGE, 0, 0);
		break;

	case WM_SETTINGCHANGE :
		pss = (SELECTSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
		if (wParam == SPI_SETWHEELSCROLLLINES)
			sUpdateWheelScrollLines (pss);
		else 
			PostMessage (pss->hwndTree, WM_SYSCOLORCHANGE, 0, 0);
		break;

	case WM_HELP :
	case WM_CONTEXTMENU :
		return PGPclHtmlHelp (hwnd, uMsg, wParam, lParam, 
				(char*)kPGPclHelpFile, aIds);

	case WM_NOTIFY :
		if (wParam == IDC_QUERYTREELIST) 
		{
			pss = (SELECTSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
			// let keymanager have first whack at the notification
			PGPclKeyListDefaultNotificationProc (pss->hKL, lParam);

			switch (((LPNM_TREELIST)lParam)->hdr.code) {
			// post the context menu
			case TLN_CONTEXTMENU :
				sQueryContextMenu (hwnd, pss->hKL,
					((LPNM_TREELIST)lParam)->flags,
					((LPNM_TREELIST)lParam)->ptDrag.x,
					((LPNM_TREELIST)lParam)->ptDrag.y);
				break;

			// enable or disable the "import" button depending on whether
			// item(s) are selected or not
			case TLN_SELCHANGED :
				if ((((LPNM_TREELIST)lParam)->itemNew.hItem) ||
					(((LPNM_TREELIST)lParam)->flags & TLC_MULTIPLE)) 
				{
					EnableWindow (GetDlgItem (hwnd, IDOK), TRUE);
				}
				else
					EnableWindow (GetDlgItem (hwnd, IDOK), FALSE);
				break;

			default :
				break;
			}
		}
		break;

	case WM_COMMAND:
		pss = (SELECTSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);

		switch (LOWORD(wParam)) {

		case IDOK :
		{
			PGPError	err;

			err = PGPclKeyListGetSelectedKeys (pss->hKL, &pss->keysetSelected);
			PGPclKeyListDestroy (pss->hKL, FALSE);
			pss->hKL = NULL;
			pss->hwndTree = NULL;
			EndDialog (hwnd, err);
			break;
		}

		case IDCANCEL :
			PGPclKeyListDestroy (pss->hKL, FALSE);
			pss->hKL = NULL;
			pss->hwndTree = NULL;
			EndDialog (hwnd, kPGPError_UserAbort);
			break;

		case IDC_SELECTALL :
			PGPclKeyListSetTree (pss->hKL, 
					kPGPclSelectAll, kInvalidPGPKeyDBObjRef); 
			EnableWindow (GetDlgItem (hwnd, IDOK), TRUE);
			SetFocus (pss->hwndTree);
			break;

		case IDC_UNSELECTALL :
			PGPclKeyListSetTree (pss->hKL, 
					kPGPclDeselectAll, kInvalidPGPKeyDBObjRef); 
			EnableWindow (GetDlgItem (hwnd, IDOK), FALSE);
			break;

		case IDM_KEYPROPERTIES :
		{
			PGPKeyDBObjRef	key;

			PGPclKeyListGetSelectionInfo (pss->hKL, NULL, &key, NULL, NULL);
			PGPclKeyDBObjProperties (pss->context, pss->tlscontext, 
					hwnd, key, pss->keydbMain, 
					kPGPclProperties_ReadOnly|kPGPclProperties_Key, NULL);
			break;
		}

		default :
			break;
		}
		return TRUE;

	default :
		if (uMsg == g_uMouseWheelMessage) 
		{
			WORD iDelta;

			pss = (SELECTSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
			iDelta = (WORD)wParam;
			
			SendMessage (pss->hwndTree, 
					WM_MOUSEWHEEL, MAKEWPARAM (0, iDelta), 0);
			return FALSE;
		}
		break;
	}
	return FALSE;
}

//	___________________________________________________
//
//  Display and handle select keys dialog

PGPError PGPclExport 
PGPclSelectKeys (
		PGPContextRef		context,
		PGPtlsContextRef	tlscontext,
		HWND				hwndParent, 
		LPSTR				pszPrompt,
		PGPKeySetRef		keysetToDisplay,			
		UINT				uFlags,
		PGPKeySetRef*		pkeysetSelected)
{
	SELECTSTRUCT	ss;
	PGPError		err;

	if (IsNull (pkeysetSelected))
		return kPGPError_BadParams;

	ss.hKL				= NULL;
	ss.context			= context;
	ss.tlscontext		= tlscontext;
	ss.pszPrompt		= pszPrompt;
	ss.keysetToDisplay	= keysetToDisplay;
	ss.keydbMain		= PGPPeekKeySetKeyDB (keysetToDisplay);
	ss.uFlags			= uFlags;

	err = DialogBoxParam (g_hInst, MAKEINTRESOURCE (IDD_QUERYADD), 
			hwndParent, sSelectKeysDlgProc, (LPARAM)&ss);

	if (IsntPGPError (err)) 
		*pkeysetSelected = ss.keysetSelected;

	return err;
}

⌨️ 快捷键说明

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