Unlimited Undos For Text Fields |
|
This script can be placed in a stack script and will act on all (editable) fields.
Drag-dropping text from one field to the other is supported.
It is functional and tested on OS X. But for the other platforms I don't know yet.
global gHistory local lSC,lData on rawkeydown x writeHistory x pass rawkeydown end rawkeydown on dragstart put the selectedchunk into lSC pass dragstart end dragstart on dragend put the dragData["text"] into lData send "checkdragdata" to me in 20 millisecs pass dragend end dragend on checkdragdata put the selectedchunk into tSC get word -2 to -1 of lSC put word 1 to 7 of the long id of it into tFNameOrig get word -2 to -1 of tSC put word 1 to 7 of the long id of it into tFNameDest if tFNameOrig = tFNameDest and not (word 2 of tSC > word 4 of tSC) then put "d",lSC,tSC,hexadize(lData) & cr after gHistory[tFNameDest] else if tFNameOrig <> tFNameDest then delete word 3 to 4 of lSC put "x",lSC,hexadize(lData) & cr after gHistory[tFNameOrig] put "v",tSC,hexadize(lData) & cr after gHistory[tFNameDest] end if put "" into lSC put "" into lData end checkdragdata ### first item indicates the action ### w = write ### v = paste ### x = cut ### b = backspace ### d = dragplaced on writeHistory x put the selectedchunk into tSC get word -2 to -1 of tSC put word 1 to 7 of the long id of it into tFName if the commandkey is down then switch x case "122" ### z reverseHistory break case "118" ### v put clipboardData["text"] into x put "v",tSC,hexadize(x) & cr after gHistory[tFName] break case "120" ### x put the value of tSC into x if x <> "" then delete word 3 to 4 of tSC put "x",tSC,hexadize(x) & cr after gHistory[tFName] end if break end switch else switch x case "65421" ### enter in field case "65307" ### escape key case "65308" ### scrollwheel up and down case "65309" case "65361" ### arrowkeys case "65363" case "65362" case "65364" -- do nothing break case "65288" ### backspace if word 4 of tSC <> 0 then if word 2 of tSC < word 4 of tSC then get the value of tSC delete word 3 to 4 of tsC else if word 2 of tSC > word 4 of tSC then delete word 2 to 3 of tSC get the value of tsC end if put hexadize(it) into x put "b",tSC,x & cr after gHistory[tFName] ## b = backspace end if break case "65293" ### return in field delete word 3 to 4 of tSC put "w",tSC,hexadize(return) & cr after gHistory[tFName] break default delete word 3 to 4 of tSC put "w",tSC,hexadize(numtochar(x)) & cr after gHistory[tFName] break end switch end if end writeHistory on reverseHistory put word 1 to 7 of the the focusedobject into tFName if gHistory[tFName] = "" then beep exit reverseHistory end if get line -1 of gHistory[tFName] delete line - 1 of gHistory[tFName] switch item 1 of it case "b" put dehexadize(last item of it) into x if x = return then put "cr" into x else if x = space then put "space" into x else if x = tab then put "tab" into x else replace quote with quote & ""e&" & quote in x replace cr with quote&"&cr&"& quote in x put quote & x & quote into x end if do "put" && x && "before" && item 2 of it break case "w" do "delete" && item 2 of it break case "v" put dehexadize(last item of it) into x put the num of chars in x into y put word 2 of item 2 of it + y - 1 into word 4 of item 2 of it do " delete" && item 2 of it break case "x" put dehexadize(last item of it) into x if x = return then put "cr" into x else if x = space then put "space" into x else if x = tab then put "tab" into x else replace quote with quote & ""e&" & quote in x replace cr with quote&"&cr&"& quote in x put quote & x & quote into x end if do " put" && x && "before" && item 2 of it break case "d" put dehexadize(last item of it) into x if last char of x = cr then add 1 to word 4 of item 3 of it if the num of lines in x > 1 then delete last char of x if x = return then put "cr" into x else if x = space then put "space" into x else if x = tab then put "tab" into x else replace quote with quote & ""e&" & quote in x replace cr with quote&"&cr&"& quote in x put quote & x & quote into x end if do "delete" && item 3 of it delete word 3 to 4 of item 2 of it do " put" && x && "before" && item 2 of it break end switch end reverseHistory ### Big Endian BinaryDecode ### function hexadize sx get binarydecode("H*", sx, x1) return x1 end hexadize ### Big Endian Binary Encode ### function deHexadize sx replace space with "" in sx try get binaryEncode("H*", sx, x1) catch errornum put "no hex value" into it finally return it end try end deHexadize ################### ## for test purposes ## ################### on emptyHistory delete global gHistory end emptyHistory on putHistory put word 1 to 7 of the the focusedobject into tFName if the optionkey is down then put the keys of gHistory else put gHistory[tFName] end putHistory
Posted 2/24/2005 by Wouter Abraham to the Use Revolution List