📄 pnhosts.c
字号:
EnableMenuItem (hMenuTrackPopup, IDC_ADD,
MF_BYCOMMAND|MF_ENABLED);
}
TrackPopupMenu (hMenuTrackPopup, TPM_LEFTALIGN | TPM_RIGHTBUTTON,
iX, iY, 0, hwnd, NULL);
DestroyMenu (hMC);
}
// _____________________________________________________
//
// traverse treelist and save contents to host list
static VOID
sTreeListToHostList (
HWND hwndTree,
PPNCONFIG ppnconfig)
{
TL_TREEITEM tlI;
HTLITEM hTHost;
HTLITEM hTChild;
INT iHost, iParent, iHostCount;
PGPNetHostEntry* pNewHostList;
// count number of hosts in list
iHostCount = 0;
hTHost = TreeList_GetFirstItem (hwndTree);
while (hTHost)
{
++iHostCount;
tlI.hItem = hTHost;
tlI.mask = TLIF_CHILDHANDLE;
TreeList_GetItem (hwndTree, &tlI);
hTChild = tlI.hItem;
while (hTChild)
{
++iHostCount;
tlI.hItem = hTChild;
tlI.mask = TLIF_NEXTHANDLE;
TreeList_GetItem (hwndTree, &tlI);
hTChild = tlI.hItem;
}
tlI.hItem = hTHost;
tlI.mask = TLIF_NEXTHANDLE;
TreeList_GetItem (hwndTree, &tlI);
hTHost = tlI.hItem;
}
pNewHostList = PGPNewData (PGPGetContextMemoryMgr (g_context),
iHostCount * sizeof(PGPNetHostEntry),
kPGPMemoryMgrFlags_Clear);
if (pNewHostList)
{
iHost = -1;
hTHost = TreeList_GetFirstItem (hwndTree);
while (hTHost)
{
++iHost;
// get host index
tlI.hItem = hTHost;
tlI.mask = TLIF_PARAM | TLIF_CHILDHANDLE;
TreeList_GetItem (hwndTree, &tlI);
hTChild = tlI.hItem;
pgpCopyMemory (&ppnconfig->pHostList[tlI.lParam],
&pNewHostList[iHost],
sizeof(PGPNetHostEntry));
pNewHostList[iHost].childOf = -1;
tlI.hItem = hTHost;
tlI.mask = TLIF_PARAM;
tlI.lParam = iHost;
TreeList_SetItem (hwndTree, &tlI);
iParent = iHost;
while (hTChild)
{
++iHost;
tlI.hItem = hTChild;
tlI.mask = TLIF_PARAM;
TreeList_GetItem (hwndTree, &tlI);
pgpCopyMemory (&ppnconfig->pHostList[tlI.lParam],
&pNewHostList[iHost],
sizeof(PGPNetHostEntry));
pNewHostList[iHost].childOf = iParent;
tlI.lParam = iHost;
TreeList_SetItem (hwndTree, &tlI);
tlI.mask = TLIF_NEXTHANDLE;
TreeList_GetItem (hwndTree, &tlI);
hTChild = tlI.hItem;
}
// step to next host
tlI.hItem = hTHost;
tlI.mask = TLIF_NEXTHANDLE;
TreeList_GetItem (hwndTree, &tlI);
hTHost = tlI.hItem;
}
PGPFreeData (ppnconfig->pHostList);
ppnconfig->pHostList = pNewHostList;
ppnconfig->uHostCount = iHostCount;
}
}
// ____________________________________
//
// dialog proc of hosts dialog
BOOL CALLBACK
PNHostDlgProc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
PAPPOPTIONSSTRUCT paos;
switch (uMsg)
{
case WM_INITDIALOG :
{
RECT rc;
g_hTLSelected = NULL;
SetWindowLong (hwnd, GWL_USERDATA, lParam);
paos = (PAPPOPTIONSSTRUCT)GetWindowLong (hwnd, GWL_USERDATA);
// setup control size values
GetWindowRect (GetDlgItem (hwnd, IDC_EDIT), &rc);
g_uButtonWidth = rc.right - rc.left;
g_uButtonHeight = rc.bottom - rc.top;
g_uBottomListOffset = 2 * (rc.bottom - rc.top);
GetWindowRect (GetDlgItem (hwnd, IDC_ONOFFBOX), &rc);
g_uOnOffBoxWidth = rc.right - rc.left;
g_uOnOffBoxHeight = rc.bottom - rc.top;
GetWindowRect (GetDlgItem (hwnd, IDC_HOSTTREE), &rc);
MapWindowPoints (NULL, hwnd, (LPPOINT)&rc, 2);
g_iMinWindowWidth = max (g_iMinWindowWidth,
(rc.right-rc.left) + (6*HOR_TAB_OFFSET));
// create host tree list
paos->hwndHostTreeList = CreateWindowEx (
WS_EX_CLIENTEDGE, WC_TREELIST, "",
WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP|WS_GROUP|
TLS_HASBUTTONS|TLS_HASLINES|TLS_AUTOSCROLL|
TLS_SINGLESELECT|TLS_SHOWSELECTIONALWAYS,
rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top,
hwnd, (HMENU)IDC_PN_HOSTTREELIST, g_hinst, NULL);
sInitHostTreeList (paos->hwndHostTreeList);
sLoadHostTreeList (hwnd, paos, 0);
sUpdateHostTreeList (hwnd, paos);
// init on/off buttons
if (g_AOS.pnconfig.bPGPnetEnabled)
CheckRadioButton (hwnd,
IDC_PGPNETON, IDC_PGPNETOFF, IDC_PGPNETON);
else
CheckRadioButton (hwnd,
IDC_PGPNETON, IDC_PGPNETOFF, IDC_PGPNETOFF);
// disable "On/Off" and "Add" buttons if we don't have privileges
if (g_bReadOnly)
{
EnableWindow (GetDlgItem (hwnd, IDC_PGPNETON), FALSE);
EnableWindow (GetDlgItem (hwnd, IDC_PGPNETOFF), FALSE);
EnableWindow (GetDlgItem (hwnd, IDC_ADD), FALSE);
}
return FALSE;
}
case WM_SIZE :
sSizeControls (hwnd, LOWORD(lParam), HIWORD(lParam));
return 0;
case WM_DESTROY :
paos = (PAPPOPTIONSSTRUCT)GetWindowLong (hwnd, GWL_USERDATA);
SendMessage (paos->hwndHostTreeList, WM_CLOSE, 0, 0);
ImageList_Destroy (g_hil);
break;
case PGPNET_M_APPMESSAGE :
paos = (PAPPOPTIONSSTRUCT)GetWindowLong (hwnd, GWL_USERDATA);
switch (wParam) {
case PGPNET_PROMISCUOUSHOSTADDED :
{
UINT uPrevHostCount = paos->pnconfig.uHostCount;
PGPnetReloadConfiguration (g_context, &paos->pnconfig);
sLoadHostTreeList (hwnd, paos, uPrevHostCount);
sUpdateHostTreeList (hwnd, paos);
InvalidateRect (hwnd, NULL, FALSE);
paos->bUpdateHostList = FALSE;
break;
}
}
break;
case PGPNET_M_UPDATELIST :
// update treelist
paos = (PAPPOPTIONSSTRUCT)GetWindowLong (hwnd, GWL_USERDATA);
if (paos->bUpdateHostList)
{
sUpdateHostTreeList (hwnd, paos);
InvalidateRect (hwnd, NULL, FALSE);
paos->bUpdateHostList = FALSE;
}
break;
case PGPNET_M_ACTIVATEPAGE :
// update treelist
paos = (PAPPOPTIONSSTRUCT)GetWindowLong (hwnd, GWL_USERDATA);
if (paos->bUpdateHostList)
{
sUpdateHostTreeList (hwnd, paos);
InvalidateRect (hwnd, NULL, FALSE);
paos->bUpdateHostList = FALSE;
}
// nothing is selected
g_hTLSelected = NULL;
EnableWindow (GetDlgItem (hwnd, IDC_EDIT), FALSE);
EnableWindow (GetDlgItem (hwnd, IDC_REMOVE), FALSE);
EnableWindow (GetDlgItem (hwnd, IDC_CONNECT), FALSE);
EnableWindow (GetDlgItem (hwnd, IDC_DISCONNECT), FALSE);
// init on/off buttons
if (g_AOS.pnconfig.bPGPnetEnabled)
CheckRadioButton (hwnd,
IDC_PGPNETON, IDC_PGPNETOFF, IDC_PGPNETON);
else
CheckRadioButton (hwnd,
IDC_PGPNETON, IDC_PGPNETOFF, IDC_PGPNETOFF);
break;
case PGPNET_M_SETFOCUS :
paos = (PAPPOPTIONSSTRUCT)GetWindowLong (hwnd, GWL_USERDATA);
SetFocus (paos->hwndHostTreeList);
break;
case WM_NOTIFY :
if (wParam == IDC_PN_HOSTTREELIST)
{
LPNM_TREELIST pnmtl = (LPNM_TREELIST)lParam;
paos = (PAPPOPTIONSSTRUCT)GetWindowLong (hwnd, GWL_USERDATA);
switch (pnmtl->hdr.code) {
case TLN_SELCHANGED :
g_hTLSelected = pnmtl->itemNew.hItem;
if (pnmtl->itemNew.hItem)
{
EnableWindow (
GetDlgItem (hwnd, IDC_EDIT), !g_bReadOnly);
EnableWindow (
GetDlgItem (hwnd, IDC_REMOVE), !g_bReadOnly);
}
else
{
EnableWindow (GetDlgItem (hwnd, IDC_EDIT), FALSE);
EnableWindow (GetDlgItem (hwnd, IDC_REMOVE), FALSE);
}
if (sIsHostEntryDisconnectable (hwnd, paos))
{
ShowWindow (GetDlgItem (hwnd, IDC_CONNECT), SW_HIDE);
ShowWindow (GetDlgItem (hwnd, IDC_DISCONNECT), SW_SHOW);
EnableWindow (GetDlgItem (hwnd, IDC_DISCONNECT), TRUE);
}
else
{
ShowWindow (GetDlgItem (hwnd, IDC_DISCONNECT), SW_HIDE);
ShowWindow (GetDlgItem (hwnd, IDC_CONNECT), SW_SHOW);
EnableWindow (GetDlgItem (hwnd, IDC_CONNECT),
sIsHostEntryConnectable (hwnd, paos));
}
break;
case TLN_ITEMDBLCLICKED :
if (!g_bReadOnly)
SendMessage (hwnd, WM_COMMAND, IDC_EDIT, 0);
break;
case TLN_CONTEXTMENU :
sHostContextMenu (hwnd, paos,
((LPNM_TREELIST)lParam)->ptDrag.x,
((LPNM_TREELIST)lParam)->ptDrag.y);
break;
case TLN_KEYDOWN :
switch (((TL_KEYDOWN*)lParam)->wVKey) {
case VK_DELETE :
if (IsWindowEnabled (GetDlgItem (hwnd, IDC_REMOVE)))
PostMessage (hwnd, WM_COMMAND, IDC_REMOVE, 0);
break;
}
break;
}
}
break;
case WM_HELP:
WinHelp (((LPHELPINFO) lParam)->hItemHandle, g_szHelpFile,
HELP_WM_HELP, (DWORD) (LPSTR) aHostsIds);
return TRUE;
case WM_CONTEXTMENU :
if ((HWND)wParam == GetDlgItem (hwnd, IDC_HOSTTREE))
{
paos = (PAPPOPTIONSSTRUCT)GetWindowLong (hwnd, GWL_USERDATA);
sHostContextMenu (hwnd, paos, LOWORD(lParam), HIWORD(lParam));
}
else
WinHelp ((HWND) wParam, g_szHelpFile, HELP_CONTEXTMENU,
(DWORD) (LPVOID) aHostsIds);
break;
case WM_COMMAND :
paos = (PAPPOPTIONSSTRUCT)GetWindowLong (hwnd, GWL_USERDATA);
switch (LOWORD (wParam)) {
case IDC_EDIT :
if (g_hTLSelected)
{
INT iIndex;
TL_TREEITEM tlI;
BOOL bHasChildren;
tlI.hItem = g_hTLSelected;
tlI.mask = TLIF_PARAM | TLIF_CHILDHANDLE;
TreeList_GetItem (paos->hwndHostTreeList, &tlI);
iIndex = tlI.lParam;
bHasChildren = (tlI.hItem != NULL);
if (PNEditHostEntry (hwnd,
&paos->pnconfig, iIndex, bHasChildren))
{
InvalidateRect (hwnd, NULL, FALSE);
sUpdateEditedHostItem (paos,
&paos->pnconfig.pHostList[iIndex], g_hTLSelected);
sUpdateSingleHostItem (paos,
&paos->pnconfig.pHostList[iIndex], g_hTLSelected);
sAddHostInfoToItem (paos,
&paos->pnconfig.pHostList[iIndex], g_hTLSelected);
sTreeListToHostList (
paos->hwndHostTreeList, &paos->pnconfig);
PNSaveConfiguration (hwnd, &paos->pnconfig, FALSE);
}
SetFocus (paos->hwndHostTreeList);
}
break;
case IDC_REMOVE :
if (g_hTLSelected)
{
if (sRemoveHostEntry (hwnd, paos))
{
InvalidateRect (hwnd, NULL, FALSE);
sTreeListToHostList (
paos->hwndHostTreeList, &paos->pnconfig);
PNSaveConfiguration (hwnd, &paos->pnconfig, FALSE);
SetFocus (GetDlgItem (hwnd, IDC_REMOVE));
}
else
SetFocus (paos->hwndHostTreeList);
}
break;
case IDC_ADD :
{
UINT uPrevHostCount = paos->pnconfig.uHostCount;
if (sAddHostEntry (hwnd, paos))
{
sLoadHostTreeList (hwnd, paos, uPrevHostCount);
sUpdateHostTreeList (hwnd, paos);
InvalidateRect (hwnd, NULL, FALSE);
g_hwndForeground = GetParent (hwnd);
PNSaveConfiguration (hwnd, &paos->pnconfig, FALSE);
}
SetFocus (paos->hwndHostTreeList);
break;
}
case IDC_CONNECT :
if (g_hTLSelected)
sConnectToHostEntry (hwnd, paos);
break;
case IDC_DISCONNECT :
if (g_hTLSelected)
{
TL_TREEITEM tlI;
tlI.hItem = g_hTLSelected;
tlI.mask = TLIF_PARAM;
TreeList_GetItem (paos->hwndHostTreeList, &tlI);
if (PNRemoveHostSAs (
paos->pnconfig.pHostList[tlI.lParam].ipAddress,
paos->pnconfig.pHostList[tlI.lParam].ipMask))
{
sUpdateHostTreeList (hwnd, paos);
}
}
break;
case IDC_PGPNETOFF :
CheckRadioButton (hwnd,
IDC_PGPNETON, IDC_PGPNETOFF, IDC_PGPNETOFF);
PNSaveOnOffButtons (hwnd, g_context);
SetFocus (GetDlgItem (hwnd, IDC_PGPNETOFF));
break;
case IDC_PGPNETON :
CheckRadioButton (hwnd,
IDC_PGPNETON, IDC_PGPNETOFF, IDC_PGPNETON);
PNSaveOnOffButtons (hwnd, g_context);
SetFocus (GetDlgItem (hwnd, IDC_PGPNETON));
break;
case IDM_HOSTHELP :
WinHelp (paos->hwndHostTreeList, g_szHelpFile,
HELP_WM_HELP, (DWORD) (LPVOID) aHostsIds);
break;
}
return 0;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -