gmtree.c
来自「vc环境下的pgp源码」· C语言 代码 · 共 777 行 · 第 1/2 页
C
777 行
/*____________________________________________________________________________
Copyright (C) 1998 Network Associates, Inc.
All rights reserved.
GMTree.h - create and fill group manager control
$Id: GMTree.c,v 1.35 1999/04/01 03:48:19 pbj Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"
// project header files
#include "pgpgmx.h"
// constant definitions
#define BITMAP_WIDTH 16
#define BITMAP_HEIGHT 16
// external globals
extern HINSTANCE g_hInst;
// ___________________________________________________
//
// Return handle of group manager window
HWND
PGPgmGetManagerWindow (HGROUPMAN hGM)
{
if (!hGM) return NULL;
return (((PGROUPMAN)hGM)->hWndTree);
}
// ___________________________________________________
//
// Insert column information into control
BOOL
GMAddColumns (PGROUPMAN pGM)
{
TL_COLUMN tlc;
CHAR sz[64];
INT iField;
INT iCol, ids;
TreeList_DeleteAllColumns (pGM->hWndTree);
tlc.mask = TLCF_FMT | TLCF_WIDTH | TLCF_TEXT |
TLCF_SUBITEM | TLCF_DATATYPE | TLCF_DATAMAX |
TLCF_MOUSENOTIFY;
tlc.pszText = sz;
tlc.iSubItem = 0;
tlc.fmt = TLCFMT_LEFT;
tlc.iDataType = TLC_DATASTRING;
tlc.cx = pGM->wFieldWidth[0];
tlc.bMouseNotify = FALSE;
LoadString (g_hInst, IDS_GROUPNAMEFIELD, sz, sizeof(sz));
TreeList_InsertColumn (pGM->hWndTree, 0, &tlc);
for (iCol=1; iCol<NUMBERFIELDS; iCol++) {
iField = pGM->wColumnField[iCol];
if (iField) {
switch (iField) {
case GMI_VALIDITY :
ids = IDS_VALIDITYFIELD;
if (pGM->ulOptionFlags & GMF_NOVICEMODE)
tlc.fmt = TLCFMT_IMAGE;
else
tlc.fmt = TLCFMT_LINBAR;
tlc.cchTextMax =
GMConvertFromPGPValidity (kPGPValidity_Complete);
tlc.iDataType = TLC_DATALONG;
tlc.bMouseNotify = FALSE;
break;
case GMI_DESCRIPTION :
ids = IDS_DESCRIPTIONFIELD;
tlc.fmt = TLCFMT_LEFT;
tlc.iDataType = TLC_DATASTRING;
tlc.bMouseNotify = FALSE;
break;
}
LoadString (g_hInst, ids, sz, sizeof(sz));
tlc.cx = pGM->wFieldWidth[iField];
TreeList_InsertColumn (pGM->hWndTree, iCol, &tlc);
}
}
return TRUE;
}
// ___________________________________________________
//
// Create TreeList Window
HGROUPMAN
PGPgmCreateGroupManager (
PGPContextRef Context,
PGPtlsContextRef tlsContext,
HWND hWndParent,
INT iID,
INT x,
INT y,
INT nWidth,
INT nHeight)
{
HBITMAP hBmp; // handle to a bitmap
PGROUPMAN pGM;
HDC hDC;
INT iNumBits;
// Ensure that the common control DLL is loaded.
InitCommonControls ();
// Ensure that the custom control DLL is loaded.
InitTreeListControl ();
pGM = gmAlloc (sizeof (_GROUPMAN));
if (!pGM) return NULL;
memset (pGM, 0x00, sizeof (_GROUPMAN));
pGM->hWndParent = hWndParent;
pGM->hWndTree = NULL;
pGM->groupsetMain = NULL;
pGM->iID = iID;
pGM->hIml = NULL;
pGM->pDropTarget = NULL; //pointer to DropTarget object
lstrcpy (pGM->szHelpFile, ""); //string containing name of help file
pGM->context = Context; //PGP context
pGM->tlsContext = tlsContext;
pGM->ulOptionFlags = 0;
pGM->ulDisableActions = 0;
pGM->bMultipleSelected = FALSE;
pGM->bLocatingKeys = FALSE;
pGM->uSelectedFlags = 0;
pGM->iFocusedItemType = 0;
pGM->iFocusedObjectType = 0;
pGM->hFocusedItem = NULL;
pGM->pFocusedObject = NULL;
pGM->iValidityThreshold = GM_VALIDITY_MARGINAL;
GMGetColumnPreferences (pGM);
// Create the tree view window.
pGM->hWndTree = CreateWindowEx (WS_EX_CLIENTEDGE, WC_TREELIST, "",
WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP | WS_GROUP |
TLS_HASBUTTONS | TLS_HASLINES | TLS_AUTOSCROLL |
TLS_PROMISCUOUS | TLS_INTERNALDRAG | TLS_DRAGABLEHEADERS,
x, y, nWidth, nHeight,
hWndParent, (HMENU)iID, g_hInst, NULL);
if (pGM->hWndTree == NULL) return NULL;
// Initialize the tree view window.
// First create imagelist and load the appropriate bitmaps
// based on current display capabilities.
hDC = GetDC (NULL); // DC for desktop
iNumBits = GetDeviceCaps (hDC, BITSPIXEL) * GetDeviceCaps (hDC, PLANES);
ReleaseDC (NULL, hDC);
if (iNumBits <= 8) {
pGM->hIml = ImageList_Create (16, 16, ILC_COLOR|ILC_MASK,
NUM_BITMAPS, 0);
hBmp = LoadBitmap (g_hInst, MAKEINTRESOURCE (IDB_IMAGES4BIT));
ImageList_AddMasked (pGM->hIml, hBmp, RGB(255, 0, 255));
DeleteObject (hBmp);
}
else {
pGM->hIml = ImageList_Create (16, 16, ILC_COLOR24|ILC_MASK,
NUM_BITMAPS, 0);
hBmp = LoadBitmap (g_hInst, MAKEINTRESOURCE (IDB_IMAGES24BIT));
ImageList_AddMasked (pGM->hIml, hBmp, RGB(255, 0, 255));
DeleteObject (hBmp);
}
// Associate the image list with the tree view control.
TreeList_SetImageList (pGM->hWndTree, pGM->hIml);
GMSetFocus (pGM, NULL, FALSE);
pGM->pDropTarget = GMCreateDropTarget (pGM->hWndParent, (VOID*)pGM);
CoLockObjectExternal ((IUnknown*)pGM->pDropTarget, TRUE, TRUE);
RegisterDragDrop (pGM->hWndTree, pGM->pDropTarget);
GMEnableDropTarget (pGM->pDropTarget, FALSE);
return (HGROUPMAN)pGM;
}
// ___________________________________________________
//
// Set (or add) a tree item to the tree
static HTLITEM
sSetOneGroupItem (
PGROUPMAN pGM,
BOOL bReInsert,
HTLITEM hItem,
HTLITEM hParent,
LPSTR szText,
HTLITEM hInsAfter,
INT iImage,
UINT uState,
LPARAM lParam)
{
TL_TREEITEM tlI;
TL_INSERTSTRUCT tlIns;
tlI.hItem = hItem;
tlI.mask = TLIF_TEXT | TLIF_IMAGE | TLIF_STATE | TLIF_PARAM;
tlI.stateMask = TLIS_BOLD | TLIS_ITALICS;
tlI.stateMask |= uState;
tlI.state = uState;
tlI.pszText = szText;
tlI.cchTextMax = lstrlen (szText);
tlI.iImage = iImage;
tlI.iSelectedImage = iImage;
tlI.lParam = lParam;
// Insert the data into the tree.
if (bReInsert || !hItem) {
tlIns.item = tlI;
tlIns.hInsertAfter = hInsAfter;
tlIns.hParent = hParent;
return (TreeList_InsertItem (pGM->hWndTree, &tlIns));
}
else {
TreeList_SetItem (pGM->hWndTree, &tlI);
return hItem;
}
}
// ___________________________________________________
//
// Set list data for a key
static HTLITEM
sSetGroupData (
PGROUPMAN pGM,
HTLITEM hItem,
PGPGroupID groupid,
LPSTR pszDesc)
{
TL_LISTITEM tlL;
INT iField, iCol;
INT iValue, iNumNotFound;
tlL.hItem = hItem;
tlL.stateMask = TLIS_VISIBLE;
for (iCol=1; iCol<NUMBERFIELDS; iCol++) {
iField = pGM->wColumnField[iCol];
if (iField) {
switch (iField) {
case GMI_VALIDITY :
tlL.pszText = NULL;
PGPGetGroupLowestValidity (pGM->groupsetMain, groupid,
pGM->keysetMain, &iValue, &iNumNotFound);
if (iNumNotFound > 0) iValue = 0;
else iValue = GMConvertFromPGPValidity (iValue);
tlL.state = TLIS_VISIBLE;
tlL.mask = TLIF_DATAVALUE | TLIF_STATE;
if (pGM->ulOptionFlags & GMF_NOVICEMODE) {
if (iValue > GM_VALIDITY_COMPLETE)
tlL.lDataValue = IDX_AXIOMATIC;
else if (iValue >= pGM->iValidityThreshold)
tlL.lDataValue = IDX_VALID;
else tlL.lDataValue = IDX_INVALID;
}
else tlL.lDataValue = iValue;
break;
case GMI_DESCRIPTION :
tlL.state = TLIS_VISIBLE;
tlL.mask = TLIF_TEXT | TLIF_STATE;
tlL.pszText = pszDesc;
break;
}
tlL.iSubItem = iCol;
hItem = (HTLITEM) TreeList_SetListItem (pGM->hWndTree,
&tlL, FALSE);
}
}
return (hItem);
}
// ___________________________________________________
//
// Set list data for a key
static HTLITEM
sSetKeyData (
PGROUPMAN pGM,
HTLITEM hItem,
PGPKeyRef key,
LPSTR pszDesc)
{
TL_LISTITEM tlL;
INT iField, iCol;
PGPBoolean bAxiomatic;
INT iValue;
tlL.hItem = hItem;
tlL.stateMask = TLIS_VISIBLE;
for (iCol=1; iCol<NUMBERFIELDS; iCol++) {
iField = pGM->wColumnField[iCol];
if (iField) {
switch (iField) {
case GMI_VALIDITY :
PGPGetPrimaryUserIDValidity (key, &iValue);
iValue = GMConvertFromPGPValidity (iValue);
PGPGetKeyBoolean (key, kPGPKeyPropIsAxiomatic, &bAxiomatic);
if (bAxiomatic) iValue =
GMConvertFromPGPValidity (kPGPValidity_Complete)+1;
tlL.state = TLIS_VISIBLE;
tlL.mask = TLIF_DATAVALUE | TLIF_STATE;
if (pGM->ulOptionFlags & GMF_NOVICEMODE) {
if (iValue > GM_VALIDITY_COMPLETE)
tlL.lDataValue = IDX_AXIOMATIC;
else if (iValue >= pGM->iValidityThreshold)
tlL.lDataValue = IDX_VALID;
else tlL.lDataValue = IDX_INVALID;
}
else tlL.lDataValue = iValue;
break;
case GMI_DESCRIPTION :
tlL.state = TLIS_VISIBLE;
tlL.mask = TLIF_TEXT | TLIF_STATE;
tlL.pszText = pszDesc;
break;
}
tlL.iSubItem = iCol;
hItem = (HTLITEM) TreeList_SetListItem (pGM->hWndTree,
&tlL, FALSE);
}
}
return (hItem);
}
// ___________________________________________________
//
// Determine the appropriate icon for a key, based on
// its properties
static INT
sDetermineKeyIcon (PGPKeyRef Key, BOOL* lpbItalics)
{
PGPBoolean bRevoked, bSecret, bDisabled, bExpired, bSplit;
PGPUInt32 iIdx, iAlg;
PGPGetKeyBoolean (Key, kPGPKeyPropIsRevoked, &bRevoked);
PGPGetKeyBoolean (Key, kPGPKeyPropIsSecret, &bSecret);
PGPGetKeyBoolean (Key, kPGPKeyPropIsDisabled, &bDisabled);
PGPGetKeyBoolean (Key, kPGPKeyPropIsExpired, &bExpired);
PGPGetKeyBoolean (Key, kPGPKeyPropIsSecretShared, &bSplit);
PGPGetKeyNumber (Key, kPGPKeyPropAlgID, &iAlg);
if (iAlg == kPGPPublicKeyAlgorithm_RSA) {
if (bSecret) {
if (bRevoked) iIdx = IDX_RSASECREVKEY;
else if (bExpired) iIdx = IDX_RSASECEXPKEY;
else if (bDisabled) iIdx = IDX_RSASECDISKEY;
else if (bSplit) iIdx = IDX_RSASECSHRKEY;
else iIdx = IDX_RSASECKEY;
}
else {
if (bRevoked) iIdx = IDX_RSAPUBREVKEY;
else if (bExpired) iIdx = IDX_RSAPUBEXPKEY;
else if (bDisabled) iIdx = IDX_RSAPUBDISKEY;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?