Something went wrong. Try again.
Reactos
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952/* * PROJECT: ReactOS System Control Panel Applet * LICENSE: GPL - See COPYING in the top level directory * FILE: dll/cpl/sysdm/environment.c * PURPOSE: Environment variable settings * COPYRIGHT: Copyright Eric Kohl * Copyright 2021 Arnav Bhatt <arnavbhatt288@gmail.com> */
#include "precomp.h"#include <commctrl.h>#include <commdlg.h>#include <string.h>
typedef struct _VARIABLE_DATA{ DWORD dwType; LPTSTR lpName; LPTSTR lpRawValue; LPTSTR lpCookedValue;} VARIABLE_DATA, *PVARIABLE_DATA;
typedef struct _ENVIRONMENT_DIALOG_DATA{ DWORD cxMin; DWORD cyMin; DWORD cxOld; DWORD cyOld;} ENVIRONMENT_DIALOG_DATA, *PENVIRONMENT_DIALOG_DATA;
typedef struct _ENVIRONMENT_EDIT_DIALOG_DATA{ BOOL bIsItemSelected; DWORD dwSelectedValueIndex; DWORD cxMin; DWORD cyMin; DWORD cxOld; DWORD cyOld; DWORD dwDlgID; HWND hEditBox; PVARIABLE_DATA VarData;} EDIT_DIALOG_DATA, *PEDIT_DIALOG_DATA;
static BOOLDetermineDialogBoxType(LPTSTR lpRawValue){ DWORD dwValueLength; LPTSTR lpTemp; LPTSTR lpToken;
dwValueLength = _tcslen(lpRawValue) + 1; lpTemp = GlobalAlloc(GPTR, dwValueLength * sizeof(TCHAR)); if (!lpTemp) return FALSE;
StringCchCopy(lpTemp, dwValueLength, lpRawValue);
for (lpToken = _tcstok(lpTemp, _T(";")); lpToken != NULL; lpToken = _tcstok(NULL, _T(";"))) { /* If the string has environment variable then expand it */ ExpandEnvironmentStrings(lpToken, lpToken, dwValueLength);
if (!PathIsDirectoryW(lpToken)) return FALSE; } GlobalFree(lpTemp);
return TRUE;}
static DWORDGatherDataFromEditBox(HWND hwndDlg, PVARIABLE_DATA VarData){ DWORD dwNameLength; DWORD dwValueLength;
dwNameLength = SendDlgItemMessage(hwndDlg, IDC_VARIABLE_NAME, WM_GETTEXTLENGTH, 0, 0); dwValueLength = SendDlgItemMessage(hwndDlg, IDC_VARIABLE_VALUE, WM_GETTEXTLENGTH, 0, 0);
if (dwNameLength == 0 || dwValueLength == 0) { return 0; }
/* Reallocate the name buffer, regrowing it if necessary */ if (!VarData->lpName || (_tcslen(VarData->lpName) < dwNameLength)) { if (VarData->lpName) GlobalFree(VarData->lpName);
VarData->lpName = GlobalAlloc(GPTR, (dwNameLength + 1) * sizeof(TCHAR)); if (!VarData->lpName) return 0; } SendDlgItemMessage(hwndDlg, IDC_VARIABLE_NAME, WM_GETTEXT, dwNameLength + 1, (LPARAM)VarData->lpName);
/* Reallocate the value buffer, regrowing it if necessary */ if (!VarData->lpRawValue || (_tcslen(VarData->lpRawValue) < dwValueLength)) { if (VarData->lpRawValue) GlobalFree(VarData->lpRawValue);
VarData->lpRawValue = GlobalAlloc(GPTR, (dwValueLength + 1) * sizeof(TCHAR)); if (!VarData->lpRawValue) return 0; } SendDlgItemMessage(hwndDlg, IDC_VARIABLE_VALUE, WM_GETTEXT, dwValueLength + 1, (LPARAM)VarData->lpRawValue);
return dwValueLength;}
static DWORDGatherDataFromListView(HWND hwndListView, PVARIABLE_DATA VarData){ DWORD dwValueLength; DWORD NumberOfItems; DWORD i; TCHAR szData[MAX_PATH];
/* Gather the number of items for the semi-colon */ NumberOfItems = ListView_GetItemCount(hwndListView); if (NumberOfItems == 0) { return 0; }
/* Since the last item doesn't need the semi-colon subtract 1 */ dwValueLength = NumberOfItems - 1;
for (i = 0; i < NumberOfItems; i++) { ListView_GetItemText(hwndListView, i, 0, szData, _countof(szData)); dwValueLength += _tcslen(szData); }
/* Reallocate the value buffer, regrowing it if necessary */ if (!VarData->lpRawValue || (_tcslen(VarData->lpRawValue) < dwValueLength)) { if (VarData->lpRawValue) GlobalFree(VarData->lpRawValue);
VarData->lpRawValue = GlobalAlloc(GPTR, (dwValueLength + 1) * sizeof(TCHAR)); if (!VarData->lpRawValue) return 0; }
/* First reinitialize the value buffer, then copy the variable values while * separating them with a semi-colon, except for the last value. */ VarData->lpRawValue[0] = _T('\0'); for (i = 0; i < NumberOfItems; i++) { if (i > 0) { StringCchCat(VarData->lpRawValue, dwValueLength + 1, _T(";")); } ListView_GetItemText(hwndListView, i, 0, szData, _countof(szData)); StringCchCat(VarData->lpRawValue, dwValueLength + 1, szData); } return dwValueLength;}
static INTGetSelectedListViewItem(HWND hwndListView){ INT iCount; INT iItem;
iCount = SendMessage(hwndListView, LVM_GETITEMCOUNT, 0, 0); if (iCount != LB_ERR) { for (iItem = 0; iItem < iCount; iItem++) { if (SendMessage(hwndListView, LVM_GETITEMSTATE, iItem, (LPARAM) LVIS_SELECTED) == LVIS_SELECTED) { return iItem; } } }
return -1;}
static LRESULT CALLBACKListViewSubclassProc(HWND hListBox, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData){ switch (uMsg) { case WM_DESTROY: { RemoveWindowSubclass(hListBox, ListViewSubclassProc, uIdSubclass); break; }
/* Whenever the control is resized make sure it doesn't spawn the horizontal scrollbar */ case WM_SIZE: { ShowScrollBar(hListBox, SB_HORZ, FALSE); break; } }
return DefSubclassProc(hListBox, uMsg, wParam, lParam);}
static VOIDAddEmptyItem(HWND hwndListView, DWORD dwSelectedValueIndex){ LV_ITEM lvi;
ZeroMemory(&lvi, sizeof(lvi)); lvi.mask = LVIF_TEXT | LVIF_STATE; lvi.cchTextMax = MAX_PATH; lvi.pszText = _T(""); lvi.iItem = dwSelectedValueIndex; lvi.iSubItem = 0; ListView_InsertItem(hwndListView, &lvi);}
static VOIDAddValuesToList(HWND hwndDlg, PEDIT_DIALOG_DATA DlgData){ LV_COLUMN column; LV_ITEM lvi; RECT rItem;
DWORD dwValueLength; DWORD i; HWND hwndListView; LPTSTR lpTemp; LPTSTR lpToken;
ZeroMemory(&column, sizeof(column)); ZeroMemory(&lvi, sizeof(lvi));
hwndListView = GetDlgItem(hwndDlg, IDC_LIST_VARIABLE_VALUE);
GetClientRect(hwndListView, &rItem);
column.mask = LVCF_WIDTH; column.cx = rItem.right; ListView_InsertColumn(hwndListView, 0, &column); ShowScrollBar(hwndListView, SB_HORZ, FALSE);
lvi.mask = LVIF_TEXT | LVIF_STATE; lvi.cchTextMax = MAX_PATH; lvi.iSubItem = 0;
dwValueLength = _tcslen(DlgData->VarData->lpRawValue) + 1; lpTemp = GlobalAlloc(GPTR, dwValueLength * sizeof(TCHAR)); if (!lpTemp) return;
StringCchCopy(lpTemp, dwValueLength, DlgData->VarData->lpRawValue);
for (lpToken = _tcstok(lpTemp, _T(";")), i = 0; lpToken != NULL; lpToken = _tcstok(NULL, _T(";")), i++) { lvi.iItem = i; lvi.pszText = lpToken; lvi.state = (i == 0) ? LVIS_SELECTED : 0; ListView_InsertItem(hwndListView, &lvi); }
DlgData->dwSelectedValueIndex = 0; ListView_SetExtendedListViewStyle(hwndListView, LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); ListView_SetItemState(hwndListView, DlgData->dwSelectedValueIndex, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
ListView_Update(hwndListView, DlgData->dwSelectedValueIndex); GlobalFree(lpTemp);}
static VOIDBrowseRequiredFile(HWND hwndDlg){ OPENFILENAME ofn; TCHAR szFilter[MAX_STR_LENGTH] = _T(""); TCHAR szFile[MAX_PATH] = _T("");
LoadString(hApplet, IDS_FILE_BROWSE_FILTER, szFilter, _countof(szFilter));
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwndDlg; ofn.lpstrFilter = szFilter; ofn.lpstrFile = szFile; ofn.nMaxFile = _countof(szFile); ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
if (GetOpenFileName(&ofn)) { SetDlgItemText(hwndDlg, IDC_VARIABLE_VALUE, szFile); }}
static VOIDBrowseRequiredFolder(HWND hwndDlg, PEDIT_DIALOG_DATA DlgData){ HWND hwndListView; TCHAR szDir[MAX_PATH];
BROWSEINFO bi; LPITEMIDLIST pidllist;
ZeroMemory(&bi, sizeof(bi)); bi.hwndOwner = hwndDlg; bi.ulFlags = BIF_NEWDIALOGSTYLE;
hwndListView = GetDlgItem(hwndDlg, IDC_LIST_VARIABLE_VALUE);
pidllist = SHBrowseForFolder(&bi); if (!pidllist) { return; }
if (SHGetPathFromIDList(pidllist, szDir)) { if (DlgData->dwDlgID == IDD_EDIT_VARIABLE_FANCY) { /* If no item is selected then create a new empty item and add the required location to it */ if (!DlgData->bIsItemSelected) { DlgData->dwSelectedValueIndex = ListView_GetItemCount(hwndListView); AddEmptyItem(hwndListView, DlgData->dwSelectedValueIndex); } ListView_SetItemText(hwndListView, DlgData->dwSelectedValueIndex, 0, szDir); ListView_SetItemState(hwndListView, DlgData->dwSelectedValueIndex, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); } else { SetDlgItemText(hwndDlg, IDC_VARIABLE_VALUE, szDir); } }
CoTaskMemFree(pidllist);}
static VOIDMoveListItem(HWND hwndDlg, PEDIT_DIALOG_DATA DlgData, BOOL bMoveUp){ TCHAR szDest[MAX_PATH]; TCHAR szSource[MAX_PATH]; HWND hwndListView; DWORD dwSrcIndex, dwDestIndex, dwLastIndex;
hwndListView = GetDlgItem(hwndDlg, IDC_LIST_VARIABLE_VALUE);
dwLastIndex = ListView_GetItemCount(hwndListView) - 1; dwSrcIndex = DlgData->dwSelectedValueIndex; dwDestIndex = bMoveUp ? (dwSrcIndex - 1) : (dwSrcIndex + 1);
if ((bMoveUp && dwSrcIndex > 0) || (!bMoveUp && dwSrcIndex < dwLastIndex)) { ListView_GetItemText(hwndListView, dwSrcIndex, 0, szDest, _countof(szDest)); ListView_GetItemText(hwndListView, dwDestIndex, 0, szSource, _countof(szSource));
ListView_SetItemText(hwndListView, dwDestIndex, 0, szDest); ListView_SetItemText(hwndListView, dwSrcIndex, 0, szSource);
DlgData->dwSelectedValueIndex = dwDestIndex; ListView_SetItemState(hwndListView, DlgData->dwSelectedValueIndex, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); }}
static VOIDOnEnvironmentEditDlgResize(HWND hwndDlg, PEDIT_DIALOG_DATA DlgData, DWORD cx, DWORD cy){ RECT rect; HDWP hdwp = NULL; HWND hItemWnd;
if ((cx == DlgData->cxOld) && (cy == DlgData->cyOld)) return;
if (DlgData->dwDlgID == IDD_EDIT_VARIABLE) { hdwp = BeginDeferWindowPos(5);
/* For the edit control */ hItemWnd = GetDlgItem(hwndDlg, IDC_VARIABLE_NAME); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, 0, 0, (rect.right - rect.left) + (cx - DlgData->cxOld), rect.bottom - rect.top, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDC_VARIABLE_VALUE); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, 0, 0, (rect.right - rect.left) + (cx - DlgData->cxOld), rect.bottom - rect.top, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); } } else if (DlgData->dwDlgID == IDD_EDIT_VARIABLE_FANCY) { hdwp = BeginDeferWindowPos(11);
/* For the list view control */ hItemWnd = GetDlgItem(hwndDlg, IDC_LIST_VARIABLE_VALUE); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, 0, 0, (rect.right - rect.left) + (cx - DlgData->cxOld), (rect.bottom - rect.top) + (cy - DlgData->cyOld), SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); ListView_SetColumnWidth(hItemWnd, 0, (rect.right - rect.left) + (cx - DlgData->cxOld)); }
/* For the buttons */ hItemWnd = GetDlgItem(hwndDlg, IDC_BUTTON_BROWSE_FOLDER); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left + (cx - DlgData->cxOld), rect.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDC_BUTTON_NEW); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left + (cx - DlgData->cxOld), rect.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDC_BUTTON_EDIT); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left + (cx - DlgData->cxOld), rect.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDC_BUTTON_DELETE); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left + (cx - DlgData->cxOld), rect.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDC_BUTTON_MOVE_UP); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left + (cx - DlgData->cxOld), rect.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDC_BUTTON_MOVE_DOWN); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left + (cx - DlgData->cxOld), rect.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDC_BUTTON_EDIT_TEXT); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left + (cx - DlgData->cxOld), rect.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); } }
hItemWnd = GetDlgItem(hwndDlg, IDOK); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left + (cx - DlgData->cxOld), rect.top + (cy - DlgData->cyOld), 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDCANCEL); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left + (cx - DlgData->cxOld), rect.top + (cy - DlgData->cyOld), 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
/* For the size grip */ hItemWnd = GetDlgItem(hwndDlg, IDC_DIALOG_GRIP); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left + (cx - DlgData->cxOld), rect.top + (cy - DlgData->cyOld), 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
if (hdwp) { EndDeferWindowPos(hdwp); }
DlgData->cxOld = cx; DlgData->cyOld = cy;}
static BOOLOnBeginLabelEdit(NMLVDISPINFO* pnmv){ HWND hwndEdit;
hwndEdit = ListView_GetEditControl(pnmv->hdr.hwndFrom); if (hwndEdit == NULL) { return TRUE; }
SendMessage(hwndEdit, EM_SETLIMITTEXT, MAX_PATH - 1, 0);
return FALSE;}
static BOOLOnEndLabelEdit(NMLVDISPINFO* pnmv){ HWND hwndEdit; TCHAR szOldDir[MAX_PATH]; TCHAR szNewDir[MAX_PATH];
hwndEdit = ListView_GetEditControl(pnmv->hdr.hwndFrom); if (hwndEdit == NULL) { return TRUE; }
/* Leave, if there is no valid listview item */ if (pnmv->item.iItem == -1) { return FALSE; }
ListView_GetItemText(pnmv->hdr.hwndFrom, pnmv->item.iItem, 0, szOldDir, _countof(szOldDir));
SendMessage(hwndEdit, WM_GETTEXT, _countof(szNewDir), (LPARAM)szNewDir);
/* If there is nothing in the text box then remove the item */ if (_tcslen(szNewDir) == 0) { ListView_DeleteItem(pnmv->hdr.hwndFrom, pnmv->item.iItem); ListView_SetItemState(pnmv->hdr.hwndFrom, pnmv->item.iItem - 1, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); return FALSE; }
/* If nothing has been changed then just bail out */ if (_tcscmp(szOldDir, szNewDir) == 0) { return FALSE; }
ListView_SetItemText(pnmv->hdr.hwndFrom, pnmv->item.iItem, 0, szNewDir);
return TRUE;}
static BOOLOnNotifyEditVariableDlg(HWND hwndDlg, PEDIT_DIALOG_DATA DlgData, NMHDR *phdr){ LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)phdr;
switch (phdr->idFrom) { case IDC_LIST_VARIABLE_VALUE: switch (phdr->code) { case NM_CLICK: { /* Detect if an item is selected */ DlgData->bIsItemSelected = (lpnmlv->iItem != -1); if (lpnmlv->iItem != -1) { DlgData->dwSelectedValueIndex = lpnmlv->iItem; } break; }
case NM_DBLCLK: { /* Either simulate IDC_BUTTON_NEW or edit an item depending upon the condition */ if (lpnmlv->iItem == -1) { SendMessage(GetDlgItem(hwndDlg, IDC_BUTTON_NEW), BM_CLICK, 0, 0); } else { ListView_EditLabel(GetDlgItem(hwndDlg, IDC_LIST_VARIABLE_VALUE), DlgData->dwSelectedValueIndex); } break; }
case LVN_BEGINLABELEDIT: { return OnBeginLabelEdit((NMLVDISPINFO*)phdr); }
case LVN_ENDLABELEDIT: { return OnEndLabelEdit((NMLVDISPINFO*)phdr); } } break; }
return FALSE;}
static INT_PTR CALLBACKEditVariableDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){ PEDIT_DIALOG_DATA DlgData; HWND hwndListView;
DlgData = (PEDIT_DIALOG_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER); hwndListView = GetDlgItem(hwndDlg, IDC_LIST_VARIABLE_VALUE);
switch (uMsg) { case WM_INITDIALOG: { RECT rect;
SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam); DlgData = (PEDIT_DIALOG_DATA)lParam;
GetClientRect(hwndDlg, &rect); DlgData->cxOld = rect.right - rect.left; DlgData->cyOld = rect.bottom - rect.top;
GetWindowRect(hwndDlg, &rect); DlgData->cxMin = rect.right - rect.left; DlgData->cyMin = rect.bottom - rect.top;
/* Either get the values from list box or from edit box */ if (DlgData->dwDlgID == IDD_EDIT_VARIABLE_FANCY) { /* Subclass the listview control first */ SetWindowSubclass(hwndListView, ListViewSubclassProc, 1, 0);
if (DlgData->VarData->lpRawValue != NULL) { AddValuesToList(hwndDlg, DlgData); } } else { if (DlgData->VarData->lpName != NULL) { SendDlgItemMessage(hwndDlg, IDC_VARIABLE_NAME, WM_SETTEXT, 0, (LPARAM)DlgData->VarData->lpName); }
if (DlgData->VarData->lpRawValue != NULL) { SendDlgItemMessage(hwndDlg, IDC_VARIABLE_VALUE, WM_SETTEXT, 0, (LPARAM)DlgData->VarData->lpRawValue); } } break; }
case WM_SIZE: { OnEnvironmentEditDlgResize(hwndDlg, DlgData, LOWORD(lParam), HIWORD(lParam)); SetWindowLongPtrW(hwndDlg, DWLP_MSGRESULT, 0); return TRUE; }
case WM_SIZING: { /* Forbid resizing the dialog smaller than its minimal size */ PRECT pRect = (PRECT)lParam;
if ((wParam == WMSZ_LEFT) || (wParam == WMSZ_TOPLEFT) || (wParam == WMSZ_BOTTOMLEFT)) { if (pRect->right - pRect->left < DlgData->cxMin) pRect->left = pRect->right - DlgData->cxMin; } else if ((wParam == WMSZ_RIGHT) || (wParam == WMSZ_TOPRIGHT) || (wParam == WMSZ_BOTTOMRIGHT)) { if (pRect->right - pRect->left < DlgData->cxMin) pRect->right = pRect->left + DlgData->cxMin; }
if ((wParam == WMSZ_TOP) || (wParam == WMSZ_TOPLEFT) || (wParam == WMSZ_TOPRIGHT)) { if (pRect->bottom - pRect->top < DlgData->cyMin) pRect->top = pRect->bottom - DlgData->cyMin; } else if ((wParam == WMSZ_BOTTOM) || (wParam == WMSZ_BOTTOMLEFT) || (wParam == WMSZ_BOTTOMRIGHT)) { if (pRect->bottom - pRect->top < DlgData->cyMin) pRect->bottom = pRect->top + DlgData->cyMin; }
/* Make sure the normal variable edit dialog doesn't change its height */ if (DlgData->dwDlgID == IDD_EDIT_VARIABLE) { if ((wParam == WMSZ_TOP) || (wParam == WMSZ_TOPLEFT) || (wParam == WMSZ_TOPRIGHT)) { if (pRect->bottom - pRect->top > DlgData->cyMin) pRect->top = pRect->bottom - DlgData->cyMin; } else if ((wParam == WMSZ_BOTTOM) || (wParam == WMSZ_BOTTOMLEFT) || (wParam == WMSZ_BOTTOMRIGHT)) { if (pRect->bottom - pRect->top > DlgData->cyMin) pRect->bottom = pRect->top + DlgData->cyMin; } }
SetWindowLongPtrW(hwndDlg, DWLP_MSGRESULT, TRUE); return TRUE; }
case WM_NOTIFY: { return OnNotifyEditVariableDlg(hwndDlg, DlgData, (NMHDR*)lParam); }
case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: { LPTSTR p; DWORD dwValueLength;
/* Either set the values to the list box or to the edit box */ if (DlgData->dwDlgID == IDD_EDIT_VARIABLE_FANCY) { dwValueLength = GatherDataFromListView(hwndListView, DlgData->VarData); } else { dwValueLength = GatherDataFromEditBox(hwndDlg, DlgData->VarData); }
if (dwValueLength == 0) { break; }
if (DlgData->VarData->lpCookedValue != NULL) { GlobalFree(DlgData->VarData->lpCookedValue); DlgData->VarData->lpCookedValue = NULL; }
p = _tcschr(DlgData->VarData->lpRawValue, _T('%')); if (p && _tcschr(++p, _T('%'))) { DlgData->VarData->dwType = REG_EXPAND_SZ;
DlgData->VarData->lpCookedValue = GlobalAlloc(GPTR, 2 * MAX_PATH * sizeof(TCHAR)); if (!DlgData->VarData->lpCookedValue) return FALSE;
ExpandEnvironmentStrings(DlgData->VarData->lpRawValue, DlgData->VarData->lpCookedValue, 2 * MAX_PATH); } else { DlgData->VarData->dwType = REG_SZ;
DlgData->VarData->lpCookedValue = GlobalAlloc(GPTR, (dwValueLength + 1) * sizeof(TCHAR)); if (!DlgData->VarData->lpCookedValue) return FALSE;
_tcscpy(DlgData->VarData->lpCookedValue, DlgData->VarData->lpRawValue); }
EndDialog(hwndDlg, 1); return TRUE; }
case IDCANCEL: EndDialog(hwndDlg, 0); return TRUE;
case IDC_BUTTON_BROWSE_FILE: { BrowseRequiredFile(hwndDlg); break; }
case IDC_BUTTON_BROWSE_FOLDER: { BrowseRequiredFolder(hwndDlg, DlgData); break; }
case IDC_BUTTON_DELETE: { DWORD dwLastIndex;
dwLastIndex = ListView_GetItemCount(hwndListView) - 1; ListView_DeleteItem(hwndListView, DlgData->dwSelectedValueIndex);
if (dwLastIndex == DlgData->dwSelectedValueIndex) { DlgData->dwSelectedValueIndex--; }
ListView_SetItemState(hwndListView, DlgData->dwSelectedValueIndex, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); break; }
case IDC_BUTTON_MOVE_UP: { MoveListItem(hwndDlg, DlgData, TRUE); break; }
case IDC_BUTTON_MOVE_DOWN: { MoveListItem(hwndDlg, DlgData, FALSE); break; }
case IDC_BUTTON_EDIT_TEXT: { if (ResourceMessageBox(hApplet, hwndDlg, MB_OKCANCEL | MB_ICONWARNING | MB_DEFBUTTON1, IDS_ENVIRONMENT_WARNING_TITLE, IDS_ENVIRONMENT_WARNING) == IDOK) { EndDialog(hwndDlg, -1); } break; }
case IDC_BUTTON_NEW: { DlgData->dwSelectedValueIndex = ListView_GetItemCount(hwndListView); AddEmptyItem(hwndListView, DlgData->dwSelectedValueIndex); ListView_EditLabel(hwndListView, DlgData->dwSelectedValueIndex); break; }
case IDC_BUTTON_EDIT: { ListView_EditLabel(hwndListView, DlgData->dwSelectedValueIndex); break; } } break; }
return FALSE;}
static VOIDGetEnvironmentVariables(HWND hwndListView, HKEY hRootKey, LPTSTR lpSubKeyName){ HKEY hKey; DWORD dwValues; DWORD dwMaxValueNameLength; DWORD dwMaxValueDataLength; DWORD i; LPTSTR lpName; LPTSTR lpData; LPTSTR lpExpandData; DWORD dwNameLength; DWORD dwDataLength; DWORD dwType; PVARIABLE_DATA VarData;
LV_ITEM lvi; int iItem;
if (RegOpenKeyEx(hRootKey, lpSubKeyName, 0, KEY_READ, &hKey)) return;
if (RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwValues, &dwMaxValueNameLength, &dwMaxValueDataLength, NULL, NULL)) { RegCloseKey(hKey); return; }
lpName = GlobalAlloc(GPTR, (dwMaxValueNameLength + 1) * sizeof(TCHAR)); if (lpName == NULL) { RegCloseKey(hKey); return; }
lpData = GlobalAlloc(GPTR, (dwMaxValueDataLength + 1) * sizeof(TCHAR)); if (lpData == NULL) { GlobalFree(lpName); RegCloseKey(hKey); return; }
lpExpandData = GlobalAlloc(GPTR, 2048 * sizeof(TCHAR)); if (lpExpandData == NULL) { GlobalFree(lpName); GlobalFree(lpData); RegCloseKey(hKey); return; }
for (i = 0; i < dwValues; i++) { dwNameLength = dwMaxValueNameLength + 1; dwDataLength = dwMaxValueDataLength + 1;
if (RegEnumValue(hKey, i, lpName, &dwNameLength, NULL, &dwType, (LPBYTE)lpData, &dwDataLength)) { GlobalFree(lpExpandData); GlobalFree(lpName); GlobalFree(lpData); RegCloseKey(hKey); return; }
if (dwType != REG_SZ && dwType != REG_EXPAND_SZ) continue;
VarData = GlobalAlloc(GPTR, sizeof(VARIABLE_DATA));
VarData->dwType = dwType;
VarData->lpName = GlobalAlloc(GPTR, (dwNameLength + 1) * sizeof(TCHAR)); _tcscpy(VarData->lpName, lpName);
VarData->lpRawValue = GlobalAlloc(GPTR, (dwDataLength + 1) * sizeof(TCHAR)); _tcscpy(VarData->lpRawValue, lpData);
ExpandEnvironmentStrings(lpData, lpExpandData, 2048);
VarData->lpCookedValue = GlobalAlloc(GPTR, (_tcslen(lpExpandData) + 1) * sizeof(TCHAR)); _tcscpy(VarData->lpCookedValue, lpExpandData);
memset(&lvi, 0x00, sizeof(lvi)); lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_PARAM; lvi.lParam = (LPARAM)VarData; lvi.pszText = VarData->lpName; lvi.state = (i == 0) ? LVIS_SELECTED : 0; iItem = ListView_InsertItem(hwndListView, &lvi);
ListView_SetItemText(hwndListView, iItem, 1, VarData->lpCookedValue); }
GlobalFree(lpExpandData); GlobalFree(lpName); GlobalFree(lpData); RegCloseKey(hKey);}
static VOIDSetEnvironmentDialogListViewColumns(HWND hwndListView){ RECT rect; LV_COLUMN column; TCHAR szStr[32];
GetClientRect(hwndListView, &rect);
memset(&column, 0x00, sizeof(column)); column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; column.fmt=LVCFMT_LEFT; column.cx = (INT)((rect.right - rect.left) * 0.32); column.iSubItem = 0; LoadString(hApplet, IDS_VARIABLE, szStr, sizeof(szStr) / sizeof(szStr[0])); column.pszText = szStr; (void)ListView_InsertColumn(hwndListView, 0, &column);
column.cx = (INT)((rect.right - rect.left) * 0.63); column.iSubItem = 1; LoadString(hApplet, IDS_VALUE, szStr, sizeof(szStr) / sizeof(szStr[0])); column.pszText = szStr; (void)ListView_InsertColumn(hwndListView, 1, &column);}
static VOIDOnInitEnvironmentDialog(HWND hwndDlg){ HWND hwndListView;
/* Set user environment variables */ hwndListView = GetDlgItem(hwndDlg, IDC_USER_VARIABLE_LIST);
(void)ListView_SetExtendedListViewStyle(hwndListView, LVS_EX_FULLROWSELECT);
SetEnvironmentDialogListViewColumns(hwndListView);
GetEnvironmentVariables(hwndListView, HKEY_CURRENT_USER, _T("Environment"));
(void)ListView_SetColumnWidth(hwndListView, 2, LVSCW_AUTOSIZE_USEHEADER);
ListView_SetItemState(hwndListView, 0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
(void)ListView_Update(hwndListView,0);
/* Set system environment variables */ hwndListView = GetDlgItem(hwndDlg, IDC_SYSTEM_VARIABLE_LIST);
(void)ListView_SetExtendedListViewStyle(hwndListView, LVS_EX_FULLROWSELECT);
SetEnvironmentDialogListViewColumns(hwndListView);
GetEnvironmentVariables(hwndListView, HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"));
(void)ListView_SetColumnWidth(hwndListView, 2, LVSCW_AUTOSIZE_USEHEADER);
ListView_SetItemState(hwndListView, 0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
(void)ListView_Update(hwndListView, 0);}
static VOIDOnNewVariable(HWND hwndDlg, INT iDlgItem){ HWND hwndListView; PEDIT_DIALOG_DATA DlgData; LV_ITEM lvi; INT iItem;
DlgData = GlobalAlloc(GPTR, sizeof(EDIT_DIALOG_DATA)); if (!DlgData) return;
hwndListView = GetDlgItem(hwndDlg, iDlgItem); DlgData->dwDlgID = IDD_EDIT_VARIABLE; DlgData->dwSelectedValueIndex = -1;
DlgData->VarData = GlobalAlloc(GPTR, sizeof(VARIABLE_DATA)); if (!DlgData->VarData) return;
if (DialogBoxParam(hApplet, MAKEINTRESOURCE(DlgData->dwDlgID), hwndDlg, EditVariableDlgProc, (LPARAM)DlgData) <= 0) { if (DlgData->VarData->lpName != NULL) GlobalFree(DlgData->VarData->lpName);
if (DlgData->VarData->lpRawValue != NULL) GlobalFree(DlgData->VarData->lpRawValue);
if (DlgData->VarData->lpCookedValue != NULL) GlobalFree(DlgData->VarData->lpCookedValue);
GlobalFree(DlgData); } else { if (DlgData->VarData->lpName != NULL && (DlgData->VarData->lpCookedValue || DlgData->VarData->lpRawValue)) { ZeroMemory(&lvi, sizeof(lvi)); lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_PARAM; lvi.lParam = (LPARAM)DlgData->VarData; lvi.pszText = DlgData->VarData->lpName; lvi.state = 0; iItem = ListView_InsertItem(hwndListView, &lvi);
ListView_SetItemText(hwndListView, iItem, 1, DlgData->VarData->lpCookedValue); } }}
static VOIDOnEditVariable(HWND hwndDlg, INT iDlgItem){ HWND hwndListView; PEDIT_DIALOG_DATA DlgData; LV_ITEM lvi; INT iItem; INT iRet;
DlgData = GlobalAlloc(GPTR, sizeof(EDIT_DIALOG_DATA)); if (!DlgData) return;
DlgData->dwDlgID = IDD_EDIT_VARIABLE; DlgData->dwSelectedValueIndex = -1;
hwndListView = GetDlgItem(hwndDlg, iDlgItem);
iItem = GetSelectedListViewItem(hwndListView); if (iItem != -1) { ZeroMemory(&lvi, sizeof(lvi)); lvi.mask = LVIF_PARAM; lvi.iItem = iItem;
if (ListView_GetItem(hwndListView, &lvi)) { DlgData->VarData = (PVARIABLE_DATA)lvi.lParam;
/* If the value has multiple values and directories then edit value with fancy dialog box */ if (DetermineDialogBoxType(DlgData->VarData->lpRawValue)) DlgData->dwDlgID = IDD_EDIT_VARIABLE_FANCY;
iRet = DialogBoxParam(hApplet, MAKEINTRESOURCE(DlgData->dwDlgID), hwndDlg, EditVariableDlgProc, (LPARAM)DlgData);
/* If iRet is less than 0 edit the value and name normally */ if (iRet < 0) { DlgData->dwDlgID = IDD_EDIT_VARIABLE; iRet = DialogBoxParam(hApplet, MAKEINTRESOURCE(DlgData->dwDlgID), hwndDlg, EditVariableDlgProc, (LPARAM)DlgData); }
if (iRet > 0) { ListView_SetItemText(hwndListView, iItem, 0, DlgData->VarData->lpName); ListView_SetItemText(hwndListView, iItem, 1, DlgData->VarData->lpCookedValue); } }
GlobalFree(DlgData); }}
static VOIDOnDeleteVariable(HWND hwndDlg, INT iDlgItem){ HWND hwndListView; PVARIABLE_DATA VarData; LV_ITEM lvi; INT iItem;
hwndListView = GetDlgItem(hwndDlg, iDlgItem);
iItem = GetSelectedListViewItem(hwndListView); if (iItem != -1) { memset(&lvi, 0x00, sizeof(lvi)); lvi.mask = LVIF_PARAM; lvi.iItem = iItem;
if (ListView_GetItem(hwndListView, &lvi)) { VarData = (PVARIABLE_DATA)lvi.lParam; if (VarData != NULL) { if (VarData->lpName != NULL) GlobalFree(VarData->lpName);
if (VarData->lpRawValue != NULL) GlobalFree(VarData->lpRawValue);
if (VarData->lpCookedValue != NULL) GlobalFree(VarData->lpCookedValue);
GlobalFree(VarData); lvi.lParam = 0; } }
(void)ListView_DeleteItem(hwndListView, iItem);
/* Select the previous item */ if (iItem > 0) iItem--;
ListView_SetItemState(hwndListView, iItem, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); }}
static VOIDOnEnvironmentDlgResize(HWND hwndDlg, PENVIRONMENT_DIALOG_DATA DlgData, DWORD cx, DWORD cy){ RECT rect; INT Colx, y = 0; HDWP hdwp = NULL; HWND hItemWnd;
if ((cx == DlgData->cxOld) && (cy == DlgData->cyOld)) return;
hdwp = BeginDeferWindowPos(13);
if (cy >= DlgData->cyOld) y += (cy - DlgData->cyOld + 1) / 2; else y -= (DlgData->cyOld - cy + 1) / 2;
/* For the group box controls */ hItemWnd = GetDlgItem(hwndDlg, IDC_USER_VARIABLE_GROUP); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, 0, 0, (rect.right - rect.left) + (cx - DlgData->cxOld), (rect.bottom - rect.top) + y, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDC_SYSTEM_VARIABLE_GROUP); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left, rect.top + y, (rect.right - rect.left) + (cx - DlgData->cxOld), (rect.bottom - rect.top) + y, SWP_NOZORDER | SWP_NOACTIVATE); }
/* For the list view controls */ hItemWnd = GetDlgItem(hwndDlg, IDC_USER_VARIABLE_LIST); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, 0, 0, (rect.right - rect.left) + (cx - DlgData->cxOld), (rect.bottom - rect.top) + y, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); Colx = ListView_GetColumnWidth(hItemWnd, 1); ListView_SetColumnWidth(hItemWnd, 1, Colx + (cx - DlgData->cxOld)); }
hItemWnd = GetDlgItem(hwndDlg, IDC_SYSTEM_VARIABLE_LIST); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left, rect.top + y, (rect.right - rect.left) + (cx - DlgData->cxOld), (rect.bottom - rect.top) + y, SWP_NOZORDER | SWP_NOACTIVATE); Colx = ListView_GetColumnWidth(hItemWnd, 1); ListView_SetColumnWidth(hItemWnd, 1, Colx + (cx - DlgData->cxOld)); }
/* For the buttons */ hItemWnd = GetDlgItem(hwndDlg, IDC_USER_VARIABLE_NEW); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left + (cx - DlgData->cxOld), rect.top + y, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDC_USER_VARIABLE_EDIT); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left + (cx - DlgData->cxOld), rect.top + y, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDC_USER_VARIABLE_DELETE); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left + (cx - DlgData->cxOld), rect.top + y, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDC_SYSTEM_VARIABLE_NEW); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left + (cx - DlgData->cxOld), rect.top + y * 2, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDC_SYSTEM_VARIABLE_EDIT); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left + (cx - DlgData->cxOld), rect.top + y * 2, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDC_SYSTEM_VARIABLE_DELETE); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left + (cx - DlgData->cxOld), rect.top + y * 2, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDOK); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left + (cx - DlgData->cxOld), rect.top + (cy - DlgData->cyOld), 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDCANCEL); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left + (cx - DlgData->cxOld), rect.top + (cy - DlgData->cyOld), 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
/* For the size grip */ hItemWnd = GetDlgItem(hwndDlg, IDC_DIALOG_GRIP); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
if (hdwp) { hdwp = DeferWindowPos(hdwp, hItemWnd, NULL, rect.left + (cx - DlgData->cxOld), rect.top + (cy - DlgData->cyOld), 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
if (hdwp) { EndDeferWindowPos(hdwp); }
DlgData->cxOld = cx; DlgData->cyOld = cy;}
static VOIDReleaseListViewItems(HWND hwndDlg, INT iDlgItem){ HWND hwndListView; PVARIABLE_DATA VarData; LV_ITEM lvi; INT nItemCount; INT i;
hwndListView = GetDlgItem(hwndDlg, iDlgItem);
memset(&lvi, 0x00, sizeof(lvi));
nItemCount = ListView_GetItemCount(hwndListView); for (i = 0; i < nItemCount; i++) { lvi.mask = LVIF_PARAM; lvi.iItem = i;
if (ListView_GetItem(hwndListView, &lvi)) { VarData = (PVARIABLE_DATA)lvi.lParam; if (VarData != NULL) { if (VarData->lpName != NULL) GlobalFree(VarData->lpName);
if (VarData->lpRawValue != NULL) GlobalFree(VarData->lpRawValue);
if (VarData->lpCookedValue != NULL) GlobalFree(VarData->lpCookedValue);
GlobalFree(VarData); lvi.lParam = 0; } } }}
static VOIDSetAllVars(HWND hwndDlg, INT iDlgItem){ HWND hwndListView; PVARIABLE_DATA VarData; LV_ITEM lvi; INT iItem; HKEY hKey; DWORD dwValueCount; DWORD dwMaxValueNameLength; LPTSTR *aValueArray; DWORD dwNameLength; DWORD i; TCHAR szBuffer[256]; LPTSTR lpBuffer;
memset(&lvi, 0x00, sizeof(lvi));
/* Get the handle to the list box with all system vars in it */ hwndListView = GetDlgItem(hwndDlg, iDlgItem); /* First item is 0 */ iItem = 0; /* Set up struct to retrieve item */ lvi.mask = LVIF_PARAM; lvi.iItem = iItem;
/* Open or create the key */ if (RegCreateKeyEx((iDlgItem == IDC_SYSTEM_VARIABLE_LIST ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER), (iDlgItem == IDC_SYSTEM_VARIABLE_LIST ? _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment") : _T("Environment")), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE | KEY_READ, NULL, &hKey, NULL)) { return; }
/* Get the number of values and the maximum value name length */ if (RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwValueCount, &dwMaxValueNameLength, NULL, NULL, NULL)) { RegCloseKey(hKey); return; }
if (dwValueCount > 0) { /* Allocate the value array */ aValueArray = GlobalAlloc(GPTR, dwValueCount * sizeof(LPTSTR)); if (aValueArray != NULL) { /* Get all value names */ for (i = 0; i < dwValueCount; i++) { dwNameLength = 256; if (!RegEnumValue(hKey, i, szBuffer, &dwNameLength, NULL, NULL, NULL, NULL)) { /* Allocate a value name buffer, fill it and attach it to the array */ lpBuffer = (LPTSTR)GlobalAlloc(GPTR, (dwNameLength + 1) * sizeof(TCHAR)); if (lpBuffer != NULL) { _tcscpy(lpBuffer, szBuffer); aValueArray[i] = lpBuffer; } } }
/* Delete all values */ for (i = 0; i < dwValueCount; i++) { if (aValueArray[i] != NULL) { /* Delete the value */ RegDeleteValue(hKey, aValueArray[i]);
/* Free the value name */ GlobalFree(aValueArray[i]); } }
/* Free the value array */ GlobalFree(aValueArray); } }
/* Loop through all variables */ while (ListView_GetItem(hwndListView, &lvi)) { /* Get the data in each item */ VarData = (PVARIABLE_DATA)lvi.lParam; if (VarData != NULL) { /* Set the new value */ if (RegSetValueEx(hKey, VarData->lpName, 0, VarData->dwType, (LPBYTE)VarData->lpRawValue, (DWORD)(_tcslen(VarData->lpRawValue) + 1) * sizeof(TCHAR))) { RegCloseKey(hKey); return; } }
/* Fill struct for next item */ lvi.mask = LVIF_PARAM; lvi.iItem = ++iItem; }
RegCloseKey(hKey);}
static BOOLOnNotify(HWND hwndDlg, NMHDR *phdr){ switch (phdr->code) { case NM_DBLCLK: if (phdr->idFrom == IDC_USER_VARIABLE_LIST || phdr->idFrom == IDC_SYSTEM_VARIABLE_LIST) { OnEditVariable(hwndDlg, (INT)phdr->idFrom); return TRUE; } break;
case LVN_KEYDOWN: if (((LPNMLVKEYDOWN)phdr)->wVKey == VK_DELETE && (phdr->idFrom == IDC_USER_VARIABLE_LIST || phdr->idFrom == IDC_SYSTEM_VARIABLE_LIST)) { OnDeleteVariable(hwndDlg, (INT)phdr->idFrom); return TRUE; } break; }
return FALSE;}
/* Environment dialog procedure */INT_PTR CALLBACKEnvironmentDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){ PENVIRONMENT_DIALOG_DATA DlgData; DlgData = (PENVIRONMENT_DIALOG_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
switch (uMsg) { case WM_INITDIALOG: { RECT rect;
DlgData = GlobalAlloc(GPTR, sizeof(ENVIRONMENT_DIALOG_DATA)); if (!DlgData) { EndDialog(hwndDlg, 0); return (INT_PTR)TRUE; } SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)DlgData);
GetClientRect(hwndDlg, &rect); DlgData->cxOld = rect.right - rect.left; DlgData->cyOld = rect.bottom - rect.top;
GetWindowRect(hwndDlg, &rect); DlgData->cxMin = rect.right - rect.left; DlgData->cyMin = rect.bottom - rect.top;
OnInitEnvironmentDialog(hwndDlg); break; }
case WM_SIZE: { OnEnvironmentDlgResize(hwndDlg, DlgData, LOWORD(lParam), HIWORD(lParam)); SetWindowLongPtrW(hwndDlg, DWLP_MSGRESULT, 0); return TRUE; }
case WM_SIZING: { /* Forbid resizing the dialog smaller than its minimal size */ PRECT pRect = (PRECT)lParam;
if ((wParam == WMSZ_LEFT) || (wParam == WMSZ_TOPLEFT) || (wParam == WMSZ_BOTTOMLEFT)) { if (pRect->right - pRect->left < DlgData->cxMin) pRect->left = pRect->right - DlgData->cxMin; } else if ((wParam == WMSZ_RIGHT) || (wParam == WMSZ_TOPRIGHT) || (wParam == WMSZ_BOTTOMRIGHT)) { if (pRect->right - pRect->left < DlgData->cxMin) pRect->right = pRect->left + DlgData->cxMin; }
if ((wParam == WMSZ_TOP) || (wParam == WMSZ_TOPLEFT) || (wParam == WMSZ_TOPRIGHT)) { if (pRect->bottom - pRect->top < DlgData->cyMin) pRect->top = pRect->bottom - DlgData->cyMin; } else if ((wParam == WMSZ_BOTTOM) || (wParam == WMSZ_BOTTOMLEFT) || (wParam == WMSZ_BOTTOMRIGHT)) { if (pRect->bottom - pRect->top < DlgData->cyMin) pRect->bottom = pRect->top + DlgData->cyMin; }
SetWindowLongPtrW(hwndDlg, DWLP_MSGRESULT, TRUE); return TRUE; }
case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_USER_VARIABLE_NEW: OnNewVariable(hwndDlg, IDC_USER_VARIABLE_LIST); return TRUE;
case IDC_USER_VARIABLE_EDIT: OnEditVariable(hwndDlg, IDC_USER_VARIABLE_LIST); return TRUE;
case IDC_USER_VARIABLE_DELETE: OnDeleteVariable(hwndDlg, IDC_USER_VARIABLE_LIST); return TRUE;
case IDC_SYSTEM_VARIABLE_NEW: OnNewVariable(hwndDlg, IDC_SYSTEM_VARIABLE_LIST); return TRUE;
case IDC_SYSTEM_VARIABLE_EDIT: OnEditVariable(hwndDlg, IDC_SYSTEM_VARIABLE_LIST); return TRUE;
case IDC_SYSTEM_VARIABLE_DELETE: OnDeleteVariable(hwndDlg, IDC_SYSTEM_VARIABLE_LIST); return TRUE;
case IDOK: SetAllVars(hwndDlg, IDC_USER_VARIABLE_LIST); SetAllVars(hwndDlg, IDC_SYSTEM_VARIABLE_LIST); SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, (LPARAM)_T("Environment")); EndDialog(hwndDlg, 0); return TRUE;
case IDCANCEL: EndDialog(hwndDlg, 0); return TRUE; } break;
case WM_DESTROY: ReleaseListViewItems(hwndDlg, IDC_USER_VARIABLE_LIST); ReleaseListViewItems(hwndDlg, IDC_SYSTEM_VARIABLE_LIST); GlobalFree(DlgData); break;
case WM_NOTIFY: return OnNotify(hwndDlg, (NMHDR*)lParam); }
return FALSE;}
/* EOF */