Scripts collection

Discuss and announce AkelPad plugins
  • Author
  • Message
Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Force create new program instance.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4222#p4222
// Version: 1.4
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Force create new program instance.
// Description(1049): Форсировать создание нового экземпляра программы.
//
// Arguments:
// -CmdLine="/Command(4155)" -Command line than will be appended to CmdLineBegin parameter of the second instance.
//
// Usage:
// Call("Scripts::Main", 1, "ForceNewInstance.js", `-CmdLine="/Command(4155)"`)

//Arguments
var pCmdLine=AkelPad.GetArgValue("CmdLine", "");

ForceNewInstance(pCmdLine);

function ForceNewInstance(pCmdLine)
{
  var hMainWnd=AkelPad.GetMainWnd();
  var oSet=AkelPad.ScriptSettings();
  var hNewMainWnd=0;
  var lpPluginFunction;
  var lpCmdLineBegin;
  var pCmdLineCurrent="";
  var nCmdLineBeginLen;
  var bOpenOnStartEnable=false;

  //Plugin running?
  if (lpPluginFunction=AkelPad.SendMessage(hMainWnd, 1329 /*AKD_DLLFIND*/, "Sessions::Main", 0))
  {
    //Plugin autoloading?
    if (AkelPad.MemRead(_PtrAdd(lpPluginFunction, _X64?812:800) /*offsetof(PLUGINFUNCTION, bAutoLoad)*/, 3 /*DT_DWORD*/))
    {
      //Plugin opens session on start?
      if (oSet.Begin("Sessions", 0x21 /*POB_READ|POB_PLUGS*/))
      {
        bOpenOnStartEnable=oSet.Read("OpenOnStartEnable", 1 /*PO_DWORD*/);
        oSet.End();
      }
      //Turn off open session on start
      if (bOpenOnStartEnable)
      {
        if (oSet.Begin("Sessions", 0x22 /*POB_SAVE|POB_PLUGS*/))
        {
          oSet.Write("OpenOnStartEnable", 1 /*PO_DWORD*/, false);
          oSet.End();
        }
      }
    }
  }
  if (pCmdLine)
  {
    if (oSet.Begin("", 0x42 /*POB_SAVE|POB_PROGRAM*/))
    {
      if (nCmdLineBeginLen=AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 105 /*MI_CMDLINEBEGIN*/, 0))
      {
         if (lpCmdLineBegin=AkelPad.MemAlloc(nCmdLineBeginLen * 2 /*sizeof(wchar_t)*/))
         {
           if (AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 105 /*MI_CMDLINEBEGIN*/, lpCmdLineBegin))
             pCmdLineCurrent=AkelPad.MemRead(lpCmdLineBegin, 1 /*DT_UNICODE*/);
           AkelPad.MemFree(lpCmdLineBegin);
         }
      }
      oSet.Write("CmdLineBegin", 3 /*PO_STRING*/, pCmdLineCurrent + " " + pCmdLine);
      oSet.End();
    }
  }

  if (AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 153 /*MI_SINGLEOPENPROGRAM*/, 0))
  {
    AkelPad.Command(4256 /*IDM_OPTIONS_SINGLEOPEN_PROGRAM*/);
    hNewMainWnd=AkelPad.Command(4102 /*IDM_FILE_CREATENEW*/);
    AkelPad.Command(4256 /*IDM_OPTIONS_SINGLEOPEN_PROGRAM*/);
    AkelPad.SendMessage(hNewMainWnd, 273 /*WM_COMMAND*/, 4256 /*IDM_OPTIONS_SINGLEOPEN_PROGRAM*/, 0);
  }
  else hNewMainWnd=AkelPad.Command(4102 /*IDM_FILE_CREATENEW*/);

  //Turn on open session on start
  if (bOpenOnStartEnable)
  {
    if (oSet.Begin("Sessions", 0x22 /*POB_SAVE|POB_PLUGS*/))
    {
      oSet.Write("OpenOnStartEnable", 1 /*PO_DWORD*/, true);
      oSet.End();
    }
  }
  if (pCmdLine)
  {
    if (oSet.Begin("", 0x42 /*POB_SAVE|POB_PROGRAM*/))
    {
      oSet.Write("CmdLineBegin", 3 /*PO_STRING*/, pCmdLineCurrent);
      oSet.End();
    }
  }
  return hNewMainWnd;
}
Last edited by Instructor on Sat Apr 18, 2015 4:20 am, edited 8 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=4270#p4270
// http://infocatcher.ucoz.net/js/akelpad_scripts/highlighter.js

// (c) Infocatcher 2009-2012
// version 0.3.4 - 2012-04-06

//===================
// Set extension manually for Coder plugin

// Arguments:
//   -noRecognize    - don't use recognize mechanism for unsaved files or files without extension
//   -restore        - use extension of current file (without dialog)
//   -saveLastExt=0  - don't save last used extension
//               =1  - save only typed (default)
//               =2  - always save

// Usage:
//   Call("Scripts::Main", 1, "highlighter.js")
//   Call("Scripts::Main", 1, "highlighter.js", "-noRecognize")
//   Call("Scripts::Main", 1, "highlighter.js", "-restore")
//   Call("Scripts::Main", 1, "highlighter.js", "-noRecognize=true -restore=false -saveLastExt=0")
//===================

//== Settings begin
var hlExtRegions = {
	// Syntax:
	//   extension: {
	//       subExtension0: [[ext0_startMask0, ext0_endMask0], [ext0_startMask1, ext0_endMask1]],
	//       subExtension1: [[ext1_startMask0, ext1_endMask0]]
	//   }
	// Or "links" like
	//   otherExtension: "extension"
	// "extension" must be already defined!
	// Masks is case unsensitive.
	html: {
		js: [["<script", "</script>"]],
		css: [["<style", "</style>"]],
		php: [["<?php", "?>"], ["<?", "?>"]]
	},
	htm: "html",
	xhtml: "html",
	shtml: "html",
	php: "html",
	xml: {
		js: [
			["<script", "</script>"],
			["<![cdata[", "]]>"],
			["<constructor>", "</constructor>"],
			["<destructor>", "</destructor>"],
			["<getter>", "</getter>"],
			["<setter>", "</setter>"],
			["<field", "</field>"],
			["<method", "</method>"],
			["<handler", "</handler>"]
		],
		css: [["<style", "</style>"]],
		php: [["<?php", "?>"], ["<?", "?>"]]
	},
	xul: "xml",
	xbl: "xml"
};
var hlExtForceRecognize = {
	// Force use recognize algorithm for following extension
	// Syntax:
	//   extension: true
	xml: true // XBL-files use same extension
};
var hlExtRecognize = {
	// Used for unsaved files without filename and extension
	// Syntax:
	//   extension: function(str) { return isExtension; }
	html: function(str) {
		return /^\s*<!DOCTYPE html\W/.test(str) || /<\/html[\s>]/i.test(str);
	},
	php: function(str) {
		return /<\?php\W.*\?>/.test(str)
			|| /<\?.*\?>/.test(str) && (
				/\Whtmlspecialchars\s*\(/i.test(str)
				|| /\Wsession_start\s*\(\)/i.test(str)
				|| /\Wmysql_query\s*\(/i.test(str)
			);
	},
	xbl: function(str) {
		return /^\s*<\?xml/.test(str)
			&& /\sxmlns\s*=\s*("|')http:\/\/www\.mozilla\.org\/xbl\1[\s>]/.test(str)
			&& /<bindings[\s>]/.test(str);
	},
	xul: function(str) {
		return /^\s*<\?xml\W/.test(str)
			&& /\sxmlns\s*=\s*("|')http:\/\/www\.mozilla\.org\/keymaster\/gatekeeper\/there\.is\.only\.xul\1[\s>]/.test(str);
	},
	rdf: function(str) {
		return /^\s*<\?xml/.test(str)
			&& /\sxmlns\s*=\s*("|')http:\/\/www\.w3\.org\/1999\/02\/22-rdf-syntax-ns#\1[\s>]/.test(str);
	},
	xsl: function(str) {
		return /^\s*<\?xml/.test(str)
			&& /\sxmlns\s*=\s*("|')http:\/\/www\.w3\.org\/1999\/XSL\/Transform\1[\s>]/.test(str);
	},
	svg: function(str) {
		return /^\s*<\?xml/.test(str)
			&& /\sxmlns\s*=\s*("|')http:\/\/www\.w3\.org\/2000\/svg\1[\s>]/.test(str);
	},
	dtd: function(str) {
		return /<!ENTITY\s[^<>]+>/.test(str);
	},
	xml: function(str) {
		return /^\s*<\?xml\W/.test(str);
	},
	rc: function(str) {
		return (
			(/(^|\n|\r)#define\s\S/.test(str) || /(^|\n|\r)#include\s\S/.test(str))
			|| /\sMENUITEM\s/.test(str)
			|| /\sBLOCK\s/.test(str)
		)
		&& /\sBEGIN\s/.test(str) && /\sEND\s/.test(str);
	},
	cpp: function(str) {
		return /(^|\n|\r)#define\s\S/.test(str)
			|| /(^|\n|\r)#include\s\S/.test(str);
	},
	manifest: function(str) {
		return /(^|\n|\r)content[ \t]\S/.test(str);
	},
	akelmenu: function(str) {
		return /("|'|`)[ +](Command\(\d+\)|Call\(|Exec\()/.test(str);
	},
	bat: function(str) {
		return /^@echo off\s/i.test(str)
			|| /(^|\s)if( not)? exist\s/.test(str);
	},
	coder: function(str) {
		return /(^|\n|\r)Delimiters:[\n\r]/.test(str)
			&& /(^|\n|\r)Words:[\n\r]/.test(str);
	},
	js: function(str) {
		return /(^|\s)var\s+\S/.test(str);
	},
	vbs: function(str) {
		return /(^|\s)dim\s+\S/i.test(str);
	},
	css: function(str) {
		return /!\s*important[\s;]/.test(str)
			|| /\Wcolor\s*:\s*(#[a-f0-9]{3}|#[a-f0-9]{6}|[a-z-]+)\s*(!\s*important)?[\s;]/i.test(str)
			|| /\W[a-z-]\s*:\s*(\d+|(\d+)?\.\d+)(px|em|%|pt)[\s;]/i.test(str);
	},
	ini: function(str) {
		return /(^|\n|\r)[^=\s]+=/.test(str);
	}
};
//== Settings end

function _localize(s) {
	var strings = {
		"Syntax highlighting:": {
			ru: "Подсветка синтаксиса:"
		},
		"Syntax highlighting (%S):": {
			ru: "Подсветка синтаксиса (%S):"
		},
		"by file extension": {
			ru: "по расширению файла"
		},
		"special detection": {
			ru: "специальное определение"
		},
		"recognition": {
			ru: "автоопределение"
		},
		"region": {
			ru: "регион"
		},
		"recognition + region": {
			ru: "автоопределение + регион"
		},
		"history": {
			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);
}

// Read arguments:
// getArg(argName, defaultValue)
var noRecognize = getArg("noRecognize", false);
var restore     = getArg("restore",     false);
var saveLastExt = getArg("saveLastExt", 1);

//var AkelPad = new ActiveXObject("AkelPad.document");
var hMainWnd = AkelPad.GetMainWnd();
var hWndEdit = AkelPad.GetEditWnd();
var oSys = AkelPad.SystemFunction();
var fullText;
var detectType;

if(hMainWnd) {
	var ext, forceSet;
	if(restore) {
		forceSet = true;
		ext = /\.([^.]+)$/i.test(AkelPad.GetEditFile(0)) ? RegExp.$1.toLowerCase() : "";
	}
	else {
		ext = getExt();
	}
	if(ext || forceSet) {
		//AkelPad.IsPluginRunning("HighLight::Main")    && AkelPad.Call("HighLight::Main", 1, ext);
		//AkelPad.IsPluginRunning("AutoComplete::Main") && AkelPad.Call("AutoComplete::Main", 1, ext);
		//AkelPad.IsPluginRunning("CodeFold::Main")     && AkelPad.Call("CodeFold::Main", 1, ext);
		if(
			AkelPad.IsPluginRunning("Coder::HighLight")
			|| AkelPad.IsPluginRunning("Coder::AutoComplete")
			|| AkelPad.IsPluginRunning("Coder::CodeFold")
		)
			AkelPad.Call("Coder::Settings", 1, ext);
	}
}

function getExt() {
	var ext = getCurrentExt();
	if(!ext) {
		ext = saveLastExt && pref("lastExt", 3 /*PO_STRING*/) || "";
		if(ext)
			detectType = "history";
	}
	var typedExt = AkelPad.InputBox(
		hMainWnd,
		WScript.ScriptName,
		detectType
			? _localize("Syntax highlighting (%S):").replace("%S", _localize(detectType))
			: _localize("Syntax highlighting:"),
		ext
	);
	if(!typedExt)
		return "";
	typedExt = typedExt.toLowerCase();
	if(saveLastExt && (typedExt != ext.toLowerCase() || saveLastExt == 2))
		pref("lastExt", 3 /*PO_STRING*/, typedExt);
	return typedExt;
}
function getCurrentExt() {
	var filePath = AkelPad.GetEditFile(0);
	var ext = filePath && /\.([^.]+)$/i.test(filePath) && RegExp.$1.toLowerCase();
	if(ext)
		detectType = "by file extension";
	if(
		(ext == "coder" || ext == "highlight" || ext == "autocomplete" || ext == "codefold")
		&& /[\n\r](Files|Extensions):[\n\r]+(;[^\n\r]*[\n\r]+)*[\n\r]*([^;][^\s]*)[\n\r]/.test(getFullText())
	) {
		detectType = "special detection";
		return RegExp.$3;
	}
	if(ext == "txt" && /log/i.test(filePath)) {
		detectType = "special detection";
		return "log";
	}
	if(!ext || hlExtForceRecognize[ext])
		ext = recognizeExt() || ext;
	var mSet = ext && getParams(hlExtRegions, ext);
	var rgnExt = mSet && defineExtRegion(mSet);
	return rgnExt || ext || "";
}
function getParams(sets, key) {
	var params = sets[key];
	if(typeof params == "string")
		params = sets[params];
	return params;
}
function recognizeExt() {
	if(noRecognize)
		return undefined;
	var fullText = getFullText();
	if(!fullText)
		return undefined;
	for(var rcgExt in hlExtRecognize) {
		if(hlExtRecognize[rcgExt](fullText)) {
			detectType = "recognition";
			return rcgExt;
		}
	}
	return undefined;
}
function defineExtRegion(mSet) {
	var fText = getFullText();
	var ss = AkelPad.GetSelStart();
	var se = AkelPad.GetSelEnd();
	var startText = fText.substring(0, ss).toLowerCase();
	var selText   = fText.substring(ss, se).toLowerCase();
	var endText   = fText.substring(se, fText.length).toLowerCase();
	var i, start, end, startIndx, endIndx;
	var mParams;
	for(var ext in mSet) {
		mParams = mSet[ext];
		for(i = 0, len = mParams.length; i < len; i++) {
			start = mParams[i][0];
			end = mParams[i][1];
			startIndx = endText.indexOf(start);
			endIndx = endText.indexOf(end);
			if(
				startText.lastIndexOf(start) > startText.lastIndexOf(end)
				&& selText.indexOf(start) == -1 && selText.indexOf(end) == -1
				&& endIndx != -1
				&& (startIndx == -1 || endIndx < startIndx)
			) {
				detectType = detectType == "recognition"
					? "recognition + region"
					: "region";
				return ext;
			}
		}
	}
	return "";
}
function getFullText() {
	if(fullText != undefined)
		return fullText;

	if(typeof AkelPad.GetTextRange != "undefined")
		return fullText = AkelPad.GetTextRange(0, -1);
	var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
	if(!lpPoint)
		return "";
	setRedraw(hWndEdit, false);
	AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);

	var columnSel = AkelPad.SendMessage(hWndEdit, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0);
	var ss = AkelPad.GetSelStart();
	var se = AkelPad.GetSelEnd();

	AkelPad.SetSel(0, -1);
	fullText = AkelPad.GetSelText();

	AkelPad.SetSel(ss, se);
	columnSel && AkelPad.SendMessage(hWndEdit, 3128 /*AEM_UPDATESEL*/, 0x1 /*AESELT_COLUMNON*/, 0);

	AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
	AkelPad.MemFree(lpPoint);
	setRedraw(hWndEdit, true);
	return fullText;
}

function setRedraw(hWnd, bRedraw) {
	AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
	bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}
function pref(name, type, val) {
	var oSet = AkelPad.ScriptSettings();
	if(arguments.length == 3) {
		if(!oSet.Begin(WScript.ScriptBaseName, 0x2 /*POB_SAVE*/))
			return false;
		var ok = oSet.Write(name, type, val);
		oSet.End();
		return ok;
	}
	if(!oSet.Begin(WScript.ScriptBaseName, 0x1 /*POB_READ*/))
		return undefined;
	var ret = oSet.Read(name, type || 1 /*PO_DWORD*/);
	oSet.End();
	return ret;
}
function getArg(argName, defaultVal) {
	var args = {};
	for(var i = 0, argsCount = WScript.Arguments.length; i < argsCount; i++)
		if(/^[-\/](\w+)(=(.+))?$/i.test(WScript.Arguments(i)))
			args[RegExp.$1.toLowerCase()] = RegExp.$3 ? eval(RegExp.$3) : true;
	getArg = function(argName, defaultVal) {
		argName = argName.toLowerCase();
		return typeof args[argName] == "undefined" // argName in args
			? defaultVal
			: args[argName];
	};
	return getArg(argName, defaultVal);
}
<download>
Allow set extension manually for Coder plugin with basic autodetection.

Version 0.3.4 (2012-04-06)
[+] Added detection of files masks from *.coder files in new format.

Version 0.3.3 (2011-12-20)
[*] Used AkelPad language (AkelPad.GetLangId()) instead of system language for localization.


Version 0.3.2 (2011-03-06)
[*] Now used AkelPad.ScriptSettings() to store data.
[+] Added -saveLastExt argument.

Version 0.3.1 (2010-12-07)
[+] Added recognize mechanism for unsaved files or files without extension.

Version 0.2.7 (2010-11-23)
[*] New localization method.
[*] Improved logic of text getting.

Version 0.2.6 (2010-09-18)
[+] Support for comments between «Extensions:» header and first extension.

Version 0.2.5.1 (2010-06-22)
[+] Support for changed Scripts plugin and new Coder plugin.
[-] Removed compatibility with old plugins (separate HighLight, AutoComplete, CodeFold).

Version 0.2.5 (2010-03-21)
[x] Fixed error message for not installed plugins.

Version 0.2.4 (2010-02-11)
[+] Added extension detection for *.autocomplete and *.codefold files.
[*] Some improvements. :)

Version 0.2.3 (2010-02-10)
[+] Support for CodeFold plugin.
Last edited by Infocatcher on Fri May 11, 2012 6:27 pm, edited 21 times in total.

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

Post by Infocatcher »

Code: Select all

// (c) Infocatcher 2009-2010
// version 0.1.5.2 - 2010-07-08

// Convert:
// & => &
// < => <
// > => >
// " => "

//var AkelPad = new ActiveXObject("AkelPad.document");

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

if(hMainWnd && !AkelPad.GetEditReadOnly(hWndEdit)) {
	var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
	if(lpPoint) {
		toggleRedraw(hWndEdit, false);
		var selParams = getSelParams();
		AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
		selParams = encodeHTML(selParams);
		restoreSelParams(selParams);
		AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
		toggleRedraw(hWndEdit, true);
		AkelPad.MemFree(lpPoint);
	}
}

function encodeHTML(selParams) {
	// Get selection or all text
	var txt = AkelPad.GetSelText() || AkelPad.SetSel(0, -1) || AkelPad.GetSelText();
	var selStart = AkelPad.GetSelStart();

	txt = txt
		.replace(/&/g, "&")
		.replace(/</g, "<")
		.replace(/>/g, ">")
		.replace(/"/g, """);
	AkelPad.ReplaceSel(txt);

	return [selStart, selStart + txt.length];
}

function toggleRedraw(hWnd, bRedraw) {
	AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
	if(!bRedraw)
		return;
	oFunction.AddParameter(hWnd);
	oFunction.AddParameter(0);
	oFunction.AddParameter(true);
	oFunction.Call("user32::InvalidateRect");
}
function getSelParams() {
	return [AkelPad.GetSelStart(), AkelPad.GetSelEnd()];
}
function restoreSelParams(selParams) {
	AkelPad.SetSel(selParams[0], selParams[1]);
}
<download> (see convertHTML.js and converter.js)

Convert:
& => &
< => <
> => >
" => "
Last edited by Infocatcher on Fri May 11, 2012 6:25 pm, edited 8 times in total.

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

Post by Infocatcher »

Code: Select all

// (c) Infocatcher 2009-2010
// version 0.1.5.2 - 2010-07-08

// Convert:
// &  => &
// <   => <
// >   => >
// " => "

//var AkelPad = new ActiveXObject("AkelPad.document");

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

if(hMainWnd && !AkelPad.GetEditReadOnly(hWndEdit)) {
	var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
	if(lpPoint) {
		toggleRedraw(hWndEdit, false);
		var selParams = getSelParams();
		AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
		selParams = decodeHTML(selParams);
		restoreSelParams(selParams);
		AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
		toggleRedraw(hWndEdit, true);
		AkelPad.MemFree(lpPoint);
	}
}

function decodeHTML(selParams) {
	// Get selection or all text
	var txt = AkelPad.GetSelText() || AkelPad.SetSel(0, -1) || AkelPad.GetSelText();
	var selStart = AkelPad.GetSelStart();

	txt = txt
		.replace(/</g, "<")
		.replace(/>/g, ">")
		.replace(/"/g, '"')
		.replace(/&/g, "&");
	AkelPad.ReplaceSel(txt);

	return [selStart, selStart + txt.length];
}

function toggleRedraw(hWnd, bRedraw) {
	AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
	if(!bRedraw)
		return;
	oFunction.AddParameter(hWnd);
	oFunction.AddParameter(0);
	oFunction.AddParameter(true);
	oFunction.Call("user32::InvalidateRect");
}
function getSelParams() {
	return [AkelPad.GetSelStart(), AkelPad.GetSelEnd()];
}
function restoreSelParams(selParams) {
	AkelPad.SetSel(selParams[0], selParams[1]);
}
<download> (see convertHTML.js and converter.js)

Convert:
& => &
< => <
> => >
" => "
Last edited by Infocatcher on Fri May 11, 2012 6:23 pm, edited 8 times in total.

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

Post by Infocatcher »

Code: Select all

// (c) Infocatcher 2009-2010
// version 0.4.3 - 2010-12-06

//===================
// Encode HTML entities:
//   &    => &
//   <    => <
//   >    => >
//   "    => "
//   char => &#code; (see arguments)

// Decode HTML entities:
//   &   => &
//   <    => <
//   >    => >
//   "  => "
//   &#code; => char (see arguments)

// Arguments:
//   -mode=0                               - (default) auto encode or decode
//   -mode=1                               - encode
//   -mode=2                               - decode
//   -decodeCharCodes=true                 - (default: true) decode &#code; => char
//   -encodeChars=false                    - (default: false) encode char => &#code;
//   -encodeAsHex=false                    - use hex instead of decimal
//   -charsToEncode=/[^!-~ \t\n\rа-яё]/ig  - (optional) mask for chars to encode

// Usage:
//   Call("Scripts::Main", 1, "convertHTML.js", "-mode=0")
//   Call("Scripts::Main", 1, "convertHTML.js", "-mode=0 -decodeCharCodes=true -encodeChars=true '-charsToEncode=/[^!-~ \t\n\rа-яё]/ig'")
//===================

function _localize(s) {
	var strings = {
		"Nothing to recode!": {
			ru: "Нечего перекодировать!"
		}
	};
	var lng;
	switch(AkelPad.SystemFunction().Call("kernel32::GetUserDefaultLangID") & 0x3ff /*PRIMARYLANGID*/) {
		case 0x19: lng = "ru"; break;
		default:   lng = "en";
	}
	_localize = function(s) {
		return strings[s] && strings[s][lng] || s;
	};
	return _localize(s);
}

// Read arguments:
var args = {};
for(var i = 0, argsCount = WScript.Arguments.length; i < argsCount; i++)
	if(/^[-\/](\w+)(=(.+))?$/i.test(WScript.Arguments(i)))
		args[RegExp.$1.toLowerCase()] = RegExp.$3 ? eval(RegExp.$3) : true;
function getArg(argName, defaultVal) {
	argName = argName.toLowerCase();
	return typeof args[argName] == "undefined" // argName in args
		? defaultVal
		: args[argName];
}

var MODE_AUTO   = 0;
var MODE_ENCODE = 1;
var MODE_DECODE = 2;

var mode = getArg("mode", MODE_AUTO);
var auto   = mode == MODE_AUTO;
var encode = mode == MODE_ENCODE;
var decode = mode == MODE_DECODE;

var decodeCharCodes = getArg("decodeCharCodes", true);
var encodeChars     = getArg("encodeChars", false);
var encodeAsHex     = getArg("encodeAsHex", false);
var charsToEncode   = getArg("charsToEncode", /[^!-~ \t\n\rа-яё]/ig);
// "!-~"     - latin symbols
// " \t\n\r" - spaces
// "а-яё"    - cyrillic symbols


//var AkelPad = new ActiveXObject("AkelPad.document");
var hMainWnd = AkelPad.GetMainWnd();
var hWndEdit = AkelPad.GetEditWnd();
var oSys = AkelPad.SystemFunction();

if(hMainWnd && !AkelPad.GetEditReadOnly(hWndEdit))
	convertHTML();

function convertHTML() {
	var text = AkelPad.GetSelText();
	var selectAll = false;
	if(!text) {
		text = getAllText();
		selectAll = true;
	}

	var res;
	if(decode || auto) {
		res = decodeHTML(text);
		if(auto)
			encode = res == text; // Can't decode (entities is missing)
	}
	if(encode)
		res = encodeHTML(text);
	if(res == text) {
		AkelPad.MessageBox(hMainWnd, _localize("Nothing to recode!"), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
		return;
	}

	insertNoScroll(res, selectAll);
}
function encodeHTML(str) {
	str = str
		.replace(/&/g, "&")
		.replace(/</g, "<")
		.replace(/>/g, ">")
		.replace(/"/g, """);
	if(encodeChars)
		str = str.replace(
			charsToEncode,
			function(s) {
				var code = s.charCodeAt(0);
				if(encodeAsHex)
					code = "x" + code.toString(16);
				return "&#" + code + ";";
			}
		);
	return str;
}
function decodeHTML(str) {
	if(decodeCharCodes)
		str = str
			.replace(
				/&#(?:x([\da-f]+)|(\d+));/ig,
				function(s, hex, dec) {
					return String.fromCharCode(
						hex
							? parseInt(hex, 16)
							: parseInt(dec, 10)
					);
				}
			);
	return str
		.replace(/</g, "<")
		.replace(/>/g, ">")
		.replace(/"/g, '"')
		.replace(/&/g, "&");
}

function getAllText() {
	if(typeof AkelPad.GetTextRange != "undefined")
		return AkelPad.GetTextRange(0, -1);
	var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
	if(!lpPoint)
		return "";
	setRedraw(hWndEdit, false);
	AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);

	var columnSel = AkelPad.SendMessage(hWndEdit, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0);
	var ss = AkelPad.GetSelStart();
	var se = AkelPad.GetSelEnd();

	AkelPad.SetSel(0, -1);
	var str = AkelPad.GetSelText();

	AkelPad.SetSel(ss, se);
	columnSel && AkelPad.SendMessage(hWndEdit, 3128 /*AEM_UPDATESEL*/, 0x1 /*AESELT_COLUMNON*/, 0);

	AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
	AkelPad.MemFree(lpPoint);
	setRedraw(hWndEdit, true);
	return str;
}
function insertNoScroll(str, selectAll) {
	var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
	if(!lpPoint)
		return;
	setRedraw(hWndEdit, false);
	AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);

	selectAll && AkelPad.SetSel(0, -1);
	//var ss = AkelPad.GetSelStart();
	AkelPad.ReplaceSel(str, true);
	//if(ss != AkelPad.GetSelStart())
	//	AkelPad.SetSel(ss, ss + str.length);

	AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
	setRedraw(hWndEdit, true);
	AkelPad.MemFree(lpPoint);
}
function setRedraw(hWnd, bRedraw) {
	AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
	bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}
(encode HTML + decode HTML) <download> (see converter.js)

Encode HTML entities:
& => &
< => <
> => >
" => "
char => &#code; (see arguments)

Decode HTML entities:
& => &
< => <
> => >
" => "
&#code; => char (see arguments)
Last edited by Infocatcher on Fri May 11, 2012 6:21 pm, edited 12 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=4311#p4311

// (c) Infocatcher 2008-2009, 2012
// version 0.1.2 - 2012-12-03

// Insert current date

//== User settings:
var dateTemplate = "<fullYear>-<month>-<date>";
// You can use <day>, <date>, <month>, <monthName>, <year>, <fullYear>, <hours>, <minutes>, <seconds>, <timezone>
// Days of week:
var daysOfWeek = "sunday,monday,tuesday,wednesday,thursday,friday,saturday";
var monthNames = "jan,feb,mar,apr,may,jun,jul,avg,sep,oct,nov,dec";
// Use "," as separator

// Or you can specified dateTemplate, daysOfWeek and monthNames in command line arguments:
// Call("Scripts::Main", 1, "insertDate.js", "/t=dateTemplate /w=daysOfWeek /m=monthNames", 0)
// \s - " " (space), \n - line feed
// For example:
// Call("Scripts::Main", 1, "insertDate.js", "/t=<monthName>,\s<day> /w=su,mo,tu,we,th,fr,sa /m=jan,feb,mar,apr,may,jun,jul,avg,sep,oct,nov,dec", 0)
//== End of user settings

var argsCount = WScript.Arguments.length;
var args = {};
for(var i = 0; i < argsCount; ++i) // read arguments
	if(/^\/([a-z]+)=(.+)$/i.test(WScript.Arguments(i)))
		args[RegExp.$1] = RegExp.$2;

dateTemplate = (args.t && convertArg(args.t)) || dateTemplate;
daysOfWeek = ((args.w && convertArg(args.w)) || daysOfWeek).split(/\s*,\s*/);
monthNames = ((args.m && convertArg(args.m)) || monthNames).split(/\s*,\s*/);

function convertArg(s) {
	return s
		.replace(/\\s/g, " ")
		.replace(/\\n/g, "\n");
}
function addZero(n) {
	return n > 9 ? n : "0" + n;
}
function getTimezone(tzo) {
	var m = Math.abs(tzo);
	var h = Math.floor(m/60);
	m = Math.floor(m - h*60);
	return (tzo > 0 ? "-" : "+") + addZero(h) + addZero(m);
}
function getFormattedDate(template, days, months) {
	var d = new Date();
	var y = d.getFullYear().toString();
	var m = d.getMonth();
	return template
		.replace(/<day>/g, days[d.getDay()])
		.replace(/<date>/g, addZero(d.getDate()))
		.replace(/<month>/g, addZero(m + 1))
		.replace(/<monthName>/g, months[m])
		.replace(/<fullYear>/g, y)
		.replace(/<year>/g, y.substring(2, y.length))
		.replace(/<hours?>/g, addZero(d.getHours()))
		.replace(/<minutes>|<min>/g, addZero(d.getMinutes()))
		.replace(/<seconds>|<sec>/g, addZero(d.getSeconds()))
		.replace(/<timezone>/g, getTimezone(d.getTimezoneOffset()));
}

//var AkelPad = new ActiveXObject("AkelPad.document");
AkelPad.ReplaceSel(getFormattedDate(dateTemplate, daysOfWeek, monthNames));
<download>
Last edited by Infocatcher on Mon Dec 03, 2012 7:07 am, edited 4 times in total.

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

Post by Instructor »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4368#p4368
// Version: 4.4
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Switch between tabs.
// Description(1049): Переключение между вкладками
//
// Arguments:
// -Next=true           -Switch direction (one of the following):
//                         true   Forward switch.
//                         false  Backward switch (default).
//                         -1     Stay current.
// -CtrlTab=false       -No Ctrl+Tab hotkey is assigned to TabSwitch.js (default is true).
// -RightLeft=true      -Switch between tabs: Left-Right. Default is false - switch between tabs: Next-Previous.
// -MinTabs=2           -Minimum number of tabs before switch window appeared (default is 2).
// -TabIndex=0          -Activate tab by specified index. If used, all other arguments ignored.
// -FontName="Arial"    -Font name. Unchanged, if "".
// -FontStyle=3         -Font style (one of the following):
//                         0  ignored (default).
//                         1  normal.
//                         2  bold.
//                         3  italic.
//                         4  bold italic.
// -FontSize=10         -Font size. Unchanged, if 0 (default).
// -LineGap=10          -Space between items (default is 1).
// -SingleClick=false   -Single mouse click chooses item (default is true).
// -ShowModify=2        -Show modification sign (one of the following):
//                         0  hidden.
//                         1  display asterisk * at the end (default).
//                         2  display asterisk * at the beginning.
// -OnlyNames=true      -Show only file name. Default is false - show full path.
// -WindowLeft=100      -Left window position. Special values:
//                        -1 centered (default).
//                        -2 cursor position.
// -WindowTop=100       -Top window position. Special values:
//                        -1 centered (default).
//                        -2 cursor position.
// -WindowMaxHeight=500 -Maximum window height. Special values:
//                        -1 unlimited (default).
// -WindowMaxWidth=500  -Maximum window width. Special values:
//                        -1 unlimited (default).
//
// Usage:
//   -"Previous (Ctrl+Tab)" Call("Scripts::Main", 1, "TabSwitch.js", `-Next=false`)
//   -"Next (Ctrl+Shift+Tab)" Call("Scripts::Main", 1, "TabSwitch.js", `-Next=true`)
//   -"Right (Ctrl+Tab)" Call("Scripts::Main", 1, "TabSwitch.js", `-RightLeft=true -Next=true`)
//   -"Left (Ctrl+Shift+Tab)" Call("Scripts::Main", 1, "TabSwitch.js", `-RightLeft=true -Next=false`)
//   -"Tab1 (Alt+1)" Call("Scripts::Main", 1, "TabSwitch.js", `-TabIndex=0`)
//   -"Tab2 (Alt+2)" Call("Scripts::Main", 1, "TabSwitch.js", `-TabIndex=1`)
// Toolbar button example:
//   -"Tab list" Call("Scripts::Main", 1, "TabSwitch.js", `-Next=-1 -CtrlTab=false -RightLeft=true -MinTabs=1 -WindowLeft=%bl -WindowTop=%bb`)
// ContextMenu item example:
//   -"Tab list" Call("Scripts::Main", 1, "TabSwitch.js", `-Next=-1 -CtrlTab=false -RightLeft=true -MinTabs=1 -WindowLeft=-2 -WindowTop=-2`)

//Arguments
var bNext=AkelPad.GetArgValue("Next", false);
var bCtrlTab=AkelPad.GetArgValue("CtrlTab", true);
var bRightLeft=AkelPad.GetArgValue("RightLeft", false);
var nMinTabs=AkelPad.GetArgValue("MinTabs", 2);
var nTabIndex=AkelPad.GetArgValue("TabIndex", -1);
var pFontName=AkelPad.GetArgValue("FontName", "");
var nFontStyle=AkelPad.GetArgValue("FontStyle", 0);
var nFontSize=AkelPad.GetArgValue("FontSize", 0);
var nLineGap=AkelPad.GetArgValue("LineGap", 1);
var bSingleClick=AkelPad.GetArgValue("SingleClick", true);
var nShowModify=AkelPad.GetArgValue("ShowModify", 1);
var bOnlyNames=AkelPad.GetArgValue("OnlyNames", false);
var nWindowLeft=AkelPad.GetArgValue("WindowLeft", -1);
var nWindowTop=AkelPad.GetArgValue("WindowTop", -1);
var nWindowMaxHeight=AkelPad.GetArgValue("WindowMaxHeight", -1);
var nWindowMaxWidth=AkelPad.GetArgValue("WindowMaxWidth", -1);

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var oSys=AkelPad.SystemFunction();
var hInstanceDLL=AkelPad.GetInstanceDll();
var pClassName="AkelPad::Scripts::" + WScript.ScriptName + "::" + oSys.Call("kernel32::GetCurrentProcessId");
var hWndContainer=0;
var hWndListBox=0;
var hHookPost;
var hHookSend;
var dwMainThreadID=oSys.Call("user32::GetWindowThreadProcessId", hMainWnd, 0);
var hSubClass;
var hDC;
var hBrushHollow;
var hFontEdit;
var lpFrameList=[];
var rcMain=[];
var ptPoint=[];
var nItemHeight;
var nScreenWidth;
var nControlWidth;
var nControlHeight;
var nMaxControlHeight;
var nCharWidth;
var nCharHeight;
var nMaxCharWidth=0;
var nMaxCharHeight=0;
var nIconSize=16;
var nIconGap=2;
var bNoSwitch=false;
var i;

if (nTabIndex >= 0)
{
  var hWndTab;
  var lpFrame;
  var nCurSel;

  hWndTab=oSys.Call("user32::GetDlgItem", hMainWnd, 10003 /*ID_TAB*/);
  if (lpFrame=AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 8 /*FWF_BYTABINDEX*/, nTabIndex))
    oSys.Call("user32::PostMessage" + _TCHAR, hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrame);
  WScript.Quit();
}

//Get list of documents
nCurSel=GetFrameList(lpFrameList);

if (lpFrameList.length >= nMinTabs && lpFrameList.length > 0)
{
  if (bCtrlTab)
  {
    if (!(oSys.Call("user32::GetKeyState", 0x11 /*VK_CONTROL*/) & 0x8000))
    {
      //Ctrl already released
      if (lpFrameList.length >= 2)
        oSys.Call("user32::PostMessage" + _TCHAR, hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrameList[nCurSel][1]);
      WScript.Quit();
    }
  }

  //Get font
  if (pFontName || nFontStyle || nFontSize)
    hFontEdit=CreateFont(pFontName, nFontStyle, nFontSize);
  else
    hFontEdit=AkelPad.SendMessage(hWndEdit, 0x31 /*WM_GETFONT*/, 0, 0);
  if (!hFontEdit) WScript.Quit();

  //Get maximum character size
  if (lpSize=AkelPad.MemAlloc(8 /*sizeof(SIZE)*/))
  {
    if (hDC=oSys.Call("user32::GetDC", hWndEdit))
    {
      oSys.Call("gdi32::SelectObject", hDC, hFontEdit);

      for (i=0; i < lpFrameList.length; ++i)
      {
        if (oSys.Call("gdi32::GetTextExtentPoint32" + _TCHAR, hDC, lpFrameList[i][0], lpFrameList[i][0].length, lpSize))
        {
          nCharWidth=AkelPad.MemRead(_PtrAdd(lpSize, 0) /*offsetof(SIZE, cx)*/, 3 /*DT_DWORD*/);
          nCharHeight=AkelPad.MemRead(_PtrAdd(lpSize, 4) /*offsetof(SIZE, cy)*/, 3 /*DT_DWORD*/);
          if (nCharWidth > nMaxCharWidth) nMaxCharWidth=nCharWidth;
          if (nCharHeight > nMaxCharHeight) nMaxCharHeight=nCharHeight;
        }
      }
      oSys.Call("user32::ReleaseDC", hWndEdit, hDC);
    }
    nMaxCharWidth+=nIconSize + nIconGap + 16;

    AkelPad.MemFree(lpSize);
  }

  //Create dialog
  if (AkelPad.WindowRegisterClass(pClassName, 0x21 /*WM_MOUSEACTIVATE*/,
                                              0x2B /*WM_DRAWITEM*/))
  {
    if (hWndContainer=oSys.Call("user32::CreateWindowEx" + _TCHAR, 0, pClassName, 0, 0x80000000 /*WS_POPUP*/, 0, 0, 0, 0, hMainWnd, 0, hInstanceDLL, DialogCallback))
    {
      if (hWndListBox=oSys.Call("user32::CreateWindowEx" + _TCHAR, 0, "LISTBOX", 0, 0x50700010 /*WS_VISIBLE|WS_CHILD|WS_HSCROLL|WS_VSCROLL|WS_DLGFRAME|LBS_OWNERDRAWFIXED*/, 0, 0, 0, 0, hWndContainer, 0, hInstanceDLL, 0))
      {
        //Make hWndContainer invisible
        hBrushHollow=oSys.Call("gdi32::GetStockObject", 5 /*HOLLOW_BRUSH*/);
        oSys.Call("user32::SetClassLong" + _TCHAR, hWndContainer, -10 /*GCL_HBRBACKGROUND*/, hBrushHollow);

        AkelPad.SendMessage(hWndListBox, 48 /*WM_SETFONT*/, hFontEdit, 1);
        nItemHeight=nMaxCharHeight + nLineGap;
        i=AkelPad.SendMessage(hWndListBox, 0x1A1 /*LB_GETITEMHEIGHT*/, 0, 0);
        if (nItemHeight < i)
          nItemHeight=i;
        else
          AkelPad.SendMessage(hWndListBox, 0x1A0 /*LB_SETITEMHEIGHT*/, 0, nItemHeight);
        nMaxControlHeight=lpFrameList.length * nItemHeight + oSys.Call("user32::GetSystemMetrics", 8 /*SM_CYDLGFRAME*/) * 2;
        if (nWindowMaxHeight > 0)
          nControlHeight=Math.min(nWindowMaxHeight, nMaxControlHeight);
        else
          nControlHeight=nMaxControlHeight;
        nControlHeight=Math.min(oSys.Call("user32::GetSystemMetrics", 62 /*SM_CYMAXIMIZED*/) - 8, nControlHeight);
        if (nWindowMaxWidth > 0)
          nControlWidth=Math.min(nWindowMaxWidth, nMaxCharWidth);
        else
          nControlWidth=nMaxCharWidth;
        nControlWidth=Math.min(oSys.Call("user32::GetSystemMetrics", 61 /*SM_CXMAXIMIZED*/) - 8, nControlWidth);

        if (nMaxCharWidth > nControlWidth)
        {
          AkelPad.SendMessage(hWndListBox, 0x194 /*LB_SETHORIZONTALEXTENT*/, nMaxCharWidth, 0);
          if (nMaxControlHeight == nControlHeight)
            nControlHeight+=oSys.Call("user32::GetSystemMetrics", 21 /*SM_CXHSCROLL*/);
        }

        //Fill listbox
        for (i=0; i < lpFrameList.length; ++i)
          oSys.Call("user32::SendMessage" + _TCHAR, hWndListBox, 0x180 /*LB_ADDSTRING*/, 0, lpFrameList[i][0]);

        GetWindowSize(hMainWnd, 0, rcMain);
        if (nWindowLeft >= 0)
          rcMain.left=nWindowLeft;
        else if (nWindowLeft == -2)
        {
          GetCursorPos(ptPoint);
          rcMain.left=ptPoint.x;
        }
        else
          rcMain.left+=rcMain.right / 2 - nControlWidth / 2;
        if (!(nScreenWidth=oSys.Call("user32::GetSystemMetrics", 78 /*SM_CXVIRTUALSCREEN*/)))
          nScreenWidth=oSys.Call("user32::GetSystemMetrics", 61 /*SM_CXMAXIMIZED*/);
        rcMain.left=Math.min(rcMain.left, Math.max((nScreenWidth - 8) - nControlWidth, 0));
        if (rcMain.left < 0) rcMain.left=0;

        if (nWindowTop >= 0)
          rcMain.top=nWindowTop;
        else if (nWindowTop == -2)
        {
          GetCursorPos(ptPoint);
          rcMain.top=ptPoint.y;
        }
        else
          rcMain.top+=rcMain.bottom / 2 - nControlHeight / 2;
        rcMain.top=Math.min(rcMain.top, Math.max((oSys.Call("user32::GetSystemMetrics", 62 /*SM_CYMAXIMIZED*/) - 8) - nControlHeight, 0));
        if (rcMain.top < 0) rcMain.top=0;

        oSys.Call("user32::SetWindowPos", hWndContainer, 0, rcMain.left, rcMain.top, nControlWidth, nControlHeight, 0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
        oSys.Call("user32::SetWindowPos", hWndListBox, 0, 0, 0, nControlWidth, nControlHeight, 0x16 /*SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE*/);
        AkelPad.SendMessage(hWndListBox, 0x186 /*LB_SETCURSEL*/, nCurSel, 0);
        oSys.Call("user32::ShowWindow", hWndContainer, 4 /*SW_SHOWNOACTIVATE*/);
        //oSys.Call("user32::SetFocus", hWndListBox);
        //oSys.Call("user32::ShowWindow", hWndContainer, 5 /*SW_SHOW*/);
        //oSys.Call("user32::UpdateWindow", hMainWnd);

        //Cause listbox is non-active, hook and send to listbox keyboard and mouse actions.
        if (hHookPost=AkelPad.ThreadHook(3 /*WH_GETMESSAGE*/, HookPostCallback, dwMainThreadID, 0x201 /*WM_LBUTTONDOWN*/,
                                                                                                0x0A1 /*WM_NCLBUTTONDOWN*/,
                                                                                                0x204 /*WM_RBUTTONDOWN*/,
                                                                                                0x0A4 /*WM_NCRBUTTONDOWN*/,
                                                                                                0x207 /*WM_MBUTTONDOWN*/,
                                                                                                0x0A7 /*WM_NCMBUTTONDOWN*/,
                                                                                                0x100 /*WM_KEYDOWN*/,
                                                                                                0x101 /*WM_KEYUP*/,
                                                                                                0x104 /*WM_SYSKEYDOWN*/,
                                                                                                0x105 /*WM_SYSKEYUP*/,
                                                                                                0x20A /*WM_MOUSEWHEEL*/))
        {
          if (hHookSend=AkelPad.ThreadHook(4 /*WH_CALLWNDPROC*/, HookSendCallback, dwMainThreadID, 0x6 /*WM_SETFOCUS*/))
          {
            if (hSubClass=AkelPad.WindowSubClass(hWndListBox, ListBoxCallback, 0x021 /*WM_MOUSEACTIVATE*/,
                                                                               0x087 /*WM_GETDLGCODE*/,
                                                                               0x100 /*WM_KEYDOWN*/,
                                                                               0x101 /*WM_KEYUP*/,
                                                                               0x201 /*WM_LBUTTONDOWN*/,
                                                                               0x202 /*WM_LBUTTONUP*/,
                                                                               0x203 /*WM_LBUTTONDBLCLK*/))
            {
              //Allow other scripts running
              AkelPad.ScriptNoMutex();

              //Message loop
              AkelPad.WindowGetMessage();

              AkelPad.WindowUnsubClass(hWndListBox);
            }
            AkelPad.ThreadUnhook(hHookSend);
          }
          AkelPad.ThreadUnhook(hHookPost);
        }

        if (!bNoSwitch)
        {
          i=AkelPad.SendMessage(hWndListBox, 0x188 /*LB_GETCURSEL*/, 0, 0);
          oSys.Call("user32::PostMessage" + _TCHAR, hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrameList[i][1]);
        }
        //oSys.Call("user32::DestroyWindow", hWndListBox);
      }
      oSys.Call("user32::DestroyWindow", hWndContainer);
    }
    AkelPad.WindowUnregisterClass(pClassName);
  }

  //Release font
  if (pFontName || nFontStyle || nFontSize)
  {
    if (hFontEdit)
      oSys.Call("gdi32::DeleteObject", hFontEdit);
  }
}
else
{
  if (lpFrameList.length >= 2)
    oSys.Call("user32::PostMessage" + _TCHAR, hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrameList[nCurSel][1]);
}

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 0x021 /*WM_MOUSEACTIVATE*/)
  {
    return 3 /*MA_NOACTIVATE*/;
  }
  else if (uMsg == 0x2B /*WM_DRAWITEM*/)
  {
    var hDC;
    var hIcon;
    var nItemID;
    var nItemState;
    var lpItem;
    var rcItem=[];
    var crText;
    var crBk;
    var hBrushBk;
    var nModeBkOld;

    hDC=AkelPad.MemRead(_PtrAdd(lParam, _X64?32:24) /*offsetof(DRAWITEMSTRUCT, hDC)*/, 2 /*DT_QWORD*/);
    nItemID=AkelPad.MemRead(_PtrAdd(lParam, _X64?8:8) /*offsetof(DRAWITEMSTRUCT, itemID)*/, 3 /*DT_DWORD*/);
    nItemState=AkelPad.MemRead(_PtrAdd(lParam, _X64?16:16) /*offsetof(DRAWITEMSTRUCT, itemState)*/, 3 /*DT_DWORD*/);
    lpItem=_PtrAdd(lParam, _X64?40:28) /*offsetof(DRAWITEMSTRUCT, rcItem)*/;
    RectToArray(lpItem, rcItem);

    //Set background
    if (nItemState & 0x1 /*ODS_SELECTED*/)
    {
      crText=oSys.Call("user32::GetSysColor", 14 /*COLOR_HIGHLIGHTTEXT*/);
      crBk=oSys.Call("user32::GetSysColor", 13 /*COLOR_HIGHLIGHT*/);
      hBrushBk=oSys.Call("user32::GetSysColorBrush", 13 /*COLOR_HIGHLIGHT*/);
    }
    else
    {
      crText=oSys.Call("user32::GetSysColor", 8 /*COLOR_WINDOWTEXT*/);
      crBk=oSys.Call("user32::GetSysColor", 5 /*COLOR_WINDOW*/);
      hBrushBk=oSys.Call("user32::GetSysColorBrush", 5 /*COLOR_WINDOW*/);
    }
    oSys.Call("user32::FillRect", hDC, lpItem, hBrushBk);
    nModeBkOld=oSys.Call("gdi32::SetBkMode", hDC, 1 /*TRANSPARENT*/);

    //Draw icon
    hIcon=AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 38 /*FI_ICONHANDLE*/, lpFrameList[nItemID][1]);
    oSys.Call("user32::DrawIconEx", hDC, rcItem.left, rcItem.top + (rcItem.bottom - rcItem.top) / 2 - nIconSize / 2, hIcon, nIconSize, nIconSize, 0, 0, 0x3 /*DI_NORMAL*/);

    //Draw text
    oSys.Call("gdi32::SetTextColor", hDC, crText);
    oSys.Call("gdi32::SetBkColor", hDC, crBk);
    oSys.Call("gdi32::TextOut" + _TCHAR, hDC, rcItem.left + nIconSize + nIconGap, rcItem.top + (rcItem.bottom - rcItem.top) / 2 - nMaxCharHeight / 2, lpFrameList[nItemID][0], lpFrameList[nItemID][0].length);

    oSys.Call("gdi32::SetBkMode", hDC, nModeBkOld);
  }
  return 0;
}

function HookPostCallback(nCode, wParam, lParam)
{
  var uMsg=AkelPad.MemRead(_PtrAdd(lParam, _X64?8:4) /*offsetof(MSG, message)*/, 3 /*DT_DWORD*/);
  var nParamW;
  var nParamL;

  if (uMsg == 0x201 /*WM_LBUTTONDOWN*/ ||
      uMsg == 0x0A1 /*WM_NCLBUTTONDOWN*/ ||
      uMsg == 0x204 /*WM_RBUTTONDOWN*/ ||
      uMsg == 0x0A4 /*WM_NCRBUTTONDOWN*/ ||
      uMsg == 0x207 /*WM_MBUTTONDOWN*/ ||
      uMsg == 0x0A7 /*WM_NCMBUTTONDOWN*/)
  {
    var hWnd=AkelPad.MemRead(_PtrAdd(lParam, 0) /*offsetof(MSG, hwnd)*/, 2 /*DT_QWORD*/);

    if (hWnd != hWndListBox)
    {
      //Not in rect
      bNoSwitch=true;

      //Exit message loop
      oSys.Call("user32::PostQuitMessage", 0);
    }
  }
  else if (uMsg == 0x100 /*WM_KEYDOWN*/ ||
           uMsg == 0x101 /*WM_KEYUP*/ ||
           uMsg == 0x104 /*WM_SYSKEYDOWN*/ ||
           uMsg == 0x105 /*WM_SYSKEYUP*/ ||
           uMsg == 0x20A /*WM_MOUSEWHEEL*/)
  {
    nParamW=AkelPad.MemRead(_PtrAdd(lParam, _X64?16:8) /*offsetof(MSG, nParamW)*/, 2 /*DT_QWORD*/);
    nParamL=AkelPad.MemRead(_PtrAdd(lParam, _X64?24:12) /*offsetof(MSG, lParam)*/, 2 /*DT_QWORD*/);
    AkelPad.SendMessage(hWndListBox, uMsg, nParamW, nParamL);
    AkelPad.MemCopy(_PtrAdd(lParam, _X64?8:4) /*offsetof(MSG, message)*/, 0 /*WM_NULL*/, 3 /*DT_DWORD*/);
  }
}

function HookSendCallback(nCode, wParam, lParam)
{
  var uMsg=AkelPad.MemRead(_PtrAdd(lParam, _X64?16:8) /*offsetof(CWPSTRUCT, message)*/, 3 /*DT_DWORD*/);
  var nParamW;
  var nParamL;

  if (uMsg == 0x6 /*WM_SETFOCUS*/)
  {
    bNoSwitch=true;

    //Exit message loop
    oSys.Call("user32::PostQuitMessage", 0);
  }
}

function ListBoxCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 0x021 /*WM_MOUSEACTIVATE*/)
  {
    return 3 /*MA_NOACTIVATE*/;
  }
  else if (uMsg == 0x087 /*WM_GETDLGCODE*/)
  {
    AkelPad.WindowNoNextProc(hSubClass);
    return 0x4 /*DLGC_WANTALLKEYS*/;
  }
  else if (uMsg == 0x100 /*WM_KEYDOWN*/)
  {
    if (wParam == 0x43 /*c*/)
    {
      if (bCtrlTab || (oSys.Call("user32::GetKeyState", 0x11 /*VK_CONTROL*/) & 0x8000))
      {
        i=AkelPad.SendMessage(hWndListBox, 0x188 /*LB_GETCURSEL*/, 0, 0);
        AkelPad.SetClipboardText(lpFrameList[i][0]);
      }
    }
    else if (wParam == 0x9 /*VK_TAB*/)
    {
      var nCount;

      nCount=AkelPad.SendMessage(hWndListBox, 0x18B /*LB_GETCOUNT*/, 0, 0);
      i=AkelPad.SendMessage(hWndListBox, 0x188 /*LB_GETCURSEL*/, 0, 0);

      if (!(oSys.Call("user32::GetKeyState", 0x10 /*VK_SHIFT*/) & 0x8000))
      {
        if (++i >= nCount)
          i=0;
      }
      else
      {
        if (--i < 0)
          i=nCount - 1;
      }
      AkelPad.SendMessage(hWndListBox, 0x186 /*LB_SETCURSEL*/, i, 0);
    }
    else if (wParam == 0xD /*VK_RETURN*/)
    {
      //Exit message loop
      oSys.Call("user32::PostQuitMessage", 0);
    }
    else if (wParam == 0x1B /*VK_ESCAPE*/)
    {
      bNoSwitch=true;

      //Exit message loop
      oSys.Call("user32::PostQuitMessage", 0);
    }
  }
  else if (uMsg == 0x101 /*WM_KEYUP*/)
  {
    if (wParam == 0x11 /*VK_CONTROL*/)
    {
      if (bCtrlTab)
      {
        //Exit message loop
        oSys.Call("user32::PostQuitMessage", 0);
      }
    }
  }
  else if (uMsg == 0x201 /*WM_LBUTTONDOWN*/)
  {
    var lResult=AkelPad.SendMessage(hWndListBox, 0x01A9 /*LB_ITEMFROMPOINT*/, 0, lParam);

    if (HIWORD(lResult) == 0)
      AkelPad.SendMessage(hWndListBox, 0x186 /*LB_SETCURSEL*/, LOWORD(lResult), 0);
    AkelPad.WindowNoNextProc(hSubClass);
  }
  else if (uMsg == 0x202 /*WM_LBUTTONUP*/ ||
           uMsg == 0x203 /*WM_LBUTTONDBLCLK*/)
  {
    if (uMsg == 0x203 /*WM_LBUTTONDBLCLK*/ || bSingleClick)
    {
      //Exit message loop
      oSys.Call("user32::PostQuitMessage", 0);
    }
  }
}

function GetFrameList(lpFrameList)
{
  var lpCurFrame=AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
  var lpInitFrame;
  var lpFrame;
  var nCurFrame=0;
  var bModified;
  var i;

  if (bRightLeft)
    lpInitFrame=AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 8 /*FWF_BYTABINDEX*/, 0);
  else
    lpInitFrame=lpCurFrame;
  lpFrame=lpInitFrame;

  for (i=0; lpFrame; ++i)
  {
    lpFrameList[i]=[0, 0];
    lpFrameList[i][0]=AkelPad.MemRead(AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 32 /*FI_FILEW*/, lpFrame), 1 /*DT_UNICODE*/);
    lpFrameList[i][1]=lpFrame;
    if (bOnlyNames)
      lpFrameList[i][0]=AkelPad.GetFilePath(lpFrameList[i][0], 2 /*CPF_FILENAME*/);
    if (nShowModify)
    {
      bModified=AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 15 /*FI_MODIFIED*/, lpFrame);
      lpFrameList[i][0]=((nShowModify == 2 && bModified)?"* ":"") + lpFrameList[i][0] + ((nShowModify == 1 && bModified)?" *":"");
    }
    if (lpFrame == lpCurFrame)
      nCurFrame=i;

    if (bRightLeft)
      lpFrame=AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 8 /*FWF_BYTABINDEX*/, i + 1);
    else
      lpFrame=AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 3 /*FWF_PREV*/, lpFrame);
    if (lpFrame == lpInitFrame) break;
  }

  //Next frame
  if (lpFrameList.length >= 2 && bNext != -1)
  {
    if ((bRightLeft && bNext) || (!bRightLeft && !bNext))
      ++nCurFrame;
    else
      --nCurFrame;
    if (nCurFrame < 0)
      nCurFrame=lpFrameList.length - 1;
    else if (nCurFrame >= lpFrameList.length)
      nCurFrame=0;
  }
  return nCurFrame;
}

function CreateFont(pFaceName, nFontStyle, nPointSize)
{
  //Release it with: oSys.Call("gdi32::DeleteObject", hFont);
  var lpLogFontSrc;
  var lpLogFontDst;
  var hDC;
  var hFont=0;
  var nHeight;
  var nWeight;
  var nItalic;

  if (lpLogFontDst=AkelPad.MemAlloc(92 /*sizeof(LOGFONTW)*/))
  {
    lpLogFontSrc=AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 48 /*FI_EDITFONTW*/, 0);
    oSys.Call("kernel32::RtlMoveMemory", lpLogFontDst, lpLogFontSrc, 92 /*sizeof(LOGFONTW)*/);

    if (nPointSize)
    {
      if (hDC=oSys.Call("user32::GetDC", hMainWnd))
      {
        nHeight=-oSys.Call("kernel32::MulDiv", nPointSize, oSys.Call("gdi32::GetDeviceCaps", hDC, 90 /*LOGPIXELSY*/), 72);
        AkelPad.MemCopy(_PtrAdd(lpLogFontDst, 0) /*offsetof(LOGFONTW, lfHeight)*/, nHeight, 3 /*DT_DWORD*/);
        oSys.Call("user32::ReleaseDC", hMainWnd, hDC);
      }
    }
    if (nFontStyle != 0 /*FS_NONE*/)
    {
      nWeight=(nFontStyle == 2 /*FS_FONTBOLD*/ || nFontStyle == 4 /*FS_FONTBOLDITALIC*/)?700 /*FW_BOLD*/:400 /*FW_NORMAL*/;
      AkelPad.MemCopy(_PtrAdd(lpLogFontDst, 16) /*offsetof(LOGFONTW, lfWeight)*/, nWeight, 3 /*DT_DWORD*/);
      nItalic=(nFontStyle == 3 /*FS_FONTITALIC*/ || nFontStyle == 4 /*FS_FONTBOLDITALIC*/)?1:0;
      AkelPad.MemCopy(_PtrAdd(lpLogFontDst, 20) /*offsetof(LOGFONTW, lfItalic)*/, nItalic, 5 /*DT_BYTE*/);
    }
    if (_TSTR == 0 /*DT_ANSI*/ && !pFaceName)
      pFaceName=AkelPad.MemRead(_PtrAdd(lpLogFontDst, 28) /*offsetof(LOGFONTW, lfFaceName)*/, 1 /*DT_UNICODE*/);
    if (pFaceName)
      AkelPad.MemCopy(_PtrAdd(lpLogFontDst, 28) /*offsetof(LOGFONTW, lfFaceName)*/, pFaceName.substr(0, 32 /*LF_FACESIZE*/), _TSTR);

    hFont=oSys.Call("gdi32::CreateFontIndirect" + _TCHAR, lpLogFontDst);
    AkelPad.MemFree(lpLogFontDst);
  }
  return hFont;
}

function GetCursorPos(ptPoint)
{
  var lpPoint;

  ptPoint.x=0;
  ptPoint.y=0;

  if (lpPoint=AkelPad.MemAlloc(8 /*sizeof(POINT)*/))
  {
    if (oSys.Call("user32::GetCursorPos", lpPoint))
    {
      ptPoint.x=AkelPad.MemRead(_PtrAdd(lpPoint, 0) /*offsetof(POINT, x)*/, 3 /*DT_DWORD*/);
      ptPoint.y=AkelPad.MemRead(_PtrAdd(lpPoint, 4) /*offsetof(POINT, y)*/, 3 /*DT_DWORD*/);
    }
    AkelPad.MemFree(lpPoint);
  }
}

function RectToArray(lpRect, rcRect)
{
  rcRect.left=AkelPad.MemRead(_PtrAdd(lpRect, 0) /*offsetof(RECT, left)*/, 3 /*DT_DWORD*/);
  rcRect.top=AkelPad.MemRead(_PtrAdd(lpRect, 4) /*offsetof(RECT, top)*/, 3 /*DT_DWORD*/);
  rcRect.right=AkelPad.MemRead(_PtrAdd(lpRect, 8) /*offsetof(RECT, right)*/, 3 /*DT_DWORD*/);
  rcRect.bottom=AkelPad.MemRead(_PtrAdd(lpRect, 12) /*offsetof(RECT, bottom)*/, 3 /*DT_DWORD*/);
  return rcRect;
}

function GetWindowSize(hWnd, hWndOwner, rcRect)
{
  var lpRect;
  var bResult=false;

  if (lpRect=AkelPad.MemAlloc(16 /*sizeof(RECT)*/))
  {
    if (oSys.Call("user32::GetWindowRect", hWnd, lpRect))
    {
      RectToArray(lpRect, rcRect);
      rcRect.right-=rcRect.left;
      rcRect.bottom-=rcRect.top;

      if (hWndOwner)
        bResult=oSys.Call("user32::ScreenToClient", hWndOwner, lpRect);
      else
        bResult=true;
      rcRect.left=AkelPad.MemRead(_PtrAdd(lpRect, 0) /*offsetof(RECT, left)*/, 3 /*DT_DWORD*/);
      rcRect.top=AkelPad.MemRead(_PtrAdd(lpRect, 4) /*offsetof(RECT, top)*/, 3 /*DT_DWORD*/);
    }
    AkelPad.MemFree(lpRect);
  }
  return bResult;
}

function LOWORD(dwNumber)
{
  return (dwNumber & 0xffff);
}

function HIWORD(dwNumber)
{
  return (dwNumber >> 16);
}

function MAKELONG(a, b)
{
  return (a & 0xffff) | ((b & 0xffff) << 16);
}



Image
Last edited by Instructor on Fri Oct 09, 2015 4:56 pm, edited 42 times in total.

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

