Skip to content

Instantly share code, notes, and snippets.

@maestrith
Created July 19, 2013 15:32
Show Gist options
  • Save maestrith/6040046 to your computer and use it in GitHub Desktop.
Save maestrith/6040046 to your computer and use it in GitHub Desktop.
Posted using AHK Studio
#SingleInstance,Force
v:=[],OnMessage(0x4E,"notify"),OnMessage(0x5,"arrange"),vversion:=new xml("version","lib\version.xml")
startup(),filecheck(),v.lastlist:=[],misc:=new xml("misc")
settings:=new xml("settings","lib\settings.xml"),keywords(),files:=new xml("files"),positions:=new xml("positions","lib\positions.xml"),access_token:=settings.ssn("//@access_token").text
idea:=new xml("idea","lib\ideas.xml")
global v,sci,settings,commands,files,positions,vversion,access_token,misc,idea
menu(),defaults(),gui(),hotkeys(),titlechange()
ControlFocus,Scintilla1,% aid()
if settings.ssn("//ideas").text{
ideas()
WinActivate,% aid()
}
;setup(20) <---next available
OnExit,exit
return
t(x*){
for a,b in x
list.=b "`n"
ToolTip,%list%
}
m(x*){
for a,b in x
list.=b "`n"
MsgBox,% list
}
Msgbox_Creator(){
static
msgbox:=setup(17)
Gui,Add,Text,Section hwndheight,Title:
h:=cgp(height).h*1.25
Gui,Add,Edit,w320
Gui,Add,Text,,Text:
Gui,Add,Edit,w320 hwndedit
pos:=cgp(edit)
Gui,Add,GroupBox,% "x" pos.x " y" pos.y+pos.h+10 " w320 R8 hwndgb Section",Buttons and Icons
Gui,Add,Radio,xs+10 ys+%h% Checked,OK
list=OK/Cancel,Abort/Retry/Ignore,Yes/No/Cancel,Yes/No,Retry/Cancel,Cancel/Try Again/Continue
Loop,Parse,list,`,
Gui,Add,Radio,hwndlast,%A_LoopField%
Gui,Add,Checkbox,,Help
pos:=cgp(last),nx:=pos.x+pos.w+20
for a,b in [4,3,2,5]
if A_Index=1
Gui,Add,Picture,x%nx% ys+%h% Icon4 Section,%A_WinDir%\system32\user32.dll
else
Gui,Add,Picture,Icon%b% ,%A_WinDir%\system32\user32.dll
color:=RGB(settings.ssn("//font[@style='5']/@background").text)
Gui,Color,%color%,%color%
Gui,Add,Radio,y+10 Checked vicon1,No Icon
Gui,Add,Radio,ys+8 xs+40 section vicon2
Gui,Add,Radio,ys+40 section xs vicon3
Gui,Add,Radio,ys+40 section xs vicon4
Gui,Add,Radio,ys+40 xs vicon5
Gui,Add,GroupBox,ym x340 R4 Section hwndgb1,Modal
Gui,Add,Radio,xs+10 ys+%h% Checked,Normal
Gui,Add,Radio,,Task Modal
Gui,Add,Radio,,Always On Top
Gui,Add,Radio,,System Modal
pos:=cgp(gb1)
Gui,Add,GroupBox,% "x" pos.x " y" pos.y+pos.h " R1 hwndgb2 Section",Default Button
Gui,Add,Radio,xs+10 ys+%h% Checked,1st
Gui,Add,Radio,x+10,2nd
Gui,Add,Radio,x+10,3rd
pos:=cgp(gb2)
Gui,Add,GroupBox,% "x" pos.x " y" pos.y+pos.h " R1 hwndgb3 Section",Alignment
Gui,Add,Checkbox,xs+10 ys+%h%,Right
Gui,Add,Checkbox,x+10,Reverse
pos:=cgp(gb3)
Gui,Add,GroupBox,% "x" pos.x " y" pos.y+pos.h " R3 hwndgb4 Section",Timeout and Insert
Gui,Add,Text,xs+10 ys+%h% Section,Timeout:
Gui,Add,Edit,w50 x+5 number
Gui,Add,Button,x+5 hwndthird gmbcopy,Copy
Gui,Add,Button,xs gmbtest Default,Test
Gui,Add,Button,x+5 gmbinsert,Insert
Gui,Add,Button,x+5 gmbreset,Reset
pos:=cgp(third),pos1:=cgp(gb1),w:=pos.x+pos.w+10-pos1.x
Loop,4
{
con:=gb%A_Index%
ControlMove,,,,%w%,,ahk_id%con%
}
Gui,Show,AutoSize,Msgbox Creator
return
mbcopy:
Clipboard:=compilebox(msgbox)
MsgBox,0,Complete,Text coppied to the clipboard,.5
return
mbreset:
Loop,3
ControlSetText,Edit%A_Index%,,% aid(msgbox)
for a,b in {2:1,10:1,16:1,21:1,9:0,25:0,26:0}
GuiControl,17:,Button%a%,%b%
return
mbinsert:
v.sc.2003(v.sc.2008,compilebox(msgbox))
return
17GuiEscape:
17GuiClose:
Destroy(17)
return
mbtest:
dynarun(compilebox(msgbox))
return
}
compilebox(win){
static list:={2:0,3:1,4:2,5:3,6:4,7:5,8:6,9:16384,11:16,12:32,13:48
,14:64,17:8192,18:262144,19:4096,22:256,23:512,25:524288,26:1048576}
total=0
for a,b in ["Edit1","Edit2","Edit3"]
ControlGetText,edit%a%,Edit%a%,% aid(win)
for a,b in list{
ControlGet,value,Checked,,Button%a%
if value
total+=b
}
edit1:=edit1?edit1:"Testing"
msg=MsgBox,%total%,%edit1%,%edit2%
msg.=edit3?"," edit3:""
return msg
}
cgp(Control){
SysGet,Border,7
SysGet,Caption,4
pos:=[]
ControlGetPos,x,y,w,h,,ahk_id%control%
return pos:={x:x-border,y:y-Border-Caption,w:w,h:h}
}
notify(wp,info,c,d){
Critical
foo:=NumGet(info,8,UInt)
if v.fix
return
sc:=v.sc
if sc.sc!=NumGet(info+0)
return
static last
fn:=[]
;,2:"id",4:"position",5:"ch",6:"modifiers",7:"modType",8:"text",9:"length",10:"linesAdded",11:"macMessage",12:"macwParam",13:"maclParam",14:"line",15:"foldLevelNow",16:"foldLevelPrev",17:"margin",18:"listType",19:"x",20:"y",21:"token",22:"annotLinesAdded",23:"updated"}
for a,b in {0:"Obj",2:"Code",4:"ch",7:"text",6:"modType",9:"linesadded",3:"position"}
fn[b]:=NumGet(Info+(A_PtrSize*a))
cp:=sc.2008
if (fn.code=2019){
v.lastmod:=NumGet(info+20)
}
if (fn.code=2008){
if fn.modtype&0x20
return
if fn.modtype&0x02&&fn.linesadded
SetTimer,fix_indent,1
if ((fn.modtype&0x01)||(fn.modtype&0x02))
update({file:ssn(current(),"@file").text,sc:sc})
}
if (fn.code=2022){
v.word:=StrGet(fn.text,cp0)
settimer,automenu,20
return
}
if (fn.code=2027){
font()
return
}
if (fn.code=2001){
c:=fn.ch
if c=13
return
sc.2078
if c in 10,123,125
fix_indent(sc,1)
if (v.options.auto_indent!=1&&c=10){
line:=sc.2166(cp)-1
indent:=sc.2127(line)
sc.2126(line+1,indent)
}
if (c=10){
start:=sc.2128(sc.2166(sc.2008))
sc.2160(start,start)
}
word:=sc.textrange(sc.2266(cp-1,1),sc.2267(cp-1,1))
li:=""
if (StrLen(word)>1&&sc.2102=0){
ll:=v.keywords[SubStr(word,1,1)]
Loop,Parse,ll,%a_space%
if RegExMatch(A_LoopField,"Ai)" word)
li.=A_LoopField " "
if li
sc.2100(StrLen(word),Trim(li))
}
;here add an option to add more than just a "," to the list "(" is automatic
lll=44,32
if c in %lll%
replace()
sc.2079
SetTimer,ss,1
}
if (fn.code=2007){
if (v.options.show_selected_duplicates){
if (cp!=sc.2009)
highlt(sc.getseltext())
else
sc.2505(0,sc.2006)
}
text:="Line:" sc.2166(sc.2008)+1 " Column:" sc.2129(sc.2008)
width:=sc.2276(32,"a")
SB_SetText(text)
SB_SetParts(width*StrLen(text "1"),last)
first:=width*StrLen(text "1")
}
if (fn.code=2001){
width:=sc.2276(32,"a")
text1:="Last Entered Character: " Chr(fn.ch) " Code:" fn.ch
SB_SetText(text1,2),SB_SetParts(first,width*StrLen(text1 1),40)
last:=width*StrLen(text1 1)
}
if (fn.code=2010){
margin:=NumGet(info+64)
scpos:=NumGet(info+12)
modifier:=NumGet(info+20)
if margin=2
sc.2231(sc.2166(scpos))
if (margin=0)
margincolor(modifier)
}
marginwidth()
return
fix_indent:
SetTimer,fix_indent,Off
if v.fix
return
fix_indent(v.sc)
return
}
automenu(){
automenu:
SetTimer,automenu,Off
if v.word
if (l:=commands.ssn("//Context/*/*[text()='" RegExReplace(v.word,"#") "']/@list").text){
sc:=v.sc,cp:=sc.2008
if sc.2007(cp-1)!=44
sc.2003(cp,","),add=1
sc.2160(cp+add,cp+add)
sc.2100(0,l)
v.word:=""
}
return
}
highlt(find){
sc:=v.sc
sc.2500(1),sc.2504(1,1),sc.2505(0,sc.2006)
sc.2080(1,8)
create:=1
sc.2523(1,110)
;sc.2082(1,settings.ssn("//fonts/font[@code='2082']/"))
sc.2500(1),out:=sc.gettext(),found:=1,findreg:="\Q" find "\E"
case:="i"
while found:=RegExMatch(out,"O" case ")" findreg,fo,found){
if sel.sel
if (found+fo.len()-1>sel.oe)
break
sc.2504(fo.pos()-1,strlen(find)),found+=fo.len()
if !fo.len()
break
count:=A_Index
}
if count=1
sc.2500(1),sc.2504(1,0),sc.2505(0,sc.2006),dupsel:=0
}
Dlg_Color(Color,hwnd){
static
if !cc{
VarSetCapacity(cccc,16*A_PtrSize,0),cc:=1,size:=VarSetCapacity(CHOOSECOLOR,9*A_PtrSize,0)
Loop,16{
IniRead,col,color.ini,color,%A_Index%,0
NumPut(col,cccc,(A_Index-1)*4,"UInt")
}
}
NumPut(size,CHOOSECOLOR,0,"UInt"),NumPut(hwnd,CHOOSECOLOR,A_PtrSize,"UPtr")
,NumPut(Color,CHOOSECOLOR,3*A_PtrSize,"UInt"),NumPut(3,CHOOSECOLOR,5*A_PtrSize,"UInt")
,NumPut(&cccc,CHOOSECOLOR,4*A_PtrSize,"UPtr")
ret:=DllCall("comdlg32\ChooseColorW","UPtr",&CHOOSECOLOR,"UInt")
if !ret
exit
Loop,16
IniWrite,% NumGet(cccc,(A_Index-1)*4,"UInt"),color.ini,color,%A_Index%
IniWrite,% Color:=NumGet(CHOOSECOLOR,3*A_PtrSize,"UInt"),color.ini,default,color
return Color
}
rgb(c){
setformat,IntegerFast,H
c:=(c&255)<<16 | (c&65280) | (c>>16),c:=SubStr(c,1)
SetFormat, integerfast,D
return c
}
color(con){
list:={Font:2056,Size:2055,Color:2051,Background:2052,Bold:2053,Italic:2054,Underline:2059}
nodes:=settings.sn("//fonts/*")
while,n:=nodes.item(A_Index-1){
ea:=settings.easyatt(n)
if (ea.style=33)
con.2290(1,ea.Background),con.2291(1,ea.Background)
ea.style:=ea.style=5?32:ea.style
for a,b in ea{
if list[a]
con[list[a]](ea.style,b)
else if ea.code&&ea.bool!=1
con[ea.code](ea.color,0)
else if ea.code&&ea.bool
con[ea.code](ea.bool,ea.color)
if ea.style=32
con.2050
}
}
for a,b in [[2040,25,13],[2040,26,15],[2040,27,11],[2040,28,10],[2040,29,9],[2040,30,12],[2040,31,14],[2244,2,0xFE000000],[2242,0,0],[2242,2,13],[2460,3],[2462,1],[2134,1],[2260,1],[2246,2,1],[2115,1],[2242,1,0]]
con[b.1](b.2,b.3)
if !settings.ssn("//*[@style='37']")
con.2051(37,0xff00ff)
con.2132(1)
con.2242(2,13),con.2077(0,"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ#_")
con.2115(1),con.2036(5)
con.2056(38,"Tahoma"),con.2212,con.2371,con.4006(0,"asm")
Loop,3
con.4005(A_Index,RegExReplace(v.keywords[A_Index],"#"))
ll:=settings.sn("//fonts/highlight/*")
while,l:=ll.item(A_Index-1)
con.4005(ssn(l,"@list").text+3,l.text)
con.2470(80)
if !settings.ssn("//*[@style='0']")
con.2051(0,0xffffff)
;if !settings.ssn("//*[@code='2098']")
}
arrange(a="",b="",c="",d=""){
win:=A_Gui||a=1?v.main:d
win:=d?d:win
VarSetCapacity(size,16,0),DllCall("user32\GetClientRect","uint",win,"uint",&size),w:=NumGet(size,8),h:=NumGet(size,12)
if (A_Gui=1||a=1){
count:=v.control.maxindex(),cew:=settings.ssn("//code_explorer").text,cew:=cew?cew:100
few:=settings.ssn("//file_explorer").text,few:=few?few:220
each:=(w-few-cew)/count
GuiControl,1:move,SysTreeView321,% "h" h-40 " w" few
few+=20
for a,b in v.control
GuiControl,1:move,Scintilla%a%,% "w" each " x" ((A_Index-1)*each)+few " h" h-40
GuiControl,1:Move,SysTreeView322,% "h" h-40 " x" (count*each)+few+10 " w" cew-40
}
else if v.window[A_Gui]
for a,b in v.window[A_Gui]{
list:=""
for c,d in b{
if c=w
list.=c w-d " "
if c=h
list.=c h-d " "
if c=x
list.=c w-d " "
if c=y
list.=c h-d " "
}
Gui,%a_gui%:show
GuiControl,%A_Gui%:movedraw,%a%,% list
}
}
exit(){
exit:
GuiClose:
savegui(),getpos()
t("Saving Settings")
for a,b in xml.keep{
if a in files,commands,scintilla,misc,foundinfo,explore
continue
b.Transform(),b.save()
}
ToolTip
ExitApp
return
}
savegui(){
rem:=settings.remove("//last")
for a,b in v.lastlist
settings.add({path:"last/file",text:b,dup:1})
open:=files.sn("//main/@file")
while,filename:=open.item(A_Index-1).text
settings.unique({path:"open/file",text:filename})
WinGet,max,MinMax,% aid()
if max
settings.add({path:"gui/position",att:{window:1,number:v.control.MaxIndex(),max:max}})
else
settings.add({path:"gui/position",att:{window:1,number:v.control.MaxIndex(),max:max},text:winpos(v.main)})
}
Add:
sc:=new s
arrange(1),marginwidth(sc)
return
class xml{
keep:=[]
__New(param*){
root:=param.1,file:=param.2
file:=file?file:root ".xml"
temp:=ComObjCreate("MSXML2.DOMDocument"),temp.setProperty("SelectionLanguage","XPath")
this.xml:=temp
ifexist %file%
temp.load(file),this.xml:=temp
else
this.xml:=this.CreateElement(temp,root)
this.file:=file
xml.keep[root]:=this
}
CreateElement(doc,root){
return doc.AppendChild(this.xml.CreateElement(root)).parentnode
}
unique(info){
if (info.check&&info.text)
return
if info.under{
if info.check
find:=ssn(info.under,"*[@" info.check "='" info.att[info.check] "']")
if info.Text
find:=ssn(info.under,"*[text()='" info.text "']")
if !find
find:=this.under({under:info.under,att:info.att,node:info.path})
for a,b in info.att
find.SetAttribute(a,b)
}
else
{
if info.check
find:=this.ssn("//" info.path "[@" info.check "='" info.att[info.check] "']")
else if info.text
find:=this.ssn("//" info.path "[text()='" info.text "']")
if !find
find:=this.add({path:info.path,att:info.att,dup:1})
for a,b in info.att
find.SetAttribute(a,b)
}
if info.text
find.text:=info.text
return find
;can have EITHER info.check or info.text, not both
}
add(info){
path:=info.path,p:="/",dup:=this.ssn("//" path)?1:0
if next:=this.ssn("//" path)?this.ssn("//" path):this.ssn("//*")
Loop,Parse,path,/
last:=A_LoopField,p.="/" last,next:=this.ssn(p)?this.ssn(p):next.appendchild(this.xml.CreateElement(last))
if (info.dup&&dup)
next:=next.parentnode.appendchild(this.xml.CreateElement(last))
for a,b in info.att
next.SetAttribute(a,b)
if info.text!=""
next.text:=info.text
return next
}
find(info){
if info.att.1&&info.text
return m("You can only search by either the attribut or the text, not both")
search:=info.path?"//" info.path:"//*"
for a,b in info.att
search.="[@" a "='" b "']"
if info.text
search.="[text()='" info.text "']"
current:=this.ssn(search)
return current
}
under(info){
new:=info.under.appendchild(this.xml.createelement(info.node))
for a,b in info.att
new.SetAttribute(a,b)
new.text:=info.text
return new
}
ssn(node){
return this.xml.SelectSingleNode(node)
}
sn(node){
return this.xml.SelectNodes(node)
}
__Get(x=""){
return this.xml.xml
}
transform(){
static
if !IsObject(xsl){
xsl:=ComObjCreate("MSXML2.DOMDocument")
style=
(
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<xsl:for-each select="@*">
<xsl:text></xsl:text>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
)
xsl.loadXML(style),style:=null
}
this.xml.transformNodeToObject(xsl,this.xml)
}
save(x*){
if x.1=1
this.Transform()
filename:=this.file?this.file:x.1.1
file:=fileopen(filename,"rw")
file.seek(0)
file.write(this.xml.xml)
file.length(file.position)
}
remove(rem){
if !IsObject(rem)
rem:=this.ssn(rem)
rem.ParentNode.RemoveChild(rem)
}
ea(path){
list:=[]
nodes:=this.sn(path "/@*")
while,n:=nodes.item(A_Index-1)
list[n.nodename]:=n.text
return list
}
easyatt(path){
list:=[]
if nodes:=path.nodename
nodes:=path.SelectNodes("@*")
else if path.text
nodes:=this.sn("//*[text()='" path.text "']/@*")
else
for a,b in path
nodes:=this.sn("//*[@" a "='" b "']/@*")
while,n:=nodes.item(A_Index-1)
list[n.nodename]:=n.text
return list
}
}
ssn(node,path){
return node.SelectSingleNode(path)
}
sn(node,path){
return node.SelectNodes(path)
}
aid(hwnd=""){
hwnd:=hwnd?hwnd:v.main
return "ahk_id" hwnd
}
menu(){
SplitPath,A_AhkPath,,apdir
x64:=FileExist(apdir "\AutoHotkeyU64.exe")?{"Run x6&4":"!4"}:""
menu:=["File","Edit","Window","Options","Tools","Special_Functions","About"]
File:=[{"&New Project":"^N"},{"N&ew Segment":"^G"},{"Remove Curren&t Segment":""}
,{sep:1},{"Co&mpile":"!M"},{"&Upload":"!^U"},{"Check For New &Version":"!^V"}
,{sep:1},{"&Open":"^O"},{"Open In New &Window":"!^O"},{"&Close":"!^C"},{"&Save":"^S"},{"Open Fol&der":"^D"},{"S&how File":""},{"&Run":"^R"},{"Run Se&lected Text":""},{Export:""},x64
,{sep:1},{"Full Backup":"^F1"},{"Clean Position Data":"!P"}
,{sep:1},{"&Publish":"!^P"}
,{"E&xit":"!^X"}]
Edit:=[{"The&me":"^M"},{"&Settings":"F8"},{"Edit Version Info":""}
,{sep:1},{"Und&o":"^Z"},{"&Copy":"^C"},{"Cu&t":"^X"},{"Past&e":"^V"},{"&Restore Current File":""}
,{sep:1},{"&Find":"^F"},{"&Quick Find":"!Q"}
,{sep:1},{"Insert F&unction":"!U"},{"Fi&x Indent":"!X"}
,{sep:1},{"Jump to Segment":"!J"},{"Jump to Script":"!S"}
,{sep:1},{"Ed&it Replacements":"!^I"},{"&Google Search Selected":"!G"},{"Custom &Highlight Text":"!^H"}]
Window:=[{"Personal Variable List":"F4"},{"Refresh Code Explorer":""},{Ideas:""},{Widths:""}]
Options:=[{"Auto Indent":""},{"Virtual Space":""},{"Line Highlight":""},{"Show End Of Line":""}
,{"Show Selected Duplicates":""},{"Word Wrap":""}]
Tools:=[{"Post All In One Gist":"^H","Post Multiple Segment Gist":"!^M"},{"Gist Post Version":""},{"Msgbox Creator":""}]
about:=[{About:""},{Help:""}]
special_functions:=[{"Linked Scroll Down":"^Down"},{"Linked Scroll Up":"^Up"}
,{sep:1},{"Move Selected Lines Down":"+^Down"},{"Move Selected Lines Up":"+^Up"},{"Duplicate Line":"F3"}
,{sep:1},{"Toggle Comment Line":"^J"},{"Create Comment Block":"+F1"},{"Ch&aracter Count":"!+C"}
,{sep:1},{"&Remove Spaces From Selected":"!^R"}
,{sep:1},{"Scintilla Code Lookup":"F6"},{"Show Scintilla Code in Line":"F5"}]
v.menu:=menu
for a,b in ["File","Edit","Window","Options","Tools","Special_Functions","About"]
v.menu[b]:=%b%
;^N,^S,^D,^R,^X,^Z,^U,^O,^M,^J,^G,^F,^C,^H
;!S,!X,!U,!J,!Q,!P,!M,!G,
;!^U,!^X,!^O,!^I,!^V,!^M,!^H
;!^P,!^C,!+C,!^R
;F6,F5,+F1,F8,^F1,F3,F4
;^+A,^Up/Down
Gui,1:Default
for a,b in menu{
for c,d in %b%
for e,f in d{
if (e="sep"){
menu,%b%,Add
continue
}
f:=settings.ssn("//hotkeys/" clean(e)).text?settings.ssn("//hotkeys/" clean(e)).text:f
item:=f="null"?e:e "`t" change(f)
b:=RegExReplace(b,"_"," ")
Menu,%b%,Add,%item%,total
if (b="options"&&option:=settings.ssn("//options/" clean(e)).text)
Menu,%b%,ToggleCheck,%item%
}
if !IsObject(b)
Menu,Main,Add,%b%,:%b%
}
code_vault(1)
Gui,Menu,main
return
total:
r:=clean(A_ThisMenuItem)
if !(A_ThisMenu="options")
return %r%()
options(r)
return
}
change(key){
for a,b in [{Shift:"+"},{Ctrl:"^"},{Alt:"!"}]
for c,d in b
key:=RegExReplace(key,"\" d,c "+")
return key
}
run(){
sc:=v.sc
getpos(),save()
file:=ssn(current(1),"@file").text
SplitPath,file,filename,dir
run,%filename%,%dir%
}
save(){
sc:=v.sc,udf:=update({get:1})
t("Saving Files")
for Filename in update:=update({up:1}){
text:=udf[filename]
main:=files.ssn("//file[@file='" filename "']../@file").text
SplitPath,main,,dir
splitpath,filename,file
backup:=dir "\backup\" A_Now
FileCreateDir,%backup%
if files.ssn("//main[@file='" filename "']")
text.=compile_main(filename)
IfExist,%filename%
FileMove,%filename%,%backup%\%file%
FileAppend,%text%,%filename%
}
t()
update({clear:1})
}
compile_main(filename){
fn:=files.sn("//*[@file='" filename "']/*")
while,f:=fn.item(A_Index-1)
text.="`r`n" ssn(f,"@code").text
return text
}
clean(x,y=""){
if !y
rep:=RegExReplace(RegExReplace(RegExReplace(x,"&")," ","_"),"\t.*")
else
rep:=RegExReplace(RegExReplace(RegExReplace(x,"&"),"_"," "),"\t.*")
return rep
}
hotkeys(){
Hotkey,IfWinActive,% aid()
for a,b in v.menu
for c,d in b
for e,f in d{
if e=sep
continue
if !key:=settings.ssn("//hotkeys/" clean(e)).text
key:=f,settings.Add({path:"hotkeys/" clean(e),text:f})
key:=key?key:"null"
if key!=null
Hotkey,%key%,hotkey,On
}
brace:=["[","{","(",Chr(34)]
for a,b in brace
Hotkey,%b%,brace,On
Hotkey,^v,paste,On
return
hotkey:
key:=settings.ssn("//hotkeys/*[text()='" A_ThisHotkey "']").nodename,%key%()
return
brace:
sc:=v.sc ;,sc.2078
brace:={"[":"]","{":"}","(":")",Chr(34):Chr(34)},cp:=sc.2008,line:=sc.2166(cp),min:=mm(sc)
if (A_ThisHotkey="{"&&sc.2128(line)=cp&&cp=sc.2136(line)){
sc.2003(cp,"{`r`n`r`n}")
fix_indent(sc,1)
Send,{Down}
sc.2314
}
else
sc.2003(min.min,A_ThisHotkey),sc.2003(min.max+1,brace[A_ThisHotkey]),sc.2160(min.min+1,min.min+1)
;sc.2079
replace()
return
}
mm(sc){
min:=[]
min[sc.2008]:=1,min[sc.2009]:=1
min.min:=min.MinIndex(),min.max:=min.MaxIndex()
return min
}
class s{
static ctrl:=[],lc:=""
__New(window="",pos=""){
win:=window?window:1
static count=1
pos:=count=1?"x+0":"x+0"
pos:=window?"x0 y0":pos
Gui,%win%:Add,custom,classScintilla hwndsc w500 h400 %pos% +1387331584
this.sc:=sc,s.ctrl[sc]:=this,t:=[]
for a,b in {fn:2184,ptr:2185}
this[a]:=DllCall("SendMessageA","UInt",sc,"int",b,int,0,int,0)
controllist(),arrange(),color(this)
v.focus:=sc
for a,b in [[2563,1],[2565,1],[2614,1],[2402,0x15,75]]{
b.2:=b.2?b.2:0,b.3:=b.3?b.3:0
this[b.1](b.2,b.3)
}
return this
}
__Delete(){
m("should not happen")
}
__Get(x*){
return DllCall(this.fn,"Ptr",this.ptr,"UInt",x.1,int,0,int,0,"Cdecl")
}
__Call(code,lparam=0,wparam=0){
if (code="getseltext"){
VarSetCapacity(text,this.2161),length:=this.2161(0,&text)
return StrGet(&text,length,"cp0")
}
if (code="textrange"){
VarSetCapacity(text,abs(lparam-wparam)),VarSetCapacity(textrange,12,0),NumPut(lparam,textrange,0),NumPut(wparam,textrange,4),NumPut(&text,textrange,8)
this.2162(0,&textrange)
return strget(&text,"","cp0")
}
if (code="gettext"){
cap:=VarSetCapacity(text,vv:=this.2182),this.2182(vv,&text),t:=strget(&text,vv,"cp0")
return t
}
wp:=(wparam+0)!=""?"Int":"AStr"
if wparam.1
wp:="AStr"
if wparam=0
wp:="int"
return DllCall(this.fn,"Ptr",this.ptr,"UInt",code,int,lparam,wp,wparam,"Cdecl")
}
}
~LButton::
MouseGetPos,,,win,Con
if (win!=v.main)
return
if InStr(con,"Scintilla"){
cf(con)
titlechange()
}
return
kill(){
kill:
if v.control.maxindex()=1
return
DllCall("DestroyWindow",uptr,v.focus)
sc:=cf("Scintilla1"),sc.2400
controllist(),arrange(1),titlechange()
return
}
settings(){
static
sett:=setup(3),mmenu:=[]
Gui,Add,ListView,w500 h500 AltSubmit gselhk NoSort,Key Action|Key
Gui,Add,Hotkey,gchangekey vchk limit3
for a,b in v.menu{
if b=options
continue
if !IsObject(b)
LV_Add("",b,"--------------")
for c,d in v.menu[b]
for e,f in d
if e!=sep
{
LV_Add("",clean(e,1),change(settings.ssn("//hotkeys/" clean(e)).text))
mmenu[clean(e)]:={orig:e,menu:b}
}
}
Loop,2
LV_ModifyCol(A_Index,"AutoHDR")
ControlGetPos,,,,h,msctls_hotkey321,% aid(sett)
height:=h*6,ea:=settings.ea("//ftp")
Gui,Add,GroupBox,w500 h%height% Section,FTP Settings
for a,b in info:=["Server","Port","Username","Password"]{
pass:=A_Index=4?"password":""
if A_Index=1
Gui,Add,Text,xs+10 ys+%h% section,%b%:
else
Gui,Add,Text,xs section,%b%:
Gui,Add,Edit,x+10 ys w300 v%b% %pass%,% ea[b]
}
Gui,Show,,Settings
return
selhk:
if (A_GuiEvent="Normal"){
LV_GetText(item,LV_GetNext()),key:=settings.ssn("//hotkeys/" clean(item)).text
GuiControl,3:,msctls_hotkey321,%key%
ControlFocus,msctls_hotkey321
}
return
changekey:
if ! LV_GetNext()
return
LV_GetText(item,LV_GetNext()),LV_GetText(key,LV_GetNext(),2)
Gui,3:Submit,Nohide
if key=--------------
return
set:=settings.add({path:"hotkeys/" clean(item)})
chk:=chk?chk:"null"
LV_Modify(LV_GetNext(),"Col2",change(chk))
Menu,% mmenu[clean(item)].menu,Rename,% mmenu[clean(item)].orig "`t" change(set.text),% mmenu[clean(item)].orig "`t" change(chk)
settings.add({path:"hotkeys/" clean(item),text:chk})
number:=settings.sn("//hotkeys/*[text()='" chk "']"),list:=""
if (number.length>1){
while,n:=number.item(A_Index-1)
list.=clean(n.nodename,1) "`n"
MsgBox,64,AHK Studio,The Key Actions:`n`n%list%`nare using the same hotkey. This will not work properly
}
return
3GuiEscape:
3GuiClose:
Gui,3:Submit,NoHide
settings.add({path:"ftp",att:{server:server,port:port,username:username,password:password}})
cf("Scintilla1")
destroy(3),v.sc.2400
return
}
13GuiEscape:
13GuiClose:
7GuiEscape:
7GuiClose:
destroy(A_Gui)
return
contextmenu(){
GuiContextMenu:
MouseGetPos,,,win,Control
if !InStr(control,"Scintilla")
return
ControlGet,hwnd,hwnd,,%control%,% aid()
v.focus:=hwnd+0
menu:=["Copy","Paste","Cut","Undo"]
sc:=v.sc
if sc.2008-sc.2009!=0
menu.insert("Google Search Selected")
for a,b in menu
Menu,rcm,Add,%b%,rcmadd
Menu,rcm,Add
Menu,rcm,Add,Add Another Scintilla Control,add
if v.control.MaxIndex()>1
Menu,rcm,Add,Remove This Scintilla Control,kill
Menu,rcm,Show
Menu,rcm,DeleteAll
return
rcmadd:
if item=undo
item:=clean(A_ThisMenuItem),%item%()
return
}
open_folder(){
file:=ssn(current(1),"@file").text
SplitPath,file,,dir
run,%dir%
}
open(filelist=""){
if filelist.list{
GuiControl,-Redraw,SysTreeView321
type:=filelist.list.FirstChild.nodetype,fq:={1:[filelist.list,"file"],3:[filelist.list.parentnode,"file[text()='" filelist.list.text "']"]}
fl:=sn(fq[type].1,fq[type].2)
while,ff:=fl.item(A_Index-1){
if !FileExist(ff.text){
xml.remove(ff)
continue
}
fi:=ff.text
SplitPath,fi,name,dir
top:=TV_Add(name)
root:=files.add({path:"main",att:{file:ff.text},dup:1}),rest:="",fi:=ff.text
files.under({node:"file",att:{file:ff.text,tv:top},under:root})
FileRead,text,% ff.text
Loop,Parse,text,`n,`r`n
if InStr(A_LoopField,"#Include"){
file:=RegExReplace(A_LoopField,"i).*include."),RegExReplace(file,"\*i")
if InStr(file,";")
file:=Trim(SubStr(file,1,InStr(file,";")-1))
fname:=FileExist(dir "\" file)?dir "\" file:file
if FileExist(fname){
SplitPath,file,name
child:=TV_Add(name,top)
files.under({node:"file",att:{file:fname,code:A_LoopField,tv:child},under:root})
FileRead,ft,% fname
update({file:fname,text:ft})
}
else
rest.=A_LoopField "`r`n"
}
else
rest.=A_LoopField "`r`n"
update({file:ff.text,text:Trim(rest,"`r`n")})
}
GuiControl,+Redraw,SysTreeView321
}
else
{
FileSelectFile,fn,,,,*.ahk
if ErrorLevel
Exit
if !FileExist(fn)
return m("Somehow it does not exist")
if files.ssn("//*[@file='" fn "']")
return m("aldready open")
newfile:=settings.add({path:"open/file",text:fn,dup:1})
open({list:newfile})
sleep,50
if (filelist=1){
sc:=new s
tv({sc:sc,filename:files.ssn("//file[@file='" fn "']")})
cf(sc)
ControlFocus,,% aid(sc.sc)
}
else
tv({sc:v.sc,filename:files.ssn("//file[@file='" fn "']")})
return
}
files.Transform()
update({clear:1})
}
theme(){
static
hwnd:=setup(11),v.theme:=hwnd,preset:=new xml("preset","lib\preset.xml")
Gui,Margin,0,0
Gui,Add,TreeView,w200 h500 gthemetv AltSubmit
theme:=new s(11),v.themesc:=theme
theme.2096(1)
ControlMove,Scintilla1,201,,,500,ahk_id%hwnd%
Gui,+Resize
theme.2181(0,themetext())
snapshot(hwnd,11,{Scintilla1:["w","h"],SysTreeView321:["h"]})
pos:=settings.ssn("//gui/position[@window='11']").text
pos:=pos?pos:"w" A_ScreenWidth-200 " h" A_ScreenHeight-200 "Center"
Gui,Show,%pos%,Theme
theme.2160
Loop,2
fix_indent(theme)
cf(theme)
Loop,36
theme.2409(A_Index,1),theme.2246(0,1)
list:={Background:{style:5,value:"background"},Caret:{code:2069,value:"color"}
,"Default Background":{style:5,value:"background"},"Current Line Background":{code:2098,value:"color"}
,"Default Font Style":{font:1,style:5},"Custom Highlight Text":"","Personal Variable List":"","Multi Selection Background":{code:2601,value:"color"}
,"Selection Foreground":{code:2067,value:"color",bool:1},"Selection Background":{code:2068,value:"color",bool:1}
,"Selected Duplicates":{code:2082,value:"color",bool:1},"Indent Guides":{style:37,color:1}
,"End Of Line Color":{style:0,color:1}}
root:=TV_Add("Color",0,"Expand")
for a in list
TV_Add(a,root)
io:=TV_Add("Theme Options",0,"Expand")
for a,b in ["Save Current Theme","Save Theme As","Import Theme","Export Theme","Remove Theme","Download Themes"]
TV_Add(b,io)
themes:=TV_Add("Themes",0,"Expand")
tlist:=preset.sn("//preset/*")
while,n:=tlist.item(A_Index-1)
TV_Add(n.nodename,themes)
theme.2400
return
11GuiClose:
destroy(11),cf("Scintilla1")
WinActivate,% aid(v.main)
ControlFocus,Scintilla1,% aid()
return
themetv:
if A_GuiEvent!=Normal
return
TV_GetText(name,TV_GetSelection()),info:=list[name],parent:=TV_GetParent(TV_GetSelection())
if !parent
return
downloadtheme:
if (A_ThisLabel="downloadtheme"){
if !LV_GetNext()
return
LV_GetText(file,LV_GetNext())
URLDownloadToFile,http://www.maestrith.com/files/AHKStudio/themes/%file%,Exported Themes\%file%
file:="exported themes\" file
parent:=io
name=import theme
addname=1
}
if (parent=themes){
new:=preset.ssn("//" name "/fonts"),settings.remove("//fonts")
clone:=new.CloneNode(1)
ssn(settings.xml,"//settings").AppendChild(clone)
theme.2181(0,themetext(preset.sn("//" name "/fonts/highlight/*")))
ll:=settings.sn("//fonts/highlight/*")
while,l:=ll.item(A_Index-1){
theme.4005(ssn(l,"@list").text+3,l.text)
sleep,10 ;not sure why, but it is needed
}
}
if (parent=io){
if (name="Import Theme"){
if !file
FileSelectFile,file,,,Select an XML theme,*.xml
if ErrorLevel
return
temp:=ComObjCreate("MSXML2.DOMDocument"),temp.setProperty("SelectionLanguage","XPath")
temp.load(file)
font:=ssn(temp,"//fonts")
name:=ssn(temp,"//name").text
if (font.xml=""&&name="")
return m("Incompatible Theme"),file:=name:=""
settings.remove("//fonts")
if addname{
Gui,11:Default
TV_Add(name,themes),addname:=0
Gui,34:Default
}
else
if !preset.ssn("//preset/" name)
TV_Add(name,themes)
ssn(settings.xml,"//settings").AppendChild(font)
temp:=""
saveit=1
}
if (name="save theme as"){
InputBox,name,Input a name for your new style,No numbers please`nNames are case sensitive
if !name
return
name:=regexreplace(regexreplace(name," ","_"),"i)(?:[^a-z_])","")
if preset.ssn("//preset/" name){
MsgBox,4,Preset already exists,Overwrite?
IfMsgBox,No
return
}
else
TV_Add(name,themes)
settings.add({path:"fonts/name",text:name})
saveit=1
}
if (name="Save current theme"||saveit){
saveit=0
if !name:=settings.ssn("//fonts/name").text{
InputBox,name,Input a name for your new style,No numbers please`nNames are case sensitive
if !name
return
settings.add({path:"fonts/name",text:name})
TV_Add(name,themes)
}
name:=regexreplace(regexreplace(name," ","_"),"i)(?:[^a-z_])","")
cur:=settings.ssn("//fonts")
if main:=preset.ssn("//preset/" name)
main.ParentNode.RemoveChild(main)
main:=preset.add({path:"preset/" name})
dup:=cur.clonenode(1)
main.appendchild(dup)
preset.Transform(),preset.save(),file:="",name:=""
}
else if (name="export theme"){
dir:="Exported Themes"
if !FileExist(dir)
FileCreateDir,%dir%
theme:=settings.ssn("//fonts/name").Text
FileDelete,%dir%\%theme%.xml
FileAppend,% settings.ssn("//fonts").xml,%dir%\%theme%.xml
m("Theme exported to " A_ScriptDir "\" dir "\" theme ".xml")
}
else if InStr(name,"remove theme"){
ll:=[]
child:=TV_GetChild(themes),TV_GetText(first,child),ll[first]:=child
while,TV_GetText(next,child:=TV_GetNext(child))
ll[next]:=child
setup(33)
Gui,Add,Text,,Warning! Can not be undone.
Gui,Add,ListView,h300 vlistbox,Theme
Gui,Add,Button,gremovetheme,Remove Theme
for a,b in ll
LV_Add("",a)
LV_Modify(1,"Select Focus Vis")
Gui,show,,Remove
return
}
if (name="download themes"){
setup(34)
Gui,Add,ListView,w250 h500 -Multi gpreview AltSubmit,Themes
Gui,Add,Picture,w500 h500 x+10 +hwndpreview
v.preview:=preview
Gui,Add,Button,xm gdownloadtheme,Download Theme
SplashTextOn,,50,Downloading Theme List,Please wait...
populate()
Gui,Show,,Download Theme
}
}
if (parent=root){
if (name="custom highlight text")
return custom_highlight_text()
if (name="Personal Variable List")
return Personal_Variable_List()
if info.font{
orig:=settings.ssn("//fonts/font[@style='5']")
att:=settings.easyatt(orig)
del:=settings.sn("//fonts/font[@style!='5']")
while,d:=del.item(A_Index-1)
if ssn(d,"@style").text!=33
d.ParentNode.RemoveChild(d)
if !Dlg_Font(att)
return
for a,b in att
orig.SetAttribute(a,b)
goto styleend
}
if InStr(name,"Default Background"){
value:=settings.ssn("//fonts/*[@style='5']/@background").text
color:=dlg_color(value,hwnd)
allback:=settings.sn("//fonts/*/@background")
while,b:=allback.item(A_Index-1)
if ssn(b,"../@style").text<32
b.text:=color
goto styleend
}
else if info.style&&info.value{
value:=settings.ssn("//fonts/*[@style='" info.style "']/@" info.value)
color:=dlg_color(value.text,hwnd)
value.text:=color
}
else if info.code{
;here
vv:=info.value,in:=info.clone()
value:=settings.ssn("//fonts/font[@code='" in.code "']/@" vv).text
in.remove("value"),in[vv]:=value
uni:=settings.unique({path:"fonts/font",att:in,check:"code"})
value:=ssn(uni,"@" vv)
color:=dlg_color(value.text,hwnd)
value.text:=color
}
else if (info.style!=""&&info.color){
if !color:=settings.ssn("//*[@style='" info.style "']")
color:=settings.add({path:"fonts/font",att:{style:info.style,color:0},dup:1})
value:=ssn(color,"@color")
value.text:=dlg_color(value.text,hwnd)
}
else
return m("Not implimented yet. Sorry.")
}
styleend:
active:=aid(WinActive()),ea:=settings.ea("//fonts/font[@style='5']")
for a,b in [active,aid()]{
winget,controllist,ControlList,%b%
win:=a=1?A_Gui ":":"1:"
face:=settings.ssn("//fonts/font[@style='5']/@font").text
Gui,%win%font,% "c" RGB(ea.color),%face%
loop,Parse,ControlList,`n
{
GuiControl,% win "+background" RGB(ea.Background) " c" rgb(ea.color),%A_LoopField%
GuiControl,% win "font",%A_LoopField%
}
Gui,%win%color,% RGB(ea.Background)
}
for a,b in s.ctrl
color(b),marginwidth(b)
return
removetheme:
Gui,33:Default
while,LV_GetNext(){
LV_GetText(t,LV_GetNext()),LV_Delete(LV_GetNext())
preset.remove("//" t)
Gui,11:Default
TV_Delete(ll[t])
Gui,33:Default
}
preset.save()
return
}
themetext(theme=1){
out=/*`nMulti-Line`ncomments`n*/`nSelect the text to change the colors`nThis is a sample of normal text`n`"incomplete quote`n"complete quote"`n`;comment`n0123456789`n()[]^&*()+~#\/,{`}``b``a``c``k``t``i``c``k`n
p:=["Commands = ","Items = ","Personal = "]
Loop,3
out.=p[A_Index] v.keywords[A_Index] "`n"
th:=theme=1?settings.sn("//fonts/highlight/*"):theme
while,tt:=th.item(A_Index-1)
out.="Custom List " ssn(tt,"@list").text " = " tt.text "`n"
out.="`nLeft Click to edit the fonts color`nControl+Click to edit the font style, size, italic...etc`nAlt+Click to change the Background color`nThis works for the Line Numbers as well"
return out
}
margincolor(x){
ea:=combine(5,33)
if !numbar:=settings.ssn("//fonts/font[@style='33']")
numbar:=settings.add({path:"fonts/font",att:{style:33},dup:1})
sleep,100
if (x!=4){
color:=dlg_color(ea.color,v.theme)
numbar.SetAttribute("color",color)
}
else
{
color:=dlg_color(ea.background,v.theme)
numbar.SetAttribute("background",color)
}
for a,b in v.Control
color(s.ctrl[b]),marginwidth(s.ctrl[b])
color(v.themesc)
}
combine(style,style1){
ea:=settings.ea("//fonts/font[@style='" style "']"),def:=xml.easyatt(settings.ssn("//fonts/font[@style='" style1 "']"))
for a,b in def
ea[a]:=b
return ea
}
font(){
sc:=v.sc
st:=sc.2010(sc.2008)
if (v.lastmod=4){
def:=combine(5,st)
color:=dlg_color(def.background,v.theme)
settings.ssn("//fonts/font[@style='" st "']").SetAttribute("background",color)
for a,b in v.Control
color(s.ctrl[b])
color(v.themesc)
return
}
if (v.lastmod=2){
def:=combine(5,st)
dlg_font(def,1,v.theme)
def.style:=st
uni:=settings.unique({path:"fonts/font",att:def,check:"style"})
for a,b in v.Control
color(s.ctrl[b])
color(v.themesc)
if st=5
for a,b in [1,A_Gui]{
Gui,%b%:Font,% "c" RGB(def.color),% def.font
GuiControl,%b%:font,SysTreeView321
}
return
}
if !set:=settings.ssn("//*[@style='" st "']")
set:=settings.add({path:"fonts/font",att:{style:st},dup:1})
color:=ssn(set,"@color").Text
color:=color?color:0
color:=dlg_color(color,v.theme)
set.SetAttribute("color",color)
for a,b in s.ctrl
color(b),marginwidth(b)
if st=5
for a,b in [1,A_Gui]{
Gui,%b%:Font,% "c" RGB(color),% def.font
GuiControl,%b%:font,SysTreeView321
}
WinActivate,Theme
}
downloadtheme(){
preview:
dir:="Exported Themes"
if !FileExist(dir)
FileCreateDir,%dir%
if A_GuiEvent!=Normal
return
if !LV_GetNext()
return
LV_GetText(theme,LV_GetNext())
SplitPath,theme,,,,filename
SplashTextOn,,50,Downloading Preview,Please wait...
URLDownloadToFile,http://www.maestrith.com/files/AHKStudio/themes/%filename%.png,%dir%\preview.png
SplashTextOff
img:=ComObjCreate("WIA.ImageFile")
img.loadfile(dir "\preview.png")
width:=img.width,height:=img.height
GuiControl,34:,Static1,*w%width% *h%height% %dir%\preview.png
Gui,34:Show,AutoSize
return
}
populate(){
Gui,34:Default
info:=URLDownloadToVar("http://www.maestrith.com/files/AHKStudio/themes")
SplashTextOff
pos:=1
search="(\w+\.xml)"
while,pos:=RegExMatch(info,search,found,pos)
LV_Add("",found1,found),pos+=StrLen(found1)
}
fix_indent(sc="",noundo=""){
v.fix:=1
if !sc
sc:=v.sc
if !noundo
sc.2078()
out:=sc.gettext(),indent:=0
fix:=v.options.auto_indent
sc.2029(0),sc.2124(1)
ind=5
loop,parse,out,`r,`r`n
{
cline:=A_Index-1,text:=trim(a_loopfield)
if InStr(text,";"){
while,pos:=InStr(text,chr(59),0,1,A_Index){
in:=sc.2127(cline)
if sc.2010(sc.2128(cline)+pos)=1
text:=trim(substr(a_loopfield,1,pos))
}
}
if (text="*/"){
indent-=ind
if indent < 0
indent:=0
if (fix || x=1)
sc.2126(A_Index-1,indent)
}
if (SubStr(text,1,1)="}"){
indent-=ind
if indent < 0
indent:=0
if (fix || x=1)
sc.2126(A_Index-1,indent)
}
if (text="/*"){
indent+=ind
if (fix || x=1){
sc.2126(A_Index-1,indent-ind)
sc.2126(A_Index,indent)
}
sc.2222(A_Index-1,0x2000|1024+indent-ind)
}
else if (SubStr(text,0)="{"){
indent+=ind
if (fix || x=1){
sc.2126(A_Index-1,indent-ind)
sc.2126(A_Index,indent)
}
sc.2222(A_Index-1,0x2000|1024+indent-ind)
}
else if (fix || x=1)
sc.2126(A_Index-1,indent)
sc.2222(A_Index,1024+indent)
list.=A_Index " " indent "`n"
if indent < 0
indent:=0
}
if indent>0
tooltip,Segment is open,0,0,10
else
ToolTip,,,,10
v.fix:=0
marginwidth()
if !noundo
sc.2079()
}
undo(){
v.sc.2176
}
insert_function(){
InputBox,func,Function Name,Please insert a function name
if !func
return
InputBox,var,Function Variables,Insert the variables
sc:=v.sc
if (sc.2136(line:=sc.2166(sc.2008))!=sc.2008)
end:="`r`n",pos:=sc.2128(line+1),sc.2160(pos,pos)
sc.2003(sc.2008,clean(func) "(" var "){`r`n`r`n}" end)
fix_indent(sc)
Send,{down}
sc.2314
}
move_selected_lines_down(){
v.sc.2621
fix_indent(v.sc)
}
move_selected_lines_up(){
v.sc.2620
fix_indent(v.sc)
}
context(){
sc:=v.sc
if sc.2102
return
cp:=sc.2008,kw:=v.kw,add:=0,pos:=cp-1,start:=sc.2128(sc.2166(cp))
content:=sc.textrange(start,cp)
RegExMatch(content,"(\w+)",word)
search=U)"(.*)"
cb:=RegExReplace(content,search),RegExReplace(cb,"\)","",Count)
cou:=[],cbb:=cb
for a,b in ["(",")"]
while,pos:=InStr(cb,b,0,1,A_Index)
cou[pos]:=b
for a,b in cou{
if (b="(")
ccc++
else if (b=")")
ccc--
if ccc=0
cbb:=SubStr(cb,a+1)
}
cbb:=SubStr(cbb,1,InStr(cbb,"(",0,1,ccc))
RegExMatch(cbb,"(\w+)\($",command)
found:=kw[command1]?kw[command1]:kw[word1]
if !found
return
if syn:=commands.ssn("//Commands/*[text()='" found "']/@syntax").text
info:=found " " syn
else
{
root:=commands.sn("//Context/" found "/syntax")
while,r:=root.item(A_Index-1)
if cc:=RegExMatch(cb,"i)\b(" RegExReplace(r.text," ","|") ")\b",ff){
info:=ssn(r,"@syntax").text
break
}
if !cc
return
info:=SubStr(cb,1,cc+StrLen(ff)-1) " " info
}
RegExReplace(info,",","",count)
if !count
return sc.2207(0),sc.2200(start,info),sc.2204(0,StrLen(info))
newstr:=RegExReplace(SubStr(cb,InStr(cb,found,0,0)+StrLen(found)),"U)\((.*)\)")
newstr:=Trim(newstr,"(")
RegExReplace(newstr,",","",count)
ss:=InStr(info,",",0,1,count),ee:=InStr(info,",",0,1,count+1)
sc.2200(start,info),sc.2207(0xFF0000)
if (ss&&ee)
sc.2204(ss,ee)
else if (ss&&ee=0)
sc.2204(ss,StrLen(info))
else if (ss=0&&ee)
sc.2204(ss,ee)
else
sc.2207(0x0000FF),sc.2204(0,StrLen(info))
return
ss:
SetTimer,ss,Off
context()
return
}
replace(){
sc:=v.sc,cp:=sc.2008
word:=sc.textrange(start:=sc.2266(cp-1,1),end:=sc.2267(cp-1,1))
if w:=settings.ssn("//replacements/*[@replace='" word "']").text
sc.2190(start),sc.2192(end),sc.2194(StrLen(w),w)
l:=commands.ssn("//Context/*/*[text()='" w "']/@list").text
if l{
Sort,l,D%A_Space%
sc.2100(0,l)
}
}
defaults(){
exclude:={"word wrap":1,"end of line":1,"virtual space":1}
if commands.ssn("//Version/Date").text!=20130610063815
m("Some context may not work properly.`nDelete the Commands.xml file and try to restart the program.")
if !settings.ssn("//fonts"){
settings.Add({path:"fonts/font",att:{style:5,background:0,color:0xFFFFFF,size:10,font:"Tahoma",bold:1},dup:1})
settings.Add({path:"fonts/font",att:{style:33,background:0xFF0000},dup:1})
settings.Add({path:"fonts/font",att:{color:0xFFFFFF,code:2069},dup:1})
for a,b in {11:0xFF,12:0xFF8080,3:0xFF0000,7:0x00FFFF,1:0xAAAAAA,2:0x00FF00,4:0xFF8000,9:0x800080,10:0x8080C0}
settings.Add({path:"fonts/font",att:{style:a,color:b},dup:1})
for a,b in v.menu.options{
for c,d in b
if !exclude[c]{
settings.add({path:"options/" clean(c),text:1})
Menu,options,ToggleCheck,% c "`t" change(d)
}
}
}
}
update(return=""){
static update:=[],updated:=[]
if return.remove
return updated.remove(return.remove)
if return.Text
return update[return.file]:=return.text
if return.get
return update
if return.Up
return updated
if return.clear
return updated:=[]
sc:=return.sc,file:=return.file
if text:=sc.gettext(),updated[file]:=1
update[file]:=text
}
current(parent=""){
node:=files.ssn("//*[@doc='" v.sc.2357 "']")
if (parent=1&&node.nodename="main")
return node
if (parent=1&&node.nodename!="main")
return node.parentnode
return node
}
tv(info=""){
sc:=info.sc,filename:=info.filename
goto next
tv:
if (A_GuiEvent="Rightclick"){
selection:=TV_GetSelection()
MouseClick,Left
v.tvid:=TV_GetSelection()
TV_Modify(selection,"Select Focus Vis")
Menu,open,Add,Open in new control,oic
Menu,open,Show
Menu,open,Delete
}
if (A_GuiEvent!="Normal")
return
filename:=files.ssn("//file[@tv='" TV_GetSelection() "']")
next:
Gui,1:TreeView,SysTreeView321
sc:=!sc?v.sc:sc
main:=filename.nodename="main"?filename:filename.parentnode
if ssn(main,"@file").text
last:=positions.unique({path:"main",att:{file:ssn(main,"@file").text},check:"file"})
getpos(),test:=0
if !ssn(filename,"@file").text
return
number:=misc.ssn("//scintilla/control[@sc='" sc.sc "']/@number").text
v.lastlist[number]:=ssn(filename,"@file").text
sc.2078
if !doc:=ssn(filename,"@doc").text
doc:=sc.2375,sc.2358(0,doc),filename.SetAttribute("doc",doc),sc.2181(0,update({get:1})[ssn(filename,"@file").text]),update({remove:ssn(filename,"@file").text}),color(sc),fix_indent(sc,1)
else
sc.2358(0,doc)
setpos(sc)
Gui,1:Default
files.Transform()
tv:=filename.firstchild?ssn(filename.firstchild,"@tv").text:ssn(filename,"@tv").text
tv:=tv?tv:ssn(filename,"@tv").text
TV_Modify(tv,"Focus Vis Select")
file:=ssn(filename,"@file").text
last.SetAttribute("last",file),fix_indent(sc,1),marginwidth(sc)
sc:=""
WinGetTitle,title,% aid()
if ssn(current(1),"@file").text!=v.lastfile
Refresh_Code_Explorer()
titlechange()
v.lastfile:=ssn(current(1),"@file").text
id:=idea.ssn("//*[@file='" ssn(current(1),"@file").text "']").text
ControlGetText,eas,Edit1,% "ahk_id" v.ideas
eas:=RegExReplace(eas,"\r\n","`n")
sc.2079()
if !WinExist("ahk_id" v.ideas)
return
if (id!=eas)
ControlSetText,Edit1,% RegExReplace(id,"\n","`r`n"),% "ahk_id" v.ideas
return
oic:
sc:=new s,cf(sc)
arrange(1)
tv({filename:files.ssn("//*[@tv='" v.tvid "']")})
titlechange()
ControlFocus,,% aid(sc.sc)
return
}
jump_to_segment(){
static segments:=[]
static sort
jump:=sn(current(1),"*/@file"),segments:=[]
jts:=setup(7)
Gui,Add,Edit,gsort vsort w200
Gui,Add,ListView,w200 h400 AltSubmit -Multi,Segments
Gui,Add,Button,gjump Default,Jump
while,j:=jump.item(A_Index-1).text{
splitpath,j,name,dir
LV_Add("",name)
segments[name]:=j
}
snapshot(jts,7,{Edit1:["w"],SysListView321:["w","h"],Button1:["y"]})
Gui,+Resize
Gui,-0x30000
LV_Modify(1,"Select Vis Focus"),hotkey({win:jts,list:{up:"ud",down:"ud"}})
Gui,Show,% show(7),Jump to Segment
return
jump:
Gui,7:Default
LV_GetText(segment,LV_GetNext())
node:=current(1)
js:=ssn(node,"*[@file='" segments[segment] "']")
if js
tv({sc:v.sc,filename:js})
Destroy(7)
return
sort:
Gui,7:Submit,Nohide
LV_Delete()
jump:=sn(current(1),"*/@file")
while,j:=jump.item(A_Index-1).text{
splitpath,j,name,dir
if InStr(name,sort)
LV_Add("",name)
}
LV_ModifyCol(1,"Sort"),LV_Modify(1,"Select Focus Vis")
return
ud:
Gui,7:Default
count:=A_ThisHotkey="up"?-1:+1,pos:=LV_GetNext()+count<1?1:LV_GetNext()+count,LV_Modify(pos,"Select Focus Vis")
return
}
Jump_to_Script(){
static scripts:=[]
static sort
list:=files.sn("//main"),scripts:=[]
jts:=setup(13)
Gui,+Resize
Gui,-0x30000
Gui,Add,Edit,w500 gjtsort vsort
Gui,Add,ListView,w500 h500 -Multi,Scripts
Gui,Add,Button,gjts Default,Jump To Script
Gui,Default
snapshot(jts,13,{Edit1:["w"],SysListView321:["w","h"],Button1:["y"]})
Gui,Show,% show(13),Jump to Script
while,l:=list.item(A_Index-1)
LV_Add("",ssn(l,"@file").text),scripts[ssn(l,"@file").text]:=1
LV_Modify(1,"Select Vis Focus"),hotkey({win:jts,list:{up:"jtsupdown",down:"jtsupdown"}})
return
jtsort:
Gui,13:Default
Gui,Submit,Nohide
LV_Delete()
for a,b in scripts
if InStr(a,sort)
LV_Add("",a)
LV_Modify(1,"Select Focus Vis")
return
jts:
LV_GetText(file,LV_GetNext())
if file{
f:=positions.ssn("//main[@file='" file "']/@last").text
fff:=f?files.ssn("//main[@file='" file "']/file[@file='" f "']"):files.ssn("//main[@file='" file "']")
tv({sc:v.sc,filename:fff})
}
Destroy(13)
return
jtsupdown:
Gui,13:Default
count:=A_ThisHotkey="up"?-1:+1,pos:=LV_GetNext()+count<1?1:LV_GetNext()+count,LV_Modify(pos,"Select Focus Vis")
return
}
new_segment(new="",notv=""){
if !new
{
cur:=ssn(current(1),"@file").Text
SplitPath,cur,,dir
FileSelectFile,new,s,%dir%\,Create a new Segment,*.ahk
if ErrorLevel
return
}
if node:=ssn(current(1),"file[@file='" new "']")
return tv({sc:v.sc,filename:node})
SplitPath,new,file,newdir
incfile:=(newdir=dir)?file:new
top:=TV_Add(file,ssn(current(1),"file/@tv").text)
select:=files.under({node:"file",att:{file:new,code:Chr(35) "Include " incfile,tv:top},under:current(1)})
up:=update({up:1})
;future add a way to add stuff to the new file
FileAppend,,%new%
up[cur]:=1
if !notv
tv({sc:v.sc,filename:select})
}
hotkey(info){
Hotkey,IfWinActive,% aid(info.win)
for key,label in info.list
Hotkey,%key%,%label%,On
}
getpos(){
if !current(1)
return
sc:=v.sc,current:=current(1)
fix:=positions.unique({path:"main",att:{file:ssn(current,"@file").text},check:"file"})
fix:=positions.unique({under:fix,path:"file",att:{start:sc.2008,end:sc.2009,scroll:sc.2152,file:ssn(current(),"@file").text},check:"file"})
fold:=0
while,sc.2618(fold)>=0,fold:=sc.2618(fold)
list.=fold ",",fold++
if list
fix.SetAttribute("fold",Trim(list))
else
fix.removeattribute("fold")
}
setpos(sc){
file:=ssn(current(),"@file").text,parent:=ssn(current(1),"@file").text
posinfo:=positions.ssn("//main[@file='" parent "']/file[@file='" file "']")
ea:=xml.easyatt(posinfo),fold:=ea.fold
if ea.start
sc.2613(ea.scroll),sc.2160(ea.start,ea.end)
Loop,Parse,fold,`,
if A_LoopField is number
sc.2231(A_LoopField)
}
find(){
static
file:=ssn(current(1),"@file").text
infopos:=positions.ssn("//*[@file='" file "']")
last:=ssn(infopos,"@search").text
hwfind:=setup(4)
search:=last?last:"Type in your query here"
for a,b in ["Edit,gfindcheck w500 vfind," search ,"TreeView,w500 h300 AltSubmit gstate"
,"Checkbox,vregex,Regex Search","Checkbox,vgr x+10,Greed","Checkbox,xm vcs,Case Sensitive"
,"Checkbox,vsort gfsort,Sort by Segment"]{
StringSplit,b,b,`,
Gui,Add,%b1%,%b2%,%b3%
b2:=b3:=""
}
Gui,Add,Button,gsearch Default,% " Search "
snapshot(hwfind,4,{SysTreeView321:["w","h"],Button1:["y"],Button2:["y"],Button3:["y"],Button4:["y"],Button5:["y"],Edit1:["w"]})
Gui,show,% show(4),Find
for a,b in xml.easyatt(settings.ssn("//search/find"))
GuiControl,4:,%a%,%b%
ControlSend,Edit1,^a,% aid(hwfind)
return
findcheck:
ControlGetText,Button,Button5,% aid(hwfind)
if (Button!="search")
ControlSetText,Button5,Search,% aid(hwfind)
return
search:
ControlGetText,Button,Button5,% aid(hwfind)
if (InStr(button,"search")){
Gui,4:Submit,Nohide
if !find
return
ff:="",ff.=gr?"":"U"
ff.=cs?"O)":"Oi)",refreshing:=1,foundinfo:=[]
main:=regex=0?"(.*)(\Q" find "\E)(.*)":"(" find ")"
f:=gr&&regex?ff "(" find ")":ff main
infopos.setattribute("search",find)
Gui,4:Default
GuiControl,4:-Redraw,SysTreeView321
list:=sn(current(1),"*/@file"),contents:=update({get:1}),TV_Delete()
while,l:=list.item(A_Index-1){
out:=contents[l.text],found=1,r=0,fn:=l.text
SplitPath,fn,file
if !regex{
while,found:=RegExMatch(out,ff main,fo,found){
r:=sort&&A_Index=1?TV_Add(file):r
parent:=TV_Add(fo.value(),r)
foundinfo[parent]:={pos:fo.pos(2)-1,file:l.text,found:fo.len(2)}
found:=fo.pos(3)
}
}
else
{
while,found:=RegExMatch(out,"Oi)(.*" find ".*)",pof,found){
fff:=1,r:=sort&&A_Index=1?TV_Add(file):r
while,fff:=RegExMatch(pof.value(),ff main,fo,fff){
parent:=TV_Add(fo.value(1)" : "pof.value(),r)
foundinfo[parent]:={pos:found+fo.pos(1)-2,file:l.text,found:fo.len(1)}
fff:=fo.pos(1)+fo.len(1)
}
found+=pof.len(0)
}
}
}
if TV_GetCount()
ControlFocus,SysTreeView321
GuiControl,4:+Redraw,SysTreeView321
ControlSetText,Button5,Jump,% aid(hwfind)
refreshing:=0
}
else if (Button="jump"){
Gui,4:Submit,Nohide
ea:=foundinfo[TV_GetSelection()]
sc:=v.sc
tv({sc:sc,filename:ssn(current(1),"file[@file='" ea.file "']")})
sc.2160(ea.pos,ea.pos+ea.found)
sc.2169
}
else
sel:=TV_GetSelection(),TV_Modify(sel,ec:=TV_Get(sel,"E")?"-Expand":"Expand")
state:
sel:=TV_GetSelection()
Gui,4:TreeView,SysTreeView321
if refreshing
return
ControlGetFocus,focus,% aid(hwfind)
if !InStr(Focus,"SysTreeView321"){
ControlSetText,Button5,Search,% aid(hwfind)
return
}
if TV_GetChild(sel)
ControlSetText,Button5,% TV_Get(sel,"E")?"Contract":"Expand",% aid(hwfind)
else if TV_GetCount()
ControlSetText,Button5,Jump,% aid(hwfind)
else
ControlSetText,Button5,Search,% aid(hwfind)
return
sel:=TV_GetSelection()
if TV_GetChild(sel)
ControlSetText,Button5,% TV_Get(sel,"E")?"Contract":"Expand",% aid(hwfind)
else
ControlSetText,Button5,Jump,% aid(hwfind)
return
fsort:
ControlSetText,Button5,Search,% aid(hwfind)
goto search
return
4GuiEscape:
4GuiClose:
Gui,4:Submit,NoHide
settings.add({path:"search/find",att:{regex:regex,cs:cs,sort:sort,gr:gr}}),foundinfo:=""
Destroy(4)
return
}
show_scintilla_code_in_line(get=""){
static scintilla
if !FileExist("lib\scintilla.xml"){
SplashTextOn,300,100,Downloading definitions,Please wait
URLDownloadToFile,http://www.autohotkey.net/~maestrith/AHKStudio/scintilla.xml,lib\scintilla.xml
SplashTextOff
}
if !IsObject(scintilla)
scintilla:=new xml("scintilla","lib\scintilla.xml")
if Get
return scintilla
sc:=v.sc
text:=sc.textrange(sc.2128(sc.2166(sc.2008)),sc.2136(sc.2166(sc.2008)))
pos=1
while,pos:=RegExMatch(text,"(\d\d\d\d)",found,pos){
codes:=scintilla.sn("//*[@code='" found1 "']")
list.="Code : " found1 " = "
while,c:=codes.item(A_Index-1)
list.=c.nodename " "
pos+=5
list.="`n"
}
if list
m(list)
}
scintilla_code_lookup(){
static scintilla,slist,cs
if !IsObject(scintilla)
scintilla:=show_scintilla_code_in_line(1),slist:=scintilla.sn("//*")
scl:=setup(8)
Gui,Add,Edit,Uppercase w500 gcodesort vcs
Gui,Add,ListView,w720 h500 -Multi,Name|Code|Syntax
Gui,Add,Button,ginsert Default,Insert code into script
Gui,Add,Button,gdocsite,Goto Scintilla Document Site
while,sl:=slist.item(A_Index-1)
LV_Add("",sl.nodename,ssn(sl,"@code").text,ssn(sl,"@syntax").text)
Gui,show,,Scintilla Code Lookup
hotkey({win:scl,list:{up:"lookupud",down:"lookupud"}})
Loop,3
LV_ModifyCol(A_Index,"AutoHDR")
return
docsite:
Run,http://www.scintilla.org/ScintillaDoc.html
return
codesort:
LV_Delete()
Gui,8:Submit,Nohide
GuiControl,-Redraw,SysListView321
slist:=scintilla.sn("/*/*[contains(@name,'" cs "')]")
while,sl:=slist.item(A_Index-1)
LV_Add("",sl.nodename,ssn(sl,"@code").text,ssn(sl,"@syntax").text)
GuiControl,+Redraw,SysListView321
LV_Modify(1,"Select Vis Focus")
return
insert:
LV_GetText(code,LV_GetNext(),2)
sc:=v.sc
DllCall(sc.fn,"Ptr",sc.ptr,"UInt",2003,int,sc.2008,astr,code,"Cdecl")
npos:=sc.2008+StrLen(code)
sc.2160(npos,npos)
return
lookupud:
Gui,8:Default
count:=A_ThisHotkey="up"?-1:+1,pos:=LV_GetNext()+count<1?1:LV_GetNext()+count,LV_Modify(pos,"Select Focus Vis")
return
8GuiClose:
8GuiEscape:
Destroy(8)
return
}
full_backup(){
save(),sc:=v.sc
SplashTextOn,300,100,Backing up...,Please wait, This may take some time if it has been a while since your last full backup.
cur:=ssn(current(1),"@file").Text
SplitPath,cur,,dir
backup:=dir "\backup\Full Backup" A_Now
FileCreateDir,%backup%
loop,%dir%\*.*
{
if InStr(a_loopfilename,".exe") || InStr(A_LoopFileName,".dll")
continue
filecopy,%A_LoopFileFullPath%,%backup%\%A_LoopFileName%
}
loop,%dir%\backup\*.*,2
if !InStr(A_LoopFileFullPath,"Full Backup")
fileremovedir,%a_loopfilefullpath%,1
SplashTextOff
;neat
}
toggle_comment_line(){
sc:=v.sc,sc.2078
pi:=posinfo(),sl:=sc.2166(pi.start),el:=sc.2166(pi.end),end:=pi.end,single:=sl=el?1:0
while,sl<=el{
letter:=sc.textrange(min:=sc.2128(sl),min+1)
if (min>end&&!single)
break
if (letter=";")
sc.2190(min),sc.2192(min+1),sc.2194(0,""),end--
else
sc.2190(min),sc.2192(min),sc.2194(1,";"),end++
sl++
}
sc.2079
}
posinfo(){
sc:=v.sc
current:=sc.2008
line:=sc.2166(current),se:=[]
ind:=sc.2128(line)
lineend:=sc.2136(line)
se[current]:=1,se[sc.2009]:=1
out:={current:current,line:line,ind:ind,lineend:lineend,start:se.minindex(),end:se.maxindex()}
return out
}
Create_Comment_Block(){
pos:=posinfo(),sc:=v.sc
start:=end:=laststart:=lastend:=sc.2128(sc.2166(sc.2008))
cs:=sc.2010(start)
sc.2078
if (cs=10){
start:=end:=sc.2128(sc.2166(sc.2008))
docend:=sc.2006
while sc.2010(start)=10&&start>0{
laststart:=start
start--
}
while sc.2010(end)=10&&end<docend{
lastend:=end
end++
}
start:=laststart
end:=lastend
if !start
start:=0
if !end
end:=docend
sc.2160(end,end-1)
sc.2338
sc.2160(start,start+1)
sc.2338
}
else
{
start:=sc.2128(sc.2166(pos.start)),end:=sc.2136(sc.2166(pos.end))
sc.2003(start,inline "/*`r`n")
if (pos.start=pos.end)
sc.2003(end+4,"`r`n*/")
else
sc.2003(end+4,"`r`n*/")
}
fix_indent(sc,1)
sc.2079
}
quick_find(){
static
qf:=setup(5)
for a,b in ["Text,,Find","Edit,w200 gqfsearch vqfind","Text,,Replace","Edit,w200 vreplace","Checkbox,vregex gqfsearch,Regex","Checkbox,x+10 vgr gqfsearch,Greed"
,"Checkbox,xm vcs gqfsearch,Case Sensitive","Checkbox,xm vsis gqfsearch,Search in Selection"
,"Button,gqfrep,Replace All","Button,greplacecurrent,Replace Current","Button,gnextfound Default,Next Found"]{
StringSplit,info,b,`,
Gui,Add,%info1%,%info2%,%info3%
info1:=info2:=info3:=""
}
p:=posinfo(),sc:=v.sc,indic:=[],os:=p.start+1,oe:=p.end,getpos()
Gui,Show,,Quick Find
multi:=settings.ssn("//fonts/font[@code='" 2601 "']/@color").text
multi:=multi?multi:0xff0000
sc.2601(multi)
if (os!=oe)
indic:={os:os,oe:oe}
else
indic:={os:0,oe:sc.2006}
for a,b in xml.easyatt(settings.ssn("//quick_find"))
GuiControl,5:,%a%,%b%
ControlSend,Edit1,^a,% aid(qf)
return
Nextfound:
sc:=v.sc
sc.2606
sc.2169
return
qfsearch:
Gui,5:Submit,Nohide
sc:=v.sc,find:=""
find.=gr?"":"U"
find.=cs?"O)":"Oi)"
find.=regex=0?"(\Q" qfind "\E)":qfind
if !qfind
return sc.2571
indic["sel"]:=sis
total:=q_f(find,indic)
sc.2574(0)
return
5GuiEscape:
5GuiClose:
Gui,Submit
settings.add({path:"quick_find",att:{qfind:qfind,replace:replace,cs:cs,regex:regex,sis:sis,gr:gr}})
destroy(5)
if !total
sc.2160(indic.os-1,indic.oe)
WinActivate,% aid()
return
replacecurrent:
Gui,Submit,Nohide
sc:=v.sc
main:=sc.2575
end:=sc.2577(main),start:=sc.2579(main)
otext:=sc.textrange(start,end)
rep:=RegExReplace(otext,find,replace,"",1,1)
sc.2190(start),sc.2192(end),sc.2194(StrLen(rep),rep)
sc.2606
sc.2169
return
Qfrep:
Gui,Submit,Nohide
sc:=v.sc
main:=sc.2575
end:=sc.2577(main),start:=sc.2579(main)
otext:=sc.textrange(start,end)
rep:=RegExReplace(otext,find,replace,"",1,1)
clip:=Clipboard
Clipboard:=rep
if rep in ``r,``n,``r``n,`\r,`\n,`\r`\n
clipboard:=Chr(10)
sc.2179
clipboard:=clip
count:=sc.2570
add:=add*count
goto 5GuiClose
return
}
q_f(find="",sel=0){
sc:=v.sc
sc.2571
text:=sc.gettext()
if (sel.sel && Abs(sel.os-sel.oe)>1){
found:=sel.os
text:=SubStr(text,1,sel.oe)
}
found:=found?found:1
while found:=RegExMatch(text,find,fo,found){
if A_Index=1
sc.2160(fo.pos()-1,fo.pos()+strlen(fo.0)-1)
else
sc.2573(fo.pos()+strlen(fo.0)-1,fo.pos()-1)
found+=fo.len()
total:=A_Index
}
if (total="")
sc.2571
return total
}
copy(){
v.sc.2178
}
paste(){
paste:
v.sc.2179
fix_indent(v.sc)
return
}
cut(){
v.sc.2177
}
clean_position_data(){
nodes:=positions.sn("/*/*")
while,node:=nodes.item[a_index-1]
ifnotexist,% ssn(node,"@file").text
xml.remove(node),list.=ssn(node,"@file").text "`n"
save()
if list
m("Information for files:`n" list "has been deleted.")
else
m("All position data is current")
}
Duplicate_line(){
v.sc.2469
}
destroy(win){
Gui,1:-Disabled
position:=winpos(WinActive("A"))
if !position
return
if pos:=settings.ssn("//gui/position[@window='" win "']")
pos.Text:=position
else
ss:=settings.add({path:"gui/position",att:{window:win},text:position,dup:1})
ControlFocus,,% aid(v.sc.sc)
Gui,%win%:Destroy
}
keywords(){
v.keywords:=[],v.kw:=[],v.custom:=[]
for a,b in {cmd:commands.ssn("//Commands/Commands").text,itm:commands.ssn("//Commands/Items").text,user:settings.ssn("//Variables").text}{
%a%:=b
if a=cmd
command:=%a%
list.=%a% " "
StringLower,%a%,%a%
v.keywords[A_Index]:=%a%
}
ll:=settings.sn("//fonts/highlight/*")
while,l:=ll.item(A_Index-1){
v.custom[A_Index]:=l.text
for a,b in v.keywords
v.keywords[a]:=RegExReplace(b,"i)\b(" RegExReplace(l.text," ","|") ")\b")
}
v.cmds:=command
v.user:=user
v.keywords.list:=list
sort,list,UD%A_Space%
Loop,Parse,list,%a_space%,%a_space%
v.keywords[substr(a_loopfield,1,1)].=a_loopfield " "
Loop,Parse,command,%A_Space%,%A_Space%
v.kw[A_LoopField]:=A_LoopField
}
Personal_Variable_List(){
static
qf:=setup(6)
Gui,Add,ListView,w200 h400,Variables
Gui,Add,Edit,w200 vvariable
Gui,Add,Button,gaddvar Default,Add
Gui,Add,Button,x+10 gvdelete,Delete Selected
ControlFocus,Edit1,% aid(vars)
Gui,Show,,Variables
vars:=settings.sn("//Variables/*")
while,vv:=vars.item(A_Index-1)
LV_Add("",vv.text)
ControlFocus,Edit1,% aid(qf)
return
vdelete:
while,LV_GetNext(){
LV_GetText(string,LV_GetNext())
this:=settings.ssn("//Variable[text()='" string "']")
this.parentnode.removechild(this)
LV_Delete(LV_GetNext())
}
return
addvar:
Gui,6:Submit,Nohide
if !variable
return
if !settings.ssn("//Variables/Variable[text()='" variable "']")
settings.add({path:"Variables/Variable",text:variable,dup:1}),LV_Add("",variable)
settings.Transform()
ControlSetText,Edit1,,% aid(qf)
return
6GuiClose:
6GuiEscape:
keywords()
Destroy(6)
if v.theme
if WinExist(aid(v.Theme))
v.themesc.2181(0,themetext())
return
}
setup(window,nodisable=""){
ea:=settings.ea("//font[@style='5']")
Background:=ea.Background,font:=ea.font,color:=RGB(ea.color)
Background:=Background?Background:0
size:=10
Gui,%window%:Destroy
Gui,%window%:Default
Gui,+hwndhwnd
if !nodisable{
Gui,+Owner1 -0x20000
Gui,1:+Disabled
}
Gui,color,% RGB(Background),% RGB(Background)
Gui,Font,% "s" size " c" color,%font%
Gui,%window%:Default
v.window[window]:=""
return hwnd
}
publish(return=""){
sc:=v.sc,text:=update({get:1}),save()
com:=files.sn("//*[@doc='" sc.2357 "']../*")
while,file:=ssn(com.item(A_Index-1),"@file")
publish.=text[file.text] "`r`n"
publish:=Trim(publish,"`r`n")
ea:=xml.easyatt(vversion.ssn("//*[@file='" ssn(current(1),"@file").text "']"))
newver:=ea.version "." ea.increment
aa:=vversion.ea("//info[@file='" ssn(current(1),"@file").text "']")
repver:=aa.versstyle?newver:"Version=" newver
if InStr(publish,Chr(59) "auto_version")
publish:=RegExReplace(publish,Chr(59) "auto_version",repver)
if return
return publish
Clipboard:=publish
MsgBox,,AHK Studio,Project coppied to your clipboard,.6
}
close(){
save()
sc:=v.sc,udf:=update({get:1})
close:=files.sn("//file[@doc='" sc.2357 "']../*")
while,c:=close.item[A_Index-1]{
att:=xml.easyatt(c)
if att.doc
sc.2377(0,att.doc)
if att.tv
TV_Delete(att.tv)
udf[att.file]
}
file:=files.ssn("//file[@doc='" sc.2357 "']../@file").text
remove:=settings.ssn("//open/file[text()='" file "']")
remove.ParentNode.RemoveChild(remove)
remove:=files.ssn("//file[@doc='" sc.2357 "']..")
remove.ParentNode.RemoveChild(remove)
if (v.control.maxindex()>1){
DllCall("DestroyWindow",uptr,v.sc.sc)
controllist(),arrange()
ControlFocus,Scintilla1,% aid()
cf("Scintilla1")
return
}
else if files.sn("//main").length>0{
tv({sc:sc,filename:files.ssn("//file[@file='" files.ssn("//@file").text "']")})
ControlFocus,,% aid(sc.sc)
}
else
untitled()
}
new_project(fn=""){
if fn{
text:=
(
"
;You can start editing this file, open an existing one, or start a new file
"
)
FileAppend,%text%,%fn%
}
else
FileSelectFile,fn,,%A_ScriptDir%\Projects,Create a new file,*.ahk
if ErrorLevel
return
fn:=InStr(fn,".ahk")?fn:fn ".ahk"
FileAppend,% ";New file information will be editable in future releases",%fn%
file:=settings.add({path:"open/file",text:fn})
open({list:file})
tv({filename:files.ssn("//file[@file='" fn "']")})
;change open from an object based thingie to a file1,file2,file3 thing
}
character_count(){
sc:=v.sc
if sc.2161>1
m(sc.2161-1)
else
m(sc.2183)
}
open_in_new_window(){
open(1)
}
untitled(){
count=1
Loop,projects\*.ahk
{
if InStr(A_LoopFileName,"untitled")
count++
}
new_project(A_ScriptDir "\projects\Untitled(" count ").ahk")
}
upload(winname="Upload"){
static
uphwnd:=setup(10)
window({win:10,gui:["Text,Section,Version:","Edit,w200 vversion x+5 ys-2","text,x+5,.","Edit,x+5 w100 vincrement","UpDown,gincrement Range0-2000 0x80","Text,xs,Version Information:","Edit,w400 h400 vversioninfo"
,"Text,Section,Upload directory:","Edit,vdir w200 x+10 ys-2","Checkbox,vcompile xm,Compile","Checkbox,vgistversion xm,Update Gist Version"
,"Checkbox,vupver,Upload without progress bar (a bit more stable)","Checkbox,vversstyle,Remove (Version=) from the " chr(59) "auto_version"
,"Button,w200 gupload xm Default,Upload"]})
file:=ssn(current(1),"@file").text
Gui,show,AutoSize,%winname%
list:={compile:"Button1",version:"Edit1",increment:"Edit2",dir:"Edit4",gistversion:"Button2",upver:"Button3",versstyle:"Button4"}
for a,b in vversion.ea("//info[@file='" file "']")
GuiControl,10:,% list[a],%b%
GuiControl,10:,Edit3,% vversion.ssn("//info[@file='" file "']").text
ControlFocus,Edit3,% aid(uphwnd)
Send,^{Home}{Down}
return
upload:
gosub 10guiescape
w:=window({get:10})
if w.compile
compile()
f:=new ftp
if f.Error
return
r:=f.put(file,w.dir,w.compile)
if w.gistversion
gist_post_version()
if r
m("Transfer complete")
return
10GuiEscape:
10GuiClose:
file:=ssn(current(1),"@file").text
att:=[],win:=window({get:10})
for a,b in win
if a=versioninfo
text:=b
else
att[a]:=b
att.file:=file
uq:=vversion.unique({path:"info",att:att,check:"file"}),uq.text:=text
vversion.Transform(),vversion.save()
destroy(10)
ftp.cleanup()
return
increment:
info:=window({get:10})
ver:=info.version "." info.increment
if !InStr(info.versioninfo,ver)
ControlSetText,Edit3,% ver "`r`n`r`n" RegExReplace(info.versioninfo,"\n","`r`n"),% aid(uphwnd)
ControlFocus,Edit3,% aid(uphwnd)
Send,^{Home}{Down}
return
}
startup(){
if !FileExist("lib")
FileCreateDir,lib
if !FileExist("Projects")
FileCreateDir,Projects
DetectHiddenWindows,On
}
gui(){
DllCall("LoadLibrary","str","scilexer.dll"),ea:=settings.ea("//font[@style='5']")
Gui,+Resize +hwndmain
Gui,Color,% RGB(ea.Background),ea.color
Gui,Font,% "s10 c" RGB(ea.color),% ea.font
Gui,Add,TreeView,% "w200 h500 Background" RGB(ea.Background) " gtv AltSubmit c" RGB(ea.color)
v.main:=main,num:=settings.ssn("//@number").Text,num:=num?num:1
Loop,% num
new s
Gui,Add,TreeView,% "ym Background" RGB(ea.Background) " c" RGB(ea.color) " w90 AltSubmit gcej sort"
Gui,TreeView,SysTreeView321
Gui,Add,StatusBar,hwndstatus
pos:=settings.ssn("//gui/position").text,pos:=pos?pos:"w" A_ScreenWidth-100 " h" A_ScreenHeight-100
controllist(),arrange(),cf(),options(1)
Gui,show,%pos%,scintilla
if settings.ssn("//position/@max").Text
WinMaximize,% aid()
count=1
Gui,1:Default
GuiControl,-Redraw,SysTreeView321
if !settings.sn("//open/*").length
untitled()
else
open({list:settings.ssn("//open")})
for a,b in v.control{
fname:=files.ssn("//file[@file='" settings.ssn("//last/file[" A_Index "]").text "']")
if !fname
fname:=files.ssn("//main")
if !FileExist(ssn(fname,"@file").text)
fname:=files.ssn("//file/@file/..")
tv({sc:s.ctrl[b],filename:fname}),marginwidth(s.ctrl[b])
}
TV_Modify(files.ssn("//file[@file='" settings.ssn("//last/file[1]").text "']/@tv").text,"Select Focus Vis")
GuiControl,+Redraw,SysTreeView321
}
code_vault(pop=0){
static vault:=new xml("vault","lib\vault.xml"),cv,text
if (pop){
Menu,vault,Add,Edit Vault,editvault
items:=vault.sn("//locker")
while,m:=items.item(a_index-1)
Menu,vault,Add,% ssn(m,"@locker").text,insertcode
Menu,main,Add,Code Vault,:vault
return
}
editvault:
cv:=setup(9)
Gui,Add,ListView,w200 h300 -Multi gvdisplay AltSubmit,Vault
Gui,Add,Edit,w500 h300 x+10 gwritecode
Gui,Add,Button,gaddvault xm,Add Code
Gui,Add,Button,gmd x+10,Remove selected from vault
items:=vault.sn("//locker")
while,m:=items.item(a_index-1)
LV_Add("",ssn(m,"@locker").text)
Gui,show,,Code Vault
return
vdisplay:
if LV_GetNext()=0||A_GuiEvent!="Normal"
return
LV_GetText(locker,LV_GetNext())
ControlSetText,Edit1,% RegExReplace(vault.ssn("//*[@locker='" locker "']").text,"\n","`r`n")
return
md:
if !LV_GetNext()
return
LV_GetText(rem,LV_GetNext())
remove:=vault.ssn("//locker[@locker='" rem "']")
remove.ParentNode.RemoveChild(remove)
Menu,vault,Delete,%rem%
code_vault(1),LV_Delete(LV_GetNext())
return
addvault:
InputBox,new,New Code,Name please
if !new
return
if !vault.ssn("//locker[@locker='" new "']"){
vault.add({path:"locker",att:{locker:new},dup:1}),pos:=LV_Add("",new),LV_Modify(pos,"Select Vis Focus")
code_vault(1)
WinActivate,% aid(cv)
ControlFocus,Edit1,% aid(cv)
ControlSetText,Edit1,,% aid(cv)
}
return
insertcode:
v.sc.2003(v.sc.2008,vault.ssn("//*[@locker='" A_ThisMenuItem "']").text)
return
writecode:
if !LV_GetNext()
return
LV_GetText(cc,LV_GetNext())
ControlGetText,text,Edit1,% aid(cv)
vault.unique({path:"locker",att:{locker:cc},check:"locker"}).text:=text
return
9GuiClose:
9GuiEscape:
if A_Gui=9
vault.Transform(),vault.save()
destroy(A_Gui)
return
}
run_x64(){
save()
SplitPath,A_AhkPath,,apdir
file:=ssn(current(1),"@file").text
SplitPath,file,filename,dir
run,% apdir "\AutoHotkeyU64.exe " Chr(34) filename Chr(34),%dir%
}
compile(){
main:=ssn(current(1),"@file").Text
SplitPath,main,,dir,,name
SplitPath,A_AhkPath,file,dirr
Loop,%dirr%\Ahk2Exe.exe,1,1
file:=A_LoopFileFullPath
FileDelete,temp.upload
FileAppend,% publish(1),temp.upload
SplashTextOn,200,100,Compiling,Please wait.
RunWait,%file% /in temp.upload /out "%dir%\%name%.exe"
If FileExist("upx.exe"){
SplashTextOn,,50,Compressing EXE,Please wait...
RunWait,upx.exe -9 "%dir%\%name%.exe",,Hide
SplashTextOff
}
FileDelete,temp.upload
SplashTextOff
}
marginwidth(sc=""){
sc:=sc?sc:sc:=v.sc
sc.2242(0,sc.2276(32,"a" sc.2154))
}
titlechange(){
WinSetTitle,% aid(),,% "AHK Studio: " ssn(current(),"@file").text
}
Dlg_Font(ByRef Style,Effects=1,window=""){
VarSetCapacity(LOGFONT,60),strput(style.font,&logfont+28,32,"CP0")
LogPixels:=DllCall("GetDeviceCaps","uint",DllCall("GetDC","uint",0),"uint",90),Effects:=0x041+(Effects?0x100:0)
for a,b in font:={16:"bold",20:"italic",21:"underline",22:"strikeout"}
if style[b]
NumPut(b="bold"?700:1,logfont,a)
style.size?NumPut(Floor(style.size*logpixels/72),logfont,0):NumPut(16,LOGFONT,0)
VarSetCapacity(CHOOSEFONT,60,0),NumPut(60,CHOOSEFONT,0),NumPut(&LOGFONT,CHOOSEFONT,12),NumPut(Effects,CHOOSEFONT,20),NumPut(style.color,CHOOSEFONT,24),NumPut(window,CHOOSEFONT,4)
if !r:=DllCall("comdlg32\ChooseFontA", "uint",&CHOOSEFONT)
return
Color:=NumGet(CHOOSEFONT,24)
bold:=NumGet(LOGFONT,16)>=700?1:0
style:={size:NumGet(CHOOSEFONT,16)//10,font:StrGet(&logfont+28,"CP0"),color:color}
for a,b in font
style[b]:=NumGet(LOGFONT,a,"UChar")?1:0
style["bold"]:=bold
return 1
}
cfont(){
return settings.ea("//font[@style='5']")
}
edit_replacements(){
static
er:=setup(7),window({win:7,gui:["ListView,w400 h500,Value|Replacement","Text,,Value:","Edit,x+10 w200 vvalue","Text,xm,Replacement:","Edit,x+10 w200 vreplacement","Button,xm geradd Default,Add","Button,x+10 gerremove,Remove Selected"]}),sn:=settings.sn("//replacements/*")
while,val:=sn.item(A_Index-1)
LV_Add("",ssn(val,"@replace").text,val.text)
LV_Modify(1,"Select Focus Vis"),hotkey({win:er,list:{"~Delete":"err","~BS":"err"}})
Gui,Show,,Replacements
return
eradd:
rep:=window({get:7})
if !(rep.replacement&&rep.value)
return m("both values are required")
if !settings.ssn("//replacements/*[@replace='" rep.value "']")
settings.add({path:"replacements/replacement",att:{replace:rep.value},text:rep.replacement,dup:1}),LV_Add("",rep.value,rep.replacement)
Loop,2
ControlSetText,Edit%A_Index%
ControlFocus,Edit1
return
err:
ControlGetFocus,focus,% aid(er)
if Focus=SysListView321
goto erremove
return
erremove:
Gui,7:Default
while,LV_GetNext(),LV_GetText(value,LV_GetNext())
rem:=settings.ssn("//replacements/*[@replace='" value "']"),LV_Delete(LV_GetNext()),rem.ParentNode.RemoveChild(rem)
return
}
window(info){
static
static variables:=[]
if info.get{
vars:=[],win:=info.get
Gui,%win%:Submit,Nohide
for a,b in variables[info.get]
vars[a]:=%a%
return vars
}
for a,b in info.gui{
StringSplit,b,b,`,
Gui,Add,%b1%,%b2% hwndpoo,%b3%
RegExMatch(b2,"U)\bv(.*\b)",found)
b2:=b3:=""
if found1
variables[info.win,found1]:=1
}
}
snapshot(hwnd,win,list){
offset:=[]
Gui,Show,AutoSize hide
SysGet,border,33
SysGet,Caption,4
VarSetCapacity(size,16,0),DllCall("user32\GetClientRect","uint",hwnd,"uint",&size),w:=NumGet(size,8),h:=NumGet(size,12)
for a,b in list
for c,d in b{
ControlGetPos,x,y,cw,ch,%a%,% aid(hwnd)
if (d="w")
offset[a,d]:=w-cw
if (d="h")
offset[a,d]:=h-ch
if (d="x")
offset[a,d]:=w-(x-Border)
if (d="y")
offset[a,d]:=h-(y-Border-Caption)
}
v["window",win]:=offset
}
controllist(){
control:=[],misc.remove("//scintilla")
WinGet,list,ControlList,% aid()
Loop,Parse,list,`n
if InStr(A_LoopField,"scintilla"){
count++
ControlGet,hwnd,hwnd,,%A_LoopField%,% aid()
control[count]:=hwnd
misc.add({path:"scintilla/control",att:{number:count,sc:hwnd},dup:1})
}
v.control:=control,v.reverse:=reverse
}
winpos(hwnd){
VarSetCapacity(size,16,0),DllCall("user32\GetClientRect","uint",hwnd,"uint",&size),w:=NumGet(size,8),h:=NumGet(size,12)
WinGetPos,x,y,,,% aid(hwnd)
if x&&y&&w&&h
return "x" x " y" y " w" w " h" h
else
return
}
Remove_Spaces_From_Selected(){
sc:=v.sc,pos:=posinfo()
replace:=sc.textrange(pos.start,pos.end)
replace:=RegExReplace(replace," ")
sc.2170(0,replace)
}
class ftp{
__New(){
ea:=settings.ea("//ftp"),this.error:=0
if !(ea.username!=""&&ea.password!=""&&ea.server!="")
return m("Please setup your ftp information in settings"),settings()
port:=ea.port?ea.port:21
SplashTextOn,200,100,Logging In,Please Wait...
this.library:=DllCall("LoadLibrary","str","wininet.dll","Ptr")
this.Internet:=DllCall("wininet\InternetOpen","str",A_ScriptName,"UInt",AccessType,"str",Proxy,"str",ProxyBypass ,"UInt",0,"Ptr")
if !this.internet
this.cleanup(A_LastError)
this.connect:=DllCall("wininet\InternetConnect","PTR",this.internet,"str",ea.Server,"uint",Port,"str",ea.Username,"str",ea.Password,"uint",1,"uint",flags,"uint",0,"Ptr")
if !this.connect{
this.cleanup(A_LastError)
SplashTextOff
}
VarSetCapacity(ret,40)
}
createfile(name){
list:=[]
SplitPath,name,filename,dir,,namenoext
IfNotExist,temp
FileCreateDir,temp
for a,b in [{text:publish(1),name:filename},{text:RegExReplace(vversion.ssn("//info[@file='" name "']").text,"\n","`r`n"),name:namenoext ".text"}]{
FileDelete,% "temp\" b.name
file:=FileOpen("temp\" b.name,2)
file.write(b.text)
file.seek(0)
list[b.name]:=file
if vversion.ssn("//*[@file='" ssn(current(1),"@file").text "']/@upver").text
file.close()
}
return list
}
put(file,dir,compile){
SplashTextOff
updir:="/" Trim(RegExReplace(dir,"\\","/"),"/")
this.cd("/" Trim(RegExReplace(dir,"\\","/"),"/"))
if !(this.internet!=0&&this.connection!=0)
return 0
SplitPath,file,name,dir,,namenoext
list:=this.createfile(file)
BufferSize:=4096
if compile
list[namenoext ".exe"]:=FileOpen(dir "\" namenoext ".exe","r")
upver:=vversion.ssn("//*[@file='" ssn(current(1),"@file").text "']/@upver").text
for a,b in list{
if upver{
ff:=!InStr(a,".exe")?A_ScriptDir "\temp\" a:dir "\" namenoext ".exe"
SplitPath,a,fname
SplashTextOn,300,50,Uploading file %a%,Please Wait...
ii:=DllCall("wininet\FtpPutFile",UPtr,this.connect,UPtr,&ff,UPtr,&fname,UInt,2,UInt,0,"cdecl")
SplashTextOff
}
else
{
ff:=DllCall("wininet\FtpDeleteFile",UPtr,this.connect,UPtr,&a,"cdecl")
this.file:=DllCall("wininet\FtpOpenFile",UPtr,this.connect,UPtr,&a,UInt,0x40000000,UInt,0x2,UPtr,0,"cdecl")
Progress,0,uploading,%a%,Uploading,% cfont().font
if !this.file
this.cleanup(A_LastError)
length:=b.length,totalsize:=0
size:=1,b.seek(0)
while,size{
size:=b.rawread(buffer,BufferSize)
totalsize+=size
Progress,% (totalsize*100)/length
DllCall("wininet\InternetWriteFile","PTR",this.File,"PTR",&Buffer,"UInt",size,"UIntP",out,"cdecl")
sleep,10
;t(this.file,a,close,totalsize,b.length)
}
close:=DllCall("wininet\InternetCloseHandle","UInt",this.file)
sleep,100
b.close()
}
}
t()
list:=""
Progress,Off
}
__Delete(){
this.cleanup
}
cleanup(error*){
if error.1
m(error.1)
SplashTextOff
if (error.1){
this.error:=1
MsgBox,48,AHK Studio,% this.GetLastError(error.1)
}
for a,b in [this.file,this.connect,this.internet]
DllCall("wininet\InternetCloseHandle","UInt",this.internet)
DllCall("FreeLibrary","UInt",this.library)
return 0
}
CD(dir){
available:=DllCall("wininet\FtpSetCurrentDirectory",UInt,this.connect,UPtr,&dir,"cdecl")
if !available
Loop,Parse,dir,/
this.createdir(A_LoopField),this.setdir(A_LoopField)
}
setdir(dir){
DllCall("wininet\FtpSetCurrentDirectory",UInt,this.connect,UPtr,&dir,"cdecl")
}
createdir(dir){
DllCall("wininet\FtpCreateDirectory",UPtr,this.connect,UPtr,&dir,"cdecl")
}
GetDir(){
cap:=VarSetCapacity(dir,128)
DllCall("wininet\FtpGetCurrentDirectory",UInt,this.connect,UInt,&dir,UInt,&cap,"cdecl")
return Trim(StrGet(&dir,128,"cp0"),"/")
}
;http://msdn.microsoft.com/en-us/library/ms679351
GetLastError(error){
size:=VarSetCapacity(buffer,1024)
if (error = 12003){ ;ERROR_INTERNET_EXTENDED_ERROR
VarSetCapacity(ErrorMsg,4)
DllCall("wininet\InternetGetLastResponseInfo","UIntP",&ErrorMsg,"PTR",&buffer,"UIntP",&size)
Return StrGet(&buffer,size)
}
DllCall("FormatMessage","UInt",0x00000800,"PTR",this.library,"UInt",error,"UInt",0,"Str",buffer,"UInt",size,"PTR",0)
Return buffer
}
}
google_search_selected(){
sc:=v.sc,text:=RegExReplace(sc.getseltext()," ","+")
string:="http://www.google.com/search?q=" text
Run,%string%
}
Check_For_New_Version(){
static version
Version=0.001.47
static hh
ver:=URLDownloadToVar("http://maestrith.com/files/AHKStudio/AHK Studio.text")
hh:=setup(12)
Gui,+Resize +hwndhwnd
Gui,Margin,0,0
Gui,Add,Button,%pos% gauto_update,Auto Update
vv:=new s(12)
ControlGetPos,,y,,h,Button1,ahk_id%hh%
ControlMove,Scintilla1,,% h+y,,,ahk_id%hh%
pos:=Settings.ssn("//gui/position[@window='12']").text
pos:=pos?pos:"w800 h700"
snapshot(hwnd,12,{Scintilla1:["w","h"]})
Gui,Show,%pos%,Version : Current Version = %version%
vv.2181(0,ver)
return
12GuiEscape:
12GuiClose:
destroy(12)
return
auto_update:
ext:=A_IsCompiled?".exe":".ahk"
FileMove,%A_ScriptName%,backup-%version%-%A_ScriptName%,1
SplashTextOn,,50,Downloading Update,Please wait...
URLDownloadToFile,http://www.maestrith.com/files/AHKStudio/AHK Studio%ext%,%A_ScriptName%
Run,%A_ScriptName%
ExitApp
return
}
URLDownloadToVar(url){
hObject:=ComObjCreate("WinHttp.WinHttpRequest.5.1")
hObject.Open("GET",url)
hObject.Send()
return hObject.ResponseText
}
filecheck(){
FileGetVersion,ver,scilexer.dll
if (ver!="3.3.4.0")
FileDelete,scilexer.dll
FileInstall,scilexer.dll,scilexer.dll
FileInstall,lib\commands.xml,lib\commands.xml
if !(FileExist("lib\commands.xml")&&FileExist("scilexer.dll"))
SplashTextOn,200,100,Checking for proper files,Please wait...
if !FileExist("lib\commands.xml"),fix:=1
URLDownloadToFile,http://www.autohotkey.net/~maestrith/tempstudio/commands.xml,lib\commands.xml
if !FileExist("scilexer.dll")
urldownloadtofile,http://www.maestrith.com/files/AHKStudio/SciLexer.dll,SciLexer.dll
SplashTextOff
commands:=new xml("commands","lib\commands.xml")
if fix
commands.Transform(),commands.save()
}
post_all_in_one_gist(info=""){
url:="https://api.github.com/gists"
info:=info?info:publish(1)
get_access()
file:=ssn(current(1),"@file").text
id:=positions.ssn("//main[@file='" file "']/@id").text
SplitPath,file,filename
info:=RegExReplace(info,"([" Chr(34) "\\])","\$1")
for a,b in {"`n":"\n","`t":"\t","`r":""}
StringReplace,info,info,%a%,%b%,All
desc=Posted using AHK Studio
http:=ComObjCreate("WinHttp.WinHttpRequest.5.1")
json={"description":"%desc%","public":true,"files":{"%filename%":{"content":"%info%"}}}
check_id(id)
if id
http.Open("PATCH",url "/" id)
else
http.Open("POST",url)
if access_token
http.SetRequestHeader("Authorization","Bearer " access_token)
http.send(json)
codes:=http.ResponseText
split:=http.option(1)
SplitPath,split,fname
m(fname,split)
for a,b in ["html_url","id"]{
split=":"
RegExMatch(codes,"U)" b split "(.*)" chr(34),found)
if b=html_url
clipboard:=RegExReplace(found1,"\\")
else
id:=found1
}
if id{
positions.unique({path:"main",att:{file:file,id:id},check:"file"})
TrayTip,AHK Studio,Gist URL coppied to Clipboard,1
}
else
m("Something went wrong. Here is what the server sent back","","",codes)
}
Post_Multiple_Segment_Gist(){
get_access()
ea:=xml.easyatt(vversion.ssn("//*[@file='" ssn(current(1),"@file").text "']")),newver:=ea.version "." ea.increment
fi:=sn(current(1),"file/@file"),file:=ssn(current(1),"@file").text
id:=positions.ssn("//main[@file='" file "']/@multiple_id").text
url:="https://api.github.com/gists"
if id
id:=check_id(id)
SplitPath,file,filename
desc=Posted using AHK Studio
json={"description":"%desc%","public":true,"files":
json.="{"
udf:=update({get:1})
while,f:=fi.item(A_Index-1).text{
SplitPath,f,filename
info:=udf[f]
if a_index=1
info.=compile_main_gist(f)
json.=json(info,filename)
if (fi.length!=A_Index)
json.=","
}
StringTrimRight,json,json,1
json.="}}"
http:=ComObjCreate("WinHttp.WinHttpRequest.5.1")
if id
http.Open("PATCH",url "/" id)
else
http.Open("POST",url)
http.SetRequestHeader("Authorization","Bearer " access_token)
SplashTextOn,,50,Updating Gist,Please wait...
http.send(json)
codes:=http.ResponseText
for a,b in ["html_url","id"]{
split=":"
RegExMatch(codes,"U)" b split "(.*)" chr(34),found)
if b=html_url
clipboard:=RegExReplace(found1,"\\")
else
id:=found1
}
SplashTextOff
if id{
positions.unique({path:"main",att:{file:file,multiple_id:id},check:"file"})
m("URL Coppied to clipboard")
}
else
m("Something went wrong. Here is what the server sent back","","",codes,http.GetAllResponseHeaders())
}
json(info,filename){
if !RegExReplace(info,"\s"){
info="%filename%":{"content":";blank file"}
return info
}
if InStr(info,Chr(59) "auto_version")
info:=RegExReplace(info,Chr(59) "auto_version","Version=" newver)
info:=RegExReplace(info,"([" Chr(34) "\\])","\$1")
for a,b in {"`n":"\n","`t":"\t","`r":""}
StringReplace,info,info,%a%,%b%,All
next="%filename%":{"content":"%info%"}
return next
}
compile_main_gist(filename){
fn:=sn(current(1),"file/@file")
while,f:=fn.item(A_Index-1).text{
if A_Index=1
continue
SplitPath,f,filename
text.="`r`n" Chr(35) "Include " filename
}
return text
}
get_access(){
if !access_token{
InputBox,access_token,This feature requires an access token from Github to use,Please enter your access token`nor press cancel to be taken to instructions on how to get an access token
if (ErrorLevel||access_token=""){
Run,http://www.autohotkey.com/board/topic/95515-ahk-11-create-a-gist-post/
Exit
}
}
}
cf(con=""){
static last:=""
if IsObject(con){
if !WinExist("ahk_id" con.sc){
con=Scintilla1
goto fixcon
}
v.sc:=con
return last:=con
}
fixcon:
con:=last=""&&!con?"Scintilla1":con
if InStr(con,"scintilla"){
ControlGet,hwnd,hwnd,,%con%,% aid()
last:=s.ctrl[hwnd]
v.sc:=last
}
return last
}
show(window){
pos:=Settings.ssn("//gui/position[@window='" window "']").text
pos:=pos?pos:"AutoSize"
return pos
}
about(){
about:=setup(14)
licence=
(
License for Scintilla and SciTE
Copyright 1998-2002 by Neil Hodgson <[email protected]>
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation.
NEIL HODGSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS, IN NO EVENT SHALL NEIL HODGSON BE LIABLE FOR ANY
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
OR PERFORMANCE OF THIS SOFTWARE.
)
sc:=new s(14)
sc.2181(0,licence)
ControlMove,Scintilla1,,,800,600,% aid(about)
Gui,Show,w800 h600,About
sc.2160(0,0)
return
14GuiClose:
14GuiEscape:
Destroy(14)
return
}
custom_highlight_text(){
static
highlight:=setup(15)
Gui,Add,Text,,Text should be space Delimited (this is a list)
Gui,Add,ListView,w200 h500 AltSubmit gcht,List
Gui,Add,Edit,x+10 w500 h500 gchtedit
Loop,9
LV_Add("","Custom List " A_Index)
Gui,Show,,Custom Highlight Editor
LV_Modify(1,"Select Vis Focus")
return
cht:
if A_GuiEvent not in Normal,I
return
if list:=LV_GetNext()
ControlSetText,Edit1,% settings.ssn("//fonts/highlight/list" list).text,% aid(highlight)
return
chtedit:
if !list:=LV_GetNext()
return
ControlGetText,newtext,Edit1,% aid(highlight)
StringLower,newtext,newtext
hlt:=settings.add({path:"fonts/highlight/list" list,text:newtext,att:{list:list}})
if !newtext
return hlt.ParentNode.RemoveChild(hlt)
return
15GuiEscape:
15GuiClose:
Destroy(15),keywords(),list:=[]
parent:=settings.ssn("//fonts/highlight")
fix:=settings.sn("//fonts/highlight/*")
while,ff:=fix.item(A_Index-1)
list[ssn(ff,"@list").text]:=ff
for a,b in list
parent.AppendChild(b)
if v.theme
if WinExist(aid(v.Theme)){
v.themesc.2181(0,themetext())
color(v.themesc)
}
for a,b in v.control
color(s.ctrl[b])
return
}
restore_current_file(){
file:=ssn(current(),"@file").text
SplitPath,file,filename,dir
restore:=setup(16)
Gui,+Resize
Gui,Add,ListView,x0 y0 w350 h480 altsubmit grestore,Backup
Gui,Add,Edit,x+10 w550 h480
Gui,Add,Button,x0 grestorefile Default,Restore selected file
snapshot(restore,16,{SysListView321:["h"],Edit1:["w","h"],Button1:["y"]})
SplashTextOn,,50,Collecting backup files,Please wait...
loop,% dir "\backup\" filename,1,1
{
StringSplit,new,A_LoopFileDir,\
last:=new0,d:=new%last%
lv_add("",d)
}
LV_Modify(1,"select Focus")
SplashTextOff
Gui,Show,% show(16),Restore
Restore:
file:=ssn(current(),"@file").text
SplitPath,file,filename,dir
LV_GetText(bdir,LV_GetNext())
FileRead,contents,% dir "\backup\" bdir "\" filename
ControlSetText,Edit1,%contents%
return
restorefile:
ControlGetText,contents,Edit1
v.sc.2181(0,contents)
16GuiClose:
16GuiEscape:
Destroy(16)
return
}
gist_post_version(){
name:=ssn(current(1),"@file").text
url:="https://api.github.com/gists"
info:=vversion.ssn("//info[@file='" name "']").text
SplitPath,name,,,,nn
json:=json(info,nn)
get_access()
http:=ComObjCreate("WinHttp.WinHttpRequest.5.1")
file:=ssn(current(1),"@file").text
id:=positions.ssn("//main[@file='" file "']/@version").text
desc:="Posted with AHK Studio"
json=
(
{"description":"%desc%","public":true,"files":{%json%}}
)
check_id(id)
if id
http.Open("PATCH",url "/" id)
else
http.Open("POST",url)
if access_token
http.SetRequestHeader("Authorization","Bearer " access_token)
http.send(json)
codes:=http.ResponseText
for a,b in ["html_url","id"]{
split=":"
RegExMatch(codes,"U)" b split "(.*)" chr(34),found)
if b=html_url
hurl:=RegExReplace(found1,"\\")
else
id:=found1
}
if id{
positions.unique({path:"main",att:{file:file,version:id},check:"file"})
MsgBox,36,Gist Posted,Copy URL to Clipboard?
IfMsgBox,No
return
Clipboard:=hurl
TrayTip,AHK Studio,URL Coppied to clipboard,1
}
else
m("Something went wrong. Here is what the server sent back","","",codes)
}
edit_version_info(){
upload("Edit Version Info")
}
;http://www.autohotkey.com/community/viewtopic.php?t=63916
DynaRun(TempScript, pipename=""){
static _:="uint"
@:=A_PtrSize?"Ptr":_
If pipename=
name := "AHK" A_TickCount
Else
name := pipename
__PIPE_GA_ := DllCall("CreateNamedPipe","str","\\.\pipe\" name,_,2,_,0,_,255,_,0,_,0,@,0,@,0)
__PIPE_ := DllCall("CreateNamedPipe","str","\\.\pipe\" name,_,2,_,0,_,255,_,0,_,0,@,0,@,0)
if (__PIPE_=-1 or __PIPE_GA_=-1)
Return 0
Run, %A_AhkPath% "\\.\pipe\%name%",,UseErrorLevel HIDE, PID
If ErrorLevel
MsgBox, 262144, ERROR,% "Could not open file:`n" __AHK_EXE_ """\\.\pipe\" name """"
DllCall("ConnectNamedPipe",@,__PIPE_GA_,@,0)
DllCall("CloseHandle",@,__PIPE_GA_)
DllCall("ConnectNamedPipe",@,__PIPE_,@,0)
script := (A_IsUnicode ? chr(0xfeff) : (chr(239) . chr(187) . chr(191))) . TempScript
if !DllCall("WriteFile",@,__PIPE_,"str",script,_,(StrLen(script)+1)*(A_IsUnicode ? 2 : 1),_ "*",0,@,0)
Return A_LastError
DllCall("CloseHandle",@,__PIPE_)
Return PID
}
Run_Selected_Text(){
VarSetCapacity(text,v.sc.2161)
v.sc.2161(0,&text)
text:=StrGet(&text,"cp0")
if text
dynarun(text)
}
show_file(){
file:=ssn(current(),"@file")
f:=file.text
file:="/select," chr(34) file.text chr(34)
run explorer.exe %file%
}
Remove_Current_Segment(){
current:=ssn(current(),"@file")
main:=ssn(current(1),"@file").text
ctv:=ssn(current(),"@tv").text
if (current.text=main)
return m("You can not remove the main Segment from a program")
MsgBox,4,Remove Current Segment,Remove the current segment?
IfMsgBox,No
return
cc:=ssn(current(1),"file")
ctv:=ssn(current(),"@tv").text
current().ParentNode.RemoveChild(current())
TV_Delete(ctv)
tv({sc:v.sc,filename:cc})
update({up:1})[main]:=1
MsgBox,260,Remove Current Segment,Delete Segment File?
IfMsgBox,No
return
FileDelete,% current.text
}
export(){
FileSelectFile,file,S16,,Export File,*.ahk
if ErrorLevel
return
file:=InStr(file,".ahk")?file:file ".ahk"
if FileExist(file)
FileDelete,%file%
FileAppend,% publish(1),%file%
}
Refresh_Code_Explorer(update=""){
static
global width
explore:=[]
Gui,1:TreeView,SysTreeView322
GuiControl,-Redraw,SysTreeView322
TV_Delete()
loop:=sn(current(1),"*")
functions:=TV_Add("Functions"),labels:=TV_Add("Labels"),hotkeys:=TV_Add("Hotkeys"),class:=TV_Add("Class")
codes:=update({get:1})
while,out:=ssn(loop.item[a_index-1],"@file"){
code:=codes[out.text]
for a,b in {hotkeys:"::",labels:":(\s+;.+)?`r",class:"(\s+;.+\s+)?(\s+)?{",functions:"\((.+)?\)(\s+;.+\s+)?(\s+)?{"}{
pos:=1,find:=a!="class"?"^([\W\s+]?\w+)":"^[\s+]?class\s+(\w+)"
while,pos:=RegExMatch(code,"OUim)" find b,fun,pos){
tt:=TV_Add(fun.value(1),%a%,"Sort")
explore[tt]:={file:out.text,pos:fun.pos(1)-1}
pos:=fun.pos(1)+1
}
}
}
GuiControl,+Redraw,SysTreeView322
Gui,1:TreeView,SysTreeView321
return
cej:
if A_GuiEvent!=Normal
return
Gui,1:TreeView,SysTreeView322
if found:=explore[TV_GetSelection()]{
TV_GetText(ff,TV_GetSelection())
tv({filename:ssn(current(1),"//*[@file='" found.file "']")})
v.sc.2160(found.pos,found.pos+StrLen(ff)),v.sc.2169,v.sc.2400
}
return
}
/*
@flan(){
}
*/
ideas(){
mainfile:=ssn(current(1),"@file").text
v.ideas:=setup(19)
Gui,+Resize
Gui,Add,Edit,gideas Multi,% idea.ssn("//*[@file='" mainfile "']").text
snapshot(v.ideas,19,{Edit1:["w","h"]})
Gui,Show,% show(19),Ideas
Gui,1:-Disabled
settings.add({path:"ideas"}).text:=1
return
ideas:
mainfile:=ssn(current(1),"@file").text
ControlGetText,text,Edit1,% aid(v.ideas)
idea.unique({path:"ideas",att:{file:mainfile},check:"file"}).text:=text
return
19GuiEscape:
19GuiClose:
settings.add({path:"ideas"}).text:=0
Destroy(19)
return
}
options(value=""){
static options:={Virtual_Space:{0:3,3:0,code:2596}
,Line_Highlight:{0:3,3:0,code:2096},Auto_Indent:{0:1,1:0}
,Show_End_Of_Line:{0:1,1:0,code:2356},Show_Selected_Duplicates:{0:1,1:0}
,Word_Wrap:{0:1,1:0,code:2268}}
sc:=v.sc
if !IsObject(v.options)
v.options:=[]
if (value=1){
for a,b in options{
setting:=settings.ssn("//options/" a).text
if b.code&&setting
sc[b.code](setting)
v.options[a]:=setting
}
}
if (value&&value!=1){
if !set:=settings.ssn("//options/" value)
set:=settings.add({path:"options/" value})
set.text:=set.text?set.text:0
Menu,options,ToggleCheck,% A_ThisMenuItem
set.text:=options[value,set.text]
if options[value].code
sc[options[value].code](set.text)
v.options[value]:=set.text
}
return options
}
widths(){
static
cew:
ControlGetPos,,,w,,SysTreeView322,% aid()
WinGetPos,,,ww,,% aid()
setup(18)
max:=ww-500
Gui,Add,Text,,Adjust the File Explorer (Left TreeView)
Gui,Add,Slider,range20-%max% gfewidth vfewidth AltSubmit,%w%
Gui,Add,Text,,Adjust the Code Explorer (Right TreeView)
Gui,Add,Slider,range20-%max% gwidth vwidth AltSubmit,%w%
Gui,Show,,Width
return
fewidth:
Gui,18:Submit,Nohide
settings.add({path:"file_explorer",text:fewidth})
arrange(1)
width:
Gui,18:Submit,Nohide
settings.add({path:"code_explorer",text:width})
arrange(1)
return
18GuiClose:
18GuiEscape:
Destroy(18)
return
}
check_id(id){
http:=ComObjCreate("WinHttp.WinHttpRequest.5.1")
http.Open("GET","https://api.github.com/gists/" id "/star")
http.SetRequestHeader("Authorization","Bearer " access_token)
http.send(),code:=http.ResponseText
http:=""
if InStr(code,"not found")
return
return id
}
Linked_Scroll_Up(){
for a,b in v.control
s.ctrl[b].2168(0,-1)
}
Linked_Scroll_Down(){
for a,b in v.control
s.ctrl[b].2168(0,1)
}
GuiDropFiles:
cur:=current(1)
Loop,Parse,A_GuiEvent,`n,`r`n
{
SplitPath,A_LoopField,filename,dir,ext
if (ext="ahk"||ext="txt"||ext=""){
if ssn(cur,"//*[contains(@file,'" filename "')]"){
InputBox,filename,File Exists!,Segment with the filename "%filename%" already exists.`n`nRename the new segment in the field below or select cancel to not import this file.
if ErrorLevel||filename=""
continue
}
FileRead,out,%A_LoopField%
newfile:=dir "\" filename
if FileExist(newfile)
FileDelete,%newfile%
new_segment(newfile,1)
FileAppend,%out%,%dir%\%filename%
update({file:newfile,text:out})
newfile:=1
}
else
m("File formats supported are *.ahk,*.txt, or files without extensions")
update({up:1})[ssn(cur,"@file").text]:=1
}
return
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment