📄 gmops.c
字号:
/*____________________________________________________________________________
Copyright (C) 2002 PGP Corporation
All rights reserved.
GMTree.h - create and fill group manager control
$Id: GMOps.c,v 1.12 2002/10/25 01:42:16 pbj Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"
// project header files
#include "PGPgmx.h"
#include "UTF8Edit.h"
// system header files
#include <commdlg.h>
// constant definitions
#define BITMAP_WIDTH 16
#define BITMAP_HEIGHT 16
#define VALIDITYTHRESHOLD 2
#define AXIOMATICTHRESHOLD 3
// typedefs
typedef struct {
FARPROC pfnCallback;
PGPContextRef context;
PGROUPMAN pGM;
LPSTR pszPrompt;
LPSTR pszUserID;
PGPBoolean bMultiple;
BOOL bItemModified;
BOOL bRootGroupDeleted;
BOOL bItemNotDeleted;
BOOL bDeleteAll;
HTLITEM hPostDeleteFocusItem;
} DELETESTRUCT;
typedef struct {
FARPROC pfnCallback;
PGROUPMAN pGM;
BOOL bFirst;
} LOCATESTRUCT;
typedef struct {
FARPROC pfnCallback;
PGROUPMAN pGM;
PGPGroupID groupidDest;
BOOL bAdded;
} ADDSTRUCT;
// local globals
static DWORD aDeleteAllIds[] = { // Help IDs
IDOK, IDH_PGPPKGRP_DELETEONE,
IDC_YESTOALL, IDH_PGPPKGRP_DELETEALL,
IDNO, IDH_PGPPKGRP_DELETENO,
IDCANCEL, IDH_PGPPKGRP_DELETECANCEL,
0,0
};
// external globals
extern HINSTANCE g_hinst;
// ___________________________________________________
//
// Delete All dialog message procedure
static BOOL CALLBACK
sDeleteAllDlgProc (
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
DELETESTRUCT* pds;
switch (uMsg) {
case WM_INITDIALOG :
SetWindowLong (hwndDlg, GWL_USERDATA, lParam);
pds = (DELETESTRUCT*)lParam;
UTF8EditInit (GetDlgItem (hwndDlg, IDC_NAME));
UTF8EditSetText (GetDlgItem (hwndDlg, IDC_NAME), pds->pszUserID);
SetDlgItemText (hwndDlg, IDC_PROMPT, pds->pszPrompt);
if (!pds->bMultiple)
{
RECT rc;
GetWindowRect (GetDlgItem (hwndDlg, IDC_YESTOALL), &rc);
MapWindowPoints (NULL, hwndDlg, (LPPOINT)&rc, 2);
SetWindowPos (GetDlgItem (hwndDlg, IDOK), NULL,
rc.left, rc.top, 0, 0, SWP_NOSIZE|SWP_NOZORDER);
ShowWindow (GetDlgItem (hwndDlg, IDC_YESTOALL), SW_HIDE);
EnableWindow (GetDlgItem (hwndDlg, IDC_YESTOALL), FALSE);
ShowWindow (GetDlgItem (hwndDlg, IDCANCEL), SW_HIDE);
EnableWindow (GetDlgItem (hwndDlg, IDCANCEL), FALSE);
}
SetFocus (GetDlgItem (hwndDlg, IDNO));
return FALSE;
case WM_DESTROY :
UTF8EditDestroy (GetDlgItem (hwndDlg, IDC_NAME));
return FALSE;
case WM_HELP :
case WM_CONTEXTMENU :
return PGPclHtmlHelp (hwndDlg, uMsg, wParam, lParam,
(char*)kPGPclHelpFile, aDeleteAllIds);
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDCANCEL:
pds = (DELETESTRUCT*)GetWindowLong (hwndDlg, GWL_USERDATA);
pds->bItemNotDeleted = TRUE;
EndDialog (hwndDlg, IDCANCEL);
break;
case IDOK:
case IDYES:
EndDialog (hwndDlg, IDYES);
break;
case IDNO:
EndDialog (hwndDlg, IDNO);
break;
case IDC_YESTOALL :
pds = (DELETESTRUCT*)GetWindowLong (hwndDlg, GWL_USERDATA);
pds->bDeleteAll = TRUE;
EndDialog (hwndDlg, IDYES);
break;
}
return TRUE;
}
return FALSE;
}
/*
// ___________________________________________________
//
// Ask user for delete confirmation
static INT
sDeleteConfirm (
TL_TREEITEM* lptli,
INT iPromptID,
DELETESTRUCT* pds)
{
CHAR sz256[256];
CHAR sz512[512];
INT iRetVal;
if (pds->bDeleteAll) return IDYES;
LoadString (g_hinst, iPromptID, sz256, 256);
wsprintf (sz512, sz256, lptli->pszText);
if (GMMultipleSelected (pds->pGM))
{
pds->pszPrompt = sz512;
iRetVal = DialogBoxParam (g_hinst, MAKEINTRESOURCE (IDD_DELETEALL),
pds->pGM->hwndParent, sDeleteAllDlgProc, (LPARAM)pds);
if (!pds->bItemNotDeleted && (iRetVal == IDNO))
{
pds->bItemNotDeleted = TRUE;
pds->hPostDeleteFocusItem = lptli->hItem;
}
}
else
{
LoadString (g_hinst, IDS_DELCONFCAPTION, sz256, 256);
iRetVal = MessageBox (pds->pGM->hwndParent, sz512, sz256,
MB_YESNO|MB_TASKMODAL|MB_DEFBUTTON2|MB_ICONWARNING);
}
return iRetVal;
}
*/
// _______________________________________________
//
// Ask user for delete confirmation
static INT
sDeleteConfirm (
TL_TREEITEM* lptli,
INT iPromptID,
DELETESTRUCT* pds)
{
CHAR szPrompt[256];
INT iRetVal;
if (pds->bDeleteAll)
return IDYES;
LoadString (g_hinst, iPromptID, szPrompt, sizeof(szPrompt));
pds->pszPrompt = szPrompt;
pds->pszUserID = lptli->pszText;
pds->bMultiple = GMMultipleSelected (pds->pGM);
iRetVal = DialogBoxParam (g_hinst, MAKEINTRESOURCE (IDD_DELETEALL),
pds->pGM->hwndParent, sDeleteAllDlgProc, (LPARAM)pds);
if (pds->bMultiple)
{
if (!pds->bItemNotDeleted && (iRetVal == IDNO))
{
pds->bItemNotDeleted = TRUE;
pds->hPostDeleteFocusItem = lptli->hItem;
}
}
return iRetVal;
}
// ___________________________________________________
//
// Get handle of nearby item
//
// lptli = pointer to TreeList item
static HTLITEM
sGetAdjacentItem (
HWND hwndTree,
TL_TREEITEM* lptli)
{
TL_TREEITEM tli;
tli.hItem = lptli->hItem;
tli.mask = TLIF_NEXTHANDLE;
TreeList_GetItem (hwndTree, &tli);
if (!tli.hItem)
{
tli.hItem = lptli->hItem;
tli.mask = TLIF_PREVHANDLE;
TreeList_GetItem (hwndTree, &tli);
if (!tli.hItem)
{
tli.hItem = lptli->hItem;
tli.mask = TLIF_PARENTHANDLE;
TreeList_GetItem (hwndTree, &tli);
}
}
return tli.hItem;
}
// ___________________________________________________
//
// Delete a single object
// routine called as a callback function from the TreeList control to
// delete a single item.
//
// lptli = pointer to TreeList item to delete
static BOOL CALLBACK
sDeleteSingleObject (
TL_TREEITEM* lptli,
LPARAM lParam)
{
DELETESTRUCT* pds = (DELETESTRUCT*)lParam;
INT iConfirm;
PGPUInt32 index;
PGPGroupID id;
switch (lptli->iImage) {
// is it a group ?
case IDX_GROUP :
iConfirm = sDeleteConfirm (lptli, IDS_DELCONFGROUP, pds);
if (iConfirm == IDYES)
{
id = HIWORD(lptli->lParam);
index = LOWORD(lptli->lParam);
// if hiword is non-zero, then it's a copy of a group
if (id)
{
PGPDeleteIndItemFromGroup (pds->pGM->groupsetMain,
id, index);
}
// if hiword is zero, then it's a root group
else
{
id = LOWORD(lptli->lParam);
PGPDeleteGroup (pds->pGM->groupsetMain, id);
pds->bRootGroupDeleted = TRUE;
}
pds->bItemModified = TRUE;
if (!pds->bItemNotDeleted)
{
pds->hPostDeleteFocusItem =
sGetAdjacentItem (pds->pGM->hwndTree, lptli);
}
TreeList_DeleteItem (pds->pGM->hwndTree, lptli);
}
if (iConfirm == IDCANCEL)
return FALSE;
else
return TRUE;
// otherwise it's a key
default:
iConfirm = sDeleteConfirm (lptli, IDS_DELCONFKEY, pds);
if (iConfirm == IDYES)
{
id = HIWORD(lptli->lParam);
index = LOWORD(lptli->lParam);
if (id)
{
PGPDeleteIndItemFromGroup (pds->pGM->groupsetMain, id, index);
pds->bItemModified = TRUE;
if (!pds->bItemNotDeleted)
{
pds->hPostDeleteFocusItem =
sGetAdjacentItem (pds->pGM->hwndTree, lptli);
}
TreeList_DeleteItem (pds->pGM->hwndTree, lptli);
}
}
if (iConfirm == IDCANCEL) return FALSE;
else return TRUE;
}
}
// ___________________________________________________
//
// delete group or keys
BOOL
GMDeleteObject (PGROUPMAN pGM)
{
TL_TREEITEM tli;
DELETESTRUCT ds;
ds.pfnCallback = sDeleteSingleObject;
ds.context = pGM->context;
ds.pGM = pGM;
ds.bItemModified = FALSE;
ds.bRootGroupDeleted = FALSE;
ds.bDeleteAll = FALSE;
ds.bItemNotDeleted = FALSE;
ds.hPostDeleteFocusItem = NULL;
TreeList_IterateSelected (pGM->hwndTree, &ds);
if (ds.bItemModified)
{
GMCommitGroupChanges (pGM, TRUE);
if (ds.bRootGroupDeleted)
{
TreeList_DeleteTree (pGM->hwndTree, TRUE);
GMAddColumns (pGM);
GMSortGroupSet (pGM);
GMLoadGroupsIntoTree (pGM, FALSE, FALSE, TRUE);
}
else
GMLoadGroupsIntoTree (pGM, FALSE, FALSE, FALSE);
if (ds.bItemNotDeleted)
{
if (ds.hPostDeleteFocusItem)
{
tli.hItem = ds.hPostDeleteFocusItem;
TreeList_Select (pGM->hwndTree, &tli, FALSE);
}
else
GMSetFocus (pGM, NULL, FALSE, FALSE);
}
else {
if (ds.hPostDeleteFocusItem)
{
tli.hItem = ds.hPostDeleteFocusItem;
TreeList_Select (pGM->hwndTree, &tli, TRUE);
tli.stateMask = TLIS_SELECTED;
tli.state = 0;
tli.mask = TLIF_STATE;
TreeList_SetItem (pGM->hwndTree, &tli);
}
else
GMSetFocus (pGM, NULL, FALSE, FALSE);
}
InvalidateRect (pGM->hwndTree, NULL, TRUE);
}
return (ds.bItemModified);
}
// ___________________________________________________
//
// Add a single object
// routine called as a callback function from the TreeList control to
// add a single item.
//
// lptli = pointer to TreeList item to delete
static BOOL CALLBACK
sAddSingleObject (
TL_TREEITEM* lptli,
LPARAM lParam)
{
ADDSTRUCT* pas = (ADDSTRUCT*)lParam;
PGPUInt32 index;
PGPGroupID id;
PGPGroupItem groupitem;
PGPError err;
switch (lptli->iImage) {
// is it a group ?
case IDX_GROUP :
id = HIWORD(lptli->lParam);
if (!id) id = LOWORD(lptli->lParam);
if (id)
{
if (id != pas->groupidDest)
{
groupitem.type = kPGPGroupItem_Group;
groupitem.userValue = 0;
groupitem.u.groupID = id;
err = PGPAddItemToGroup (pas->pGM->groupsetMain,
&groupitem, pas->groupidDest);
if (IsntPGPError (err))
pas->bAdded = TRUE;
}
}
return TRUE;
// otherwise it's a key
default:
id = HIWORD(lptli->lParam);
index = LOWORD(lptli->lParam);
if (id)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -