klfocus.c
来自「PGP8.0源码 请认真阅读您的文件包然后写出其具体功能」· C语言 代码 · 共 458 行
C
458 行
/*____________________________________________________________________________
Copyright (C) 2002 PGP Corporation
All rights reserved.
KLFocus.c - routines for tracking the focused/selected items
$Id: KLFocus.c,v 1.12 2002/10/09 13:02:54 pbj Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"
// project header files
#include "PGPclx.h"
#include "PGPklx.h"
#include "pgpImageList.h"
// external globals
extern HINSTANCE g_hInst;
// typedefs
typedef struct {
FARPROC lpfnCallback;
PKEYLIST pKL;
PGPKeySetRef keysetSelected;
INT icount;
PGPError err;
} SELOBJECTINFO;
typedef struct {
FARPROC lpfnCallback;
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 (PKEYLIST pKL)
{
CHAR sz1[128];
CHAR sz2[128];
INT ids;
SELOBJECTCOUNT soc;
if (!pKL->hwndStatusBar)
return;
if (pKL->ulOptionFlags & kPGPclKeyList_DisableStatusBar)
return;
switch (pKL->uSelectedFlags) {
case 0 : ids = 0; break;
case kPGPclKeyList_Key : ids = IDS_KEYSELECTED; break;
case kPGPclKeyList_UserID : ids = IDS_UIDSELECTED; break;
case kPGPclKeyList_Signature : ids = IDS_CERTSELECTED; break;
default : ids = IDS_MULTISELECTED; break;
}
if (pKL->bMultipleSelected)
{
soc.lpfnCallback = sCountSingleObject;
soc.iObjectCount = 0;
TreeList_IterateSelected (pKL->hwndTree, &soc);
}
else
soc.iObjectCount = 1;
if (ids)
{
LoadString (g_hInst, ids, sz1, sizeof(sz1));
wsprintf (sz2, sz1, soc.iObjectCount);
}
else
lstrcpy (sz2, "");
SendMessage (pKL->hwndStatusBar, SB_SETTEXT, 1, (LPARAM)sz2);
}
// ________________________________________
//
// figure out the object type from an image
INT
KLGetObjectType (
INT iImage)
{
switch (iImage) {
case IDX_NONE :
return kPGPclKeyList_None;
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_UNKNOWNKEY :
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 :
return kPGPclKeyList_Key;
case IDX_RSAUSERID :
case IDX_DSAUSERID :
case IDX_PHOTOUSERID :
case IDX_INVALIDUSERID :
return kPGPclKeyList_UserID;
case IDX_CERT :
case IDX_REVCERT :
case IDX_BADCERT :
case IDX_EXPCERT :
case IDX_EXPORTCERT :
case IDX_TRUSTEDCERT :
case IDX_METACERT :
case IDX_X509CERT :
case IDX_X509EXPCERT :
case IDX_X509REVCERT :
return kPGPclKeyList_Signature;
default :
return kPGPclKeyList_None;
}
}
// ________________________________________
//
// Set handle of selected item.
// Type and pointer to object are retrieved from
// TreeList as imagelist index.
VOID
KLSetFocus (
PKEYLIST pKL,
HTLITEM hFocused,
BOOL bMultiple)
{
TL_TREEITEM tli;
pKL->hFocusedItem = hFocused;
pKL->bMultipleSelected = bMultiple;
if (!bMultiple)
pKL->uSelectedFlags = 0;
tli.hItem = hFocused;
tli.mask = TLIF_IMAGE | TLIF_PARAM;
if (hFocused && TreeList_GetItem (pKL->hwndTree, &tli))
{
pKL->iFocusedItemType = tli.iImage;
pKL->pFocusedObject = (void*)tli.lParam;
pKL->iFocusedObjectType = KLGetObjectType (pKL->iFocusedItemType);
if (pKL->iFocusedObjectType != kPGPclKeyList_None)
pKL->uSelectedFlags |= pKL->iFocusedObjectType;
}
else
{
pKL->iFocusedItemType = IDX_NONE;
pKL->iFocusedObjectType = kPGPclKeyList_None;
pKL->pFocusedObject = NULL;
}
sUpdateStatusBarText (pKL);
}
// ________________________________________
//
// Get type of focused item
INT
KLFocusedItemType (PKEYLIST pKL)
{
return pKL->iFocusedItemType;
}
// ________________________________________
//
// Get type of focused object
INT
KLFocusedObjectType (PKEYLIST pKL)
{
return pKL->iFocusedObjectType;
}
// ________________________________________
//
// Get handle of focused item
HTLITEM
KLFocusedItem (PKEYLIST pKL)
{
return pKL->hFocusedItem;
}
// ________________________________________
//
// Get pointer to focused object
VOID* KLFocusedObject (PKEYLIST pKL)
{
return pKL->pFocusedObject;
}
// ________________________________________
//
// Get type of focused object
BOOL
KLMultipleSelected (PKEYLIST pKL)
{
return pKL->bMultipleSelected;
}
// ________________________________________
//
// Get type of focused object
UINT
KLSelectedFlags (PKEYLIST pKL)
{
return pKL->uSelectedFlags;
}
// _______________________________________________
//
// routines called as callback functions from the
// TreeList control
//
static BOOL CALLBACK
sAddKeyToKeySet (
TL_TREEITEM* lptli,
LPARAM lParam)
{
SELOBJECTINFO* psoi = (SELOBJECTINFO*)lParam;
PGPKeyDBObjRef key;
PGPError err;
switch (lptli->iImage) {
case IDX_RSAPUBKEY :
case IDX_RSAPUBDISKEY :
case IDX_RSASECKEY :
case IDX_RSASECDISKEY :
case IDX_DSAPUBKEY :
case IDX_DSAPUBDISKEY :
case IDX_DSASECKEY :
case IDX_DSASECDISKEY :
case IDX_DSASECSHRKEY :
case IDX_RSAPUBREVKEY :
case IDX_RSAPUBEXPKEY :
case IDX_RSASECREVKEY :
case IDX_RSASECEXPKEY :
case IDX_RSASECSHRKEY :
case IDX_DSAPUBREVKEY :
case IDX_DSAPUBEXPKEY :
case IDX_DSASECREVKEY :
case IDX_DSASECEXPKEY :
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 :
key = (PGPKeyDBObjRef)(lptli->lParam);
break;
case IDX_RSAUSERID :
case IDX_DSAUSERID :
case IDX_PHOTOUSERID :
case IDX_INVALIDUSERID :
key = PGPPeekKeyDBObjKey ((PGPKeyDBObjRef)(lptli->lParam));
break;
case IDX_CERT :
case IDX_REVCERT :
case IDX_BADCERT :
case IDX_EXPORTCERT :
case IDX_TRUSTEDCERT :
case IDX_METACERT :
key = PGPPeekKeyDBObjKey ((PGPKeyDBObjRef)(lptli->lParam));
break;
case IDX_UNKNOWNKEY :
psoi->err = kPGPError_Win32_UnsupportedKeyType;
return FALSE;
default :
return FALSE;
}
if (PGPKeyDBObjRefIsValid (key))
{
err = PGPAddKey (key, psoi->keysetSelected);
if (IsntPGPError (err))
++(psoi->icount);
}
return TRUE;
}
// ___________________________
//
// Get keyset of selected keys
PGPError
KLGetSelectedKeys (
PKEYLIST pKL,
PGPKeySetRef* pkeyset,
INT* piCount)
{
PGPError err = kPGPError_NoErr;
SELOBJECTINFO soi;
soi.lpfnCallback = sAddKeyToKeySet;
soi.pKL = pKL;
soi.icount = 0;
soi.err = kPGPError_NoErr;
if (pkeyset)
*pkeyset = kInvalidPGPKeySetRef;
if (piCount)
*piCount = 0;
if (pkeyset)
err = PGPNewEmptyKeySet (pKL->keydbBacking, &(soi.keysetSelected));
else
soi.keysetSelected = NULL;
if (IsntPGPError (err))
{
TreeList_IterateSelected (pKL->hwndTree, &soi);
if (IsPGPError (soi.err))
{
err = soi.err;
if (PGPKeySetRefIsValid (soi.keysetSelected))
PGPFreeKeySet (soi.keysetSelected);
}
else
{
if (pkeyset)
*pkeyset = soi.keysetSelected;
if (piCount)
*piCount = soi.icount;
}
}
return err;
}
// ___________________________
//
// Get selected item info
PGPError PGPclExport
PGPclKeyListGetSelectionInfo (
HKEYLIST hkeylist,
PGPUInt32* puFocusedType,
PGPKeyDBObjRef* pobjFocused,
PGPBoolean* pbMultipleSel,
PGPUInt32* puSelectionFlags)
{
PKEYLIST pKL = (PKEYLIST)hkeylist;
if (!pKL)
return kPGPError_BadParams;
if (puFocusedType)
*puFocusedType = pKL->iFocusedItemType;
if (pobjFocused)
*pobjFocused = pKL->pFocusedObject;
if (pbMultipleSel)
*pbMultipleSel = pKL->bMultipleSelected;
if (puSelectionFlags)
*puSelectionFlags = pKL->uSelectedFlags;
return kPGPError_NoErr;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?