Scripts collection

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

Post by KDJ »

Manager of files and NTFS streams - Part Three.
See next post.

Code: Select all

function Rename()
{
  var nPan2 = Number(! nCurPan);
  var sOldName;
  var sNewName;
  var sCaption;

  if (! RenameAvailable())
    return;

  GetCurFile(nPan2);

  if (aCurWnd[nCurPan] == 0)
  {
    sOldName = aCurDir[nCurPan][aCurDrive[nCurPan]].File;
    if (CurFileIsDir(nCurPan))
      sCaption = sTxtRenDir;
    else
      sCaption = sTxtRenFile;
  }
  else
  {
    sOldName = aCurDir[nCurPan][aCurDrive[nCurPan]].Stream;
    sCaption = sTxtRenStr;
  }

  sNewName = GetFileName(sCaption, sOldName + "\n\n" + sTxtNewName, sOldName);

  if ((sNewName) && (sNewName != sOldName))
  {
    if (! IsDriveExists(aCurDrive[nCurPan]))
    {
      MessageNoDrive(nCurPan, aCurDrive[nCurPan]);
      return;
    }

    if (! GetFileAttr(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File))
    {
      MessageNoFile(nCurPan, CurFileIsDir(nCurPan));
      return;
    }

    //Rename file or directory
    if (aCurWnd[nCurPan] == 0)
    {
      //File or directory already exists
      if (GetFileAttr(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + sNewName))
      {
        if (IsDirExists(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + sNewName))
          WarningBox(hWndDlg, sNewName + "\n\n" + sTxtDirExists, sCaption);
        else
          WarningBox(hWndDlg, sNewName + "\n\n" + sTxtFileExists, sCaption);

        FillFileList(nCurPan, sNewName, 0, 1);
      }
      else
      {
        if (RenameFile(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + sOldName, 0, sNewName))
        {
          FillFileList(nCurPan, sNewName, 0, 1);
          if (aCurDir[nCurPan][aCurDrive[nCurPan]].Path == aCurDir[nPan2][aCurDrive[nPan2]].Path)
            RefreshPanel(nPan2);
        }
        else
          WarningBox(hWndDlg, sTxtRenFail, sCaption);
      }
    }

    //Rename stream
    else
    {
      if (IsStreamExists(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File, sOldName))
      {
        ShowWaitWindow(1);

        if (RenameFile(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File, sOldName, sNewName))
        {
          ShowWaitWindow(0);

          FillStreamList(nCurPan, sNewName);
          if ((aCurDir[nCurPan][aCurDrive[nCurPan]].Path == aCurDir[nPan2][aCurDrive[nPan2]].Path) &&
              (aCurDir[nCurPan][aCurDrive[nCurPan]].File == aCurDir[nPan2][aCurDrive[nPan2]].File))
            RefreshStreamList(nPan2);
        }
        else
        {
          ShowWaitWindow(0);
          WarningBox(hWndDlg, sTxtRenFail, sCaption);
        }
      }
      else
        MessageNoStream(sOldName);
    }
  }
}

function RenameAvailable()
{
  GetCurFile(nCurPan);

  return aCurDir[nCurPan][aCurDrive[nCurPan]].File &&
         (((aCurWnd[nCurPan] == 0) && (aCurDir[nCurPan][aCurDrive[nCurPan]].File != "..")) ||
          ((aCurWnd[nCurPan] == 1) && aCurDir[nCurPan][aCurDrive[nCurPan]].Stream));
}

function OpenIn(nAppType, nAppIndex)
{
  var sAppName;
  var sAppPar;

  if (! OpenInAvailable(nAppType))
    return;

  if (nAppType == 0)
    sAppName = (nAppIndex == 1) ? sViewer : sViewer2;
  else if (nAppType == 1)
    sAppName = (nAppIndex == 1) ? sEditor : sEditor2;
  else if (nAppType == 3)
    sAppName = aFavorite[nAppIndex][1];
  else
  {
    nAppIndex = GetInternalAssocIndex();
    if (nAppIndex < 0)
      return;
    sAppName = aIntAssoc[nAppIndex][1];
  }

  sAppName = ExpandFileName(sAppName);

  if (! IsFileExists(sAppName))
  {
    if (nAppType == 4)
    {
      if (SetInternalAssoc(nAppIndex, 1))
      {
        nAppIndex = GetInternalAssocIndex();
        if (nAppIndex < 0)
          return;
        sAppName = aIntAssoc[nAppIndex][1];
      }
      else
        return;
    }
    else
    {
      if (SetExternalApp(nAppType, nAppIndex, 1))
      {
        if (nAppType == 0)
          sAppName = (nAppIndex == 1) ? sViewer : sViewer2;
        else if (nAppType == 1)
          sAppName = (nAppIndex == 1) ? sEditor : sEditor2;
        else
          sAppName = aFavorite[nAppIndex][1];
      }
      else
        return;
    }
    sAppName = ExpandFileName(sAppName);
  }

  if (! IsDriveExists(aCurDrive[nCurPan]))
  {
    MessageNoDrive(nCurPan, aCurDrive[nCurPan]);
    return;
  }

  if (! GetFileAttr(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File))
  {
    MessageNoFile(nCurPan, CurFileIsDir(nCurPan));
    return;
  }

  if (nAppType == 0)
    sAppPar = (nAppIndex == 1) ? sViewerPar : sViewerPar2;
  else if (nAppType == 1)
    sAppPar = (nAppIndex == 1) ? sEditorPar : sEditorPar2;
  else if (nAppType == 3)
    sAppPar = aFavorite[nAppIndex][2];
  else
    sAppPar = aIntAssoc[nAppIndex][2];

  if ((aCurWnd[nCurPan] == 0) || (! aCurDir[nCurPan][aCurDrive[nCurPan]].Stream))
    AkelPad.Exec(sAppName + ' ' + sAppPar + ' "' + aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File + '"');
  else
  {
    if (IsStreamExists(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File, aCurDir[nCurPan][aCurDrive[nCurPan]].Stream))
      AkelPad.Exec(sAppName + ' ' + sAppPar + ' "' + aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File + ':'  + aCurDir[nCurPan][aCurDrive[nCurPan]].Stream +'"');
    else
      MessageNoStream(aCurDir[nCurPan][aCurDrive[nCurPan]].Stream);
  }
}

function OpenInAvailable(nAppType)
{
  GetCurFile(nCurPan);

  if (nAppType == 4) //open in internally associated
    return (aCurWnd[nCurPan] == 0) &&
           aCurDir[nCurPan][aCurDrive[nCurPan]].File &&
           (! CurFileIsDir(nCurPan)) &&
           (aCurDir[nCurPan][aCurDrive[nCurPan]].File.indexOf(".") >= 0);
  else
    return aCurDir[nCurPan][aCurDrive[nCurPan]].File &&
           (((aCurWnd[nCurPan] == 0) && (! CurFileIsDir(nCurPan))) ||
            ((aCurWnd[nCurPan] == 1) && GetTextLV(aWnd[IDSTREAMLV0 + nCurPan][HWND], GetCurSelLV(aWnd[IDSTREAMLV0 + nCurPan][HWND]), 1)));
}

function GetInternalAssocIndex()
{
  var sExt = aCurDir[nCurPan][aCurDrive[nCurPan]].File.substr(aCurDir[nCurPan][aCurDrive[nCurPan]].File.lastIndexOf(".") + 1);
  var i;

  while (true)
  {
    for (i = 0; i < aIntAssoc.length; ++i)
    {
      if (aIntAssoc[i][0].toUpperCase().indexOf(sExt.toUpperCase()) >= 0)
        return i;
    }

    if (! SetInternalAssoc(-1, 0, sExt))
      break;
  }

  return -1;
}

function Copy(bMove, bOnePan)
{
  var nToPan = (bOnePan) ? nCurPan : Number(! nCurPan);
  var sTo;
  var sPath;
  var sName;
  var sCaption;
  var sFail;

  if (! CopyAvailable(bOnePan))
    return;

  if (aCurWnd[nCurPan] == 0)
  {
    sName = aCurDir[nCurPan][aCurDrive[nCurPan]].File;
    if (CurFileIsDir(nCurPan))
    {
      sCaption = bMove ? sTxtMovDir : sTxtCopDir;
      sTo      = sTxtTo;
      sPath    = aCurDir[nToPan][aCurDrive[nToPan]].Path;
    }
    else
    {
      sCaption = bMove ? sTxtMovFile : sTxtCopFile;
      if (aCurWnd[nToPan] == 0)
      {
        sTo   = sTxtToFile;
        sPath = aCurDir[nToPan][aCurDrive[nToPan]].Path;
      }
      else
      {
        sTo   = sTxtToStream;
        sPath = aCurDir[nToPan][aCurDrive[nToPan]].Path + aCurDir[nToPan][aCurDrive[nToPan]].File + ":";
      }
    }
  }
  else
  {
    sName    = aCurDir[nCurPan][aCurDrive[nCurPan]].Stream;
    sCaption = bMove ? sTxtMovStr : sTxtCopStr;
    if (aCurWnd[nToPan] == 0)
    {
      sTo   = sTxtToFile;
      sPath = aCurDir[nToPan][aCurDrive[nToPan]].Path;
    }
    else
    {
      sTo   = sTxtToStream;
      sPath = aCurDir[nToPan][aCurDrive[nToPan]].Path + aCurDir[nToPan][aCurDrive[nToPan]].File + ":";
    }
  }

  //Move file to its own stream
  if (bMove &&
      (aCurWnd[nCurPan] == 0) &&
      (aCurWnd[nToPan] == 1) &&
      (aCurDir[nCurPan][aCurDrive[nCurPan]].Path == aCurDir[nToPan][aCurDrive[nToPan]].Path) &&
      (aCurDir[nCurPan][aCurDrive[nCurPan]].File == aCurDir[nToPan][aCurDrive[nToPan]].File))
  {
    WarningBox(hWndDlg, sTxtFileToStr, sCaption);
    return;
  }

  sFail = bMove ? sTxtMovFail : sTxtCopFail;
  sName = GetFileName(sCaption, sName + "\n\n" + sTo + "\n\n" + sPath, sName);

  if (sName)
  {
    if (! IsDriveExists(aCurDrive[nCurPan]))
    {
      MessageNoDrive(nCurPan, aCurDrive[nCurPan]);
      return;
    }

    //No source file/dir
    if (! GetFileAttr(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File))
    {
      MessageNoFile(nCurPan, CurFileIsDir(nCurPan));
      return;
    }

    //No source stream
    if ((aCurWnd[nCurPan] == 1) &&
        (! IsStreamExists(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File, aCurDir[nCurPan][aCurDrive[nCurPan]].Stream)))
    {
      MessageNoStream(sName);
      return;
    }

    if (! IsDriveExists(aCurDrive[nToPan]))
    {
      MessageNoDrive(nToPan, aCurDrive[nToPan]);
      return;
    }

    //No parent of target dir
    if (! IsDirExists(aCurDir[nToPan][aCurDrive[nToPan]].Path))
    {
      MessageNoFile(nToPan, 1, 1);
      return;
    }

    //Copy/move to dir/file
    if (aCurWnd[nToPan] == 0)
    {
      //The same dir/file
      if ((aCurWnd[nCurPan] == 0) &&
          (aCurDir[nCurPan][aCurDrive[nCurPan]].Path == sPath) &&
          (aCurDir[nCurPan][aCurDrive[nCurPan]].File == sName))
      {
        if (! bOnePan)
          FillFileList(nToPan, sName, 0, 1);
        return;
      }

      //Directory to its own subdirectory
      if ((aCurWnd[nCurPan] == 0) && CurFileIsDir(nCurPan) &&
          ((aCurDir[nCurPan][aCurDrive[nCurPan]].Path + sName) == sPath.substr(0, (aCurDir[nCurPan][aCurDrive[nCurPan]].Path + sName).length)))
      {
        WarningBox(hWndDlg, sPath + sName + "\n\n" + sTxtDirToSubdir, sCaption);
        return;
      }

      //Target dir/file already exists
      if (GetFileAttr(sPath + sName))
      {
        if (IsDirExists(sPath + sName))
        {
          WarningBox(hWndDlg, sPath + sName + "\n\n" + sTxtDirExists, sCaption);
          FillFileList(nToPan, sName);
          return;
        }

        if ((aCurWnd[nCurPan] == 0) && CurFileIsDir(nCurPan))
        {
          WarningBox(hWndDlg, sPath + sName + "\n\n" + sTxtFileExists, sCaption);
          FillFileList(nToPan, sName, 0, 1);
          return;
        }

        if (! QuestionBox(hWndDlg, sPath + sName + "\n\n" + sTxtWantReplace, sCaption))
        {
          FillFileList(nToPan, sName, 0, 1);
          return;
        }
      }

      ShowWaitWindow(1);

      if (! CopyFile(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File,
                     (aCurWnd[nCurPan] == 0) ? 0 : aCurDir[nCurPan][aCurDrive[nCurPan]].Stream,
                     sPath + sName,
                     0,
                     bMove))
      {
        ShowWaitWindow(0);
        WarningBox(hWndDlg, sName + "\n\n" + sFail, sCaption);
      }

      ShowWaitWindow(0);

      if (GetFileAttr(sPath + sName))
      {
        FillFileList(nToPan, sName, 0, 1);
        if ((! bOnePan) && (bMove || (aCurDir[nCurPan][aCurDrive[nCurPan]].Path == sPath)))
          RefreshPanel(nCurPan);
      }
    }

    //Copy/move to stream
    else if (aCurWnd[nToPan] == 1)
    {
      //The same stream
      if ((aCurWnd[nCurPan] == 1) &&
          (aCurDir[nCurPan][aCurDrive[nCurPan]].Path == aCurDir[nToPan][aCurDrive[nToPan]].Path) &&
          (aCurDir[nCurPan][aCurDrive[nCurPan]].File == aCurDir[nToPan][aCurDrive[nToPan]].File) &&
          (aCurDir[nCurPan][aCurDrive[nCurPan]].Stream == sName))
      {
        if (! bOnePan)
          FillStreamList(nToPan, sName);
        return;
      }

      //No target dir/file
      if (! GetFileAttr(aCurDir[nToPan][aCurDrive[nToPan]].Path + aCurDir[nToPan][aCurDrive[nToPan]].File))
      {
        MessageNoFile(nToPan, CurFileIsDir(nToPan));
        return;
      }

      //Target stream already exists
      if (IsStreamExists(aCurDir[nToPan][aCurDrive[nToPan]].Path + aCurDir[nToPan][aCurDrive[nToPan]].File, sName))
      {
        if (! QuestionBox(hWndDlg, sPath + sName + "\n\n" + sTxtWantReplace, sCaption))
        {
          FillStreamList(nToPan, sName);
          return;
        }
      }

      ShowWaitWindow(1);

      if (CopyFile(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File,
          (aCurWnd[nCurPan] == 0) ? 0 : aCurDir[nCurPan][aCurDrive[nCurPan]].Stream,
          aCurDir[nToPan][aCurDrive[nToPan]].Path + aCurDir[nToPan][aCurDrive[nToPan]].File,
          sName,
          bMove))
      {
        ShowWaitWindow(0);
        FillStreamList(nToPan, sName);

        if (! bOnePan)
        {
          if (bMove && (aCurWnd[nCurPan] == 0))
          {
            RefreshPanel(nCurPan);
            if (aCurDir[nCurPan][aCurDrive[nCurPan]].Path == aCurDir[nToPan][aCurDrive[nToPan]].Path)
              RefreshPanel(nToPan);
          }
          else if (bMove ||
                   ((aCurDir[nCurPan][aCurDrive[nCurPan]].Path == aCurDir[nToPan][aCurDrive[nToPan]].Path) &&
                    (aCurDir[nCurPan][aCurDrive[nCurPan]].File == aCurDir[nToPan][aCurDrive[nToPan]].File)))
            RefreshStreamList(nCurPan);
        }
      }
      else
      {
        ShowWaitWindow(0);
        WarningBox(hWndDlg, sName + "\n\n" + sFail, sCaption);
      }
    }
  }
}

function CopyAvailable(bOnePan)
{
  var nToPan = (bOnePan) ? nCurPan : Number(! nCurPan);

  GetCurFile(nCurPan);
  GetCurFile(nToPan);

  if (bOnePan)
    return aCurDir[nCurPan][aCurDrive[nCurPan]].File &&
           (((aCurWnd[nCurPan] == 0) && (aCurDir[nCurPan][aCurDrive[nCurPan]].File != "..")) ||
            ((aCurWnd[nCurPan] == 1) && aCurDir[nCurPan][aCurDrive[nCurPan]].Stream));

  return ! ((! aCurDir[nCurPan][aCurDrive[nCurPan]].File) ||
            (aCurDir[nCurPan][aCurDrive[nCurPan]].File == "..") ||
            ((aCurWnd[nCurPan] == 0) && (aCurWnd[nToPan] == 1) && CurFileIsDir(nCurPan)) ||
            ((aCurWnd[nCurPan] == 1) && (! aCurDir[nCurPan][aCurDrive[nCurPan]].Stream)) ||
            ((aCurWnd[nToPan]  == 1) && (! IsSupportStreams(aCurDrive[nToPan]))) ||
            ((aCurWnd[nToPan]  == 1) && (! aCurDir[nToPan][aCurDrive[nToPan]].File)) ||
            ((aCurWnd[nToPan]  == 1) && (aCurDir[nToPan][aCurDrive[nToPan]].File == "..")));
}

function Create(bDir)
{
  var nPan2 = Number(! nCurPan);
  var sName;
  var sCaption;

  GetCurFile(nCurPan);
  GetCurFile(nPan2);

  //Create file or directory
  if (aCurWnd[nCurPan] == 0)
  {
    if (bDir)
      sCaption = sTxtCreDir;
    else
      sCaption = sTxtCreFile;

    sName = aCurDir[nCurPan][aCurDrive[nCurPan]].File;
    if (sName == "..")
      sName = "";

    sName = GetFileName(sCaption, sTxtInpName, sName);
    if (sName)
    {
      if (! IsDriveExists(aCurDrive[nCurPan]))
      {
        MessageNoDrive(nCurPan, aCurDrive[nCurPan]);
        return;
      }

      //No parent dir
      if (! IsDirExists(aCurDir[nCurPan][aCurDrive[nCurPan]].Path))
      {
        MessageNoFile(nCurPan, 1, 1);
        return;
      }

      //File or directory already exists
      if (GetFileAttr(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + sName))
      {
        if (IsDirExists(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + sName))
          WarningBox(hWndDlg, sName + "\n\n" + sTxtDirExists, sCaption);
        else
          WarningBox(hWndDlg, sName + "\n\n" + sTxtFileExists, sCaption);

        FillFileList(nCurPan, sName, 0, 1);
      }
      else
      {
        if ((bDir && oSys.Call("Kernel32::CreateDirectoryW", aCurDir[nCurPan][aCurDrive[nCurPan]].Path + sName, 0)) ||
            ((! bDir) && CreateFile(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + sName)))
        {
          FillFileList(nCurPan, sName, 0, 1);
          if (aCurDir[nCurPan][aCurDrive[nCurPan]].Path == aCurDir[nPan2][aCurDrive[nPan2]].Path)
            RefreshPanel(nPan2);
        }
        else
          WarningBox(hWndDlg, sName + "\n\n" + sTxtCreFail, sCaption);
      }
    }
  }

  //Create stream
  else
  {
    if (! CreateStreamAvailable())
      return;

    sName = GetFileName(sTxtCreStr, sTxtInpName, aCurDir[nCurPan][aCurDrive[nCurPan]].Stream);
    if (sName)
    {
      if (! IsDriveExists(aCurDrive[nCurPan]))
      {
        MessageNoDrive(nCurPan, aCurDrive[nCurPan]);
        return;
      }

      if (! GetFileAttr(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File))
      {
        MessageNoFile(nCurPan, CurFileIsDir(nCurPan));
        return;
      }

      if (IsStreamExists(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File, sName))
      {
        WarningBox(hWndDlg, sName + "\n\n" + sTxtStrExists, sTxtCreStr);
        FillStreamList(nCurPan, sName);
      }
      else
      {
        if (CreateFile(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File, sName))
        {
          FillStreamList(nCurPan, sName);
          if ((aCurDir[nCurPan][aCurDrive[nCurPan]].Path == aCurDir[nPan2][aCurDrive[nPan2]].Path) &&
              (aCurDir[nCurPan][aCurDrive[nCurPan]].File == aCurDir[nPan2][aCurDrive[nPan2]].File))
            RefreshStreamList(nPan2);
        }
        else
          WarningBox(hWndDlg, sName + "\n\n" + sTxtCreFail, sTxtCreStr);
      }
    }
  }
}

function CreateStreamAvailable()
{
  GetCurFile(nCurPan);

  return (aCurWnd[nCurPan] == 1) &&
         IsSupportStreams(aCurDrive[nCurPan]) &&
         aCurDir[nCurPan][aCurDrive[nCurPan]].File &&
         (aCurDir[nCurPan][aCurDrive[nCurPan]].File != "..");
}

function Delete(bRecBin)
{
  var nPan2 = Number(! nCurPan);
  var sName;
  var sCaption;

  if (! DeleteAvailable())
    return;

  GetCurFile(nPan2);

  if (aCurWnd[nCurPan] == 0)
  {
    sName = aCurDir[nCurPan][aCurDrive[nCurPan]].File;
    if (CurFileIsDir(nCurPan))
      sCaption = bRecBin ? sTxtDelDirToBin : sTxtDelDir;
    else
      sCaption = bRecBin ? sTxtDelFileToBin : sTxtDelFile;
  }
  else
  {
    sName    = aCurDir[nCurPan][aCurDrive[nCurPan]].Stream;
    sCaption = sTxtDelStr;
  }

  if (QuestionBox(hWndDlg, sName + "\n\n" + sTxtWantDelete, sCaption))
  {
    if (! IsDriveExists(aCurDrive[nCurPan]))
    {
      MessageNoDrive(nCurPan, aCurDrive[nCurPan]);
      return;
    }

    if (! GetFileAttr(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File))
    {
      MessageNoFile(nCurPan, CurFileIsDir(nCurPan));
      return;
    }

    //Delete file or directory
    if (aCurWnd[nCurPan] == 0)
    {
      if (DeleteFile(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + sName, null, bRecBin))
      {
        RefreshPanel(nCurPan);
        if (aCurDir[nCurPan][aCurDrive[nCurPan]].Path == aCurDir[nPan2][aCurDrive[nPan2]].Path)
          RefreshPanel(nPan2);
      }
      else
        WarningBox(hWndDlg, sName + "\n\n" + sTxtDelFail, sCaption);
    }

    //Delete stream
    else
    {
      if (IsStreamExists(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File, sName))
      {
        if (DeleteFile(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File, sName))
        {
          RefreshStreamList(nCurPan);
          if ((aCurDir[nCurPan][aCurDrive[nCurPan]].Path == aCurDir[nPan2][aCurDrive[nPan2]].Path) &&
              (aCurDir[nCurPan][aCurDrive[nCurPan]].File == aCurDir[nPan2][aCurDrive[nPan2]].File))
            RefreshStreamList(nPan2);
        }
        else
          WarningBox(hWndDlg, sName + "\n\n" + sTxtDelFail, sCaption);
      }
      else
        MessageNoStream(sName);
    }
  }
}

function DeleteAvailable()
{
  GetCurFile(nCurPan);

  return aCurDir[nCurPan][aCurDrive[nCurPan]].File &&
         (((aCurWnd[nCurPan] == 0) && (aCurDir[nCurPan][aCurDrive[nCurPan]].File != "..")) ||
          ((aCurWnd[nCurPan] == 1) && aCurDir[nCurPan][aCurDrive[nCurPan]].Stream));
}

function Compare(nAppIndex)
{
  var nPan2    = Number(! nCurPan);
  var sAppName = ExpandFileName((nAppIndex == 1) ? sComparer : sComparer2);
  var sAppPar;
  var sFile1;
  var sFile2;

  if (! CompareAvailable())
    return;

  if (! IsFileExists(sAppName))
  {
    if (SetExternalApp(2, nAppIndex, 1))
      sAppName = ExpandFileName((nAppIndex == 1) ? sComparer : sComparer2);
    else
      return;
  }

  if (! IsDriveExists(aCurDrive[nCurPan]))
  {
    MessageNoDrive(nCurPan, aCurDrive[nCurPan]);
    return;
  }
  if (! IsDriveExists(aCurDrive[nPan2]))
  {
    MessageNoDrive(nPan2, aCurDrive[nPan2]);
    return;
  }

  if (aCurDir[nCurPan][aCurDrive[nCurPan]].File == "..")
    sFile1 = aCurDir[nCurPan][aCurDrive[nCurPan]].Path.slice(0, -1);
  else
    sFile1 = aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File;

  if (! GetFileAttr(sFile1))
  {
    MessageNoFile(nCurPan, CurFileIsDir(nCurPan), (aCurDir[nCurPan][aCurDrive[nCurPan]].File == ".."));
    return;
  }

  if (aCurWnd[nCurPan] == 1)
  {
    if (aCurDir[nCurPan][aCurDrive[nCurPan]].Stream)
    {
      if (IsStreamExists(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File, aCurDir[nCurPan][aCurDrive[nCurPan]].Stream))
        sFile1 = aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File + ":" + aCurDir[nCurPan][aCurDrive[nCurPan]].Stream;
      else
      {
        MessageNoStream(aCurDir[nCurPan][aCurDrive[nCurPan]].Stream);
        return;
      }
    }
  }

  if (aCurDir[nPan2][aCurDrive[nPan2]].File == "..")
    sFile2 = aCurDir[nPan2][aCurDrive[nPan2]].Path.slice(0, -1);
  else
    sFile2 = aCurDir[nPan2][aCurDrive[nPan2]].Path + aCurDir[nPan2][aCurDrive[nPan2]].File;

  if (! GetFileAttr(sFile2))
  {
    MessageNoFile(nPan2, CurFileIsDir(nPan2), (aCurDir[nPan2][aCurDrive[nPan2n]].File == ".."));
    return;
  }

  if (aCurWnd[nPan2] == 1)
  {
    if (aCurDir[nPan2][aCurDrive[nPan2]].Stream)
    {
      if (IsStreamExists(aCurDir[nPan2][aCurDrive[nPan2]].Path + aCurDir[nPan2][aCurDrive[nPan2]].File, aCurDir[nPan2][aCurDrive[nPan2]].Stream))
        sFile2 = aCurDir[nPan2][aCurDrive[nPan2]].Path + aCurDir[nPan2][aCurDrive[nPan2]].File + ":" + aCurDir[nPan2][aCurDrive[nPan2]].Stream;
      else
      {
        MessageNoStream(aCurDir[nPan2][aCurDrive[nPan2]].Stream);
        return;
      }
    }
  }

  sAppPar = (nAppIndex == 1) ? sComparerPar : sComparerPar2;

  AkelPad.Exec(sAppName + ' ' + sAppPar + ' "' + sFile1 + '" "' + sFile2 + '"');
}

function CompareAvailable()
{
  var nPan2 = Number(! nCurPan);

  GetCurFile(nCurPan);
  GetCurFile(nPan2);

  return ! ((! aCurDir[nCurPan][aCurDrive[nCurPan]].File) || (! aCurDir[nPan2][aCurDrive[nPan2]].File) ||
            ((aCurWnd[nCurPan] + aCurWnd[nPan2] == 0) && (CurFileIsDir(nCurPan) != CurFileIsDir(nPan2))) ||
            ((aCurWnd[nCurPan] == 0) && (aCurWnd[nPan2] == 1) && CurFileIsDir(nCurPan)) ||
            ((aCurWnd[nCurPan] == 1) && (aCurWnd[nPan2] == 0) && CurFileIsDir(nPan2)) ||
            ((aCurWnd[nCurPan] == 1) && (! GetTextLV(aWnd[IDSTREAMLV0 + nCurPan][HWND], GetCurSelLV(aWnd[IDSTREAMLV0 + nCurPan][HWND]), 1))) ||
            ((aCurWnd[nPan2] == 1) && (! GetTextLV(aWnd[IDSTREAMLV0 + nPan2][HWND], GetCurSelLV(aWnd[IDSTREAMLV0 + nPan2][HWND]), 1))));
}

function CopyNameToCB(nAction)
{
  var sText;

  GetCurFile(nCurPan);

  if (aCurDir[nCurPan][aCurDrive[nCurPan]].File)
  {
    if (nAction == 1) //File
      sText = aCurDir[nCurPan][aCurDrive[nCurPan]].File;
    else if (nAction == 3) //Path\File
      sText = aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File;
    else if (nAction == 5) //Path\
      sText = aCurDir[nCurPan][aCurDrive[nCurPan]].Path;
    else if (aCurDir[nCurPan][aCurDrive[nCurPan]].Stream)
    {
      if (nAction == 4) //Stream
        sText = aCurDir[nCurPan][aCurDrive[nCurPan]].Stream;
      else if (nAction == 6) //Path\File:Stream
        sText = aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File + ":" + aCurDir[nCurPan][aCurDrive[nCurPan]].Stream;
      else if (nAction == 7) //File:Stream
        sText = aCurDir[nCurPan][aCurDrive[nCurPan]].File + ":" + aCurDir[nCurPan][aCurDrive[nCurPan]].Stream;
    }

    if (sText)
      AkelPad.SetClipboardText(sText);
  }
}

function CopyListToCB(nAction)
{
  var nNameLen = 0;
  var nTimeLen = 0;
  var nFirst   = 0;
  var sText;
  var i;

  GetCurFile(nCurPan);

  if (aCurDir[nCurPan][aCurDrive[nCurPan]].File)
  {
    //Files
    if (nAction == 0)
    {
      if (GetTextLV(aWnd[IDFILELV0 + nCurPan][HWND], 0, 0) == "..")
        nFirst = 1;

      if ((bColSize) || (bColTime) || (bColAttr))
      {
        for (i = nFirst; i < GetItemCountLV(aWnd[IDFILELV0 + nCurPan][HWND]); ++i)
        {
          if (nNameLen < GetTextLV(aWnd[IDFILELV0 + nCurPan][HWND], i, 0).length)
            nNameLen = GetTextLV(aWnd[IDFILELV0 + nCurPan][HWND], i, 0).length;
          if (nTimeLen < GetTextLV(aWnd[IDFILELV0 + nCurPan][HWND], i, 2).length)
            nTimeLen = GetTextLV(aWnd[IDFILELV0 + nCurPan][HWND], i, 2).length;
        }
      }

      if (nFirst < GetItemCountLV(aWnd[IDFILELV0 + nCurPan][HWND]))
        sText = aCurDir[nCurPan][aCurDrive[nCurPan]].Path + "\n";

      for (i = nFirst; i < GetItemCountLV(aWnd[IDFILELV0 + nCurPan][HWND]); ++i)
      {
        sText += Pad(GetTextLV(aWnd[IDFILELV0 + nCurPan][HWND], i, 0), nNameLen);
        if (bColSize)
          sText += Pad(GetTextLV(aWnd[IDFILELV0 + nCurPan][HWND], i, 1), 15, "L");
        if (bColTime)
          sText += Pad(GetTextLV(aWnd[IDFILELV0 + nCurPan][HWND], i, 2), nTimeLen + 3, "L");
        if (bColAttr)
          sText += Pad(GetTextLV(aWnd[IDFILELV0 + nCurPan][HWND], i, 3), 7, "L");
        sText += "\n";
      }
    }

    //Steams
    else if (IsSupportStreams(aCurDrive[nCurPan]) && (aCurDir[nCurPan][aCurDrive[nCurPan]].File != "..") &&
             ((! CurFileIsDir(nCurPan)) || aCurDir[nCurPan][aCurDrive[nCurPan]].Stream))
    {
      if (bColSize)
      {
        for (i = 0; i < GetItemCountLV(aWnd[IDSTREAMLV0 + nCurPan][HWND]); ++i)
        {
          if (nNameLen < GetTextLV(aWnd[IDSTREAMLV0 + nCurPan][HWND], i, 0).length)
            nNameLen = GetTextLV(aWnd[IDSTREAMLV0 + nCurPan][HWND], i, 0).length;
        }
      }

      sText = aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File + ":" + "\n";

      for (i = 0; i < GetItemCountLV(aWnd[IDSTREAMLV0 + nCurPan][HWND]); ++i)
      {
        sText += Pad(GetTextLV(aWnd[IDSTREAMLV0 + nCurPan][HWND], i, 0), nNameLen);
        if (bColSize)
          sText += Pad(GetTextLV(aWnd[IDSTREAMLV0 + nCurPan][HWND], i, 1), 15, "L");
        sText += "\n";
      }
    }

    if (sText)
      AkelPad.SetClipboardText(sText);
  }
}

function Pad(sString, nLen, sType, sChar)
{
  var i = 0;

  if (! sType) sType = "R";
  if (! sChar) sChar = " ";

  if (sType == "R")
  {
    while (sString.length < nLen)
      sString += sChar;
  }
  else if (sType == "L")
  {
    while (sString.length < nLen)
      sString = sChar + sString;
  }

  return sString;
}

function Properties()
{
  var sFile;

  if (! PropertiesAvailable())
    return;

  if (! IsDriveExists(aCurDrive[nCurPan]))
  {
    MessageNoDrive(nCurPan, aCurDrive[nCurPan]);
    return;
  }

  if (aCurDir[nCurPan][aCurDrive[nCurPan]].File == "..")
    sFile = aCurDir[nCurPan][aCurDrive[nCurPan]].Path.slice(0, -1);
  else
    sFile = aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File;

  if (! GetFileAttr(sFile))
  {
    MessageNoFile(nCurPan, CurFileIsDir(nCurPan), (aCurDir[nCurPan][aCurDrive[nCurPan]].File == ".."));
    return;
  }

  if (! FilePropertiesDialog(sFile, hWndDlg))
    WarningBox(hWndDlg, sTxtNoFileProp, sScriptName);
}

function PropertiesAvailable()
{
  GetCurFile(nCurPan);

  return Boolean(aCurDir[nCurPan][aCurDrive[nCurPan]].File);
}

