// FindReplaceEx.js - ver. 2013-09-03 (x86/x64) // // "Find/Replace" dialog extended version // // Required to include: InputBox_function.js // // Usage: // Call("Scripts::Main", 1, "FindReplaceEx.js") - "Find" dialog // Call("Scripts::Main", 1, "FindReplaceEx.js", '-Dlg="R"') - "Replace" dialog // Call("Scripts::Main", 1, "FindReplaceEx.js", '-Dlg="R" -FR="M+R+S" -RDB="A"') // - "Replace" dialog, select "Match case" and "Regular expressions", // direction "In selection", set default push button to "Replace all", // // Arguments: // -Dlg - dialog type that is displayed when you run the script: // "F" - "Find" (default) // "R" - "Replace" // "G" - "Go to" // -FR - set "Find/Replace" initial parameters: // "M+" - select "Match case" // "M-" - unselect "Match case" // "W+" - select "Whole word" // "W-" - unselect "Whole word" // "R+" - select "Regular expressions" // "R-" - unselect "Regular expressions" // "E+" - select "Esc-sequences" // "E-" - unselect "Esc-sequences" // "D" - "Down" (direction) // "U" - "Up" // "B" - "Begining" // "S" - "In selection" // "A" - "All files" // -RDB - change default push button in "Replace" dialog: // "R" - "Replace" // "A" - "Replace all" // -GT - set "Go to" initial parameter: // "L" - "Line:Column" // "O" - "Offset" // // If you don't want switching "Find/Replace" <-> "Go to", set manually in FindReplaceEx.ini: // bGoToDlg=false; // // In "Find/Replace" dialog: // F1 - help for regular expressions (if focus is in edit control) // F2 - Find/Replace templates // // Find/Replace templates is saved in file FindReplaceEx_templates.tsv // // Keys and mouse in "Find/Replace templates" dialog: // Ins - New // Ctrl+Ins, // Shift+Ins - Add (from "Find/Replace" dialog) // F2, F4 - Edit // Del - Delete // Enter, // DblClick - OK (put template in "Find/Replace" dialog) // F1 - help for regular expressions (if focus is in edit control) if (! (AkelPad.GetEditWnd() && AkelPad.Include("InputBox_function.js"))) WScript.Quit(); var DT_UNICODE = 1; var DT_QWORD = 2; var DT_DWORD = 3; var DT_WORD = 4; var MLT_FIND = 3; var MLT_REPLACE = 4; var MLT_GOTO = 5; var IDCANCEL = 2; var IDC_SEARCH_FIND = 3052; //Combobox What var IDC_SEARCH_REPLACE = 3053; //Combobox With var IDC_SEARCH_MATCHCASE = 3054; var IDC_SEARCH_WHOLEWORD = 3055; var IDC_SEARCH_ESCAPESEQ = 3056; var IDC_SEARCH_REGEXP = 3057; var IDC_SEARCH_BACKWARD = 3059; var IDC_SEARCH_FORWARD = 3060; var IDC_SEARCH_BEGINNING = 3061; var IDC_SEARCH_INSEL = 3062; var IDC_SEARCH_ALLFILES = 3064; var IDC_SEARCH_REPLACE_BUTTON = 3066; var IDC_SEARCH_ALL_BUTTON = 3067; var IDC_GOTO_LINE = 3102; var IDC_GOTO_OFFSET = 3103; var IDNAMELV = 9900; var IDWHATS = 9901; var IDWITHS = 9902; var IDWHATE = 9903; var IDWITHE = 9904; var IDMATCHC = 9905; var IDWHOLEW = 9906; var IDREGEXP = 9907; var IDESCSEQ = 9908; var IDNEWB = 9909; var IDADDB = 9910; var IDEDITB = 9911; var IDDELB = 9912; var IDOKB = 9913; var IDCLOSEB = 9914; var IDHELP1L = 9915; var IDHELP2L = 9916; var IDFRTL = 9917; var IDFINDL = 9918; var IDREPLACEL = 9919; var IDGOTOL = 9920; var IDMOREB = 9921; var IDRACDB = 9922; var IDINSELB = 9923; var IDCYCLEB = 9924; var IDPROMPTB = 9925; var oFSO = new ActiveXObject("Scripting.FileSystemObject"); var oSys = AkelPad.SystemFunction(); var hInstDLL = AkelPad.GetInstanceDll(); var hMainWnd = AkelPad.GetMainWnd(); var hGuiFont = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/); var sClassName = "AkelPad::Scripts::" + WScript.ScriptName + "::" + oSys.Call("Kernel32::GetCurrentProcessId"); var nBufSize = 1024; var lpBuffer = AkelPad.MemAlloc(nBufSize); var lpLVITEM = AkelPad.MemAlloc(_X64 ? 72 : 60); //sizeof(LVITEM) var aWnd = []; var aDlg = []; var aSubClassFRT = []; var bContinue = true; var bFirstTimeFR = true; var bFirstTimeGT = true; var bChangeFRT = false; var nWhatSel1 = 0; var nWhatSel2 = -1; var nWithSel1 = 0; var nWithSel2 = -1; var nDlgType; var nMatchCase; var nWholeWord; var nRegExp; var nEscSeq; var nDirection; var nGoTo; var sDefButton; var hDlg; var hDlgSubClass; var aButSubClass; var hWhatE; var hWithE; var hCancelB; var hWndFRT; var hFocus; var sWhatText; var sWithText; var i; //ini settings var bGoToDlg = true; var bMore = false; var nFRTW = 340; var nFRTH = 250; var nFRTSel = 0; var nDlgX; var nDlgY; ReadIni(); AkelPad.MemCopy(lpLVITEM, 0x0001 /*LVIF_TEXT*/, DT_DWORD); AkelPad.MemCopy(lpLVITEM + (_X64 ? 24 : 20), lpBuffer, DT_QWORD); AkelPad.MemCopy(lpLVITEM + (_X64 ? 32 : 24), nBufSize, DT_DWORD); //0x50000000 - WS_VISIBLE|WS_CHILD //0x50010000 - WS_VISIBLE|WS_CHILD|WS_TABSTOP //0x50010003 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX //0x50810000 - WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP //0x5081801D - WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP|LVS_NOSORTHEADER|LVS_SORTASCENDING|LVS_SHOWSELALWAYS|LVS_SINGLESEL|LVS_REPORT aWnd[IDNAMELV] = {Class: "SysListView32", Style: 0x5081801D, Text: ""}; aWnd[IDWHATS] = {Class: "STATIC", Style: 0x50000000, Text: sTxtFindWhat + ":"}; aWnd[IDWITHS] = {Class: "STATIC", Style: 0x50000000, Text: sTxtReplaceWith + ":"}; aWnd[IDWHATE] = {Class: "AkelEditW", Style: 0x50810000, Text: ""}; aWnd[IDWITHE] = {Class: "AkelEditW", Style: 0x50810000, Text: ""}; aWnd[IDMATCHC] = {Class: "BUTTON", Style: 0x50010003, Text: sTxtMatchCase}; aWnd[IDWHOLEW] = {Class: "BUTTON", Style: 0x50010003, Text: sTxtWholeWord}; aWnd[IDREGEXP] = {Class: "BUTTON", Style: 0x50010003, Text: sTxtRegExp}; aWnd[IDESCSEQ] = {Class: "BUTTON", Style: 0x50010003, Text: sTxtEscSeq}; aWnd[IDNEWB] = {Class: "BUTTON", Style: 0x50010000, Text: sTxtNew}; aWnd[IDADDB] = {Class: "BUTTON", Style: 0x50010000, Text: sTxtAdd}; aWnd[IDEDITB] = {Class: "BUTTON", Style: 0x50010000, Text: sTxtEdit}; aWnd[IDDELB] = {Class: "BUTTON", Style: 0x50010000, Text: sTxtDelete}; aWnd[IDOKB] = {Class: "BUTTON", Style: 0x50010000, Text: sTxtOK}; aWnd[IDCLOSEB] = {Class: "BUTTON", Style: 0x50010000, Text: sTxtClose}; aWnd[IDHELP1L] = {Class: "SysLink", Style: 0x50000000, Text: "?"}; aWnd[IDHELP2L] = {Class: "SysLink", Style: 0x50000000, Text: "?"}; aDlg[IDHELP1L] = {Class: "SysLink", Style: 0x50000000, H: 16, Text: "?"}; aDlg[IDHELP2L] = {Class: "SysLink", Style: 0x50000000, H: 16, Text: "?"}; aDlg[IDFRTL] = {Class: "SysLink", Style: 0x50000000, H: 16, Text: sTxtTemplates + " (F2)"}; aDlg[IDFINDL] = {Class: "SysLink", Style: 0x50000000, H: 16, Text: "(Ctrl+F)", DlgID: 2004 /*IDD_FIND*/}; aDlg[IDREPLACEL] = {Class: "SysLink", Style: 0x50000000, H: 16, Text: "(Ctrl+R)", DlgID: 2005 /*IDD_REPLACE*/}; aDlg[IDGOTOL] = {Class: "SysLink", Style: 0x50000000, H: 16, Text: "(Ctrl+G)", DlgID: 2006 /*IDD_GOTO*/}; aDlg[IDMOREB] = {Class: "BUTTON", Style: 0x50010000, H: 0, Text: ""}; aDlg[IDRACDB] = {Class: "BUTTON", Style: 0x50010003, H: 16, Text: sTxtReplAllCD}; aDlg[IDINSELB] = {Class: "BUTTON", Style: 0x50010003, H: 16, Text: sTxtCheckInSel}; aDlg[IDCYCLEB] = {Class: "BUTTON", Style: 0x50010003, H: 16, Text: sTxtCycleSearch}; aDlg[IDPROMPTB] = {Class: "BUTTON", Style: 0x50010003, H: 16, Text: sTxtPrompt}; GetDialogWnd(); if (hDlg && hCancelB) SendMessage(hDlg, 273 /*WM_COMMAND*/, IDCANCEL, hCancelB); GetArguments(); GetLinkText(); AkelPad.ScriptNoMutex(); AkelPad.WindowRegisterClass(sClassName); while (bContinue) { bContinue = false; if (nDlgType == MLT_FIND) AkelPad.Command(4158 /*IDM_EDIT_FIND*/); else if (nDlgType == MLT_REPLACE) AkelPad.Command(4161 /*IDM_EDIT_REPLACE*/); else AkelPad.Command(4162 /*IDM_EDIT_GOTO*/); GetDialogWnd(); if (! (hDlg && hCancelB)) break; if ((typeof nDlgX == "number") && (typeof nDlgY == "number")) oSys.Call("User32::SetWindowPos", hDlg, 0, nDlgX, nDlgY, 0, 0, 0x0415 /*SWP_NOSENDCHANGING|SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE*/); if (nDlgType == MLT_GOTO) { if (bFirstTimeGT) { bFirstTimeGT = false; SetParamsGT(nGoTo); } if (bGoToDlg) ResizeDialog(30); } else { if (bFirstTimeFR) { bFirstTimeFR = false; SetParamsFR(nMatchCase, nWholeWord, nRegExp, nEscSeq, nDirection); } if (typeof sWhatText == "string") { oSys.Call("User32::SetWindowTextW", hWhatE, sWhatText); SendMessage(hWhatE, 0x00B1 /*EM_SETSEL*/, 0, -1); } if (nDlgType == MLT_REPLACE) { if (typeof sWithText == "string") oSys.Call("User32::SetWindowTextW", hWithE, sWithText); if (sDefButton) SendMessage(hDlg, 0x0401 /*DM_SETDEFID*/, (sDefButton == "R") ? IDC_SEARCH_REPLACE_BUTTON : IDC_SEARCH_ALL_BUTTON, 0); } } GetLinkWidth(); GetLinkPos(); for (i = IDHELP1L; i < aDlg.length; ++i) { if (aDlg[i].Create) SendMessage( oSys.Call("User32::CreateWindowExW", 0, //dwExStyle aDlg[i].Class, //lpClassName (i < IDMOREB ? "" : "") + aDlg[i].Text + (i < IDMOREB ? "" : ""), //lpWindowName aDlg[i].Style, //dwStyle aDlg[i].X, //x aDlg[i].Y, //y aDlg[i].W, //nWidth aDlg[i].H, //nHeight hDlg, //hWndParent i, //ID hInstDLL, //hInstance 0), //lpParam 48 /*WM_SETFONT*/, hGuiFont, true); } if (nDlgType != MLT_GOTO) { ShowMore(bMore); ShowHelpLinksFR(); } oSys.Call("User32::UpdateWindow", hDlg); hDlgSubClass = AkelPad.WindowSubClass(hDlg, DialogCallback, 78 /*WM_NOTIFY*/, 256 /*WM_KEYDOWN*/, 273 /*WM_COMMAND*/, 2 /*WM_DESTROY*/); AkelPad.WindowRegisterDialog(hDlg); AkelPad.WindowGetMessage(); AkelPad.WindowUnregisterDialog(hDlg); AkelPad.WindowUnsubClass(hDlg); } WriteIni(); AkelPad.WindowUnregisterClass(sClassName); AkelPad.MemFree(lpBuffer); AkelPad.MemFree(lpLVITEM); function DialogCallback(hWnd, uMsg, wParam, lParam) { if (uMsg == 78) //WM_NOTIFY { if (AkelPad.MemRead(lParam + (_X64 ? 16 : 8), DT_DWORD) == -2 /*NM_CLICK*/) { if ((wParam == IDHELP1L) || (wParam == IDHELP2L)) RegExpHelp(wParam, 0); else if (wParam == IDFRTL) { oSys.Call("User32::SetFocus", hWhatE); FRTemplates(); } else if (wParam == IDFINDL) SwitchDialog(MLT_FIND); else if (wParam == IDREPLACEL) SwitchDialog(MLT_REPLACE); else if (wParam == IDGOTOL) SwitchDialog(MLT_GOTO); } } else if (uMsg == 256) //WM_KEYDOWN { if (! Shift()) { if (Ctrl()) { if ((wParam == 0x46 /*F key*/) && aDlg[IDFINDL].Create) SwitchDialog(MLT_FIND); else if ((wParam == 0x52 /*R key*/) && aDlg[IDREPLACEL].Create) SwitchDialog(MLT_REPLACE); else if ((wParam == 0x47 /*G key*/) && aDlg[IDGOTOL].Create) SwitchDialog(MLT_GOTO); } else { if (wParam == 0x70 /*VK_F1*/) { if (aDlg[IDHELP1L].Show && (oSys.Call("User32::GetFocus") == hWhatE)) RegExpHelp(IDHELP1L, 0); else if (aDlg[IDHELP2L].Show && (oSys.Call("User32::GetFocus") == hWithE)) RegExpHelp(IDHELP2L, 0); } else if ((wParam == 0x71 /*VK_F2*/) && aDlg[IDFRTL].Create) FRTemplates(); } } } else if (uMsg == 273) //WM_COMMAND { var nLowParam = LoWord(wParam); var nHiwParam = HiWord(wParam); if (nLowParam == IDC_SEARCH_FIND) { if (nHiwParam == 3 /*CBN_SETFOCUS*/) SendMessage(lParam, 0x0142 /*CB_SETEDITSEL*/, 0, MkLong(nWhatSel1, nWhatSel2)); else if (nHiwParam == 10 /*CBN_SELENDCANCEL*/) { nWhatSel1 = LoWord(SendMessage(lParam, 0x0140 /*CB_GETEDITSEL*/, 0, 0)); nWhatSel2 = HiWord(SendMessage(lParam, 0x0140 /*CB_GETEDITSEL*/, 0, 0)); } } else if (nLowParam == IDC_SEARCH_REPLACE) { if (nHiwParam == 3 /*CBN_SETFOCUS*/) SendMessage(lParam, 0x0142 /*CB_SETEDITSEL*/, 0, MkLong(nWithSel1, nWithSel2)); else if (nHiwParam == 10 /*CBN_SELENDCANCEL*/) { nWithSel1 = LoWord(SendMessage(lParam, 0x0140 /*CB_GETEDITSEL*/, 0, 0)); nWithSel2 = HiWord(SendMessage(lParam, 0x0140 /*CB_GETEDITSEL*/, 0, 0)); } } else if ((nLowParam == IDC_SEARCH_REGEXP) || (nLowParam == IDC_SEARCH_ESCAPESEQ)) { AkelPad.WindowNextProc(hDlgSubClass, hWnd, uMsg, wParam, lParam); ShowHelpLinksFR(); oSys.Call("User32::UpdateWindow", hWnd); } else if (nLowParam == IDMOREB) { bMore = ! bMore; ShowMore(true); oSys.Call("User32::UpdateWindow", hWnd); } else if ((nLowParam >= IDRACDB) && (nLowParam <= IDPROMPTB)) { var nOption; if (nLowParam == IDRACDB) nOption = 0x02000000; //FRF_REPLACEALLANDCLOSE else if (nLowParam == IDINSELB) nOption = 0x04000000; //FRF_CHECKINSELIFSEL else if (nLowParam == IDCYCLEB) { nOption = 0x08000000; //FRF_CYCLESEARCH oSys.Call("User32::EnableWindow", oSys.Call("User32::GetDlgItem", hWnd, IDPROMPTB), SendMessage(lParam, 0x00F0 /*BM_GETCHECK*/, 0, 0)); } else nOption = 0x10000000; //FRF_CYCLESEARCHPROMPT SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 228 /*MIS_SEARCHOPTIONS*/, SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 228 /*MI_SEARCHOPTIONS*/, 0) ^ nOption); } } else if (uMsg == 2) //WM_DESTROY { GetDialogPos(); GetWhatWithFR(); oSys.Call("User32::PostQuitMessage", 0); //Exit message loop } return 0; } function SendMessage(hWnd, uMsg, wParam, lParam) { return oSys.Call("User32::SendMessageW", hWnd, uMsg, wParam, lParam); } function PostMessage(hWnd, uMsg, wParam, lParam) { return oSys.Call("User32::PostMessageW", hWnd, uMsg, wParam, lParam); } 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 Boolean(oSys.Call("User32::GetKeyState", 0x11 /*VK_CONTROL*/) & 0x8000); } function Shift() { return Boolean(oSys.Call("User32::GetKeyState", 0x10 /*VK_SHIFT*/) & 0x8000); } function GetArguments() { var vArg = AkelPad.GetArgValue("Dlg", "F").toUpperCase(); if (vArg == "R") nDlgType = MLT_REPLACE; else if (vArg == "G") nDlgType = MLT_GOTO; else nDlgType = MLT_FIND; vArg = AkelPad.GetArgValue("FR", "").toUpperCase(); if (vArg.indexOf("M+") >= 0) nMatchCase = 1; else if (vArg.indexOf("M-") >= 0) nMatchCase = 0; else nMatchCase = 2; if (vArg.indexOf("W+") >= 0) nWholeWord = 1; else if (vArg.indexOf("W-") >= 0) nWholeWord = 0; else nWholeWord = 2; if (vArg.indexOf("R+") >= 0) nRegExp = 1; else if (vArg.indexOf("R-") >= 0) nRegExp = 0; else nRegExp = 2; if (vArg.indexOf("E+") >= 0) nEscSeq = 1; else if (vArg.indexOf("E-") >= 0) nEscSeq = 0; else nEscSeq = 2; if (vArg.indexOf("D") >= 0) nDirection = IDC_SEARCH_FORWARD; else if (vArg.indexOf("U") >= 0) nDirection = IDC_SEARCH_BACKWARD; else if (vArg.indexOf("B") >= 0) nDirection = IDC_SEARCH_BEGINNING; else if (vArg.indexOf("S") >= 0) nDirection = IDC_SEARCH_INSEL; else if (vArg.indexOf("A") >= 0) nDirection = IDC_SEARCH_ALLFILES; else nDirection = 2; vArg = AkelPad.GetArgValue("RDB", "").toUpperCase(); if ((vArg == "R") || (vArg == "A")) sDefButton = vArg; else sDefButton = ""; vArg = AkelPad.GetArgValue("GT", "").toUpperCase(); if (vArg.indexOf("L") >= 0) nGoTo = IDC_GOTO_LINE; else if (vArg.indexOf("O") >= 0) nGoTo = IDC_GOTO_OFFSET; else nGoTo = 2; } function GetLinkText() { var nLangID = AkelPad.GetLangId(); var hLangLib; var hRes; var hResData; var lpPointer; var nSize; var i; if (SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 52 /*MI_LANGMODULEW*/, lpBuffer)) hLangLib = oSys.Call("Kernel32::GetModuleHandleW", AkelPad.GetAkelDir(3 /*ADTYPE_LANGS*/) + "\\" + AkelPad.MemRead(lpBuffer, DT_UNICODE)); else //internal language hLangLib = AkelPad.GetInstanceExe(); for (i = IDFINDL; i <= IDGOTOL; ++i) { hRes = oSys.Call("Kernel32::FindResourceExW", hLangLib, 5 /*RT_DIALOG*/, aDlg[i].DlgID, nLangID); hResData = oSys.Call("Kernel32::LoadResource", hLangLib, hRes); lpPointer = oSys.Call("Kernel32::LockResource", hResData); nSize = oSys.Call("Kernel32::SizeofResource", hLangLib, hRes); if (nSize) { //pointer to menu if (AkelPad.MemRead(lpPointer + 2, DT_WORD) == 0xFFFF) //DLGTEMPLATEEX lpPointer += 26; else //DLGTEMPLATE lpPointer += 18; //pointer to windowClass if (AkelPad.MemRead(lpPointer, DT_WORD) == 0xFFFF) lpPointer += 4; else lpPointer += AkelPad.MemRead(lpPointer, DT_UNICODE).length + 2; //pointer to title if (AkelPad.MemRead(lpPointer, DT_WORD) == 0xFFFF) lpPointer += 4; else lpPointer += AkelPad.MemRead(lpPointer, DT_UNICODE).length + 2; aDlg[i].Text = AkelPad.MemRead(lpPointer, DT_UNICODE) + " " + aDlg[i].Text; } } } function GetLinkWidth() { var hDC = oSys.Call("User32::GetDC", hCancelB); var i; oSys.Call("Gdi32::SelectObject", hDC, hGuiFont); oSys.Call("Gdi32::SetMapMode", hDC, 1 /*MM_TEXT*/); for (i = IDHELP1L; i <= IDGOTOL; ++i) { oSys.Call("Gdi32::GetTextExtentPoint32W", hDC, aDlg[i].Text, aDlg[i].Text.length, lpBuffer); aDlg[i].W = AkelPad.MemRead(lpBuffer, DT_DWORD); } oSys.Call("User32::ReleaseDC", hCancelB, hDC); } function GetLinkPos() { var nDlgW, nDlgH; var nCancelX, nCancelW, nCancelH; oSys.Call("User32::GetClientRect", hDlg, lpBuffer); nDlgW = AkelPad.MemRead(lpBuffer + 8, DT_DWORD); nDlgH = AkelPad.MemRead(lpBuffer + 12, DT_DWORD); oSys.Call("User32::GetWindowRect", hCancelB, lpBuffer); oSys.Call("User32::ScreenToClient", hDlg, lpBuffer); oSys.Call("User32::ScreenToClient", hDlg, lpBuffer + 8); nCancelX = AkelPad.MemRead(lpBuffer, DT_DWORD); nCancelW = AkelPad.MemRead(lpBuffer + 8, DT_DWORD) - nCancelX; nCancelH = AkelPad.MemRead(lpBuffer + 12, DT_DWORD) - AkelPad.MemRead(lpBuffer + 4, DT_DWORD); if (nDlgType == MLT_GOTO) { aDlg[IDFINDL].X = 10; aDlg[IDFINDL].Y = nDlgH - 23; aDlg[IDREPLACEL].X = nDlgW - aDlg[IDREPLACEL].W - 10; aDlg[IDREPLACEL].Y = nDlgH - 23; aDlg[IDHELP1L].Create = false; aDlg[IDHELP1L].Show = false; aDlg[IDHELP2L].Create = false; aDlg[IDHELP2L].Show = false; aDlg[IDFRTL].Create = false; aDlg[IDFINDL].Create = bGoToDlg; aDlg[IDREPLACEL].Create = bGoToDlg; aDlg[IDGOTOL].Create = false; aDlg[IDMOREB].Create = false; aDlg[IDRACDB].Create = false; aDlg[IDINSELB].Create = false; aDlg[IDCYCLEB].Create = false; aDlg[IDPROMPTB].Create = false; } else { aDlg[IDHELP1L].X = nCancelX - 12; aDlg[IDHELP1L].Y = 18; aDlg[IDHELP2L].X = nCancelX - 12; aDlg[IDHELP2L].Y = 40; aDlg[IDFRTL].X = nCancelX + (nCancelW - aDlg[IDFRTL].W) / 2; aDlg[IDFRTL].Y = nDlgH + (bGoToDlg ? 0 : 20); aDlg[IDFINDL].X = nCancelX + (nCancelW - aDlg[IDFINDL].W) / 2; aDlg[IDFINDL].Y = nDlgH + 40; aDlg[IDREPLACEL].X = nCancelX + (nCancelW - aDlg[IDREPLACEL].W) / 2; aDlg[IDREPLACEL].Y = nDlgH + 40; aDlg[IDGOTOL].X = nCancelX + (nCancelW - aDlg[IDGOTOL].W) / 2; aDlg[IDGOTOL].Y = nDlgH + 20; aDlg[IDMOREB].X = nCancelX; aDlg[IDMOREB].Y = nDlgH - nCancelH - 15; aDlg[IDMOREB].W = nCancelW; aDlg[IDMOREB].H = nCancelH; aDlg[IDRACDB].X = 14; aDlg[IDRACDB].Y = nDlgH; aDlg[IDRACDB].W = 260; aDlg[IDINSELB].X = 14; aDlg[IDINSELB].Y = nDlgH + 20; aDlg[IDINSELB].W = 260; aDlg[IDCYCLEB].X = 14; aDlg[IDCYCLEB].Y = nDlgH + 40; aDlg[IDCYCLEB].W = 100; aDlg[IDPROMPTB].X = 150; aDlg[IDPROMPTB].Y = nDlgH + 40; aDlg[IDPROMPTB].W = 80; aDlg[IDHELP1L].Create = true; aDlg[IDHELP2L].Create = true; aDlg[IDFRTL].Create = true; aDlg[IDFINDL].Create = (nDlgType == MLT_REPLACE); aDlg[IDREPLACEL].Create = (nDlgType == MLT_FIND); aDlg[IDGOTOL].Create = bGoToDlg; aDlg[IDMOREB].Create = true; aDlg[IDRACDB].Create = (nDlgType == MLT_REPLACE); aDlg[IDINSELB].Create = true; aDlg[IDCYCLEB].Create = true; aDlg[IDPROMPTB].Create = true; } } function ShowMore(bResize) { var nSearchOptions; var i; oSys.Call("User32::SetWindowTextW", oSys.Call("User32::GetDlgItem", hDlg, IDMOREB), bMore ? "<< " + sTxtMore : sTxtMore + " >>"); if (bResize) ResizeDialog(bMore ? 65 : -65); for (i = IDFRTL; i <= IDPROMPTB; ++i) { if (aDlg[i].Create && (i != IDMOREB)) oSys.Call("User32::ShowWindow", oSys.Call("User32::GetDlgItem", hDlg, i), bMore); } if (bMore) { nSearchOptions = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 228 /*MI_SEARCHOPTIONS*/, 0); oSys.Call("User32::SendDlgItemMessageW", hDlg, IDRACDB, 0x00F1 /*BM_SETCHECK*/, nSearchOptions & 0x02000000 /*FRF_REPLACEALLANDCLOSE*/, 0); oSys.Call("User32::SendDlgItemMessageW", hDlg, IDINSELB, 0x00F1 /*BM_SETCHECK*/, nSearchOptions & 0x04000000 /*FRF_CHECKINSELIFSEL*/, 0); oSys.Call("User32::SendDlgItemMessageW", hDlg, IDCYCLEB, 0x00F1 /*BM_SETCHECK*/, nSearchOptions & 0x08000000 /*FRF_CYCLESEARCH*/, 0); oSys.Call("User32::SendDlgItemMessageW", hDlg, IDPROMPTB, 0x00F1 /*BM_SETCHECK*/, nSearchOptions & 0x10000000 /*FRF_CYCLESEARCHPROMPT*/, 0); oSys.Call("User32::EnableWindow", oSys.Call("User32::GetDlgItem", hDlg, IDPROMPTB), nSearchOptions & 0x08000000 /*FRF_CYCLESEARCH*/); } } function ShowHelpLinksFR() { if (SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_REGEXP), 0x00F0 /*BM_GETCHECK*/, 0, 0)) { aDlg[IDHELP1L].Show = true; aDlg[IDHELP2L].Show = (nDlgType == MLT_REPLACE); } else { aDlg[IDHELP1L].Show = false; aDlg[IDHELP2L].Show = false; } oSys.Call("User32::ShowWindow", oSys.Call("User32::GetDlgItem", hDlg, IDHELP1L), aDlg[IDHELP1L].Show); oSys.Call("User32::ShowWindow", oSys.Call("User32::GetDlgItem", hDlg, IDHELP2L), aDlg[IDHELP2L].Show); } function GetDialogWnd() { var hWnd = SendMessage(hMainWnd, 1275 /*AKD_GETMODELESS*/, 0, lpBuffer); var nMLT = AkelPad.MemRead(lpBuffer, DT_DWORD); hWhatE = 0; hWithE = 0; if ((nMLT == MLT_FIND) || (nMLT == MLT_REPLACE) || (nMLT == MLT_GOTO)) { nDlgType = nMLT; hDlg = hWnd; hCancelB = oSys.Call("User32::GetDlgItem", hDlg, IDCANCEL); if (nMLT != MLT_GOTO) { AkelPad.MemCopy(lpBuffer, (_X64 ? 64 : 52) /*sizeof(COMBOBOXINFO)*/, DT_DWORD); oSys.Call("User32::GetComboBoxInfo", oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_FIND), lpBuffer); hWhatE = AkelPad.MemRead(lpBuffer + (_X64 ? 48 : 44) /*hwndItem*/, DT_QWORD); if (nMLT == MLT_REPLACE) { oSys.Call("User32::GetComboBoxInfo", oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_REPLACE), lpBuffer); hWithE = AkelPad.MemRead(lpBuffer + (_X64 ? 48 : 44) /*hwndItem*/, DT_QWORD); } } } else hDlg = 0; } function GetDialogPos() { oSys.Call("User32::GetWindowRect", hDlg, lpBuffer); nDlgX = AkelPad.MemRead(lpBuffer, DT_DWORD); nDlgY = AkelPad.MemRead(lpBuffer + 4, DT_DWORD); } function SwitchDialog(nMLT) { bContinue = true; nDlgType = nMLT; SendMessage(hDlg, 273 /*WM_COMMAND*/, IDCANCEL, hCancelB); } function ResizeDialog(nIncreaseH) { var nW, nH; oSys.Call("User32::GetWindowRect", hDlg, lpBuffer); nW = AkelPad.MemRead(lpBuffer + 8, DT_DWORD) - AkelPad.MemRead(lpBuffer, DT_DWORD); nH = AkelPad.MemRead(lpBuffer + 12, DT_DWORD) - AkelPad.MemRead(lpBuffer + 4, DT_DWORD) + nIncreaseH; oSys.Call("User32::SetWindowPos", hDlg, 0, 0, 0, nW, nH, 0x16 /*SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE*/); } function SetParamsFR(nMatchCase, nWholeWord, nRegExp, nEscSeq, nDirection) { if (nMatchCase != 2) { SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_MATCHCASE), 0x00F1 /*BM_SETCHECK*/, nMatchCase, 0); SendMessage(hDlg, 273 /*WM_COMMAND*/, IDC_SEARCH_MATCHCASE, oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_MATCHCASE)); } if (nWholeWord != 2) { SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_WHOLEWORD), 0x00F1 /*BM_SETCHECK*/, nWholeWord, 0); SendMessage(hDlg, 273 /*WM_COMMAND*/, IDC_SEARCH_WHOLEWORD, oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_WHOLEWORD)); } if (nRegExp != 2) { SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_REGEXP), 0x00F1 /*BM_SETCHECK*/, nRegExp, 0); SendMessage(hDlg, 273 /*WM_COMMAND*/, IDC_SEARCH_REGEXP, oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_REGEXP)); } if (nEscSeq != 2) { SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_ESCAPESEQ), 0x00F1 /*BM_SETCHECK*/, nEscSeq, 0); SendMessage(hDlg, 273 /*WM_COMMAND*/, IDC_SEARCH_ESCAPESEQ, oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_ESCAPESEQ)); } if (nDirection != 2) { SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_BACKWARD), 0x00F1 /*BM_SETCHECK*/, 0, 0); SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_FORWARD), 0x00F1 /*BM_SETCHECK*/, 0, 0); SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_BEGINNING), 0x00F1 /*BM_SETCHECK*/, 0, 0); SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_INSEL), 0x00F1 /*BM_SETCHECK*/, 0, 0); SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_ALLFILES), 0x00F1 /*BM_SETCHECK*/, 0, 0); SendMessage(oSys.Call("User32::GetDlgItem", hDlg, nDirection), 0x00F1 /*BM_SETCHECK*/, 1, 0); SendMessage(hDlg, 273 /*WM_COMMAND*/, nDirection, oSys.Call("User32::GetDlgItem", hDlg, nDirection)); } } function SetParamsGT(nGoTo) { if (nGoTo != 2) { SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_GOTO_LINE), 0x00F1 /*BM_SETCHECK*/, 0, 0); SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_GOTO_OFFSET), 0x00F1 /*BM_SETCHECK*/, 0, 0); SendMessage(oSys.Call("User32::GetDlgItem", hDlg, nGoTo), 0x00F1 /*BM_SETCHECK*/, 1, 0); SendMessage(hDlg, 273 /*WM_COMMAND*/, nGoTo, oSys.Call("User32::GetDlgItem", hDlg, nGoTo)); } } function GetWhatWithFR() { if (hWhatE) { oSys.Call("User32::GetWindowTextW", hWhatE, lpBuffer, nBufSize / 2); sWhatText = AkelPad.MemRead(lpBuffer, DT_UNICODE); } if (hWithE) { oSys.Call("User32::GetWindowTextW", hWithE, lpBuffer, nBufSize / 2); sWithText = AkelPad.MemRead(lpBuffer, DT_UNICODE); } } function SetFRTtoFR() { var nItem = GetCurSelLV(); var sParams; var nMatchCase; var nWholeWord; var nRegExp; var nEscSeq; if (nItem > -1) { nWhatSel1 = 0; nWhatSel2 = -1; oSys.Call("User32::SetWindowTextW", hWhatE, GetTextLV(nItem, 1)); if (hWithE) { nWithSel1 = 0; nWithSel2 = -1; oSys.Call("User32::SetWindowTextW", hWithE, GetTextLV(nItem, 2)); } sParams = GetTextLV(nItem, 3); nMatchCase = parseInt(sParams.substr(0, 1)); nWholeWord = parseInt(sParams.substr(1, 1)); nRegExp = parseInt(sParams.substr(2, 1)); nEscSeq = parseInt(sParams.substr(3, 1)); SetParamsFR(nMatchCase, nWholeWord, nRegExp, nEscSeq, 2); } PostMessage(hWndFRT, 16 /*WM_CLOSE*/, 0, 0); } function FRTemplates() { var nDeskW, nDeskH, nFRTX, nFRTY; oSys.Call("User32::GetWindowRect", oSys.Call("user32::GetDesktopWindow"), lpBuffer); nDeskW = AkelPad.MemRead(lpBuffer + 8, DT_DWORD); nDeskH = AkelPad.MemRead(lpBuffer + 12, DT_DWORD); oSys.Call("User32::GetWindowRect", hWhatE, lpBuffer); nFRTX = AkelPad.MemRead(lpBuffer + 8, DT_DWORD); nFRTY = AkelPad.MemRead(lpBuffer + 4, DT_DWORD) - 35; if (nFRTX + nFRTW > nDeskW) nFRTX = AkelPad.MemRead(lpBuffer, DT_DWORD) - nFRTW; if (nFRTX < 0) nFRTX = 0; if (nFRTY + nFRTH > nDeskH) nFRTY = nDeskH - nFRTH; oSys.Call("User32::EnableWindow", hDlg, 0); hWndFRT = oSys.Call("user32::CreateWindowExW", 0, //dwExStyle sClassName, //lpClassName sTxtFRTempl, //lpWindowName 0x90CC0000, //dwStyle=WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX nFRTX, //x nFRTY, //y nFRTW, //nWidth nFRTH, //nHeight hDlg, //hWndParent 0, //ID hInstDLL, //hInstance CallbackFRT);//Script function callback. To use it class must be registered by WindowRegisterClass. } function CallbackFRT(hWnd, uMsg, wParam, lParam) { if (uMsg == 1) //WM_CREATE { var i; for (i = IDNAMELV; i <= IDHELP2L; ++i) { aWnd[i].Handle = oSys.Call("User32::CreateWindowExW", 0, //dwExStyle aWnd[i].Class,//lpClassName aWnd[i].Text, //lpWindowName aWnd[i].Style,//dwStyle 0, //x 0, //y 0, //nWidth 0, //nHeight hWnd, //hWndParent i, //ID hInstDLL, //hInstance 0); //lpParam SendMessage(aWnd[i].Handle, 48 /*WM_SETFONT*/, hGuiFont, true); } for (i = IDWHATE; i <= IDWITHE; ++i) { SendMessage(aWnd[i].Handle, 3262 /*AEM_SETTEXTLIMIT*/, 511, 0); SendMessage(aWnd[i].Handle, 1093 /*EM_SETEVENTMASK*/, 0, 0x1 /*ENM_CHANGE*/); aSubClassFRT[i] = AkelPad.WindowSubClass(aWnd[i].Handle, EditCallbackFRT, 256 /*WM_KEYDOWN*/); } InsertColumnsLV(); FillLV(); RefreshViewFRT(); hFocus = aWnd[IDNAMELV].Handle; } 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(lParam + 24, 340, DT_DWORD); //ptMinTrackSize_x AkelPad.MemCopy(lParam + 28, 250, DT_DWORD); //ptMinTrackSize_y AkelPad.MemCopy(lParam + 32, 1200, DT_DWORD); //ptMaxTrackSize_x AkelPad.MemCopy(lParam + 36, 800, DT_DWORD); //ptMaxTrackSize_y } else if (uMsg == 5) //WM_SIZE ResizeFRT(hWnd); else if (uMsg == 15) //WM_PAINT PaintSizeGrip(hWnd); else if (uMsg == 256 /*WM_KEYDOWN*/) { hFocus = oSys.Call("User32::GetFocus"); if (wParam == 0x2D /*VK_INSERT*/) { if ((hFocus != aWnd[IDWHATE].Handle) && (hFocus != aWnd[IDWITHE].Handle)) { if (Ctrl() || Shift()) EditFRT(1); else EditFRT(0); } } else if (wParam == 0x2E /*VK_DELETE*/) { if ((hFocus != aWnd[IDWHATE].Handle) && (hFocus != aWnd[IDWITHE].Handle)) { if ((! Ctrl()) && (! Shift())) DeleteFRT(); } } else if (wParam == 0x70 /*VK_F1*/) { if ((! Ctrl()) && (! Shift()) && SendMessage(aWnd[IDREGEXP].Handle, 0x00F0 /*BM_GETCHECK*/, 0, 0)) { if (hFocus == aWnd[IDWHATE].Handle) RegExpHelp(IDHELP1L, 1); else if (hFocus == aWnd[IDWITHE].Handle) RegExpHelp(IDHELP2L, 1); } } else if ((wParam == 0x71 /*VK_F2*/) || (wParam == 0x73 /*VK_F4*/)) { if ((! Ctrl()) && (! Shift())) EditFRT(2); } else if (wParam == 0x0D /*VK_RETURN*/) { if ((! Ctrl()) && (! Shift())) { if (oSys.Call("User32::GetDlgCtrlID", hFocus) < IDNEWB) SetFRTtoFR(); } } else if (wParam == 0x1B /*VK_ESCAPE*/) PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0); } else if (uMsg == 0x004E /*WM_NOTIFY*/) { if (wParam == IDNAMELV) { switch (AkelPad.MemRead(lParam + (_X64 ? 16 : 8), DT_DWORD)) { case -101 : //LVN_ITEMCHANGED if (AkelPad.MemRead(lParam + (_X64 ? 32 : 20) /*NMLISTVIEW.uNewState*/, DT_DWORD) & 0x2 /*LVIS_SELECTED*/) RefreshViewFRT(); break; case -3 : //NM_DBLCLK if (AkelPad.MemRead(lParam + (_X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, DT_DWORD) == -1) SetCurSelLV(GetCurFocLV()); else SetFRTtoFR(); break; case -2 : //NM_CLICK case -5 : //NM_RCLICK case -6 : //NM_RDBLCLK if (AkelPad.MemRead(lParam + (_X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, DT_DWORD) == -1) SetCurSelLV(GetCurFocLV()); break; } } else if ((wParam == IDHELP1L) || (wParam == IDHELP2L)) { if (AkelPad.MemRead(lParam + (_X64 ? 16 : 8), DT_DWORD) == -2 /*NM_CLICK*/) RegExpHelp(wParam, 1); } } else if (uMsg == 273) //WM_COMMAND { var nLowParam = LoWord(wParam); var nHiwParam = HiWord(wParam); if ((nLowParam == IDWHATE) || (nLowParam == IDWITHE)) { if ((nHiwParam == 0x0300 /*EN_CHANGE*/) && (oSys.Call("User32::GetFocus") == lParam)) SetEditTextToLV(nLowParam, lParam); } else if ((nLowParam >= IDMATCHC) && (nLowParam <= IDESCSEQ)) CheckButtonsFRT(nLowParam); else if ((nLowParam >= IDNEWB) && (nLowParam <= IDEDITB)) EditFRT(nLowParam - IDNEWB); else if (nLowParam == IDDELB) DeleteFRT(); else if (nLowParam == IDOKB) SetFRTtoFR(); else if (nLowParam == IDCLOSEB) PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0); } else if (uMsg == 16) //WM_CLOSE { AkelPad.WindowUnsubClass(aWnd[IDWHATE].Handle); AkelPad.WindowUnsubClass(aWnd[IDWITHE].Handle); oSys.Call("User32::GetWindowRect", hWnd, lpBuffer); nFRTW = AkelPad.MemRead(lpBuffer + 8, DT_DWORD) - AkelPad.MemRead(lpBuffer, DT_DWORD); nFRTH = AkelPad.MemRead(lpBuffer + 12, DT_DWORD) - AkelPad.MemRead(lpBuffer + 4, DT_DWORD); nFRTSel = GetCurSelLV(); WriteFRT(); oSys.Call("User32::EnableWindow", hDlg, 1); oSys.Call("User32::DestroyWindow", hWnd); } else { var nID = oSys.Call("User32::GetDlgCtrlID", oSys.Call("User32::GetFocus")); if ((nID >= IDNAMELV) && (nID < IDNEWB)) oSys.Call("User32::DefDlgProcW", hWnd, 1025 /*DM_SETDEFID*/, IDOKB, 0); } return 0; } function EditCallbackFRT(hWnd, uMsg, wParam, lParam) { if (uMsg == 256) //WM_KEYDOWN { if ((wParam == 9 /*VK_TAB*/) && Ctrl()) AkelPad.WindowNoNextProc(aSubClassFRT[oSys.Call("User32::GetDlgCtrlID", hWnd)]); } return 0; } function PaintSizeGrip(hWnd) { var lpPaint = AkelPad.MemAlloc(_X64 ? 72 : 64); //sizeof(PAINTSTRUCT) var hDC; if (hDC = oSys.Call("User32::BeginPaint", hWnd, lpPaint)) { oSys.Call("User32::GetClientRect", hWnd, lpBuffer); AkelPad.MemCopy(lpBuffer, AkelPad.MemRead(lpBuffer + 8, DT_DWORD) - oSys.Call("User32::GetSystemMetrics", 2 /*SM_CXVSCROLL*/), DT_DWORD); AkelPad.MemCopy(lpBuffer + 4, AkelPad.MemRead(lpBuffer + 12, DT_DWORD) - oSys.Call("User32::GetSystemMetrics", 20 /*SM_CYVSCROLL*/), DT_DWORD); oSys.Call("User32::DrawFrameControl", hDC, lpBuffer, 3 /*DFC_SCROLL*/, 0x8 /*DFCS_SCROLLSIZEGRIP*/); oSys.Call("User32::EndPaint", hWnd, lpPaint); } AkelPad.MemFree(lpPaint); } function ResizeFRT(hWnd) { var nSBW = 0; var nW, nH, nEW, nEH, nBW; var i; oSys.Call("User32::GetClientRect", hWnd, lpBuffer); nW = AkelPad.MemRead(lpBuffer + 8, DT_DWORD); nH = AkelPad.MemRead(lpBuffer + 12, DT_DWORD); nEW = Math.round((nW - 30) / 2); nEH = Math.round((nH - 160 - 21) / 2); nBW = (nW - (IDCLOSEB - IDNEWB) * 5 - 2 * 10) / (IDCLOSEB - IDNEWB + 1); oSys.Call("User32::SetWindowPos", aWnd[IDNAMELV].Handle, 0, 10, 10, nEW, nH - 30 - 21, 0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/); oSys.Call("User32::SetWindowPos", aWnd[IDWHATS].Handle, 0, nW - nEW - 10, 10, nEW, 13, 0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/); oSys.Call("User32::SetWindowPos", aWnd[IDWITHS].Handle, 0, nW - nEW - 10, nH - 125 - 21 - nEH, nEW, 13, 0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/); oSys.Call("User32::SetWindowPos", aWnd[IDHELP1L].Handle, 0, nW - aDlg[IDHELP1L].W - 10, 10, aDlg[IDHELP1L].W, 13, 0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/); oSys.Call("User32::SetWindowPos", aWnd[IDHELP2L].Handle, 0, nW - aDlg[IDHELP2L].W - 10, nH - 125 - 21 - nEH, aDlg[IDHELP2L].W, 13, 0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/); oSys.Call("User32::SetWindowPos", aWnd[IDWHATE].Handle, 0, nW - nEW - 10, 25, nEW, nEH, 0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/); oSys.Call("User32::SetWindowPos", aWnd[IDWITHE].Handle, 0, nW - nEW - 10, nH - 110 - 21 - nEH, nEW, nEH, 0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/); for (i = IDMATCHC; i <= IDESCSEQ; ++i) { oSys.Call("User32::SetWindowPos", aWnd[i].Handle, 0, nW - nEW - 10, nH - 100 - 21 + 20 * (i - IDMATCHC), nEW, 16, 0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/); } for (i = IDNEWB; i <= IDCLOSEB; ++i) { oSys.Call("User32::SetWindowPos", aWnd[i].Handle, 0, 10 + (i - IDNEWB) * (nBW + 5), nH - 21 - 10, nBW, 21, 0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/); } if (GetItemCountLV() > SendMessage(aWnd[IDNAMELV].Handle, 0x1028 /*LVM_GETCOUNTPERPAGE*/, 0, 0)) nSBW = oSys.Call("User32::GetSystemMetrics", 2 /*SM_CXVSCROLL*/); SendMessage(aWnd[IDNAMELV].Handle, 0x101E /*LVM_SETCOLUMNWIDTH*/, 0, nEW - nSBW); SendMessage(aWnd[IDNAMELV].Handle, 0x1013 /*LVM_ENSUREVISIBLE*/, GetCurSelLV(), false); SendMessage(aWnd[IDWHATE].Handle, 3242 /*AEM_SETWORDWRAP*/, 0x2 /*AEWW_SYMBOL*/, 0); SendMessage(aWnd[IDWITHE].Handle, 3242 /*AEM_SETWORDWRAP*/, 0x2 /*AEWW_SYMBOL*/, 0); } function RefreshViewFRT() { var nItem = GetCurSelLV(); var bIsItem = (nItem > -1); var sParams = bIsItem ? GetTextLV(nItem, 3) : ""; var i; for (i = IDWHATE; i <= IDWITHE; ++i) { oSys.Call("User32::SetWindowTextW", aWnd[i].Handle, bIsItem ? GetTextLV(nItem, i - IDWHATE + 1) : ""); oSys.Call("User32::EnableWindow", aWnd[i].Handle, bIsItem); } for (i = IDMATCHC; i <= IDESCSEQ; ++i) { SendMessage(aWnd[i].Handle, 0x00F1 /*BM_SETCHECK*/, parseInt(sParams.substr(i - IDMATCHC, 1)), 0); oSys.Call("User32::EnableWindow", aWnd[i].Handle, bIsItem); } for (i = IDEDITB; i <= IDDELB; ++i) oSys.Call("User32::EnableWindow", aWnd[i].Handle, bIsItem); ShowHelpLinksFRT(); } function SetEditTextToLV(nID, hWnd) { oSys.Call("User32::GetWindowTextW", hWnd, lpBuffer, nBufSize / 2); SetTextLV(GetCurSelLV(), nID - IDWHATE + 1, AkelPad.MemRead(lpBuffer, DT_UNICODE).replace(/[\r\n\t]/g, "")); bChangeFRT = true; } function CheckButtonsFRT(nID) { var sParams = ""; var i; if ((nID == IDREGEXP) && SendMessage(aWnd[IDREGEXP].Handle, 0x00F0 /*BM_GETCHECK*/, 0, 0)) SendMessage(aWnd[IDESCSEQ].Handle, 0x00F1 /*BM_SETCHECK*/, 0, 0); else if ((nID == IDESCSEQ) && SendMessage(aWnd[IDESCSEQ].Handle, 0x00F0 /*BM_GETCHECK*/, 0, 0)) SendMessage(aWnd[IDREGEXP].Handle, 0x00F1 /*BM_SETCHECK*/, 0, 0); ShowHelpLinksFRT(); for (i = IDMATCHC; i <= IDESCSEQ; ++i) sParams += SendMessage(aWnd[i].Handle, 0x00F0 /*BM_GETCHECK*/, 0, 0).toString(); SetTextLV(GetCurSelLV(), 3, sParams); bChangeFRT = true; } function ShowHelpLinksFRT() { bShow = SendMessage(aWnd[IDREGEXP].Handle, 0x00F0 /*BM_GETCHECK*/, 0, 0); oSys.Call("User32::ShowWindow", aWnd[IDHELP1L].Handle, bShow); oSys.Call("User32::ShowWindow", aWnd[IDHELP2L].Handle, bShow); } function GetItemCountLV() { return SendMessage(aWnd[IDNAMELV].Handle, 0x1004 /*LVM_GETITEMCOUNT*/, 0, 0); } function GetCurFocLV() { return SendMessage(aWnd[IDNAMELV].Handle, 0x100C /*LVM_GETNEXTITEM*/, -1, 0x0001 /*LVNI_FOCUSED*/); } function GetCurSelLV() { return SendMessage(aWnd[IDNAMELV].Handle, 0x100C /*LVM_GETNEXTITEM*/, -1, 0x0002 /*LVNI_SELECTED*/); } function SetCurSelLV(nItem) { AkelPad.MemCopy(lpLVITEM + 12, 0x0003 /*LVIS_SELECTED|LVIS_FOCUSED*/, DT_DWORD); AkelPad.MemCopy(lpLVITEM + 16, 0x0003 /*LVIS_SELECTED|LVIS_FOCUSED*/, DT_DWORD); SendMessage(aWnd[IDNAMELV].Handle, 0x102B /*LVM_SETITEMSTATE*/, nItem, lpLVITEM); SendMessage(aWnd[IDNAMELV].Handle, 0x1013 /*LVM_ENSUREVISIBLE*/, nItem, false); } function GetTextLV(nItem, nSubItem) { AkelPad.MemCopy(lpLVITEM + 8, nSubItem, DT_DWORD); SendMessage(aWnd[IDNAMELV].Handle, 0x1073 /*LVM_GETITEMTEXTW*/, nItem, lpLVITEM); return AkelPad.MemRead(lpBuffer, DT_UNICODE); } function SetTextLV(nItem, nSubItem, sText) { AkelPad.MemCopy(lpLVITEM + 8, nSubItem, DT_DWORD); AkelPad.MemCopy(lpBuffer, sText, DT_UNICODE); SendMessage(aWnd[IDNAMELV].Handle, 0x1074 /*LVM_SETITEMTEXTW*/, nItem, lpLVITEM); } function InsertItemLV(aField) { var nItem; var i; AkelPad.MemCopy(lpLVITEM + 8, 0, DT_DWORD); AkelPad.MemCopy(lpBuffer, aField[0], DT_UNICODE); nItem = SendMessage(aWnd[IDNAMELV].Handle, 0x104D /*LVM_INSERTITEMW*/, 0, lpLVITEM); for (i = 1; i < 4; ++i) { AkelPad.MemCopy(lpLVITEM + 8, i, DT_DWORD); AkelPad.MemCopy(lpBuffer, aField[i], DT_UNICODE); SendMessage(aWnd[IDNAMELV].Handle, 0x1074 /*LVM_SETITEMTEXTW*/, nItem, lpLVITEM); } return nItem; } function DeleteItemLV(nItem) { SendMessage(aWnd[IDNAMELV].Handle, 0x1008 /*LVM_DELETEITEM*/, nItem, 0); } function InsertColumnsLV() { var lpLVCOLUMN = AkelPad.MemAlloc(_X64 ? 56 : 44); //sizeof(LVCOLUMN) var aText = [sTxtName, sTxtFindWhat, sTxtReplaceWith, ""]; var i; AkelPad.MemCopy(lpLVCOLUMN, 6 /*mask=LVCF_WIDTH|LVCF_TEXT*/, DT_DWORD); AkelPad.MemCopy(lpLVCOLUMN + (_X64 ? 16 : 12), lpBuffer, DT_QWORD); for (i = 0; i < 4; ++i) { AkelPad.MemCopy(lpBuffer, aText[i], DT_UNICODE); SendMessage(aWnd[IDNAMELV].Handle, 0x1061 /*LVM_INSERTCOLUMNW*/, i, lpLVCOLUMN); } SendMessage(aWnd[IDNAMELV].Handle, 0x1036 /*LVM_SETEXTENDEDLISTVIEWSTYLE*/, 0x0020 /*LVS_EX_FULLROWSELECT*/, 0x0020); AkelPad.MemFree(lpLVCOLUMN); } function FillLV() { var sFRTName = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + "_templates.tsv"; var aRecord; var aField; var i; if (oFSO.FileExists(sFRTName)) aRecord = AkelPad.ReadFile(sFRTName).split("\r\n"); else { aRecord = ["Empty lines\t^[ \\t]*$\\n*\t\t0010"]; bChangeFRT = true; } for (i = 0; i < aRecord.length; ++i) { aField = aRecord[i].split("\t"); if (aField[0]) { while (aField.length < 4) aField[aField.length] = ""; while (aField[3].length < 4) aField[3] += "0"; aField[3] = aField[3].replace(/[^1]/g, "0"); InsertItemLV(aField); } } if (nFRTSel > GetItemCountLV() - 1) nFRTSel = GetItemCountLV() - 1; if (nFRTSel < 0) nFRTSel = 0; SetCurSelLV(nFRTSel); } function WriteFRT() { if (bChangeFRT) { var oFile = oFSO.OpenTextFile(WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + "_templates.tsv", 2, true, -1); var nItems = GetItemCountLV(); var sText = ""; var i; bChangeFRT = false; for (i = 0; i < nItems; ++i) sText += GetTextLV(i, 0) + "\t" + GetTextLV(i, 1) + "\t" + GetTextLV(i, 2) + "\t" + GetTextLV(i, 3) + "\r\n"; oFile.Write(sText); oFile.Close(); } } function EditFRT(nType) { var nItem = GetCurSelLV(); var aField = []; var sParams = ""; var sCaption; var i; if (nType == 1) //Add { GetWhatWithFR(); sCaption = sTxtAdd; aField = [ "", sWhatText, (nDlgType == MLT_REPLACE) ? sWithText : "", SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_MATCHCASE), 0x00F0 /*BM_GETCHECK*/, 0, 0).toString(), SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_WHOLEWORD), 0x00F0 /*BM_GETCHECK*/, 0, 0).toString(), SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_REGEXP), 0x00F0 /*BM_GETCHECK*/, 0, 0).toString(), SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_ESCAPESEQ), 0x00F0 /*BM_GETCHECK*/, 0, 0).toString()]; } else { if (nType == 0) //New sCaption = sTxtNew; else //Edit { if (nItem < 0) return; sCaption = sTxtEdit; } for (i = 0; i < 3; ++i) aField[i] = (nItem < 0) ? "" : GetTextLV(nItem, i); if (nItem > -1) sParams = GetTextLV(nItem, 3); for (i = 3; i < 7; ++i) aField[i] = sParams.substr(i - 3, 1); } aField = InputBox(hWndFRT, sCaption, [sTxtName + ":", sTxtFindWhat + ":", sTxtReplaceWith + ":", sTxtMatchCase + " " + sTxt1Yes0No + ":", sTxtWholeWord + ":", sTxtRegExp + ":", sTxtEscSeq + ":"], aField, 0, "CheckInputFRT", nType); if (aField) { if (nType == 2) //Edit DeleteItemLV(nItem) for (i = 0; i < 3; ++i) aField[i] = aField[i].replace(/[\r\n\t]/g, ""); for (i = 3; i < 7; ++i) { if (aField[i] != "1") aField[i] = "0"; } if ((aField[5] == "1") && (aField[6] == "1")) aField[5] = "0"; aField[3] += aField[4] + aField[5] + aField[6] aField.splice(4, 3); SetCurSelLV(InsertItemLV(aField)); bChangeFRT = true; } } function CheckInputFRT(hWnd, aField, nType) { var sCaption; var lpLVFINDINFO; var nSelItem; var nFindItem; if (nType == 0) sCaption = sTxtNew; else if (nType == 1) sCaption = sTxtAdd; else if (nType == 2) sCaption = sTxtEdit; if (aField[0]) { lpLVFINDINFO = AkelPad.MemAlloc(_X64 ? 40 : 24); //sizeof(LVFINDINFO) AkelPad.MemCopy(lpLVFINDINFO, 0x02 /*LVFI_STRING*/, DT_DWORD); AkelPad.MemCopy(lpLVFINDINFO + (_X64 ? 8 : 4), lpBuffer, DT_QWORD); AkelPad.MemCopy(lpBuffer, aField[0], DT_UNICODE); nSelItem = GetCurSelLV(); nFindItem = SendMessage(aWnd[IDNAMELV].Handle, 0x1053 /*LVM_FINDITEMW*/, -1, lpLVFINDINFO); AkelPad.MemFree(lpLVFINDINFO); if (nFindItem > -1) { if ((nType < 2) || (nFindItem != nSelItem)) { WarningBox(hWnd, sTxtNameExists, sCaption); return 0; } } } else { WarningBox(hWnd, sTxtNoName, sCaption); return 0; } if (! aField[1]) { WarningBox(hWnd, sTxtNoFindWhat, sCaption); return 1; } return -1; } function DeleteFRT() { var nItem = GetCurSelLV(); if (nItem > -1) { if (QuestionBox(hWndFRT, '"' + GetTextLV(nItem, 0) + '"\n\n' + sTxtWantRemove, sTxtDelete)) { DeleteItemLV(nItem); if (nItem == GetItemCountLV()) --nItem; SetCurSelLV(nItem); RefreshViewFRT(); bChangeFRT = true; if (! oSys.Call("User32::IsWindowEnabled", oSys.Call("User32::GetFocus"))) oSys.Call("User32::SetFocus", aWnd[IDNAMELV].Handle); } } } function WarningBox(hWnd, sText, sCaption) { AkelPad.MessageBox(hWnd, sText, sCaption, 0x30 /*MB_ICONWARNING*/); } function QuestionBox(hWnd, sText, sCaption) { return (AkelPad.MessageBox(hWnd, sText, sCaption, 0x23 /*MB_ICONQUESTION|MB_YESNOCANCEL*/) == 6 /*IDYES*/); } function RegExpHelp(nHelpID, bFRT) { var hMenu = oSys.Call("User32::CreatePopupMenu"); var nString = 0x0000; //MF_STRING var nDisable = 0x0002; //MF_DISABLED var nBreak = 0x0060; //MF_MENUBREAK|MF_MENUBARBREAK var nSepar = 0x0800; //MF_SEPARATOR var hFromPos; var hEdit; var hWndOwn; var aMenu; var nMenuX; var nMenuY; var nCmd; var i; if (nHelpID == IDHELP1L) { if (bFRT) { hFromPos = aWnd[IDWHATE].Handle; hEdit = aWnd[IDWHATE].Handle; } else { hFromPos = oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_FIND); hEdit = hWhatE; } aMenu = [ [nString, ".", sHlpAnyChar], [nString, "\\(", sHlpSpecChars], [nString, "\\f", sHlpFF], [nString, "\\n", sHlpAnyNL], [nString, "\\r", sHlpAnyNL], [nString, "\\t", sHlpTab], [nString, "\\v", sHlpVTab], [nString, "\\d", sHlpDigit], [nString, "\\D", sHlpNonDigit], [nString, "\\s", sHlpWhiteSp], [nString, "\\S", sHlpNonWhiteSp], [nString, "\\w", sHlpWordChar], [nString, "\\W", sHlpNonWordChar], [nString, "\\x{F}", sHlpCharHex], [nString, "\\xFF", sHlpCharHex2], [nString, "\\uFFFF", sHlpCharHex4], [nSepar, 0, 0], [nString, "^", sHlpBeginLine], [nString, "$", sHlpEndLine], [nString, "\\A", sHlpBeginText], [nString, "\\Z", sHlpEndText], [nString, "\\a", sHlpBeginRange], [nString, "\\z", sHlpEndRange], [nString, "\\b", sHlpWordBoun], [nString, "\\B", sHlpNonWordBoun], [nBreak, "ab|xy", sHlpAlternative], [nString, "[abc]", sHlpCharSet], [nString, "[^abc]", sHlpNegCharSet], [nString, "[a-z]", sHlpRange], [nString, "[^a-z]", sHlpNegRange], [nSepar, 0, 0], [nString, "(ab)", sHlpCapture], [nString, "(?:ab)", sHlpNotCapture], [nString, "(?<=ab)", sHlpPreceded], [nString, "(?