📄 gmtree.c
字号:
/*____________________________________________________________________________
Copyright (C) 2002 PGP Corporation
All rights reserved.
GMTree.h - create and fill group manager control
$Id: GMTree.c,v 1.17 2002/11/03 16:37:36 pbj Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"
// project header files
#include "PGPgmx.h"
#include "PGPkeysx.h"
// constant definitions
#define BITMAP_WIDTH 16
#define BITMAP_HEIGHT 16
// external globals
extern HINSTANCE g_hinst;
extern HIMAGELIST g_hilKeys;
// ___________________________________________________
//
// 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->uOptions & 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)
{
PGROUPMAN pGM;
PGPclWindowsGenus genus;
DWORD dwStyle;
// 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->pDropTarget = NULL; //pointer to DropTarget object
pGM->context = Context; //PGP context
pGM->tlsContext = tlsContext;
pGM->uOptions = 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);
dwStyle = WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP | WS_GROUP |
TLS_HASBUTTONS | TLS_HASLINES | TLS_AUTOSCROLL |
TLS_PROMISCUOUS | TLS_INTERNALDRAG |
TLS_DRAGABLEHEADERS | TLS_DRAGSELECTION;
PGPclGetWindowsVersion (NULL, &genus, NULL);
if (genus >= kPGPclWindowsGenusXp)
dwStyle |= TLS_USEDEFAULTGUIFONT;
// Create the tree view window.
pGM->hwndTree = CreateWindowEx (WS_EX_CLIENTEDGE, WC_TREELIST, "",
dwStyle, x, y, nWidth, nHeight,
hwndParent, (HMENU)iID, g_hinst, NULL);
if (pGM->hwndTree == NULL) return NULL;
// Associate the image list with the tree view control.
TreeList_SetImageList (pGM->hwndTree, g_hilKeys);
GMSetFocus (pGM, NULL, FALSE, FALSE);
pGM->pDropTarget = PKCreateDropTarget (pGM->hwndParent,
PK_IDROP_GROUPLIST, (VOID*)pGM);
CoLockObjectExternal ((IUnknown*)pGM->pDropTarget, TRUE, TRUE);
RegisterDragDrop (pGM->hwndTree, pGM->pDropTarget);
PKEnableDropTarget (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->keydbMain, &iValue, &iNumNotFound);
if (iNumNotFound > 0) iValue = 0;
else iValue = GMConvertFromPGPValidity (iValue);
tlL.state = TLIS_VISIBLE;
tlL.mask = TLIF_DATAVALUE | TLIF_STATE;
if (pGM->uOptions & 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,
PGPKeyDBObjRef 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);
PGPGetKeyDBObjBooleanProperty (key,
kPGPKeyProperty_IsAxiomatic, &bAxiomatic);
if (bAxiomatic)
{
iValue =
GMConvertFromPGPValidity (kPGPValidity_Complete)+1;
}
tlL.state = TLIS_VISIBLE;
tlL.mask = TLIF_DATAVALUE | TLIF_STATE;
if (pGM->uOptions & 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);
}
// ___________________________________________________
//
// Reload a single group
static HTLITEM
sReloadGroup (
PGROUPMAN pGM,
PGPGroupID groupid,
INT iIndex,
BOOL bReInsert,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -