Scripts discussion (3)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

TextReplace.js
Changed: "History" and "Templates" windows width are adjusted to the width of dialog box.
Updated: Russian translation by YuS.

Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

KDJ wrote:Probably you have disabled the history.
Check the option "Settings" -> "Keep history on exit".
Спасибо. Думал, что опция для сохранения результатов, а не установок, потому она была отключена.

Offline
Posts: 202
Joined: Sat Mar 28, 2015 2:36 pm
Location: Russia

Post by Kley »

VladSh
SessionMenu.js
Было здесь
VladSh wrote:В первом меню отображает 2 элемента, 2-й элемент раскрывает все последующие сессии. Что-то не то.
Да не то. Файл сессии, на котором споткнулся скрипт, либо пуст, либо содержит пути к файлам, отсутствующим на данном компе.
Скрипт поправил. Теперь такие сессии должны игнорироваться.

Offline
Posts: 1162
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Kley
Спасибо, возникла пара мыслей:
- наверное, стоит добавить пункт редактирования сессии (первым пунктом подменю и разделитель после него, например) и, возможно, удаления;
- мне кажется, что не стоит убирать из списка отсутствующие файлы, т.к. в этом случае пользователь неверно оценит содержимое сессии. Раз есть проверка, можно как-то помечать такие файлы, например, "*name".

Offline
Posts: 202
Joined: Sat Mar 28, 2015 2:36 pm
Location: Russia

Post by Kley »

SessionMenu.js
Исправлена сортировка строк меню.
Добавлены новые параметры запуска и строки меню.

Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Kley
Спасибо! Это уже можно использовать!

Есть масса предложений, но остановлюсь на основных:

1. У меня в пределах одной сессии множество файлов с одинаковыми названиями (пути разные). Хотелось бы отдельный параметр, чтобы выводить полные пути.

2. Удобство скрипта в быстром открытии файлов из сессий. Для работы с сессиями лучше и удобнее диалог. Т.е. я бы хотел полностью убрать все возможности работы с сессиями из меню, возможно отдельным параметром.
И "Диалог" загнал бы в самый низ меню, по аналогии с пунктом для редактирования какого-либо меню (они всегда внизу идут по традиции). Да и сам вызов диалога сессий и так на отдельной комбинации клавиш висит.

3. Когда указана сессия и файлов в ней нет скрипт ничего не делает - жмёшь кнопку и ничего не происходит. По моему, надо выдавать сообщение, что сессия пуста. И спрашивать, открывать ли сессию на редактирование.

Offline
Posts: 202
Joined: Sat Mar 28, 2015 2:36 pm
Location: Russia

Post by Kley »

VladSh
По первым двум пунктам:
VladSh wrote:и чтобы при клике на кнопку выводилась менюшка с перечнем всех файлов сессии для открытия.
И лучше всё-таки параметр, чтобы указать конкретную сессию, без вывода подменю.

Code: Select all

Call("Scripts::Main", 1, "SessionMenu.js", `-s="OnExit" -m="%m" -i="%i"`)
Ни каких дополнительных пунктов меню, только файлы :)
VladSh wrote:Хотелось бы отдельный параметр, чтобы выводить полные пути.
SessionMenu.js wrote:// Arguments:
// -p=1 -показывать в меню полные пути (по умолчанию 0).

Code: Select all

Call("Scripts::Main", 1, "SessionMenu.js", `-p=1 -s="OnExit" -m="%m" -i="%i"`)

Offline
Posts: 202
Joined: Sat Mar 28, 2015 2:36 pm
Location: Russia

Post by Kley »

SessionMenu.js
Изменена структура меню.
Добавлен новый параметр.

Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Kley
Здорово! Полные пути выпустил из виду...)

Только предыдущий вариант с дополнительными "пунктами меню" (типа "Редактировать сессию") в подменю сессий был более удачен. Эти пункты просто надо было сместить вниз, а файлы чтобы были сверху.
Поясню логику. Открывая меню мы не пытаемся сразу редактировать сессии или что-то с ними делать. Мы вначале лезем открывать файл, а потом видим что с сессией что-то не так, тогда в подменю этой же сессии выбираем "Редактировать сессию". Это делаем редко, потому такие "пункты меню" лучше делать ниже файлов.
И "Диалог" также ниже сессий.

Добавлено: раньше мучался от того, что в последних файлах нужные файлы уезжают, а теперь просто балдею от удобства, - доступ ко всем нужным файлам почти в один клик! "Избранное" может преспокойно отправляться на помойку)

Offline
Posts: 19
Joined: Sun Jan 17, 2016 5:41 pm

Post by nbsp »

KDJ wrote:Search files by name/content and replace content - part 1.
Part 2 - in the next post.
Required to include: BrowseForFolder_function.js and FileAndStream_functions.js
All in one: KDJ.zip

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=20235#p20235
// Version: 2016-02-13
// 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));
  }
}

Hi KDJ,

Great tool - I like it alot. It would be nice if you could replace the ListView control with a TreeView control showing (when "Text in file/stream" is used) underneath each found file all the matches ("only matched" / "entire lines" - controllable as in 'FindReplaceEx.js', line number, index - character position). Additionally, if "Text in file/stream" has "Regular expressions" checked, underneath each match show all the capturing groups.

Thank you! :D

Offline
Posts: 96
Joined: Tue Nov 10, 2015 4:56 am

Post by InFive »

VladSh wrote:"Избранное" может преспокойно отправляться на помойку)
завление конечно вы сделали громкое... понятно, что есть у вас на то правА как автора скрипта Favourites.js, но для меня меня Favourites.js - это самое лучшее и простое... до сих пор не могу въехать как пользоваться Сессиями, поэтому и не пользуюсь Сессиями...

надо выбрать время чтобы разобраться как оно работает и как с ним работать... а пока Избранное рулит...

Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

InFive
Ответил здесь.

Если Kley доработает скрипт как я просил выше, то с возможность редактирования и открытия из меню каждой сессии будет вообще бомба! Этот скрипт, по моему, прорыв в навигации по файлам из AkelPad. Что-то такое очевидное, чего давно не хватало.

Offline
Posts: 202
Joined: Sat Mar 28, 2015 2:36 pm
Location: Russia

Post by Kley »

SessionMenu.js
Добавлены новые флаги для настройки меню.

Offline
Posts: 9
Joined: Fri Jan 29, 2016 11:04 am

Post by coherent »

Kley
DeletePhrasesInText.js
Подскажите, пожалуйста, в какой кодировке должен быть сохранен текст скрипта?

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

coherent
В общем случае, предпочтительно UTF-16LE (ИМХО). Но обязательным условием это не является. Посмотрите ZIP-ы авторских коллекций скриптов, там чего только нет (в плане кодировки).
Locked