Post by Instructor »

Increment version.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4393#p4393
// Version: 1.2
// Author: Shengalts Aleksander aka Instructor
// 
//
// Description(1033): Increment version.
// Description(1049): Увеличение версии.
//
//  1.0.1 -> 1.0.2
//  1,0,9 -> 1,1,0

var pSelText;
var pDelimiter;
var pLinesArray;
var nIndex;

if (pSelText=AkelPad.GetSelText())
{
  if (pSelText.match(/([.,])/))
  {
    pDelimiter=RegExp.$1;

    if (pLinesArray=pSelText.split(pDelimiter))
    {
      for (nIndex=pLinesArray.length - 1; nIndex >= 0; --nIndex)
      {
        pLinesArray[nIndex]=parseInt(pLinesArray[nIndex]) + 1;
        pLinesArray[nIndex]="" + pLinesArray[nIndex];
        if (pLinesArray[nIndex].length <= 1 || !nIndex)
          break;
        pLinesArray[nIndex]=0;
      }
      pSelText=pLinesArray.join(pDelimiter);
      AkelPad.ReplaceSel(pSelText, -2);
    }
  }
}
Last edited by Instructor on Thu Dec 18, 2014 5:43 pm, edited 6 times in total.

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

UndoAllNoScroll.js

Post by VladSh »

Code: Select all

// Description(1033): Extended undo changes; works without scroll
// Description(1049): Расширенная отмена изменений; работает без скролирования документа
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4537#p4537
// Version: 2.4 (2015.01.15)
// Author: VladSh
// Initial code: © Instructor
// 
// Arguments:
// 	mode:
// 		0 - ask the user (for saved and modified document only);
// 		[1] - undo unsaved changes only (works as Instructors UndoAll.js);
// 		2 - undo all changes
// Usage:
// 	-"Отменить всё" Call("Scripts::Main", 1, "UndoAllNoScroll.js", `-mode=2`) Icon("%a\AkelFiles\Plugs\ToolBar.dll", 10)
// 	-"Отменить..." Call("Scripts::Main", 1, "UndoAllNoScroll.js", `-mode=0`) Icon("%a\AkelFiles\Plugs\ToolBar.dll", 10) - с запросом

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

if (hWndEdit) {
	if (AkelPad.SendMessage(hWndEdit, 3075 /*AEM_CANUNDO*/, 0, 0)) {
		
		var mode = AkelPad.GetArgValue("mode", 1);
		if (mode == 0) {
			mode = 2;
			if (AkelPad.GetEditFile(0)) {		// saved document
				var bModify = AkelPad.SendMessage(hWndEdit, 3086 /*AEM_GETMODIFY*/, 0, 0);
				if (bModify) {
					var msgText = "Yes - undo all changes;\nNo - undo unsaved changes only.";
					switch (AkelPad.MessageBox(AkelPad.GetMainWnd(), msgText, "Undo changes...", 32 + 3 /*MB_ICONQUESTION|MB_YESNOCANCEL*/)) {
						case 7 /*IDNO*/:
							mode = 1;
							break;
						case 2 /*IDCANCEL*/:
							WScript.Quit();
					}
				}
			}
		}
		
		SetRedraw(hWndEdit, false);
		AkelPad.SendMessage(hWndEdit, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, true)
		
		if (mode == 1) {
			// undo unsaved changes only
			while (AkelPad.SendMessage(hWndEdit, 3077 /*AEM_UNDO*/, 0, 0)) {
				if (!AkelPad.SendMessage(hWndEdit, 3086 /*AEM_GETMODIFY*/, 0, 0)) {
					break;
				}
			}
		}
		else if (mode == 2) {
			// undo all changes
			while (AkelPad.SendMessage(hWndEdit, 3075 /*AEM_CANUNDO*/, 0, 0)) {
				AkelPad.SendMessage(hWndEdit, 3077 /*AEM_UNDO*/, 0, 0)
			}
		}
		
		AkelPad.SendMessage(hWndEdit, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, false);
		SetRedraw(hWndEdit, true);
	}
}

function SetRedraw(hWnd, bRedraw) { 
	AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0); 
	if (bRedraw) oSys.Call("user32::InvalidateRect", hWnd, 0, true); 
}


От undoNoScroll.js сомнительная польза, т.к. при одной операции отмены нужно видеть, какое действие отменяешь, - переброска курсора как раз там очень полезна.

Данный скрипт сваял на основе скриптов, написанных Instructor'ом: UndoAll.js и undoNoScroll.js; часто его использую из-за удобства, особенно при работе с временными файлами, не сохраняемыми на диск.
Last edited by VladSh on Thu Jan 15, 2015 8:07 pm, edited 15 times 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=4548#p4548
// Description(1033): Open URL or Site which was got from link or from selected text
// Description(1049): Открыть ссылку или сайт, определённый из ссылки или выделения
// Version: 2.4 (2015.04.01)
// Author: VladSh
// 
// Arguments:
//		siteOpen:
//			= [false]	-	будет откыта ссылка
//			= true		-	будет открыт сайт, взятый из ссылки
//		cmdLine:
//			= без параметра либо пустая строка - открытие в браузере по умолчанию
//			= iexplore.exe - открытие в IE
//
// Usage:
//		-"Перейти к сайту (в браузере по умолчанию)" Call("Scripts::Main", 1, "URLOpen.js", `-url="%u" -siteOpen=true`)
// 	-"Открыть выделенный URL в IE" Call("Scripts::Main", 1, "URLOpen.js", `-cmdLine="iexplore.exe"`) - для выделенного текста

var url = AkelPad.GetArgValue("url", AkelPad.GetSelText());
if (!url) WScript.Quit();

var cmdLine = AkelPad.GetArgValue("cmdLine", 'explorer.exe');

if (AkelPad.GetArgValue("siteOpen", false)) {
	//определяем адрес сайта
	var slashClose = url.indexOf('/', url.indexOf(':/', 0) + 3);
	if (slashClose != -1)
		url = url.slice(0, slashClose);
}

if (cmdLine != "iexplore.exe") {
	var WshShell = new ActiveXObject("WScript.Shell");
	WshShell.Exec(cmdLine + ' "' + url + '"');
}
else {
	var AppShell = new ActiveXObject("shell.application");
	AppShell.ShellExecute(cmdLine, url);
}


Конечно лучше бы вываливался список (а красивей была бы малюсенькая менюха) всех промежуточных вариантов путей как в Висте, но... пока нет метода ListBox сойдёт и так.

Примеры использования в моём контекстном меню (ссылок).

P.S. Переделано для работы в Win7, т.к. XP и ниже уходят в прошлое...
Last edited by VladSh on Fri Jun 19, 2015 8:54 pm, edited 11 times in total.

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

Post by Instructor »

Save new file to a default folder.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4678#p4678
// Version: 1.1
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Save new file to a default folder.
// Description(1049): Сохранение нового файла в папку по умолчанию.
//
// Arguments:
// -Dir="C:\MyFolder\"  -Save folder. If not specified, Windows temp folder will be used.
// -Name="file"         -Base file name (default is "new").
// -Ext=".txt"          -File name extension (default is ".txt").
// -CodePage=65001      -Save codepage. If -1, current codepage will be used (default).
// -BOM=1               -File byte order mark (one of the following):
//                         1 - exist (default).
//                         0 - doesn't exist.
//                        -1 - current BOM will be used.
//
// Usage:
// Call("Scripts::Main", 1, "SaveDefault.js", `-Dir="C:\MyFolder\" -CodePage=65001`)

//Arguments
var pDir=AkelPad.GetArgValue("Dir", "");
var pName=AkelPad.GetArgValue("Name", "new");
var pExt=AkelPad.GetArgValue("Ext", ".txt");
var nCodePage=AkelPad.GetArgValue("CodePage", -1);
var nBOM=AkelPad.GetArgValue("BOM", 1);

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var hEditWnd=AkelPad.GetEditWnd();
var oSys=AkelPad.SystemFunction();
var pFile=AkelPad.GetEditFile(0);
var nFileCount;
var nSaveResult;

if (hEditWnd)
{
  if (pFile == "")
  {
    if (!pDir)
      pDir=GetTempPath();
    if (pDir)
    {
      if (pDir.substr(pDir.length - 1, 1) != "\\")
        pDir+="\\";
    }

    if (IsFileExist(pDir))
    {
      for (nFileCount=1; ; ++nFileCount)
      {
        pFile=pDir + pName + nFileCount + pExt;

        if (!IsFileExist(pFile))
        {
          if (nSaveResult=AkelPad.SaveFile(hEditWnd, pFile, nCodePage, nBOM))
          {
            AkelPad.MessageBox(hMainWnd, GetLangString(0).replace(/%d/, "" + nSaveResult), WScript.ScriptName, 16 /*MB_ICONERROR*/);
          }
          break;
        }
      }
    }
    else AkelPad.MessageBox(hMainWnd, GetLangString(1).replace(/%s/, pDir), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
  }
  else AkelPad.Command(4105 /*IDM_FILE_SAVE*/);
}

function IsFileExist(pFile)
{
  if (oSys.Call("kernel32::GetFileAttributes" + _TCHAR, pFile) == -1)
    return false;
  return true;
}

function GetTempPath()
{
  var lpBuffer;
  var pTempDir="";

  if (lpBuffer=AkelPad.MemAlloc(256 * _TSIZE))
  {
    oSys.Call("kernel32::GetTempPath" + _TCHAR, 256, lpBuffer);
    pTempDir=AkelPad.MemRead(lpBuffer, _TSTR);
    AkelPad.MemFree(lpBuffer);
  }
  return pTempDir;
}

function GetLangString(nStringID)
{
  var nLangID=AkelPad.GetLangId(1 /*LANGID_PRIMARY*/);

  if (nLangID == 0x19) //LANG_RUSSIAN
  {
    if (nStringID == 0)
      return "\u041E\u0448\u0438\u0431\u043A\u0430\u003A %d";
    if (nStringID == 1)
      return "\u0414\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0438 \"%s\" \u043D\u0435\u0020\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442";
  }
  else
  {
    if (nStringID == 0)
      return "Error: %d";
    if (nStringID == 1)
      return "Folder \"%s\" doesn't exist";
  }
  return "";
}
Last edited by Instructor on Thu Dec 18, 2014 5:47 pm, edited 4 times in total.

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

Для тех, кто использует клиент Lotus Notes

Post by VladSh »

Code: Select all

// Description(1049): Создание письма в клиенте Lotus Notes на основе открытого файла в текстовом редакторе AkelPad
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4873#p4873
// Version: 1.10 (2013.11.21)
// Version: 1.0 (2009.05.20)
// Author: VladSh

var WshShell = new ActiveXObject("WScript.Shell");
var LNAppHeader = "Lotus Notes";		//не изменять!
var APAppHeader = "AkelPad";		//не изменять!
var subject = "";
var content = "";
if (WScript.Arguments.length && WScript.Arguments(0)) {
	//Для файла из списка свежих
	var fso = new ActiveXObject("Scripting.FileSystemObject");
	if (fso.FileExists(WScript.Arguments(0)))
		content = AkelPad.ReadFile(WScript.Arguments(0));
	else {
		AkelPad.MessageBox(AkelPad.GetMainWnd(), "Файла '" + WScript.Arguments(0) + "' не существует на диске!", APAppHeader + " -> " + WScript.ScriptName, 48);
		WScript.Quit();
	}
	
	subject = getFileNameOnly(WScript.Arguments(0));
}
else {
	//Для файла, открытого в текущей вкладке
	var tmpSelStart = AkelPad.GetSelStart();
	content = AkelPad.GetSelText() || AkelPad.GetTextRange(0, -1);
	AkelPad.SetSel(tmpSelStart, tmpSelStart);
	
	subject = getFileNameOnly(AkelPad.GetEditFile(0)) || (content.slice(0, content.indexOf("\r"))).replace(/\/\/\//, "");		//Если файл не сохранён, то для темы письма берём его первую строку
}

if (startNotes()) {
	var errText = createNotesMemo(subject, content);
	if (errText) {
		WshShell.AppActivate(APAppHeader);
		AkelPad.MessageBox(AkelPad.GetMainWnd(), errText, APAppHeader + " -> " + WScript.ScriptName, 48);
	}
}


/* ===== FUNCTIONS ===== */

function getFileNameOnly(fileNameFull) {
	return fileNameFull.slice(fileNameFull.lastIndexOf("\\") + 1, fileNameFull.lastIndexOf("."));
}


function startNotes() {
	var LN_PROCNAME = "nlnotes.exe";
	
	if (isProcessRunning(LN_PROCNAME) == 0) {
		//Запуск клиента Lotus в стандартном режиме (с возможностью смены пользователя при загрузке)
		
		var pathLN_app = regGetStringValue(0x80000002	/* HKEY_LOCAL_MACHINE */, "Software\\Lotus\\Notes\\", "Path");
		if (pathLN_app == null) {
			AkelPad.MessageBox(AkelPad.GetMainWnd(), "Приложение ''" + LNAppHeader + "'' не зарегистрировано в реестре Windows!", APAppHeader + " -> " + WScript.ScriptName, 48);
			WScript.Quit();
		}
		var pathLN_ini = regGetStringValue(0x80000001	/* HKEY_CURRENT_USER */, "Software\\Lotus\\Notes\\Installer", "VDIR_INI") || pathLN_app;
		
/*
		var oWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2");
		var oClass = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2:Win32_Process");
		var oStartup = oWMIService.Get("Win32_ProcessStartup");
		var oConfig = oStartup.SpawnInstance_();
		oConfig.ShowWindow = 3		//максимизированное окно
		var PID = "";
		var res = oClass.Create('"' + pathLN_app + '\\notes.exe" "=' + pathLN_ini + '\\notes.ini"', null, oConfig, PID);
		if (res != 0) {
			AkelPad.MessageBox(AkelPad.GetMainWnd(), "Код ошибки запуска: " + res, APAppHeader + " -> " + WScript.ScriptName, 48);
			WScript.Quit();
		}
*/
		var oLNExec = WshShell.Exec('"' + pathLN_app + '\\notes.exe" "=' + pathLN_ini + '\\notes.ini"');
		//Даём инициализироваться и запуститься животному
		while (oLNExec.Status == 0)
			WScript.Sleep(100);
		
		//Ждём, пока пользователь не введёт пароль
		while (isProcessRunning("nfileret.exe") == 1)
			WScript.Sleep(100);
		
		//Обрабатываем ситуацию, когда пользователь выбрал выход из Lotus Notes
		WScript.Sleep(400);		//Даём животинке полностью выгрузится
		if (isProcessRunning(LN_PROCNAME) != 0)
			return true;
		else
			return false;
	}
	else
		return true;
}


function isProcessRunning(processName) {
	var oWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2");
	var colProcesses = oWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '" + processName + "'");
	return colProcesses.Count;
}


function createNotesMemo(subject, content) {
	var ns = new ActiveXObject("Notes.NotesSession");
	
	var IN_MAILSERVER = "MailServer";
	var IN_MAILFILE = "MailFile";
	var mailServer;
	var mailFile;
	var locationName = ns.GetEnvironmentString("Location", true);
	if (locationName) {		//Определение пути к mail-базе из текущего локейшена
		var pathAB = ns.GetEnvironmentString("NAMES", true) || "names.nsf";
		var ndbAB = ns.GetDatabase("", pathAB, false);
		if (ndbAB != null) {
			var nvLocations = ndbAB.GetView("Locations");
			if (nvLocations != null) {
				locationName = locationName.split(",")[0];
				var ndLocation = nvLocations.GetDocumentByKey(locationName, true);
				if (ndLocation != null) {
					mailServer = ndLocation.GetFirstItem(IN_MAILSERVER).Text;
					mailFile = ndLocation.GetFirstItem(IN_MAILFILE).Text;
				}
			}
		}
	}
	if (!mailFile) {		//Вычитка пути к mail-базе напрямую из notes.ini
		mailServer = ns.GetEnvironmentString(IN_MAILSERVER, true);
		mailFile = ns.GetEnvironmentString(IN_MAILFILE, true);
	}
	
	var ndbMail = ns.GetDatabase(mailServer, mailFile);
	if (ndbMail.IsOpen == true) {
		var ndMemo = ndbMail.CreateDocument();
		ndMemo.ReplaceItemValue("Form", "Memo");
		ndMemo.ReplaceItemValue("Subject", subject);
		var nrtiBody = ndMemo.CreateRichTextItem("Body");
		nrtiBody.AppendText(content);
		nrtiBody.GetFormattedText(false, 1);									//Ставшие привычными танцы с бубном :-)
		
		//Открываем созданное письмо
		var nuiws = new ActiveXObject("Notes.NotesUIWorkspace");
		try {
			nuiws.EditDocument(true, ndMemo);
		}
		catch (e) {
			if (e.message) {
				AkelPad.MessageBox(AkelPad.GetEditWnd(), "Message:" + e.message + "\nStack:" + e.stack, WScript.ScriptName, 48 /*MB_EXCLAMATION*/);
			}
		}
		
		//Выводим окно Lotus Notes на передний план
		if (ns.NotesBuildVersion >= 400)
			LNAppHeader = "IBM Notes";
		WshShell.AppActivate(LNAppHeader);
		return "";
	}
	else
		return "Почтовая база выбранного пользователя " + mailServer + "!!" + mailFile + " не может быть открыта! Проверьте настройки подключения и текущее место вызова.";
}


function regGetStringValue(hKey, sKey, sParam) {
	var oWMIReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\default:StdRegProv");
	
	oMethod = oWMIReg.Methods_.Item("GetStringValue");
	oInParam = oMethod.InParameters.SpawnInstance_();
	oInParam.hDefKey = hKey;
	oInParam.sSubKeyName = sKey;
	oInParam.sValueName = sParam;
	
	oOutParam = oWMIReg.ExecMethod_(oMethod.Name, oInParam);
	
	return oOutParam.sValue;		//Если параметр не найден, то возвращает null, в отличие от WshShell.RegRead(), которая генерит ошибку
}


Удобно отправить какой-нить файлик другу (я часто приколы или цитаты в текстовых файлах собираю) :D

Посадил на комбинацию клавиш Ctrl+M, точно, как в Lotus Notes 8)
Last edited by VladSh on Wed Jan 14, 2015 6:29 pm, edited 11 times in total.

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

делаем перевод строки более интеллектуальным :-)

Post by VladSh »

Code: Select all

// Description(1049): Создание новой строки с отступом и существующим типом пункта; поддерживается последовательная нумерация строк
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4890#p4890
// Version: 4.6 (2011.07.19)
// Author: VladSh

if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
oCh.runWithRedraw();

function process() {
	var nCursor = AkelPad.GetSelEnd();
	oCh.setCompleteLineRange(nCursor, nCursor);
	
	var nonNullIndex = oCh.Text.lastIndexOf(oStr.trim(oCh.Text, " \t"));		//индекс первого значащего символа
	var shiftExistent = oCh.Text.slice(0, nonNullIndex);		//отступ 1-го значащего символа от начала строки
	
	var nShiftStart = oCh.Text.indexOf(" ", nonNullIndex) || oCh.Text.indexOf("\t", nonNullIndex);		//индекс начала отступа текста от пункта
	var pSymbol = oCh.Text.slice(nonNullIndex, nShiftStart);		//символ пункта
	
	nCursor = nCursor - oCh.rResult[0];
	if (nCursor < nShiftStart) nCursor = nShiftStart;
	
	var pTextLeft = oCh.Text.substr(0, nCursor);		//часть текста до курсора (остаётся на текущей строке)
	var pTextRight = oStr.ltrim(oCh.Text.substr(nCursor), " \t");		//часть текста после курсора (переводится в новую строку)
	
	var shiftAfterSymbol = "";
	if (pSymbol.length <= 5) {
		shiftAfterSymbol = oCh.Text.slice(nShiftStart);
		if (oStr.trim(shiftAfterSymbol, " \t")) {
			//если в строке после символа пункта что-то есть
			var nShiftEnd = oCh.Text.indexOf(oStr.trim(shiftAfterSymbol, " \t"), nShiftStart);
			shiftAfterSymbol = oCh.Text.slice(nShiftStart, nShiftEnd);		//отступ между символом пункта и текстом
		}
	}
	else
		pSymbol = "";
	
	var pNumber = parseInt(pSymbol);
	if (!isNaN(pNumber)) {
		pSymbol = pSymbol.replace(new RegExp(pNumber), "");
		pSymbol = (pNumber + 1) + pSymbol;
	}
	
	oCh.Text = pTextLeft + pBreak + shiftExistent + pSymbol + shiftAfterSymbol + pTextRight;

	oCh.setSelCaret(oCh.rResult[0] + oCh.Text.length);		//ставим каретку после вставленного текста
}
Пример 1:

Code: Select all

   - Текст
результат:

Code: Select all

   - Текст
   - |
Пример 2:

Code: Select all

   Текст
результат:

Code: Select all

   Текст
   |
Пример 3:

Code: Select all

* |
результат:

Code: Select all

*
* |
Пример 4:

Code: Select all

Текст
результат:

Code: Select all

Текст
|
Пример 5:

Code: Select all

|
результат:

Code: Select all

|
Пример 6:

Code: Select all

   4. Текст4|
результат:

Code: Select all

   4. Текст4
   5. |
Пример 7:

Code: Select all

   4). Очень хороший |текст
результат:

Code: Select all

   4). Очень хороший
   5). текст|
