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 »


KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

AkelPadDocsView.js
Changed: in Find dialog, ComboBox instead of Edit control.

Offline
Posts: 670
Joined: Thu Jun 03, 2010 8:47 am
Location: Сочи, Хоста
Contact:

Post by Andrey_A_A »

Подскажите почему функция BrowseForFolder вешает AkelPad и не возвращает путь (BrowseForFolder_function.js)

Code: Select all

var hEditWnd = AkelPad.GetEditWnd();
var hMainWnd = AkelPad.GetMainWnd();
var sFile = AkelPad.GetEditFile(0);
var sText = ""
var sTitle = "Выберите папку, куда хотите скопировать файл:";
var sDir = "";
var FSO;
var sName;
var fileExist;

if ((hEditWnd) && AkelPad.Include("BrowseForFolder_function.js"))
{
  if (sFile)
    sDir = sFile.substr(0, sFile.lastIndexOf("\\") + 1);
    sDir = BrowseForFolder(hEditWnd, sText, sDir, sTitle);
    if (sDir === "") WScript.Quit();
  if (sDir)
  FSO = new ActiveXObject("Scripting.FileSystemObject");
  sName = FSO.GetFileName(sFile);
  var sFileNew = sDir + "\\" + sName;
  if (sFileNew != sFile)
   {
     //Close editing file
     //AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4324 /*IDM_NONMENU_FILECLOSE*/, 0);
     fileExist = FSO.FileExists(sFileNew);
     if (fileExist == false)
      {
        FSO.CopyFile(sFile, sFileNew);
         if (FSO.FileExists(sFileNew) == true)
         {
            //Open file
            AkelPad.OpenFile(sFileNew);
         }
      }
   }
}

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

Post by opk44 »

Andrey_A_A
Я не авгур, по птицам не гадаю, но... может антивирус?

Offline
Posts: 670
Joined: Thu Jun 03, 2010 8:47 am
Location: Сочи, Хоста
Contact:

Post by Andrey_A_A »

Code: Select all

может антивирус?
Антивируса нет - у меня на 7x64 после вызова функции не возвращается каталог в скрипт, и после него не работают другие скрипты

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Andrey_A_A
Try this test script:

Code: Select all

var sDir = BrowseForFolder(0, "Choose folder:", AkelPad.GetAkelDir());

WScript.Echo('Returned value: "' + sDir + '"');

function BrowseForFolder(hWndOwn, sText, sIniDir, sTitle)
{
  var oSys     = AkelPad.SystemFunction();
  var hWndDesk = oSys.Call("User32::GetDesktopWindow");

  if (! oSys.Call("User32::IsWindow", hWndOwn))
    hWndOwn = hWndDesk;
  if (typeof sText != "string")
    sText = "";
  if (typeof sIniDir != "string")
    sIniDir = "";

  var lpCallback = oSys.RegisterCallback(BFFCallback);
  var lpText     = AkelPad.MemAlloc((sText.length + 1) * 2);
  var lpDir      = AkelPad.MemAlloc(260 * 2); //sizeof(MAX_PATH)
  var lpBrowse   = AkelPad.MemAlloc(_X64 ? 64 : 32); //sizeof(BROWSEINFO)
  var sDir       = "";
  var lpIDL;

  AkelPad.MemCopy(lpText, sText, 1 /*DT_UNICODE*/);
  AkelPad.MemCopy(lpDir, sIniDir, 1 /*DT_UNICODE*/);

  AkelPad.MemCopy(lpBrowse,                       hWndOwn, 2 /*DT_QWORD*/); //hWndOwner
  AkelPad.MemCopy(lpBrowse + (_X64 ?  8 :  4),          0, 2 /*DT_QWORD*/); //pidlRoot
  AkelPad.MemCopy(lpBrowse + (_X64 ? 16 :  8),      lpDir, 2 /*DT_QWORD*/); //pszDisplayName
  AkelPad.MemCopy(lpBrowse + (_X64 ? 24 : 12),     lpText, 2 /*DT_QWORD*/); //lpszTitle
  AkelPad.MemCopy(lpBrowse + (_X64 ? 32 : 16), 0x00000041, 3 /*DT_DWORD*/); //ulFlags = BIF_NEWDIALOGSTYLE|BIF_RETURNONLYFSDIRS
  AkelPad.MemCopy(lpBrowse + (_X64 ? 40 : 20), lpCallback, 2 /*DT_QWORD*/); //lpfn
  AkelPad.MemCopy(lpBrowse + (_X64 ? 48 : 24),          0, 2 /*DT_QWORD*/); //lParam = lpData in callback function
  AkelPad.MemCopy(lpBrowse + (_X64 ? 56 : 28),          0, 3 /*DT_DWORD*/); //iImage

  lpIDL = oSys.Call("Shell32::SHBrowseForFolderW", lpBrowse);

  if (lpIDL)
  {
    oSys.Call("Shell32::SHGetPathFromIDListW", lpIDL, lpDir);
    oSys.Call("Ole32::CoTaskMemFree", lpIDL);
    sDir = AkelPad.MemRead(lpDir, 1 /*DT_UNICODE*/);
  }

  oSys.UnregisterCallback(lpCallback);
  AkelPad.MemFree(lpText);
  AkelPad.MemFree(lpDir);
  AkelPad.MemFree(lpBrowse);

  return sDir;

  function BFFCallback(hWnd, uMsg, lParam, lpData)
  {
    if (uMsg == 1 /*BFFM_INITIALIZED*/)
    {
      var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
      var hWnd1;
      var hWnd2;
      var nWndX, nWndY, nWndW, nWndH;
      var nOwnX, nOwnY, nOwnW, nOwnH;
      var nDeskW, nDeskH;

      if (typeof sTitle == "string")
        oSys.Call("User32::SetWindowTextW", hWnd, sTitle);

      oSys.Call("User32::SendMessageW", hWnd, 0x0467 /*BFFM_SETSELECTIONW*/, 1, lpDir);

      //set focus to TreeView
      if (hWnd1 = oSys.Call("User32::FindWindowExW", hWnd, 0, "SHBrowseForFolder ShellNameSpace Control", 0))
      {
        if (hWnd2 = oSys.Call("User32::FindWindowExW", hWnd1, 0, "SysTreeView32", 0))
        {
          WScript.Sleep(50);
          oSys.Call("User32::PostMessageW", hWnd, 0x0028 /*WM_NEXTDLGCTL*/, hWnd2, 1);
          oSys.Call("User32::PostMessageW", hWnd2, 0x1114 /*TVM_ENSUREVISIBLE*/, 0, oSys.Call("User32::SendMessageW", hWnd2, 0x110A /*TVM_GETNEXTITEM*/, 0x0009 /*TVGN_CARET*/, 0));
        }
      }

      //center dialog
      oSys.Call("User32::GetWindowRect", hWnd, lpRect);
      nWndX = AkelPad.MemRead(lpRect,      3 /*DT_DWORD*/);
      nWndY = AkelPad.MemRead(lpRect +  4, 3 /*DT_DWORD*/);
      nWndW = AkelPad.MemRead(lpRect +  8, 3 /*DT_DWORD*/) - nWndX;
      nWndH = AkelPad.MemRead(lpRect + 12, 3 /*DT_DWORD*/) - nWndY;

      oSys.Call("User32::GetWindowRect", hWndOwn, lpRect);
      nOwnX = AkelPad.MemRead(lpRect,      3 /*DT_DWORD*/);
      nOwnY = AkelPad.MemRead(lpRect +  4, 3 /*DT_DWORD*/);
      nOwnW = AkelPad.MemRead(lpRect +  8, 3 /*DT_DWORD*/) - nOwnX;
      nOwnH = AkelPad.MemRead(lpRect + 12, 3 /*DT_DWORD*/) - nOwnY;

      oSys.Call("User32::GetWindowRect", hWndDesk, lpRect);
      nDeskW = AkelPad.MemRead(lpRect +  8, 3 /*DT_DWORD*/);
      nDeskH = AkelPad.MemRead(lpRect + 12, 3 /*DT_DWORD*/);
      AkelPad.MemFree(lpRect);

      nWndX = nOwnX + (nOwnW - nWndW) / 2;
      nWndY = nOwnY + (nOwnH - nWndH) / 2;

      if ((nWndX + nWndW) > nDeskW)
        nWndX = nDeskW - nWndW;
      if (nWndX < 0)
        nWndX = 0;
      if ((nWndY + nWndH) > nDeskH)
        nWndY = nDeskH - nWndH;
      if (nWndY < 0)
        nWndY = 0;

      oSys.Call("User32::SetWindowPos", hWnd, 0, nWndX, nWndY, 0, 0, 0x15 /*SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE*/);
    }

    return 0;
  }
}

Offline
Posts: 670
Joined: Thu Jun 03, 2010 8:47 am
Location: Сочи, Хоста
Contact:

Post by Andrey_A_A »

KDJ, спасибо в этом варианте работает хорошо.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

BrowseForFolder_function.js
Added: parameters bFiles, nPosX, nPosY.
Fixed: sometimes does not work on Win7.

FindReplaceFiles.js
Changed: position of BrowseForFolder dialog.

Offline
Posts: 171
Joined: Thu Dec 01, 2011 11:15 pm
Location: Россия

Post by LonerD »

Скрипт TabSwitch.js на панели задач работает в таком виде:

Code: Select all

-"Tab list" Call("Scripts::Main", 1, "TabSwitch.js", `-Next=-1 -CtrlTab=false -RightLeft=true -MinTabs=1 -WindowLeft=%bl -WindowTop=%bb`) Icon(0)
А вот если вставить эту комбинацию в главное меню или в контекстное меню по правой кнопке мыши - начинаются крахи. Это можно исправить? Возможно, другие параметры нужны?

Offline
Site Admin
Posts: 6403
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

LonerD
У ContextMenu плагина нет переменных %bl, %bb (см. ContextMenu-Rus.txt).

С версии 3.7 можно так:

Code: Select all

-"Tab list" Call("Scripts::Main", 1, "TabSwitch.js", `-Next=-1 -CtrlTab=false -RightLeft=true -MinTabs=1 -WindowLeft=-2 -WindowTop=-2`)

Offline
Posts: 171
Joined: Thu Dec 01, 2011 11:15 pm
Location: Россия

Post by LonerD »

Instructor wrote:LonerD
У ContextMenu плагина нет переменных %bl, %bb (см. ContextMenu-Rus.txt).

С версии 3.7 можно так
Спасибо, забыл про это. Долгое время потребительски пользовался Акелпадом, теперь вот снова начал переделывать всё под себя.

Offline
Posts: 171
Joined: Thu Dec 01, 2011 11:15 pm
Location: Россия

Post by LonerD »

Есть ли скрипт, делающий бэкапы редактируемого файла?
Примерно, так я себе это представляю... Если файл уже существует, то при нажатии хоткея рядом с редактируемым файлом создаётся копия с именем "FileName YY.MM.dd - HH.mm.ss" и расширением как у редактируемого файла. Если файла не существует - при нажатии хоткея открывается стандартное окно сохранения файла.

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

LonerD
Нечто похожее делает backupVersion.js, только я так и не выложил разрабатываемую версию, умеющую -forceDate=true и там нет специальной обработки несохраненных файлов.

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

Post by Skif_off »

Infocatcher
Т.е., если редактирую файл, то предварительно нужно нажать Ctrl+S, а уже потом можно вызвать скрипт?

И такой вопрос возник: на днях обновил jsBeautifier.js, сейчас заметил ещё изменения - это оптимизация/исправление ошибок или новые фичи? Или только синхронизация с исходным кодом проекта? Вношу некоторые изменения, но, мягко говоря, не очень понимаю код и изменения :)

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

LonerD

Script:

Code: Select all

if (AkelPad.GetEditWnd())
{
  var sFile     = AkelPad.GetEditFile(0);
  var bModified = AkelPad.GetEditModified(0);

  if (sFile)
  {
    if (bModified)
    {
      CreateBackup();
      AkelPad.Command(4105 /*IDM_FILE_SAVE*/);
    }
  }
  else
    AkelPad.Command(4106 /*IDM_FILE_SAVEAS*/);
}

function CreateBackup()
{
  var oFSO  = new ActiveXObject("Scripting.FileSystemObject");
  var sPath = oFSO.GetParentFolderName(sFile);
  var dDate = new Date();
  var sBackup;

  if (sPath.slice(-1) != "\\")
    sPath += "\\";

  sBackup = sPath +
            oFSO.GetBaseName(sFile) + "_" +
            dDate.getFullYear() + "." +
            PadL0(dDate.getMonth() + 1) + "." +
            PadL0(dDate.getDate()) + "_" +
            PadL0(dDate.getHours()) + "." +
            PadL0(dDate.getMinutes()) + "." +
            PadL0(dDate.getSeconds()) + "." +
            oFSO.GetExtensionName(sFile);

  oFSO.CopyFile(sFile, sBackup, false);
}

function PadL0(nNum)
{
  var sNum = nNum.toString(10);

  if (sNum.length == 1)
    sNum = "0" + sNum;

  return sNum;
}
Locked