function FavoriteFolders(nPan)
{
  var MF_STRING    = 0x0000;
  var MF_GRAYED    = 0x0001;
  var MF_CHECKED   = 0x0008;
  var MF_POPUP     = 0x0010;
  var MF_SEPARATOR = 0x0800;
  var hMenu01 = oSys.Call("User32::CreatePopupMenu");
  var hMenu03 = oSys.Call("User32::CreatePopupMenu");
  var hMenu04 = oSys.Call("User32::CreatePopupMenu");
  var hMenu   = oSys.Call("User32::CreatePopupMenu");
  var oRect   = {};
  var bSet    = true;
  var nSel    = -1;
  var nFlag;
  var i;

  for (i = 0; i < aFavoriteFolder.length; ++i)
  {
    if (ExpandFileName(aFavoriteFolder[i][1]).toUpperCase() == aCurDir[nPan][aCurDrive[nPan]].Path.toUpperCase())
    {
      nFlag = MF_CHECKED;
      nSel  = i;
    }
    else
      nFlag = MF_STRING;

    oSys.Call("User32::AppendMenuW", hMenu01, nFlag, 0x0101 + i, aFavoriteFolder[i][0]);
    oSys.Call("User32::AppendMenuW", hMenu03, nFlag, 0x0301 + i, aFavoriteFolder[i][0]);
    oSys.Call("User32::AppendMenuW", hMenu04, nFlag, 0x0401 + i, aFavoriteFolder[i][0]);
  }

  oSys.Call("User32::AppendMenuW", hMenu, aFavoriteFolder.length ? MF_POPUP : MF_GRAYED, hMenu01, sTxtGoToFavFold);
  oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu, (aFavoriteFolder.length < 0xFF) ? MF_STRING : MF_GRAYED, 0x0200, sTxtAddFavorite);
  oSys.Call("User32::AppendMenuW", hMenu, aFavoriteFolder.length ? MF_POPUP : MF_GRAYED, hMenu03, sTxtModFavorite);
  oSys.Call("User32::AppendMenuW", hMenu, aFavoriteFolder.length ? MF_POPUP : MF_GRAYED, hMenu04, sTxtDelFavorite);
  oSys.Call("User32::AppendMenuW", hMenu, aFavoriteFolder.length ? MF_STRING : MF_GRAYED, 0x0500, sTxtCleFavorite);

  GetWindowPos(aWnd[IDFAVFOLDB0 + nPan][HWND], oRect);

  nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, 0x0180 /*TPM_NONOTIFY|TPM_RETURNCMD*/, oRect.X + oRect.W, oRect.Y, 0, hWndDlg, 0);

  oSys.Call("User32::DestroyMenu", hMenu01);
  oSys.Call("User32::DestroyMenu", hMenu03);
  oSys.Call("User32::DestroyMenu", hMenu04);
  oSys.Call("User32::DestroyMenu", hMenu);

  if ((nCmd >= 0x0101) && (nCmd <= 0x01FF))
  {
    if (nCmd - 0x0101 != nSel)
    {
      if (! IsDirExists(ExpandFileName(aFavoriteFolder[nCmd - 0x0101][1])))
        bSet = SetFavoriteFolder(nPan, nCmd - 0x0101, 1);
      if (bSet)
        ChangeDir(nPan, aFavoriteFolder[nCmd - 0x0101][1]);
    }
  }
  else if (nCmd == 0x0200)
    SetFavoriteFolder(nPan, -1); //add favorite
  else if ((nCmd >= 0x0301) && (nCmd <= 0x03FF))
    SetFavoriteFolder(nPan, nCmd - 0x0301); //modify favorite
  else if ((nCmd >= 0x0401) && (nCmd <= 0x04FF))
    RemoveFavoriteFolder(nCmd - 0x0401);
  else if (nCmd == 0x0500)
  {
    if (QuestionBox(hWndDlg, sTxtWantCleFavFo, sTxtDirectory + ": " + sTxtCleFavorite, 1))
      aFavoriteFolder = [];
  }
}

function SetFavoriteFolder(nPan, nIndex, nFocus)
{
  var bSet     = false;
  var sCaption = sTxtDirectory + ": ";
  var aDir     = new Array(2);

  if (nIndex < 0) //add favorite
  {
    sCaption += sTxtAddFavorite;
    aDir[1]   = aCurDir[nPan][aCurDrive[nPan]].Path;
    aDir[0]   = aDir[1].slice(0, -1);
    aDir[0]   = ((aDir[0].length > 2) ? aDir[0].substr(0, 2) : "") + aDir[0].substr(aDir[0].lastIndexOf("\\") + 1);
  }
  else //modify favorite
  {
    sCaption += sTxtModFavorite;
    aDir      = aFavoriteFolder[nIndex];
  }

  aDir = InputBox(hWndDlg, sCaption, [sTxtDispName + ":", sTxtPath + " (%a - " + sTxtAkelDir + ", %WinDir% - " + sTxtEnvVar + "):"], aDir, nFocus, "CheckInputPath", nIndex);

  if (aDir)
  {
    if (aDir[1].slice(-1) != "\\")
      aDir[1] += "\\";

    if (nIndex < 0)
      aFavoriteFolder.push([aDir[0], aDir[1]]);
    else
      aFavoriteFolder[nIndex] = [aDir[0], aDir[1]];

    aFavoriteFolder.sort(
      function(aA, aB)
      {
        return oSys.Call("Kernel32::lstrcmpiW", aA[0], aB[0]);
      });

    bSet = true;
  }

  return bSet;
}

function CheckInputPath(hWnd, aDir, nIndex)
{
  var sPath;

  if (! aDir[0])
  {
    WarningBox(hWnd, sTxtMustSpecify + ": " + sTxtDispName, sScriptName);
    return 0;
  }

  if (IsNameInArray(aFavoriteFolder, aDir[0], nIndex))
  {
    WarningBox(hWnd, aDir[0] + "\n\n" + sTxtNameExists, sScriptName);
    return 0;
  }

  if (! aDir[1])
  {
    WarningBox(hWnd, sTxtMustSpecify + ": " + sTxtPath, sScriptName);
    return 1;
  }

  sPath = ExpandFileName(aDir[1] + ((aDir[1].slice(-1) != "\\") ? "\\" : ""));
  if (! IsDirExists(sPath))
  {
    WarningBox(hWnd, sPath + "\n\n" + sTxtDirNoExists, sScriptName);
    return 1;
  }

  return -1;
}

function IsNameInArray(aArray, sName, nIndex)
{
  for (var i = 0; i < aArray.length; ++i)
  {
    if ((aArray[i][0] == sName) && (i != nIndex))
      return true;
  }

  return false;
}

function RemoveFavoriteFolder(nIndex)
{
  if (QuestionBox(hWndDlg, aFavoriteFolder[nIndex][0] + "\n" + aFavoriteFolder[nIndex][1] + "\n\n" + sTxtWantDelFav, sTxtDirectory + ": " + sTxtDelFavorite))
    aFavoriteFolder.splice(nIndex, 1);
}

function SpecialFolders(nPan)
{
  var aFolder = [];
  var oRect   = {};
  var hMenu   = oSys.Call("User32::CreatePopupMenu");
  var nSel    = -1;
  var nFlag;
  var nCmd;
  var i;

  for (i = 0; i < 63; ++i)
  {
    if (oSys.Call("Shell32::SHGetSpecialFolderPathW", 0, lpBuffer, i, 0))
      aFolder.push(AkelPad.MemRead(lpBuffer, _TSTR) + "\\");
  }

  aFolder.sort(function(sA, sB)
               {
                 return oSys.Call("Kernel32::lstrcmpiW", sA, sB);
               } );

  for (i = 0; i < aFolder.length; ++i)
  {
    if ((i == 0) || (aFolder[i] != aFolder[i - 1]))
    {
      if (aFolder[i].toUpperCase() == aCurDir[nPan][aCurDrive[nPan]].Path.toUpperCase())
      {
        nFlag = 0x0008; //MF_CHECKED
        nSel  = i;
      }
      else
        nFlag = 0x0000; //MF_STRING

      oSys.Call("User32::AppendMenuW", hMenu, nFlag, i + 1, aFolder[i]);
    }
  }

  GetWindowPos(aWnd[IDSPECFOLDB0 + nPan][HWND], oRect);
  nFlag = 0x0180; //TPM_RETURNCMD|TPM_NONOTIFY

  if (nPan == 0)
    oRect.X += oRect.W;
  else
    nFlag |= 0x0008; //TPM_RIGHTALIGN

  nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, nFlag, oRect.X, oRect.Y, 0, hWndDlg, 0);
  oSys.Call("User32::DestroyMenu", hMenu);

  if (nCmd && (--nCmd != nSel))
  {
    if (IsDirExists(aFolder[nCmd]))
      ChangeDir(nPan, aFolder[nCmd]);
    else
      WarningBox(hWndDlg, aFolder[nCmd] + "\n\n" + sTxtDirNoExists, sScriptName);
  }
}

function History(nPan)
{
  var MF_STRING    = 0x0000;
  var MF_GRAYED    = 0x0001;
  var MF_CHECKED   = 0x0008;
  var MF_SEPARATOR = 0x0800;
  var hMenu = oSys.Call("User32::CreatePopupMenu");
  var nFlag = 0x0180; //TPM_RETURNCMD|TPM_NONOTIFY
  var oRect = {};
  var i;

  GetWindowPos(aWnd[IDHISTORYB0 + nPan][HWND], oRect);

  if (nPan == 0)
    oRect.X += oRect.W;
  else
    nFlag |= 0x0008; //TPM_RIGHTALIGN

  for (i = aHistory[nPan].length - 1; i >= 0; --i)
  {
    if ((i != aCurHist[nPan]) && (! IsDirExists(aHistory[nPan][i][0])))
    {
      aHistory[nPan].splice(i, 1);
      if (i < aCurHist[nPan])
        --aCurHist[nPan];
    }
  }

  for (i = 0; i < aHistory[nPan].length; ++i)
    oSys.Call("User32::AppendMenuW", hMenu, (i == aCurHist[nPan]) ? MF_CHECKED : MF_STRING, i + 1, aHistory[nPan][i][0]);

  oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu, (aHistory.length > 1) ? MF_STRING : MF_GRAYED, nHistMax + 1, sTxtCleHistory);
  oSys.Call("User32::AppendMenuW", hMenu, bSaveHist ? MF_CHECKED : MF_STRING, nHistMax + 2, sTxtSaveHistory);

  nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, nFlag, oRect.X, oRect.Y, 0, hWndDlg, 0);
  oSys.Call("User32::DestroyMenu", hMenu);

  if ((nCmd > 0) && (nCmd <= nHistMax))
  {
    if (--nCmd != aCurHist[nPan])
    {
      if (IsDirExists(aHistory[nPan][nCmd][0]))
        ChangeDirFromHistory(nPan, nCmd);
      else
        WarningBox(hWndDlg, aHistory[nPan][nCmd][0] + "\n\n" + sTxtDirNoExists, sScriptName);
    }
  }
  else if (nCmd == nHistMax + 1)
  {
    aCurHist[nPan] = 0;
    aHistory[nPan] = [[aCurDir[nPan][aCurDrive[nPan]].Path, "", ""]];
  }
  else if (nCmd == nHistMax + 2)
    bSaveHist = ! bSaveHist;
}

Last edited by KDJ on Wed Jan 07, 2015 8:09 pm, edited 18 times in total.

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

Post by KDJ »

Manager of files and NTFS streams - Part Four.
Language files - see next post.

Code: Select all

function CheckHistory()
{
  for (var i = 0; i <= 1; ++i)
  {
    if (aHistory[i].length)
    {
      if (aCurHist[i] >= aHistory[i].length)
        aCurHist[i] = aHistory[i].length - 1;

      if (aHistory[i][aCurHist[i]][0] != aCurDir[i][aCurDrive[i]].Path)
      {
        aHistory[i].push([aCurDir[i][aCurDrive[i]].Path, "", ""]);
        aCurHist[i] = aHistory[i].length - 1;
      }

      if (aHistory[i].length > nHistMax)
      {
        if (aCurHist[i] < nHistMax)
          aHistory[i].length = nHistMax;
        else
        {
          aHistory[i].length = aCurHist[i] + 1;
          aHistory[i].splice(0, aCurHist[i] + 1 - nHistMax);
          aCurHist[i] = nHistMax - 1;
        }
      }
    }
    else
    {
      aCurHist[i] = 0;
      aHistory[i] = [[aCurDir[i][aCurDrive[i]].Path, "", ""]];
    }
  }
}

function AddHistory(nPan, sPath)
{
  aHistory[nPan].length = aCurHist[nPan] + 1;
  aHistory[nPan].push([sPath, "", ""]);

  if (aHistory[nPan].length > nHistMax)
    aHistory[nPan].shift();

  aCurHist[nPan] = aHistory[nPan].length - 1;
}

function SetInternalAssoc(nIndex, nFocus, sExt)
{
  var bSet     = false;
  var sCaption;
  var aAssoc;

  if (nIndex < 0) //add association
  {
    GetCurFile(nCurPan);
    sCaption = sTxtAddAssoc;
    aAssoc   = [sExt, aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File, ""];
  }
  else //modify association
  {
    sCaption = sTxtModAssoc;
    aAssoc   = aIntAssoc[nIndex];
  }

  aAssoc = InputBox(hWndDlg, sCaption, [sTxtFileExtSep + ":", sTxtFullName + " (%a - " + sTxtAkelDir + ", %WinDir% - " + sTxtEnvVar + "):", sTxtAddPar], aAssoc, nFocus, "CheckInputInternalAssoc", nIndex);

  if (aAssoc)
  {
    aAssoc[0] = DelRedundantChars(aAssoc[0]).split(",");

    aAssoc[0].sort(
      function(sA, sB)
      {
        return oSys.Call("Kernel32::lstrcmpiW", sA, sB);
      });

    aAssoc[0] = aAssoc[0].join();

    if (nIndex < 0)
      aIntAssoc.push([aAssoc[0], aAssoc[1], aAssoc[2]]);
    else
      aIntAssoc[nIndex] = [aAssoc[0], aAssoc[1], aAssoc[2]];

    aIntAssoc.sort(
      function(aA, aB)
      {
        return oSys.Call("Kernel32::lstrcmpiW", aA[0], aB[0]);
      });

    bSet = true;
  }

  return bSet;
}

function DelRedundantChars(sText)
{
  sText = sText.replace(/^[,\s]+|\s+|[,\s]+$/, "");
  return sText.replace(/,+/, ",");
}

function CheckInputInternalAssoc(hWnd, aAssoc, nIndex)
{
  var sAppName;

  aAssoc[0] = DelRedundantChars(aAssoc[0]);

  if (! aAssoc[0])
  {
    WarningBox(hWnd, sTxtMustSpecify + ": " + sTxtFileExtSep, sScriptName);
    return 0;
  }

  if ((typeof nIndex == "number") && (IsInternalAssocExists(hWnd, aAssoc[0], nIndex)))
    return 0;

  if (! aAssoc[1])
  {
    WarningBox(hWnd, sTxtMustSpecify + ": " + sTxtFullName, sScriptName);
    return 1;
  }

  sAppName = ExpandFileName(aAssoc[1]);
  if (! IsFileExists(sAppName))
  {
    WarningBox(hWnd, sAppName + "\n\n" + sTxtFileNoExists, sScriptName);
    return 1;
  }

  return -1;
}

function IsInternalAssocExists(hWnd, sText, nIndex)
{
  var aExt = sText.split(",");
  var i, n;

  for (i = 0; i < aExt.length; ++i)
  {
    for (n = 0; n < aIntAssoc.length; ++n)
    {
      if ((aIntAssoc[n][0].toUpperCase().indexOf(aExt[i].toUpperCase()) >= 0) && (n != nIndex))
      {
        WarningBox(hWnd, aExt[i] + "\n\n" + sTxtAssocExists, sScriptName);
        return true;
      }
    }
  }

  return false;
}

function RemoveInternalAssoc(nIndex)
{
  if (QuestionBox(hWndDlg, aIntAssoc[nIndex][0] + "\n" + aIntAssoc[nIndex][1] + "\n\n" + sTxtWantDelAssoc, sTxtDelAssoc))
    aIntAssoc.splice(nIndex, 1);
}

function SetExternalApp(nAppType, nAppIndex, nFocus)
{
  var bSet = false;
  var sCaption;
  var aApp;

  if (nAppType == 0)
  {
    sCaption = sTxtSetViewer + " " + nAppIndex;
    aApp     = (nAppIndex == 1) ? [sViewerName, sViewer, sViewerPar] : [sViewerName2, sViewer2, sViewerPar2];
  }
  else if (nAppType == 1)
  {
    sCaption = sTxtSetEditor + " " + nAppIndex;
    aApp     = (nAppIndex == 1) ? [sEditorName, sEditor, sEditorPar] : [sEditorName2, sEditor2, sEditorPar2];
  }
  else if (nAppType == 2)
  {
    sCaption = sTxtSetComparer + " " + nAppIndex;
    aApp     = (nAppIndex == 1) ? [sComparerName, sComparer, sComparerPar] : [sComparerName2, sComparer2, sComparerPar2];
  }
  else
  {
    if (nAppIndex < 0) //add favorite
    {
      sCaption = sTxtApplications + ": " + sTxtAddFavorite;
      aApp     = ["", "", ""];
    }
    else //modify favorite
    {
      sCaption = sTxtApplications + ": " + sTxtModFavorite;
      aApp     = aFavorite[nAppIndex];
    }
  }

  if (! aApp[1])
    GetNewExternalApp(aApp);

  aApp = InputBox(hWndDlg, sCaption, [sTxtDispName + ":", sTxtFullName + " (%a - " + sTxtAkelDir + ", %WinDir% - " + sTxtEnvVar + "):", sTxtAddPar], aApp, nFocus, "CheckInputExternalApp", (nAppType == 3) ? nAppIndex : undefined);

  if (aApp)
  {
    if (nAppType == 0)
    {
      if (nAppIndex == 1)
      {
        sViewerName = aApp[0];
        sViewer     = aApp[1];
        sViewerPar  = aApp[2];
      }
      else
      {
        sViewerName2 = aApp[0];
        sViewer2     = aApp[1];
        sViewerPar2  = aApp[2];
      }
    }
    else if (nAppType == 1)
    {
      if (nAppIndex == 1)
      {
        sEditorName = aApp[0];
        sEditor     = aApp[1];
        sEditorPar  = aApp[2];
      }
      else
      {
        sEditorName2 = aApp[0];
        sEditor2     = aApp[1];
        sEditorPar2  = aApp[2];
      }
    }
    else if (nAppType == 2)
    {
      if (nAppIndex == 1)
      {
        sComparerName = aApp[0];
        sComparer     = aApp[1];
        sComparerPar  = aApp[2];
      }
      else
      {
        sComparerName2 = aApp[0];
        sComparer2     = aApp[1];
        sComparerPar2  = aApp[2];
      }
    }
    else
    {
      if (nAppIndex < 0)
        aFavorite.push([aApp[0], aApp[1], aApp[2]]);
      else
        aFavorite[nAppIndex] = [aApp[0], aApp[1], aApp[2]];

      aFavorite.sort(
        function(aA, aB)
        {
          return oSys.Call("Kernel32::lstrcmpiW", aA[0], aB[0]);
        });
    }

    bSet = true;
  }

  return bSet;
}

function GetNewExternalApp(aApp)
{
  GetCurFile(nCurPan);

  if (aCurDir[nCurPan][aCurDrive[nCurPan]].File && (! CurFileIsDir(nCurPan)))
  {
    if (aCurDir[nCurPan][aCurDrive[nCurPan]].File.indexOf(".") >= 0)
      aApp[0] = aCurDir[nCurPan][aCurDrive[nCurPan]].File.substr(0, aCurDir[nCurPan][aCurDrive[nCurPan]].File.lastIndexOf("."));
    else
      aApp[0] = aCurDir[nCurPan][aCurDrive[nCurPan]].File;

    aApp[1] = aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File;
  }
}

function CheckInputExternalApp(hWnd, aApp, nIndex)
{
  var sAppName;

  if (! aApp[0])
  {
    WarningBox(hWnd, sTxtMustSpecify + ": " + sTxtDispName, sScriptName);
    return 0;
  }

  if ((typeof nIndex == "number") && (IsNameInArray(aFavorite, aApp[0], nIndex)))
  {
    WarningBox(hWnd, aApp[0] + "\n\n" + sTxtNameExists, sScriptName);
    return 0;
  }

  if (! aApp[1])
  {
    WarningBox(hWnd, sTxtMustSpecify + ": " + sTxtFullName, sScriptName);
    return 1;
  }

  sAppName = ExpandFileName(aApp[1]);
  if (! IsFileExists(sAppName))
  {
    WarningBox(hWnd, sAppName + "\n\n" + sTxtFileNoExists, sScriptName);
    return 1;
  }

  return -1;
}

function RemoveFavoriteApp(nIndex)
{
  if (QuestionBox(hWndDlg, aFavorite[nIndex][0] + "\n" + aFavorite[nIndex][1] + "\n\n" + sTxtWantDelFav, sTxtApplications + ": " + sTxtDelFavorite))
    aFavorite.splice(nIndex, 1);
}

function RunFavoriteApp(nAppIndex)
{
  var sAppName = ExpandFileName(aFavorite[nAppIndex][1]);

  if (! IsFileExists(sAppName))
  {
    if (SetExternalApp(3, nAppIndex, 1))
      sAppName = ExpandFileName(aFavorite[nAppIndex][1]);
    else
      return;
  }

  AkelPad.Exec(sAppName + ' ' + aFavorite[nAppIndex][2]);
}

function RunAkelScript(bArg)
{
  var sScriptsDir = AkelPad.GetAkelDir(5 /*ADTYPE_SCRIPTS*/);
  var sArgument   = "";
  var sExtension;
  var sScript;
  var nLevel;
  var i;

  GetCurFile(nCurPan);
  sExtension = aCurDir[nCurPan][aCurDrive[nCurPan]].File.substr(aCurDir[nCurPan][aCurDrive[nCurPan]].File.lastIndexOf(".") + 1).toUpperCase();

  if ((! aCurDir[nCurPan][aCurDrive[nCurPan]].File) ||
      (CurFileIsDir(nCurPan)) ||
      ((sExtension != "JS") && (sExtension != "VBS")))
  {
    WarningBox(hWndDlg, sTxtJsVbsOnly, sTxtRunScript);
    return;
  }

  if (aCurDrive[nCurPan] != sScriptsDir.substr(0, 2))
  {
    WarningBox(hWndDlg, sTxtNoRunScript, sTxtRunScript);
    return;
  }

  if (bArg)
  {
    if (aCurDir[nCurPan][aCurDrive[nCurPan]].File in oScrArg)
      sArgument = oScrArg[aCurDir[nCurPan][aCurDrive[nCurPan]].File];

    sArgument = InputBox(hWndDlg, sTxtRunScript, aCurDir[nCurPan][aCurDrive[nCurPan]].File + "\n\n" + sTxtInpArgs, sArgument);

    if (sArgument == undefined)
      return;
    else if (sArgument)
      oScrArg[aCurDir[nCurPan][aCurDrive[nCurPan]].File] = sArgument;
  }

  if (! IsDriveExists(aCurDrive[nCurPan]))
  {
    MessageNoDrive(nCurPan, aCurDrive[nCurPan]);
    return;
  }

  //No parent dir
  if (! IsDirExists(aCurDir[nCurPan][aCurDrive[nCurPan]].Path))
  {
    MessageNoFile(nCurPan, 1, 1);
    return;
  }

  if (IsFileExists(aCurDir[nCurPan][aCurDrive[nCurPan]].Path + aCurDir[nCurPan][aCurDrive[nCurPan]].File))
  {
    if ((sScriptsDir + "\\").toUpperCase() == aCurDir[nCurPan][aCurDrive[nCurPan]].Path.toUpperCase())
     sScript = aCurDir[nCurPan][aCurDrive[nCurPan]].File;
    else
    {
      nLevel      = sScriptsDir.match(/\\/g).length;
      sScriptsDir = "";

      for (i = 0; i < nLevel; ++i)
        sScriptsDir += "..\\";

      sScript = sScriptsDir + aCurDir[nCurPan][aCurDrive[nCurPan]].Path.substr(3) + aCurDir[nCurPan][aCurDrive[nCurPan]].File;
    }

    AkelPad.Call("Scripts::Main", 1, sScript, sArgument);
  }
  else
    MessageNoFile(nCurPan);
}

function GetFileName(sCaption, sLabel, sName)
{
  return InputBox(hWndDlg, sCaption, sLabel, sName, null, "CheckInputFileName");
}

function CheckInputFileName(hWnd, aFile)
{
  var nIndex;

  if (aFile[0])
  {
    if (/^(CON|PRN|AUX|NUL|COM1|COM2|COM3|COM4|COM5|COM6|COM7|COM8|COM9|LPT1|LPT2|LPT3|LPT4|LPT5|LPT6|LPT7|LPT8|LPT9)$/i.test(aFile[0]))
    {
      WarningBox(hWndDlg, aFile[0] + "\n\n" + sTxtBadName, sScriptName);
      return 0;
    }

    else
    {
      nIndex = aFile[0].search(/[<>:"/\\|?*]/);
      if (nIndex >= 0)
      {
        WarningBox(hWndDlg, aFile[0] + "\n\n" + sTxtBadChar + ": " + aFile[0].substr(nIndex, 1), sScriptName);
        return 0;
      }
    }
  }

  return -1;
}

function MessageNoDrive(nPan, sDrive)
{
  WarningBox(hWndDlg, sDrive + "\n\n" + sTxtNoDrive, sScriptName);
  oSys.Call("User32::SetFocus", aWnd[IDDRIVECB0 + nPan][HWND]);
}

function MessageNoFile(nPan, bDir, bParentDir)
{
  var nSelPos = GetCurSelLV(aWnd[IDFILELV0 + nPan][HWND]);
  var sMessage;
  var sFile;
  var sSelFile;

  if (bDir)
  {
    sMessage = sTxtNoDirRefr;
    if (bParentDir)
      sFile = "";
    else
      sFile = aCurDir[nPan][aCurDrive[nPan]].File + "\\";
  }
  else
  {
    sMessage = sTxtNoFileRefr;
    sFile    = aCurDir[nPan][aCurDrive[nPan]].File;
  }

  WarningBox(hWndDlg, aCurDir[nPan][aCurDrive[nPan]].Path + sFile + "\n\n" + sMessage, sScriptName);

  while ((aCurDir[nPan][aCurDrive[nPan]].Path.length > 3) &&
         (! IsDirExists(aCurDir[nPan][aCurDrive[nPan]].Path)))
  {
    aCurDir[nCurPan][aCurDrive[nCurPan]].Path = aCurDir[nCurPan][aCurDrive[nCurPan]].Path.slice(0, -1);
    sSelFile = aCurDir[nCurPan][aCurDrive[nCurPan]].Path.substr(aCurDir[nCurPan][aCurDrive[nCurPan]].Path.lastIndexOf("\\") + 1);
    aCurDir[nCurPan][aCurDrive[nCurPan]].Path = aCurDir[nCurPan][aCurDrive[nCurPan]].Path.substr(0, aCurDir[nCurPan][aCurDrive[nCurPan]].Path.lastIndexOf("\\") + 1);
  }

  SetWndText(aWnd[IDDIRS0 + nPan][HWND], aCurDir[nPan][aCurDrive[nPan]].Path);
  FillFileList(nPan, sSelFile, nSelPos);
  FillStreamList(nPan);
}

function MessageNoStream(sName)
{
  var nPan2 = Number(! nCurPan);

  WarningBox(hWndDlg, sName + "\n\n" + sTxtNoStreamRefr, sScriptName);
  RefreshStreamList(nCurPan);

  if ((aCurDir[nCurPan][aCurDrive[nCurPan]].Path == aCurDir[nPan2][aCurDrive[nPan2]].Path) &&
      (aCurDir[nCurPan][aCurDrive[nCurPan]].File == aCurDir[nPan2][aCurDrive[nPan2]].File))
    RefreshStreamList(nPan2);
}

function WarningBox(hWnd, sText, sCaption)
{
  AkelPad.MessageBox(hWnd, sText, sCaption, 0x00000030 /*MB_ICONWARNING*/);
}

function QuestionBox(hWnd, sText, sCaption, nDefButton)
{
  var nType = (nDefButton << 8) | 0x23 /*MB_ICONQUESTION|MB_YESNOCANCEL*/;

  return (AkelPad.MessageBox(hWnd, sText, sCaption, nType) == 6 /*IDYES*/);
}

function MainMenu()
{
  var MF_STRING    = 0x0000;
  var MF_GRAYED    = 0x0001;
  var MF_CHECKED   = 0x0008;
  var MF_POPUP     = 0x0010;
  var MF_SEPARATOR = 0x0800;
  var hMenu0102 = oSys.Call("User32::CreatePopupMenu");
  var hMenu0103 = oSys.Call("User32::CreatePopupMenu");
  var hMenu0105 = oSys.Call("User32::CreatePopupMenu");
  var hMenu01   = oSys.Call("User32::CreatePopupMenu");
  var hMenu02   = oSys.Call("User32::CreatePopupMenu");
  var hMenu03   = oSys.Call("User32::CreatePopupMenu");
  var hMenu04   = oSys.Call("User32::CreatePopupMenu");
  var hMenu0504 = oSys.Call("User32::CreatePopupMenu");
  var hMenu05   = oSys.Call("User32::CreatePopupMenu");
  var hMenu06   = oSys.Call("User32::CreatePopupMenu");
  var hMenu07   = oSys.Call("User32::CreatePopupMenu");
  var hMenu0708 = oSys.Call("User32::CreatePopupMenu");
  var hMenu0709 = oSys.Call("User32::CreatePopupMenu");
  var hMenu0801 = oSys.Call("User32::CreatePopupMenu");
  var hMenu0802 = oSys.Call("User32::CreatePopupMenu");
  var hMenu08   = oSys.Call("User32::CreatePopupMenu");
  var hMenu     = oSys.Call("User32::CreatePopupMenu");
  var oRect     = {};
  var nCmd;
  var i;

  //File
  for (i = 0; i < aIntAssoc.length; ++i)
  {
    oSys.Call("User32::AppendMenuW", hMenu0102, MF_STRING, 0x010201 + i, aIntAssoc[i][0]);
    oSys.Call("User32::AppendMenuW", hMenu0103, MF_STRING, 0x010301 + i, aIntAssoc[i][0]);
  }
  oSys.Call("User32::AppendMenuW", hMenu0105, MF_STRING, 0x010501, sTxtFile + "\tCtrl+Ins");
  oSys.Call("User32::AppendMenuW", hMenu0105, MF_STRING, 0x010502, sTxtPath + "\\" + sTxtFile + "\tCtrl+Shift+Ins");
  oSys.Call("User32::AppendMenuW", hMenu0105, MF_STRING, 0x010503, sTxtPath + "\tCtrl+Atl+Ins");
  oSys.Call("User32::AppendMenuW", hMenu0105, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu0105, MF_STRING, 0x010504, sTxtStream + "\tAlt+Ins");
  oSys.Call("User32::AppendMenuW", hMenu0105, MF_STRING, 0x010505, sTxtPath + "\\" + sTxtFile + ":" + sTxtStream + "\tShift+Alt+Ins");
  oSys.Call("User32::AppendMenuW", hMenu0105, MF_STRING, 0x010506, sTxtFile + ":" + sTxtStream + "\tCtrl+Shift+Atl+Ins");
  oSys.Call("User32::AppendMenuW", hMenu0105, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu0105, MF_STRING, 0x010507, sTxtFilesList + "\tCtrl+C");
  oSys.Call("User32::AppendMenuW", hMenu0105, MF_STRING, 0x010508, sTxtStreamsList + "\tAlt+C");
  oSys.Call("User32::AppendMenuW", hMenu01, (aIntAssoc.length < 0xFF) ? MF_STRING : MF_GRAYED, 0x010100, sTxtAddAssoc);
  oSys.Call("User32::AppendMenuW", hMenu01, aIntAssoc.length ? MF_POPUP : MF_GRAYED, hMenu0102, sTxtModAssoc);
  oSys.Call("User32::AppendMenuW", hMenu01, aIntAssoc.length ? MF_POPUP : MF_GRAYED, hMenu0103, sTxtDelAssoc);
  oSys.Call("User32::AppendMenuW", hMenu01, aIntAssoc.length ? MF_STRING : MF_GRAYED, 0x010400, sTxtCleAssoc);
  oSys.Call("User32::AppendMenuW", hMenu01, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu01, MF_POPUP, hMenu0105, sTxtCopyNames);
  oSys.Call("User32::AppendMenuW", hMenu01, MF_STRING,  0x010600, sTxtProperties + "\tAlt+Enter");

  //Drive
  oSys.Call("User32::AppendMenuW", hMenu02, ((bDualPan || (nCurPan == 0)) ? MF_STRING : MF_GRAYED), 0x020100, sTxtLeftPanel + "\tAlt+F1");
  oSys.Call("User32::AppendMenuW", hMenu02, ((bDualPan || (nCurPan == 1)) ? MF_STRING : MF_GRAYED), 0x020200, sTxtRightPanel + "\tAlt+F2");

  //Directory
  oSys.Call("User32::AppendMenuW", hMenu03, MF_STRING, 0x030100, sTxtGoToParent + "\t<-");
  oSys.Call("User32::AppendMenuW", hMenu03, MF_STRING, 0x030200, sTxtGoToSubDir + "\t->");
  oSys.Call("User32::AppendMenuW", hMenu03, MF_STRING, 0x030300, sTxtGoToMain + "\tCtrl+\\");
  oSys.Call("User32::AppendMenuW", hMenu03, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu03, MF_STRING, 0x030400, sTxtFavFolders + "\tAlt+F");
  oSys.Call("User32::AppendMenuW", hMenu03, MF_STRING, 0x030500, sTxtSpecFolders + "\tAlt+S");
  oSys.Call("User32::AppendMenuW", hMenu03, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu03, MF_STRING, 0x030600, sTxtHistory + "\tAlt+H");
  oSys.Call("User32::AppendMenuW", hMenu03, (aCurHist[nCurPan] > 0) ? MF_STRING : MF_GRAYED, 0x030700, sTxtUndo + "\tAlt+<-");
  oSys.Call("User32::AppendMenuW", hMenu03, (aCurHist[nCurPan] < aHistory[nCurPan].length - 1) ? MF_STRING : MF_GRAYED, 0x030800, sTxtRedo + "\tAlt+->");
  oSys.Call("User32::AppendMenuW", hMenu03, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu03, MF_STRING, 0x030900, sTxtRightToLeft + "\tCtrl+<-");
  oSys.Call("User32::AppendMenuW", hMenu03, MF_STRING, 0x030A00, sTxtLeftToRight + "\tCtrl+->");
  oSys.Call("User32::AppendMenuW", hMenu03, MF_STRING, 0x030B00, sTxtSwapPanels + "\tCtrl+U");

  //Filter
  oSys.Call("User32::AppendMenuW", hMenu04, ((bDualPan || (nCurPan == 0)) ? MF_STRING : MF_GRAYED), 0x040100, sTxtLeftPanel + "\tAlt+1");
  oSys.Call("User32::AppendMenuW", hMenu04, ((bDualPan || (nCurPan == 1)) ? MF_STRING : MF_GRAYED), 0x040200, sTxtRightPanel + "\tAlt+2");

  //Show
  oSys.Call("User32::AppendMenuW", hMenu0504, (! (bColSize || bColTime || bColAttr) ? MF_CHECKED : MF_STRING), 0x050401, sTxtOnlyName + "\tShift+F1");
  oSys.Call("User32::AppendMenuW", hMenu0504, (bColSize ? MF_CHECKED : MF_STRING), 0x050402, sTxtSize + "\tShift+F2");
  oSys.Call("User32::AppendMenuW", hMenu0504, (bColTime ? MF_CHECKED : MF_STRING), 0x050403, sTxtTime + "\tShift+F3");
  oSys.Call("User32::AppendMenuW", hMenu0504, (bColAttr ? MF_CHECKED : MF_STRING), 0x050404, sTxtAttributes + "\tShift+F4");
  oSys.Call("User32::AppendMenuW", hMenu05, ((bDualPan || (nCurPan == 0)) ? MF_CHECKED : MF_STRING), 0x050100, sTxtLeftPanel + "\tCtrl+F1");
  oSys.Call("User32::AppendMenuW", hMenu05, ((bDualPan || (nCurPan == 1)) ? MF_CHECKED : MF_STRING), 0x050200, sTxtRightPanel + "\tCtrl+F2");
  oSys.Call("User32::AppendMenuW", hMenu05, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu05, (bQuickView ? MF_CHECKED : MF_STRING), 0x050300, sTxtQuickView + "\tCtrl+Q");
  oSys.Call("User32::AppendMenuW", hMenu05, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu05, MF_POPUP, hMenu0504, sTxtColumns);

  //Window
  oSys.Call("User32::AppendMenuW", hMenu06, MF_STRING, 0x060100, sTxtMoveLeft + "\tShift+Alt+<-");
  oSys.Call("User32::AppendMenuW", hMenu06, MF_STRING, 0x060200, sTxtMoveRight + "\tShift+Alt+->");
  oSys.Call("User32::AppendMenuW", hMenu06, MF_STRING, 0x060300, sTxtMoveUp + "\tShift+Alt+Up");
  oSys.Call("User32::AppendMenuW", hMenu06, MF_STRING, 0x060400, sTxtMoveDown + "\tShift+Alt+Down");
  oSys.Call("User32::AppendMenuW", hMenu06, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu06, MF_STRING, 0x060500, sTxtToLeftEdge + "\tShift+Alt+Home");
  oSys.Call("User32::AppendMenuW", hMenu06, MF_STRING, 0x060600, sTxtToRightEdge + "\tShift+Alt+End");
  oSys.Call("User32::AppendMenuW", hMenu06, MF_STRING, 0x060700, sTxtToTopEdge + "\tShift+Alt+PgUp");
  oSys.Call("User32::AppendMenuW", hMenu06, MF_STRING, 0x060800, sTxtToBottomEdge + "\tShift+Alt+PgDn");
  oSys.Call("User32::AppendMenuW", hMenu06, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu06, MF_STRING, 0x060900, sTxtCenter + "\tShift+Alt+C");
  oSys.Call("User32::AppendMenuW", hMenu06, MF_STRING, 0x060A00, sTxtMaximize + "\tShift+Alt+M");

  //Applications
  for (i = 0; i < aFavorite.length; ++i)
  {
    oSys.Call("User32::AppendMenuW", hMenu0708, MF_STRING, 0x070801 + i, aFavorite[i][0]);
    oSys.Call("User32::AppendMenuW", hMenu0709, MF_STRING, 0x070901 + i, aFavorite[i][0]);
  }
  oSys.Call("User32::AppendMenuW", hMenu07, MF_STRING, 0x070100, sTxtViewer + " 1: " + sViewerName + "\tCtrl+Shift+F3");
  oSys.Call("User32::AppendMenuW", hMenu07, MF_STRING, 0x070200, sTxtViewer + " 2: " + sViewerName2 + "\tCtrl+Alt+F3");
  oSys.Call("User32::AppendMenuW", hMenu07, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu07, MF_STRING, 0x070300, sTxtEditor + " 1: " + sEditorName + "\tCtrl+Shift+F4");
  oSys.Call("User32::AppendMenuW", hMenu07, MF_STRING, 0x070400, sTxtEditor + " 2: " + sEditorName2 + "\tCtrl+Alt+F4");
  oSys.Call("User32::AppendMenuW", hMenu07, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu07, MF_STRING, 0x070500, sTxtComparer + " 1: " + sComparerName + "\tCtrl+Shift+F12");
  oSys.Call("User32::AppendMenuW", hMenu07, MF_STRING, 0x070600, sTxtComparer + " 2: " + sComparerName2 + "\tCtrl+Alt+F12");
  oSys.Call("User32::AppendMenuW", hMenu07, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu07, (aFavorite.length < 0xFF) ? MF_STRING : MF_GRAYED, 0x070700, sTxtAddFavorite);
  oSys.Call("User32::AppendMenuW", hMenu07, aFavorite.length ? MF_POPUP : MF_GRAYED, hMenu0708, sTxtModFavorite);
  oSys.Call("User32::AppendMenuW", hMenu07, aFavorite.length ? MF_POPUP : MF_GRAYED, hMenu0709, sTxtDelFavorite);
  oSys.Call("User32::AppendMenuW", hMenu07, aFavorite.length ? MF_STRING : MF_GRAYED, 0x070A00, sTxtCleFavorite);

  //Run
  oSys.Call("User32::AppendMenuW", hMenu0801, MF_STRING, 0x080101, sTxtWithoutArgs + "\tCtrl+Enter");
  oSys.Call("User32::AppendMenuW", hMenu0801, MF_STRING, 0x080102, sTxtWithArgs + "\tCtrl+Shift+Enter");
  for (i = 0; i < aFavorite.length; ++i)
    oSys.Call("User32::AppendMenuW", hMenu0802, MF_STRING, 0x080201 + i, aFavorite[i][0]);
  oSys.Call("User32::AppendMenuW", hMenu08, MF_POPUP, hMenu0801, sTxtAkelScript);
  oSys.Call("User32::AppendMenuW", hMenu08, aFavorite.length ? MF_POPUP : MF_GRAYED, hMenu0802, sTxtFavorites);
  oSys.Call("User32::AppendMenuW", hMenu08, MF_STRING, 0x080300, sTxtCommandLine);

  oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP, hMenu01, sTxtFile);
  oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP, hMenu02, sTxtDrive);
  oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP, hMenu03, sTxtDirectory);
  oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP, hMenu04, sTxtFilter);
  oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP, hMenu05, sTxtShow);
  oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP, hMenu06, sTxtWindow);
  oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP, hMenu07, sTxtApplications);
  oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP, hMenu08, sTxtRun);
  oSys.Call("User32::AppendMenuW", hMenu, MF_STRING, 0x090000, sTxtExit);

  GetWindowPos(aWnd[IDMENUB][HWND], oRect);

  nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, 0x01A0 /*TPM_NONOTIFY|TPM_RETURNCMD|TPM_BOTTOMALIGN*/, oRect.X, oRect.Y, 0, hWndDlg, 0);

  oSys.Call("User32::DestroyMenu", hMenu0102);
  oSys.Call("User32::DestroyMenu", hMenu0103);
  oSys.Call("User32::DestroyMenu", hMenu0105);
  oSys.Call("User32::DestroyMenu", hMenu01);
  oSys.Call("User32::DestroyMenu", hMenu02);
  oSys.Call("User32::DestroyMenu", hMenu03);
  oSys.Call("User32::DestroyMenu", hMenu04);
  oSys.Call("User32::DestroyMenu", hMenu0504);
  oSys.Call("User32::DestroyMenu", hMenu05);
  oSys.Call("User32::DestroyMenu", hMenu06);
  oSys.Call("User32::DestroyMenu", hMenu07);
  oSys.Call("User32::DestroyMenu", hMenu0708);
  oSys.Call("User32::DestroyMenu", hMenu0709);
  oSys.Call("User32::DestroyMenu", hMenu0801);
  oSys.Call("User32::DestroyMenu", hMenu0802);
  oSys.Call("User32::DestroyMenu", hMenu08);
  oSys.Call("User32::DestroyMenu", hMenu);

  switch (nCmd)
  {
    case 0x010100 : SetInternalAssoc(-1); //add internal association
      break;
    case 0x010400 :
      if (QuestionBox(hWndDlg, sTxtWantCleAssoc, sTxtCleAssoc, 1))
        aIntAssoc = [];
      break;
    case 0x010501 : CopyNameToCB(1);
      break;
    case 0x010502 : CopyNameToCB(3);
      break;
    case 0x010503 : CopyNameToCB(5);
      break;
    case 0x010504 : CopyNameToCB(4);
      break;
    case 0x010505 : CopyNameToCB(6);
      break;
    case 0x010506 : CopyNameToCB(7);
      break;
    case 0x010507 : CopyListToCB(0);
      break;
    case 0x010508 : CopyListToCB(1);
      break;
    case 0x010600 : Properties();
      break;
    case 0x020100 : oSys.Call("User32::SetFocus", aWnd[IDDRIVECB0][HWND]);
      break;
    case 0x020200 : oSys.Call("User32::SetFocus", aWnd[IDDRIVECB1][HWND]);
      break;
    case 0x030100 : Open(nCurPan, -1);
      break;
    case 0x030200 : Open(nCurPan, 1);
      break;
    case 0x030300 : Open(nCurPan, -2);
      break;
    case 0x030400 : FavoriteFolders(nCurPan);
      break;
    case 0x030500 : SpecialFolders(nCurPan);
      break;
    case 0x030600 : History(nCurPan);
      break;
    case 0x030700 : ChangeDirFromHistory(nCurPan, 0, -1);
      break;
    case 0x030800 : ChangeDirFromHistory(nCurPan, 0, 1);
      break;
    case 0x030900 : ClonePanel(0);
      break;
    case 0x030A00 : ClonePanel(1);
      break;
    case 0x030B00 : SwapPanels();
      break;
    case 0x040100 : oSys.Call("User32::SetFocus", aWnd[IDFILTERCB0][HWND]);
      break;
    case 0x040200 : oSys.Call("User32::SetFocus", aWnd[IDFILTERCB1][HWND]);
      break;
    case 0x050100 : ShowPanel(0);
      break;
    case 0x050200 : ShowPanel(1);
      break;
    case 0x050300 : ShowQuickView();
      break;
    case 0x050401 : ShowColumn(1);
      break;
    case 0x050402 : ShowColumn(2);
      break;
    case 0x050403 : ShowColumn(3);
      break;
    case 0x050404 : ShowColumn(4);
      break;
    case 0x060100 : MoveDialog("L");
      break;
    case 0x060200 : MoveDialog("R");
      break;
    case 0x060300 : MoveDialog("U");
      break;
    case 0x060400 : MoveDialog("D");
      break;
    case 0x060500 : MoveDialog("H");
      break;
    case 0x060600 : MoveDialog("E");
      break;
    case 0x060700 : MoveDialog("T");
      break;
    case 0x060800 : MoveDialog("B");
      break;
    case 0x060900 : MoveDialog("C");
      break;
    case 0x060A00 : MoveDialog("M");
      break;
    case 0x070100 : SetExternalApp(0, 1);
      break;
    case 0x070200 : SetExternalApp(0, 2);
      break;
    case 0x070300 : SetExternalApp(1, 1);
      break;
    case 0x070400 : SetExternalApp(1, 2);
      break;
    case 0x070500 : SetExternalApp(2, 1);
      break;
    case 0x070600 : SetExternalApp(2, 2);
      break;
    case 0x070700 : SetExternalApp(3, -1); //add favorite app
      break;
    case 0x070A00 :
      if (QuestionBox(hWndDlg, sTxtWantCleFavAp, sTxtApplications + ": " + sTxtCleFavorite, 1))
        aFavorite = [];
      break;
    case 0x080101 : RunAkelScript(0);
      break;
    case 0x080102 : RunAkelScript(1);
      break;
    case 0x080300 : AkelPad.Exec("cmd.exe", aCurDir[nCurPan][aCurDrive[nCurPan]].Path);
      break;
    case 0x090000 : oSys.Call("User32::PostMessageW", hWndDlg, 16 /*WM_CLOSE*/, 0, 0);
      break;
    default :
      if ((nCmd >= 0x010201) && (nCmd <= 0x0102FF))
        SetInternalAssoc(nCmd - 0x010201); //modify internal association
      else if ((nCmd >= 0x010301) && (nCmd <= 0x0103FF))
        RemoveInternalAssoc(nCmd - 0x010301);
      else if ((nCmd >= 0x070801) && (nCmd <= 0x0708FF))
        SetExternalApp(3, nCmd - 0x070801); //modify favorite app
      else if ((nCmd >= 0x070901) && (nCmd <= 0x0709FF))
        RemoveFavoriteApp(nCmd - 0x070901);
      else if ((nCmd >= 0x080201) && (nCmd <= 0x0802FF))
        RunFavoriteApp(nCmd - 0x080201);
  }
}

function ContextMenu(hWnd, lpPoint)
{
  var MF_STRING    = 0x0000;
  var MF_GRAYED    = 0x0001;
  var MF_POPUP     = 0x0010;
  var MF_SEPARATOR = 0x0800;
  var hMenu03 = oSys.Call("User32::CreatePopupMenu");
  var hMenu05 = oSys.Call("User32::CreatePopupMenu");
  var hMenu06 = oSys.Call("User32::CreatePopupMenu");
  var hMenu07 = oSys.Call("User32::CreatePopupMenu");
  var hMenu09 = oSys.Call("User32::CreatePopupMenu");
  var hMenu0A = oSys.Call("User32::CreatePopupMenu");
  var hMenu0B = oSys.Call("User32::CreatePopupMenu");
  var hMenu   = oSys.Call("User32::CreatePopupMenu");
  var lpRect;
  var nCmd;
  var nX, nY;
  var i;

  for (i = 0; i < aFavorite.length; ++i)
    oSys.Call("User32::AppendMenuW", hMenu03, MF_STRING, 0x0301 + i, aFavorite[i][0]);

  oSys.Call("User32::AppendMenuW", hMenu05, MF_STRING, 0x0501, (sViewerName ? sViewerName : sTxtViewer + " 1") + "\tF3");
  oSys.Call("User32::AppendMenuW", hMenu05, MF_STRING, 0x0502, (sViewerName2 ? sViewerName2 : sTxtViewer + " 2") + "\tCtrl+F3");

  oSys.Call("User32::AppendMenuW", hMenu06, MF_STRING, 0x0601, (sEditorName ? sEditorName : sTxtEditor + " 1") + "\tF4");
  oSys.Call("User32::AppendMenuW", hMenu06, MF_STRING, 0x0602, (sEditorName2 ? sEditorName2 : sTxtEditor + " 2") + "\tCtrl+F4");

  oSys.Call("User32::AppendMenuW", hMenu07, CopyAvailable(0) ? MF_STRING : MF_GRAYED, 0x0701, sTxtToSecPanel + "\tF5");
  oSys.Call("User32::AppendMenuW", hMenu07, CopyAvailable(1) ? MF_STRING : MF_GRAYED, 0x0702, sTxtToOwnPanel + "\tShift+F5");

  oSys.Call("User32::AppendMenuW", hMenu09, (aCurWnd[nCurPan] == 0) ? MF_STRING : MF_GRAYED, 0x0901, sTxtDirectory + "\tF7");
  oSys.Call("User32::AppendMenuW", hMenu09, (aCurWnd[nCurPan] == 0) ? MF_STRING : MF_GRAYED, 0x0902, sTxtFile + "\tShift+F7");
  oSys.Call("User32::AppendMenuW", hMenu09, CreateStreamAvailable() ? MF_STRING : MF_GRAYED, 0x0903, sTxtStream + "\tF7");

  oSys.Call("User32::AppendMenuW", hMenu0A, (aCurWnd[nCurPan] == 0) ? MF_STRING : MF_GRAYED, 0x0A01, sTxtToRecBin + "\tF8");
  oSys.Call("User32::AppendMenuW", hMenu0A, (aCurWnd[nCurPan] == 0) ? MF_STRING : MF_GRAYED, 0x0A02, sTxtFromDisk + "\tShift+F8");
  oSys.Call("User32::AppendMenuW", hMenu0A, (aCurWnd[nCurPan] == 1) ? MF_STRING : MF_GRAYED, 0x0A03, sTxtDelStr + "\tF8");

  oSys.Call("User32::AppendMenuW", hMenu0B, MF_STRING, 0x0B01, (sComparerName ? sComparerName : sTxtComparer + " 1") + "\tF12");
  oSys.Call("User32::AppendMenuW", hMenu0B, MF_STRING, 0x0B02, (sComparerName2 ? sComparerName2 : sTxtComparer + " 2") + "\tCtrl+F12");

  if (aCurWnd[nCurPan] == 0)
  {
    oSys.Call("User32::AppendMenuW", hMenu, OpenAvailable(nCurPan, 0) ? MF_STRING : MF_GRAYED, 0x0100, sTxtOpenWin + "\tEnter");
    oSys.Call("User32::AppendMenuW", hMenu, OpenInAvailable(4) ? MF_STRING : MF_GRAYED, 0x0200, sTxtOpenInAssoc + "\tShift+Enter");
  }

  oSys.Call("User32::AppendMenuW", hMenu, (OpenInAvailable(3) && aFavorite.length) ? MF_POPUP : MF_GRAYED, hMenu03, sTxtOpenInFavor);
  oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu, RenameAvailable() ? MF_STRING : MF_GRAYED, 0x0400, sTxtRename + "\tF2");
  oSys.Call("User32::AppendMenuW", hMenu, OpenInAvailable(0) ? MF_POPUP : MF_GRAYED, hMenu05, sTxtView);
  oSys.Call("User32::AppendMenuW", hMenu, OpenInAvailable(1) ? MF_POPUP : MF_GRAYED, hMenu06, sTxtEdit);
  oSys.Call("User32::AppendMenuW", hMenu, CopyAvailable(0) || CopyAvailable(1) ? MF_POPUP : MF_GRAYED, hMenu07, sTxtCopy);
  oSys.Call("User32::AppendMenuW", hMenu, CopyAvailable(0) ? MF_STRING : MF_GRAYED, 0x0800, sTxtMove + "\tF6");
  oSys.Call("User32::AppendMenuW", hMenu, (aCurWnd[nCurPan] == 0) || CreateStreamAvailable() ? MF_POPUP : MF_GRAYED, hMenu09, sTxtCreate);
  oSys.Call("User32::AppendMenuW", hMenu, DeleteAvailable() ? MF_POPUP : MF_GRAYED, hMenu0A, sTxtDelete);
  oSys.Call("User32::AppendMenuW", hMenu, CompareAvailable() ? MF_POPUP : MF_GRAYED, hMenu0B, sTxtCompare);
  oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu, PropertiesAvailable() ? MF_STRING : MF_GRAYED, 0x0C00, sTxtProperties + "\tAlt+Enter");

  //menu from mouse r-click
  if (lpPoint)
  {
    oSys.Call("User32::ClientToScreen", hWnd, lpPoint);
    nX = AkelPad.MemRead(_PtrAdd(lpPoint, 0), DT_DWORD);
    nY = AkelPad.MemRead(_PtrAdd(lpPoint, 4), DT_DWORD);
  }
  //menu from keyboard
  else
  {
    lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
    AkelPad.SendMessage(hWnd, 0x100E /*LVM_GETITEMRECT*/, GetCurSelLV(hWnd), lpRect);

    oSys.Call("User32::ClientToScreen", hWnd, lpRect);
    oSys.Call("User32::ClientToScreen", hWnd, _PtrAdd(lpRect, 8));
    nX = AkelPad.MemRead(_PtrAdd(lpRect,  0), DT_DWORD) + 40;
    nY = AkelPad.MemRead(_PtrAdd(lpRect, 12), DT_DWORD);

    AkelPad.MemFree(lpRect);
  }

  nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, 0x0180 /*TPM_NONOTIFY|TPM_RETURNCMD*/, nX, nY, 0, hWndDlg, 0);

  oSys.Call("User32::DestroyMenu", hMenu03);
  oSys.Call("User32::DestroyMenu", hMenu05);
  oSys.Call("User32::DestroyMenu", hMenu06);
  oSys.Call("User32::DestroyMenu", hMenu07);
  oSys.Call("User32::DestroyMenu", hMenu09);
  oSys.Call("User32::DestroyMenu", hMenu0A);
  oSys.Call("User32::DestroyMenu", hMenu0B);
  oSys.Call("User32::DestroyMenu", hMenu);

  switch (nCmd)
  {
    case 0x0100 : Open(nCurPan, 0);
      break;
    case 0x0200 : OpenIn(4);
      break;
    case 0x0400 : Rename();
      break;
    case 0x0501 : OpenIn(0, 1);
      break;
    case 0x0502 : OpenIn(0, 2);
      break;
    case 0x0601 : OpenIn(1, 1);
      break;
    case 0x0602 : OpenIn(1, 2);
      break;
    case 0x0701 : Copy(0, 0);
      break;
    case 0x0702 : Copy(0, 1);
      break;
    case 0x0800 : Copy(1, 0);
      break;
    case 0x0901 : Create(1);
      break;
    case 0x0902 :
    case 0x0903 : Create(0);
      break;
    case 0x0A01 : Delete(1);
      break;
    case 0x0A02 :
    case 0x0A03 : Delete(0);
      break;
    case 0x0B01 : Compare(1);
      break;
    case 0x0B02 : Compare(2);
      break;
    case 0x0C00 : Properties();
      break;
    default :
      if ((nCmd >= 0x0301) && (nCmd <= 0x03FF))
        OpenIn(3, nCmd - 0x0301); //open in favorite
  }
}

function ReadWriteIni(bWrite)
{
  var sIniFile = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".ini";
  var sIniTxt;
  var oError;
  var i;

  if (bWrite)
  {
    GetCurFile(0);
    GetCurFile(1);

    if (! bSaveHist)
    {
      aCurHist = [0, 0];
      aHistory = [[], []];
    }

    sIniTxt =
      'bDualPan='       + bDualPan + ';\r\n' +
      'bColSize='       + bColSize + ';\r\n' +
      'bColTime='       + bColTime + ';\r\n' +
      'bColAttr='       + bColAttr + ';\r\n' +
      'bQuickView='     + bQuickView + ';\r\n' +
      'bSaveHist='      + bSaveHist + ';\r\n' +
      'sViewerName='    + '"' + sViewerName.replace(/[\\"]/g, "\\$&") + '";\r\n' +
      'sViewer='        + '"' + sViewer.replace(/[\\"]/g, "\\$&") + '";\r\n' +
      'sViewerPar='     + '"' + sViewerPar.replace(/[\\"]/g, "\\$&") + '";\r\n' +
      'sViewerName2='   + '"' + sViewerName2.replace(/[\\"]/g, "\\$&") + '";\r\n' +
      'sViewer2='       + '"' + sViewer2.replace(/[\\"]/g, "\\$&") + '";\r\n' +
      'sViewerPar2='    + '"' + sViewerPar2.replace(/[\\"]/g, "\\$&") + '";\r\n' +
      'sEditorName='    + '"' + sEditorName.replace(/[\\"]/g, "\\$&") + '";\r\n' +
      'sEditor='        + '"' + sEditor.replace(/[\\"]/g, "\\$&") + '";\r\n' +
      'sEditorPar='     + '"' + sEditorPar.replace(/[\\"]/g, "\\$&") + '";\r\n' +
      'sEditorName2='   + '"' + sEditorName2.replace(/[\\"]/g, "\\$&") + '";\r\n' +
      'sEditor2='       + '"' + sEditor2.replace(/[\\"]/g, "\\$&") + '";\r\n' +
      'sEditorPar2='    + '"' + sEditorPar2.replace(/[\\"]/g, "\\$&") + '";\r\n' +
      'sComparerName='  + '"' + sComparerName.replace(/[\\"]/g, "\\$&") + '";\r\n' +
      'sComparer='      + '"' + sComparer.replace(/[\\"]/g, "\\$&") + '";\r\n' +
      'sComparerPar='   + '"' + sComparerPar.replace(/[\\"]/g, "\\$&") + '";\r\n' +
      'sComparerName2=' + '"' + sComparerName2.replace(/[\\"]/g, "\\$&") + '";\r\n' +
      'sComparer2='     + '"' + sComparer2.replace(/[\\"]/g, "\\$&") + '";\r\n' +
      'sComparerPar2='  + '"' + sComparerPar2.replace(/[\\"]/g, "\\$&") + '";\r\n' +
      'nCurPan='        + nCurPan + ';\r\n' +
      'aCurFilter=["'   + aCurFilter[0].replace(/[\\"]/g, "\\$&") + '","' + aCurFilter[1].replace(/[\\"]/g, "\\$&") + '"];\r\n' +
      'aCurHist=['      + aCurHist[0] + ',' + aCurHist[1] + '];\r\n' +
      'aCurWnd=['       + aCurWnd[0] + ',' + aCurWnd[1] + '];\r\n' +
      'aCurDrive=["'    + aCurDrive[0] + '","' + aCurDrive[1] + '"];\r\n' +
      'aCurDir[0]={';

    for (i in aCurDir[0])
      sIniTxt += '"' + i +
                 '":{Path:"'  + aCurDir[0][i].Path.replace(/[\\"]/g, "\\$&") +
                 '",File:"'   + aCurDir[0][i].File.replace(/[\\"]/g, "\\$&") +
                 '",Stream:"' + aCurDir[0][i].Stream.replace(/[\\"]/g, "\\$&") + '"},';
    if (sIniTxt.slice(-1) == ",")
      sIniTxt = sIniTxt.slice(0, -1);
    sIniTxt += '};\r\naCurDir[1]={';

    for (i in aCurDir[1])
      sIniTxt += '"' + i +
                 '":{Path:"'  + aCurDir[1][i].Path.replace(/[\\"]/g, "\\$&") +
                 '",File:"'   + aCurDir[1][i].File.replace(/[\\"]/g, "\\$&") +
                 '",Stream:"' + aCurDir[1][i].Stream.replace(/[\\"]/g, "\\$&") + '"},';
    if (sIniTxt.slice(-1) == ",")
      sIniTxt = sIniTxt.slice(0, -1);
    sIniTxt += '};\r\naFilter=[';

    for (i = 0; i < aFilter.length; ++i)
      sIniTxt += '"' + aFilter[i].replace(/[\\"]/g, "\\$&") + '",';
    if (sIniTxt.slice(-1) == ",")
      sIniTxt = sIniTxt.slice(0, -1);
    sIniTxt += '];\r\naSort=[';

    for (i = 0; i < aSort.length; ++i)
      sIniTxt += '[' + aSort[i][0] + ',' + aSort[i][1] + '],';
    if (sIniTxt.slice(-1) == ",")
      sIniTxt = sIniTxt.slice(0, -1);
    sIniTxt += '];\r\naFavorite=[';

    for (i = 0; i < aFavorite.length; ++i)
      sIniTxt += '["' + aFavorite[i][0].replace(/[\\"]/g, "\\$&") + '","' + aFavorite[i][1].replace(/[\\"]/g, "\\$&") + '","' + aFavorite[i][2].replace(/[\\"]/g, "\\$&") + '"],';
    if (sIniTxt.slice(-1) == ",")
      sIniTxt = sIniTxt.slice(0, -1);
    sIniTxt += '];\r\naFavoriteFolder=[';

    for (i = 0; i < aFavoriteFolder.length; ++i)
      sIniTxt += '["' + aFavoriteFolder[i][0].replace(/[\\"]/g, "\\$&") + '","' + aFavoriteFolder[i][1].replace(/[\\"]/g, "\\$&") + '"],';
    if (sIniTxt.slice(-1) == ",")
      sIniTxt = sIniTxt.slice(0, -1);
    sIniTxt += '];\r\naIntAssoc=[';

    for (i = 0; i < aIntAssoc.length; ++i)
      sIniTxt += '["' + aIntAssoc[i][0].replace(/[\\"]/g, "\\$&") + '","' + aIntAssoc[i][1].replace(/[\\"]/g, "\\$&") + '","' + aIntAssoc[i][2].replace(/[\\"]/g, "\\$&") + '"],';
    if (sIniTxt.slice(-1) == ",")
      sIniTxt = sIniTxt.slice(0, -1);
    sIniTxt += '];\r\naHistory[0]=[';

    for (i = 0; i < aHistory[0].length; ++i)
      sIniTxt += '["' + aHistory[0][i][0].replace(/[\\"]/g, "\\$&") + '","' + aHistory[0][i][1].replace(/[\\"]/g, "\\$&") + '","' + aHistory[0][i][2].replace(/[\\"]/g, "\\$&") + '"],';
    if (sIniTxt.slice(-1) == ",")
      sIniTxt = sIniTxt.slice(0, -1);
    sIniTxt += '];\r\naHistory[1]=[';

    for (i = 0; i < aHistory[1].length; ++i)
      sIniTxt += '["' + aHistory[1][i][0].replace(/[\\"]/g, "\\$&") + '","' + aHistory[1][i][1].replace(/[\\"]/g, "\\$&") + '","' + aHistory[1][i][2].replace(/[\\"]/g, "\\$&") + '"],';
    if (sIniTxt.slice(-1) == ",")
      sIniTxt = sIniTxt.slice(0, -1);
    sIniTxt += '];\r\noScrArg={';

    for (i in oScrArg)
      sIniTxt += '"' + i +'":"' + oScrArg[i].replace(/[\\"]/g, "\\$&") + '",';
    if (sIniTxt.slice(-1) == ",")
      sIniTxt = sIniTxt.slice(0, -1);
    sIniTxt += '};\r\noWndPos={';

    for (i in oWndPos)
      sIniTxt += i + ':' + oWndPos[i] + ',';
    if (sIniTxt.slice(-1) == ",")
      sIniTxt = sIniTxt.slice(0, -1);
    sIniTxt += '};';

    WriteFile(sIniFile, null, sIniTxt, 1);
  }

  else if (IsFileExists(sIniFile))
  {
    try
    {
      eval(AkelPad.ReadFile(sIniFile));
    }
    catch (oError)
    {
    }
  }
}

function GetLangStrings()
{
  var sLangFile = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + "_" + AkelPad.GetLangId(0 /*LANGID_FULL*/).toString() + ".lng";

  if (! IsFileExists(sLangFile))
  {
    sLangFile = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + "_1033.lng";
    if (! IsFileExists(sLangFile))
    {
      WScript.Echo("File does not exists:\n" + sLangFile);
      return false;
    }
  }

  eval(AkelPad.ReadFile(sLangFile));
  return true;
}
Last edited by KDJ on Wed Jan 07, 2015 8:10 pm, edited 18 times in total.

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

Post by KDJ »

Interface language files for FileAndStream.js.

Code: Select all

/**************************************
FileAndStream.js ver. 2015-01-07
Interface language
Language:      English (1033)
Translated by: KDJ
**************************************/
sTxtFilter       = "Filter";
sTxtFileName     = "File name";
sTxtStrName      = "NTFS stream name";
sTxtSize         = "Size";
sTxtTime         = "Time";
sTxtAttrib       = "Attrib.";
sTxtOpenWin      = "Open (Windows)";
sTxtMenu         = "Menu";
sTxtRename       = "Rename";
sTxtView         = "View";
sTxtEdit         = "Edit";
sTxtCopy         = "Copy";
sTxtToSecPanel   = "To second panel";
sTxtToOwnPanel   = "To its own panel";
sTxtMove         = "Move";
sTxtCreate       = "Create";
sTxtDelete       = "Delete";
sTxtRefresh      = "Refresh";
sTxtCompare      = "Compare";
sTxtNoFiles      = "<no files>";
sTxtNoStreams    = "<no streams>";
sTxtNoSupport    = "<drive does not supports NTFS streams>";
sTxtMainStream   = "<unnamed - main stream>";
sTxtNoDrive      = "Drive is not available. Please select another.";
sTxtNoDirRefr    = "Directory does not exists. List of files will be refreshed.";
sTxtNoFileRefr   = "File does not exists. List of files will be refreshed.";
sTxtNoStreamRefr = "Stream does not exists. List of streams will be refreshed.";
sTxtNoDirAcc     = "Access denied to this directory.";
sTxtNoExists     = "Does not exists.";
sTxtDirNoExists  = "Directory does not exists.";
sTxtFileNoExists = "File does not exists.";
sTxtDirExists    = "Directory already exists.";
sTxtFileExists   = "File already exists.";
sTxtStrExists    = "Stream already exists.";
sTxtNameExists   = "Name already exists.";
sTxtRenDir       = "Rename directory";
sTxtRenFile      = "Rename file";
sTxtRenStr       = "Rename stream";
sTxtRenFail      = "Failed to rename.";
sTxtNewName      = "new name:";
sTxtCopDir       = "Copy directory";
sTxtCopFile      = "Copy file";
sTxtCopStr       = "Copy stream";
sTxtCopFail      = "Failed to copy.";
sTxtMovDir       = "Move directory";
sTxtMovFile      = "Move file";
sTxtMovStr       = "Move stream";
sTxtMovFail      = "Failed to move.";
sTxtWantReplace  = "Already exists. Do you want to replace it?";
sTxtDirToSubdir  = "You can not copy/move directory to its own subdirectory.";
sTxtFileToStr    = "You can not move file to its own stream.";
sTxtCreDir       = "Create new directory";
sTxtCreFile      = "Create new file";
sTxtCreStr       = "Create new stream";
sTxtCreFail      = "Failed to create.";
sTxtInpName      = "Input name:";
sTxtDelDir       = "Delete directory from disk";
sTxtDelDirToBin  = "Delete directory to Recycle Bin";
sTxtDelFile      = "Delete file from disk";
sTxtDelFileToBin = "Delete file to Recycle Bin";
sTxtDelStr       = "Delete stream";
sTxtDelFail      = "Failed to delete.";
sTxtWantDelete   = "Do you want to delete?";
sTxtToRecBin     = "To Recycle Bin";
sTxtFromDisk     = "From disk";
sTxtTo           = "to:";
sTxtToFile       = "to file:";
sTxtToStream     = "to stream:";
sTxtBadName      = "Illegal name.";
sTxtBadChar      = "The name contains illegal character";
sTxtRunScript    = "Run AkelPad script";
sTxtJsVbsOnly    = "You can run only files .JS and .VBS";
sTxtNoRunScript  = "AkelPad script can be run only from the drive, on which you installed AkelPad.";
sTxtInpArgs      = "Input arguments:";
sTxtNoFileProp   = "Error: unable to display file properties.";
sTxtSetViewer    = "Set external viewer of files";
sTxtSetEditor    = "Set external editor of files";
sTxtSetComparer  = "Set external comparer of files";
sTxtDispName     = "Displayed name";
sTxtFullName     = "Full name of executable file with path";
sTxtAkelDir      = "AkelPad directory";
sTxtEnvVar       = "environment variable";
sTxtAddPar       = "Additional parameters:";
sTxtMustSpecify  = "You must specify";
sTxtFavorites    = "Favorites";
sTxtAddFavorite  = "Add to favorites";
sTxtModFavorite  = "Modify favorite";
sTxtDelFavorite  = "Remove from favorites";
sTxtCleFavorite  = "Clear favorites list";
sTxtWantDelFav   = "Do you want to remove from favorites?";
sTxtWantCleFavAp = "Do you want to remove all favorites applications?";
sTxtWantCleFavFo = "Do you want to remove all favorites folders?";
sTxtOpenInFavor  = "Open in favorite";
sTxtGoToFavFold  = "Go to favorite folder";
sTxtCleHistory   = "Clear history of directories";
sTxtSaveHistory  = "Save history on exit";
sTxtAddAssoc     = "Add internal association";
sTxtModAssoc     = "Modify association";
sTxtDelAssoc     = "Remove association";
sTxtCleAssoc     = "Clear associations list";
sTxtFileExtSep   = "File name extensions separated by commas";
sTxtAssocExists  = "Association already exists."
sTxtWantDelAssoc = "Do you want to remove internal association of files?";
sTxtWantCleAssoc = "Do you want to remove all internal associations of files?";
sTxtOpenInAssoc  = "Open (internal association)";
sTxtWait         = "Please wait...";

//Menu
sTxtFile         = "File";
sTxtDrive        = "Drive";
sTxtDirectory    = "Directory";
sTxtShow         = "Show";
sTxtWindow       = "Window";
sTxtApplications = "Applications";
sTxtRun          = "Run";
sTxtExit         = "Exit";
sTxtProperties   = "Properties";
sTxtCopyNames    = "Copy names";
sTxtPath         = "Path";
sTxtStream       = "Stream";
sTxtFilesList    = "Files list in directory";
sTxtStreamsList  = "Streams list in file";
sTxtLeftPanel    = "Left panel";
sTxtRightPanel   = "Right panel";
sTxtGoToParent   = "Go to parent";
sTxtGoToSubDir   = "Go to subdir";
sTxtGoToMain     = "Go to main";
sTxtFavFolders   = "Favorite folders";
sTxtSpecFolders  = "Special folders";
sTxtHistory      = "History";
sTxtUndo         = "Undo";
sTxtRedo         = "Redo";
sTxtRightToLeft  = "Right to left";
sTxtLeftToRight  = "Left to right";
sTxtSwapPanels   = "Swap panels";
sTxtQuickView    = "Quick view";
sTxtColumns      = "Columns";
sTxtOnlyName     = "Only name";
sTxtAttributes   = "Attributes";
sTxtMoveLeft     = "Move left";
sTxtMoveRight    = "Move right";
sTxtMoveUp       = "Move up";
sTxtMoveDown     = "Move down";
sTxtToLeftEdge   = "To left edge";
sTxtToRightEdge  = "To right edge";
sTxtToTopEdge    = "To top edge";
sTxtToBottomEdge = "To bottom edge";
sTxtCenter       = "Center";
sTxtMaximize     = "Maximize";
sTxtViewer       = "Viewer";
sTxtEditor       = "Editor";
sTxtComparer     = "Comparer";
sTxtCommandLine  = "Command line";
sTxtAkelScript   = "AkelPad script";
sTxtWithoutArgs  = "Without arguments";
sTxtWithArgs     = "With arguments";
- English

Code: Select all

/**************************************
FileAndStream.js ver. 2015-01-07
Interface language
Language:      Polish (1045)
Translated by: KDJ
**************************************/
sTxtFilter       = "Filtr";
sTxtFileName     = "Nazwa pliku";
sTxtStrName      = "Nazwa strumienia NTFS";
sTxtSize         = "Rozmiar";
sTxtTime         = "Czas";
sTxtAttrib       = "Atryb.";
sTxtOpenWin      = "Otwórz (Windows)";
sTxtMenu         = "Menu";
sTxtRename       = "Zmień nazwę";
sTxtView         = "Podgląd";
sTxtEdit         = "Edytuj";
sTxtCopy         = "Kopiuj";
sTxtToSecPanel   = "Do drugiego panela";
sTxtToOwnPanel   = "Do własnego panela";
sTxtMove         = "Przenieś";
sTxtCreate       = "Utwórz";
sTxtDelete       = "Usuń";
sTxtRefresh      = "Odśwież";
sTxtCompare      = "Porównaj";
sTxtNoFiles      = "<brak plików>";
sTxtNoStreams    = "<brak strumieni>";
sTxtNoSupport    = "<dysk nie obsługuje strumieni NTFS>";
sTxtMainStream   = "<nienazwany - główny strumień>";
sTxtNoDrive      = "Dysk jest niedostępny. Proszę wybrać inny.";
sTxtNoDirRefr    = "Katalog nie istnieje. Lista plików zostanie odświeżona.";
sTxtNoFileRefr   = "Plik nie istnieje. Lista plików zostanie odświeżona.";
sTxtNoStreamRefr = "Strumień nie istnieje. Lista strumieni zostanie odświeżona.";
sTxtNoDirAcc     = "Brak dostępu do tego katalogu.";
sTxtNoExists     = "Nie istnieje.";
sTxtDirNoExists  = "Katalog nie istnieje.";
sTxtFileNoExists = "Plik nie istnieje.";
sTxtDirExists    = "Katalog już istnieje.";
sTxtFileExists   = "Plik już istnieje.";
sTxtStrExists    = "Strumień już istnieje.";
sTxtNameExists   = "Nazwa już istnieje.";
sTxtRenDir       = "Zmień nazwę katalogu";
sTxtRenFile      = "Zmień nazwę pliku";
sTxtRenStr       = "Zmień nazwę strumienia";
sTxtRenFail      = "Nie można zmienić nazwy.";
sTxtNewName      = "nowa nazwa:";
sTxtCopDir       = "Kopiuj katalog";
sTxtCopFile      = "Kopiuj plik";
sTxtCopStr       = "Kopiuj strumień";
sTxtCopFail      = "Nie można skopiować.";
sTxtMovDir       = "Przenieś katalog";
sTxtMovFile      = "Przenieś plik";
sTxtMovStr       = "Przenieś strumień";
sTxtMovFail      = "Nie można przenieść.";
sTxtWantReplace  = "Już istnieje. Czy chcesz go zastąpić?";
sTxtDirToSubdir  = "Nie możesz skopiować/przenieść katalogu do jego własnego podkatalogu.";
sTxtFileToStr    = "Nie możesz przenieść pliku do jego własnego strumienia.";
sTxtCreDir       = "Utwórz nowy katalog";
sTxtCreFile      = "Utwórz nowy plik";
sTxtCreStr       = "Utwórz nowy strumień";
sTxtCreFail      = "Nie można utworzyć.";
sTxtInpName      = "Podaj nazwę:";
sTxtDelDir       = "Usuń katalog z dysku";
sTxtDelDirToBin  = "Usuń katalog do kosza";
sTxtDelFile      = "Usuń plik z dysku";
sTxtDelFileToBin = "Usuń plik do kosza";
sTxtDelStr       = "Usuń strumień";
sTxtDelFail      = "Nie można usunąć.";
sTxtWantDelete   = "Czy chcesz usunąć?";
sTxtToRecBin     = "Do kosza";
sTxtFromDisk     = "Z dysku";
sTxtTo           = "do:";
sTxtToFile       = "do pliku:";
sTxtToStream     = "do strumienia:";
sTxtBadName      = "Niedozwolona nawa.";
sTxtBadChar      = "Nazwa zawiera niedozwolony znak";
sTxtRunScript    = "Uruchom skrypt AkelPad'a";
sTxtJsVbsOnly    = "Można uruchamiać tylko pliki .JS i .VBS";
sTxtNoRunScript  = "Skrypt AkelPad'a można uruchomić tylko z dysku, na którym jest zainstalowany AkelPad.";
sTxtInpArgs      = "Podaj argumenty:";
sTxtNoFileProp   = "Błąd: nie można wyświetlić właściwości pliku.";
sTxtSetViewer    = "Zewnętrzny program do podglądu plików";
sTxtSetEditor    = "Zewnętrzny edytor plików";
sTxtSetComparer  = "Zewnętrzny program do porównywania plików";
sTxtDispName     = "Wyświetlana nazwa";
sTxtFullName     = "Pełna nazwa pliku wykonywalnego ze ścieżką";
sTxtAkelDir      = "katalog AkelPad";
sTxtEnvVar       = "zmienna środowiskowa";
sTxtAddPar       = "Dodatkowe parametry:";
sTxtMustSpecify  = "Musisz podać";
sTxtFavorites    = "Ulubione";
sTxtAddFavorite  = "Dodaj do ulubionych";
sTxtModFavorite  = "Modyfikuj ulubione";
sTxtDelFavorite  = "Usuń z ulubionych";
sTxtCleFavorite  = "Wyczyść listę ulubionych";
sTxtWantDelFav   = "Czy chcesz usunąć z ulubionych?";
sTxtWantCleFavAp = "Czy chcesz usunąć wszystkie ulubione programy?";
sTxtWantCleFavFo = "Czy chcesz usunąć wszystkie ulubione foldery?";
sTxtOpenInFavor  = "Otwórz w ulubionym";
sTxtGoToFavFold  = "Przejdź do ulubionego foldera";
sTxtCleHistory   = "Wyczyść historię katalogów";
sTxtSaveHistory  = "Zapisuj historię przy wyjściu";
sTxtAddAssoc     = "Dodaj wewnętrzne skojarzenie";
sTxtModAssoc     = "Modyfikuj skojarzenie";
sTxtDelAssoc     = "Usuń skojarzenie";
sTxtCleAssoc     = "Wyczyść listę skojarzeń";
sTxtFileExtSep   = "Rozszerzenia nazw plików oddzielone przecinkami";
sTxtAssocExists  = "Skojarzenie już istnieje."
sTxtWantDelAssoc = "Czy chcesz usunąć wewnętrzne skojarzenie plików?";
sTxtWantCleAssoc = "Czy chcesz usunąć wszystkie wewnętrzne skojarzenia plików?";
sTxtOpenInAssoc  = "Otwórz (wewnętrzne skojarzenie)";
sTxtWait         = "Proszę czekać...";

//Menu
sTxtFile         = "Plik";
sTxtDrive        = "Dysk";
sTxtDirectory    = "Katalog";
sTxtShow         = "Pokaż";
sTxtWindow       = "Okno";
sTxtApplications = "Programy";
sTxtRun          = "Uruchom";
sTxtExit         = "Zakończ";
sTxtProperties   = "Właściwości";
sTxtCopyNames    = "Kopiuj nazwy";
sTxtPath         = "Ścieżka";
sTxtStream       = "Strumień";
sTxtFilesList    = "Lista plików w katalogu";
sTxtStreamsList  = "Lista strumieni w pliku";
sTxtLeftPanel    = "Lewy panel";
sTxtRightPanel   = "Prawy panel";
sTxtGoToParent   = "Przejdź do nadrzędnego";
sTxtGoToSubDir   = "Przejdź do podkatalogu";
sTxtGoToMain     = "Przejdź do głównego";
sTxtFavFolders   = "Ulubione foldery";
sTxtSpecFolders  = "Specjalne foldery";
sTxtHistory      = "Historia";
sTxtUndo         = "Cofnij";
sTxtRedo         = "Powtórz";
sTxtRightToLeft  = "Prawy do lewego";
sTxtLeftToRight  = "Lewy do prawego";
sTxtSwapPanels   = "Zamień panele";
sTxtQuickView    = "Szybki podgląd";
sTxtColumns      = "Kolumny";
sTxtOnlyName     = "Tylko nazwa";
sTxtAttributes   = "Atrybuty";
sTxtMoveLeft     = "Przesuń w lewo";
sTxtMoveRight    = "Przesuń w prawo";
sTxtMoveUp       = "Przesuń w górę";
sTxtMoveDown     = "Przesuń w dół";
sTxtToLeftEdge   = "Do lewej krawędzi";
sTxtToRightEdge  = "Do prawej krawędzi";
sTxtToTopEdge    = "Do górnej krawędzi";
sTxtToBottomEdge = "Do dolnej krawędzi";
sTxtCenter       = "Wyśrodkuj";
sTxtMaximize     = "Maksymalizuj";
sTxtViewer       = "Podgląd plików";
sTxtEditor       = "Edytor";
sTxtComparer     = "Porównywanie plików";
sTxtCommandLine  = "Linia poleceń";
sTxtAkelScript   = "Skrypt AkelPad'a";
sTxtWithoutArgs  = "Bez  argumentów";
sTxtWithArgs     = "Z argumentami";
- Polish

Code: Select all

/**************************************
FileAndStream.js ver. 2015-01-07
Interface language
Language:      Russian (1049)
Translated by: Аверин Андрей http://tc-image.3dn.ru
**************************************/
sTxtFilter       = "Фильтр";
sTxtFileName     = "Имя";
sTxtStrName      = "Имя NTFS потока";
sTxtSize         = "Размер";
sTxtTime         = "Дата";
sTxtAttrib       = "Атрибуты";
sTxtOpenWin      = "Открыть (Windows)";
sTxtMenu         = "Меню";
sTxtRename       = "Переимен.";
sTxtView         = "Просмотр";
sTxtEdit         = "Правка";
sTxtCopy         = "Копировать";
sTxtToSecPanel   = "В другую панель";
sTxtToOwnPanel   = "В текущую панель";
sTxtMove         = "Переместить";
sTxtCreate       = "Создать";
sTxtDelete       = "Удалить";
sTxtRefresh      = "Обновить";
sTxtCompare      = "Сравнить";
sTxtNoFiles      = "<нет файлов>";
sTxtNoStreams    = "<нет потоков>";
sTxtNoSupport    = "<диск не поддерживает NTFS потоки>";
sTxtMainStream   = "<без названия - основной поток>";
sTxtNoDrive      = "Диск не доступен. Пожалуйста, выберите другой.";
sTxtNoDirRefr    = "Каталог не существует. Список файлов будет обновлен.";
sTxtNoFileRefr   = "Файл не существует. Список файлов будет обновлен.";
sTxtNoStreamRefr = "Поток не существует. Список потоков будет обновлен.";
sTxtNoDirAcc     = "Отказано в доступе в этот каталог.";
sTxtNoExists     = "Не существует.";
sTxtDirNoExists  = "Каталог не существует.";
sTxtFileNoExists = "Файл не существует.";
sTxtDirExists    = "Каталог уже существует.";
sTxtFileExists   = "Файл уже существует.";
sTxtStrExists    = "Поток уже существует.";
sTxtNameExists   = "Имя уже существует.";
sTxtRenDir       = "Переименование папки";
sTxtRenFile      = "Переименование файла";
sTxtRenStr       = "Переименование потока";
sTxtRenFail      = "Не удалось переименовать.";
sTxtNewName      = "новое имя:";
sTxtCopDir       = "Копирование папки";
sTxtCopFile      = "Копирование файла";
sTxtCopStr       = "Копирование потока";
sTxtCopFail      = "Не удалось скопировать.";
sTxtMovDir       = "Перемещение папки";
sTxtMovFile      = "Перемещение файла";
sTxtMovStr       = "Перемещение потока";
sTxtMovFail      = "Не удалось переместить.";
sTxtWantReplace  = "Уже существует. Хотите заменить его?";
sTxtDirToSubdir  = "Вы не можете копировать/перемещать каталог в подкаталог.";
sTxtFileToStr    = "Вы не можете переместить файл в свой поток.";
sTxtCreDir       = "Создать новый каталог";
sTxtCreFile      = "Создать новый файл";
sTxtCreStr       = "Создать новый поток";
sTxtCreFail      = "Не удалось создать.";
sTxtInpName      = "Введите имя:";
sTxtDelDir       = "Удаление каталога с диска";
sTxtDelDirToBin  = "Удаление каталога в корзину";
sTxtDelFile      = "Удалить файл с диска";
sTxtDelFileToBin = "Удалить файл в корзину";
sTxtDelStr       = "Удалить поток";
sTxtDelFail      = "Не удалось удалить.";
sTxtWantDelete   = "Вы хотите удалить?";
sTxtToRecBin     = "В корзину";
sTxtFromDisk     = "С диска";
sTxtTo           = "в:";
sTxtToFile       = "в file:";
sTxtToStream     = "в поток:";
sTxtBadName      = "Неверное имя.";
sTxtBadChar      = "Имя содержит недопустимый символ";
sTxtRunScript    = "Запуск скрипта AkelPad";
sTxtJsVbsOnly    = "Вы можете запустить только файлы .JS и .VBS";
sTxtNoRunScript  = "Скрипт может быть запущен только с диска, на котором установлен AkelPad.";
sTxtInpArgs      = "Введите аргументы:";
sTxtNoFileProp   = "Ошибка: не может отобразить свойства файла.";
sTxtSetViewer    = "Выберите внешний просмотрщик файлов";
sTxtSetEditor    = "Выберите внешний редактор";
sTxtSetComparer  = "Выберите программу сравнения файлов";
sTxtDispName     = "Отображаемое имя";
sTxtFullName     = "Полный путь к исполняемому файлу";
sTxtAkelDir      = "каталог AkelPad";
sTxtEnvVar       = "переменная окружения";
sTxtAddPar       = "Дополнительные параметры:";
sTxtMustSpecify  = "Вы должны указать";
sTxtFavorites    = "Избранные";
sTxtAddFavorite  = "Добавить в избранное";
sTxtModFavorite  = "Изменить избранное";
sTxtDelFavorite  = "Удалить из избранного";
sTxtCleFavorite  = "Очистить избранное";
sTxtWantDelFav   = "Вы хотите, удалить из избранного?";
sTxtWantCleFavAp = "Вы хотите, чтобы удалить все избранные приложения?";
sTxtWantCleFavFo = "Вы хотите, чтобы удалить все избранные папки?";
sTxtOpenInFavor  = "Открыть в избранном";
sTxtGoToFavFold  = "Перейти в избранную папку";
sTxtCleHistory   = "Очистить историю каталогов";
sTxtSaveHistory  = "Сохранить историю при выходе";
sTxtAddAssoc     = "Добавить внутренние ассоциации";
sTxtModAssoc     = "Изменить ассоциацию";
sTxtDelAssoc     = "Удалить ассоциацию";
sTxtCleAssoc     = "Очистить список ассоциаций";
sTxtFileExtSep   = "Расширения файлов через запятую";
sTxtAssocExists  = "Ассоциация уже существует."
sTxtWantDelAssoc = "Вы хотите удалить внутреннюю ассоциацию файлов?";
sTxtWantCleAssoc = "Вы хотите удалить все внутренние ассоциации файлов?";
sTxtOpenInAssoc  = "Открыть (внутр. ассоц.)";
sTxtWait         = "Пожалуйста, подождите ...";

//Menu
sTxtFile         = "Файл";
sTxtDrive        = "Диск";
sTxtDirectory    = "Каталог";
sTxtShow         = "Вид";
sTxtWindow       = "Окно";
sTxtApplications = "Команды";
sTxtRun          = "Запуск";
sTxtExit         = "Выход";
sTxtProperties   = "Свойства";
sTxtCopyNames    = "Копировать в буфер...";
sTxtPath         = "Путь";
sTxtStream       = "Поток";
sTxtFilesList    = "Список файлов в каталоге";
sTxtStreamsList  = "Список потоков в файл";
sTxtLeftPanel    = "Левая панель";
sTxtRightPanel   = "Правая панель";
sTxtGoToParent   = "В родительский";
sTxtGoToSubDir   = "В подкаталог";
sTxtGoToMain     = "В корневой";
sTxtFavFolders   = "Избранные папки";
sTxtSpecFolders  = "Специальные папки";
sTxtHistory      = "История";
sTxtUndo         = "Назад";
sTxtRedo         = "Вперёд";
sTxtRightToLeft  = "Справа налево";
sTxtLeftToRight  = "Слева направо";
sTxtSwapPanels   = "Поменять панели";
sTxtQuickView    = "Быстрый просмотр";
sTxtColumns      = "Колонки";
sTxtOnlyName     = "Только имя";
sTxtAttributes   = "Атрибуты";
sTxtMoveLeft     = "Переместить влево";
sTxtMoveRight    = "Переместить вправо";
sTxtMoveUp       = "Переместить вверх";
sTxtMoveDown     = "Переместить вниз";
sTxtToLeftEdge   = "По левому краю";
sTxtToRightEdge  = "По правому краю";
sTxtToTopEdge    = "По верхнему краю";
sTxtToBottomEdge = "По нижнему краю";
sTxtCenter       = "По центру";
sTxtMaximize     = "Развернуть/Вернуть";
sTxtViewer       = "Просмотр";
sTxtEditor       = "Правка";
sTxtComparer     = "Сравнить";
sTxtCommandLine  = "Командная строка";
sTxtAkelScript   = "Скрипт AkelPad";
sTxtWithoutArgs  = "Без аргументов";
sTxtWithArgs     = "С аргументами";
- Russian - by Andrey_A_A

Code: Select all

/**************************************
FileAndStream.js ver. 2015-01-07
Interface language
Language:      ChineseSimplified (2052)
Translated by: cnnnc
**************************************/
sTxtFilter       = "筛选";
sTxtFileName     = "文件名";
sTxtStrName      = "NTFS 数据流名";
sTxtSize         = "大小";
sTxtTime         = "时间";
sTxtAttrib       = "属性";
sTxtOpenWin      = "打开 (Windows)";
sTxtMenu         = "菜单";
sTxtRename       = "重命名";
sTxtView         = "查看";
sTxtEdit         = "编辑";
sTxtCopy         = "复制";
sTxtToSecPanel   = "到第二个窗格";
sTxtToOwnPanel   = "到其所属窗格";
sTxtMove         = "移动";
sTxtCreate       = "创建";
sTxtDelete       = "删除";
sTxtRefresh      = "刷新";
sTxtCompare      = "比较";
sTxtNoFiles      = "<无文件>";
sTxtNoStreams    = "<无数据流>";
sTxtNoSupport    = "<驱动器未支持 NTFS 数据流>";
sTxtMainStream   = "<未命名 - 主数据流>";
sTxtNoDrive      = "驱动器不可用。请选择其它驱动器。";
sTxtNoDirRefr    = "目录不存在。将刷新文件列表。";
sTxtNoFileRefr   = "文件不存在。将刷新文件列表。";
sTxtNoStreamRefr = "数据流不存在。将刷新数据流列表。";
sTxtNoDirAcc     = "拒绝访问此目录。";
sTxtNoExists     = "不存在。";
sTxtDirNoExists  = "目录不存在。";
sTxtFileNoExists = "文件不存在。";
sTxtDirExists    = "目录已经存在。";
sTxtFileExists   = "文件已经存在。";
sTxtStrExists    = "数据流已经存在。";
sTxtNameExists   = "名称已经存在。";
sTxtRenDir       = "重命名目录";
sTxtRenFile      = "重命名文件";
sTxtRenStr       = "重命名数据流";
sTxtRenFail      = "重命名失败。";
sTxtNewName      = "新名称:";
sTxtCopDir       = "复制目录";
sTxtCopFile      = "复制文件";
sTxtCopStr       = "复制数据流";
sTxtCopFail      = "复制失败。";
sTxtMovDir       = "移动目录";
sTxtMovFile      = "移动文件";
sTxtMovStr       = "移动数据流";
sTxtMovFail      = "移动失败。";
sTxtWantReplace  = "已经存在。是否想要替换?";
sTxtDirToSubdir  = "你不能 复制/移动 目录到其子目录。";
sTxtFileToStr    = "你不能 移动 文件到其所属的数据流。";
sTxtCreDir       = "创建新目录";
sTxtCreFile      = "创建新文件";
sTxtCreStr       = "创建新数据流";
sTxtCreFail      = "创建失败。";
sTxtInpName      = "请输入名称:";
sTxtDelDir       = "从磁盘上删除目录";
sTxtDelDirToBin  = "删除目录到回收站";
sTxtDelFile      = "从磁盘上删除文件";
sTxtDelFileToBin = "删除文件到回收站";
sTxtDelStr       = "删除数据流";
sTxtDelFail      = "删除失败。";
sTxtWantDelete   = "是否想要删除?";
sTxtToRecBin     = "到回收站";
sTxtFromDisk     = "从磁盘";
sTxtTo           = "到:";
sTxtToFile       = "到文件:";
sTxtToStream     = "到数据流:";
sTxtBadName      = "非法名称。";
sTxtBadChar      = "名称中含有非法字符。";
sTxtRunScript    = "运行 AkelPad 脚本";
sTxtJsVbsOnly    = "仅可以运行扩展为 .JS 或 .VBS 的文件";
sTxtNoRunScript  = "只能运行 AkelPad 安装所在的驱动器上的 AkelPad 脚本。";
sTxtInpArgs      = "请输入参数:";
sTxtNoFileProp   = "错误: 无法显示文件属性。";
sTxtSetViewer    = "设置外置文件查看器";
sTxtSetEditor    = "设置外置编辑器";
sTxtSetComparer  = "设置外置文件比较器";
sTxtDispName     = "显示名称";
sTxtFullName     = "带完整路径的可执行文件名";
sTxtAkelDir      = "AkelPad 目录";
sTxtEnvVar       = "环境变量";
sTxtAddPar       = "附加参数:";
sTxtMustSpecify  = "您必须指定";
sTxtFavorites    = "收藏夹";
sTxtAddFavorite  = "添加收藏";
sTxtModFavorite  = "修改收藏";
sTxtDelFavorite  = "删除收藏";
sTxtCleFavorite  = "清除收藏列表";
sTxtWantDelFav   = "是否想要从收藏中删除?";
sTxtWantCleFavAp = "是否想要删除所有收藏的程序?";
sTxtWantCleFavFo = "是否想要删除所有收藏夹?";
sTxtOpenInFavor  = "打开方式";
sTxtGoToFavFold  = "转到收藏夹";
sTxtCleHistory   = "清除历史目录";
sTxtSaveHistory  = "退出时保存历史";
sTxtAddAssoc     = "添加内部关联";
sTxtModAssoc     = "修改关联";
sTxtDelAssoc     = "删除关联";
sTxtCleAssoc     = "清除关联列表";
sTxtFileExtSep   = "文件名扩展以逗号分隔";
sTxtAssocExists  = "已经存在关联。";
sTxtWantDelAssoc = "是否想要删除文件的内部关联?";
sTxtWantCleAssoc = "是否想要删除所有文件的内部关联?";
sTxtOpenInAssoc  = "打开 (内部关联)";
sTxtWait         = "请稍候...";

//Menu
sTxtFile         = "文件";
sTxtDrive        = "驱动器";
sTxtDirectory    = "目录";
sTxtShow         = "显示";
sTxtWindow       = "窗口";
sTxtApplications = "程序";
sTxtRun          = "运行";
sTxtExit         = "退出";
sTxtProperties   = "属性";
sTxtCopyNames    = "复制名称";
sTxtPath         = "路径";
sTxtStream       = "数据流";
sTxtFilesList    = "目录中的文件列表";
sTxtStreamsList  = "文件中的数据流列表";
sTxtLeftPanel    = "左窗";
sTxtRightPanel   = "右窗";
sTxtGoToParent   = "转到上一层";
sTxtGoToSubDir   = "转到下一层";
sTxtGoToMain     = "转到根目录";
sTxtFavFolders   = "收藏夹";
sTxtSpecFolders  = "特殊文件夹";
sTxtHistory      = "历史";
sTxtUndo         = "撤消";
sTxtRedo         = "恢复";
sTxtRightToLeft  = "右 -> 左";
sTxtLeftToRight  = "左 -> 右";
sTxtSwapPanels   = "交换窗口";
sTxtQuickView    = "快速查看";
sTxtColumns      = "列";
sTxtOnlyName     = "仅名称";
sTxtAttributes   = "属性";
sTxtMoveLeft     = "左移";
sTxtMoveRight    = "右移";
sTxtMoveUp       = "上移";
sTxtMoveDown     = "下移";
sTxtToLeftEdge   = "到左边缘";
sTxtToRightEdge  = "到右边缘";
sTxtToTopEdge    = "到顶边缘";
sTxtToBottomEdge = "到底边缘";
sTxtCenter       = "居中";
sTxtMaximize     = "最大化";
sTxtViewer       = "查看器";
sTxtEditor       = "编辑器";
sTxtComparer     = "比较器";
sTxtCommandLine  = "命令提示符";
sTxtAkelScript   = "AkelPad 脚本";
sTxtWithoutArgs  = "无参数";
sTxtWithArgs     = "带参数";
- ChineseSimplified - by cnnnc
Last edited by KDJ on Wed Jan 07, 2015 8:11 pm, edited 21 times in total.

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

Post by Infocatcher »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=17270#p17270
// http://infocatcher.ucoz.net/js/akelpad_scripts/moveResizeWindow.js
// https://github.com/Infocatcher/AkelPad_scripts/blob/master/moveResizeWindow.js

// (c) Infocatcher 2012-2020
// Version: 0.1.3 - 2020-07-27
// Author: Infocatcher

//// Move or/and align AkelPad's main window

// Icons for context menu:
//   http://infocatcher.ucoz.net/js/akelpad_scripts/moveResizeWindow_icons.zip
//   or https://github.com/Infocatcher/AkelPad_menu/tree/master/icons window_*.ico + window.xcf
//   (based on Actual Window Manager's icons: http://www.actualtools.com/windowmanager/)

// Arguments:
//   -resize={width}*{height}
//          =800*600          - resize window to 800 x 600
//          =100%*            - resize window to 100% of work area width
//          =*100%            - resize window to 100% of work area height
//          =100%*100%        - resize window to work area (like maximize)
//   -move={x}*{y}
//        =center*center      - move window to center of work area
//        =left*top           - move window to top left corner of work area
//        =right*top          - move window to top right corner of work area
//        =left*bottom        - move window to bottom left corner of work area
//        =right*bottom       - move window to bottom right corner of work area
//        =left*              - move window to left side of work area
//        =50%*               - move window to 50% of work area width
//        =*50%               - move window to 50% of work area height
//        =10*150             - move to x=10, y=150
//   -allowRestore=true       - allow save last used size and position and restore them after second call

// Note: use "%%" to specify "%" in ContextMenu ant Toolbar

// Usage:
//   -"Stretch to width" Call("Scripts::Main", 1, "moveResizeWindow.js", "-resize=100%%* -move=left*")
//   -"Move down and left + 1280x720" Call("Scripts::Main", 1, "moveResizeWindow.js", "-resize=1280*720 -move=left*bottom")

var hMainWnd = AkelPad.GetMainWnd();
var oSys = AkelPad.SystemFunction();

if(hMainWnd && !AkelPad.IsInclude()) {
	var resize = AkelPad.GetArgValue("resize", "");
	var move   = AkelPad.GetArgValue("move",   "");

	var allowRestore = AkelPad.GetArgValue("allowRestore", true);
	if(allowRestore)
		var pos = getWindowPos(hMainWnd);
	var changed = false;
	if(resize)
		resizeWindow(hMainWnd, resize) && (changed = true);
	if(move)
		moveWindow(hMainWnd, move) && (changed = true);
	if(allowRestore) {
		if(changed)
			saveWindowPos("main", hMainWnd, pos);
		else
			restoreWindowPos("main", hMainWnd);
	}
}

function resizeWindow(hWnd, resize, hWndParent) {
	var tokens = resize.split("*");
	var rsW = tokens[0];
	var rsH = tokens[1];

	var rcWnd = getWindowRect(hWnd);
	var rcWork = hWndParent
		? getWindowRect(hWndParent)
		: getWorkArea(hWnd);
	if(!rcWnd || !rcWork)
		return;

	var ww = rcWork.right - rcWork.left;
	var wh = rcWork.bottom - rcWork.top;

	var w = rcWnd.right - rcWnd.left;
	var h = rcWnd.bottom - rcWnd.top;

	if(isPersent(rsW))
		rsW = Math.round(parseFloat(rsW)/100*ww);
	else if(!rsW)
		rsW = w;
	else
		rsW = parseInt(rsW);

	if(isPersent(rsH))
		rsH = Math.round(parseFloat(rsH)/100*wh);
	else if(!rsH)
		rsH = h;
	else
		rsH = parseInt(rsH);

	rsW = Math.min(ww, rsW);
	rsH = Math.min(wh, rsH);

	if(rsW == w && rsH == h)
		return false;
	return setWindowPos(hWnd, null, null, rsW, rsH);
}
function moveWindow(hWnd, move, hWndParent) {
	var tokens = move.split("*");
	var mvX = tokens[0];
	var mvY = tokens[1];

	var rcWnd = getWindowRect(hWnd);
	var rcWork = hWndParent
		? getWindowRect(hWndParent)
		: getWorkArea(hWnd);
	if(!rcWnd || !rcWork)
		return;

	var w = rcWnd.right - rcWnd.left;
	var h = rcWnd.bottom - rcWnd.top;

	if     (mvX == "left")   mvX = rcWork.left;
	else if(mvX == "center") mvX = centerX(rcWnd, rcWork);
	else if(mvX == "right")  mvX = rcWork.right - w;
	else if(!mvX)            mvX = rcWnd.left;
	else if(isPersent(mvX))  mvX = parseFloat(mvX)/100*(rcWork.right - rcWork.left);
	else                     mvX = parseInt(mvX);

	if     (mvY == "top")    mvY = rcWork.top;
	else if(mvY == "center") mvY = centerY(rcWnd, rcWork);
	else if(mvY == "bottom") mvY = rcWork.bottom - h;
	else if(!mvY)            mvY = rcWnd.top;
	else if(isPersent(mvY))  mvY = parseFloat(mvY)/100*(rcWork.bottom - rcWork.top);
	else                     mvY = parseInt(mvY);

	mvX = Math.round(Math.max(rcWork.left, Math.min(rcWork.right - w,  mvX)));
	mvY = Math.round(Math.max(rcWork.top,  Math.min(rcWork.bottom - h, mvY)));

	if(mvX == rcWnd.left && mvY == rcWnd.top)
		return false;
	return setWindowPos(hWnd, mvX, mvY, null, null);
}
function centerX(rcWnd, rcWndParent) {
	return rcWndParent.left + ((rcWndParent.right - rcWndParent.left)/2 - (rcWnd.right - rcWnd.left)/2);
}
function centerY(rcWnd, rcWndParent) {
	return rcWndParent.top + ((rcWndParent.bottom - rcWndParent.top)/2 - (rcWnd.bottom - rcWnd.top)/2);
}
function isPersent(s) {
	return s.slice(-1) == "%";
}

function getWindowPos(hWnd) {
	var rcWnd = getWindowRect(hWnd);
	if(!rcWnd)
		return false;
	if(oSys.Call("user32::IsZoomed", hWnd))
		return "maximized";
	return rcWnd.left + "x" + rcWnd.top + "|"
		+ (rcWnd.right - rcWnd.left) + "x" + (rcWnd.bottom - rcWnd.top);
}
function saveWindowPos(windowId, hWnd, pos) {
	if(!pos)
		pos = getWindowPos(hWnd);
	if(!pos)
		return;

	var oSet = AkelPad.ScriptSettings();
	if(!oSet.Begin(WScript.ScriptBaseName, 0x2 /*POB_SAVE*/))
		return false;

	oSet.Write(windowId, 3 /*PO_STRING*/, pos);
	return oSet.End();
}
function restoreWindowPos(windowId, hWnd) {
	var oSet = AkelPad.ScriptSettings();
	if(!oSet.Begin(WScript.ScriptBaseName, 0x1 /*POB_READ*/))
		return false;

	var pos = oSet.Read(windowId, 3 /*PO_STRING*/, "");
	oSet.End();

	if(pos == "maximized")
		return oSys.Call("user32::ShowWindow", hWnd, 3 /*SW_MAXIMIZE*/);
	if(!/^(\d+)x(\d+)\|(\d+)x(\d+)$/.test(pos))
		return false;

	var x = +RegExp.$1;
	var y = +RegExp.$2;
	var w = +RegExp.$3;
	var h = +RegExp.$4;
	return setWindowPos(hWnd, x, y, w, h);
}

function getWorkArea(hWnd) {
	var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
	if(!lpRect)
		return null;
	oSys.Call("user32::GetWindowRect", hWnd, lpRect);

	var hMonitor = oSys.Call("user32::MonitorFromRect", lpRect, 0x2 /*MONITOR_DEFAULTTONEAREST*/);

	if(hMonitor) {
		//typedef struct tagMONITORINFO {
		//  DWORD cbSize;
		//  RECT  rcMonitor;
		//  RECT  rcWork;
		//  DWORD dwFlags;
		//} MONITORINFO, *LPMONITORINFO;
		var sizeofMonitorInfo = 4 + 16 + 16 + 4;
		var lpMi = AkelPad.MemAlloc(sizeofMonitorInfo);
		if(lpMi) {
			AkelPad.MemCopy(lpMi, sizeofMonitorInfo, 3 /*DT_DWORD*/);
			oSys.Call("user32::GetMonitorInfo" + _TCHAR, hMonitor, lpMi);
			var rcWork = parseRect(_PtrAdd(lpMi, 4 + 16));
			AkelPad.MemFree(lpMi);
		}
	}
	else { //?
		oSys.Call("user32::SystemParametersInfo" + _TCHAR, 48 /*SPI_GETWORKAREA*/, 0, lpRect, 0);
		var rcWork = parseRect(lpRect);
	}
	AkelPad.MemFree(lpRect);
	return rcWork;
}
function setWindowPos(hWnd, x, y, w, h) {
	var flags = 0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/
		| (x === null || y === null ? 0x2 /*SWP_NOMOVE*/ : 0)
		| (w === null || h === null ? 0x1 /*SWP_NOSIZE*/ : 0);
	ensureRestored(hWnd);
	return oSys.Call("user32::SetWindowPos", hWnd, 0, x, y, w, h, flags);
}
function ensureRestored(hWnd) {
	// Also exit from Windows 7+ docked to half screen state
	//if(oSys.Call("user32::IsZoomed", hWnd))
	oSys.Call("user32::ShowWindow", hWnd, 9 /*SW_RESTORE*/);
}
function getWindowRect(hWnd, hWndParent) {
	var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
	getRect: if(lpRect) {
		if(!oSys.Call("user32::GetWindowRect", hWnd, lpRect))
			break getRect;
		if(hWndParent && !oSys.Call("user32::ScreenToClient", hWndParent, lpRect))
			break getRect;
		var rcWnd = parseRect(lpRect);
	}
	lpRect && AkelPad.MemFree(lpRect);
	return rcWnd;
}
function parseRect(lpRect) {
	return {
		left:   AkelPad.MemRead(_PtrAdd(lpRect,  0), 3 /*DT_DWORD*/),
		top:    AkelPad.MemRead(_PtrAdd(lpRect,  4), 3 /*DT_DWORD*/),
		right:  AkelPad.MemRead(_PtrAdd(lpRect,  8), 3 /*DT_DWORD*/),
		bottom: AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/)
	};
}
<download | development version>
Move or/and align AkelPad's main window

Image

Code: Select all

  "В&ыровнять"
  {
    -"&Вверх влево"      Call("Scripts::Main", 1, "moveResizeWindow.js", "-move=left*top")      Icon("%a\AkelFiles\Plugs\icons\window_align_left-top.ico", 0)
    -"&Вверх"            Call("Scripts::Main", 1, "moveResizeWindow.js", "-move=center*top")    Icon("%a\AkelFiles\Plugs\icons\window_align_center-top.ico", 0)
    -"&Вверх вправо"     Call("Scripts::Main", 1, "moveResizeWindow.js", "-move=right*top")     Icon("%a\AkelFiles\Plugs\icons\window_align_right-top.ico", 0)
    SEPARATOR                                                                                                                             
    -"По &центру влево"  Call("Scripts::Main", 1, "moveResizeWindow.js", "-move=left*center")   Icon("%a\AkelFiles\Plugs\icons\window_align_left-center.ico", 0)
    -"По &центру"        Call("Scripts::Main", 1, "moveResizeWindow.js", "-move=center*center") Icon("%a\AkelFiles\Plugs\icons\window_align_center-center.ico", 0)
    -"По &центру вправо" Call("Scripts::Main", 1, "moveResizeWindow.js", "-move=right*center")  Icon("%a\AkelFiles\Plugs\icons\window_align_right-center.ico", 0)
    SEPARATOR                                                                                                                             
    -"В&низ влево"       Call("Scripts::Main", 1, "moveResizeWindow.js", "-move=left*bottom")   Icon("%a\AkelFiles\Plugs\icons\window_align_left-bottom.ico", 0)
    -"В&низ по центру"   Call("Scripts::Main", 1, "moveResizeWindow.js", "-move=center*bottom") Icon("%a\AkelFiles\Plugs\icons\window_align_center-bottom.ico", 0)
    -"В&низ вправо"      Call("Scripts::Main", 1, "moveResizeWindow.js", "-move=right*bottom")  Icon("%a\AkelFiles\Plugs\icons\window_align_right-bottom.ico", 0)
  }
  "Рас&тянуть"
  {
    -"В&низ влево + 1280x720" Call("Scripts::Main", 1, "moveResizeWindow.js", "-resize=1280*720 -move=left*bottom")
    SEPARATOR
    -"Растянуть по &ширине" Call("Scripts::Main", 1, "moveResizeWindow.js", "-resize=100%%* -move=left*") Icon("%a\AkelFiles\Plugs\icons\window_stretch_width.ico", 0)
    -"Растянуть по &высоте" Call("Scripts::Main", 1, "moveResizeWindow.js", "-resize=*100%% -move=*top")  Icon("%a\AkelFiles\Plugs\icons\window_stretch_height.ico", 0)
  }
Last edited by Infocatcher on Mon Jul 27, 2020 8:07 pm, edited 3 times in total.

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

Post by Infocatcher »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=17271#p17271
// http://infocatcher.ucoz.net/js/akelpad_scripts/tileTabs.js
// https://github.com/Infocatcher/AkelPad_scripts/blob/master/tileTabs.js

// (c) Infocatcher 2012-2022
// Version: 0.1.5 - 2022-03-21
// Author: Infocatcher

//// Tile current tab with next selected
// select first tab, call script and then select second tab.
// Required MDI window mode and timer.js library!
// https://github.com/Infocatcher/AkelPad_scripts/blob/master/Include/timer.js
// (or use -noBlink=true argument to work without timer.js)

// Arguments:
//   h                      - tile horizontal
//   o                      - preserve tabs order
//   -noBlink=true          - disable blink in status bar (and just show "Select tab!" text)
//   -item="%m:%i"          - set checked state of toolbar button or menu item

// Usage:
//   Call("Scripts::Main", 1, "tileTabs.js")         - tile vertical
//   Call("Scripts::Main", 1, "tileTabs.js", "o")    - tile vertical and preserve tabs order
//   Call("Scripts::Main", 1, "tileTabs.js", "h")    - tile horizontal
//   Call("Scripts::Main", 1, "tileTabs.js", "h o")  - tile horizontal and preserve tabs order
// Example for Toolbar or ContextMenu plugins:
//   Call("Scripts::Main", 1, "tileTabs.js", 'h o -item="%m:%i"')

function _localize(s) {
	var strings = {
		"No tabs!": {
			ru: "Отсутствуют вкладки!"
		},
		"MDI window mode required!": {
			ru: "Требуется оконный режим MDI!"
		},
		"Select tab!": {
			ru: "Выберите вкладку!"
		}
	};
	var lng = "en";
	switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
		case 0x19: lng = "ru";
	}
	_localize = function(s) {
		return strings[s] && strings[s][lng] || s;
	};
	return _localize(s);
}

var hScript = AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/);
if(hScript && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/)) {
	// Script is running, second call close it
	AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
	WScript.Quit();
}

var hMainWnd = AkelPad.GetMainWnd();
var oSys = AkelPad.SystemFunction();

if(
	hMainWnd
	&& AkelPad.IsMDI() == 1 /*WMD_MDI*/
) {
	var hMdiClient = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 12 /*MI_WNDMDICLIENT*/, 0);
	if(!hMdiClient) {
		AkelPad.MessageBox(hMainWnd, "Can't get hMdiClient!", WScript.ScriptName, 16 /*MB_ICONERROR*/);
		WScript.Quit();
	}
	var lpFrame = AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
	var lpFrame2;
	if(!lpFrame) {
		AkelPad.MessageBox(hMainWnd, _localize("No tabs!"), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
		WScript.Quit();
	}

	var item = new Item();
	item.check(true);

	var statusbar = new Statusbar();
	statusbar.save();
	var statusMsg = _localize("Select tab!");
	statusbar.set(statusMsg);

	if(
		!AkelPad.GetArgValue("noBlink", false)
		&& AkelPad.Include("timer.js")
	) {
		var showDelay = 600;
		var hideDelay = 150;
		// show -> [showDelay] -> hide -> [hideDelay] -> show -> [showDelay] -> hide
		var timerHide = setTimeout(function() {
			statusbar.set("");
			clearTimeout(timerHide);
			timerHide = setInterval(function() {
				statusbar.set("");
			}, showDelay + hideDelay, timerHide);
		}, showDelay);
		var timerShow = setInterval(function() {
			statusbar.set(statusMsg);
		}, showDelay + hideDelay);
		var stopTimers = function() {
			clearInterval(timerHide);
			clearInterval(timerShow);
		};
	}

	if(
		AkelPad.WindowSubClass(
			1 /*WSC_MAINPROC*/,
			mainCallback,
			0x416 /*AKDN_FRAME_ACTIVATE*/,
			0x418 /*AKDN_FRAME_DESTROY*/
		)
	) {
		AkelPad.ScriptNoMutex(); // Allow other scripts running
		AkelPad.WindowGetMessage(); // Message loop
		AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);

		stopTimers && stopTimers();
		statusbar.restore();
		if(lpFrame2) {
			var tileHorizontal, useTabsOrder;
			for(var i = 0, l = WScript.Arguments.length; i < l; ++i) {
				switch(WScript.Arguments(i)) {
					case "h": tileHorizontal = true; break;
					case "o": useTabsOrder = true;
				}
			}
			tileTabs(lpFrame, lpFrame2, tileHorizontal, useTabsOrder);
		}
	}
	else {
		stopTimers && stopTimers();
		statusbar && statusbar.restore();
		AkelPad.MessageBox(hMainWnd, "AkelPad.WindowSubClass(WSC_MAINPROC) failed!", WScript.ScriptName, 16 /*MB_ICONERROR*/);
	}
	item.check(false);
}
else {
	AkelPad.MessageBox(hMainWnd, _localize("MDI window mode required!"), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
}
function mainCallback(hWnd, uMsg, wParam, lParam) {
	if(uMsg == 0x416 /*AKDN_FRAME_ACTIVATE*/) {
		if(lParam != lpFrame) {
			lpFrame2 = lParam;
			oSys.Call("user32::PostQuitMessage", 0); // Exit message loop
		}
	}
	else if(uMsg == 0x418 /*AKDN_FRAME_DESTROY*/) {
		if(lParam == lpFrame)
			oSys.Call("user32::PostQuitMessage", 0); // Exit message loop
	}
}

function tileTabs(lpFrame, lpFrame2, tileHorizontal, useTabsOrder, _lpRect) {
	var hWndMdi  = AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 1 /*FI_WNDEDITPARENT*/, lpFrame);
	var hWndMdi2 = AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 1 /*FI_WNDEDITPARENT*/, lpFrame2);

	if(useTabsOrder) {
		var pos  = AkelPad.SendMessage(hMainWnd, 1294 /*AKD_FRAMEINDEX*/, 0, lpFrame);
		var pos2 = AkelPad.SendMessage(hMainWnd, 1294 /*AKD_FRAMEINDEX*/, 0, lpFrame2);
		if(pos2 < pos) {
			var tmp = hWndMdi;
			hWndMdi = hWndMdi2;
			hWndMdi2 = tmp;
		}
	}

	AkelPad.SendMessage(hMdiClient, 0x0223 /*WM_MDIRESTORE*/, hWndMdi2, 0);
	AkelPad.SendMessage(hMdiClient, 0x0223 /*WM_MDIRESTORE*/, hWndMdi, 0);

	var lpRect = _lpRect || AkelPad.MemAlloc(16 /*sizeof(RECT)*/);
	if(!lpRect)
		return;
	var rcClient = oSys.Call("user32::GetClientRect", hMdiClient, lpRect)
		&& parseRect(lpRect);
	if(!rcClient) {
		AkelPad.MemFree(lpRect);
		return;
	}

	var w = rcClient.right - rcClient.left;
	var h = rcClient.bottom - rcClient.top;

	if(h < 2)
		h = 2;
	if(w < 2)
		w = 2;

	if(tileHorizontal) {
		var h1 = Math.floor(h/2);
		var h2 = h - h1;
		moveMdiWindow(hWndMdi,  rcClient.left, rcClient.top,      w, h1);
		moveMdiWindow(hWndMdi2, rcClient.left, rcClient.top + h1, w, h2);
	}
	else {
		var w1 = Math.floor(w/2);
		var w2 = w - w1;
		moveMdiWindow(hWndMdi,  rcClient.left,      rcClient.top, w1, h);
		moveMdiWindow(hWndMdi2, rcClient.left + w1, rcClient.top, w2, h);
	}
	oSys.Call("user32::InvalidateRect", AkelPad.GetEditWnd(), 0, true);

	var maxWait = 250, step = 10, maxN = (maxWait/step)|0;
	if(!_lpRect) for(var i = 1; i <= maxN; ++i) {
		WScript.Sleep(step); // Wait for changes...

		var rcClient2 = oSys.Call("user32::GetClientRect", hMdiClient, lpRect)
			&& parseRect(lpRect);
		if(!rcClient2)
			break;
		var w2 = rcClient2.right - rcClient2.left;
		var h2 = rcClient2.bottom - rcClient2.top;

		if(w2 != w || h2 != h) {
			tileTabs(lpFrame, lpFrame2, tileHorizontal, useTabsOrder, lpRect);
			break;
		}
	}
	AkelPad.MemFree(lpRect);
}
function moveMdiWindow(hWndMdi, x, y, w, h) {
	oSys.Call("user32::MoveWindow", hWndMdi, x, y, w, h, true /*bRepaint*/);
}
function parseRect(lpRect) {
	return {
		left:   AkelPad.MemRead(_PtrAdd(lpRect,  0), 3 /*DT_DWORD*/),
		top:    AkelPad.MemRead(_PtrAdd(lpRect,  4), 3 /*DT_DWORD*/),
		right:  AkelPad.MemRead(_PtrAdd(lpRect,  8), 3 /*DT_DWORD*/),
		bottom: AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/)
	};
}

function Item() {
	this.check = function() {};
	// "%m:%i" (legacy: "menu:%m:%i" or "toolbar:%m:%i")
	var itemData = AkelPad.GetArgValue("item", "").split(":");
	if(itemData[0] == "menu" || itemData[0] == "toolbar") // Legacy
		itemData.shift();
	if(itemData.length != 2)
		return;
	var hHandle = +itemData[0];
	var nItemID = +itemData[1];
	if(!hHandle || !nItemID)
		return;
	this.check = function(checked) {
		if(oSys.Call("User32::IsMenu", hHandle)) {
			var cmd = checked ? 0x8 /*MF_BYCOMMAND|MF_CHECKED*/ : 0 /*MF_BYCOMMAND|MF_UNCHECKED*/;
			oSys.call("user32::CheckMenuItem", hHandle, nItemID, cmd);
		}
		else {
			AkelPad.SendMessage(hHandle, 1026 /*TB_CHECKBUTTON*/, nItemID, checked);
		}
	};
}
function Statusbar() {
	this.get = this.set = this.save = this.restore = this.destroy = function() {};

	// Based on Instructor's code: http://akelpad.sourceforge.net/forum/viewtopic.php?p=13656#p13656
	var hWndStatus = oSys.Call("user32::GetDlgItem", hMainWnd, 10002 /*ID_STATUS*/);
	if(!hWndStatus || !oSys.Call("user32::IsWindowVisible", hWndStatus))
		return;
	var nParts = AkelPad.SendMessage(hWndStatus, 1030 /*SB_GETPARTS*/, 0, 0);
	if(nParts <= 5)
		return;
	var lpTextBuffer = AkelPad.MemAlloc(1024 * _TSIZE);
	if(!lpTextBuffer)
		return;
	var _origStatus, _customStatus;
	this.get = function() {
		AkelPad.SendMessage(hWndStatus, _TSTR ? 1037 /*SB_GETTEXTW*/ : 1026 /*SB_GETTEXTA*/, nParts - 1, lpTextBuffer);
		return AkelPad.MemRead(lpTextBuffer, _TSTR);
	};
	this.set = function(pStatusText) {
		_customStatus = pStatusText;
		AkelPad.MemCopy(lpTextBuffer, pStatusText, _TSTR);
		AkelPad.SendMessage(hWndStatus, _TSTR ? 1035 /*SB_SETTEXTW*/ : 1025 /*SB_SETTEXTA*/, nParts - 1, lpTextBuffer);
	};
	this.save = function() {
		_origStatus = this.get();
	};
	this.restore = function() {
		if(_origStatus != undefined && this.get() == _customStatus)
			this.set(_origStatus);
		this.destroy();
	};
	this.destroy = function() {
		AkelPad.MemFree(lpTextBuffer);
	};
}
<download | development version>
Tile current tab with next selected: select first tab, call script and then select second tab.
Required MDI window mode and timer.js library!
Last edited by Infocatcher on Mon Mar 21, 2022 7:31 pm, edited 4 times in total.

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

Post by KDJ »

Operations on the text from plugins: Coder, ContextMenu, Hotkeys, SpecialChar and ToolBar.
The text is read from plugin settings (.ini file or registry).
For syntax highlighting uses: akelmenu.coder by Infocatcher.

This is extended version of the script: PlugTextReadFromIni.js

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=17303#p17303
// Version: 2016-06-05
// Author: KDJ
//
// *** Operations on the text from plugins: Coder, ContextMenu, Hotkeys, SpecialChar and ToolBar* ***
//
// Usage:
//   Call("Scripts::Main", 1, "PluginText.js")
//
// Keyboard and mouse:
//   Ctrl+A - select all items on list
//   double click on list item - edit plugin text, if text is opened in current tab - close it
//
// Remarks:
//   The script should be saved in Unicode format.
//   The text is read from plugin settings (.ini file or registry).
//   For the syntax highlighting uses akelmenu.coder by Infocatcher: http://infocatcher.ucoz.net/akelpad/coder/_akelmenu.coder

var oSys     = AkelPad.SystemFunction();
var hMainWnd = AkelPad.GetMainWnd();
var hInstDLL = AkelPad.GetInstanceDll();
var sClass   = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstDLL;

GetLangStrings();

if (IsScriptRunning() || IsSDI())
  WScript.Quit();

var DT_UNICODE = 1;
var DT_QWORD   = 2;
var DT_DWORD   = 3;
var DT_WORD    = 4;
var DT_BYTE    = 5;

var oFSO      = new ActiveXObject("Scripting.FileSystemObject");
var bSetInReg = (SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 5 /*MI_SAVESETTINGS*/, 0) == 1 /*SS_REGISTRY*/);
var nBufSize  = 1024;
var lpBuffer  = AkelPad.MemAlloc(nBufSize);
var lpLVITEM  = AkelPad.MemAlloc(_X64 ? 72 : 60); //sizeof(LVITEM)

AkelPad.MemCopy(lpLVITEM, 0x0001 /*LVIF_TEXT*/, DT_DWORD);
AkelPad.MemCopy(_PtrAdd(lpLVITEM, _X64 ? 24 : 20), lpBuffer, DT_QWORD);
AkelPad.MemCopy(_PtrAdd(lpLVITEM, _X64 ? 32 : 24), nBufSize, DT_DWORD);

var nWndMinW  = 500;
var nWndMinH  = 262;
var nWndPosX  = 240;
var nWndPosY  = 160;
var nWndPosW  = 0;
var nWndPosH  = 0;
var oPlugText = {};
var aFrame    = [];
var sTextDirS;
var hDlg;

ReadIni();

var CLASS = 0;
var HWND  = 1;
var STYLE = 2;
var TXT   = 3;

var aDlg   = [];
var IDSET  = 2000;
var IDDIR  = 2001;
var IDPLUG = 2002;
var IDB1   = 2003;
var IDB2   = 2004;
var IDB3   = 2005;
var IDB4   = 2006;
var IDB5   = 2007;
var IDB6   = 2008;
var IDB7   = 2009;
var IDB8   = 2010;
var IDB9   = 2011;

//0x50000000 - WS_VISIBLE|WS_CHILD
//0x50000080 - WS_VISIBLE|WS_CHILD|SS_NOPREFIX
//0x50818009 - WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP|LVS_NOSORTHEADER|LVS_SHOWSELALWAYS|LVS_REPORT
//Windows     CLASS,        HWND,      STYLE, TXT
aDlg[IDSET ]=["STATIC",        0, 0x50000080, bSetInReg ? sTxtSetInReg : sTxtSetInIni];
aDlg[IDDIR ]=["STATIC",        0, 0x50000080, sTxtDir + ExpandDirName(sTextDirS)];
aDlg[IDPLUG]=["SysListView32", 0, 0x50818009, ""];
aDlg[IDB1  ]=["BUTTON",        0, 0x50000000, sTxtEditText + " (F1)"];
aDlg[IDB2  ]=["BUTTON",        0, 0x50000000, sTxtLoadText + " (F2)"];
aDlg[IDB3  ]=["BUTTON",        0, 0x50000000, sTxtSaveTextFile + " (F3)"];
aDlg[IDB4  ]=["BUTTON",        0, 0x50000000, sTxtEditTextFile + " (F4)"];
aDlg[IDB5  ]=["BUTTON",        0, 0x50000000, sTxtLoadTextFile + " (F5)"];
aDlg[IDB6  ]=["BUTTON",        0, 0x50000000, sTxtRenameFile + " (F7)"];
aDlg[IDB7  ]=["BUTTON",        0, 0x50000000, sTxtDeleteFile + " (F8)"];
aDlg[IDB8  ]=["BUTTON",        0, 0x50000000, sTxtChangeDir + " (F9)"];
aDlg[IDB9  ]=["BUTTON",        0, 0x50000000, (bSetInReg ? sTxtOpenRegEdit : sTxtEditIniFile) + " (Shift+F4)"];

if (AkelPad.WindowSubClass(1 /*WSC_MAINPROC*/, MainCallback, 1048 /*AKDN_FRAME_DESTROY*/, 1078 /*AKDN_OPENDOCUMENT_FINISH*/))
{
  AkelPad.ScriptNoMutex();
  AkelPad.WindowRegisterClass(sClass);

  hDlg = oSys.Call("User32::CreateWindowExW",
    0,              //dwExStyle
    sClass,         //lpClassName
    sTxtScriptName, //lpWindowName
    0x90CE0000,     //WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU|WS_SIZEBOX
    nWndPosX,       //x
    nWndPosY,       //y
    nWndPosW,       //nWidth
    nWndPosH,       //nHeight
    hMainWnd,       //hWndParent
    0,              //ID
    hInstDLL,       //hInstance
    DialogCallback);//Script function callback. To use it class must be registered by WindowRegisterClass.

  AkelPad.WindowGetMessage();
  AkelPad.WindowUnregisterClass(sClass);
  AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
}

AkelPad.MemFree(lpBuffer);
AkelPad.MemFree(lpLVITEM);

function MainCallback(hWnd, uMsg, wParam, lParam)
{
  if ((uMsg == 1048 /*AKDN_FRAME_DESTROY*/) || (uMsg == 1078 /*AKDN_OPENDOCUMENT_FINISH*/) && (lParam == 0 /*EOD_SUCCESS*/))
  {
    var lpFrame = (uMsg == 1048 /*AKDN_FRAME_DESTROY*/) ? lParam : SendMessage(hMainWnd, 1290 /*AKD_FRAMEFINDW*/, 1 /*FWF_CURRENT*/, 0);

    for (var i = 0; i < aFrame.length; ++i)
    {
      if (aFrame[i] == lpFrame)
      {
        aFrame[i] = 0;
        break;
      }
    }
  }

  return 0;
}

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  var hGuiFont, nID, i;

  if (uMsg == 1) //WM_CREATE
  {
    hGuiFont = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);

    for (i = IDSET; i < aDlg.length; ++i)
    {
      aDlg[i][HWND] = oSys.Call("User32::CreateWindowExW",
        0,             //dwExStyle
        aDlg[i][CLASS],//lpClassName
        aDlg[i][TXT],  //lpWindowName
        aDlg[i][STYLE],//dwStyle
        0,             //x
        0,             //y
        0,             //nWidth
        0,             //nHeight
        hWnd,          //hWndParent
        i,             //ID
        hInstDLL,      //hInstance
        0);            //lpParam

      SendMessage(aDlg[i][HWND], 48 /*WM_SETFONT*/, hGuiFont, true);
    }

    FillPlugList();

    if (! GetItemCountLV())
    {
      AkelPad.MessageBox(hWnd, sTxtNoTexts, sTxtScriptName, 0x30 /*MB_ICONWARNING*/);
      oSys.Call("User32::DestroyWindow", hWnd);
    }
  }

  else if (uMsg == 7) //WM_SETFOCUS
    oSys.Call("User32::SetFocus", aDlg[IDPLUG][HWND]);

  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 == 5) //WM_SIZE
    ResizeDlg(LoWord(lParam), HiWord(lParam));

  else if (uMsg == 15) //WM_PAINT
    PaintSizeGrip();

  else if (uMsg == 256) //WM_KEYDOWN
  {
    if ((wParam == 0x70 /*VK_F1*/) && (! Ctrl()) && (! Shift()) && (! Alt()))
      EditText(0);
    else if ((wParam == 0x71 /*VK_F2*/) && (! Ctrl()) && (! Shift()) && (! Alt()))
      LoadTextToPlugin();
    else if ((wParam == 0x72 /*VK_F3*/) && (! Ctrl()) && (! Shift()) && (! Alt()))
      EditText(1);
    else if ((wParam == 0x73 /*VK_F4*/) && (! Ctrl()) && (! Alt()))
    {
      if (Shift())
        bSetInReg ? OpenInRegEdit() : EditIniFile();
      else      
        EditTextFile();
    }
    else if ((wParam == 0x74 /*VK_F5*/) && (! Ctrl()) && (! Shift()) && (! Alt()))
      LoadTextToPlugin(1);
    else if ((wParam == 0x76 /*VK_F7*/) && (! Ctrl()) && (! Shift()) && (! Alt()))
      RenameTextFile();
    else if (((wParam == 0x77 /*VK_F8*/) || (wParam == 0x2E /*VK_DELETE*/)) && (! Ctrl()) && (! Alt()))
      DeleteTextFile();
    else if ((wParam == 0x78 /*VK_F9*/) && (! Ctrl()) && (! Shift()) && (! Alt()))
      ChangeTextsDir();
    else if ((wParam == 0x41 /*A key*/) && Ctrl() && (! Shift()) && (! Alt()))
    {
      for (i = 0; i < GetItemCountLV(); ++i)
        SetSelLV(i);
    }
  }

  else if ((uMsg == 0x004E /*WM_NOTIFY*/) && (wParam == IDPLUG))
  {
    switch (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 16 : 8), DT_DWORD))
    {
      case -3 : //NM_DBLCLK
        if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, DT_DWORD) > -1)
        {
          EditText(0, 1);
          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(SendMessage(aDlg[IDPLUG][HWND], 0x100C /*LVM_GETNEXTITEM*/, -1, 0x0001 /*LVNI_FOCUSED*/));
    }
  }

  else if (uMsg == 273) //WM_COMMAND
  {
    nID = LoWord(wParam);

    if ((nID >= IDB1) && (nID <= IDB9))
    {
      SendMessage(lParam, 0x00F4 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 0);

      if (nID == IDB1)
        EditText(0);
      else if (nID == IDB2)
        LoadTextToPlugin();
      else if (nID == IDB3)
        EditText(1);
      else if (nID == IDB4)
        EditTextFile();
      else if (nID == IDB5)
        LoadTextToPlugin(1);
      else if (nID == IDB6)
        RenameTextFile();
      else if (nID == IDB7)
        DeleteTextFile();
      else if (nID == IDB8)
        ChangeTextsDir();
      else if (nID == IDB9)
        bSetInReg ? OpenInRegEdit() : EditIniFile();

      oSys.Call("User32::SetFocus", aDlg[IDPLUG][HWND]);
    }

    else if (nID == 2 /*IDCANCEL*/)
      SendMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 16) //WM_CLOSE
  {
    WriteIni();
    oSys.Call("User32::PostQuitMessage", 0);
    oSys.Call("User32::DestroyWindow", hWnd);
  }

  return 0;
}

function LoWord(nDwNum)
{
  return nDwNum & 0xFFFF;
}

function HiWord(nDwNum)
{
  return (nDwNum >> 16) & 0xFFFF;
}

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 ResizeDlg(nW, nH)
{
  var nFlags = 0x14; //SWP_NOACTIVATE|SWP_NOZORDER
  var nBW    = Math.round((nW - 4 * 8) / 3);
  var i;

  for (i = 0; i < 2; ++i)
  {
    oSys.Call("User32::SetWindowPos",
      aDlg[IDSET + i][HWND], 0,
      8,
      10 + 15 * i,
      nW - 2 * 8,
      13,
      nFlags);
  }
  oSys.Call("User32::SetWindowPos",
    aDlg[IDPLUG][HWND], 0,
    8,
    45,
    nW - 2 * 8,
    nH - 3 * 23 - 2 * 2 - 2 * 8 - 45,
    nFlags);
  for (i = 0; i < 3; ++i)
  {
    oSys.Call("User32::SetWindowPos",
      aDlg[IDB1 + i][HWND], 0,
      8,
      nH - 3 * 23 - 2 * 2 - 8 + 25 * i,
      nBW,
      23,
      nFlags);
    oSys.Call("User32::SetWindowPos",
      aDlg[IDB4 + i][HWND], 0,
      nBW + 2 * 8,
      nH - 3 * 23 - 2 * 2 - 8 + 25 * i,
      nBW,
      23,
      nFlags);
    oSys.Call("User32::SetWindowPos",
      aDlg[IDB7 + i][HWND], 0,
      nW - nBW - 8,
      nH - 3 * 23 - 2 * 2 - 8 + 25 * i,
      nBW,
      23,
      nFlags);
  }

  for (i = 0; i < 3; ++i)
    SendMessage(aDlg[IDPLUG][HWND], 0x101E /*LVM_SETCOLUMNWIDTH*/, i, -2 /*LVSCW_AUTOSIZE_USEHEADER*/);

  SendMessage(aDlg[IDPLUG][HWND], 0x1013 /*LVM_ENSUREVISIBLE*/, GetNextSelLV(-1), false);
  oSys.Call("user32::InvalidateRect", hDlg, 0, true);
}

function PaintSizeGrip()
{
  var lpPaint = AkelPad.MemAlloc(_X64 ? 72 : 64); //sizeof(PAINTSTRUCT)
  var lpRect  = AkelPad.MemAlloc(16); //sizeof(RECT)
  var hDC;

  if (hDC = oSys.Call("User32::BeginPaint", hDlg, lpPaint))
  {
    oSys.Call("User32::GetClientRect", hDlg, lpRect);

    AkelPad.MemCopy(_PtrAdd(lpRect, 0), AkelPad.MemRead(_PtrAdd(lpRect,  8), DT_DWORD) - oSys.Call("User32::GetSystemMetrics",  2 /*SM_CXVSCROLL*/), DT_DWORD);
    AkelPad.MemCopy(_PtrAdd(lpRect, 4), AkelPad.MemRead(_PtrAdd(lpRect, 12), DT_DWORD) - oSys.Call("User32::GetSystemMetrics", 20 /*SM_CYVSCROLL*/), DT_DWORD);

    oSys.Call("User32::DrawFrameControl", hDC, lpRect, 3 /*DFC_SCROLL*/, 0x8 /*DFCS_SCROLLSIZEGRIP*/);
    oSys.Call("User32::EndPaint", hDlg, lpPaint);
  }

  AkelPad.MemFree(lpPaint);
  AkelPad.MemFree(lpRect);
}

function GetItemCountLV()
{
  return SendMessage(aDlg[IDPLUG][HWND], 0x1004 /*LVM_GETITEMCOUNT*/, 0, 0);
}

function GetItemTextLV(nItem, nSubItem)
{
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8), nSubItem, DT_DWORD);
  SendMessage(aDlg[IDPLUG][HWND], 0x1073 /*LVM_GETITEMTEXTW*/, nItem, lpLVITEM);
  return AkelPad.MemRead(lpBuffer, DT_UNICODE);
}

function SetItemTextLV(nItem, nSubItem, sText)
{
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 4), nItem,    DT_DWORD);
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8), nSubItem, DT_DWORD);
  AkelPad.MemCopy(lpBuffer, sText, DT_UNICODE);
  SendMessage(aDlg[IDPLUG][HWND], 0x1074 /*LVM_SETITEMTEXTW*/, nItem, lpLVITEM);
}

function GetNextSelLV(nItem)
{
  return SendMessage(aDlg[IDPLUG][HWND], 0x100C /*LVM_GETNEXTITEM*/, nItem, 0x0002 /*LVNI_SELECTED*/);
}

function GetSelArrayLV()
{
  var aSel  = [];
  var nItem = -1;

  while (true)
  {
    nItem = GetNextSelLV(nItem);

    if (nItem < 0)
      break;

    aSel.push(nItem);
  }

  return aSel;
}

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[IDPLUG][HWND], 0x102B /*LVM_SETITEMSTATE*/, nItem, lpLVITEM);
  SendMessage(aDlg[IDPLUG][HWND], 0x1013 /*LVM_ENSUREVISIBLE*/, nItem, false);
}

function InsertItemLV(nItem, aItems)
{
  var i;

  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 4), nItem, DT_DWORD);
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8),     0, DT_DWORD);
  AkelPad.MemCopy(lpBuffer, aItems[0], DT_UNICODE);
  SendMessage(aDlg[IDPLUG][HWND], 0x104D /*LVM_INSERTITEMW*/, 0, lpLVITEM);

  for (i = 1; i < aItems.length; ++i)
  {
    AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8), i, DT_DWORD);
    AkelPad.MemCopy(lpBuffer, aItems[i], DT_UNICODE);
    SendMessage(aDlg[IDPLUG][HWND], 0x1074 /*LVM_SETITEMTEXTW*/, nItem, lpLVITEM);
  }
}

function FillPlugList()
{
  var aPlugList  = [];
  var lpLVCOLUMN = AkelPad.MemAlloc(_X64 ? 56 : 44); //sizeof(LVCOLUMN)
  var nMask      = 5; //LVCF_FMT|LVCF_TEXT
  var aFmt       = [0 /*LVCFMT_LEFT*/, 0, 0]; //Alignment of the column header
  var aText      = [AkelPad.MemStrPtr(sTxtPlugin), AkelPad.MemStrPtr(sTxtKeyTextName), AkelPad.MemStrPtr(sTxtTextFile)];
  var i;

  if (bSetInReg)
    GetPluginsFromReg(aPlugList);
  else
    GetPluginsFromIni(aPlugList);

  SendMessage(aDlg[IDPLUG][HWND], 0x1036 /*LVM_SETEXTENDEDLISTVIEWSTYLE*/, 0, 0x0021 /*LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES*/);
  AkelPad.MemCopy(lpLVCOLUMN, nMask, DT_DWORD);

  for (i = 0; i < aFmt.length; ++i)
  {
    AkelPad.MemCopy(_PtrAdd(lpLVCOLUMN, 4), aFmt[i], DT_DWORD);
    AkelPad.MemCopy(_PtrAdd(lpLVCOLUMN, _X64 ? 16 : 12), aText[i], DT_QWORD);
    SendMessage(aDlg[IDPLUG][HWND], 0x1061 /*LVM_INSERTCOLUMNW*/, i, lpLVCOLUMN);
  }
  AkelPad.MemFree(lpLVCOLUMN);

  for (i = 0; i < aPlugList.length; ++i)
  {
    if (oPlugText[aPlugList[i][0]] &&
        oPlugText[aPlugList[i][0]][aPlugList[i][1]] &&
        oPlugText[aPlugList[i][0]][aPlugList[i][1]].File)
      aPlugList[i].push(oPlugText[aPlugList[i][0]][aPlugList[i][1]].File);
    else
      aPlugList[i].push(aPlugList[i][0] + "." + aPlugList[i][1].replace(/[<>:"/\\|?*]/g, "_") + ".akelmenu");

    InsertItemLV(i, aPlugList[i]);
    aFrame[i] = 0;

    if (oPlugText[aPlugList[i][0]] &&
        oPlugText[aPlugList[i][0]][aPlugList[i][1]] &&
        oPlugText[aPlugList[i][0]][aPlugList[i][1]].Sel)
      SetSelLV(i);
  }

  if (GetNextSelLV(-1) < 0)
    SetSelLV(0);
}

function GetPluginsFromIni(aPlugList)
{
  var oRE1      = /^\/.+(?==)/gm;
  var oRE2      = /^.+Text(?==)/gm;
  var aPlugName = [["Coder", oRE1], ["ContextMenu", oRE2], ["Hotkeys", oRE2], ["SpecialChar", oRE2]];
  var sPlugDir  = AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\";
  var hFindFile = oSys.Call("Kernel32::FindFirstFileW", sPlugDir + "ToolBar*.ini", lpBuffer);
  var sToolBarName;
  var aText;
  var i, n;

  if (hFindFile != -1) //INVALID_HANDLE_VALUE
  {
    do
    {
      if (! (AkelPad.MemRead(lpBuffer, DT_DWORD) & 16 /*FILE_ATTRIBUTE_DIRECTORY*/))
      {
        sToolBarName = AkelPad.MemRead(_PtrAdd(lpBuffer, 44 /*offsetof(WIN32_FIND_DATAW, cFileName)*/), DT_UNICODE);
        sToolBarName = sToolBarName.substring(sToolBarName.lastIndexOf("\\") + 1, sToolBarName.lastIndexOf("."));
        aPlugName.push([sToolBarName, oRE2]);
      }
    }
    while (oSys.Call("Kernel32::FindNextFileW", hFindFile, lpBuffer));

    oSys.Call("Kernel32::FindClose", hFindFile);
  }

  for (i = 0; i < aPlugName.length; ++i)
  {
    if ((oFSO.FileExists(sPlugDir + aPlugName[i][0] + ".ini")) &&
        (aText = AkelPad.ReadFile(sPlugDir + aPlugName[i][0] + ".ini", 0x10 /*OD_ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, 1 /*bBOM*/).match(aPlugName[i][1])))
    {
      for (n = 0; n < aText.length; ++n)
        aPlugList.push([aPlugName[i][0], aText[n]]);
    }
  }
}

function GetPluginsFromReg(aPlugList)
{
  var oRE1       = /^\/.+/;
  var oRE2       = /.+Text$/;
  var aPlugName  = [["Coder", oRE1], ["ContextMenu", oRE2], ["Hotkeys", oRE2], ["SpecialChar", oRE2]];
  var sPlugKey   = "Software\\Akelsoft\\AkelPad\\Plugs";
  var lpCount    = AkelPad.MemAlloc(4);
  var lpNameLen  = AkelPad.MemAlloc(4);
  var lpType     = AkelPad.MemAlloc(4);
  var lpName;
  var nNameLen;
  var sToolBarName;
  var sValueName;
  var hKey;
  var i;

  if (hKey = GetRegKeyHandle(0x80000001 /*HKEY_CURRENT_USER*/, sPlugKey, 0x0009 /*KEY_ENUMERATE_SUB_KEYS|KEY_QUERY_VALUE*/))
  {
    if (! oSys.Call("Advapi32::RegQueryInfoKeyW",
            hKey,     //hKey
            0,        //lpClass
            0,        //lpcClass
            0,        //lpReserved
            lpCount,  //lpcSubKeys
            lpNameLen,//lpcMaxSubKeyLen
            0,        //lpcMaxClassLen
            0,        //lpcValues
            0,        //lpcMaxValueNameLen
            0,        //lpcMaxValueLen
            0,        //lpcbSecurityDescri
            0))       //lpftLastWriteTime
    {
      nNameLen = AkelPad.MemRead(lpNameLen, DT_DWORD) + 1;
      lpName   = AkelPad.MemAlloc(nNameLen * 2);

      for (i = 0; i < AkelPad.MemRead(lpCount, DT_DWORD); ++i)
      {
        AkelPad.MemCopy(lpNameLen, nNameLen, DT_DWORD);
        if (! oSys.Call("Advapi32::RegEnumKeyExW",
                hKey,     //hKey
                i,        //dwIndex
                lpName,   //lpName
                lpNameLen,//lpcName
                0,        //lpReserved
                0,        //lpClass
                0,        //lpcClass
                0))       //lpftLastWriteTime
        {
          sToolBarName = AkelPad.MemRead(lpName, DT_UNICODE);
          if (sToolBarName.indexOf("ToolBar") == 0)
            aPlugName.push([sToolBarName, oRE2]);
        }
      }
      AkelPad.MemFree(lpName);
    }
    oSys.Call("Advapi32::RegCloseKey", hKey);
  }

  for (i = 0; i < aPlugName.length; ++i)
  {
    if (hKey = GetRegKeyHandle(0x80000001 /*HKEY_CURRENT_USER*/, sPlugKey + "\\" + aPlugName[i][0], 0x0001 /*KEY_QUERY_VALUE*/))
    {
      if (! oSys.Call("Advapi32::RegQueryInfoKeyW",
              hKey,     //hKey
              0,        //lpClass
              0,        //lpcClass
              0,        //lpReserved
              0,        //lpcSubKeys
              0,        //lpcMaxSubKeyLen
              0,        //lpcMaxClassLen
              lpCount,  //lpcValues
              lpNameLen,//lpcMaxValueNameLen
              0,        //lpcMaxValueLen
              0,        //lpcbSecurityDescri
              0))       //lpftLastWriteTime
      {
        nNameLen = AkelPad.MemRead(lpNameLen, DT_DWORD) + 1;
        lpName   = AkelPad.MemAlloc(nNameLen * 2);

        for (n = 0; n < AkelPad.MemRead(lpCount, DT_DWORD); ++n)
        {
          AkelPad.MemCopy(lpNameLen, nNameLen, DT_DWORD);
          if (! oSys.Call("Advapi32::RegEnumValueW",
                  hKey,     //hKey
                  n,        //dwIndex
                  lpName,   //lpValueName
                  lpNameLen,//lpcchValueName
                  0,        //lpReserved
                  lpType,   //lpType
                  0,        //lpData
                  0))       //lpcbData
          {
            sValueName = AkelPad.MemRead(lpName, DT_UNICODE);
            if (aPlugName[i][1].test(sValueName) && (AkelPad.MemRead(lpType, DT_DWORD) == 3 /*REG_BINARY*/))
              aPlugList.push([aPlugName[i][0], sValueName]);
          }
        }
        AkelPad.MemFree(lpName);
      }
      oSys.Call("Advapi32::RegCloseKey", hKey);
    }
  }

  AkelPad.MemFree(lpCount);
  AkelPad.MemFree(lpNameLen);
  AkelPad.MemFree(lpType);
}

function GetRegKeyHandle(hParentKey, sSubKey, nAccess)
{
  var lpKey  = AkelPad.MemAlloc(_X64 ? 8 : 4);
  var hKey   = 0;
  var nError = oSys.Call("Advapi32::RegOpenKeyExW",
                 hParentKey,//hKey
                 sSubKey,   //lpSubKey
                 0,         //ulOptions
                 nAccess,   //samDesired
                 lpKey);    //phkResult

  if (! nError)
    hKey = AkelPad.MemRead(lpKey, DT_QWORD);

  AkelPad.MemFree(lpKey);

  return hKey;
}

function EditText(bSave, bMouseClick)
{
  var sTextDir  = ExpandDirName(sTextDirS);
  var sPlugDir  = AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\";
  var aSel      = GetSelArrayLV();
  var aSaved    = [];
  var aNotSaved = [];
  var sMessage  = "";
  var hKey;
  var lpType;
  var lpData;
  var lpDataLen;
  var sIniFile;
  var oRE;
  var bWasSaved;
  var i, n;

  if (bSave && (AkelPad.MessageBox(hDlg, sTxtWantSave, sTxtScriptName, 0x21 /*MB_DEFBUTTON1|MB_ICONQUESTION|MB_OKCANCEL*/) != 1 /*IDOK*/))
    return;

  if (bSetInReg)
  {
    lpType    = AkelPad.MemAlloc(4);
    lpDataLen = AkelPad.MemAlloc(4);

    for (i = 0; i < aSel.length; ++i)
    {
      bWasSaved = false;

      if (hKey = GetRegKeyHandle(0x80000001 /*HKEY_CURRENT_USER*/, "Software\\Akelsoft\\AkelPad\\Plugs\\" + GetItemTextLV(aSel[i], 0), 0x0001 /*KEY_QUERY_VALUE*/))
      {
        oSys.Call("Advapi32::RegQueryInfoKeyW",
          hKey,     //hKey
          0,        //lpClass
          0,        //lpcClass
          0,        //lpReserved
          0,        //lpcSubKeys
          0,        //lpcMaxSubKeyLen
          0,        //lpcMaxClassLen
          0,        //lpcValues
          0,        //lpcMaxValueNameLen
          lpDataLen,//lpcMaxValueLen
          0,        //lpcbSecurityDescri
          0);       //lpftLastWriteTime

        lpData = AkelPad.MemAlloc(AkelPad.MemRead(lpDataLen, DT_DWORD));

        if ((! oSys.Call("Advapi32::RegQueryValueExW",
                 hKey,                     //hKey
                 GetItemTextLV(aSel[i], 1),//lpValueName
                 0,                        //lpReserved
                 lpType,                   //lpType
                 lpData,                   //lpData
                 lpDataLen))               //lpcbData
            && (AkelPad.MemRead(lpType, DT_DWORD) == 3 /*REG_BINARY*/))
        {
          if (bSave)
          {
            if (AkelPad.WriteFile(sTextDir + GetItemTextLV(aSel[i], 2), AkelPad.MemRead(lpData, DT_UNICODE), -1, 1200 /*UTF-16LE*/, 1 /*bBOM*/) == 0 /*ESD_SUCCESS*/)
            {
              aSaved.push(aSel[i]);
              bWasSaved = true;
            }
          }
          else
            OpenText(lpData, aSel[i], bMouseClick);
        }

        oSys.Call("Advapi32::RegCloseKey", hKey);
        AkelPad.MemFree(lpData);
      }

      if (bSave && (! bWasSaved))
        aNotSaved.push(aSel[i]);
    }

    AkelPad.MemFree(lpType);
    AkelPad.MemFree(lpDataLen);
  }

  else
  {
    for (i = 0; i < aSel.length; ++i)
    {
      bWasSaved = false;
      sIniFile  = sPlugDir + GetItemTextLV(aSel[i], 0) + ".ini";

      if (oFSO.FileExists(sIniFile))
      {
        oRE = new RegExp(escapeRegExp(GetItemTextLV(aSel[i], 1)) + "=([\\dA-F]*)");

        if (oRE.test(AkelPad.ReadFile(sIniFile, 0x10 /*OD_ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, 1 /*bBOM*/)))
        {
          lpData = AkelPad.MemAlloc(RegExp.$1.length / 2);

          for (n = 0; n < RegExp.$1.length; n += 2)
            AkelPad.MemCopy(_PtrAdd(lpData, n / 2), parseInt(RegExp.$1.substr(n, 2), 16), DT_BYTE);

          if (bSave)
          {
            if (AkelPad.WriteFile(sTextDir + GetItemTextLV(aSel[i], 2), AkelPad.MemRead(lpData, DT_UNICODE), -1, 1200 /*UTF-16LE*/, 1 /*bBOM*/) == 0 /*ESD_SUCCESS*/)
            {
              aSaved.push(aSel[i]);
              bWasSaved = true;
            }
          }
          else
            OpenText(lpData, aSel[i], bMouseClick);

          AkelPad.MemFree(lpData);
        }
      }

      if (bSave && (! bWasSaved))
        aNotSaved.push(aSel[i]);
    }
  }

  if (bSave)
  {
    if (aSaved.length)
    {
      sMessage += sTxtSaved + "\n";
      for (i = 0; i < aSaved.length; ++i)
        sMessage += sTextDir + GetItemTextLV(aSaved[i], 2) + "\n";
    }

    if (aNotSaved.length)
    {
      sMessage += "\n" + sTxtNotSaved + "\n";
      for (i = 0; i < aNotSaved.length; ++i)
        sMessage += sTextDir + GetItemTextLV(aNotSaved[i], 2) + "\n";
    }

    AkelPad.MessageBox(hDlg, sMessage, sTxtScriptName, 0x40 /*MB_ICONINFORMATION*/);
  }
}

function OpenText(lpData, nSel, bMouseClick)
{
  var hFocus;

  if (aFrame[nSel])
  {
    if (bMouseClick && (aFrame[nSel] == SendMessage(hMainWnd, 1290 /*AKD_FRAMEFINDW*/, 1 /*FWF_CURRENT*/, 0)))
    {
      hFocus = oSys.Call("User32::GetFocus");

      oSys.Call("User32::EnableWindow", hDlg, 0);
      AkelPad.ScriptNoMutex(0x20 /*ULT_UNLOCKSENDMESSAGE*/);

      AkelPad.Command(4318 /*IDM_WINDOW_FRAMECLOSE*/);

      AkelPad.ScriptNoMutex(0x10 /*ULT_LOCKSENDMESSAGE*/);
      oSys.Call("User32::EnableWindow", hDlg, 1);
      oSys.Call("User32::SetFocus", hFocus);
    }
    else
      SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, aFrame[nSel]);
  }
  else
  {
    var sTabText = GetItemTextLV(nSel, 0) + ": " + GetItemTextLV(nSel, 1);
    var lpText   = AkelPad.MemAlloc((sTabText.length + 1) * 2);
    var lpTCITEM = AkelPad.MemAlloc(_X64 ? 40 : 28 /*sizeof(TCITEM)*/);
    var hWndTab  = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 13 /*MI_WNDTAB*/, 0);
    var nTab;

    SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4101 /*IDM_FILE_NEW*/, 1 /*lParam=TRUE*/);
    AkelPad.Command(4125 /*IDM_FILE_REOPENAS_UTF16LE*/);
    AkelPad.Command(4186 /*IDM_EDIT_NEWLINE_MAC*/);
    oSys.Call("User32::SetWindowTextW", AkelPad.GetEditWnd(), lpData);

    if (AkelPad.IsPluginRunning("Coder::HighLight"))
      AkelPad.Call("Coder::Settings", 1, "akelmenu");

    aFrame[nSel] = SendMessage(hMainWnd, 1290 /*AKD_FRAMEFINDW*/, 1 /*FWF_CURRENT*/, 0);
    nTab         = SendMessage(hWndTab, 4875 /*TCM_GETCURSEL*/, 0, 0);

    AkelPad.MemCopy(lpText, sTabText, 1 /*DT_UNICODE*/);
    AkelPad.MemCopy(lpTCITEM, 1 /*TCIF_TEXT*/, 3 /*DT_DWORD*/); //mask
    AkelPad.MemCopy(_PtrAdd(lpTCITEM, _X64 ? 16 : 12), lpText, 2 /*DT_QWORD*/); //pszText

    SendMessage(hWndTab, 4925 /*TCM_SETITEMW*/, nTab, lpTCITEM);

    AkelPad.MemFree(lpTCITEM);
    AkelPad.MemFree(lpText);
  }
}

function LoadTextToPlugin(bFromFile)
{
  var nCurFrame  = SendMessage(hMainWnd, 1290 /*AKD_FRAMEFINDW*/, 1 /*FWF_CURRENT*/, 0);
  var sTextDir   = ExpandDirName(sTextDirS);
  var sPlugDir   = AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\";
  var aSel       = GetSelArrayLV();
  var aLoaded    = [];
  var aNotLoaded = [];
  var sMessage   = "";
  var sPrevPlug  = "";
  var hKey;
  var lpType;
  var sIniFile;
  var sBakFile;
  var sText;
  var sIniText;
  var nSize;
  var lpData;
  var oRE;
  var bWasLoaded;
  var i, n;

  if (AkelPad.MessageBox(hDlg, sTxtWantLoad, sTxtScriptName, 0x21 /*MB_DEFBUTTON1|MB_ICONQUESTION|MB_OKCANCEL*/) != 1 /*IDOK*/)
    return;

  if (bSetInReg)
  {
    lpType = AkelPad.MemAlloc(4);

    for (i = 0; i < aSel.length; ++i)
    {
      bWasLoaded = false;
      hKey       = GetRegKeyHandle(0x80000001 /*HKEY_CURRENT_USER*/, "Software\\Akelsoft\\AkelPad\\Plugs\\" + GetItemTextLV(aSel[i], 0), 0x0003 /*KEY_SET_VALUE|KEY_QUERY_VALUE*/);
      sText      = bFromFile ? AkelPad.ReadFile(sTextDir + GetItemTextLV(aSel[i], 2), 0x10 /*OD_ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, 1 /*bBOM*/) : GetTextAE(aSel[i]);

      if (hKey
          && (! oSys.Call("Advapi32::RegQueryValueExW",
                  hKey,                     //hKey
                  GetItemTextLV(aSel[i], 1),//lpValueName
                  0,                        //lpReserved
                  lpType,                   //lpType
                  0,                        //lpData
                  0))                       //lpcbData
          && (AkelPad.MemRead(lpType, DT_DWORD) == 3 /*REG_BINARY*/)
          && sText)
      {
        //create registry key backup file
        if (GetItemTextLV(aSel[i], 0) != sPrevPlug)
        {
          sBakFile = sTextDir + GetItemTextLV(aSel[i], 0) + ".reg.bak";
          DeleteFile(sBakFile);
          AkelPad.Exec("reg.exe export HKEY_CURRENT_USER\\Software\\Akelsoft\\AkelPad\\Plugs\\" + GetItemTextLV(aSel[i], 0) + " " + sBakFile, "", 1);
          sPrevPlug = GetItemTextLV(aSel[i], 0);
        }

        nSize  = (sText.length + 1) * 2;
        lpData = AkelPad.MemAlloc(nSize);
        AkelPad.MemCopy(lpData, sText, DT_UNICODE);

        if ((! oSys.Call("Advapi32::RegSetValueExW",
                 hKey,                     //hKey
                 GetItemTextLV(aSel[i], 1),//lpValueName
                 0,                        //Reserved
                 3,                        //dwType = REG_BINARY
                 lpData,                   //lpData
                 nSize)))                  //cbData
        {
          aLoaded.push(aSel[i]);
          bWasLoaded = true;
        }

        AkelPad.MemFree(lpData);
      }

      oSys.Call("Advapi32::RegCloseKey", hKey);
      if (! bWasLoaded)
        aNotLoaded.push(aSel[i]);
    }

    AkelPad.MemFree(lpType);
  }

  else
  {
    for (i = 0; i < aSel.length; ++i)
    {
      bWasLoaded = false;
      sIniFile   = sPlugDir + GetItemTextLV(aSel[i], 0) + ".ini";
      sText      = bFromFile ? AkelPad.ReadFile(sTextDir + GetItemTextLV(aSel[i], 2), 0x10 /*OD_ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, 1 /*bBOM*/) : GetTextAE(aSel[i]);

      if (oFSO.FileExists(sIniFile) && sText)
      {
        oRE      = new RegExp(escapeRegExp(GetItemTextLV(aSel[i], 1)) + "=[\\dA-F]*");
        sIniText = AkelPad.ReadFile(sIniFile, 0x10 /*OD_ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, 1 /*bBOM*/);
        nSize    = (sText.length + 1) * 2;
        lpData   = AkelPad.MemAlloc(nSize);
        AkelPad.MemCopy(lpData, sText, DT_UNICODE);

        sText = "";
        for (n = 0; n < nSize; ++n)
          sText += PadL0(AkelPad.MemRead(_PtrAdd(lpData, n), DT_BYTE).toString(16).toUpperCase());
        AkelPad.MemFree(lpData);

        if (sText && oRE.test(sIniText))
        {
          //create backup .ini file
          if (GetItemTextLV(aSel[i], 0) != sPrevPlug)
          {
            sBakFile = sTextDir + GetItemTextLV(aSel[i], 0) + ".ini.bak";
            CopyFile(sIniFile, sBakFile);
            sPrevPlug = GetItemTextLV(aSel[i], 0);
          }

          if (AkelPad.WriteFile(sIniFile, sIniText.replace(oRE, GetItemTextLV(aSel[i], 1) + "=" + sText), -1, 1200 /*UTF-16LE*/, 1 /*bBOM*/) == 0 /*ESD_SUCCESS*/)
          {
            aLoaded.push(aSel[i]);
            bWasLoaded = true;
          }
        }
      }

      if (! bWasLoaded)
        aNotLoaded.push(aSel[i]);
    }
  }

  if (aLoaded.length)
  {
    sMessage += sTxtLoaded + "\n";

    for (i = 0; i < aLoaded.length; ++i)
    {
      sMessage += GetItemTextLV(aLoaded[i], 0) + ": " + GetItemTextLV(aLoaded[i], 1) + "\n";
      RestartPlugin(GetItemTextLV(aLoaded[i], 0));
    }

    if ((! bFromFile) && AkelPad.IsPluginRunning("Coder::HighLight"))
    {
      for (i = 0; i < aFrame.length; ++i)
      {
        if (aFrame[i])
        {
          SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, aFrame[i]);
          AkelPad.Call("Coder::Settings", 1, "akelmenu");
        }
      }
    }
  }

  if (aNotLoaded.length)
  {
    sMessage += "\n" + sTxtNotLoaded + "\n";

    for (i = 0; i < aNotLoaded.length; ++i)
      sMessage += GetItemTextLV(aNotLoaded[i], 0) + ": " + GetItemTextLV(aNotLoaded[i], 1) + "\n";
  }

  if (! bFromFile)
    SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, nCurFrame);

  AkelPad.MessageBox(hDlg, sMessage, sTxtScriptName, 0x40 /*MB_ICONINFORMATION*/);
}

function GetTextAE(nSel)
{
  if (aFrame[nSel])
  {
    SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, aFrame[nSel]);
    return AkelPad.GetTextRange(0, -1, 0 /*New line as is*/);
  }
}

function PadL0(sStr)
{
  if (sStr.length == 1)
    sStr = "0" + sStr;

  return sStr;
}

function RestartPlugin(sPlugName)
{
  var bCoderHL;
  var bCoderCF;
  var bCoderAC;

  if (sPlugName == "Coder")
  {
    if (AkelPad.IsPluginRunning(sPlugName + "::HighLight"))
    {
      bCoderHL = 1;
      AkelPad.Call(sPlugName + "::HighLight");
    }
    if (AkelPad.IsPluginRunning(sPlugName + "::CodeFold"))
    {
      bCoderCF = 1;
      AkelPad.Call(sPlugName + "::CodeFold");
    }
    if (AkelPad.IsPluginRunning(sPlugName + "::AutoComplete"))
    {
      bCoderAC = 1;
      AkelPad.Call(sPlugName + "::AutoComplete");
    }

    if (bCoderHL)
      AkelPad.Call(sPlugName + "::HighLight");
    if (bCoderCF)
      AkelPad.Call(sPlugName + "::CodeFold");
    if (bCoderAC)
      AkelPad.Call(sPlugName + "::AutoComplete");
  }
  else if ((sPlugName == "ContextMenu") || (sPlugName == "Hotkeys"))
  {
    if (AkelPad.IsPluginRunning(sPlugName + "::Main"))
    {
      AkelPad.Call(sPlugName + "::Main", 10);
      AkelPad.Call(sPlugName + "::Main", 10);
    }
  }
  //SpecialChar, ToolBar*
  else
  {
    if (AkelPad.IsPluginRunning(sPlugName + "::Main"))
    {
      AkelPad.Call(sPlugName + "::Main");
      AkelPad.Call(sPlugName + "::Main");
    }
  }
}

function EditTextFile()
{
  var sTextDir = ExpandDirName(sTextDirS);
  var aSel     = GetSelArrayLV();
  var aNoFile  = [];
  var sTextFile;
  var i;

  for (i = 0; i < aSel.length; ++i)
  {
    sTextFile = sTextDir + GetItemTextLV(aSel[i], 2);

    if (oFSO.FileExists(sTextFile))
      AkelPad.OpenFile(sTextFile);
    else
      aNoFile.push(aSel[i]);
  }

  if (aNoFile.length)
  {
    sMessage = sTxtNoFiles + "\n";
    for (i = 0; i < aNoFile.length; ++i)
      sMessage += sTextDir + GetItemTextLV(aNoFile[i], 2) + "\n";

    AkelPad.MessageBox(hDlg, sMessage, sTxtScriptName, 0x30 /*MB_ICONWARNING*/);
  }
}

function RenameTextFile()
{
  var aSel = GetSelArrayLV();
  var sOldName;
  var sNewName;

  for (i = 0; i < aSel.length; ++i)
  {
    sOldName = GetItemTextLV(aSel[i], 2);
    sNewName = GetFileName(sTxtRenameFile, sOldName + "\n\n" + sTxtNewName, sOldName);

    if (sNewName)
    {
      if (sNewName != sOldName)
      {
        SetItemTextLV(aSel[i], 2, sNewName);
        RenameFile(ExpandDirName(sTextDirS) + sOldName, ExpandDirName(sTextDirS) + sNewName);
      }
    }
    else
      break;
  }
}

function GetFileName(sCaption, sLabel, sName)
{
  while (true)
  {
    sName = AkelPad.InputBox(hDlg, sCaption, sLabel, sName);

    if (sName)
    {
      sName = sName.replace(/[ .]+$/, "");

      if (/^(CON|PRN|AUX|NUL|COM1|COM2|COM3|COM4|COM5|COM6|COM7|COM8|COM9|LPT1|LPT2|LPT3|LPT4|LPT5|LPT6|LPT7|LPT8|LPT9)$/i.test(sName))
        AkelPad.MessageBox(hDlg, sName + "\n\n" + sTxtBadName, sCaption, 0x30 /*MB_ICONWARNING*/);
      else if (/[<>:"/\\|?*]/.test(sName))
        AkelPad.MessageBox(hDlg, sName + "\n\n" + sTxtBadChar, sCaption, 0x30 /*MB_ICONWARNING*/);
      else
        break;
    }
    else
      break;
  }

  return sName;
}

function DeleteTextFile()
{
  var sTextDir    = ExpandDirName(sTextDirS);
  var aSel        = GetSelArrayLV();
  var aDeleted    = [];
  var aNotDeleted = [];
  var sMessage    = "";

  if (AkelPad.MessageBox(hDlg, sTxtWantDelete, sTxtScriptName, 0x21 /*MB_DEFBUTTON1|MB_ICONQUESTION|MB_OKCANCEL*/) == 1 /*IDOK*/)
  {
    for (i = 0; i < aSel.length; ++i)
    {
      if (DeleteFile(sTextDir + GetItemTextLV(aSel[i], 2)))
        aDeleted.push(aSel[i]);
      else
        aNotDeleted.push(aSel[i]);
    }

    if (aDeleted.length)
    {
      sMessage += sTxtDeleted + "\n";
      for (i = 0; i < aDeleted.length; ++i)
        sMessage += sTextDir + GetItemTextLV(aDeleted[i], 2) + "\n";
    }

    if (aNotDeleted.length)
    {
      sMessage += "\n" + sTxtNotDeleted + "\n";
      for (i = 0; i < aNotDeleted.length; ++i)
        sMessage += sTextDir + GetItemTextLV(aNotDeleted[i], 2) + "\n";
    }

    AkelPad.MessageBox(hDlg, sMessage, sTxtScriptName, 0x40 /*MB_ICONINFORMATION*/);
  }
}

//function written by Infocatcher
function escapeRegExp(str)
{
  return str.replace(/[\\\/.^$+*?|()\[\]{}]/g, "\\$&");
}

function ChangeTextsDir()
{
  var sLabel  = "%a - " + sTxtAkelDir + "\n%p - " + sTxtPlugDir + "\n%variable% - " + sTxtEnvVar;
  var sDirS   = sTextDirS;
  var bChange = 0;
  var sDirE;

  while (true)
  {
    sDirS = AkelPad.InputBox(hDlg, sTxtChangeDir, sLabel, sDirS);

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

      sDirE = ExpandDirName(sDirS);

      if (oFSO.FolderExists(sDirE))
      {
        bChange = 1;
        break;
      }
      else if (AkelPad.MessageBox(hDlg, sDirE + "\n\n" + sTxtDirNoExists, sTxtScriptName, 0x21 /*MB_DEFBUTTON1|MB_ICONQUESTION|MB_OKCANCEL*/) == 1 /*IDOK*/)
      {
        if (oSys.Call("Kernel32::CreateDirectoryW", sDirE, 0))
        {
          bChange = 1;
          break;
        }
        else
          AkelPad.MessageBox(hDlg, sDirE + "\n\n" + sTxtDirCreFail, sTxtScriptName, 0x30 /*MB_ICONWARNING*/);
      }
    }
    else
      break;
  }

  if (bChange)
  {
    sTextDirS = sDirS;
    oSys.Call("User32::SetWindowTextW", aDlg[IDDIR][HWND], sTxtDir + sDirE);
  }
}

function ExpandDirName(sDir)
{
  sDir = sDir.replace(/%a\\/g, AkelPad.GetAkelDir() + "\\");
  sDir = sDir.replace(/%p\\/g, AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\");
  sDir = sDir.replace(/%.+?%/g, ExpandEnvironmentString);

  if (oSys.Call("Kernel32::GetFullPathNameW", sDir, nBufSize / 2, lpBuffer, 0))
    sDir = AkelPad.MemRead(lpBuffer, DT_UNICODE);

  return sDir;
}

function ExpandEnvironmentString(sStr)
{
  if (oSys.Call("Kernel32::ExpandEnvironmentStringsW", sStr, lpBuffer, nBufSize / 2))
    sStr = AkelPad.MemRead(lpBuffer, DT_UNICODE);

  return sStr;
}

function EditIniFile()
{
  var sPlugDir = AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\";
  var aSel     = GetSelArrayLV();
  var aNoFile  = [];
  var sIniFile;
  var nSelStart;
  var sMessage;
  var i;

  for (i = 0; i < aSel.length; ++i)
  {
    sIniFile = sPlugDir + GetItemTextLV(aSel[i], 0) + ".ini";

    if (oFSO.FileExists(sIniFile))
    {
      if (AkelPad.OpenFile(sIniFile) == 0 /*EOD_SUCCESS*/)
      {
        nSelStart = AkelPad.TextFind(AkelPad.GetEditWnd(), GetItemTextLV(aSel[i], 1), 0x00200001 /*FR_DOWN|FR_BEGINNING*/);
        if (nSelStart > -1)
          AkelPad.SetSel(nSelStart, nSelStart + GetItemTextLV(aSel[i], 1).length);
      }
    }
    else
      aNoFile.push(aSel[i]);
  }

  if (aNoFile.length)
  {
    sMessage = sTxtNoFiles + "\n";
    for (i = 0; i < aNoFile.length; ++i)
      sMessage += sPlugDir + GetItemTextLV(aSel[i], 0) + ".ini" + "\n";

    AkelPad.MessageBox(hDlg, sMessage, sTxtScriptName, 0x30 /*MB_ICONWARNING*/);
  }
}

function OpenInRegEdit()
{
  var aSel     = GetSelArrayLV();
  var hKey     = GetRegKeyHandle(0x80000001 /*HKEY_CURRENT_USER*/, "Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit", 0x0002 /*KEY_SET_VALUE*/);
  var sValue   = "HKEY_CURRENT_USER\\Software\\Akelsoft\\AkelPad\\Plugs\\" + GetItemTextLV(aSel[0], 0);
  var nSize    = (sValue.length + 1) * 2;
  var lpData   = AkelPad.MemAlloc(nSize);
  var sProcess = "regedit.exe";

  TerminateProcess(sProcess);

  AkelPad.MemCopy(lpData, sValue, DT_UNICODE);

  oSys.Call("Advapi32::RegSetValueExW",
    hKey,     //hKey
    "LastKey",//lpValueName
    0,        //Reserved
    1,        //dwType = REG_SZ
    lpData,   //lpData
    nSize);   //cbData
  
  oSys.Call("Advapi32::RegCloseKey", hKey);
  AkelPad.MemFree(lpData);

  AkelPad.Exec("rundll32.exe shell32, ShellExec_RunDLL " + sProcess);
}

function TerminateProcess(sProcess)
{
  var lpPIDs  = AkelPad.MemAlloc(4000);
  var lpBytes = AkelPad.MemAlloc(4);
  var lpName  = AkelPad.MemAlloc(260 * 2);
  var hProcess;
  var i;

  sProcess = sProcess.toUpperCase();

  oSys.Call("Psapi::EnumProcesses", lpPIDs, 4000, lpBytes);

  for (i = 0; i < AkelPad.MemRead(lpBytes, DT_DWORD) / 4; ++i)
  {
    if (hProcess = oSys.Call("Kernel32::OpenProcess",
                     0x0411 /*PROCESS_QUERY_INFORMATION|PROCESS_VM_READ|PROCESS_TERMINATE*/,
                     0,
                     AkelPad.MemRead(_PtrAdd(lpPIDs, i * 4), DT_DWORD)))
    {
      oSys.Call("Psapi::GetModuleBaseNameW", hProcess, 0, lpName, 260);

      if (AkelPad.MemRead(lpName, DT_UNICODE).toUpperCase() == sProcess)
        oSys.Call("Kernel32::TerminateProcess", hProcess, 0);

      oSys.Call("Kernel32::CloseHandle", hProcess);
    }
  }

  AkelPad.MemFree(lpPIDs);
  AkelPad.MemFree(lpBytes);
  AkelPad.MemFree(lpName);
}

function CopyFile(sFromFile, sToFile)
{
  try
  {
    oFSO.CopyFile(sFromFile, sToFile, 1 /*overwrite*/);
    return 1;
  }
  catch (oError)
  {}
}

function DeleteFile(sFile)
{
  try
  {
    oFSO.DeleteFile(sFile, 1 /*force*/);
    return 1;
  }
  catch (oError)
  {}
}

function RenameFile(sOldName, sNewName)
{
  DeleteFile(sNewName);

  try
  {
    oFSO.MoveFile(sOldName, sNewName);
    return 1;
  }
  catch (oError)
  {}
}

function IsScriptRunning()
{
  var hDlg = oSys.Call("User32::FindWindowExW", 0, 0, sClass, 0);

  if (hDlg)
  {
    if (! oSys.Call("User32::IsWindowVisible", hDlg))
      oSys.Call("User32::ShowWindow", hDlg, 8 /*SW_SHOWNA*/);
    if (oSys.Call("User32::IsIconic", hDlg))
      oSys.Call("User32::ShowWindow", hDlg, 9 /*SW_RESTORE*/);

    oSys.Call("User32::SetForegroundWindow", hDlg);
    return true;
  }
}

function IsSDI()
{
  if (! AkelPad.IsMDI())
  {
    AkelPad.MessageBox(hMainWnd, sTxtOnlyMDI, sTxtScriptName, 0x30 /*MB_ICONWARNING*/);
    return true;
  }
}

function ReadIni()
{
  try
  {
    eval(AkelPad.ReadFile(WScript.ScriptFullName.replace(/\.js$/i, ".ini"), 0x10 /*OD_ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, 1 /*bBOM*/));
  }
  catch (oError)
  {}

  if (nWndPosW < nWndMinW) nWndPosW = nWndMinW;
  if (nWndPosH < nWndMinH) nWndPosH = nWndMinH;

  if ((! sTextDirS) || (! oFSO.FolderExists(ExpandDirName(sTextDirS))))
    sTextDirS = "%p\\";
  else if (sTextDirS.slice(-1) != "\\")
    sTextDirS += "\\";
}

function WriteIni()
{
  var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
  var sPlug;
  var sText;
  var sIniText;
  var i, n;

  oSys.Call("User32::GetWindowRect", hDlg, lpRect);
  nWndPosX = AkelPad.MemRead(_PtrAdd(lpRect,  0), DT_DWORD);
  nWndPosY = AkelPad.MemRead(_PtrAdd(lpRect,  4), DT_DWORD);
  nWndPosW = AkelPad.MemRead(_PtrAdd(lpRect,  8), DT_DWORD) - nWndPosX;
  nWndPosH = AkelPad.MemRead(_PtrAdd(lpRect, 12), DT_DWORD) - nWndPosY;
  AkelPad.MemFree(lpRect);

  oPlugText = {};
  for (i = 0; i < GetItemCountLV(); ++i)
  {
    sPlug = GetItemTextLV(i, 0);
    sText = GetItemTextLV(i, 1);

    if (! oPlugText[sPlug])
      oPlugText[sPlug] = {};

    if (! oPlugText[sPlug][sText])
      oPlugText[sPlug][sText] = {Sel: SendMessage(aDlg[IDPLUG][HWND], 0x102C /*LVM_GETITEMSTATE*/, i, 0x0002 /*LVIS_SELECTED*/), File: GetItemTextLV(i, 2)};
  }

  sIniText =
    'nWndPosX='   + nWndPosX + ';\r\n' +
    'nWndPosY='   + nWndPosY + ';\r\n' +
    'nWndPosW='   + nWndPosW + ';\r\n' +
    'nWndPosH='   + nWndPosH + ';\r\n' +
    'sTextDirS="' + sTextDirS.replace(/[\\"]/g, "\\$&") + '";\r\noPlugText={';

  for (i in oPlugText)
  {
    sIniText += '"' + i + '":{';
    for (n in oPlugText[i])
    {
      sIniText += '"' + n + '":{Sel:' + oPlugText[i][n].Sel + ',File:"' + oPlugText[i][n].File + '"},';
    }
    if (sIniText.slice(-1) == ",")
      sIniText = sIniText.slice(0, -1);
    sIniText += '},';
  }
  if (sIniText.slice(-1) == ",")
    sIniText = sIniText.slice(0, -1);
  sIniText += '};';

  AkelPad.WriteFile(WScript.ScriptFullName.replace(/\.js$/i, ".ini"), sIniText, sIniText.length, 1200 /*UTF-16LE*/, 1 /*bBOM*/);
}

function GetLangStrings()
{
  if (AkelPad.GetLangId() == 1049 /*Russian*/)
  {
    //translated by F. Phoenix
    sTxtScriptName   = "Текстовая конфигурация плагинов";
    sTxtOnlyMDI      = "Данный скрипт работает только в режиме MDI/PMDI.";
    sTxtNoTexts      = "В настройках плагинов не обнаружено подходящих текстовых ключей.";
    sTxtSetInReg     = "Параметры сохранены в реестре";
    sTxtSetInIni     = "Параметры сохранены в файле AkelPad.ini";
    sTxtDir          = "Папка текстовых файлов: ";
    sTxtPlugin       = "Плагин";
    sTxtKeyTextName  = "Ключ";
    sTxtTextFile     = "Файл, связанный с ключом";
    sTxtEditText     = "Править текст ключа";
    sTxtLoadText     = "Загрузить ключ из текста";
    sTxtSaveTextFile = "Сохранить текст ключа в файл";
    sTxtEditTextFile = "Править текстовый файл";
    sTxtLoadTextFile = "Загрузить ключ из файла";
    sTxtRenameFile   = "Переименовать файл";
    sTxtDeleteFile   = "Удалить текстовый файл";
    sTxtChangeDir    = "Сменить рабочую папку";
    sTxtEditIniFile  = "Править .ini файл";
    sTxtOpenRegEdit  = "Открыть в RegEdit";
    sTxtLoaded       = "Загружено:";
    sTxtNotLoaded    = "Не загружено:";
    sTxtSaved        = "Сохранено:";
    sTxtNotSaved     = "Не сохранено:";
    sTxtNoFiles      = "Файла(ов) не существует:";
    sTxtWantSave     = "Вы хотите извлечь выделенные ключи конфигурации плагинов и сохранить их в текстовых файлах?";
    sTxtWantLoad     = "Вы хотите загрузить выделенные текстовые файлы в ключи конфигурации плагинов?";
    sTxtNewName      = "Новое имя файла:";
    sTxtBadName      = "Недопустимое имя.";
    sTxtBadChar      = "Недопустимый символ в имени файла.";
    sTxtWantDelete   = "Вы действительно хотите удалить выделенные текстовые файлы?";
    sTxtDeleted      = "Удалено:";
    sTxtNotDeleted   = "Не удалено:";
    sTxtEnvVar       = "переменная среды";
    sTxtAkelDir      = "папка AkelPad";
    sTxtPlugDir      = "папка плагинов";
    sTxtDirNoExists  = "Указанная папка не существует. Вы хотите ее создать?";
    sTxtDirCreFail   = "Не удалось создать папку.";
  }
  else
  {
    sTxtScriptName   = "Plugin Text";
    sTxtOnlyMDI      = "This script does work in MDI/PMDI mode only.";
    sTxtNoTexts      = "There are no any texts in plugins settings.";
    sTxtSetInReg     = "Settings stored in registry";
    sTxtSetInIni     = "Settings stored in file AkelPad.ini";
    sTxtDir          = "Directory for text files: ";
    sTxtPlugin       = "Plugin";
    sTxtKeyTextName  = "Key - text name";
    sTxtTextFile     = "Text file associated with the key";
    sTxtEditText     = "Edit plugin text";
    sTxtLoadText     = "Load text to plugin key";
    sTxtSaveTextFile = "Save plugin text in text file";
    sTxtEditTextFile = "Edit text file";
    sTxtLoadTextFile = "Load text file to plugin key";
    sTxtRenameFile   = "Rename text file";
    sTxtDeleteFile   = "Delete text file";
    sTxtChangeDir    = "Change dir for text files";
    sTxtEditIniFile  = "Edit .ini file";
    sTxtOpenRegEdit  = "Open in RegEdit";
    sTxtLoaded       = "Loaded:";
    sTxtNotLoaded    = "Not loaded:";
    sTxtSaved        = "Saved:";
    sTxtNotSaved     = "Not saved:";
    sTxtNoFiles      = "No file(s):";
    sTxtWantSave     = "Do you want to extract selected plugin keys and save in text files?";
    sTxtWantLoad     = "Do you want to load selected text files to plugin keys?";
    sTxtNewName      = "new name:";
    sTxtBadName      = "Illegal name.";
    sTxtBadChar      = "Illegal character in the name.";
    sTxtWantDelete   = "Do you want to delete selected text files?";
    sTxtDeleted      = "Deleted:";
    sTxtNotDeleted   = "Not deleted:";
    sTxtEnvVar       = "environment variable";
    sTxtAkelDir      = "AkelPad directory";
    sTxtPlugDir      = "plugins directory";
    sTxtDirNoExists  = "This directory does not exist. Do you want to create it?";
    sTxtDirCreFail   = "Failed to create this director
Last edited by KDJ on Sun Jun 05, 2016 3:20 pm, edited 19 times in total.

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

Post by KDJ »

InputBox with multiple edit value and variable window width.
The script should be saved in directory: ...\AkelPad\AkelFiles\Plugs\Scripts\Include\

Code: Select all

// InputBox_function.js
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=17609#p17609
// Version: 2015-05-09
// Author: KDJ
//
// InputBox with multiple edit value and variable window width.
// Window width adjusts to the length of caption and labels.
//
// Usage:
// if (! AkelPad.Include("InputBox_function.js")) WScript.Quit();
// vRetVal = InputBox(hWndOwn, sCaption, vLabelT, vEdit, nFocus, oFunction, vFuncArg, nMinEditW, vLabelB, vLabelL, vLabelR, vEditLength);
//
// Arguments (all are optional):
// hWndOwn (number)
//   Handle to the owner window of the input box. Default is 0 - desktop window.
// sCaption (string)
//   Dialog box title. Default is "".
// vLabelT (string or array of strings)
//   Top labels of edit boxes. In string can use "\n" to create multiline label.
// vEdit (string or array of strings)
//   Edit boxes texts. Default is "".
//   Maximum number of elements in array is 100.
//   Maximum length of edit text is 32767 characters (see vEditLength).
// nFocus (number)
//   Index of vEdit array item, on which will set keyboard focus. First and default is 0.
// oFunction (object Function or string as function name)
//   Name of the function used to validate entered data.
//   The function is called when pressed button "OK", but before closing dialog box.
//   To the function are passed three arguments:
//     - handle to dialog box,
//     - array containing all of input strings,
//     - vFuncArg (optional).
//   If input strings are valid, the function should return -1. Otherwise, index of incorrect string in array.
// vFuncArg (any type)
//   Additional argument passed to oFunction.
// nMinEditW (number)
//   Minimum width of edit controls in pixels. Default is 20. The actual field width is adjusted to the width of dialog box.
// vLabelB (string or array of strings)
//   Bottom labels of edit boxes. In string can use "\n" to create multiline label.
// vLabelL (string or array of strings)
//   Left labels of edit boxes.
// vLabelR (string or array of strings)
//   Right labels of edit boxes.
// vEditLength (number or array of numbers)
//   Maximum length of edit text in characters
//   If not specified, or < 1, or > 32767, it will be assumed value 32767.
//
// Return value:
//   undefined - if pressed Cancel button or Esc key,
//   array of strings - edit boxes texts, if vEdit is array,
//   string -  edit box text, otherwise.

function InputBox(hWndOwn, sCaption, vLabelT, vEdit, nFocus, oFunc, vFuncArg, nMinEditW, vLabelB, vLabelL, vLabelR, vEditLength)
{
  var oSys = AkelPad.SystemFunction();
  var vRetVal;

  try
  {
    oSys.RegisterCallback(InputBoxCallback);
  }
  catch (oError)
  {
    WScript.Echo("Unable to register callback function.");
    return vRetVal;
  }

  var hInstDLL = AkelPad.GetInstanceDll();
  var hIcon    = oSys.Call("User32::LoadImageW", hInstDLL, 101 /*lpszName*/, 1 /*uType=IMAGE_ICON*/, 16 /*cxDesired*/, 16 /*cyDesired*/, 0 /*fuLoad*/);
  var nGroups  = 1;
  var sTxtOK;
  var sTxtCancel;
  var aEdit;
  var aLabelT;
  var aLabelB;
  var aLabelL;
  var aLabelR;
  var aEditLength;
  var lpTemp;
  var lpItem;
  var i;

  switch (AkelPad.GetLangId(0 /*LANGID_FULL*/))
  {
    case 1045 : //Polish
      sTxtOK     = "OK";
      sTxtCancel = "Anuluj";
      break;
    case 1049 : //Russian
      sTxtOK     = "\u041E\u041A";
      sTxtCancel = "\u041E\u0442\u043C\u0435\u043D\u0430";
      break;
    case 2052 : //Chinese-Simplified (by cnnnc)
      sTxtOK     = "\u786E\u5B9A";
      sTxtCancel = "\u53D6\u6D88";
      break;
    default :
      sTxtOK     = "OK";
      sTxtCancel = "Cancel";
  }

  if ((typeof hWndOwn != "number") || (! oSys.Call("User32::IsWindow", hWndOwn)))
    hWndOwn = oSys.Call("User32::GetDesktopWindow");

  if (typeof sCaption != "string")
    sCaption = "";

  if (typeof vEdit == "string")
    aEdit = [vEdit];
  else if ((vEdit instanceof Array) && vEdit.length)
    aEdit = vEdit.slice(0);
  else
    aEdit = [""];

  if (aEdit.length > 100)
    aEdit.length = 100;

  if (typeof vLabelT == "string")
    aLabelT = [vLabelT];
  else if ((vLabelT instanceof Array) && vLabelT.length)
    aLabelT = vLabelT.slice(0);

  if (typeof vLabelB == "string")
    aLabelB = [vLabelB];
  else if ((vLabelB instanceof Array) && vLabelB.length)
    aLabelB = vLabelB.slice(0);

  if (typeof vLabelL == "string")
    aLabelL = [vLabelL];
  else if ((vLabelL instanceof Array) && vLabelL.length)
    aLabelL = vLabelL.slice(0);

  if (typeof vLabelR == "string")
    aLabelR = [vLabelR];
  else if ((vLabelR instanceof Array) && vLabelR.length)
    aLabelR = vLabelR.slice(0);

  if (typeof vEditLength == "number")
    aEditLength = [vEditLength];
  else if ((vEditLength instanceof Array) && vEditLength.length)
    aEditLength = vEditLength.slice(0);
  else
    aEditLength = [32767];

  for (i = 0; i < aEdit.length; ++i)
  {
    if (typeof aEdit[i] != "string")
      aEdit[i] = "";

    if (aLabelT)
    {
      if (typeof aLabelT[i] == "string")
        aLabelT[i] = aLabelT[i].split("\n");
      else
        aLabelT[i] = undefined;
    }

    if (aLabelB)
    {
      if (typeof aLabelB[i] == "string")
        aLabelB[i] = aLabelB[i].split("\n");
      else
        aLabelB[i] = undefined;
    }

    if (aLabelL && (typeof aLabelL[i] != "string"))
      aLabelL[i] = undefined;

    if (aLabelR && (typeof aLabelR[i] != "string"))
      aLabelR[i] = undefined;

    if ((typeof aEditLength[i] != "number") || (aEditLength[i] < 1) || (aEditLength[i] > 32767))
      aEditLength[i] = 32767;
  }

  if ((typeof nFocus != "number") || (nFocus < 0))
    nFocus = 0;
  else if (nFocus >= aEdit.length)
    nFocus = aEdit.length - 1;

  if (typeof oFunc != "function")
  {
    if (typeof oFunc == "string")
      oFunc = eval(oFunc);

    if (typeof oFunc != "function")
      oFunc = undefined;
  }

  if ((typeof nMinEditW != "number") || (nMinEditW < 20))
    nMinEditW = 20;

  if (aLabelT) ++nGroups;
  if (aLabelB) ++nGroups;
  if (aLabelL) ++nGroups;
  if (aLabelR) ++nGroups;

  lpTemp = AkelPad.MemAlloc(24 + (2 + aEdit.length * nGroups) * 28);

  //Dialog
  AkelPad.MemCopy(_PtrAdd(lpTemp, 0),                 0x90C80000, 3 /*DT_DWORD*/); //style=WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU
  AkelPad.MemCopy(_PtrAdd(lpTemp, 8), 2 + aEdit.length * nGroups, 4 /*DT_WORD*/);  //cdit

  //Buttons
  lpItem = _PtrAdd(lpTemp, 24);
  CopyToTemplate(0x50010001 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_DEFPUSHBUTTON*/, 0, 2000, 0x80 /*Button*/);
  lpItem = _PtrAdd(lpItem, 28);
  CopyToTemplate(0x50010000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP*/, 0, 2001, 0x80);

  //Edits and Labels
  for (i = 0; i < aEdit.length; ++i)
  {
    lpItem = _PtrAdd(lpItem, 28);
    CopyToTemplate(0x50010080 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL*/, 0x200 /*WS_EX_CLIENTEDGE*/, 3000 + i, 0x0081 /*Edit*/);

    if (aLabelT)
    {
      lpItem = _PtrAdd(lpItem, 28);
      CopyToTemplate(0x5000008C /*WS_CHILD|WS_VISIBLE|SS_NOPREFIX|SS_LEFTNOWORDWRAP*/, 0, 3100 + i, 0x0082 /*Static*/);
    }

    if (aLabelB)
    {
      lpItem = _PtrAdd(lpItem, 28);
      CopyToTemplate(0x5000008C /*WS_CHILD|WS_VISIBLE|SS_NOPREFIX|SS_LEFTNOWORDWRAP*/, 0, 3200 + i, 0x0082 /*Static*/);
    }

    if (aLabelL)
    {
      lpItem = _PtrAdd(lpItem, 28);
      CopyToTemplate(0x5000008C /*WS_CHILD|WS_VISIBLE|SS_NOPREFIX|SS_LEFTNOWORDWRAP*/, 0, 3300 + i, 0x0082 /*Static*/);
    }

    if (aLabelR)
    {
      lpItem = _PtrAdd(lpItem, 28);
      CopyToTemplate(0x5000008C /*WS_CHILD|WS_VISIBLE|SS_NOPREFIX|SS_LEFTNOWORDWRAP*/, 0, 3400 + i, 0x0082 /*Static*/);
    }
  }

  if (oSys.Call("User32::DialogBoxIndirectParamW", hInstDLL, lpTemp, hWndOwn, InputBoxCallback, 0) > 0)
  {
    if (vEdit instanceof Array)
      vRetVal = aEdit;
    else
      vRetVal = aEdit[0];
  }

  oSys.Call("User32::DestroyIcon", hIcon);
  oSys.UnregisterCallback(InputBoxCallback);
  AkelPad.MemFree(lpTemp);

  return vRetVal;

  function CopyToTemplate(nStyle, nExStyle, nID, nClass)
  {
    AkelPad.MemCopy(_PtrAdd(lpItem,  0), nStyle,   3 /*DT_DWORD*/); //style
    AkelPad.MemCopy(_PtrAdd(lpItem,  4), nExStyle, 3 /*DT_DWORD*/); //dwExtendedStyle
    AkelPad.MemCopy(_PtrAdd(lpItem, 16), nID,      4 /*DT_WORD*/);  //id
    AkelPad.MemCopy(_PtrAdd(lpItem, 18), 0xFFFF,   4 /*DT_WORD*/);  //next item is a predefined system class
    AkelPad.MemCopy(_PtrAdd(lpItem, 20), nClass,   4 /*DT_WORD*/);  //class
  }

  function InputBoxCallback(hWnd, uMsg, wParam, lParam)
  {
    switch (uMsg)
    {
      case 272 : //WM_INITDIALOG
        var Scale =
        {
          Init: function()
          {
            var hMainWnd = AkelPad.GetMainWnd();
            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);}
        }
        Scale.Init();

        var lpRect   = AkelPad.MemAlloc(16); //sizeof(RECT)
        var hGuiFont = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
        var nFX      = oSys.Call("User32::GetSystemMetrics",  7 /*SM_CXFIXEDFRAME*/);
        var nFY      = oSys.Call("User32::GetSystemMetrics",  8 /*SM_CYFIXEDFRAME*/);
        var nIX      = oSys.Call("User32::GetSystemMetrics", 49 /*SM_CXSMICON*/);
        var nSX      = oSys.Call("User32::GetSystemMetrics", 30 /*SM_CXSIZE*/);
        var nCY      = oSys.Call("User32::GetSystemMetrics",  4 /*SM_CYCAPTION*/);
        var nLabelH  = Scale.Y(13);
        var nEditH   = Scale.Y(20);
        var nButtonW = Scale.X(80);
        var nButtonH = Scale.Y(23);
        var nGapW    = Scale.X(10);
        var nGapH    = Scale.Y(10);
        var nLabelLW = GetTextMaxWidth(aLabelL, 0, hGuiFont);
        var nLabelRW = GetTextMaxWidth(aLabelR, 0, hGuiFont);
        var nClientW = Math.max(GetTextMaxWidth([sCaption]) + nIX + nSX + nGapW, Math.max(GetTextMaxWidth(aLabelT, aLabelB, hGuiFont), Scale.X(nMinEditW)) + nLabelLW + (nLabelLW ? 3 : 0) + nLabelRW + (nLabelRW ? 3 : 0) + nGapW * 2, Scale.X(80) * 2 + nGapW * 3);
        var nEditW   = nClientW - nLabelLW - (nLabelLW ? 3 : 0) - nLabelRW - (nLabelRW ? 3 : 0) - nGapW * 2;
        var nEditX   = nGapW + nLabelLW + (nLabelLW ? 3 : 0);
        var nLabelRX = nEditX + nEditW + 3;
        var nItemY;
        var nOwnX, nOwnY, nOwnW, nOwnH;
        var nDeskX1, nDeskY1, nDeskX2, nDeskY2;
        var nWndX, nWndY, nWndW, nWndH;
        var i;

        //Edits and Labels
        nItemY = nGapH;
        for (i = 0; i < aEdit.length; ++i)
        {
          if (aLabelT && aLabelT[i])
          {
            WindowMoveAndSetText(3100 + i, nEditX, nItemY, nEditW, nLabelH * aLabelT[i].length, aLabelT[i].join("\n"));
            nItemY += nLabelH * aLabelT[i].length + 3;
          }

          if (aLabelL && aLabelL[i])
            WindowMoveAndSetText(3300 + i, nGapW, nItemY + 3, nLabelLW, nLabelH, aLabelL[i]);

          if (aLabelR && aLabelR[i])
            WindowMoveAndSetText(3400 + i, nLabelRX, nItemY + 3, nLabelRW, nLabelH, aLabelR[i]);

          //Edit
          oSys.Call("User32::SendDlgItemMessageW", hWnd, 3000 + i, 197 /*EM_LIMITTEXT*/, aEditLength[i], 0);
          WindowMoveAndSetText(3000 + i, nEditX, nItemY, nEditW, nEditH, aEdit[i]);
          nItemY += nEditH;

          if (aLabelB && aLabelB[i])
          {
            nItemY += 3;
            WindowMoveAndSetText(3200 + i, nEditX, nItemY, nEditW, nLabelH * aLabelB[i].length, aLabelB[i].join("\n"));
            nItemY += nLabelH * aLabelB[i].length;
          }
          nItemY += nGapH;
        }

        //Buttons
        WindowMoveAndSetText(2000, (nClientW - nGapW) / 2 - nButtonW, nItemY, nButtonW, nButtonH, sTxtOK);
        WindowMoveAndSetText(2001, (nClientW + nGapW) / 2, nItemY, nButtonW, nButtonH, sTxtCancel);

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

        oSys.Call("User32::SystemParametersInfoW", 0x30 /*SPI_GETWORKAREA*/, 0, lpRect, 0);
        nDeskX1 = AkelPad.MemRead(_PtrAdd(lpRect,  0), 3 /*DT_DWORD*/);
        nDeskY1 = AkelPad.MemRead(_PtrAdd(lpRect,  4), 3 /*DT_DWORD*/);
        nDeskX2 = AkelPad.MemRead(_PtrAdd(lpRect,  8), 3 /*DT_DWORD*/);
        nDeskY2 = AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/);
        AkelPad.MemFree(lpRect);

        nWndW = nClientW + nFX * 2;
        nWndH = nItemY + nButtonH + nGapH + nFY * 2 + nCY;
        nWndX = nOwnX + (nOwnW - nWndW) / 2;
        nWndY = nOwnY + (nOwnH - nWndH) / 2;

        if ((nWndX + nWndW) > nDeskX2)
          nWndX = nDeskX2 - nWndW;
        if (nWndX < nDeskX1)
          nWndX = nDeskX1;
        if ((nWndY + nWndH) > nDeskY2)
          nWndY = nDeskY2 - nWndH;
        if (nWndY < nDeskY1)
          nWndY = nDeskY1;

        //Dialog
        AkelPad.SendMessage(hWnd, 0x0080 /*WM_SETICON*/, 0 /*ICON_SMALL*/, hIcon);
        oSys.Call("User32::MoveWindow", hWnd, nWndX, nWndY, nWndW, nWndH, 0);
        oSys.Call("User32::SetWindowTextW", hWnd, sCaption);
        oSys.Call("User32::SetFocus", oSys.Call("User32::GetDlgItem", hWnd, 3000 + nFocus));
        oSys.Call("User32::SendDlgItemMessageW", hWnd, 3000 + nFocus, 177 /*EM_SETSEL*/, 0, -1);
        break;

      case 273 : //WM_COMMAND
        if (wParam == 2000)
        {
          var nEditLen = 32767;
          var lpEdit   = AkelPad.MemAlloc((nEditLen + 1) * 2);
          var nBadInd;
          var i;

          for (i = 0; i < aEdit.length; ++i)
          {
            oSys.Call("User32::GetDlgItemTextW", hWnd, 3000 + i, lpEdit, nEditLen);
            aEdit[i] = AkelPad.MemRead(lpEdit, 1 /*DT_UNICODE*/);
          }

          AkelPad.MemFree(lpEdit);

          if (oFunc)
            nBadInd = oFunc(hWnd, aEdit, vFuncArg);

          if ((typeof nBadInd == "number") && (nBadInd >= 0) && (nBadInd < aEdit.length))
          {
            oSys.Call("User32::SetFocus", oSys.Call("User32::GetDlgItem", hWnd, 3000 + nBadInd));
            oSys.Call("User32::SendDlgItemMessageW", hWnd, 3000 + nBadInd, 177 /*EM_SETSEL*/, 0, -1);
          }
          else
            oSys.Call("User32::PostMessageW", hWnd, 16 /*WM_CLOSE*/, 1, 0);
        }

        else if ((wParam == 2001) || (wParam == 2 /*IDCANCEL*/))
          oSys.Call("User32::PostMessageW", hWnd, 16 /*WM_CLOSE*/, 0, 0);
        break;

      case 16 : //WM_CLOSE
        oSys.Call("User32::EndDialog", hWnd, wParam);
    }

    return 0;

    function GetTextMaxWidth(aText1, aText2, hFont)
    {
      var nWidth = 0;
      var aText;
      var hDC;
      var lpSize;
      var i, n;

      if (aText1)
      {
        if (aText2)
          aText = aText1.concat(aText2);
        else
          aText = aText1;
      }
      else
        aText = aText2;

      if (aText)
      {
        hDC    = oSys.Call("User32::GetDC", hWnd);
        lpSize = AkelPad.MemAlloc(8);

        if (hFont)
          oSys.Call("Gdi32::SelectObject", hDC, hFont);

        oSys.Call("Gdi32::SetMapMode", hDC, 1 /*MM_TEXT*/);

        for (i = 0; i < aText.length; ++i)
        {
          if (aText[i])
          {
            if (aText[i] instanceof Array)
            {
              for (n = 0; n < aText[i].length; ++n)
              {
                oSys.Call("Gdi32::GetTextExtentPoint32W", hDC, aText[i][n], aText[i][n].length, lpSize);

                if (nWidth < AkelPad.MemRead(lpSize, 3 /*DT_DWORD*/))
                  nWidth = AkelPad.MemRead(lpSize, 3 /*DT_DWORD*/);
              }
            }
            else
            {
              oSys.Call("Gdi32::GetTextExtentPoint32W", hDC, aText[i], aText[i].length, lpSize);

              if (nWidth < AkelPad.MemRead(lpSize, 3 /*DT_DWORD*/))
                nWidth = AkelPad.MemRead(lpSize, 3 /*DT_DWORD*/);
            }
          }
        }

        oSys.Call("User32::ReleaseDC", hWnd, hDC); 
        AkelPad.MemFree(lpSize);
      }

      return nWidth;
    }

    function WindowMoveAndSetText(nID, nX, nY, nW, nH, sText)
    {
      oSys.Call("User32::MoveWindow", oSys.Call("User32::GetDlgItem", hWnd, nID), nX, nY, nW, nH, 0);
      oSys.Call("User32::SendDlgItemMessageW", hWnd, nID, 48 /*WM_SETFONT*/, hGuiFont, 0);
      oSys.Call("User32::SetDlgItemTextW", hWnd, nID, sText);
    }
  }
}



Example of use:

Code: Select all

//Example of use InputBox function - ver. 2013-04-14

if (! AkelPad.Include("InputBox_function.js")) WScript.Quit();

var hMainWnd = AkelPad.GetMainWnd();
var vRetVal;

vRetVal = InputBox();
MessageBox(vRetVal);

vRetVal = InputBox(
  hMainWnd,
  "InputBox - medium version",
  ["Input value a:", "Input value b:", "Input value c:"],
  ["Edit value a", "Edit value b", "Edit value c"]);
MessageBox(vRetVal);

vRetVal = InputBox(
  hMainWnd,
  "InputBox - full version",
  ["Top label 1\nInput value a:", "Input value b:", "Top label 3\nInput value c:"],
  ["Edit value a", "Edit value x", "Edit value c"],
  2,
  ErrorBox,
  ["Edit value a", "Edit value b", "Edit value c"],
  300,
  ["Bottom label 1\nin two rows", "Bottom label 2", "Bottom label 3\n\nIf you want to save the values press OK button."],
  ["Left label 1:", "Left label 2:", "Left label 3:"],
  ["Right label 1", "Right label 2", "Right label 3"]);
MessageBox(vRetVal);

function MessageBox(vRetVal)
{
  AkelPad.MessageBox(hMainWnd, "Returned value:\n" + (vRetVal == undefined ? ""  : vRetVal) + "\n\nType:\n" + typeof vRetVal + (vRetVal instanceof Array ? " Array" : ""), "Message", 0x40);
}

function ErrorBox(hWnd, aEdit, aLimit)
{
  for (var i = 0; i < aEdit.length; i++)
  {
    if (aEdit[i] != aLimit[i])
    {
      AkelPad.MessageBox(hWnd, 'In the field #' + (i + 1) + ' must be: "' + aLimit[i] + '"', "Error", 0x30);
      return i;
    }
  }
  return -1;
}
Last edited by KDJ on Sat May 09, 2015 12:27 pm, edited 13 times in total.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Extends(or creates) selection bounding on quotes or parenthesis

Code: Select all

// === [QuoteExtend.js] ===
// Panych Y.W. aka FeyFre(c) 2012-2014
//
// Version 1.0.1
//
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=17980#p17980
//
// Extends selection into delimiting quotes(parenthesis)
//
// Argument:
//	string, specifies left & right bound characters. If string consists of single character - side delimiters are equal. If opted treated as double-quote delimiter
//
// Example:
//   Call( "Scripts::Main", 1, "QuoteExtend.js" ) - default, extend to bounding double-quotes
//   Call( "Scripts::Main", 1, "QuoteExtend.js", `'"'` ) - the same
//   Call( "Scripts::Main", 1, "QuoteExtend.js", `"'"` ) - extend to bounding single-quotes
//   Call( "Scripts::Main", 1, "QuoteExtend.js", '"`"' ) - extend to bounding single-quotes
//   Call( "Scripts::Main", 1, "QuoteExtend.js", "()" )  - extend to bounding round parenthesis
//
//	v1.0 (2012.05.08) Initial release
//	v1.0.1 (2014.04.27) Usage examples fix
//
var FR_DOWN	= 0x00000001;
var FR_UP	= 0x00100000;
var edit = AkelPad.GetEditWnd();
var doit = function(edit, quote)
{
	var qt = quote || '"';
	var ql = qt.charAt(0) || '"';
	var qr = qt.charAt(1) || ql;
	var wnd = edit || AkelPad.GetEditWnd();
	var l = AkelPad.GetSelStart();
	var r = AkelPad.GetSelEnd();
	AkelPad.SetSel(r,r);
	var fr = AkelPad.TextFind(wnd, qr, FR_DOWN);
	AkelPad.SetSel(l,l);
	var fl = AkelPad.TextFind(wnd, ql, FR_UP);
	AkelPad.SetSel(fl==-1?l:(fl+1), fr==-1?r:fr);
}

var quotes = (WScript.Arguments.length >0)? WScript.Arguments(0):'"';
if(edit)
{
	doit(edit,quotes);
}
Last edited by FeyFre on Sun Apr 27, 2014 3:12 pm, edited 1 time in total.

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

Post by VladSh »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=18081#p18081
// Description(1033): Go to FullScreen-mode with additional options for display panels; a return to normal-mode
// Description(1049): Переход в полноэкранный режим с возможностью отображения определённого тулбара; возвращение в нормальный режим
// Version: 2.8 (2015.01.16)
// Author: VladSh
// 
// Arguments:
// 	• ToolBar - ["имя dll-файла_1 плагина без расширения","номера рядов через запятую"],["имя dll-файла_2 плагина без расширения","номера рядов через запятую"];
//				если в одном из плагинов нужно отобразить все ряды, то параметр с номерами рядов можно не записывать
// 	• Explorer, CodeFold, Clipboard, Log, StatusBar, Menu: [0] - не отображать / 1 - отображать
//		• TabBar: [0] - не отображать / 1 - отображать с автоопределением положения / 4301 - сверху / 4302 - снизу
// 
// Usage:
// 	-"Обычный" Call("Scripts::Main", 1, "FullScreenEx.js")
// 	-"С тулбаром по умолчанию" Call("Scripts::Main", 1, "FullScreenEx.js", `-ToolBar='[["ToolBar"]]'`)
// 	-"С дополнительной панелью для работы с XML" Call("Scripts::Main", 1, "FullScreenEx.js", `-ToolBar='[["ToolBar","1,3"],["ToolBar-XML"]]' -CodeFold=1`)
// 	-"Псевдо-SDI" Call("Scripts::Main", 1, "FullScreenEx.js", `-ToolBar='[["ToolBar"]]' -Menu=1 -StatusBar=1`)

var pFullScreen = "FullScreen::Main";
var Toolbars = AkelPad.GetArgValue("ToolBar", "");
if (Toolbars) {
	Toolbars = eval(Toolbars);
	for (i = 0; i < Toolbars.length; i++) {
		Toolbars[i] = getToolbar(Toolbars[i]);
	}
}

//ПЕРЕХОД ИЗ ОБЫЧНОГО РЕЖИМА В ПОЛНОЭКРАННЫЙ
if (!AkelPad.IsPluginRunning(pFullScreen)) {
	var pExplorer = "Explorer::Main";
	var pCodeFold = "Coder::CodeFold";
	var pClipboard = "Clipboard::Capture";
	var pLog = "Log::Output";
	var hWndMain = AkelPad.GetMainWnd();
	
	var bExplorer = AkelPad.GetArgValue("Explorer", 0);
	var bCodeFold = AkelPad.GetArgValue("CodeFold", 0);
	var bClipboard = AkelPad.GetArgValue("Clipboard", 0);
	var bLog = AkelPad.GetArgValue("Log", 0);
	var IDM_VIEW_SHOW_STATUSBAR = 4211;
	var bStatusBar = AkelPad.GetArgValue("StatusBar", 0);
	var bMenu = AkelPad.GetArgValue("Menu", 0);
	var nTabBar = AkelPad.GetArgValue("TabBar", 0);
	
	//если панели перед запуском включены, - отключаем, т.к. без этого потом не запустятся
	
	if (Toolbars) {
		for (i = Toolbars.length - 1; i >= 0; i--) {
			if (AkelPad.IsPluginRunning(Toolbars[i].file)) {
				AkelPad.Call(Toolbars[i].file);
			}
		}
	}
	
	if (bExplorer && AkelPad.IsPluginRunning(pExplorer))
		AkelPad.Call(pExplorer);
	
	if (bCodeFold && AkelPad.IsPluginRunning(pCodeFold))
		AkelPad.Call(pCodeFold);
	
	if (bClipboard && AkelPad.IsPluginRunning(pClipboard))
		AkelPad.Call(pClipboard);
	
	if (bLog && AkelPad.IsPluginRunning(pLog))
		AkelPad.Call(pLog);
	
	if (bStatusBar && AkelPad.SendMessage(hWndMain, 1222 /*AKD_GETMAININFO*/, 142 /*MI_STATUSBAR*/, 0))
		AkelPad.Command(IDM_VIEW_SHOW_STATUSBAR);
	
	if (bMenu) {
		var oSys = AkelPad.SystemFunction();
		var hMenu = oSys.Call("user32::GetMenu", hWndMain);
	}
	
	//ЗАПУСК ПОЛНОЭКРАННОГО РЕЖИМА
	AkelPad.Call(pFullScreen);
	
	if (Toolbars) {
		for (i = Toolbars.length - 1; i >= 0; i--) {
			if (Toolbars[i].rows)
				AkelPad.Call(Toolbars[i].file, 1, Toolbars[i].rows);
			else
				AkelPad.Call(Toolbars[i].file, 1);
		}
	}
	
	if (bExplorer)
		AkelPad.Call(pExplorer);
	
	if (bCodeFold)
		AkelPad.Call(pCodeFold);
	
	if (bClipboard)
		AkelPad.Call(pClipboard);
	
	if (bLog)
		AkelPad.Call(pLog);
	
	if (bStatusBar)
		AkelPad.Command(IDM_VIEW_SHOW_STATUSBAR);
	
	if (bMenu)
		oSys.Call("user32::SetMenu", hWndMain, hMenu);
	
	if (nTabBar) {
		var nCommand;
		if (nTabBar > 1)
			nCommand = nTabBar;
		else {
			var nState = AkelPad.SendMessage(hWndMain, 1222 /*AKD_GETMAININFO*/, 157 /*MI_TABOPTIONSMDI*/, 0);
			if (nState & 2 /*TAB_VIEW_TOP*/)
				nCommand = 4301;		/*IDM_WINDOW_TABVIEW_TOP*/
			else
				nCommand = 4302;		/*IDM_WINDOW_TABVIEW_BOTTOM*/
		}
		AkelPad.Command(4303 /*IDM_WINDOW_TABVIEW_NONE*/);
		AkelPad.Command(nCommand);
	}
}

//ПЕРЕХОД ИЗ ПОЛНОЭКРАННОГО РЕЖИМА В ОБЫЧНЫЙ
else {
	AkelPad.Call(pFullScreen);
	
	//если тулбар отключён - включаем для нормального восстановления вида проги
	if (Toolbars) {
		for (i = Toolbars.length - 1; i >= 0; i--) {
			if (!AkelPad.IsPluginRunning(Toolbars[i].file)) {
				AkelPad.Call(Toolbars[i].file);
			}
		}
	}
}

// преобразование отдельного тулбара из соотв. аргумента в определённую структуру
function getToolbar(pToolbar) {
	return {
		file: pToolbar[0] + "::Main",
		rows: (pToolbar.length > 1 && pToolbar[pToolbar.length-1]) ? pToolbar[1] : ""
	}
}
Поддерживаются параметры (соответствуют панелям):
• ToolBar (STRING) - имя dll-файла без расширения
все остальные как BOOLEAN-INTEGER (0/1):
• Log
• Clipboard
• Explorer
• CodeFold
• StatusBar
• Menu
• TabBar (0/1/4301/4302)

Благодарности: Lenchik, Instructor, San_dr, KDJ.
Last edited by VladSh on Fri Jan 16, 2015 4:18 pm, edited 9 times in total.

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

Post by Instructor »

Cycle switch between fonts.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=18278#p18278
// Version: 1.5
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Cycle switch between fonts.
// Description(1049): Цикличное переключение между шрифтами.
//
// Arguments:
// -FontList="Name1,Style1,Size1|Name2,Style2,Size2|..."   -Font list:
//                                                            Name
//                                                              Font face, for example, "Courier". Unchanged, if empty.
//                                                            Style (one of the following):
//                                                              0  ignored.
//                                                              1  normal.
//                                                              2  bold.
//                                                              3  italic.
//                                                              4  bold italic.
//                                                            Size
//                                                              Font size. Unchanged, if 0.
// Usage:
// Call("Scripts::Main", 1, "FontSwitch.js", `-FontList="Courier New,0,10|MS Sans Serif,0,8|Arial,0,10"`)

//Arguments
var pFontList=AkelPad.GetArgValue("FontList", "");

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var lpLogFont;
var aFontStr;
var aFontItem;
var aFontList=[];
var pFontName="";
var nFontStyle=0;
var nFontSize=0;
var nWeight;
var nItalic;
var i;

if (hWndEdit && pFontList)
{
  //Current font
  if (lpLogFont=AkelPad.MemAlloc(92 /*sizeof(LOGFONTW)*/))
  {
    AkelPad.SendMessage(hMainWnd, 1233 /*AKD_GETFONTW*/, hWndEdit, lpLogFont);

    //Name
    pFontName=AkelPad.MemRead(_PtrAdd(lpLogFont, 28) /*offsetof(LOGFONTW, lfFaceName)*/, 1 /*DT_UNICODE*/);

    //Style
    nWeight=AkelPad.MemRead(_PtrAdd(lpLogFont, 16) /*offsetof(LOGFONTW, lfWeight)*/, 3 /*DT_DWORD*/);
    nItalic=AkelPad.MemRead(_PtrAdd(lpLogFont, 20) /*offsetof(LOGFONTW, lfItalic)*/, 5 /*DT_BYTE*/);
    if (nWeight == 700 /*FW_BOLD*/)
    {
      if (nItalic)
        nFontStyle=4 /*FS_FONTBOLDITALIC*/;
      else
        nFontStyle=2 /*FS_FONTBOLD*/;
    }
    else
    {
      if (nItalic)
        nFontStyle=3 /*FS_FONTITALIC*/;
      else
        nFontStyle=1 /*FS_FONTNORMAL*/;
    }

    //Size
    nFontSize=AkelPad.SendMessage(hWndEdit, 3188 /*AEM_GETCHARSIZE*/, 3 /*AECS_POINTSIZE*/, 0);
    AkelPad.MemFree(lpLogFont);
  }

  if (pFontName && nFontSize)
  {
    if (aFontStr=pFontList.split("|"))
    {
      //Parse list
      for (i=0; i < aFontStr.length; ++i)
      {
        if ((aFontItem=aFontStr[i].split(",")) && aFontItem.length == 3)
        {
          aFontList[i]=[];
          aFontList[i].Name=aFontItem[0];
          aFontList[i].Style=parseInt(aFontItem[1]);
          aFontList[i].Size=parseInt(aFontItem[2]);
        }
      }

      //Find current font in list
      for (i=0; i < aFontList.length; ++i)
      {
        if ((!aFontList[i].Name || aFontList[i].Name == pFontName) &&
            (!aFontList[i].Style || aFontList[i].Style == nFontStyle) &&
            (!aFontList[i].Size || aFontList[i].Size == nFontSize))
          break;
      }

      //Set next font
      if (++i >= aFontList.length) i=0;
      AkelPad.Font(aFontList[i].Name, aFontList[i].Style, aFontList[i].Size);
    }
  }
}
Last edited by Instructor on Sat Apr 18, 2015 4:20 am, edited 2 times in total.

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

Post by KDJ »

Cycle switch between fonts. Alternative version of FontSwitch.js by Instructor.
The script saves settings in .ini file. To change the font list, you can edit this file.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=18299#p18299
// Version: 2015-01-06
// Author: KDJ
// 
// *** Cycle switch between fonts ***
//
// Extended version of FontSwitch.js by Instructor.
//
// Usage: 
//   Call("Scripts::Main", 1, "FontCycleSwitch.js")
//   Call("Scripts::Main", 1, "FontCycleSwitch.js", '-AddCurFont=1 -Reverse=1 -Local=1')
//
// Arguments:
//   AddCurFont
//     1 - add font from current edit window to the list (if not exists)
//     0 - not add (default)
//   Reverse
//     1 - switch in reverse direction
//     0 - switch with increasing index (default)
//   Local
//     1 - change font locally
//     0 - change font globally (default)
// 
// The script saves settings in .ini file. To change the font list, you can edit this file.
// Example of contents the configuration file:
//   nFont=0;
//   aFonts=[
//   ["Courier New",3,11],
//   ["MS Sans Serif",1,17],
//   ["Tahoma",2,9],
//   ["Lucida Console",3,12],
//   ["Arial",4,15]
//   ];

var bAddFont = AkelPad.GetArgValue("AddCurFont", 0);
var bReverse = AkelPad.GetArgValue("Reverse", 0);
var bLocal   = AkelPad.GetArgValue("Local", 0);
var oSys     = AkelPad.SystemFunction();
var sIniFile = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".ini";
var oFSO     = new ActiveXObject("Scripting.FileSystemObject");
var hEditWnd = AkelPad.GetEditWnd(); 
var nFont    = 0;
var aFonts   = [];
var hFont;
var aCurFont;
var oError;
var sIniTxt;
var oFile;
var i;

if (hEditWnd)
{
  //read settings
  if (oFSO.FileExists(sIniFile))
  {
    try
    {
      eval(AkelPad.ReadFile(sIniFile));
    }
    catch (oError)
    {
    }
  }

  //check index
  if ((nFont < 0) || (! aFonts.length))
    nFont = 0;
  else if (nFont >= aFonts.length)
    nFont = aFonts.length - 1;

  //add current font
  if (bAddFont || (! aFonts.length))
  {
    hFont    = AkelPad.SendMessage(hEditWnd, 0x0031 /*WM_GETFONT*/, 0, 0);
    aCurFont = ConvertFontFormat(hFont, 2, 3);

    for (i = 0; i < aFonts.length; ++i)
    {
      if ((aFonts[i][0] == aCurFont[0]) && (aFonts[i][1] == aCurFont[1]) && (aFonts[i][2] == aCurFont[2]))
        break;
    }
    if (i == aFonts.length)
    {
      aFonts.splice(nFont, 0, aCurFont);
      if (! bReverse)
        ++nFont;
    }
  } 

  //next index
  if (bReverse)
  {
    if (--nFont < 0)
      nFont = aFonts.length - 1;
  }
  else
  {
    if (++nFont >= aFonts.length)
      nFont = 0;
  }

  //set font
  if (bLocal)
  {
    hFont = ConvertFontFormat(aFonts[nFont], 3, 2);
    AkelPad.SendMessage(hEditWnd, 0x0030 /*WM_SETFONT*/, hFont, 1);
    oSys.Call("Gdi32::DeleteObjectW", hFont);
  }
  else
    AkelPad.Font(aFonts[nFont][0], aFonts[nFont][1], aFonts[nFont][2]);

  //save settings
  sIniTxt = 'nFont='+ nFont + ';\r\naFonts=[\r\n';

  for (i = 0; i < aFonts.length; ++i)
    sIniTxt += '["' + aFonts[i][0] + '",' + aFonts[i][1] + ',' + aFonts[i][2] + '],\r\n';
  
  if (sIniTxt.slice(-3, -2) == ",")
    sIniTxt = sIniTxt.slice(0, -3);
  
  sIniTxt += '\r\n];';

  oFile = oFSO.OpenTextFile(sIniFile, 2, true, 0);
  oFile.Write(sIniTxt);
  oFile.Close();
}

function ConvertFontFormat(vFont, nInType, nRetType)
{
  //nInType, nRetType:
  //1 - pointer to LOGFONT structure
  //2 - handle to font
  //3 - array [sFontName, nFontStyle, nFontSize]

  if (nInType == nRetType)
    return vFont;

  var nLFSize  = 28 + 32 * 2; //sizeof(LOGFONTW)
  var lpLF     = AkelPad.MemAlloc(nLFSize);
  var hFont;
  var hDC;
  var nHeight;
  var nWeight;
  var bItalic;
  var vRetVal;
  var i;

  if (nInType == 1)
  {
    for (i = 0; i < nLFSize; ++i)
      AkelPad.MemCopy(_PtrAdd(lpLF, i), AkelPad.MemRead(_PtrAdd(vFont, i),  5 /*DT_BYTE*/, 5 /*DT_BYTE*/));
  }
  else if (nInType == 2)
  {
    if (! vFont)
      vFont = oSys.Call("Gdi32::GetStockObject", 13 /*SYSTEM_FONT*/);

    oSys.Call("Gdi32::GetObjectW", vFont, nLFSize, lpLF);
  }
  else if (nInType == 3)
  {
    hDC     = oSys.Call("User32::GetDC", hEditWnd);
    nHeight = -oSys.Call("Kernel32::MulDiv", vFont[2], oSys.Call("Gdi32::GetDeviceCaps", hDC, 90 /*LOGPIXELSY*/), 72);
    oSys.Call("User32::ReleaseDC", hEditWnd, hDC);

    nWeight = 400;
    bItalic = 0;
    if ((vFont[1] == 2) || (vFont[1] == 4))
      nWeight = 700;
    if (vFont[1] > 2)
      bItalic = 1;

    AkelPad.MemCopy(_PtrAdd(lpLF,  0),  nHeight, 3 /*DT_DWORD*/);   //lfHeight
    AkelPad.MemCopy(_PtrAdd(lpLF, 16),  nWeight, 3 /*DT_DWORD*/);   //lfWeight
    AkelPad.MemCopy(_PtrAdd(lpLF, 20),  bItalic, 5 /*DT_BYTE*/);    //lfItalic
    AkelPad.MemCopy(_PtrAdd(lpLF, 28), vFont[0], 1 /*DT_UNICODE*/); //lfFaceName
  }

  if (nRetType == 1)
    vRetVal = lpLF;
  else if (nRetType == 2)
  {
    vRetVal = oSys.Call("Gdi32::CreateFontIndirectW", lpLF);
    AkelPad.MemFree(lpLF);
  }
  else if (nRetType == 3)
  {
    vRetVal    = [];
    vRetVal[0] = AkelPad.MemRead(_PtrAdd(lpLF, 28), 1 /*DT_UNICODE*/); //lfFaceName

    nWeight = AkelPad.MemRead(_PtrAdd(lpLF, 16), 3 /*DT_DWORD*/); //lfWeight
    bItalic = AkelPad.MemRead(_PtrAdd(lpLF, 20), 5 /*DT_BYTE*/);  //lfItalic

    if (nWeight < 600)
      vRetVal[1] = 1;
    else
      vRetVal[1] = 2;

    if (bItalic)
      vRetVal[1] += 2;

    hDC        = oSys.Call("User32::GetDC", hEditWnd);
    nHeight    = AkelPad.MemRead(lpLF, 3 /*DT_DWORD*/); //lfHeight
    vRetVal[2] = -oSys.Call("Kernel32::MulDiv", nHeight, 72, oSys.Call("Gdi32::GetDeviceCaps", hDC, 90 /*LOGPIXELSY*/));
    oSys.Call("User32::ReleaseDC", hEditWnd, hDC); 
    AkelPad.MemFree(lpLF);
  }

  return vRetVal;
}


------------------------------------
Another version of the script.
Note:
- this script modifies itself (saves nFont value),
- the script must be saved in ANSI format.
Second part of the script name comes from VladSh: viewtopic.php?p=18308&hilit=#p18308

Code: Select all

// FontCycleSwitch_PerverseCode.js - ver. 2012-06-04
//
// Cycle switch between fonts. Alternative version of FontSwitch.js by Instructor.
//
// Call("Scripts::Main", 1, "FontCycleSwitch_PerverseCode.js")
//
// Note: This script modifies itself (saves nFont value).
//       The script must be saved in ANSI format.

//here you can insert the desired fonts:
var aFonts = [
               ["Courier New",    0, 11],
               ["MS Sans Serif",  1, 17],
               ["Tahoma",         2,  9],
               ["Lucida Console", 3, 12],
               ["Arial",          4, 15]
             ];

//////////////
var nFont = 0;
//////////////

if (nFont >= aFonts.length)
  nFont = 0;

AkelPad.Font(aFonts[nFont][0], aFonts[nFont][1], aFonts[nFont][2]);

var sScrFile = WScript.ScriptFullName;
var sScrText = AkelPad.ReadFile(sScrFile).replace(/(var\s+nFont\s*=\s*)(\d+)(\s*;)/, "$1" + ++nFont + "$3");
var oFSO     = new ActiveXObject("Scripting.FileSystemObject");
var oFile    = oFSO.OpenTextFile(sScrFile, 2, true, 0);

oFile.Write(sScrText);
oFile.Close();
Last edited by KDJ on Tue Jan 06, 2015 7:34 pm, edited 6 times in total.

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

Post by Infocatcher »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=18306#p18306
// http://infocatcher.ucoz.net/js/akelpad_scripts/adblockPlusChecksum.js

// (c) Infocatcher 2012
// version 0.1.1 - 2012-06-09

// Adds checksum to Adblock Plus subscription
// http://adblockplus.org/en/faq_internal#checksum

// Dependencies:
//   getHash.js   - http://akelpad.sourceforge.net/forum/viewtopic.php?p=11096#p11096
//   converter.js - http://akelpad.sourceforge.net/forum/viewtopic.php?p=11095#p11095


var hMainWnd = AkelPad.GetMainWnd();
var hWndEdit = AkelPad.GetEditWnd();
var oSys = AkelPad.SystemFunction();

var hashesArgs = {
	codePage: 65001 // UTF-8 for MD5
};
var convertersArgs = {
	codePageBase64: 28591 // ISO-8859-1 for base64
};

if(
	hMainWnd
	&& hWndEdit
	&& AkelPad.Include("..\\getHash.js")
	&& AkelPad.Include("..\\converter.js")
) {
	if(typeof hashes == "undefined")
		AkelPad.MessageBox(hMainWnd, "Required getHash.js v.0.2.3 and higher", WScript.ScriptName, 16 /*MB_ICONERROR*/);
	else if(typeof converters == "undefined")
		AkelPad.MessageBox(hMainWnd, "Required converter.js v.0.2.3 and higher", WScript.ScriptName, 16 /*MB_ICONERROR*/);
	else
		addChecksum();
}

function _localize(s) {
	var strings = {
		"This is not a Adblock Plus subscription!": {
			ru: "Это не подписка для Adblock Plus!"
		},
		"Checksum already added!": {
			ru: "Контрольная сумма уже добавлена!"
		}
	};
	var lng;
	switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
		case 0x19: lng = "ru"; break;
		default:   lng = "en";
	}
	_localize = function(s) {
		return strings[s] && strings[s][lng] || s;
	};
	return _localize(s);
}

function addChecksum() {
	// adblock_plus-2.0.3-sm+tb+fn+fx.xpi\modules\Synchronizer.jsm
	// function readFilters(subscription, text, errorCallback)

	// adblock_plus-2.0.3-sm+tb+fn+fx.xpi\modules\Utils.jsm
	// Checksum is an MD5 checksum (base64-encoded without the trailing "=") of
	// all lines in UTF-8 without the checksum line, joined with "\n".

	var text = AkelPad.GetTextRange(0, -1, 2 /*\n*/);
	if(!/^\[Adblock(\s*Plus\s*([\d\.]+)?)?\]\n/i.test(text)) {
		AkelPad.MessageBox(
			hMainWnd,
			_localize("This is not a Adblock Plus subscription!"),
			WScript.ScriptName,
			48 /*MB_ICONEXCLAMATION*/
		);
		return;
	}
	if(/\n[ \t]*![ \t]*checksum[ \t:-]+([\w+\/=]+)\n/i.test(text)) {
		var oldChecksum = RegExp.$1;
		text = RegExp.leftContext + "\n" + RegExp.rightContext;
		var insPosStart = RegExp.leftContext.length + 1;
		var insPosEnd = RegExp.leftContext.length + RegExp.lastMatch.length - 1;
		var insNoNewLine = true;
	}
	var newChecksum = generateChecksum(text);
	if(oldChecksum && newChecksum == oldChecksum) {
		AkelPad.MessageBox(
			hMainWnd,
			_localize("Checksum already added!"),
			WScript.ScriptName,
			64 /*MB_ICONINFORMATION*/
		);
		return;
	}

	if(!insPosStart && /^[^\n\r]*\n/.test(text))
		insPosStart = insPosEnd = RegExp.lastMatch.length - 1;

	setRedraw(hWndEdit, false);
	AkelPad.SetSel(insPosStart, insPosEnd);
	AkelPad.ReplaceSel((insNoNewLine ? "" : "\n") + "! Checksum: " + newChecksum);
	setRedraw(hWndEdit, true);
}
function generateChecksum(str) {
	str = str.replace(/[\r\n]+/g, "\n");

	// Perl: md5_base64($data)
	// PHP: preg_replace('/=+$/', '', base64_encode(pack('H*',md5($data))));
	var hash = hashes.md5(str);
	var pached = pack(hash);
	var base64 = converters.base64.encode(pached);
	return base64.replace(/=+$/, "");
}

function pack(str) {
	// Based on code from http://phpjs.org/functions/pack:880 (only for pack("H*", str))
	// + String[N] => String.charAt(N)
	var result = "";
	var quantifier = str.length;
	for (var i = 0; i < quantifier; i += 2) {
	    // Always get per 2 bytes...
	    var word = str.charAt(i);
	    if (((i + 1) >= quantifier) || typeof(str.charAt(i + 1)) === 'undefined') {
	        word += '0';
	    } else {
	        word += str.charAt(i + 1);
	    }
	    result += String.fromCharCode(parseInt(word, 16));
	}
	return result;
}

function setRedraw(hWnd, bRedraw) {
	AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
	bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}
<download | mirror | development version>
Adds checksum to Adblock Plus subscription.
Dependencies:
Last edited by Infocatcher on Sun Feb 10, 2013 6:29 pm, edited 2 times in total.

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

Post by KDJ »

Switch between different views of AkelPad screen.

This script has been moved to another location: ScreenView.js
Last edited by KDJ on Mon Dec 17, 2012 8:34 pm, edited 6 times in total.

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

Post by Infocatcher »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=18433#p18433
// http://infocatcher.ucoz.net/js/akelpad_scripts/restart.js
// https://github.com/Infocatcher/AkelPad_scripts/blob/master/restart.js

// (c) Infocatcher 2012-2014
// version 0.1.1+ - 2014-03-29

// Restart AkelPad

// Dependencies:
//   Sessions plugin
//   NirCmd utility - http://www.nirsoft.net/utils/nircmd.html

// Arguments:
//   -nirCmd="path\to\nircmd.exe" - you can use environment variables like %ProgramFiles%
//   -session="OnExit"            - name of autosaved session in Sessions plugin
//   -sessionAutoSave=false       - checked state of "save on exit" in Sessions plugin settings
//   -sessionAutoLoad=false       - checked state of "open on start" in Sessions plugin settings

// Usage:
//   Call("Scripts::Main", 1, "restart.js")
//   Call("Scripts::Main", 1, "restart.js", '-nirCmd="%a\..\NirCmd\nircmd.exe" -session="OnExit"')

var oSys = AkelPad.SystemFunction();
var akelDir = AkelPad.GetAkelDir();
var nirCmdPath = AkelPad.GetArgValue("nirCmd", "%a\\AkelFiles\\Utils\\nircmd.exe");
var nirCmd = expandEnvironmentVariables(nirCmdPath);
if(!new ActiveXObject("Scripting.FileSystemObject").FileExists(nirCmd)) {
	error(
		"NirCmd utility not found!\nYou can download it here: http://www.nirsoft.net/utils/nircmd.html\n\n"
		+ (nirCmd == nirCmdPath ? nirCmd : nirCmdPath + "\n=> " + nirCmd)
	);
	WScript.Quit();
}
var session = AkelPad.GetArgValue("session", "OnExit");
var sessionAutoSave = AkelPad.GetArgValue("sessionAutoSave", false);
var sessionAutoLoad = AkelPad.GetArgValue("sessionAutoLoad", false);
var pid = oSys.Call("kernel32::GetCurrentProcessId");

// Get real AkelPad executable
var MAX_PATH = 0x104;
var lpBuffer = AkelPad.MemAlloc(MAX_PATH*_TSIZE);
if(lpBuffer) {
	if(oSys.Call("kernel32::GetModuleFileName" + _TCHAR, null, lpBuffer, MAX_PATH))
		var akelExe = AkelPad.MemRead(lpBuffer, _TSTR);
	else
		failed("GetModuleFileName");
	AkelPad.MemFree(lpBuffer);
}
if(!akelExe)
	akelExe = akelDir + "\\AkelPad.exe";

// Get current directory
var nBufferLength = oSys.Call("kernel32::GetCurrentDirectory" + _TCHAR, 0, 0);
if(nBufferLength) {
	var lpBuffer = AkelPad.MemAlloc(nBufferLength*_TSIZE);
	if(lpBuffer) {
		if(oSys.Call("kernel32::GetCurrentDirectory" + _TCHAR, nBufferLength, lpBuffer))
			var curDir = AkelPad.MemRead(lpBuffer, _TSTR);
		else
			failed("GetCurrentDirectory");
		AkelPad.MemFree(lpBuffer);
	}
}
if(!curDir)
	curDir = akelDir;

if(!sessionAutoSave || !AkelPad.IsPluginRunning("Sessions::Main"))
	AkelPad.Call("Sessions::Main", 2, session);

AkelPad.Exec('"%nirCmd%" killprocess "%nirCmd%"'.replace(/%nirCmd%/g, nirCmd)); //~ todo: check process command line

var cmd = '"%nirCmd%" waitprocess /%pid% exec2 show "%workDir%" "%akelExe%"';
if(!sessionAutoLoad)
	cmd += ' /Call("Sessions::Main", 1, "%session%")';
cmd = cmd
	.replace(/%nirCmd%/g, nirCmd)
	.replace(/%pid%/g, pid)
	.replace(/%workDir%/g, curDir)
	.replace(/%akelExe%/g, akelExe)
	.replace(/%session%/g, session);
AkelPad.Exec(cmd, akelDir);
AkelPad.Command(4109); // Exit

function expandEnvironmentVariables(s) {
	if(/^%a[\\\/]/.test(s))
		s = akelDir + s.substr(2);
	return new ActiveXObject("WScript.Shell").ExpandEnvironmentStrings(s);
}
function error(s) {
	AkelPad.MessageBox(
		AkelPad.GetMainWnd(),
		s,
		WScript.ScriptName,
		16 /*MB_ICONERROR*/
	);
}
function failed(func) {
	error(func + "() failed!\nError: " + oSys.Call("kernel32::GetLastError"));
}
<download | mirror | development version>
Restart AkelPad.
Dependencies:
Last edited by Infocatcher on Sat Mar 29, 2014 11:10 am, edited 2 times in total.

Offline
Posts: 88
Joined: Sun Jun 03, 2012 8:15 am

Post by Visitor7 »

Cycling between specified menubar, toolbar, statusbar and tabbar states.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=18460#p18460
// cpBarSwitch.js    ver.1.6    2012-06-23
// Cycling between specified menubar, toolbar, statusbar and tabbar states.
// Usage: Call("Scripts::Main", 1, "cpBarSwitch.js", "m s1 [s2 s3 s4 ...]")
//    m - bar`s mask, integer 1...15:
//      0x0001 (1)  -  process menubar
//      0x0010 (2)  -  process toolbar      (toolbar.dll plugin required)
//      0x0100 (4)  -  process tabbar
//      0x1000 (8)  -  process statusbar
//    s1 [s2 s3 s4 ...] - states, integer 0...31, should not be repeated:
//      0x00001 (1)  -  menubar state    	(0 - off, 1 - on)
//      0x00010 (2)  -  toolbar state      	(0 - off, 1 - on)
//      0x00100 (4)  -  tabbar state      	(0 - off, 1 - on)
//      0x01000 (8)  -  statusbar state   	(0 - off, 1 - on)
//      0x10000 (16)  - tabbar position    	(0 - top, 1 - bottom)
// Examples:
//    Call("Scripts::Main", 1, "cpBarSwitch.js", "4 4 0")
//       On/Off tabbar(top).
//    Call("Scripts::Main", 1, "cpBarSwitch.js", "1 1 0")
//       On/Off menubar.
//    Call("Scripts::Main", 1, "cpBarSwitch.js", "14 14 0")
//       On/Off tabbar(top), toolbar and statusbar.
//    Call("Scripts::Main", 1, "cpBarSwitch.js", "4 4 20 0")
//       1. Turn on tabbar(top); 2. switches tabbar to bottom; 3. turn off tabbar... then starts from the beginning.
//    Call("Scripts::Main", 1, "cpBarSwitch.js", "11 1 9 10")
//       1. Turn off toolbar and statusbar, turn on menubar; 2. turn on statusbar; 3. turn on toolbar and turn off menubar... then starts from the beginning.

/////// Variables						///////////////////////////////
var hMainWnd = AkelPad.GetMainWnd();
var aMod = !AkelPad.IsMDI();
var bMask;
var xState = 0;
var nState;
var i;

if (hMainWnd && IsArgIntRng(0, 1, 15) && IsArgIntRng(1, 0, 31))
{
   bMask = WScript.Arguments(0);
   if (aMod)
      bMask &= ~4;	//ignore tabbar
   /////// Calculation of the current state		///////////////////////////////
   if (bMask & 4)									///tabbar
   {
      var tState = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 157 /*MI_TABOPTIONSMDI*/, 0);
      if (!(tState & 1))
      {                    		//  if (tState & 1) TAB_VIEW_NONE
         xState |= 4;        	//  if (tState & 2) TAB_VIEW_TOP
         if (tState & 4)      	//  if (tState & 4) TAB_VIEW_BOTTOM
            xState |= 16;
      }
   }
   if (bMask & 8) 									///statusbar
   {
      var sState = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 142 /*MI_STATUSBAR*/, 0);
      if (sState)
         xState |= 8;
   }
   if (bMask & 2) 									///toolbar
   {
      var ptState = AkelPad.IsPluginRunning("ToolBar::Main");
      if (ptState)
         xState |= 2;
   }
   if (bMask & 1)									///menubar
   {
      var pmState = AkelPad.IsPluginRunning("ContextMenu::Main");
      var hMainMenu = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 21 /*MI_MENUMAIN*/, 0);
      var oSys = AkelPad.SystemFunction();
      var mState = oSys.Call("User32::GetMenu", hMainWnd);
      if (mState)
         xState |= 1;
   }

   ///////Search for the next state in list			///////////////////////////////
   for (i=1; i < WScript.Arguments.Length; ++i)
   {
      if ((WScript.Arguments(i) & (~(aMod?20:0))) == xState)
         break;
   }
   if (++i >= WScript.Arguments.Length) i=1;
   if (IsArgIntRng(i, 0, 31))
   {
      nState = (WScript.Arguments(i) & (((bMask&4) << 2) | bMask));

      ///////Set the next state					///////////////////////////////
      if (((nState & 4) != (xState & 4)) || ((nState & 16) != (xState & 16)))  	///tabbar
      {
         if (!(nState & 4))
            AkelPad.Command(4303 /*IDM_WINDOW_TABVIEW_NONE*/);
         else if (nState & 16)
            AkelPad.Command(4302 /*IDM_WINDOW_TABVIEW_BOTTOM*/);
         else
            AkelPad.Command(4301 /*IDM_WINDOW_TABVIEW_TOP*/);
      }
      if ((nState & 8) != (xState & 8)) 								///statusbar
         AkelPad.Command(4211 /*IDM_VIEW_SHOW_STATUSBAR*/);
      if ((nState & 2) != (xState & 2)) 								///toolbar
         AkelPad.Call("ToolBar::Main");
      if ((nState & 1) != (xState & 1)) 								///menubar
      {
         if (!mState)
         {
            oSys.Call("User32::SetMenu", hMainWnd, hMainMenu);
            if (pmState)   // Menu items of contextMenu.dll does not appear when turn on the menu, restart required.
            {
               AkelPad.Call("ContextMenu::Main", 10);
               // WScript.Sleep(50); // If not restarted, try to uncomment the pause.
               AkelPad.Call("ContextMenu::Main", 10);
            }
         }
         else
            oSys.Call("User32::SetMenu", hMainWnd, 0);
      }
   }
}

function IsArgIntRng(aNum, aFrom, aTo)
{
   if (WScript.Arguments.length > aNum)
   {
      var aValue = +WScript.Arguments(aNum);
      if ((Math.floor(aValue) == aValue) && (aValue >= aFrom) && (aValue <= aTo))
         return true;
   }
   return false;
}
Last edited by Visitor7 on Mon Jul 23, 2012 5:55 am, edited 8 times in total.
Post Reply