-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathundoableReopen.js
More file actions
56 lines (49 loc) · 2.03 KB
/
undoableReopen.js
File metadata and controls
56 lines (49 loc) · 2.03 KB
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
// https://github.com/Infocatcher/AkelPad_scripts/blob/master/undoableReopen.js
// (c) Infocatcher 2012, 2014
// Version: 0.1.0pre3 - 2014-04-18
// Author: Infocatcher
//// Reopen file and preserve undo/redo buffer (just replace all text, if it was changed)
var hMainWnd = AkelPad.GetMainWnd();
var oSys = AkelPad.SystemFunction();
var hWndEdit = AkelPad.GetEditWnd();
if(hMainWnd && hWndEdit)
undoableReopen();
function undoableReopen() {
var file = AkelPad.GetEditFile(0);
if(!file)
return;
var text = AkelPad.ReadFile(file, 0, AkelPad.GetEditCodePage(0), AkelPad.GetEditBOM(0));
if(text == AkelPad.GetTextRange(0, -1, 4 - AkelPad.GetEditNewLine(0))) {
AkelPad.SendMessage(hMainWnd, 1229 /*AKD_SETMODIFY*/, hWndEdit, false);
return;
}
// Based on code from built-in RenameFile.js
var lpPoint64 = AkelPad.MemAlloc(_X64 ? 16 : 8 /*sizeof(POINT64)*/);
if(!lpPoint64)
return;
function cleanup() {
AkelPad.MemFree(lpPoint64);
lpSel && AkelPad.MemFree(lpSel);
lpCaret && AkelPad.MemFree(lpCaret);
}
var lpSel = AkelPad.MemAlloc(_X64 ? 56 : 32 /*sizeof(AESELECTION)*/);
if(!lpSel)
return cleanup();
var lpCaret = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
if(!lpCaret)
return cleanup();
AkelPad.SendMessage(hWndEdit, 3179 /*AEM_GETSCROLLPOS*/, 0, lpPoint64);
AkelPad.SendMessage(hWndEdit, 3125 /*AEM_GETSEL*/, lpCaret, lpSel);
AkelPad.SendMessage(hWndEdit, 11 /*WM_SETREDRAW*/, false, 0);
AkelPad.SetSel(0, -1);
AkelPad.ReplaceSel(text);
AkelPad.SendMessage(hMainWnd, 1229 /*AKD_SETMODIFY*/, hWndEdit, false);
AkelPad.SendMessage(hWndEdit, 11 /*WM_SETREDRAW*/, true, 0);
oSys.Call("user32::InvalidateRect", hWndEdit, 0, true);
var lpOffset = _PtrAdd(lpSel, _X64 ? 48 : 24 /*AESELECTION.dwFlags*/);
var dwFlags = AkelPad.MemRead(lpOffset, 3 /*DT_DWORD*/);
AkelPad.MemCopy(lpOffset, dwFlags | 0x808 /*AESELT_LOCKSCROLL|AESELT_INDEXUPDATE*/, 3 /*DT_DWORD*/);
AkelPad.SendMessage(hWndEdit, 3126 /*AEM_SETSEL*/, lpCaret, lpSel);
AkelPad.SendMessage(hWndEdit, 3180 /*AEM_SETSCROLLPOS*/, 0, lpPoint64);
cleanup();
}