-
Notifications
You must be signed in to change notification settings - Fork 4
/
undoRedoAll.js
85 lines (71 loc) · 2.41 KB
/
undoRedoAll.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// https://akelpad.sourceforge.net/forum/viewtopic.php?p=9927#p9927
// https://infocatcher.ucoz.net/js/akelpad_scripts/undoRedoAll.js
// https://github.com/Infocatcher/AkelPad_scripts/blob/master/undoRedoAll.js
// (c) Infocatcher 2010, 2014
// Version: 0.1.1 - 2014-04-04
// Author: Infocatcher
//// Undo/redo all changes
// Arguments:
// -mode=0 - undo
// -mode=1 - redo
// -stopOnSaved
// Usage:
// Call("Scripts::Main", 1, "undoRedoAll.js", "-mode=0 -stopOnSaved=true")
var AEM_CANUNDO = 3075;
var AEM_CANREDO = 3076;
var AEM_UNDO = 3077;
var AEM_REDO = 3078;
var MODE_UNDO = 0;
var MODE_REDO = 1;
// Read arguments:
var mode = AkelPad.GetArgValue("mode", MODE_UNDO);
var stopOnSaved = AkelPad.GetArgValue("stopOnSaved", false);
var CAN_ACTION = AEM_CANUNDO;
var ACTION = AEM_UNDO;
if(mode == MODE_REDO) {
CAN_ACTION = AEM_CANREDO;
ACTION = AEM_REDO;
}
var hWndEdit = AkelPad.GetEditWnd();
var oSys = AkelPad.SystemFunction();
if(
AkelPad.GetMainWnd()
&& AkelPad.IsAkelEdit()
&& canAction()
) {
var nFirstLine = saveLineScroll(hWndEdit);
do action();
while(canAction());
restoreLineScroll(hWndEdit, nFirstLine);
}
function canAction() {
return (stopOnSaved ? AkelPad.SendMessage(hWndEdit, 3086 /*AEM_GETMODIFY*/, 0, 0) : true)
&& AkelPad.SendMessage(hWndEdit, CAN_ACTION, 0, 0);
}
function action() {
AkelPad.SendMessage(hWndEdit, ACTION, 0, 0);
}
// From Instructor's SearchReplace.js
function saveLineScroll(hWnd)
{
AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, false, 0);
return AkelPad.SendMessage(hWnd, 3129 /*AEM_GETLINENUMBER*/, 4 /*AEGL_FIRSTVISIBLELINE*/, 0);
}
function restoreLineScroll(hWnd, nBeforeLine)
{
if (AkelPad.SendMessage(hWnd, 3129 /*AEM_GETLINENUMBER*/, 4 /*AEGL_FIRSTVISIBLELINE*/, 0) != nBeforeLine)
{
var lpScrollPos;
var nPosY=AkelPad.SendMessage(hWnd, 3198 /*AEM_VPOSFROMLINE*/, 0 /*AECT_GLOBAL*/, nBeforeLine);
if (lpScrollPos=AkelPad.MemAlloc(_X64?16:8 /*sizeof(POINT64)*/))
{
AkelPad.MemCopy(_PtrAdd(lpScrollPos, 0) /*offsetof(POINT64, x)*/, -1, 2 /*DT_QWORD*/);
AkelPad.MemCopy(_PtrAdd(lpScrollPos, _X64?8:4) /*offsetof(POINT64, y)*/, nPosY, 2 /*DT_QWORD*/);
AkelPad.SendMessage(hWnd, 3180 /*AEM_SETSCROLLPOS*/, 0, lpScrollPos);
AkelPad.MemFree(lpScrollPos);
}
}
AkelPad.SendMessage(hWnd, 3377 /*AEM_UPDATECARET*/, 0, 0);
AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, true, 0);
oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}