Посадил этот скрипт на комбинацию клавиш Shift+Enter через HotKeys-плагин, по аналогии тому, как советовал Instructor.
Бомба!


Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4890#p4890
// Description(1033): Recalculation of line numbers
// Description(1049): Перепросчёт номеров строк
// - начиная с той, на которой установлен курсор
// - либо чисто в выделенных строках (нужно для подблоков нумерации)
// Version: 2.0 (2016.09.16)
// Author: VladSh
// 
// предлагаемая комбинация клавиш: Alt + Shift + N

//Oбразцы, с которыми будем сравнивать все последующие строки
var nonNullIndexBase;		//индекс первого значащего символа
var pSymbolBase;				//символы, которые идут сразу за числом
var pNumberBase;				//счётчик

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

oCh.runWithRedraw();

function process() {
	var nSelStart = AkelPad.GetSelStart();
	if (nSelStart == AkelPad.GetSelEnd())
		oCh.setCompleteLineRange(nSelStart, -2);		//берём текст от строки, на которой стоит курсор и до конца файла
	else
		oCh.setCompleteLineRange(nSelStart, AkelPad.GetSelEnd());
	
	oCh.Text = processRowText(oCh.Text, pBreak);
}

function processString(s) {
	//code modify the string s...
	var pResult;		//строка, в которую записываем результат
	
	var nonNullIndex = s.lastIndexOf(oStr.trim(s, " \t"));
	if (nonNullIndexBase == undefined) nonNullIndexBase = nonNullIndex;
	
	if (nonNullIndex == nonNullIndexBase) {
		var shiftExistent = s.slice(0, nonNullIndex);		//отступ 1-го значащего символа от начала строки
		
		var nShiftStart = s.indexOf(" ", nonNullIndex) || s.indexOf("\t", nonNullIndex);		//индекс начала отступа текста от пункта
		
		var pSymbol = s.slice(nonNullIndex, nShiftStart);		//символ пункта
		
		if (pSymbol.length <= 5) {
			var pNumber = parseInt(pSymbol);
			if (!isNaN(pNumber)) {
				pSymbol = pSymbol.replace(new RegExp(pNumber), "");
				if (pSymbol) {
					if (!pSymbolBase) pSymbolBase = pSymbol;
					
					if (pSymbol == pSymbolBase) {
						if (pNumberBase) pNumberBase += 1; else pNumberBase = pNumber;
						
						pSymbol = pNumberBase + pSymbol;
						var pRowText = s.slice(nShiftStart);		//текст от начала отступа текста
						
						pResult = shiftExistent + pSymbol + pRowText;
					}
				}
			}
		}
	}
	
	if (!pResult) pResult = s;
	return pResult;
}

function addToResult(arrOutput, vResult) {
	arrOutput[arrOutput.length] = vResult;
}


Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4890#p4890
// Description(1033): Insert line numbers to selected lines
// Description(1049): Нумерация выделенных строк
// Version: 1.2 (2016.09.18)
// Author: VladSh
// 
// Arguments:
// 	fe     - ([0]/1)  - вставлять ли в пустые строки
// 	p      - ([0]/1) - местоположение вставляемого номера: начало или конец строки
// 	syze   - длина номера (количество знаков) для расчёта лидирующих нулей; не указано либо 0 - без лидирующих нулей
// 	sep    - разделитель номера и строки:
// 	           - по умолчанию: ". ";
// 	           - <{dialog}> - возможность задания разделителя через AkelPad.InputBox()
// 	keep   - (0/[1])  - оставлять ли выделение вставленного блока текста с нумерацией
// 
// Usage:
// 	"Вставить нумерацию" Call("Scripts::Main", 1, "LineNumbersInsert.js")
// 	"Нумерация с диалогом" Call("Scripts::Main", 1, "LineNumbersInsert.js", `-sep="<{dialog}>"`)
// 	"Нумерация в конце строк" Call("Scripts::Main", 1, "LineNumbersInsert.js", `-p=1`)

if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
oCh.runWithRedraw();

function process() {
	var sSep = AkelPad.GetArgValue("sep", ". ");
	if (sSep == "<{dialog}>")
		sSep = AkelPad.InputBox(AkelPad.GetMainWnd(), WScript.ScriptName, "Insert your separator:", "");
	var bFillEmptyString = AkelPad.GetArgValue("fe", 0);
	var nPlace = AkelPad.GetArgValue("p", 0);
	var nNumSyze = AkelPad.GetArgValue("syze", 0);
	var bKeepSelection = AkelPad.GetArgValue("keep", 1);
	
	oCh.setCompleteLineText();
	
	if (oCh.Text.length) {
		
		var arrRow = oCh.Text.split(pBreak);
		
		var r = 0, n = 0;
		if (nPlace == 0) {
			if (!bFillEmptyString) {
				for (; r < arrRow.length; r++)
					if (oStr.trim(arrRow[r], " \t")) {
						arrRow[r] = pad((n+1), nNumSyze) + sSep + arrRow[r];
						n++;
					}
			}
			else {
				for (; r < arrRow.length; r++)
					arrRow[r] = pad((r+1), nNumSyze) + sSep + arrRow[r];
			}
		}
		else {
			if (!bFillEmptyString) {
				for (; r < arrRow.length; r++)
					if (oStr.trim(arrRow[r], " \t")) {
						arrRow[r] = arrRow[r] + sSep + pad((n+1), nNumSyze);
						n++;
					}
			}
			else {
				for (; r < arrRow.length; r++)
					arrRow[r] = arrRow[r] + sSep + pad((r+1), nNumSyze);
			}
		}
		
		oCh.Text = arrRow.join(pBreak);
		
		if (bKeepSelection)
			oCh.setSelCaret(oCh.rResult[0], oCh.rResult[0] + oCh.Text.length);
		else
			oCh.setSelCaret(oCh.rResult[0] + oCh.Text.length);
	}
}

function pad(num, len) {
	num = String(num);
	if (num.length >= len)
		return num;
	else {
		return (Array(len - num.length + 1).join('0') + num);
	}
}


These scripts used selCompleteLine.js.
Last edited by VladSh on Sun Sep 18, 2016 3:49 pm, edited 25 times in total.

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

Post by Instructor »

Print all MDI/PMDI documents.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=5163#p5163
// Version: 1.6
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Print all MDI/PMDI documents.
// Description(1049): Распечатать все MDI/PMDI документы.
//
// Arguments:
// -FromPage=1     -Print from first page (default is 0).
// -ToPage=4       -Print to fourth page (default is 0).
// -Copies=2       -Print two copies (default is 1).
// -Collate=false  -Collate copies (default is true).
// -AddFlags=0x0   -Additional print flags (default is 0x0). See PRINTDLG.Flags in MSDN.
// -Close=true     -Close printed document. "Print directly to the printer" must be turned on in advanced printer settings. Default is false.
//
// Usage:
// "Print all" Call("Scripts::Main", 1, "PrintAll.js")
// "Print all (only first page)" Call("Scripts::Main", 1, "PrintAll.js", `-FromPage=1 -ToPage=1`)

//Arguments
var nFromPage=AkelPad.GetArgValue("FromPage", 0);
var nToPage=AkelPad.GetArgValue("ToPage", 0);
var nCopies=AkelPad.GetArgValue("Copies", 1);
var bCollate=AkelPad.GetArgValue("Collate", true);
var dwAddFlags=AkelPad.GetArgValue("AddFlags", 0x0);
var bClose=AkelPad.GetArgValue("Close", false);

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var lpFrameInit;
var lpFrameCur;

if (hWndEdit)
{
  //Initial MDI frame
  lpFrameInit=AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
  lpFrameCur=lpFrameInit;

  for (;;)
  {
    if ((nFromPage != 0 && nToPage != 0) || nCopies > 1 || dwAddFlags)
      SetPrintSettings(nFromPage, nToPage, nCopies, bCollate, dwAddFlags);

    if (lpFrameCur == lpFrameInit)
    {
      if (!AkelPad.Command(4108 /*IDM_FILE_PRINT*/))
        break;
    }
    else
    {
      if (!AkelPad.Command(4113 /*IDM_FILE_SILENTPRINT*/))
        break;
    }

    if (bClose)
    {
      if (!AkelPad.Command(4318 /*IDM_WINDOW_FRAMECLOSE*/))
        break;
      if (AkelPad.SendMessage(hMainWnd, 1292 /*AKD_FRAMENOWINDOWS*/, 0, 0))
        break;
      lpFrameCur=0;
    }
    else
    {
      //Next MDI frame
      lpFrameCur=AkelPad.Command(4316 /*IDM_WINDOW_FRAMENEXT*/);
      if (!lpFrameCur || lpFrameCur == lpFrameInit)
        break;
    }
  }
}

function SetPrintSettings(nFromPage, nToPage, nCopies, bCollate, dwAddFlags)
{
  var lpPrintInfo;
  var dwPrintFlags;

  if (lpPrintInfo=AkelPad.MemAlloc(_X64?56:44 /*sizeof(PRINTINFO)*/))
  {
    AkelPad.SendMessage(hMainWnd, 1215 /*AKD_GETPRINTINFO*/, lpPrintInfo, 0);
    dwPrintFlags=AkelPad.MemRead(_PtrAdd(lpPrintInfo, _X64?24:12) /*offsetof(PRINTINFO, dwPrintFlags)*/, 3 /*DT_DWORD*/);
    if (nFromPage != 0 && nToPage != 0)
    {
      dwPrintFlags|=0x2 /*PD_PAGENUMS*/;
      AkelPad.MemCopy(_PtrAdd(lpPrintInfo, _X64?28:16) /*offsetof(PRINTINFO, nFromPage)*/, nFromPage, 4 /*DT_WORD*/);
      AkelPad.MemCopy(_PtrAdd(lpPrintInfo, _X64?30:18) /*offsetof(PRINTINFO, nToPage)*/, nToPage, 4 /*DT_WORD*/);
    }
    if (nCopies > 1)
    {
      AkelPad.MemCopy(_PtrAdd(lpPrintInfo, _X64?32:20) /*offsetof(PRINTINFO, nCopies)*/, nCopies, 4 /*DT_WORD*/);
      if (bCollate)
        dwPrintFlags|=0x10 /*PD_COLLATE*/;
      else
        dwPrintFlags&=~0x10 /*PD_COLLATE*/;
    }
    if (dwAddFlags)
    {
      dwPrintFlags|=dwAddFlags;
    }
    AkelPad.MemCopy(_PtrAdd(lpPrintInfo, _X64?24:12) /*offsetof(PRINTINFO, dwPrintFlags)*/, dwPrintFlags, 3 /*DT_DWORD*/);
    AkelPad.SendMessage(hMainWnd, 1216 /*AKD_SETPRINTINFO*/, lpPrintInfo, 0);
    AkelPad.MemFree(lpPrintInfo);
  }
}
Last edited by Instructor on Thu May 21, 2015 4:51 pm, edited 10 times in total.

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

Post by Instructor »

One line - one file. Open all selected files in associated programs.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=5464#p5464
// Version: 1.1
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): One line - one file. Open all selected files in associated programs.
// Description(1049): Одна строка - один файл. Открыть все выделенные файлы в ассоциированных программах.

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

if (pSelText=AkelPad.GetSelText())
{
  if (pLinesArray=pSelText.split("\r"))
  {
    for (nIndex=0; nIndex < pLinesArray.length; ++nIndex)
    {
      if (pLinesArray[nIndex])
      {
        oSys.Call("shell32::ShellExecute" + _TCHAR, hMainWnd, "open", pLinesArray[nIndex], 0, 0, 1 /*SW_SHOWNORMAL*/);
      }
    }
  }
}



Superseded with OpenSaveMask.js


Delete last character from the selected lines.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=5464#p5464
// Version: 1.1
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Delete last character from the selected lines.
// Description(1049): Удалить последний символ у выделенных строк.

var pSelText;
var pLinesArray;
var nIndex;

if (pSelText=AkelPad.GetSelText())
{
  if (pLinesArray=pSelText.split("\r"))
  {
    for (nIndex=0; nIndex < pLinesArray.length; ++nIndex)
      pLinesArray[nIndex]=pLinesArray[nIndex].substr(0, pLinesArray[nIndex].length - 1);
    pSelText=pLinesArray.join("\r");

    AkelPad.ReplaceSel(pSelText, -2);
  }
}
Last edited by Instructor on Thu Dec 18, 2014 6:13 pm, edited 9 times in total.
Post Reply