📄 gmnotprc.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 + -