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 + -
显示快捷键?