Code: Select all
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=20235#p20235
// Version: 2018-11-06
// Author: KDJ
//
// *** Search files by name/content and replace content. ***
//
// Usage:
// Call("Scripts::Main", 1, "FindReplaceFiles.js")
//
// Required to include: BrowseForFolder_function.js, FileAndStream_functions.js
//
// Keyboard and mouse:
// Alt+F - set focus to Files list
// Ctrl+A - select all items in file list
// Ctrl+C - copy selected items from file list
// Del - remove selected items from file list (don't delete the files)
// F4 - open all selected files for editing
// DoubleClick
// Ctrl+Enter
// Shift+Enter - open focused file for editing and select the found text (or close file if is currently edited)
// Alt+Enter - maximize/restore window
// F1 - help for regular expressions or wildcards
// Alt+Del - remove item from history list ("Directory", "File:Stream names", "Text in file\stream", "Replace with", "History")
var oSys = AkelPad.SystemFunction();
var hInstDLL = AkelPad.GetInstanceDll();
var sClass = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstDLL;
var hDlg;
if (hDlg = oSys.Call("User32::FindWindowExW", 0, 0, sClass, 0))
{
SetForegroundWindow(hDlg);
WScript.Quit();
}
if (! (AkelPad.Include("BrowseForFolder_function.js") && AkelPad.Include("FileAndStream_functions.js")))
WScript.Quit();
var Scale =
{
Init: function()
{
var hDC = oSys.Call("User32::GetDC", hMainWnd);
this.ScaleX = oSys.Call("Gdi32::GetDeviceCaps", hDC, 88 /*LOGPIXELSX*/);
this.ScaleY = oSys.Call("Gdi32::GetDeviceCaps", hDC, 90 /*LOGPIXELSY*/);
oSys.Call("User32::ReleaseDC", hMainWnd, hDC);
//Align to 16 pixel
this.ScaleX += (16 - this.ScaleX % 16) % 16;
this.ScaleY += (16 - this.ScaleY % 16) % 16;
},
X: function(n) {return oSys.Call("Kernel32::MulDiv", n, this.ScaleX, 96);},
Y: function(n) {return oSys.Call("Kernel32::MulDiv", n, this.ScaleY, 96);},
UX: function(n) {return oSys.Call("Kernel32::MulDiv", n, 96, this.ScaleX);},
UY: function(n) {return oSys.Call("Kernel32::MulDiv", n, 96, this.ScaleY);}
}
Scale.Init();
var DT_UNICODE = 1;
var DT_QWORD = 2;
var DT_DWORD = 3;
var DT_WORD = 4;
var hMainWnd = AkelPad.GetMainWnd();
var hGuiFont = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
var nBkColorRE = 0xA0FFFF;
var hBrush = oSys.Call("Gdi32::CreateSolidBrush", nBkColorRE);
var nHistTime = 0;
var nHistMax = 15;
var nLevelMax = 27;
var nBufSize = 1024;
var lpBuffer = AkelPad.MemAlloc(nBufSize);
var lpLVITEM = AkelPad.MemAlloc(_X64 ? 72 : 60); //sizeof(LVITEM)
var hParent;
var hFocus;
var bCloseCBL;
var bCloseDlg;
AkelPad.MemCopy(lpLVITEM, 0x0001 /*LVIF_TEXT*/, DT_DWORD); //mask
AkelPad.MemCopy(_PtrAdd(lpLVITEM, _X64 ? 24 : 20), lpBuffer, DT_QWORD); //pszText
AkelPad.MemCopy(_PtrAdd(lpLVITEM, _X64 ? 32 : 24), nBufSize, DT_DWORD); //cchTextMax
var nWndMinW = Scale.X(475);
var nWndMinH = Scale.Y(488);
var oWndPos = {"X": 240, "Y": 140, "W": nWndMinW, "H": nWndMinH, "Max": 0};
var bPathShow = 1;
var bSeparateWnd = 0;
var bKeepHist = 1;
var bKeepFiles = 1;
var nPathLen = 0;
var bSortDesc = 0;
var nDirLevel = -1;
var bNameRE = 0;
var bNotName = 0;
var bInFiles = 1;
var bInStreams = 0;
var bSkipReadOnly = 0;
var bSkipHidden = 0;
var bSkipSystem = 0;
var bInResults = 0;
var bContentRE = 0;
var bMatchCase = 0;
var bMultiline = 0;
var bNotContain = 0;
var bSkipBinary = 1;
var bSkipLarger = 1;
var nMaxFileSize = 0;
var sDir = "";
var sName = "";
var sContent = "";
var sReplace = "";
var sLastContent = "";
var bLastContentRE = 0;
var bLastMatchCase = 0;
var bLastMultiline = 0;
var bLastNotContain = 0;
var bAfterReplace = 0;
var aDirs = [];
var aNames = [];
var aContents = [];
var aReplace = [];
var aFiles = [];
var aFilesSel = [0];
var nFilesFoc = 0;
var aHist = [];
ReadIni();
var aDlg = [];
var IDDIRG = 2000;
var IDDIRCB = 2001;
var IDCURRENTB = 2002;
var IDBROWSEB = 2003;
var IDDIRLEVELS = 2004;
var IDDIRLEVELCB = 2005;
var IDNAMEG = 2006;
var IDNAMECB = 2007;
var IDHELP1B = 2008;
var IDNAMERE = 2009;
var IDNOTNAME = 2010;
var IDINFILES = 2011;
var IDINSTREAMS = 2012;
var IDCONTENTG = 2013;
var IDCONTENTCB = 2014;
var IDHELP2B = 2015;
var IDMATCHCASE = 2016;
var IDCONTENTRE = 2017;
var IDMULTILINE = 2018;
var IDNOTCONTAIN = 2019;
var IDSKIPBINARY = 2020;
var IDSKIPLARGER = 2021;
var IDMAXSIZEE = 2022;
var IDREPLACES = 2023;
var IDREPLACECB = 2024;
var IDHELP3B = 2025;
var IDSKIPG = 2026;
var IDREADONLY = 2027;
var IDHIDDEN = 2028;
var IDSYSTEM = 2029;
var IDINRESULTS = 2030;
var IDSEARCHB = 2031;
var IDREPLACEB = 2032;
var IDHISTORYB = 2033;
var IDEDITB = 2034;
var IDCOPYB = 2035;
var IDCLEARB = 2036;
var IDSETTINGSB = 2037;
var IDCLOSEB = 2038;
var IDFILELV = 2039;
var IDSTATUS = 2040;
//0x50000000=WS_VISIBLE|WS_CHILD
//0x50000002=WS_VISIBLE|WS_CHILD|SS_RIGHT
//0x50000007=WS_VISIBLE|WS_CHILD|BS_GROUPBOX
//0x50000100=WS_VISIBLE|WS_CHILD|SBARS_SIZEGRIP
//0x50010000=WS_VISIBLE|WS_CHILD|WS_TABSTOP
//0x50010042=WS_VISIBLE|WS_CHILD|WS_TABSTOP|CBS_AUTOHSCROLL|CBS_DROPDOWN
//0x50010003=WS_VISIBLE|WS_CHILD|WS_TABSTOP|CBS_DROPDOWNLIST
//0x50010003=WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX
//0x50012002=WS_VISIBLE|WS_CHILD|WS_TABSTOP|ES_NUMBER|ES_RIGHT
//0x50810009=WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP|LVS_SHOWSELALWAYS|LVS_REPORT
aDlg[IDDIRG ]={S:0x50000007, C:"BUTTON", T:sTxtDir};
aDlg[IDDIRCB ]={S:0x50210042, C:"COMBOBOX"};
aDlg[IDCURRENTB ]={S:0x50010000, C:"BUTTON", T:sTxtCurrent};
aDlg[IDBROWSEB ]={S:0x50010000, C:"BUTTON", T:sTxtBrowse};
aDlg[IDDIRLEVELS ]={S:0x50000002, C:"STATIC", T:sTxtSubDirs};
aDlg[IDDIRLEVELCB]={S:0x50010003, C:"COMBOBOX"};
aDlg[IDNAMEG ]={S:0x50000007, C:"BUTTON", T:sTxtFileName};
aDlg[IDNAMECB ]={S:0x50210042, C:"COMBOBOX", Sel1:0, Sel2:-1};
aDlg[IDHELP1B ]={S:0x50010000, C:"BUTTON", T:"?"};
aDlg[IDNAMERE ]={S:0x50010003, C:"BUTTON", T:sTxtRegExp};
aDlg[IDNOTNAME ]={S:0x50010003, C:"BUTTON", T:sTxtNotName};
aDlg[IDINFILES ]={S:0x50010003, C:"BUTTON", T:sTxtFiles};
aDlg[IDINSTREAMS ]={S:0x50010003, C:"BUTTON", T:sTxtStreams};
aDlg[IDCONTENTG ]={S:0x50000007, C:"BUTTON", T:sTxtTextInFile};
aDlg[IDCONTENTCB ]={S:0x50210042, C:"COMBOBOX", Sel1:0, Sel2:-1};
aDlg[IDHELP2B ]={S:0x50010000, C:"BUTTON", T:"?"};
aDlg[IDMATCHCASE ]={S:0x50010003, C:"BUTTON", T:sTxtMatchCase};
aDlg[IDCONTENTRE ]={S:0x50010003, C:"BUTTON", T:sTxtRegExp};
aDlg[IDMULTILINE ]={S:0x50010003, C:"BUTTON", T:sTxtMultiline};
aDlg[IDNOTCONTAIN]={S:0x50010003, C:"BUTTON", T:sTxtNotContain};
aDlg[IDSKIPBINARY]={S:0x50010003, C:"BUTTON", T:sTxtSkipBinary};
aDlg[IDSKIPLARGER]={S:0x50010003, C:"BUTTON", T:sTxtSkipLarger};
aDlg[IDMAXSIZEE ]={S:0x50012002, C:"EDIT", ES:0x200};
aDlg[IDREPLACES ]={S:0x50000000, C:"STATIC", T:sTxtReplaceWith};
aDlg[IDREPLACECB ]={S:0x50210042, C:"COMBOBOX", Sel1:0, Sel2:-1};
aDlg[IDHELP3B ]={S:0x50010000, C:"BUTTON", T:"?"};
aDlg[IDSKIPG ]={S:0x50000007, C:"BUTTON", T:sTxtSkipFiles};
aDlg[IDREADONLY ]={S:0x50010003, C:"BUTTON", T:sTxtReadOnly};
aDlg[IDHIDDEN ]={S:0x50010003, C:"BUTTON", T:sTxtHidden};
aDlg[IDSYSTEM ]={S:0x50010003, C:"BUTTON", T:sTxtSystem};
aDlg[IDINRESULTS ]={S:0x50010003, C:"BUTTON", T:sTxtInResults};
aDlg[IDSEARCHB ]={S:0x50010000, C:"BUTTON", T:sTxtSearch};
aDlg[IDREPLACEB ]={S:0x50010000, C:"BUTTON", T:sTxtReplace};
aDlg[IDHISTORYB ]={S:0x50010000, C:"BUTTON", T:sTxtHistory};
aDlg[IDEDITB ]={S:0x50010000, C:"BUTTON", T:sTxtEdit};
aDlg[IDCOPYB ]={S:0x50010000, C:"BUTTON", T:sTxtCopyList};
aDlg[IDCLEARB ]={S:0x50010000, C:"BUTTON", T:sTxtClearList};
aDlg[IDSETTINGSB ]={S:0x50010000, C:"BUTTON", T:sTxtSettings};
aDlg[IDCLOSEB ]={S:0x50010000, C:"BUTTON", T:sTxtClose};
aDlg[IDFILELV ]={S:0x50810009, C:"SysListView32"};
aDlg[IDSTATUS ]={S:0x50000100, C:"msctls_statusbar32"};
AkelPad.ScriptNoMutex();
AkelPad.WindowRegisterClass(sClass);
while (! bCloseDlg)
{
bCloseDlg = true;
hParent = bSeparateWnd ? 0 : hMainWnd;
oWndPos.W = Math.max(Scale.X(oWndPos.W), nWndMinW);
oWndPos.H = Math.max(Scale.Y(oWndPos.H), nWndMinH);
SetForegroundWindow(hMainWnd);
hDlg = oSys.Call("User32::CreateWindowExW",
0, //dwExStyle
sClass, //lpClassName
sTxtDlgTitle, //lpWindowName
0x80CF0000, //dwStyle=WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MAXIMIZEBOX|WS_MINIMIZEBOX|WS_SIZEBOX
oWndPos.X, //x
oWndPos.Y, //y
oWndPos.W, //nWidth
oWndPos.H, //nHeight
hParent, //hWndParent
0, //hMenu
hInstDLL, //hInstance
DialogCallback); //Script function callback. To use it class must be registered by WindowRegisterClass.
oSys.Call("User32::ShowWindow", hDlg, oWndPos.Max ? 3 /*SW_MAXIMIZE*/ : 1 /*SW_SHOWNORMAL*/);
AkelPad.WindowGetMessage();
}
AkelPad.WindowUnregisterClass(sClass);
AkelPad.MemFree(lpBuffer);
AkelPad.MemFree(lpLVITEM);
oSys.Call("Gdi32::DeleteObject", hBrush);
SetForegroundWindow(hMainWnd);
function DialogCallback(hWnd, uMsg, wParam, lParam)
{
var nID, nCode, i;
if (uMsg == 1 /*WM_CREATE*/)
{
for (i = 2000; i < aDlg.length; ++i)
{
aDlg[i].HWND = oSys.Call("User32::CreateWindowExW",
aDlg[i].ES, //dwExStyle
aDlg[i].C, //lpClassName
aDlg[i].T, //lpWindowName
aDlg[i].S, //dwStyle
0, 0, 0, 0, //x, y, nWidth, nHeight
hWnd, //hWndParent
i, //ID
hInstDLL, //hInstance
0); //lpParam
SendMessage(aDlg[i].HWND, 48 /*WM_SETFONT*/, hGuiFont, true);
}
for (i = IDNAMERE; i <= IDINSTREAMS; ++i)
aDlg[i].W = GetTextWidth(aDlg[i].T.replace("&", ""), hWnd, hGuiFont) + Scale.X(18);
for (i = IDMATCHCASE; i <= IDSKIPLARGER; ++i)
aDlg[i].W = GetTextWidth(aDlg[i].T.replace("&", ""), hWnd, hGuiFont) + Scale.X(18);
//Get handles to edit/list in ComboBoxes IDNAMECB, IDCONTENTCB and IDREPLACECB
AkelPad.MemCopy(lpBuffer, _X64 ? 64 : 52 /*sizeof(COMBOBOXINFO)*/, DT_DWORD);
oSys.Call("User32::GetComboBoxInfo", aDlg[IDNAMECB].HWND, lpBuffer);
aDlg[IDNAMECB].HWNDEdit = AkelPad.MemRead(_PtrAdd(lpBuffer, _X64 ? 48 : 44) /*hwndItem*/, DT_QWORD);
aDlg[IDNAMECB].HWNDList = AkelPad.MemRead(_PtrAdd(lpBuffer, _X64 ? 56 : 48) /*hwndList*/, DT_QWORD);
oSys.Call("User32::GetComboBoxInfo", aDlg[IDCONTENTCB].HWND, lpBuffer);
aDlg[IDCONTENTCB].HWNDEdit = AkelPad.MemRead(_PtrAdd(lpBuffer, _X64 ? 48 : 44) /*hwndItem*/, DT_QWORD);
aDlg[IDCONTENTCB].HWNDList = AkelPad.MemRead(_PtrAdd(lpBuffer, _X64 ? 56 : 48) /*hwndList*/, DT_QWORD);
oSys.Call("User32::GetComboBoxInfo", aDlg[IDREPLACECB].HWND, lpBuffer);
aDlg[IDREPLACECB].HWNDEdit = AkelPad.MemRead(_PtrAdd(lpBuffer, _X64 ? 48 : 44) /*hwndItem*/, DT_QWORD);
aDlg[IDREPLACECB].HWNDList = AkelPad.MemRead(_PtrAdd(lpBuffer, _X64 ? 56 : 48) /*hwndList*/, DT_QWORD);
SendMessage(aDlg[IDDIRCB ].HWND, 0x0141 /*CB_LIMITTEXT*/, 256, 0);
SendMessage(aDlg[IDNAMECB ].HWND, 0x0141 /*CB_LIMITTEXT*/, 256, 0);
SendMessage(aDlg[IDCONTENTCB].HWND, 0x0141 /*CB_LIMITTEXT*/, 256, 0);
SendMessage(aDlg[IDREPLACECB].HWND, 0x0141 /*CB_LIMITTEXT*/, 256, 0);
SendMessage(aDlg[IDDIRCB ].HWND, 0x0155 /*CB_SETEXTENDEDUI*/, 1, 0);
SendMessage(aDlg[IDNAMECB ].HWND, 0x0155 /*CB_SETEXTENDEDUI*/, 1, 0);
SendMessage(aDlg[IDCONTENTCB].HWND, 0x0155 /*CB_SETEXTENDEDUI*/, 1, 0);
SendMessage(aDlg[IDREPLACECB].HWND, 0x0155 /*CB_SETEXTENDEDUI*/, 1, 0);
SetCheckButtons();
SetWindowText(aDlg[IDMAXSIZEE].HWND, (nMaxFileSize > 0) ? nMaxFileSize.toString() : "");
FillCB();
SetPartsSB();
SendMessage(aDlg[IDFILELV].HWND, 0x1036 /*LVM_SETEXTENDEDLISTVIEWSTYLE*/, 0x0020 /*LVS_EX_FULLROWSELECT*/, 0x0020);
SetColumnLV();
SetHeaderLV();
PostMessage(hWnd, 0x8000 /*WM_APP*/, 0, 0);
hFocus = aDlg[(bInResults && aFiles.length) ? IDCONTENTCB : IDDIRCB].HWND;
}
else if (uMsg == 0x8000 /*WM_APP*/)
{
SetWindowText(aDlg[IDDIRCB].HWND, sDir);
SetWindowText(aDlg[IDNAMECB].HWND, sName);
SetWindowText(aDlg[IDCONTENTCB].HWND, sContent);
SetWindowText(aDlg[IDREPLACECB].HWND, sReplace);
SendMessage(hFocus, 0x0142 /*CB_SETEDITSEL*/, 0, MkLong(0, -1));
EnableButtons();
oSys.Call("User32::UpdateWindow", hWnd);
SetTextSB(-2);
FillLV();
SendMessage(aDlg[IDFILELV].HWND, 0x1013 /*LVM_ENSUREVISIBLE*/, nFilesFoc, false);
}
else if (uMsg == 0x8001 /*WM_APP+1*/)
oSys.Call("User32::SetFocus", wParam);
else if ((uMsg == 6 /*WM_ACTIVATE*/) && (! wParam))
hFocus = oSys.Call("User32::GetFocus");
else if (uMsg == 7 /*WM_SETFOCUS*/)
oSys.Call("User32::SetFocus", hFocus);
else if (uMsg == 36) //WM_GETMINMAXINFO
{
AkelPad.MemCopy(_PtrAdd(lParam, 24), nWndMinW, DT_DWORD); //ptMinTrackSize_x
AkelPad.MemCopy(_PtrAdd(lParam, 28), nWndMinH, DT_DWORD); //ptMinTrackSize_y
}
else if (uMsg == 3 /*WM_MOVE*/)
{
if (! (oSys.Call("User32::IsZoomed", hWnd) || oSys.Call("User32::IsIconic", hWnd)))
GetWindowPos(hWnd, oWndPos);
}
else if (uMsg == 5 /*WM_SIZE*/)
{
if (wParam == 0 /*SIZE_RESTORED*/)
GetWindowPos(hWnd, oWndPos);
ResizeDlg(LoWord(lParam), HiWord(lParam));
}
else if (uMsg == 307 /*WM_CTLCOLOREDIT*/)
{
if ((lParam == aDlg[IDNAMECB].HWNDEdit) || (lParam == aDlg[IDCONTENTCB].HWNDEdit) || (lParam == aDlg[IDREPLACECB].HWNDEdit))
{
if (((lParam == aDlg[IDNAMECB].HWNDEdit) && bNameRE) || (((lParam == aDlg[IDCONTENTCB].HWNDEdit) || (lParam == aDlg[IDREPLACECB].HWNDEdit)) && bContentRE))
{
oSys.Call("Gdi32::SetBkColor", wParam, nBkColorRE);
return hBrush;
}
else
{
oSys.Call("Gdi32::SetBkColor", wParam, oSys.Call("User32::GetSysColor", 5 /*COLOR_WINDOW*/));
return oSys.Call("User32::GetSysColorBrush", 5 /*COLOR_WINDOW*/);
}
}
}
else if (uMsg == 308 /*WM_CTLCOLORLISTBOX*/)
{
if ((lParam == aDlg[IDNAMECB].HWNDList) || (lParam == aDlg[IDCONTENTCB].HWNDList) || (lParam == aDlg[IDREPLACECB].HWNDList))
{
if (((lParam == aDlg[IDNAMECB].HWNDList) && bNameRE) || (((lParam == aDlg[IDCONTENTCB].HWNDList) || (lParam == aDlg[IDREPLACECB].HWNDList)) && bContentRE))
{
oSys.Call("Gdi32::SetBkColor", wParam, nBkColorRE);
return hBrush;
}
else
{
oSys.Call("Gdi32::SetBkColor", wParam, oSys.Call("User32::GetSysColor", 5 /*COLOR_WINDOW*/));
return oSys.Call("User32::GetSysColorBrush", 5 /*COLOR_WINDOW*/);
}
}
}
else if (uMsg == 256 /*WM_KEYDOWN*/)
{
if (wParam == 0x0D /*VK_RETURN*/)
{
nID = oSys.Call("User32::GetDlgCtrlID", oSys.Call("User32::GetFocus"));
if (Ctrl() || Shift())
{
if (nID == IDFILELV)
OpenOrCloseFile();
}
else
{
if (new Date().getTime() - nHistTime > 100)
{
if (nID == IDFILELV)
PostMessage(hWnd, 273 /*WM_COMMAND*/, IDEDITB, 0);
else if (IsCloseCB() &&
(nID != IDCURRENTB) && (nID != IDBROWSEB) && (nID != IDHELP1B) && (nID != IDHELP2B) &&
(nID != IDHELP3B) && (nID != IDSEARCHB) && (nID != IDREPLACEB) && (nID != IDHISTORYB) &&
(nID != IDEDITB) && (nID != IDCOPYB) && (nID != IDCLEARB) && (nID != IDSETTINGSB))
PostMessage(hWnd, 273 /*WM_COMMAND*/, IDSEARCHB, 0);
}
}
}
else if (wParam == 0x70 /*VK_F1*/)
{
if ((! Ctrl()) && (! Shift()))
{
hFocus = oSys.Call("User32::GetFocus");
if (hFocus == aDlg[IDNAMECB].HWNDEdit)
{
oSys.Call("User32::SetFocus", aDlg[IDHELP1B].HWND);
Help(IDHELP1B, 1);
}
else if ((hFocus == aDlg[IDCONTENTCB].HWNDEdit) && bContentRE)
{
oSys.Call("User32::SetFocus", aDlg[IDHELP2B].HWND);
Help(IDHELP2B, 1);
}
else if ((hFocus == aDlg[IDREPLACECB].HWNDEdit) && bContentRE)
{
oSys.Call("User32::SetFocus", aDlg[IDHELP3B].HWND);
Help(IDHELP3B, 1);
}
}
}
else if (wParam == 0x73 /*VK_F4*/)
{
if ((! Ctrl()) && (! Shift()))
PostMessage(hWnd, 273 /*WM_COMMAND*/, IDEDITB, 0);
}
}
else if (uMsg == 260 /*WM_SYSKEYDOWN*/)
{
if (! Shift())
{
if (wParam == 0x46 /*F key*/)
oSys.Call("User32::SetFocus", aDlg[IDFILELV].HWND);
else if (wParam == 0x0D /*VK_RETURN*/)
oSys.Call("User32::ShowWindow", hDlg, oSys.Call("User32::IsZoomed", hDlg) ? 9 /*SW_RESTORE*/ : 3 /*SW_MAXIMIZE*/);
else if (wParam == 0x2E /*VK_DELETE*/)
{
if (SendMessage(aDlg[IDDIRCB].HWND, 0x0157 /*CB_GETDROPPEDSTATE*/, 0, 0))
DeleteItemCB(aDlg[IDDIRCB].HWND, aDirs);
else if (SendMessage(aDlg[IDNAMECB].HWND, 0x0157 /*CB_GETDROPPEDSTATE*/, 0, 0))
DeleteItemCB(aDlg[IDNAMECB].HWND, aNames);
else if (SendMessage(aDlg[IDCONTENTCB].HWND, 0x0157 /*CB_GETDROPPEDSTATE*/, 0, 0))
DeleteItemCB(aDlg[IDCONTENTCB].HWND, aContents);
else if (SendMessage(aDlg[IDREPLACECB].HWND, 0x0157 /*CB_GETDROPPEDSTATE*/, 0, 0))
DeleteItemCB(aDlg[IDREPLACECB].HWND, aReplace);
}
}
}
else if ((uMsg == 78 /*WM_NOTIFY*/) && (wParam == IDFILELV))
{
switch (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 16 : 8) /*code*/, DT_DWORD))
{
case -101 : //LVN_ITEMCHANGED
if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 32 : 20) /*uNewState*/, DT_DWORD) & 0x1 /*LVIS_FOCUSED*/)
SetTextSB(AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, DT_DWORD));
break;
case -3 : //NM_DBLCLK
if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, DT_DWORD) > -1)
{
OpenOrCloseFile();
break;
}
case -2 : //NM_CLICK
case -5 : //NM_RCLICK
case -6 : //NM_RDBLCLK
if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, DT_DWORD) == -1)
SetSelLV(GetCurFocLV());
break;
case -155 : //LVN_KEYDOWN
if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*wVKey*/, DT_WORD) == 0x2E /*VK_DELETE*/)
{
if ((! Ctrl()) && (! Shift()) && (! Alt()))
RemoveFromList();
}
else if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12), DT_WORD) == 0x41 /*A key*/)
{
if (Ctrl() && (! Shift()) && (! Alt()))
SetSelAllLV();
}
else if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12), DT_WORD) == 0x43 /*C key*/)
{
if (Ctrl() && (! Shift()) && (! Alt()))
CopySelected();
}
break;
case -108 : //LVN_COLUMNCLICK
bSortDesc = ! bSortDesc;
nFilesFoc = aFiles.length - GetCurFocLV() - 1;
GetSelArrayLV();
aFiles.reverse();
aFilesSel.reverse();
for (i = 0; i < aFilesSel.length; ++i)
aFilesSel[i] = aFiles.length - aFilesSel[i] - 1;
SetHeaderLV();
FillLV();
}
}
else if (uMsg == 273 /*WM_COMMAND*/)
{
nID = LoWord(wParam);
nCode = HiWord(wParam);
bCloseCBL = 1;
if (nID == IDDIRLEVELCB)
{
if (nCode == 1 /*CBN_SELCHANGE*/)
{
nDirLevel = SendMessage(aDlg[IDDIRLEVELCB].HWND, 0x0147 /*CB_GETCURSEL*/, 0, 0);
if (nDirLevel == (SendMessage(aDlg[IDDIRLEVELCB].HWND, 0x0146 /*CB_GETCOUNT*/, 0, 0) - 1))
nDirLevel = -1;
}
else if (nCode == 8 /*CBN_CLOSEUP*/)
bCloseCBL = 0;
}
else if ((nID == IDNAMECB) || (nID == IDCONTENTCB) || (nID == IDREPLACECB))
{
if (nCode == 3 /*CBN_SETFOCUS*/)
SendMessage(aDlg[nID].HWNDEdit, 177 /*EM_SETSEL*/, aDlg[nID].Sel1, aDlg[nID].Sel2);
else if (nCode == 10 /*CBN_SELENDCANCEL*/)
{
aDlg[nID].Sel1 = LoWord(SendMessage(lParam, 0x0140 /*CB_GETEDITSEL*/, 0, 0));
aDlg[nID].Sel2 = HiWord(SendMessage(lParam, 0x0140 /*CB_GETEDITSEL*/, 0, 0));
}
EnableButtons();
}
else if (nID == IDCURRENTB)
CurrentDir();
else if (nID == IDBROWSEB)
BrowseDirs();
else if ((nID == IDHELP1B) || (nID == IDHELP2B) || (nID == IDHELP3B))
Help(nID);
else if (nID == IDNAMERE)
{
bNameRE = ! bNameRE;
oSys.Call("User32::InvalidateRect", aDlg[IDNAMECB].HWNDEdit, 0, true);
}
else if (nID == IDNOTNAME)
bNotName = ! bNotName;
else if (nID == IDINFILES)
{
bInFiles = ! bInFiles;
if (! bInFiles)
{
bInStreams = true;
SendMessage(aDlg[IDINSTREAMS].HWND, 0x00F1 /*BM_SETCHECK*/, bInStreams, 0);
}
}
else if (nID == IDINSTREAMS)
{
bInStreams = ! bInStreams;
if (! bInStreams)
{
bInFiles = true;
SendMessage(aDlg[IDINFILES].HWND, 0x00F1 /*BM_SETCHECK*/, bInFiles, 0);
}
}
else if (nID == IDMATCHCASE)
bMatchCase = ! bMatchCase;
else if (nID == IDCONTENTRE)
{
bContentRE = ! bContentRE;
EnableButtons();
oSys.Call("User32::InvalidateRect", aDlg[IDCONTENTCB].HWNDEdit, 0, true);
oSys.Call("User32::InvalidateRect", aDlg[IDREPLACECB].HWNDEdit, 0, true);
}
else if (nID == IDMULTILINE)
bMultiline = ! bMultiline;
else if (nID == IDNOTCONTAIN)
{
bNotContain = ! bNotContain;
EnableButtons();
}
else if (nID == IDSKIPBINARY)
bSkipBinary = ! bSkipBinary;
else if (nID == IDSKIPLARGER)
{
bSkipLarger = ! bSkipLarger;
EnableButtons();
}
else if (nID == IDMAXSIZEE)
{
if (nCode == 0x0300 /*EN_CHANGE*/)
{
nMaxFileSize = parseInt(GetWindowText(lParam), 10);
if ((! isFinite(nMaxFileSize)) || (nMaxFileSize <= 0))
{
nMaxFileSize = 0;
SetWindowText(lParam, "");
}
}
}
else if (nID == IDREADONLY)
bSkipReadOnly = ! bSkipReadOnly;
else if (nID == IDHIDDEN)
bSkipHidden = ! bSkipHidden;
else if (nID == IDSYSTEM)
bSkipSystem = ! bSkipSystem;
else if (nID == IDINRESULTS)
{
bInResults = ! bInResults;
EnableButtons();
}
else if ((nID == IDSEARCHB) || (nID == IDREPLACEB))
SearchFiles(nID == IDREPLACEB);
else if (nID == IDHISTORYB)
History();
else if (nID == IDEDITB)
OpenFiles();
else if (nID == IDCOPYB)
CopyList();
else if (nID == IDCLEARB)
ClearList();
else if (nID == IDSETTINGSB)
Settings();
else if ((nID == IDCLOSEB) || (nID == 2 /*IDCANCEL*/))
PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
}
else if (uMsg == 16 /*WM_CLOSE*/)
{
WriteIni();
oSys.Call("User32::DestroyWindow", hWnd);
}
else if (uMsg == 2 /*WM_DESTROY*/)
oSys.Call("User32::PostQuitMessage", 0);
else
{
nID = oSys.Call("User32::GetDlgCtrlID", oSys.Call("User32::GetFocus"));
if (nID == IDFILELV)
nID = IDEDITB;
else if ((nID != IDCURRENTB) && (nID != IDBROWSEB) && (nID != IDHELP1B) && (nID != IDHELP2B) && (nID != IDHELP3B) && (nID < IDSEARCHB))
nID = IDSEARCHB;
oSys.Call("User32::DefDlgProcW", hWnd, 1025 /*DM_SETDEFID*/, nID, 0);
}
return 0;
}
function LoWord(nParam)
{
return (nParam & 0xFFFF);
}
function HiWord(nParam)
{
return ((nParam >> 16) & 0xFFFF);
}
function MkLong(nLoWord, nHiWord)
{
return (nLoWord & 0xFFFF) | (nHiWord << 16);
}
function Ctrl()
{
return oSys.Call("User32::GetKeyState", 0x11 /*VK_CONTROL*/) & 0x8000;
}
function Shift()
{
return oSys.Call("User32::GetKeyState", 0x10 /*VK_SHIFT*/) & 0x8000;
}
function Alt()
{
return oSys.Call("user32::GetKeyState", 0x12 /*VK_MENU*/) & 0x8000;
}
function SendMessage(hWnd, uMsg, wParam, lParam)
{
return AkelPad.SendMessage(hWnd, uMsg, wParam, lParam);
}
function PostMessage(hWnd, uMsg, wParam, lParam)
{
return oSys.Call("User32::PostMessageW", hWnd, uMsg, wParam, lParam);
}
function GetWindowPos(hWnd, oRect)
{
var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
oSys.Call("User32::GetWindowRect", hWnd, lpRect);
oRect.X = AkelPad.MemRead(_PtrAdd(lpRect, 0), DT_DWORD);
oRect.Y = AkelPad.MemRead(_PtrAdd(lpRect, 4), DT_DWORD);
oRect.W = AkelPad.MemRead(_PtrAdd(lpRect, 8), DT_DWORD) - oRect.X;
oRect.H = AkelPad.MemRead(_PtrAdd(lpRect, 12), DT_DWORD) - oRect.Y;
AkelPad.MemFree(lpRect);
}
function SetForegroundWindow(hWnd)
{
if (! oSys.Call("User32::IsWindowVisible", hWnd))
oSys.Call("User32::ShowWindow", hWnd, 8 /*SW_SHOWNA*/);
if (oSys.Call("User32::IsIconic", hWnd))
oSys.Call("User32::ShowWindow", hWnd, 9 /*SW_RESTORE*/);
oSys.Call("User32::SetForegroundWindow", hWnd);
}
function GetWindowText(hWnd)
{
oSys.Call("User32::GetWindowTextW", hWnd, lpBuffer, nBufSize / 2);
return AkelPad.MemRead(lpBuffer, DT_UNICODE);
}
function SetWindowText(hWnd, sText)
{
oSys.Call("User32::SetWindowTextW", hWnd, sText);
}
function GetTextWidth(sText, hWnd, hFont)
{
var hDC = oSys.Call("User32::GetDC", hWnd);
var lpSize = AkelPad.MemAlloc(8);
var nWidth;
oSys.Call("Gdi32::SelectObject", hDC, hFont);
oSys.Call("Gdi32::SetMapMode", hDC, 1 /*MM_TEXT*/);
oSys.Call("Gdi32::GetTextExtentPoint32W", hDC, sText, sText.length, lpSize);
nWidth = AkelPad.MemRead(lpSize, DT_DWORD);
oSys.Call("User32::ReleaseDC", hWnd, hDC);
AkelPad.MemFree(lpSize);
return nWidth;
}
function ResizeDlg(nW, nH)
{
var nFlags = 0x0114; //SWP_NOCOPYBITS|SWP_NOACTIVATE|SWP_NOZORDER
var nW5 = Scale.X(5);
var nW10 = Scale.X(10);
var nW20 = Scale.X(20);
var nW75 = Scale.X(75);
var nW90 = Scale.X(90);
var nW160 = Scale.X(160);
var nH5 = Scale.Y(5);
var nH13 = Scale.Y(13);
var nH16 = Scale.Y(16);
var nH21 = Scale.Y(21);
var i;
oSys.Call("User32::SetWindowPos",
aDlg[IDDIRG].HWND, 0,
nW5,
nH5,
nW - nW90 - nW10 - 2 * nW5,
Scale.Y(70),
nFlags);
oSys.Call("User32::SetWindowPos",
aDlg[IDDIRCB].HWND, 0,
2 * nW5,
Scale.Y(25),
nW - nW90 - nW10 - 4 * nW5,
1,
nFlags);
for (i = IDCURRENTB; i <= IDBROWSEB; ++i)
oSys.Call("User32::SetWindowPos",
aDlg[i].HWND, 0,
2 * nW5 + (i - IDCURRENTB) * (nW75 + nW5),
Scale.Y(49),
nW75,
nH21,
nFlags);
oSys.Call("User32::SetWindowPos",
aDlg[IDDIRLEVELS].HWND, 0,
nW - Scale.X(110) - 2 - nW75 - nW90 - nW10 - 2 * nW5,
Scale.Y(54),
Scale.X(110),
nH13,
nFlags);
oSys.Call("User32::SetWindowPos",
aDlg[IDDIRLEVELCB].HWND, 0,
nW - nW75 - nW90 - nW10 - 2 * nW5,
Scale.Y(49),
nW75,
1,
nFlags);
oSys.Call("User32::SetWindowPos",
aDlg[IDNAMEG].HWND, 0,
nW5,
Scale.Y(80),
nW - nW90 - nW10 - 2 * nW5,
Scale.Y(85),
nFlags);
oSys.Call("User32::SetWindowPos",
aDlg[IDNAMECB].HWND, 0,
2 * nW5,
Scale.Y(100),
nW - nW90 - nW20 - nW10 - 4 * nW5,
1,
nFlags);
oSys.Call("User32::SetWindowPos",
aDlg[IDHELP1B].HWND, 0,
nW - nW90 - nW20 - nW10 - 2 * nW5,
Scale.Y(100),
nW20,
nH21,
nFlags);
for (i = IDNAMERE; i <= IDINSTREAMS; ++i)
oSys.Call("User32::SetWindowPos",
aDlg[i].HWND, 0,
2 * nW5 + Math.floor((i - IDNAMERE) / 2) * nW160,
Scale.Y(125 + ((i - IDNAMERE) % 2) * 20),
aDlg[i].W,
nH16,
nFlags);
oSys.Call("User32::SetWindowPos",
aDlg[IDCONTENTG].HWND, 0,
nW5,
Scale.Y(170),
nW - nW90 - nW10 - 2 * nW5,
Scale.Y(146),
nFlags);
oSys.Call("User32::SetWindowPos",
aDlg[IDCONTENTCB].HWND, 0,
2 * nW5,
Scale.Y(190),
nW - nW90 - nW20 - nW10 - 4 * nW5,
1,
nFlags);
oSys.Call("User32::SetWindowPos",
aDlg[IDHELP2B].HWND, 0,
nW - nW90 - nW20 - nW10 - 2 * nW5,
Scale.Y(190),
nW20,
nH21,
nFlags);
for (i = IDMATCHCASE; i <= IDSKIPLARGER; ++i)
oSys.Call("User32::SetWindowPos",
aDlg[i].HWND, 0,
2 * nW5 + Math.floor((i - IDMATCHCASE) / 3) * nW160,
Scale.Y(215 + ((i - IDMATCHCASE) % 3) * 20),
aDlg[i].W,
nH16,
nFlags);
oSys.Call("User32::SetWindowPos",
aDlg[IDMAXSIZEE].HWND, 0,
2 * nW5 + nW160 + aDlg[IDSKIPLARGER].W,
Scale.Y(253),
Scale.X(60),
Scale.Y(20),
nFlags);
oSys.Call("User32::SetWindowPos",
aDlg[IDREPLACES].HWND, 0,
2 * nW5,
Scale.Y(275),
nW160,
nH13,
nFlags);
oSys.Call("User32::SetWindowPos",
aDlg[IDREPLACECB].HWND, 0,
2 * nW5,
Scale.Y(290),
nW - nW90 - nW20 - nW10 - 4 * nW5,
1,
nFlags);
oSys.Call("User32::SetWindowPos",
aDlg[IDHELP3B].HWND, 0,
nW - nW90 - nW20 - nW10 - 2 * nW5,
Scale.Y(290),
nW20,
nH21,
nFlags);
oSys.Call("User32::SetWindowPos",
aDlg[IDSKIPG].HWND, 0,
nW - nW90 - nW5,
nH5,
nW90,
Scale.Y(80),
nFlags);
for (i = IDREADONLY; i <= IDSYSTEM; ++i)
oSys.Call("User32::SetWindowPos",
aDlg[i].HWND, 0,
nW - nW90,
Scale.Y(25 + (i - IDREADONLY) * 20),
nW75,
nH16,
nFlags);
oSys.Call("User32::SetWindowPos",
aDlg[IDINRESULTS].HWND, 0,
nW - nW90 - nW5,
Scale.Y(108),
nW90,
nH16,
nFlags);
for (i = IDSEARCHB; i <= IDCLOSEB; ++i)
oSys.Call("User32::SetWindowPos",
aDlg[i].HWND, 0,
nW - nW90 - nW5,
Scale.Y(128 + (i - IDSEARCHB) * 24),
nW90,
nH21,
nFlags);
oSys.Call("User32::SetWindowPos",
aDlg[IDFILELV].HWND, 0,
-1,
Scale.Y(325),
nW + 2,
nH - Scale.Y(325 + 22),
nFlags);
SendMessage(aDlg[IDFILELV].HWND, 0x101E /*LVM_SETCOLUMNWIDTH*/, 0, -2 /*LVSCW_AUTOSIZE_USEHEADER*/);
SendMessage(aDlg[IDFILELV].HWND, 0x1013 /*LVM_ENSUREVISIBLE*/, GetCurFocLV(), false);
SendMessage(aDlg[IDSTATUS].HWND, 5 /*WM_SIZE*/, 0, 0);
}
function SetCheckButtons()
{
SendMessage(aDlg[IDNAMERE ].HWND, 0x00F1 /*BM_SETCHECK*/, bNameRE, 0);
SendMessage(aDlg[IDNOTNAME ].HWND, 0x00F1 /*BM_SETCHECK*/, bNotName, 0);
SendMessage(aDlg[IDINFILES ].HWND, 0x00F1 /*BM_SETCHECK*/, bInFiles, 0);
SendMessage(aDlg[IDINSTREAMS ].HWND, 0x00F1 /*BM_SETCHECK*/, bInStreams, 0);
SendMessage(aDlg[IDMATCHCASE ].HWND, 0x00F1 /*BM_SETCHECK*/, bMatchCase, 0);
SendMessage(aDlg[IDCONTENTRE ].HWND, 0x00F1 /*BM_SETCHECK*/, bContentRE, 0);
SendMessage(aDlg[IDMULTILINE ].HWND, 0x00F1 /*BM_SETCHECK*/, bMultiline, 0);
SendMessage(aDlg[IDNOTCONTAIN].HWND, 0x00F1 /*BM_SETCHECK*/, bNotContain, 0);
SendMessage(aDlg[IDSKIPBINARY].HWND, 0x00F1 /*BM_SETCHECK*/, bSkipBinary, 0);
SendMessage(aDlg[IDSKIPLARGER].HWND, 0x00F1 /*BM_SETCHECK*/, bSkipLarger, 0);
SendMessage(aDlg[IDREADONLY ].HWND, 0x00F1 /*BM_SETCHECK*/, bSkipReadOnly, 0);
SendMessage(aDlg[IDHIDDEN ].HWND, 0x00F1 /*BM_SETCHECK*/, bSkipHidden, 0);
SendMessage(aDlg[IDSYSTEM ].HWND, 0x00F1 /*BM_SETCHECK*/, bSkipSystem, 0);
SendMessage(aDlg[IDINRESULTS ].HWND, 0x00F1 /*BM_SETCHECK*/, bInResults, 0);
}
function EnableButtons()
{
var bNotInRes = ! (bInResults && aFiles.length);
var bContent = oSys.Call("User32::GetWindowTextLengthW", aDlg[IDCONTENTCB].HWND);
var i;
oSys.Call("User32::EnableWindow", aDlg[IDDIRCB].HWND, bNotInRes);
oSys.Call("User32::EnableWindow", aDlg[IDCURRENTB].HWND, bNotInRes);
oSys.Call("User32::EnableWindow", aDlg[IDBROWSEB].HWND, bNotInRes);
oSys.Call("User32::EnableWindow", aDlg[IDDIRLEVELS].HWND, bNotInRes);
oSys.Call("User32::EnableWindow", aDlg[IDDIRLEVELCB].HWND, bNotInRes);
oSys.Call("User32::EnableWindow", aDlg[IDNAMECB ].HWND, bNotInRes);
oSys.Call("User32::EnableWindow", aDlg[IDHELP1B ].HWND, bNotInRes);
oSys.Call("User32::EnableWindow", aDlg[IDNAMERE ].HWND, bNotInRes);
oSys.Call("User32::EnableWindow", aDlg[IDNOTNAME ].HWND, bNotInRes && oSys.Call("User32::GetWindowTextLengthW", aDlg[IDNAMECB].HWND));
oSys.Call("User32::EnableWindow", aDlg[IDINFILES ].HWND, bNotInRes);
oSys.Call("User32::EnableWindow", aDlg[IDINSTREAMS ].HWND, bNotInRes);
oSys.Call("User32::EnableWindow", aDlg[IDREADONLY ].HWND, bNotInRes);
oSys.Call("User32::EnableWindow", aDlg[IDHIDDEN ].HWND, bNotInRes);
oSys.Call("User32::EnableWindow", aDlg[IDSYSTEM ].HWND, bNotInRes);
oSys.Call("User32::EnableWindow", aDlg[IDHELP2B ].HWND, bContentRE);
oSys.Call("User32::EnableWindow", aDlg[IDMULTILINE ].HWND, bContentRE);
oSys.Call("User32::EnableWindow", aDlg[IDNOTCONTAIN].HWND, bContent);
oSys.Call("User32::EnableWindow", aDlg[IDSKIPBINARY].HWND, bContent && bNotInRes);
oSys.Call("User32::EnableWindow", aDlg[IDSKIPLARGER].HWND, bContent && bNotInRes);
oSys.Call("User32::EnableWindow", aDlg[IDMAXSIZEE ].HWND, bContent && bSkipLarger && bNotInRes);
oSys.Call("User32::EnableWindow", aDlg[IDREPLACES ].HWND, bContent && (! bNotContain));
oSys.Call("User32::EnableWindow", aDlg[IDREPLACECB ].HWND, bContent && (! bNotContain));
oSys.Call("User32::EnableWindow", aDlg[IDHELP3B ].HWND, bContent && (! bNotContain) && bContentRE);
oSys.Call("User32::EnableWindow", aDlg[IDINRESULTS ].HWND, aFiles.length);
oSys.Call("User32::EnableWindow", aDlg[IDREPLACEB ].HWND, bContent && (! bNotContain));
oSys.Call("User32::EnableWindow", aDlg[IDHISTORYB ].HWND, aHist.length);
oSys.Call("User32::EnableWindow", aDlg[IDEDITB ].HWND, aFiles.length);
oSys.Call("User32::EnableWindow", aDlg[IDCOPYB ].HWND, aFiles.length);
oSys.Call("User32::EnableWindow", aDlg[IDCLEARB ].HWND, aFiles.length);
}
function IsCloseCB()
{
return (! SendMessage(aDlg[IDDIRCB ].HWND, 0x0157 /*CB_GETDROPPEDSTATE*/, 0, 0)) &&
(! SendMessage(aDlg[IDNAMECB ].HWND, 0x0157 /*CB_GETDROPPEDSTATE*/, 0, 0)) &&
(! SendMessage(aDlg[IDCONTENTCB].HWND, 0x0157 /*CB_GETDROPPEDSTATE*/, 0, 0)) &&
(! SendMessage(aDlg[IDREPLACECB].HWND, 0x0157 /*CB_GETDROPPEDSTATE*/, 0, 0)) &&
bCloseCBL;
}
function FillCB()
{
var i;
for (i = 0; i < aDirs.length; ++i)
SendMessage(aDlg[IDDIRCB].HWND, 0x0143 /*CB_ADDSTRING*/, 0, aDirs[i]);
for (i = 0; i < aNames.length; ++i)
SendMessage(aDlg[IDNAMECB].HWND, 0x0143 /*CB_ADDSTRING*/, 0, aNames[i]);
for (i = 0; i < aContents.length; ++i)
SendMessage(aDlg[IDCONTENTCB].HWND, 0x0143 /*CB_ADDSTRING*/, 0, aContents[i]);
for (i = 0; i < aReplace.length; ++i)
SendMessage(aDlg[IDREPLACECB].HWND, 0x0143 /*CB_ADDSTRING*/, 0, aReplace[i]);
for (i = 0; i < nLevelMax - 1; ++i)
SendMessage(aDlg[IDDIRLEVELCB].HWND, 0x0143 /*CB_ADDSTRING*/, 0, i.toString());
i = SendMessage(aDlg[IDDIRLEVELCB].HWND, 0x0143 /*CB_ADDSTRING*/, 0, sTxtAll);
if ((nDirLevel >= 0) && (nDirLevel < nLevelMax))
i = nDirLevel;
else
nDirLevel = -1;
SendMessage(aDlg[IDDIRLEVELCB].HWND, 0x014E /*CB_SETCURSEL*/, i, 0);
}
function DeleteItemCB(hWndCB, aItems)
{
var i = SendMessage(hWndCB, 0x0147 /*CB_GETCURSEL*/, 0, 0);
aItems.splice(i, 1);
SendMessage(hWndCB, 0x0144 /*CB_DELETESTRING*/, i, 0);
if (i > aItems.length - 1)
i = aItems.length - 1;
SendMessage(hWndCB, 0x014E /*CB_SETCURSEL*/, i, 0);
}
function GetCurFocLV()
{
return SendMessage(aDlg[IDFILELV].HWND, 0x100C /*LVM_GETNEXTITEM*/, -1, 0x0001 /*LVNI_FOCUSED*/);
}
function GetNextSelLV(nItem)
{
return SendMessage(aDlg[IDFILELV].HWND, 0x100C /*LVM_GETNEXTITEM*/, nItem, 0x0002 /*LVNI_SELECTED*/);
}
function GetSelArrayLV()
{
var nItem = -1;
aFilesSel = [];
while ((nItem = GetNextSelLV(nItem)) >= 0)
aFilesSel.push(nItem);
if (! aFilesSel.length)
aFilesSel = [GetCurFocLV()];
}
function SetSelLV(nItem)
{
AkelPad.MemCopy(_PtrAdd(lpLVITEM, 12), 0x0003 /*LVIS_SELECTED|LVIS_FOCUSED*/, DT_DWORD);
AkelPad.MemCopy(_PtrAdd(lpLVITEM, 16), 0x0003 /*LVIS_SELECTED|LVIS_FOCUSED*/, DT_DWORD);
SendMessage(aDlg[IDFILELV].HWND, 0x102B /*LVM_SETITEMSTATE*/, nItem, lpLVITEM);
SendMessage(aDlg[IDFILELV].HWND, 0x1013 /*LVM_ENSUREVISIBLE*/, nItem, true);
}
function SetSelArrayLV()
{
AkelPad.MemCopy(_PtrAdd(lpLVITEM, 12), 0x0002 /*LVIS_SELECTED*/, DT_DWORD);
AkelPad.MemCopy(_PtrAdd(lpLVITEM, 16), 0x0002 /*LVIS_SELECTED*/, DT_DWORD);
for (var i = 0; i < aFilesSel.length; ++i)
SendMessage(aDlg[IDFILELV].HWND, 0x102B /*LVM_SETITEMSTATE*/, aFilesSel[i], lpLVITEM);
AkelPad.MemCopy(_PtrAdd(lpLVITEM, 12), 0x0001 /*LVIS_FOCUSED*/, DT_DWORD);
AkelPad.MemCopy(_PtrAdd(lpLVITEM, 16), 0x0001 /*LVIS_FOCUSED*/, DT_DWORD);
SendMessage(aDlg[IDFILELV].HWND, 0x102B /*LVM_SETITEMSTATE*/, nFilesFoc, lpLVITEM);
SendMessage(aDlg[IDFILELV].HWND, 0x1013 /*LVM_ENSUREVISIBLE*/, nFilesFoc, true);
}
function SetSelAllLV()
{
AkelPad.MemCopy(_PtrAdd(lpLVITEM, 12), 0x0002 /*LVIS_SELECTED*/, DT_DWORD);
AkelPad.MemCopy(_PtrAdd(lpLVITEM, 16), 0x0002 /*LVIS_SELECTED*/, DT_DWORD);
for (var i = 0; i < aFiles.length; ++i)
SendMessage(aDlg[IDFILELV].HWND, 0x102B /*LVM_SETITEMSTATE*/, i, lpLVITEM);
}
function InsertItemLV(nItem, sText)
{
AkelPad.MemCopy(_PtrAdd(lpLVITEM, 4), nItem, DT_DWORD); //iItem
AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8), 0, DT_DWORD); //iSubItem
AkelPad.MemCopy(lpBuffer, sText, DT_UNICODE);
SendMessage(aDlg[IDFILELV].HWND, 0x104D /*LVM_INSERTITEMW*/, 0, lpLVITEM);
}
function SetColumnLV()
{
var lpLVCOLUMN = AkelPad.MemAlloc(_X64 ? 56 : 44); //sizeof(LVCOLUMN)
SendMessage(aDlg[IDFILELV].HWND, 0x1061 /*LVM_INSERTCOLUMNW*/, 0, lpLVCOLUMN);
AkelPad.MemFree(lpLVCOLUMN);
}
function SetHeaderLV()
{
var lpHDITEM = AkelPad.MemAlloc(_X64 ? 72 : 48); //sizeof(HDITEM)
var nFmt = 0x4000 /*HDF_STRING*/ | (bSortDesc ? 0x0200 /*HDF_SORTDOWN*/ : 0x0400 /*HDF_SORTUP*/);
var hHeader = SendMessage(aDlg[IDFILELV].HWND, 0x101F /*LVM_GETHEADER*/, 0, 0);
AkelPad.MemCopy(lpBuffer, bAfterReplace ? sTxtFilesRepl : sTxtFilesFound, DT_UNICODE);
AkelPad.MemCopy(lpHDITEM, 0x06, DT_DWORD); //mask=HDI_FORMAT|HDI_TEXT
AkelPad.MemCopy(_PtrAdd(lpHDITEM, 8), lpBuffer, DT_QWORD); //pszText
AkelPad.MemCopy(_PtrAdd(lpHDITEM, _X64 ? 24 : 16), nBufSize, DT_DWORD); //cchTextMax
AkelPad.MemCopy(_PtrAdd(lpHDITEM, _X64 ? 28 : 20), nFmt, DT_DWORD); //fmt
SendMessage(hHeader, 0x120C /*HDM_SETITEMW*/, 0, lpHDITEM);
AkelPad.MemFree(lpHDITEM);
}
function FillLV()
{
var nNameBegin = 0;
var i;
SendMessage(aDlg[IDFILELV].HWND, 0x000B /*WM_SETREDRAW*/, 0, 0);
SendMessage(aDlg[IDFILELV].HWND, 0x1009 /*LVM_DELETEALLITEMS*/, 0, 0);
if (aFiles.length)
{
if (! bPathShow)
nNameBegin = nPathLen;
for (i = 0; i < aFiles.length; ++i)
InsertItemLV(i, aFiles[i].substr(nNameBegin));
SetSelArrayLV();
}
else
InsertItemLV(0, sTxtNoFiles);
if (GetNextSelLV(-1) < 0)
SetSelLV(0);
SendMessage(aDlg[IDFILELV].HWND, 0x101E /*LVM_SETCOLUMNWIDTH*/, 0, -2 /*LVSCW_AUTOSIZE_USEHEADER*/);
SendMessage(aDlg[IDFILELV].HWND, 0x000B /*WM_SETREDRAW*/, 1, 0);
}
function SetPartsSB()
{
var lpParts = AkelPad.MemAlloc(5 * 4);
AkelPad.MemCopy(_PtrAdd(lpParts, 0), Scale.X( 90), DT_DWORD);
AkelPad.MemCopy(_PtrAdd(lpParts, 4), Scale.X(190), DT_DWORD);
AkelPad.MemCopy(_PtrAdd(lpParts, 8), Scale.X(310), DT_DWORD);
AkelPad.MemCopy(_PtrAdd(lpParts, 12), Scale.X(350), DT_DWORD);
AkelPad.MemCopy(_PtrAdd(lpParts, 16), -1, DT_DWORD);
SendMessage(aDlg[IDSTATUS].HWND, 0x0404 /*SB_SETPARTS*/, 5, lpParts);
AkelPad.MemFree(lpParts);
}
function SetTextSB(nItem)
{
var sText0 = "";
var sText1 = "";
var sText2 = "";
var sText3 = "";
var sText4 = "";
var hFile;
var lpFileInfo;
var lpDecimalSep;
var lpThousandSep;
var lpNUMBERFMT;
var lpLocalFileTime;
var lpSysTime;
var nSizeHi;
var nSizeLo;
var nAttr;
if ((nItem > -1) && aFiles.length)
{
sText0 = "\t\t" + (nItem + 1) + "/" + aFiles.length + " ";
hFile = oSys.Call("Kernel32::CreateFileW",
aFiles[nItem], //lpFileName
0, //dwDesiredAccess
3, //dwShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
0, //lpSecurityAttributes
3, //dwCreationDisposition = OPEN_EXISTING
0, //dwFlagsAndAttributes
0); //hTemplateFile
lpFileInfo = AkelPad.MemAlloc(52); //sizeof(BY_HANDLE_FILE_INFORMATION)
if (hFile && oSys.Call("Kernel32::GetFileInformationByHandle", hFile, lpFileInfo))
{
//file size
nSizeHi = AkelPad.MemRead(_PtrAdd(lpFileInfo, 32), DT_DWORD);
nSizeLo = AkelPad.MemRead(_PtrAdd(lpFileInfo, 36), DT_DWORD);
if (nSizeLo < 0)
nSizeLo += 0xFFFFFFFF + 1;
lpDecimalSep = AkelPad.MemAlloc(4 * 2);
lpThousandSep = AkelPad.MemAlloc(4 * 2);
lpNUMBERFMT = AkelPad.MemAlloc(_X64 ? 40 : 24); //sizeof(NUMBERFMT)
AkelPad.MemCopy(_PtrAdd(lpNUMBERFMT, 8), 3, DT_DWORD); //Grouping
AkelPad.MemCopy(_PtrAdd(lpNUMBERFMT, _X64 ? 16 : 12), lpDecimalSep, DT_QWORD);
AkelPad.MemCopy(_PtrAdd(lpNUMBERFMT, _X64 ? 24 : 16), lpThousandSep, DT_QWORD);
oSys.Call("Kernel32::GetLocaleInfoW", 0x400 /*LOCALE_USER_DEFAULT*/, 0xE /*LOCALE_SDECIMAL*/, lpDecimalSep, 4);
oSys.Call("Kernel32::GetLocaleInfoW", 0x400 /*LOCALE_USER_DEFAULT*/, 0xF /*LOCALE_STHOUSAND*/, lpThousandSep, 4);
oSys.Call("Kernel32::GetNumberFormatW",
0x400, //LOCALE_USER_DEFAULT
0,
(nSizeHi * (0xFFFFFFFF + 1) + nSizeLo).toString(),
lpNUMBERFMT,
lpBuffer,
nBufSize / 2);
AkelPad.MemFree(lpDecimalSep);
AkelPad.MemFree(lpThousandSep);
AkelPad.MemFree(lpNUMBERFMT);
sText1 = "\t\t" + AkelPad.MemRead(lpBuffer, DT_UNICODE) + " " + sTxtByteSymbol + " ";
//file date and time
lpLocalFileTime = AkelPad.MemAlloc(8); //FILETIME
lpSysTime = AkelPad.MemAlloc(16); //SYSTEMTIME
oSys.Call("Kernel32::FileTimeToLocalFileTime", _PtrAdd(lpFileInfo, 20), lpLocalFileTime);
oSys.Call("Kernel32::FileTimeToSystemTime", lpLocalFileTime, lpSysTime);
oSys.Call("Kernel32::GetDateFormatW",
0x400, //LOCALE_USER_DEFAULT
0x1, //DATE_SHORTDATE
lpSysTime,
0,
lpBuffer,
64);
oSys.Call("Kernel32::GetTimeFormatW",
0x400, //LOCALE_USER_DEFAULT
0x8, //TIME_FORCE24HOURFORMAT
lpSysTime,
0,
_PtrAdd(lpBuffer, 128),
64);
AkelPad.MemFree(lpLocalFileTime);
AkelPad.MemFree(lpSysTime);
sText2 = "\t" + AkelPad.MemRead(lpBuffer, DT_UNICODE) + " " + AkelPad.MemRead(_PtrAdd(lpBuffer, 128), DT_UNICODE);
nAttr = AkelPad.MemRead(lpFileInfo, DT_DWORD);
if (nAttr & 32 /*FILE_ATTRIBUTE_ARCHIVE*/) sText3 += "A";
if (nAttr & 2 /*FILE_ATTRIBUTE_HIDDEN*/) sText3 += "H";
if (nAttr & 1 /*FILE_ATTRIBUTE_READONLY*/) sText3 += "R";
if (nAttr & 4 /*FILE_ATTRIBUTE_SYSTEM*/) sText3 += "S";
if (aFiles[nItem].lastIndexOf(":") > 2)
sText4 = sTxtNTFSStream;
}
oSys.Call("Kernel32::CloseHandle", hFile);
AkelPad.MemFree(lpFileInfo);
}
else if (nItem == -2)
sText0 = "\t" + sTxtWait;
SendMessage(aDlg[IDSTATUS].HWND, 0x040B /*SB_SETTEXTW*/, 0, sText0);
SendMessage(aDlg[IDSTATUS].HWND, 0x040B /*SB_SETTEXTW*/, 1, sText1);
SendMessage(aDlg[IDSTATUS].HWND, 0x040B /*SB_SETTEXTW*/, 2, sText2);
SendMessage(aDlg[IDSTATUS].HWND, 0x040B /*SB_SETTEXTW*/, 3, sText3);
SendMessage(aDlg[IDSTATUS].HWND, 0x040B /*SB_SETTEXTW*/, 4, sText4);
}
function CurrentDir()
{
sDir = AkelPad.GetEditFile(0);
if (sDir)
sDir = sDir.replace(/\\[^\\]+$/, "");
else
sDir = AkelPad.GetAkelDir();
SetWindowText(aDlg[IDDIRCB].HWND, sDir);
SendMessage(aDlg[IDDIRCB].HWND, 0x0142 /*CB_SETEDITSEL*/, 0, MkLong(0, -1));
}
function BrowseDirs()
{
var oRect = {};
var sSelDir;
GetWindowPos(aDlg[IDBROWSEB].HWND, oRect);
sSelDir = BrowseForFolder(hDlg, sTxtChooseDir, GetWindowText(aDlg[IDDIRCB].HWND).replace(/(^ +)|( +$)/g, ""), 0, 0, oRect.X, oRect.Y + oRect.H);
if (sSelDir)
{
SetWindowText(aDlg[IDDIRCB].HWND, sSelDir);
SendMessage(aDlg[IDDIRCB].HWND, 0x0142 /*CB_SETEDITSEL*/, 0, MkLong(0, -1));
}
}