Created
April 2, 2014 23:30
-
-
Save maestrith/9945432 to your computer and use it in GitHub Desktop.
Posted using AHK Studio
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #SingleInstance,Off | |
| ;download complete | |
| DetectHiddenWindows,On | |
| OnMessage(0x4a,"WM_COPYDATA") | |
| if (AID:=OtherInstance()){ | |
| File=%1% | |
| Send_WM_COPYDATA(AID,File) | |
| ExitApp | |
| } | |
| SetWorkingDir,%A_ScriptDir% | |
| settings:=new xml("settings","lib\settings.xml"),files:=new xml("files"),menus:=new xml("menus","lib\menus.xml"),commands:=new xml("commands","lib\commands.xml") | |
| positions:=new xml("positions","lib\positions.xml"),vversion:=new xml("version","lib\version.xml"),access_token:=settings.ssn("//access_token").text | |
| vault:=new xml("vault","lib\vault.xml") | |
| global v:=[],settings,files,menus,commands,positions,vversion,access_token,vault,preset | |
| v.color:=[],preset:=new xml("preset","lib\preset.xml") | |
| if (A_PtrSize=8&&A_IsCompiled=""){ | |
| SplitPath,A_AhkPath,,dir | |
| correct:=dir "\AutoHotkeyU32.exe" | |
| if !FileExist(correct){ | |
| m("Requires AutoHotkey 1.1 to run") | |
| ExitApp | |
| } | |
| run,"%correct%" "%A_ScriptName%",%A_ScriptDir% | |
| ExitApp | |
| return | |
| } | |
| filecheck(),v.quick:=[] | |
| Menu,Tray,Icon,AHKStudio.ico | |
| keywords(),gui() | |
| openfile=%1% | |
| if openfile contains .ahk,.txt,.ini | |
| open(openfile) | |
| return | |
| GuiDropFiles: | |
| open(A_GuiEvent) | |
| return | |
| about(){ | |
| about= | |
| ( | |
| I want to thank all of the people who helped this project become a reality. | |
| Chris Mallet - Creator of the original AutoHotkey | |
| All of the people who helped him. | |
| Lexikos - For all of the amazing work on AHK 1.1 | |
| All of the people who helped him. | |
| Help from friends who have given me great ideas and bug reports | |
| Uberi,Coco,Tidbit,GeekDude,joedf,budRich and everyone who I have not listed I am thankful. | |
| All of the editors that I have used for giving me ideas for this project | |
| License for Scintilla and SciTE | |
| Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org> | |
| 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. | |
| ) | |
| setup(11),hotkeys([11],{"Esc":"11GuiClose"}) | |
| Gui,Margin,0,0 | |
| sc:=new s(11,{pos:"x0 y0 w700 h500"}),csc({hwnd:sc}) | |
| Gui,Show,,AHK Studio Help | |
| sc.2181(0,about),sc.2025(0) | |
| return | |
| } | |
| addbutton(this){ | |
| static bar | |
| v.bar:=bar:=this | |
| ComObjError(1) | |
| setup(12) | |
| Gui,Add,ListView,w400 h300,Menu Items | |
| menu:=menus.sn("//*") | |
| while,mm:=menu.item[A_Index-1]{ | |
| mname:=clean(ssn(mm,"@name").text) | |
| if (mname&&InStr(mname,"---")=0&&(IsFunc(mname)||IsLabel(mname))) | |
| LV_Add("",mname) | |
| } | |
| Gui,Add,Button,gabrun,Add A Launch Button | |
| Gui,Add,Button,gabmenu,Add A Menu Button | |
| Gui,Show,,Add Buttons | |
| return | |
| this.add({icon:4,file:"shell32.dll",text:"flap",func:"flan",id:11100,state:4}) | |
| this.addbutton(11100) | |
| return | |
| 12GuiEscape: | |
| 12GuiClose: | |
| hwnd({rem:12}) | |
| return | |
| abrun: | |
| abmenu: | |
| newid:=11099 | |
| while,settings.ssn("//toolbar/bar[@id='" bar.id "']/button[@id='" ++newid "']"){ | |
| } | |
| under:=settings.ssn("//toolbar/bar[@id='" bar.id "']") | |
| if (A_ThisLabel="abrun"){ | |
| FileSelectFile,filename | |
| if ErrorLevel | |
| return | |
| SplitPath,filename,,,,nne | |
| iconfile:=InStr(filename,".ahk")?A_AhkPath:filename | |
| att:={icon:0,file:iconfile,text:nne,func:"runfile",id:newid,state:4,runfile:filename} | |
| bar.add(att) | |
| bar.addbutton(newid) | |
| settings.under({under:under,node:"button",att:att}) | |
| }else{ | |
| LV_GetText(item,LV_GetNext()) | |
| text:=RegExReplace(item,"_"," ") | |
| att:={icon:1,file:"shell32.dll",text:text,func:item,id:newid,state:4} | |
| bar.add(att) | |
| bar.addbutton(newid) | |
| settings.under({under:under,node:"button",att:att}) | |
| } | |
| return | |
| outside: | |
| m(bar.ahkid) | |
| return | |
| } | |
| arrows(){ | |
| left: | |
| right: | |
| sc:=csc() | |
| selcount:=sc.2570 | |
| pos:=[] | |
| current:=sc.2008,canchor:=sc.2009 | |
| if selcount>1 | |
| loop,%selcount%{ | |
| pos[A_Index-1]:={caret:sc.2577(A_Index-1),anchor:sc.2579(A_Index-1)} | |
| } | |
| ControlGetFocus,Focus,% hwnd([1]) | |
| if !InStr(Focus,"scintilla"){ | |
| Send,{%A_ThisLabel%} | |
| return | |
| } | |
| Send,{%A_ThisLabel%} | |
| notify(sc) | |
| for a,b in pos{ | |
| add:=A_ThisLabel="left"?-1:1 | |
| if (b.caret!=b.anchor){ | |
| if (A_ThisLabel="left"&&b.caret!=current){ | |
| use:=b.caret>b.anchor?b.anchor:b.caret | |
| sc.2573(use,use) | |
| }else if (A_ThisLabel="right"&&b.anchor!=canchor){ | |
| use:=b.caret>b.anchor?b.caret:b.anchor | |
| sc.2573(use,use) | |
| } | |
| }else if (b.caret!=current) | |
| sc.2573(b.caret+add,b.caret+add) | |
| } | |
| if selcount>1 | |
| sc.2606 | |
| return | |
| +left: | |
| +right: | |
| ControlGetFocus,Focus,% hwnd([1]) | |
| if !InStr(Focus,"scintilla"){ | |
| Send,{%A_ThisLabel%} | |
| return | |
| } | |
| Send,{%A_ThisLabel%} | |
| sc:=csc() | |
| selcount:=sc.2570,pos:=[] | |
| if (selcount>1){ | |
| loop,%selcount% | |
| pos[A_Index-1]:={start:sc.2577(A_Index-1),end:sc.2579(A_Index-1)} | |
| for a,b in pos{ | |
| add:=A_ThisHotkey="+left"?-1:1 | |
| cursor:=b.start,anchor:=b.end+add | |
| if A_Index=1 | |
| sc.2160(anchor,cursor) | |
| else | |
| sc.2573(cursor,anchor) | |
| } | |
| sc.2606 | |
| }else{ | |
| label:=SubStr(A_ThisLabel,2) | |
| Send,+{%label%} | |
| } | |
| return | |
| } | |
| +!Down:: | |
| +!Up:: | |
| sc:=csc(),line:=sc.2166(sc.2008) | |
| column:=sc.2129(sc.2008) | |
| nl:=A_ThisLabel="+!up"?-1:1 | |
| next:=sc.2456(line+nl,column) | |
| if (next){ | |
| sc.2573(next,next) | |
| } | |
| return | |
| Check_For_Update(){ | |
| static version | |
| version=0.001.4 | |
| Gui,55:Destroy | |
| Gui,55:Default | |
| Gui,Add,Edit,w500 h500,% URLDownloadToVar("http://files.maestrith.com/alpha/Studio/AHK Studio.text") | |
| Gui,Add,Button,gautoupdate,Update | |
| Gui,Show,,AHK Studio Version %version% | |
| return | |
| autoupdate: | |
| version=0.001.4 | |
| save(),settings.save(1) | |
| SplitPath,A_ScriptName,,,ext,name | |
| if !InStr(ext,"exe"){ | |
| studio:=URLDownloadToVar("http://files.maestrith.com/alpha/Studio/AHK Studio.ahk") | |
| if !InStr(studio,";download complete") | |
| return m("There was an error. Please contact maestrith@gmail.com if this error continues") | |
| FileMove,%A_ScriptName%,%name%%version%.ahk,1 | |
| FileAppend,%studio%,%A_ScriptName% | |
| Run,%A_ScriptName% | |
| ExitApp | |
| }else{ | |
| URLDownloadToFile,http://files.maestrith.com/alpha/Studio/AHK Studio.exe,AHK Studio temp.exe | |
| FileGetSize,size,AHK Studio temp.exe | |
| if (size>1000){ | |
| FileMove,%A_ScriptName%,%name%%version%,1 | |
| FileMove,AHK Studio temp.exe,%A_ScriptName%,1 | |
| Run,%A_ScriptName% | |
| ExitApp | |
| } | |
| } | |
| return | |
| 55GuiEscape: | |
| 55GuiClose: | |
| Gui,55:Destroy | |
| return | |
| } | |
| automenu(){ | |
| automenu: | |
| SetTimer,automenu,Off | |
| if v.word | |
| if (l:=commands.ssn("//Context/*/*[text()='" RegExReplace(v.word,"#") "']/@list").text) | |
| sc:=csc(),sc.2100(0,l),v.word:="" | |
| return | |
| } | |
| brace(){ | |
| brace: | |
| sc:=csc(),cp:=sc.2008,line:=sc.2166(cp),min:=posinfo() ;,min:=mm(sc) | |
| v.lastbrace:=A_ThisHotkey | |
| if sc.2102 | |
| sc.2104 | |
| ControlGetFocus,Focus,A | |
| if !InStr(Focus,"Scintilla"){ | |
| Send,{%A_ThisHotkey%} | |
| return | |
| } | |
| selcount:=sc.2570 | |
| pos:=[],count:=0,rev:=[] | |
| loop,%selcount% | |
| { | |
| pos[sc.2008]:={start:sc.2008,end:sc.2009} | |
| sc.2606 | |
| count++ | |
| } | |
| for a,b in pos | |
| rev.Insert(pos[a]) | |
| if (A_ThisHotkey="{"&&sc.2128(line)=cp&&cp=sc.2136(line)){ | |
| sc.2003(cp,"{`n`n}") | |
| fix_indent() | |
| Send,{Down} | |
| sc.2314 | |
| }else{ | |
| sc.2078() | |
| for a in rev{ | |
| b:=rev[rev.maxindex()-A_Index+1] | |
| mm:=[] | |
| mm[b.start]:=1,mm[b.end]:=1 | |
| sc.2003(mm.MinIndex(),A_ThisHotkey) | |
| sc.2003(mm.MaxIndex()+1,v.brace[A_ThisHotkey]) | |
| } | |
| for a,b in rev{ | |
| if A_Index=1 | |
| sc.2160(b.start+1,b.end+1) | |
| else | |
| sc.2573(b.end+(A_Index*2)-1,b.start+(A_Index*2)-1) | |
| } | |
| sc.2079 | |
| } | |
| width:=sc.2276(32,"a") | |
| text1:="Last Entered Character: " A_ThisHotkey " Code:" Asc(A_ThisHotkey) | |
| SB_SetText(text1,2),SB_SetParts(first,width*StrLen(text1 1),40) | |
| last:=width*StrLen(text1 1) | |
| replace() | |
| return | |
| } | |
| bracesetup(win=1){ | |
| v.brace:=[] | |
| autoadd:=settings.sn("//autoadd/*") | |
| Hotkey,IfWinActive,% hwnd([win]) | |
| while,aa:=autoadd.item(a_index-1){ | |
| ea:=xml.ea(aa) | |
| if (ea.trigger){ | |
| Hotkey,% Chr(ea.trigger),brace,On | |
| v.brace[Chr(ea.trigger)]:=Chr(ea.add) | |
| } | |
| } | |
| } | |
| 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 | |
| } | |
| class ftp{ | |
| __New(name){ | |
| ea:=settings.ea("//ftp/server[@name='" name "']"),this.error:=0 | |
| if !(ea.username!=""&&ea.password!=""&&ea.address!="") | |
| return m("Please setup your ftp information"),ftp_servers() | |
| 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.address,"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 | |
| FileDelete,% "temp\" filename | |
| file:=FileOpen("temp\" filename,2) | |
| file.write(publish(1)) | |
| file.seek(0) | |
| List[filename]:=file | |
| FileDelete,% "temp\" namenoext ".text" | |
| file:=FileOpen("temp\" namenoext ".text",2) | |
| file.write(RegExReplace(vversion.ssn("//info[@file='" name "']").text,"\n","`r`n")) | |
| file.seek(0) | |
| List[namenoext ".text"]:=file | |
| 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,Tahoma ;% 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 | |
| } | |
| 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 | |
| } | |
| } | |
| class s{ | |
| static ctrl:=[],lc:="",main:=[] | |
| __New(window,info){ | |
| static int | |
| if !init | |
| DllCall("LoadLibrary","str","scilexer.dll"),init:=1 | |
| win:=window?window:1 | |
| static count=1 | |
| pos:=info.pos?info.pos:"x0 y0" | |
| if info.hide | |
| pos.=" Hide" | |
| notify:=info.label?info.label:"notify" | |
| Gui,%win%:Add,custom,classScintilla hwndsc w500 h400 %pos% +1387331584 g%notify% | |
| 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) | |
| v.focus:=sc | |
| this.2660(1) | |
| for a,b in [[2563,1],[2565,1],[2614,1],[2402,0x15,75],[2124,1]]{ | |
| b.2:=b.2?b.2:0,b.3:=b.3?b.3:0 | |
| this[b.1](b.2,b.3) | |
| } | |
| if info.main | |
| s.main.Insert(this) | |
| this.2052(32,0),this.2051(32,0xaaaaaa),this.2050,this.2052(33,0x222222) | |
| ;for a,b in [[2036,5],[2029,0],[2124,1],[2260,1]] | |
| ;this.2029(0) | |
| ;this.2356(1) ;view EOL on | |
| this.2069(0xAAAAAA),this.2067(1,0),this.2601(0xaa88aa) | |
| this.2563(1),this.2614(1),this.2565(1),this.2402(0x15,75) | |
| this.2660(1),this.2458(0) | |
| this.2036(5),this.2124(1),this.2260(1),this.2122(5),this.2132(1) | |
| ;this.2359(0x13) | |
| color(this) | |
| return this | |
| } | |
| delete(x*){ | |
| if s.main.MaxIndex()=1 | |
| return m("Can not delete the last control") | |
| this:=x.1 | |
| for a,b in s.main{ | |
| if (b.sc=this.sc) | |
| s.main.remove(a) | |
| } | |
| DllCall("DestroyWindow",uptr,this.sc) | |
| csc("Scintilla1").2400 | |
| Resize() | |
| } | |
| __Delete(x*){ | |
| 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="getline"){ | |
| length:=this.2350(lparam) | |
| cap:=VarSetCapacity(text,length,0),this.2153(lparam,&text) | |
| return StrGet(&text,length,"cp0") | |
| } | |
| if (code="gettext"){ | |
| cap:=VarSetCapacity(text,vv:=this.2182),this.2182(vv,&text),t:=strget(&text,vv,"cp0") | |
| return t | |
| } | |
| if (code="getuni"){ | |
| cap:=VarSetCapacity(text,vv:=this.2182),this.2182(vv,&text),t:=StrGet(&text,vv,"utf-8") | |
| return t | |
| } | |
| wp:=(wparam+0)!=""?"Int":"AStr" | |
| if wparam.1 | |
| wp:="AStr" | |
| if wparam=0 | |
| wp:="int" | |
| info:=DllCall(this.fn,"Ptr",this.ptr,"UInt",code,"int",lparam,wp,wparam,"Cdecl") | |
| return info | |
| } | |
| show(){ | |
| GuiControl,+Show,% this.sc | |
| } | |
| } | |
| clean(clean,tab=""){ | |
| clean:=RegExReplace(RegExReplace(clean,"&")," ","_") | |
| if InStr(clean,"`t") | |
| clean:=SubStr(clean,1,InStr(clean,"`t")-1) | |
| return clean | |
| } | |
| close(){ | |
| sc:=csc(),save() | |
| main:=files.ssn("//*[@sc='" sc.2357 "']..") | |
| rem:=settings.sn("//file[text()='" ssn(main,"@file").text "']") | |
| while,rr:=rem.item[A_Index-1] | |
| rr.ParentNode.RemoveChild(rr) | |
| udf:=update("get").1 | |
| close:=sn(main,"*") | |
| Gui,1:Default | |
| Gui,1:TreeView,SysTreeView321 | |
| while,cc:=close.item[A_Index-1]{ | |
| ea:=xml.ea(cc) | |
| if ea.tv | |
| TV_Delete(ea.tv) | |
| if ea.sc | |
| sc.2377(0,ea.sc) | |
| udf.Remove(ea.file) | |
| } | |
| TV_Modify(TV_GetNext(0),"Select Vis Focus") | |
| main.ParentNode.RemoveChild(main) | |
| if files.sn("//*").length=1 | |
| new(1) | |
| } | |
| Code_Vault(){ | |
| static ev,mainfile | |
| v.lastsc:=csc() | |
| mainfile:=ssn(current(1),"@file").text | |
| setup(19) | |
| Gui,Add,ListView,w100 h400 AltSubmit gdisplayvault,Code | |
| v.codevault:=new s(19,{pos:"x+10 w600 h400"}),csc({hwnd:v.codevault.sc}),hotkeys([19],{esc:"19GuiClose"}) | |
| sc:=csc(),sc.2400,sc.2171(1),bracesetup(19) | |
| Gui,Add,Button,xm gaddcode,Add Code | |
| Gui,Add,Button,x+10 ginsertcode,Insert Into Segment | |
| pupulatevault: | |
| locker:=vault.sn("//code") | |
| LV_Delete() | |
| while,ll:=locker.item[A_Index-1] | |
| LV_Add("",ssn(ll,"@name").text) | |
| LV_Modify(1,"Vis Focus Select") | |
| Gui,Show,,Code Vault | |
| Return | |
| insertcode: | |
| text:=csc().gettext() | |
| sc:=v.lastsc | |
| sc.2003(sc.2008,text) | |
| fix_indent(sc) | |
| return | |
| 19GuiClose: | |
| 19GuiEscape: | |
| hwnd({rem:19}) | |
| Return | |
| addcode: | |
| InputBox,newcode,Name for code snippet,Please enter a name for a new code snippet. | |
| if ErrorLevel | |
| return | |
| if !locker:=vault.ssn("//code[@name='" newcode "']") | |
| locker:=vault.Add({path:"code",att:{name:newcode},dup:1}) | |
| Gosub,pupulatevault | |
| return | |
| displayvault: | |
| sc:=csc() | |
| if LV_GetNext() | |
| sc.2171(0) | |
| LV_GetText(code,LV_GetNext()) | |
| sc.2181(0,vault.ssn("//code[@name='" code "']").text),sc.2400 | |
| return | |
| } | |
| 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 | |
| } | |
| 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 | |
| } | |
| connect(){ | |
| ScriptPath:=A_ScriptDir | |
| if debug("check"){ | |
| debug("send","detatch") | |
| sleep,500 | |
| debug("disconnect") | |
| sleep,500 | |
| } | |
| setup(13) | |
| Gui,Add,ListView,w600 h300 gdebugconnect,Processes | |
| for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process"){ | |
| prog:=Trim(StrSplit(process.CommandLine,Chr(34)).4,Chr(34)) | |
| if (InStr(process.commandline,"autohotkey")&&prog!=A_ScriptFullPath&&prog) | |
| LV_Add("",prog) | |
| } | |
| Gui,13:Show,,Open Processes | |
| return | |
| debugconnect: | |
| Gui,13:Default | |
| Gui,13:ListView,SysListView321 | |
| LV_GetText(scriptpath,A_EventInfo) | |
| ifWinExist %ScriptPath% ahk_class AutoHotkey | |
| { | |
| socket:=debug("new") | |
| PostMessage,DllCall("RegisterWindowMessage","str","AHK_ATTACH_DEBUGGER") | |
| } | |
| 13GuiClose: | |
| 13GuiEscape: | |
| hwnd({rem:13}) | |
| return | |
| } | |
| context(){ | |
| sc:=csc() | |
| if sc.2102 | |
| return | |
| cp:=sc.2008,kw:=v.kw,add:=0,pos:=cp-1,start:=sc.2128(sc.2166(cp)) | |
| if (start>=pos+1) | |
| return | |
| content:=sc.textrange(start,pos+1) | |
| 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) | |
| if !sc.2202 | |
| 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 | |
| context: | |
| SetTimer,context,Off | |
| context() | |
| return | |
| } | |
| convert_hotkey(key){ | |
| StringUpper,key,key | |
| for a,b in [{Shift:"+"},{Ctrl:"^"},{Alt:"!"}] | |
| for c,d in b | |
| key:=RegExReplace(key,"\" d,c "+") | |
| return key | |
| } | |
| Toggle_Multiple_Line_Comment(){ | |
| sc:=csc(),pos:=posinfo() | |
| if (sc.2010(sc.2008)!=11&&sc.2010(sc.2009)!=11){ | |
| start:=sc.2128(sc.2166(pos.start)),end:=sc.2136(sc.2166(pos.end)) | |
| sc.2003(start,inline "/*`n") | |
| if (pos.start=pos.end) | |
| sc.2003(end+4,"*/`n") | |
| else | |
| sc.2003(end+4,"*/`n") | |
| }else{ | |
| /* | |
| top:=sc.2225(sc.2166(sc.2008)) | |
| bottom:=sc.2224(top,-1) | |
| if (top>=0&&bottom>=0){ | |
| for a,b in [bottom,top]{ | |
| start:=sc.2167(b),end:=sc.2167(b+1)-start | |
| if end<4 | |
| start:=start-(4-end),end:=4 | |
| sc.2645(start,end) | |
| } | |
| } | |
| */ | |
| } | |
| fix_indent() | |
| } | |
| Create_Segment_From_Selection(){ | |
| pos:=posinfo(),sc:=csc() | |
| if (pos.start=pos.end) | |
| return m("Please select some text to create a new segment from") | |
| else{ | |
| InputBox,newsegment,Please Name Your New Segment,Please enter a name for your new segment | |
| if ErrorLevel | |
| return | |
| filename:=ssn(current(1),"@file").text,newsegment:=InStr(newsegment,".ahk")?newsegment:newsegment ".ahk" | |
| SplitPath,filename,,dir | |
| if FileExist(dir "\" newsegment) | |
| return m("Segment name already exists. Please choose another") | |
| clip:=Clipboard | |
| sc.2177 | |
| new_segment(dir "\" newsegment,clipboard) | |
| clipboard:=clip | |
| } | |
| } | |
| csc(set=0){ | |
| static current | |
| global findme | |
| if (set.hwnd) | |
| return current:=s.ctrl[set.hwnd] | |
| if (set=1){ | |
| ControlGetFocus,focus,A | |
| if !InStr(focus,"Scintilla") | |
| return | |
| ControlGet,hwnd,hwnd,,%focus%,A | |
| if s.ctrl[hwnd] | |
| current:=s.ctrl[hwnd] | |
| current.2400 | |
| return current | |
| return | |
| } | |
| if InStr(set,"Scintilla"){ | |
| ControlGet,hwnd,hwnd,,%set%,% hwnd([1]) | |
| current:=s.ctrl[hwnd] | |
| return current | |
| } | |
| if !current{ | |
| ControlGet,hwnd,hwnd,,Scintilla1,% hwnd([1]) | |
| current:=s.ctrl[hwnd] | |
| } | |
| FINDME:=current | |
| return current | |
| } | |
| current(parent=""){ | |
| sc:=csc() | |
| node:=files.ssn("//*[@sc='" sc.2357 "']") | |
| if parent | |
| return node.parentnode | |
| return node | |
| } | |
| runit(){ | |
| runit: | |
| SetTimer,runit,Off | |
| file:=v.running | |
| SplitPath,file,,dir | |
| Run,"%A_AhkPath%" /debug "%file%",%dir%,,pid | |
| v.pid:=pid | |
| SetTimer,checkerror,100 | |
| return | |
| } | |
| debug(info*){ | |
| static socket:="",running:="" | |
| if (info.1="run"){ | |
| debug("new") | |
| ;sleep,200 | |
| v.running:=info.2 | |
| SetTimer,runit,50 | |
| } | |
| if (info.1=0){ | |
| for a,b in [10002,10003,10004] | |
| toolbar.list.10002.setstate(b,16) | |
| for a,b in [10000,10001] | |
| toolbar.list.10002.setstate(b,4) | |
| } | |
| if (info.1=1){ | |
| for a,b in [10002,10003,10004] | |
| toolbar.list.10002.setstate(b,4) | |
| for a,b in [10000,10001] | |
| toolbar.list.10002.setstate(b,16) | |
| } | |
| if (info.1="new"){ | |
| if (socket>0){ | |
| debug("disconnect") | |
| } | |
| sock:=-1 | |
| DllCall("LoadLibrary","str","ws2_32","ptr"),VarSetCapacity(wsadata,394+A_PtrSize) | |
| DllCall("ws2_32\WSAStartup","ushort",0,"ptr",&wsadata) | |
| DllCall("ws2_32\WSAStartup","ushort",NumGet(wsadata,2,"ushort"),"ptr",&wsadata) | |
| OnMessage(0x9987,"SocketEvent"),socket:=sock | |
| next:=debug("addrinfo"),sockaddrlen:=NumGet(next+0,16,"uint"),sockaddr:=NumGet(next+0,16+(2*A_PtrSize),"ptr") | |
| socket:=DllCall("ws2_32\socket","int",NumGet(next+0,4,"int"),"int",1,"int",6,"ptr") | |
| if (DllCall("ws2_32\bind","ptr",socket,"ptr",sockaddr,"uint",sockaddrlen,"int")!=0) | |
| return m(DllCall("ws2_32\WSAGetLastError")) ;,enable(debug("check")) | |
| DllCall("ws2_32\freeaddrinfo","ptr",next) | |
| debug("__eventProcRegister",socket,0x29) | |
| DllCall("ws2_32\listen","ptr",socket,"int",32) | |
| return socket | |
| } | |
| if (info.1="__eventProcRegister"){ | |
| DllCall("ws2_32\WSAAsyncSelect","ptr",socket,"ptr",A_ScriptHwnd,"uint",0x9987,"uint",info.3) | |
| } | |
| if (info.1="addrinfo"){ | |
| VarSetCapacity(hints,8*A_PtrSize,0) | |
| for a,b in {6:8,1:12} | |
| NumPut(a,hints,b) | |
| DllCall("ws2_32\getaddrinfo",astr,"127.0.0.1",astr,"9000","uptr",hints,"ptr*",results) | |
| return results | |
| } | |
| if (info.1="accept"){ | |
| if ((sock:=DllCall("ws2_32\accept","ptr",socket,"ptr",0,"int",0,"ptr"))!=-1){ | |
| socket:=sock | |
| debug("__eventProcRegister","newsock",0x21) | |
| return | |
| } | |
| } | |
| if (info.1="receive"){ | |
| ;Thank you Lexikos and fincs http://hkscript.org/download/tools/DBGP.ahk | |
| VarSetCapacity(buffer) | |
| while,DllCall("ws2_32\recv","ptr",socket,"char*",c,"int",1,"int",0){ | |
| if c=0 | |
| break | |
| length.=chr(c) | |
| } | |
| VarSetCapacity(packet,++length) | |
| received:=0 | |
| While(received<length){ | |
| r:=DllCall("ws2_32\recv","ptr",socket,"ptr",&packet+received,"int",length-received,"int",0) | |
| if (r<1) | |
| return m("An error occured",DllCall("GetLastError")) | |
| received += r | |
| sleep,100 | |
| } | |
| info:=StrGet(&packet,"utf-8") | |
| if InStr(info,"init"){ | |
| for a,b in v.breaks{ | |
| debug("send","breakpoint_set -t line -n " b) | |
| sleep,200 | |
| } | |
| } | |
| if (info) | |
| display(info) | |
| } | |
| if (info.1="send"){ | |
| message:=info.2,message.=Chr(0),len:=strlen(message),VarSetCapacity(buffer,len) | |
| ll:=StrPut(info.2,&buffer,"utf-8") | |
| if (DllCall("ws2_32\send",uint,socket,uptr,&buffer,"int",ll,"int",0,"cdecl")<1&&A_ThisLabel="menu"){ | |
| t("Currently there is no connection") | |
| sleep,500 | |
| t() | |
| } | |
| } | |
| if (info.1="detach"){ | |
| SetTimer,drop,10 | |
| return | |
| drop: | |
| SetTimer,drop,Off | |
| debug("send","stderr -c 0") | |
| SetTimer,dropnext,500 | |
| return | |
| dropnext: | |
| SetTimer,dropnext,Off | |
| debug("send","detach") | |
| SetTimer,droplast,500 | |
| return | |
| droplast: | |
| SetTimer,droplast,off | |
| settimer,laster,500 | |
| debug("disconnect") | |
| return | |
| laster: | |
| SetTimer,laster,Off | |
| hwnd({rem:99}),debug(0) | |
| return | |
| } | |
| if (info.1="disconnect"){ | |
| DllCall("ws2_32\WSAAsyncSelect","uint",socket,"ptr",A_ScriptHwnd,"uint",0,"uint",0) | |
| DllCall("ws2_32\closesocket","uint",socket,"int") | |
| DllCall("ws2_32\WSACleanup"),socket:="" | |
| debug(0) | |
| } | |
| if (info.1="encode"){ ;original http://www.autohotkey.com/forum/viewtopic.php?p=238120#238120 | |
| text:=info.2!=""?info.2:return | |
| cp:=0 | |
| VarSetCapacity(rawdata,StrPut(text,"utf-8")),sz:=StrPut(text,&rawdata,"utf-8")-1 | |
| DllCall("Crypt32.dll\CryptBinaryToString","ptr",&rawdata,"uint",sz,"uint",0x40000001,"ptr",0,"uint*",cp) | |
| VarSetCapacity(str,cp*(A_IsUnicode?2:1)) | |
| DllCall("Crypt32.dll\CryptBinaryToString","ptr",&rawdata,"uint",sz,"uint",0x40000001,"str",str,"uint*",cp) | |
| return str | |
| } | |
| if (info.1="decode"){ ;original http://www.autohotkey.com/forum/viewtopic.php?p=238120#238120 | |
| string:=info.2!=""?info.2:return | |
| DllCall("Crypt32.dll\CryptStringToBinary","ptr",&string,"uint",StrLen(string),"uint",1,"ptr",0,"uint*",cp:=0,"ptr",0,"ptr",0) ;getsize | |
| VarSetCapacity(bin,cp) | |
| DllCall("Crypt32.dll\CryptStringToBinary","ptr",&string,"uint",StrLen(string),"uint",1,"ptr",&bin,"uint*",cp,"ptr",0,"ptr",0) | |
| return StrGet(&bin,cp,"utf-8") | |
| } | |
| if (info.1="check") | |
| return socket | |
| } | |
| checkerror: | |
| SetTimer,checkerror,Off | |
| checkerror() | |
| return | |
| checkerror(){ | |
| IfWinExist,% "ahk_pid" v.pid | |
| WinGetText,text,% "ahk_pid" v.pid | |
| if InStr(text,"error at line"){ | |
| for a,b in StrSplit(text,"`n") | |
| if InStr(b,"error at line"){ | |
| RegExMatch(b,"(\d+)",find) | |
| v.line:=find1-1 | |
| debug("disconnect") | |
| file:=StrSplit(b,Chr(34)).2 | |
| if (file){ | |
| tv(files.ssn("//main[@file='" ssn(current(1),"@file").text "']/file[@file='" file "']/@tv").text) | |
| csc().2400 | |
| } | |
| SetTimer,selecterror,40 | |
| } | |
| } | |
| return | |
| } | |
| SocketEvent(info*){ | |
| if (info.3=0x9987){ | |
| if (info.2&0xFFFF=1) | |
| debug("receive") | |
| if (info.2&0xffff=8) | |
| debug("accept") | |
| if (info.2&0xFFFF=32) | |
| debug("disconnect") | |
| } | |
| } | |
| defaultfont(){ | |
| temp:=new xml("temp") | |
| info= | |
| ( | |
| <fonts> | |
| <name>PlasticCodeWrap</name> | |
| <author>joedf</author> | |
| <font background="0x1D160B" bold="1" color="0xF8F8F2" font="Consolas" size="10" style="5" italic="0" strikeout="0" underline="0"/> | |
| <font background="0x36342E" style="33" color="0xECEEEE"/> | |
| <font style="0" color="0xF8F8F2"/> | |
| <font style="1" color="0xE09A1E" bold="0" font="Consolas" italic="1" size="10" strikeout="0" underline="0"/> | |
| <font style="2" color="0x833AFF"/> | |
| <font style="3" color="0x39E455"/> | |
| <font style="4" color="0xAFA600"/> | |
| <font style="11" color="0xE09A1E" bold="0" font="Consolas" italic="1" size="10" strikeout="0" underline="0"/> | |
| <font style="13" color="0x2929EF"/> | |
| <font style="15" color="0x2D8BAA"/> | |
| <font style="17" color="0x9A93EB"/> | |
| <font style="18" color="0x54B4FF"/> | |
| <font style="19" color="0x0000AE"/> | |
| <font style="21" color="0x400080"/> | |
| <font style="22" color="0x8000FF"/> | |
| <font style="37" color="0xff00ff"/> | |
| <font bool="1" code="2067" color="0xECE000"/> | |
| <font bool="1" code="2068" color="0x3D2E16"/> | |
| <font code="2069" color="0xFF8080"/> | |
| <font code="2098" color="0x583F11"/> | |
| <font code="2600" color="0x222222"/> | |
| <font code="2601" color="0xAFA600"/> | |
| <highlight> | |
| <list1 list="1">custom list</list1> | |
| </highlight> | |
| </fonts> | |
| ) | |
| top:=settings.ssn("//settings") | |
| temp.xml.loadxml(info) | |
| tt:=temp.ssn("//*") | |
| top.appendchild(tt) | |
| } | |
| delete(){ | |
| backspace: | |
| ControlGetFocus,Focus,% hwnd([1]) | |
| sc:=csc() | |
| if !InStr(Focus,"Scintilla"){ | |
| ControlSend,%Focus%,{%A_ThisHotkey%} | |
| return | |
| } | |
| if (sc.2009!=sc.2008){ | |
| text:=sc.getseltext() | |
| if RegExMatch(text,"(\{|\})") | |
| SetTimer,auto_delete,20 | |
| }else{ | |
| if (A_ThisHotkey="bs") | |
| if RegExMatch(Chr(sc.2007(sc.2008-1)),"(\{|\})") | |
| SetTimer,auto_delete,20 | |
| else if(A_ThisHotkey="Del") | |
| if RegExMatch(Chr(sc.2007(sc.2008)),"(\{|\})") | |
| SetTimer,auto_delete,20 | |
| } | |
| ControlSend,%Focus%,{%A_ThisHotkey%} | |
| update({sc:sc.2357}) | |
| return | |
| } | |
| display(store){ | |
| static recieve:=new xml("recieve") | |
| start:=1 | |
| if !store | |
| return | |
| if !WinExist(hwnd([99])){ | |
| Gui,99:Default | |
| Gui,99:Destroy | |
| Gui,+hwndhwnd +Owner1 | |
| hwnd(99,hwnd) | |
| sc:=v.debugwin:=new s(99,{pos:"w400 h600"}) | |
| Gui,99:Show,x0 y0 NA,Debug | |
| Gui,1:Default | |
| debug(1) | |
| } | |
| sc:=v.debugwin | |
| recieve.xml.loadxml(store) | |
| if info:=recieve.ssn("//stream[@type='stderr']"){ | |
| debug("send","stop"),debug(0) | |
| info:=debug("decode",info.text) | |
| sc.2003(sc.2006,"`r`n" info),sc.2629 | |
| sc:=csc("Scintilla1") | |
| for a,b in StrSplit(info,"`n"){ | |
| if RegExMatch(b,"i)Error in.+include file " Chr(34) "(.+)" Chr(34),found) | |
| tv(files.ssn("//main[@file='" ssn(current(1),"@file").text "']/file[@file='" found1 "']/@tv").text),sc.2400 | |
| if InStr(b,"--->"){ | |
| RegExMatch(b,"(\d+)",line) | |
| v.line:=line-1 | |
| SetTimer,selecterror,100 | |
| debug("disconnect") | |
| exit | |
| } | |
| } | |
| } | |
| if init:=recieve.ssn("//init"){ | |
| debug("send","stderr -c 2") | |
| debug(1) | |
| } | |
| if recieve.ssn("//property"){ | |
| if property:=recieve.sn("//property"){ | |
| if property.length>1000 | |
| ToolTip,Compiling List Please Wait...,350,150 | |
| varbrowser() | |
| list:=[],variablelist:=[],value:=[] | |
| object:=recieve.sn("//response/property") | |
| Gui,97:Default | |
| GuiControl,97:-Redraw,SysTreeView321 | |
| TV_Delete() | |
| while,oo:=object.item[A_Index-1]{ | |
| ea:=xml.ea(oo),value:=debug("decode",oo.text) | |
| list[ea.fullname]:=TV_Add(ea.fullname a:=ea.type="object"?"":" = " value) | |
| if (ea.type!="object") | |
| variablelist[list[ea.fullname]]:={value:value,variable:ea.fullname} | |
| descendant:=sn(oo,"descendant::*") | |
| while,des:=descendant.item[A_Index-1]{ | |
| ea:=xml.ea(des),value:=debug("decode",des.text) | |
| list[ea.fullname]:=TV_Add(ea.fullname a:=ea.type="object"?"":" = " value,list[prev:=SubStr(ea.fullname,1,InStr(ea.fullname,".",0,0)-1)],"Sort") | |
| if (ea.type!="object") | |
| variablelist[list[ea.fullname]]:={value:value,variable:ea.fullname} | |
| } | |
| } | |
| v.variablelist:=variablelist | |
| debug("send","run") | |
| GuiControl,97:+Redraw,SysTreeView321 | |
| return t() | |
| sc.2629 | |
| return t() | |
| } | |
| }else if command:=recieve.ssn("//response"){ | |
| if recieve.sn("//response").length>1 | |
| m("more info") | |
| ea:=recieve.ea(command) | |
| if (ea.status="stopped"&&ea.command="run"&&ea.reason="ok") | |
| debug(0) | |
| disp:="Command:" | |
| for a,b in ea | |
| if (a&&b) | |
| disp.="`r`n" a " = " Chr(34) b Chr(34) | |
| info:=disp | |
| } | |
| disp:=sc.2006?"`r`n" disp:disp | |
| disp:=disp?disp:store | |
| sc.2003(sc.2006,disp) | |
| sc.2629 | |
| return | |
| disp:=recieve[] | |
| store:=disp?disp:store | |
| return sock | |
| 99GuiEscape: | |
| 99GuiClose: | |
| debug("detach") | |
| /* | |
| WinWaitClose,% hwnd | |
| csc("Scintilla1") | |
| */ | |
| return | |
| selecterror: | |
| SetTimer,selecterror,Off | |
| sc:=csc(),line:=v.line,sc.2400 | |
| start:=sc.2128(line),end:=sc.2136(line) | |
| sc.2160(start,end) | |
| return | |
| } | |
| varbrowser(){ | |
| if !WinExist(hwnd([97])){ | |
| setup(97) | |
| Gui,Add,TreeView,w300 h400 gvalue AltSubmit | |
| Gui,Add,Button,greloadvar,Reload Variables | |
| Gui,Show,,Variable Browser | |
| } | |
| return | |
| 97GuiEscape: | |
| 97GuiClose: | |
| hwnd({rem:97}) | |
| return | |
| value: | |
| if A_GuiEvent!=Normal | |
| return | |
| if value:=v.variablelist[A_EventInfo]{ | |
| ei:=A_EventInfo | |
| InputBox,newvalue,% "Current value for " value.variable,% "Change value for " value.variable,,,,,,,,% value.value | |
| if ErrorLevel | |
| return | |
| debug("send","property_set -n " value.variable " -- " debug("encode",newvalue)) | |
| TV_Modify(ei,"",value.variable " = " newvalue) | |
| } | |
| return | |
| reloadvar: | |
| listvars() | |
| return | |
| } | |
| run_program(){ | |
| if !debug("check") | |
| return m("Currently no file being debugged"),debug(0) | |
| debug("send","run") | |
| } | |
| Run_Script(){ | |
| save(),debug("run",ssn(current(1),"@file").text) | |
| } | |
| step(){ | |
| if !debug("check") | |
| return m("Currently no file being debugged"),debug(0) | |
| debug("send","step_into") | |
| } | |
| listvars(){ | |
| if !debug("check") | |
| return m("Currently no file being debugged"),debug(0) | |
| debug("send","context_get -c 1") | |
| } | |
| stop(){ | |
| return debug("detach") | |
| if !debug("check") | |
| return m("Currently no file being debugged"),debug(0) | |
| debug("send","detach") | |
| sleep,500 | |
| hwnd({rem:99}),debug("disconnect") | |
| WinWaitClose,% hwnd | |
| debug(0) | |
| csc("Scintilla1") | |
| } | |
| detach(){ | |
| debug("send","detach"),debug(0) | |
| } | |
| local(){ | |
| debug("send","context_get -c 0") | |
| } | |
| global(){ | |
| debug("send","context_get -c 1") | |
| } | |
| Dlg_Color(Color,hwnd){ | |
| static | |
| if settings.ssn("//colorinput").text{ | |
| InputBox,color,Color Code,Input your color code,,,,,,,,%color% | |
| if !ErrorLevel | |
| return color | |
| return | |
| } | |
| 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 | |
| } | |
| 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 | |
| } | |
| Duplicate_Line(){ | |
| csc().2469 | |
| } | |
| toggle_comment_line(){ | |
| sc:=csc(),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 | |
| } | |
| DynaRun(TempScript,debug=0){ | |
| ;http://www.autohotkey.com/community/viewtopic.php?t=63916 | |
| if RegExMatch(tempscript,"i)(SetWorkingDir.+)",found){ | |
| FileCreateDir,temp | |
| tempscript:=RegExReplace(tempscript,"i)(SetWorkingDir.+)","SetWorkingDir," A_ScriptDir "\temp",count,1) | |
| }else | |
| tempscript:="SetWorkingDir," A_ScriptDir "\temp`r`n" tempscript | |
| StringReplace,TempScript,TempScript,`r`n,`n,All | |
| if (debug=1){ | |
| if debug("check") | |
| return m("Program running already"),debug("disconnect") | |
| sock:=debug("new") | |
| if sock<0 | |
| return m("something happened") | |
| for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process") | |
| if instr(process.commandline,"pipe")&&instr(process.commandline,a_ahkpath) | |
| Process,Close,% "ahk_pid" process.processid | |
| } | |
| static _:="uint" | |
| @:=A_PtrSize?"Ptr":_ | |
| name:="AHK Studio Test" | |
| 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 | |
| db:=debug=1?"/debug":"" | |
| Run, %A_AhkPath% %db% "\\.\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) | |
| SetWorkingDir,%A_ScriptDir% | |
| Return PID | |
| } | |
| 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,% hwnd([7]) | |
| 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 | |
| 7GuiClose: | |
| 7GuiEscape: | |
| hwnd({rem:7}) | |
| return | |
| } | |
| exit(x=""){ | |
| GuiClose: | |
| rem:=settings.ssn("//last"),rem.ParentNode.RemoveChild(rem) | |
| for a,b in s.main{ | |
| file:=files.ssn("//*[@sc='" b.2357 "']/@file").text | |
| if file | |
| settings.add({path:"last/file",text:file,dup:1}) | |
| } | |
| toolbar.save(),rebar.save(),save() | |
| savegui(),menus.save(1),vault.save(1) | |
| settings.save(1) | |
| if (x=""||InStr(A_ThisLabel,"Gui")) | |
| ExitApp | |
| return | |
| GuiEscape: | |
| ControlGetFocus,Focus,% hwnd([1]) | |
| csc().2400 | |
| return | |
| } | |
| savegui(){ | |
| WinGet,max,MinMax,% hwnd([1]) | |
| text:=max | |
| text:=max?settings.ssn("//gui/position[@window='1']").text:resize("get") | |
| top:=settings.ssn("//gui/position[@window='1']") | |
| if !top.text | |
| top:=settings.add({path:"gui/position",att:{window:1}}) | |
| top.text:=text | |
| top.SetAttribute("max",max) | |
| } | |
| filecheck(){ | |
| commandsdate:=20140402 | |
| menusdate:=20140330 | |
| if !settings.ssn("//autoadd") | |
| for a,b in {60:62,123:125,34:34,39:39,91:93,40:41} | |
| settings.add({path:"autoadd/key",att:{trigger:a,add:b},dup:1}) | |
| if !settings.ssn("//fonts").xml | |
| defaultfont() | |
| if (menus.ssn("//date").text!=menusdate){ | |
| names:=menus.sn("//*/@name") | |
| while,nn:=names.item[A_Index-1] | |
| list.=nn.text "`r`n" | |
| list:=RegExReplace(list,"&") | |
| SplashTextOn,,40,Downloading Required Files,Please Wait... | |
| URLDownloadToFile,http://files.maestrith.com/alpha/Studio/menus.xml,lib\temp.xml | |
| FileRead,menu,lib\temp.xml | |
| temp:=new xml("temp") | |
| temp.xml.loadxml(menu) | |
| if menus.sn("//*").length=1 | |
| menus.xml.loadxml(menu) | |
| else{ | |
| menu:=temp.sn("//*") | |
| while,mm:=menu.item[A_Index-1]{ | |
| parent:=mm.nodename!="menu"?mm:parent | |
| name:=ssn(mm,"@name").text | |
| SplashTextOff | |
| check:=RegExReplace(name,"&") | |
| if !RegExMatch(list,"i)\b" check "\b"){ | |
| if !menus.ssn("//" mm.nodename "[@name='" name "']"){ | |
| top:=menus.ssn("//menu[@name='" ssn(mm.ParentNode,"@name").text "']") | |
| top:=top?top:menus.ssn("//" mm.parentnode.nodename) | |
| if top.xml | |
| top.appendchild(mm.clonenode(1)) | |
| } | |
| } | |
| } | |
| } | |
| menus.add({path:"date",text:menusdate}) | |
| menus.save(1) | |
| FileDelete,lib\temp.xml | |
| } | |
| if !FileExist("lib") | |
| FileCreateDir,lib | |
| FileGetTime,time,scilexer.dll,C | |
| if (20140330120000>time) | |
| FileDelete,scilexer.dll | |
| FileInstall,scilexer.dll,scilexer.dll | |
| FileInstall,lib\commands.xml,lib\commands.xml | |
| if !(FileExist("lib\commands.xml")&&FileExist("scilexer.dll")) | |
| SplashTextOn,,40,Downloading Required Files,Please Wait... | |
| if (commands.ssn("//Date").text!=commandsdate) | |
| FileDelete,lib\commands.xml | |
| if !FileExist("lib\commands.xml") | |
| FileAppend,% URLDownloadToVar("http://files.maestrith.com/alpha/Studio/commands.xml"),lib\commands.xml | |
| if !FileExist("scilexer.dll") | |
| URLDownloadToFile,http://files.maestrith.com/alpha/Studio/SciLexer.dll,SciLexer.dll | |
| if !FileExist("AHKStudio.ico") | |
| urldownloadtofile,http://files.maestrith.com/alpha/Studio/AHKStudio.ico,AHKStudio.ico | |
| SplashTextOff | |
| commands:=new xml("commands","lib\commands.xml") | |
| } | |
| Find_Nearest_Brace(){ | |
| sc:=csc() | |
| line:=sc.2166(start:=sc.2008) | |
| linestart:=sc.2128(line) | |
| while,(linestart<start){ | |
| start-- | |
| current:=sc.2007(start) | |
| if current in 41,125,93 | |
| start:=sc.2353(start) | |
| if current in 40,123,91 | |
| { | |
| sc.2351(start,sc.2353(start)) | |
| Break | |
| } | |
| } | |
| } | |
| find(){ | |
| static | |
| file:=ssn(current(1),"@file").text | |
| infopos:=positions.ssn("//*[@file='" file "']") | |
| last:=ssn(infopos,"@search").text | |
| hwfind:=setup(5) | |
| search:=last?last:"Type in your query here" | |
| ea:=settings.ea(settings.ssn("//search/find")) | |
| 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,5:Add,%b1%,%b2%,%b3% | |
| b2:=b3:="" | |
| } | |
| Gui,5:Add,Button,gsearch Default,% " Search " | |
| ;snapshot(hwfind,4,{SysTreeView321:["w","h"],Button1:["y"],Button2:["y"],Button3:["y"],Button5:["y"],Button5:["y"],Edit1:["w"]}) | |
| Gui,5:Show | |
| for a,b in ea | |
| if b | |
| GuiControl,,%a%,%b% | |
| for a,b in xml.easyatt(settings.ssn("//search/find")) | |
| GuiControl,5:,%a%,%b% | |
| ControlSend,Edit1,^a,% hwnd([5]) | |
| return | |
| findcheck: | |
| ControlGetText,Button,Button5,% hwnd([5]) | |
| if (Button!="search") | |
| ControlSetText,Button5,Search,% hwnd([5]) | |
| return | |
| search: | |
| ControlGetText,Button,Button5,% hwnd([5]) | |
| if (InStr(button,"search")){ | |
| Gui,5: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&®ex?ff "(" find ")":ff main | |
| infopos.setattribute("search",find) | |
| Gui,5:Default | |
| GuiControl,5:-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,"`n" 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)+StrLen(fo.value()) | |
| } | |
| } | |
| else | |
| { | |
| while,found:=RegExMatch(out,"`nOi)(.*" 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,5:+Redraw,SysTreeView321 | |
| ControlSetText,Button5,Jump,% hwnd([5]) | |
| refreshing:=0 | |
| } | |
| else if (Button="jump"){ | |
| Gui,5:Submit,Nohide | |
| ea:=foundinfo[TV_GetSelection()] | |
| sc:=csc() | |
| tv(files.ssn("//*[@file='" ea.file "']/@tv").text) | |
| Sleep,100 | |
| 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,5:TreeView,SysTreeView321 | |
| if refreshing | |
| return | |
| ControlGetFocus,focus,% hwnd([5]) | |
| if !InStr(Focus,"SysTreeView321"){ | |
| ControlSetText,Button5,Search,% hwnd([5]) | |
| return | |
| } | |
| if TV_GetChild(sel) | |
| ControlSetText,Button5,% TV_Get(sel,"E")?"Contract":"Expand",% hwnd([5]) | |
| else if TV_GetCount() | |
| ControlSetText,Button5,Jump,% hwnd([5]) | |
| else | |
| ControlSetText,Button5,Search,% hwnd([5]) | |
| return | |
| sel:=TV_GetSelection() | |
| if TV_GetChild(sel) | |
| ControlSetText,Button5,% TV_Get(sel,"E")?"Contract":"Expand",% hwnd([5]) | |
| else | |
| ControlSetText,Button5,Jump,% hwnd([5]) | |
| return | |
| fsort: | |
| ControlSetText,Button5,Search,% hwnd([5]) | |
| goto search | |
| return | |
| 5GuiEscape: | |
| 5GuiClose: | |
| Gui,5:Submit,NoHide | |
| settings.add({path:"search/find",att:{regex:regex,cs:cs,sort:sort,gr:gr}}),foundinfo:="" | |
| hwnd({rem:5}) | |
| return | |
| } | |
| fix_after(line){ | |
| return | |
| fix_next: | |
| SetTimer,fix_next,Off | |
| sc:=csc() | |
| line:=sc.2166(sc.2008) | |
| indent:=sc.2127(line-1) | |
| sc.2126(line,indent) | |
| sc.2025(sc.2128(line)) | |
| return | |
| } | |
| fix_indent(sc=""){ | |
| critical | |
| move_selected: | |
| auto_delete: | |
| if !sc | |
| sc:=csc() | |
| cpos:=sc.2008,begin:=cpos-sc.2128(sc.2166(cpos)) | |
| auto_indent: | |
| fix_paste: | |
| settimer,%A_ThisLabel%,off | |
| next:=0,cpos:=0,indent:=0,add:=0 | |
| if !sc | |
| sc:=csc() | |
| sc.2078 | |
| lines:=sc.2154,pos:=0 | |
| text:=sc.gettext() | |
| if !text | |
| return | |
| for a,b in strsplit(text,"`n","`n"){ | |
| b:=Trim(b),start:=0 | |
| if (SubStr(b,1,1)="(") | |
| v.skip:=1 | |
| if (SubStr(b,0,1)=")"&&v.skip){ | |
| v.skip:=0 | |
| continue | |
| } | |
| if v.skip | |
| continue | |
| if InStr(b,";") | |
| while,start:=RegExMatch(b,"\;",found,++start){ | |
| linestart:=sc.2128(a-1) | |
| if (sc.2010(linestart+start-1)=1){ | |
| b:=Trim(SubStr(b,1,start-1)) | |
| break | |
| } | |
| } | |
| add:=0 | |
| if (pos:=RegExMatch(lastb,"iUA)(\b(" v.indentregex ")(.+)?)\b",found)&&(SubStr(b,0,1)!="{")){ | |
| if InStr(v.color.indent,found) | |
| add+=1 | |
| if (SubStr(lastb,0,1)="{") | |
| add:=0 | |
| } | |
| if (SubStr(b,1,1)="}"){ | |
| indent:=indent>0?indent-1:0 | |
| if (indent*5!=sc.2127(a-1)) | |
| sc.2126(a-1,indent*5) | |
| } | |
| if (SubStr(b,1,2)="*/"){ | |
| indent:=indent>0?indent-1:0 | |
| if (indent*5!=sc.2127(a-1)) | |
| sc.2126(a-1,indent*5) | |
| } | |
| if (SubStr(b,1,2)="/*"){ | |
| if (indent*5!=sc.2127(a-1)) | |
| sc.2126(a-1,indent*5) | |
| indent++ | |
| }else if (SubStr(b,0,1)="{"){ | |
| if (indent*5!=sc.2127(a-1)) | |
| sc.2126(a-1,indent*5) | |
| indent++ | |
| }else{ | |
| if (add){ | |
| prev:=sc.2127(a-2) | |
| if (prev+5!=sc.2127(a-1)) | |
| sc.2126(a-1,prev+5) | |
| }else if (indent*5!=sc.2127(a-1)) | |
| sc.2126(a-1,indent*5) | |
| } | |
| lastb:=b | |
| } | |
| if indent | |
| ToolTip,Segment Open,0,0 | |
| else | |
| t() | |
| line:=sc.2166(sc.2008) | |
| if (A_ThisLabel="auto_indent"){ | |
| begin:=A_ThisLabel="auto_indent"?sc.2128(line):begin+sc.2128(line) | |
| sc.2160(begin,begin) | |
| } | |
| sc.2079 | |
| return | |
| } | |
| ftp_servers(){ | |
| setup(9) | |
| Gui,Add,ListView,w300 h300,Server|Username|Password|Port | |
| Gui,Add,Button,gnewserver,New Server | |
| Gui,Add,Button,gdeleteserver,Delete Server | |
| popftp() | |
| Gui,Show,,FTP Server Settings | |
| return | |
| 9GuiEscape: | |
| 9GuiClose: | |
| hwnd({rem:9}) | |
| return | |
| newserver: | |
| InputBox,address,Server Address,Input the address of the server | |
| if ErrorLevel | |
| return | |
| if settings.ssn("//ftp/server[@name='" name "']") | |
| return m("Server Already Exists") | |
| InputBox,username,Username,Username | |
| if ErrorLevel | |
| return | |
| InputBox,password,Password,Password | |
| if ErrorLevel | |
| return | |
| InputBox,port,Port,Port,,,,,,,,21 | |
| if ErrorLevel | |
| return | |
| settings.add({path:"ftp/server",att:{address:address,name:address,password:password,port:port,username:username},dup:1}) | |
| popftp() | |
| return | |
| deleteserver: | |
| if !count:=LV_GetCount() | |
| return | |
| LV_GetText(server,count) | |
| server:=settings.ssn("//ftp/server[@name='" server "']") | |
| server.parentnode.removechild(server) | |
| popftp() | |
| return | |
| } | |
| popftp(){ | |
| servers:=settings.sn("//ftp/*"),LV_Delete() | |
| while,ss:=servers.item[A_Index-1]{ | |
| ea:=settings.ea(ss) | |
| LV_Add("",ea.address,ea.username,ea.password,ea.port) | |
| } | |
| Loop,4 | |
| LV_ModifyCol(A_Index,"AutoHDR") | |
| } | |
| full_backup(){ | |
| save(),sc:=csc() | |
| 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 | |
| } | |
| 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 | |
| } | |
| settings.add({path:"access_token",text:access_token}) | |
| } | |
| } | |
| getpos(){ | |
| if !current(1).xml | |
| return | |
| sc:=csc(),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") | |
| } | |
| google_search_selected(){ | |
| sc:=csc(),text:=RegExReplace(sc.getseltext()," ","+") | |
| if !text | |
| return m("Select some text to search") | |
| string:="http://www.google.com/search?q=" text | |
| Run,%string% | |
| } | |
| gui(){ | |
| Gui,+Resize +hwndhwnd | |
| hwnd(1,hwnd),ComObjError(0) | |
| Hotkey,IfWinActive,% hwnd([1]) | |
| Hotkey,~Enter,checkqf,On | |
| for a,b in ["+","!","^"] | |
| Hotkey,%b%Enter,next,On | |
| hotkeys([1],{"^v":"paste","bs":"backspace","Del":"backspace"}) | |
| hotkeys([1],{"+left":"+left","+right":"+right",left:"left","right":"right"}) | |
| OnMessage(5,"Resize") | |
| SysGet,Border,33 | |
| SysGet,Caption,4 | |
| v.border:=border,v.caption:=caption | |
| Gui,Menu,% menu("main") | |
| new s(1,{main:1}) | |
| v.win2:=win2,v.win3:=win3 | |
| Gui,Add,StatusBar,hwndsb,StatusBar Info | |
| SB_SetParts(400,400) | |
| ControlGetPos,,,,h,,ahk_id%sb% | |
| v.StatusBar:=h,v.sbhwnd:=sb | |
| DetectHiddenWindows,On | |
| rb:=new rebar(1,hwnd),v.rb:=rb | |
| pos:=settings.ssn("//gui/position[@window='1']") | |
| max:=ssn(pos,"@max").text?"Maximize":"" | |
| pos:=pos.text?pos.text:"w750 h500" | |
| bar:=[],band:=[] | |
| bar.10000:=[[4,"shell32.dll","Open","Open",10000,4],[8,"shell32.dll","Save","Save",10001,4],[137,"shell32.dll","Run","Run",10003,4],[249,"shell32.dll","Check_For_Update","Check For Update",10004,4],[100,"shell32.dll","New_Scintilla_Window","New Scintilla Window",10005,4],[271,"shell32.dll","Remove_Scintilla_Window","Remove Scintilla Window",10006,4]] | |
| bar.10001:=[[110,"shell32.dll","open_folder","Open Folder",10000,4],[135,"shell32.dll","google_search_selected","Google Search Selected",10001,4],[261,"shell32.dll","Menu_Editor","Menu Editor",10003,4]] | |
| bar.10002:=[[18,"shell32.dll","Connect","Connect",10000,4],[22,"shell32.dll","Run_Script","Debug Current Script",10001,4],[21,"shell32.dll","ListVars","List Variables",10002,4],[137,"shell32.dll","Run_Program","Run Program",10003,4],[27,"shell32.dll","stop","Stop",10004,4]] | |
| ;backward compatibility | |
| if bardef:=settings.ssn("//toolbar/default"){ | |
| barvis:=settings.ssn("//toolbar/visible") | |
| lbd:=sn(bardef,"*") | |
| top:=settings.ssn("//toolbar") | |
| while,ll:=lbd.item[A_Index-1]{ | |
| top.appendchild(ll) | |
| lll:=sn(ll,"*") | |
| while,llll:=lll.item[A_Index-1]{ | |
| vis:=ssn(barvis,"bar[@id='" ssn(ll,"@id").text "']/button[@id='" ssn(llll,"@id").text "']").xml?1:0 | |
| llll.setattribute("vis",vis) | |
| } | |
| } | |
| for a,b in [bardef,barvis] | |
| b.parentnode.removechild(b) | |
| } | |
| if bandvis:=settings.ssn("//rebar/visible"){ | |
| banddef:=settings.ssn("//rebar/default/bands") | |
| lbd:=sn(bandvis,"*") | |
| top:=settings.add({path:"rebar"}) | |
| while,ll:=lbd.item[A_Index-1] | |
| ll.setattribute("vis",1),top.appendchild(ll) | |
| for a,b in [banddef.parentnode,bandvis] | |
| b.parentnode.removechild(b) | |
| } | |
| ;/backward compatibility | |
| for id,info in bar | |
| for a,b in info{ | |
| if !top:=settings.ssn("//toolbar/bar[@id='" id "']") | |
| top:=settings.add({path:"toolbar/bar",att:{id:id},dup:1}) | |
| if !button:=ssn(top,"button[@id='" b.5 "']") | |
| button:=settings.under({under:top,node:"button"}),next:=1 | |
| if (next){ | |
| for a,c in {icon:b.1,file:b.2,func:b.3,text:b.4,id:b.5,state:b.6} | |
| button.SetAttribute(a,c) | |
| button.SetAttribute("vis",1),next:=0 | |
| } | |
| if !settings.ssn("//rebar/band[@id='" id "']") | |
| settings.add({path:"rebar/band",att:{id:id,vis:1},dup:1}) | |
| } | |
| Gui,Add,Edit,w200 hwndedit | |
| ControlGetPos,,,,h,,ahk_id%edit% | |
| info:={hwnd:edit,ideal:220,id:11000,height:h,width:200,max:h} | |
| band.11000:={label:"Quick Find",hwnd:info.hwnd,height:info.height,ideal:info.ideal,id:11000,max:info.max,int:1,width:150} | |
| for a,b in band | |
| if !settings.ssn("//rebar/band[@id='" a "']") | |
| settings.add({path:"rebar/band",att:{id:a,width:150,vis:1},dup:1}) | |
| toolbars:=settings.sn("//toolbar/bar") | |
| while,bb:=toolbars.item[A_Index-1]{ | |
| buttons:=sn(bb,"*") | |
| tb:=new toolbar(1,hwnd,ssn(bb,"@id").text) | |
| while,button:=buttons.item[A_Index-1]{ | |
| ea:=settings.ea(button) | |
| tb.add(ea) | |
| } | |
| } | |
| visible:=settings.sn("//toolbar/*/*[@vis='1']") | |
| while,vis:=Visible.item[A_Index-1]{ | |
| tb:=toolbar.list[ssn(vis.parentnode,"@id").text] | |
| tb.addbutton(ssn(vis,"@id").text) | |
| } | |
| bands:=settings.sn("//rebar/*[@vis='1']") | |
| while,bb:=bands.item[A_Index-1]{ | |
| if (bb.nodename="newline"){ | |
| newline:=1 | |
| continue | |
| } | |
| ea:=settings.ea(bb) | |
| if band[ea.id] | |
| ea:=band[ea.id] | |
| if !ea.width | |
| ea.width:=toolbar.list[ea.id].barinfo().ideal+20 | |
| rb.add(ea,newline),newline:=0 | |
| } | |
| msg:=["What do you think?`r`nRight Click a `r`nToolbar to customize it`r`nControl+Click a toolbar icon to change the icon","I like it"] | |
| for a,b in s.main | |
| b.2242(0,20),b.2242(1,0),b.2181(0,msg[A_Index]) | |
| open:=settings.sn("//open/*") | |
| Gui,1:Add,TreeView,Background0 c0xAAAAAA AltSubmit gtv hwndtv | |
| hwnd(100,tv),refreshthemes() | |
| debug(0) | |
| Gui,1:Show,%pos% %max%,AHK Studio | |
| while,oo:=open.item[A_Index-1] | |
| if FileExist(oo.text) | |
| open(oo.text),last:=oo.text | |
| else{ | |
| rem:=settings.sn("//file[text()='" oo.text "']") | |
| while,rr:=rem.item[A_Index-1] | |
| rr.ParentNode.RemoveChild(rr) | |
| } | |
| last:=settings.sn("//last/*") | |
| for a,b in s.main{ | |
| tv:=files.ssn("//file[@file='" last.item[a-1].text "']/@tv").text | |
| if (A_Index=1){ | |
| bstv:=tv | |
| } | |
| csc({hwnd:b.sc}) | |
| tv(tv) | |
| } | |
| if !last.length | |
| new(1) | |
| Resize() | |
| WinSet,Redraw,,% hwnd([1]) | |
| if v.tv | |
| tv(v.tv),m(v.tv) | |
| csc("Scintilla1") | |
| TV_Modify(bstv,"Select Vis Focus") | |
| bracesetup(),options(),traymenu() | |
| } | |
| Default(){ | |
| m("You clicked a button") | |
| } | |
| newwin(info){ | |
| DetectHiddenWindows,On | |
| Gui,%info%:Default | |
| Gui,+hwndnewwin | |
| hwnd(info,newwin) | |
| Gui,Margin,0,0 | |
| Gui,Add,edit,y0 y2 w100 gqf | |
| case:=settings.ssn("//Quick_Search/@case").text?"Checked":"" | |
| regex:=settings.ssn("//Quick_Search/@regex").text?"Checked":"" | |
| greed:=settings.ssn("//Quick_Search/@greed").text?"Checked":"" | |
| Gui,Add,Checkbox,xm gcase %case%,Case | |
| Gui,Add,Checkbox,gregex %regex%,Regex | |
| Gui,Add,Checkbox,x+5 gcase %greed%,Greed | |
| Gui,Add,Button,xm gnext,Next | |
| Gui,Add,Button,x+5 gsetselection,Set Search Area | |
| Gui,-Caption | |
| Gui,%info%:+parent1 | |
| Gui,Show,NA AutoSize | |
| WinGetPos,,,w,h,% "ahk_id" newwin | |
| return {h:h,w:w,hwnd:newwin} | |
| } | |
| help(){ | |
| help= | |
| ( | |
| Quick Search: | |
| Pressing Escape while using the Quick Search bar will return you to the main window | |
| Toolbars: | |
| Right Click on a toolbar to change the buttons that appear in them. | |
| Shift+Drag buttons to re-arange them without using the Right Click option. | |
| Control+Click a button to change its icon. | |
| Alt+Click anywhere on a Toolbar to add a button | |
| Control+Right Click to delete a button (can not be undone). | |
| Menu: | |
| Edit/Menu Editor allows you to change the way that the menus are arranged. | |
| Auto Indent: | |
| Full Auto will adjust the indent of your script whenever you add a {, }, or press the enter key. | |
| Fix Next Line will just fix the next line adjusting for {, }, if statements, and a few others. | |
| Edit/Fix Indent will fix the indentation of your document as though you had on Full Auto. | |
| ) | |
| setup(11) | |
| Gui,Margin,0,0 | |
| sc:=new s(11,{pos:"x0 y0 w800 h500"}),csc({hwnd:sc}) | |
| Gui,Show,,AHK Studio Help | |
| sc.2181(0,help),sc.2025(0),hotkeys([11],{"Esc":"11GuiClose"}) | |
| return | |
| 11GuiClose: | |
| hwnd({rem:11}),csc({hwnd:s.main.1}) | |
| return | |
| } | |
| hotkeys(win,item=""){ | |
| for a,b in item{ | |
| key:=a,label:=clean(b) | |
| if IsFunc(label) | |
| launch:="function" | |
| if IsLabel(label) | |
| launch:=clean(label) | |
| if !(launch&&key) | |
| return | |
| for a,b in win{ | |
| Hotkey,IfWinActive,% hwnd([b]) | |
| Hotkey,%key%,%launch%,On | |
| } | |
| } | |
| return | |
| hotkey: | |
| ControlFocus,Edit1,% hwnd([1]) | |
| return | |
| function: | |
| key:=menus.ssn("//*[@hotkey='" A_ThisHotkey "']") | |
| func:=clean(ssn(key,"@name").text) | |
| %func%() | |
| return | |
| } | |
| hwnd(win,hwnd=""){ | |
| static window:=[] | |
| if win=get | |
| return window | |
| if (win.rem){ | |
| Gui,1:-Disabled | |
| Gui,% win.rem ":Destroy" | |
| Gui,1:Default | |
| window.remove[win.rem] | |
| } | |
| if IsObject(win) | |
| return "ahk_id" window[win.1] | |
| if !hwnd | |
| return window[win] | |
| window[win]:=hwnd | |
| } | |
| class icon_browser{ | |
| static start:="",window:=[],keep:=[] | |
| __New(info){ | |
| win=85 | |
| Gui,%win%:Destroy | |
| Gui,%win%:Default | |
| Gui,Add,ListView,w700 h500 hwndlv gselect AltSubmit,Icons | |
| Gui,Add,Button,gibprev,Previous 50 Icons | |
| Gui,Add,Button,x+10 gibnext,Next 50 Icons | |
| Gui,Add,Button,xm gloadfile,Load File | |
| Gui,Add,Button,x+10 gloaddefault,Load Default Icons | |
| Gui,Show,,Icon Browser | |
| this.file:=info.1.file?info.1.file:"shell32.dll" | |
| this.file:=InStr(this.file,".ahk")?A_AhkPath:this.file | |
| GuiControl,+Icon,%lv% | |
| this.create() | |
| LV_SetImageList(this.il) | |
| loop,50 | |
| LV_Add("Icon" IL_Add(this.il,this.file,A_Index),A_Index) | |
| this.start:=50 | |
| window[win]:=1 | |
| this.win:=win | |
| this.keep[1]:=this | |
| this.id:=info.2,this.ahkid:=info.3,this.tb:=info.4 | |
| return | |
| 85GuiEscape: | |
| Gui,85:Destroy | |
| return | |
| loaddefault: | |
| this:=icon_browser.keep[1] | |
| this.file:="shell32.dll" | |
| this.start:=0 | |
| this.next() | |
| return | |
| } | |
| select(num:=""){ | |
| Select: | |
| if A_GuiEvent!=Normal | |
| return | |
| this:=icon_browser.keep[1] | |
| LV_GetText(number,LV_GetNext()) | |
| number:=num="image"?0:number | |
| NumPut(VarSetCapacity(button,32),button,0) | |
| NumPut(0x1|0x20,button,4) | |
| NumPut(this.id,button,8) | |
| num:=this.tb.iconlist[this.file,number]!=""?this.tb.iconlist[this.file,number]:IL_Add(this.tb.imagelist,this.file,number)-1 | |
| this.tb.iconlist[this.file,number]:=num | |
| NumPut(num,button,12) | |
| SendMessage,0x400+64,% this.id,&button,,% this.ahkid | |
| this.tb.id | |
| btn:=settings.ssn("//toolbar/bar[@id='" this.tb.id "']/button[@id='" this.id "']") | |
| btn.setattribute("icon",number-1),btn.setattribute("file",this.file) | |
| return | |
| } | |
| load(){ | |
| loadfile: | |
| this:=icon_browser.keep[1] | |
| FileSelectFile,filename,,,,*.exe;*.dll;*.png;*.jpg;*.gif;*.bmp | |
| if ErrorLevel | |
| return | |
| this.file:=filename | |
| if filename contains .gif,.jpg,.png,.bmp | |
| return this.select("image") | |
| this.start:=0 | |
| this.next() | |
| return | |
| } | |
| exit(){ | |
| for win in icon_browser.window | |
| Gui,%win%:Destroy | |
| } | |
| create(){ | |
| this.il:=IL_Create(50,10,1) | |
| } | |
| next(){ | |
| ibnext: | |
| ibprev: | |
| this:=icon_browser.keep[1] | |
| if (A_ThisLabel="ibprev"&&this.start>=50) | |
| this.start:=this.start-100>=0?this.start-100:this.start-50 | |
| start:=this.start | |
| LV_Delete() | |
| GuiControl,85:-Redraw,SysListView321 | |
| this.create() | |
| LV_SetImageList(this.il) | |
| loop,50 | |
| LV_Add("Icon" IL_Add(this.il,this.file,A_Index+this.start),A_Index+this.start) | |
| this.start+=50 | |
| GuiControl,85:+Redraw,SysListView321 | |
| return | |
| } | |
| } | |
| 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) | |
| for a,b in [["\","\\"],[Chr(34),"\" Chr(34)],["`n","\n"],["`t","\t"],["`r",""]] | |
| StringReplace,info,info,% b.1,% b.2,All | |
| next="%filename%":{"content":"%info%"} | |
| return next | |
| } | |
| jump_to_project(){ | |
| projects:=files.sn("//main"),setup(15),hotkeys([15],{up:"jtpup",down:"jtpdown"}) | |
| Gui,Add,Edit,w500 gjtp | |
| Gui,Add,ListView,w500 h400 -Multi,Projects | |
| Gui,Add,Button,gjtp Default,Jump | |
| while,pro:=projects.item[A_Index-1] | |
| LV_Add("",ssn(pro,"@file").text) | |
| LV_Modify(1,"Select Vis Focus") | |
| Gui,Show,,Jump To Project | |
| Return | |
| 15GuiClose: | |
| 15GuiEscape: | |
| hwnd({rem:15}) | |
| Return | |
| jtp: | |
| if !LV_GetNext() | |
| Return | |
| LV_GetText(project,LV_GetNext()) | |
| tv:=files.ssn("//file[@file='" project "']..") | |
| tv:=ssn(tv,"@last").text?ssn(tv,"file[@file='" ssn(tv,"@last").text "']/@tv").text:files.ssn("//file[@file='" project "']/@tv").text | |
| tv(tv) | |
| Return | |
| jtpup: | |
| jtpdown: | |
| lv_select(15,add:=A_ThisLabel="jtpup"?-1:1) | |
| Return | |
| } | |
| Jump_to_Segment(){ | |
| static list:=[] | |
| setup(4),hotkeys([4],{up:"jtsup",down:"jtsdown"}) | |
| Gui,Add,edit,w200 gsortjts,Enter text here | |
| Gui,Add,ListView,w200 h400 -Multi,Files | |
| Gui,Add,Button,gjump Default,Jump to Segment | |
| Gui,Show,,Jump To Segment | |
| sc:=csc(),list:=[] | |
| file:=files.sn("//*[@sc='" sc.2357 "']../file/@filename") | |
| while,ff:=file.item[A_Index-1].text | |
| LV_Add("",ff),list[ff]:=1 | |
| LV_Modify(1,"Select Vis Focus") | |
| return | |
| 4GuiEscape: | |
| hwnd({rem:4}) | |
| return | |
| sortjts: | |
| GuiControl,4:-Redraw,SysListView321 | |
| LV_Delete() | |
| ControlGetText,find,Edit1,% hwnd([4]) | |
| for a in list | |
| if InStr(a,find) | |
| LV_Add("",a) | |
| GuiControl,4:+Redraw,SysListView321 | |
| LV_Modify(1,"Select Vis Focus") | |
| return | |
| jtsup: | |
| jtsdown: | |
| return lv_select(4,A_ThisLabel="jtsup"?-1:1) | |
| jump: | |
| Gui,4:Default | |
| LV_GetText(file,LV_GetNext()),sc:=csc() | |
| file:=files.ssn("//*[@sc='" sc.2357 "']../file[@filename='" file "']") | |
| tv(ssn(file,"@tv").text) | |
| hwnd({rem:4}) | |
| csc().2400 | |
| return | |
| } | |
| keywords(){ | |
| v.keywords:=[],v.kw:=[],v.custom:=[],v.kk:=[],var:=[] | |
| colors:=commands.sn("//Color/*") | |
| while,color:=colors.item[A_Index-1]{ | |
| text:=color.text | |
| all.=text " " | |
| stringlower,text,text | |
| v.color[color.nodename]:=text | |
| } | |
| personal:=settings.ssn("//Variables").text | |
| all.=personal | |
| StringLower,per,personal | |
| v.color.Personal:=Trim(per) | |
| v.indentregex:=RegExReplace(v.color.indent," ","|") | |
| command:=commands.ssn("//Commands/Commands").text | |
| Loop,Parse,command,%A_Space%,%A_Space% | |
| v.kw[A_LoopField]:=A_LoopField,all.=" " A_LoopField | |
| Sort,All,UD%A_Space% | |
| Loop,Parse,all,%a_space% | |
| v.keywords[SubStr(A_LoopField,1,1)].=A_LoopField " " | |
| return | |
| } | |
| lastfiles(){ | |
| rem:=settings.ssn("//last"),rem.ParentNode.RemoveChild(rem) | |
| for a,b in s.main{ | |
| file:=files.ssn("//*[@sc='" b.2357 "']/@file").text | |
| if file | |
| settings.add({path:"last/file",text:file,dup:1}) | |
| } | |
| } | |
| LV_Select(win,add){ | |
| Gui,%win%:Default | |
| next:=LV_GetNext()+Add | |
| LV_Modify(next>0&&next<=LV_GetCount()?next:LV_GetNext(),"Select Vis Focus") | |
| } | |
| marginwidth(sc=""){ | |
| sc:=sc?sc:sc:=v.sc | |
| sc.2242(0,sc.2276(32,"a" sc.2154)) | |
| } | |
| menu_editor(x=0){ | |
| static hwnd | |
| main:="main" | |
| if !x{ | |
| Gui,2:destroy | |
| Gui,2:+hwndhwnd +Owner1 | |
| setup(2) | |
| Gui,2:Add,Text,,Control+UP/DOWN/LEFT/RIGHT will move items | |
| hotkeys([2],{"Del":"deletenode"}) | |
| Hotkey,^up,moveup,On | |
| Hotkey,^down,movedown,On | |
| Hotkey,^left,moveover,On | |
| Hotkey,^right,moveunder,On | |
| Gui,2:Add,TreeView,w500 h400 hwndhwnd | |
| Gui,2:Add,Button,gaddmenu,Add A New Menu | |
| Gui,2:Add,Button,gmenudefault,Re-Load Defaults | |
| Gui,2:Add,Button,gchangeitem,Change Item | |
| Gui,2:Add,Button,gedithotkey Default,Edit Hotkey | |
| Gui,2:Add,Button,gaddsep,Add Separator | |
| Gui,2:Show,,Menu Editor | |
| } | |
| Gui,2:Default | |
| list:=menus.sn("//main/descendant::*") | |
| root:=0 | |
| GuiControl,2:-Redraw,SysTreeView321 | |
| del:=[],next:=0 | |
| TV_Delete() | |
| while,ll:=list.item[A_Index-1]{ | |
| hotkey:=ssn(ll,"@hotkey").text | |
| hot:=convert_hotkey(hotkey) | |
| hot:=hot?" - Hotkey = " hot:"" | |
| hotkey:=hotkey?"`t" convert_hotkey(hotkey):"" | |
| parent:=ssn(ll.ParentNode,"@tv").text?ssn(ll.ParentNode,"@tv").text:0 | |
| root:=TV_Add(ssn(ll,"@name").text hot,parent) | |
| ll.SetAttribute("tv",root) | |
| deletelist.Insert(clean(ssn(ll,"@name").text)) | |
| if ssn(ll,"@last").text | |
| count:=A_Index | |
| } | |
| while,ll:=list.item[A_Index-1] | |
| TV_Modify(ssn(ll,"@tv").text,"Expand") | |
| if !x{ | |
| while,ll:=list.item[A_Index-1]{ | |
| menu:=ssn(ll,"@name").text,parent:=ssn(ll.ParentNode,"@name").text | |
| parent:=parent?parent:main | |
| Menu,% clean(Parent),Delete,% ssn(ll,"@name").text | |
| Menu,% clean(parent),DeleteAll | |
| } | |
| } | |
| tv:=menus.ssn("//*[@last]") | |
| if tv | |
| TV_Modify(ssn(tv,"@tv").text,"Select"),tv.removeattribute("last") | |
| top:=count>10?count-10:0 | |
| tv:=ssn(list.item[top],"@tv").text | |
| TV_Modify(tv,"VisFirst") | |
| GuiControl,2:+Redraw,SysTreeView321 | |
| ControlFocus,SysTreeView321,% hwnd([2]) | |
| return | |
| menudefault: | |
| SplashTextOn,,40,Downloading Required Files,Please Wait... | |
| menus.xml.save("lib\menusbackup " a_now ".xml") | |
| URLDownloadToFile,http://files.maestrith.com/alpha/Studio/menus.xml,lib\temp.xml | |
| FileRead,menu,lib\temp.xml | |
| menus.xml.loadxml(menu) | |
| menus.save(1) | |
| SplashTextOff | |
| menu_editor(1) | |
| return | |
| 2GuiEscape: | |
| 2GuiClose: | |
| hwnd({rem:2}) | |
| list:=menus.sn("//main/descendant::*") | |
| while,rem:=list.item[A_Index-1] | |
| rem.removeattribute("tv") | |
| menus.save(1) | |
| all:=menus.sn("//*") | |
| main:="main" | |
| Gui,1:Menu | |
| while,aa:=all.item[A_Index-1]{ | |
| menu:=ssn(aa,"@name").text,parent:=ssn(aa.ParentNode,"@name").text | |
| parent:=parent?parent:"main" | |
| Menu,% clean(Parent),Delete,% ssn(aa,"@name").text | |
| } | |
| Menu,main,Delete | |
| Gui,1:Menu,% menu("main") | |
| return | |
| addmenu: | |
| Gui,2:Default | |
| top:=menus.ssn("//*[@tv='" TV_GetSelection() "']") | |
| InputBox,newname,New Menu Item,Enter a new name (`&File for &File) | |
| if ErrorLevel | |
| return | |
| if (ssn(top,"@menu").text="") | |
| main:=top.ParentNode | |
| new:=menus.under({under:main,node:"menu",att:{name:newname,last:1}}) | |
| main.insertbefore(new,top) | |
| under.insertbefore(above,move) | |
| menu_editor(1) | |
| return | |
| moveup: | |
| Gui,2:Default | |
| if prev:=TV_GetPrev(TV_GetSelection()){ | |
| move:=menus.ssn("//*[@tv='" TV_GetSelection() "']") | |
| above:=menus.ssn("//*[@tv='" prev "']") | |
| move.SetAttribute("last",1) | |
| under:=move.parentnode | |
| under.insertbefore(move,above) | |
| menu_editor(1) | |
| } | |
| return | |
| movedown: | |
| Gui,2:Default | |
| if next:=TV_GetNext(TV_GetSelection()){ | |
| move:=menus.ssn("//*[@tv='" TV_GetSelection() "']") | |
| above:=menus.ssn("//*[@tv='" next "']") | |
| move.SetAttribute("last",1) | |
| under:=move.parentnode | |
| under.insertbefore(above,move) | |
| menu_editor(1) | |
| } | |
| return | |
| deletenode: | |
| Gui,2:Default | |
| top:=menus.ssn("//*[@tv='" TV_GetSelection() "']") | |
| top.ParentNode.RemoveChild(top) | |
| TV_Delete(TV_GetSelection()) | |
| return | |
| moveunder: | |
| Gui,2:Default | |
| top:=menus.ssn("//*[@tv='" TV_GetSelection() "']") | |
| if top.nextsibling.xml{ | |
| under:=top.nextsibling.childnodes | |
| if under.length | |
| top.SetAttribute("last",1),top.nextsibling.insertbefore(top,under.item[0]) | |
| else | |
| top.SetAttribute("last",1),top.nextsibling.appendchild(top) | |
| menu_editor(1) | |
| } | |
| return | |
| moveover: | |
| Gui,2:Default | |
| if !TV_GetParent(TV_GetSelection()) | |
| return | |
| top:=menus.ssn("//*[@tv='" TV_GetSelection() "']") | |
| if (ssn(top.ParentNode,"@name").text!=""&&top.ParentNode.ParentNode.xml) | |
| before:=top.ParentNode,top.SetAttribute("last",1),top.ParentNode.ParentNode.insertbefore(top,before) | |
| menu_editor(1) | |
| return | |
| changeitem: | |
| Gui,2:Default | |
| current:=TV_GetSelection() | |
| item:=menus.ssn("//*[@tv='" current "']") | |
| item.setattribute("last",1) | |
| InputBox,newitem,Change Menu Name,Input a new name,,,,,,,,% ssn(item,"@name").text | |
| if ErrorLevel | |
| return | |
| menus.ssn("//*[@tv='" current "']/@name").text:=newitem | |
| menu_editor(1) | |
| return | |
| edithotkey: | |
| changehotkey() | |
| return | |
| 98GuiEscape: | |
| hwnd({rem:98}) | |
| WinActivate,% hwnd([2]) | |
| menu_editor(1) | |
| return | |
| addsep: | |
| Gui,2:Default | |
| top:=menus.ssn("//*[@tv='" TV_GetSelection() "']") | |
| main:=top.ParentNode | |
| new:=menus.under({under:main,node:"separator",att:{name:"-------",last:1}}) | |
| main.insertbefore(new,top) | |
| main.insertbefore(top,new) | |
| menu_editor(1) | |
| return | |
| } | |
| changehotkey(){ | |
| static hk,hotkey | |
| Gui,2:Default | |
| hotkey:=menus.ssn("//*[@tv='" TV_GetSelection() "']") | |
| setup(98,1) | |
| Gui,Add,Hotkey,gehk vhk,% ssn(Hotkey,"@hotkey").text | |
| Gui,Show,,Hotkey | |
| return | |
| ehk: | |
| Gui,98:Submit,NoHide | |
| Hotkey.setattribute("hotkey",hk),Hotkey.setattribute("last",1) | |
| return | |
| } | |
| menu(menuname){ | |
| menu:=menus.sn("//" menuname "/descendant::*") | |
| list:=[] | |
| Menu,main,UseErrorLevel,On | |
| while,mm:=menu.item[A_Index-1]{ | |
| if !ssn(mm,"@clean") | |
| mm.SetAttribute("clean",clean(ssn(mm,"@name").text)) | |
| if IsLabel(clean(ssn(mm,"@name").text)) | |
| route:=clean(ssn(mm,"@name").text) | |
| else | |
| route:="menuroute" | |
| if hotkey:=ssn(mm,"@hotkey").text{ | |
| ea:=xml.ea(mm),key:=[] | |
| key[ea.hotkey]:=ea.name | |
| Hotkeys([1,3],key) | |
| } | |
| hotkey:=hotkey?"`t" convert_hotkey(hotkey):"" | |
| if mm.childnodes.length>0 | |
| list.Insert({menu:ssn(mm,"@name").text,under:clean(ssn(mm.ParentNode,"@name").Text)}) | |
| else if !clean(ssn(mm.ParentNode,"@name").text){ | |
| list.Insert({top:ssn(mm,"@name").text,route:route}) | |
| continue | |
| }else{ | |
| name:=clean(ssn(mm.ParentNode,"@name").text) | |
| if (mm.nodename="separator"){ | |
| Menu,%name%,Add | |
| continue | |
| } | |
| Menu,%name%,Add,% ssn(mm,"@name").text hotkey,%route% | |
| if value:=settings.ssn("//*/@" clean(ssn(mm,"@name").text)).text{ | |
| Menu,% name,Check,% ssn(mm,"@name").text hotkey | |
| v.options[clean(ssn(mm,"@name").text)]:=value | |
| } | |
| } | |
| } | |
| for a,b in list{ | |
| if b.top{ | |
| Menu,%menuname%,Add,% b.top,% b.route | |
| continue | |
| } | |
| b.under:=b.under?b.under:menuname | |
| Menu,% b.under,Add,% b.menu,% ":" clean(b.menu) | |
| } | |
| return menuname | |
| menuroute: | |
| item:=clean(A_ThisMenuItem) | |
| %item%() | |
| return | |
| show: | |
| WinActivate,% hwnd([1]) | |
| return | |
| } | |
| move_selected_lines_up(){ | |
| csc().2620 | |
| if (v.options.full_auto){ | |
| SetTimer,move_selected,20 | |
| Sleep,50 | |
| } | |
| } | |
| move_selected_lines_down(){ | |
| csc().2621 | |
| if (v.options.full_auto){ | |
| SetTimer,move_selected,20 | |
| Sleep,50 | |
| } | |
| } | |
| 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%,,% hwnd([17]) | |
| 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: | |
| sc:=csc(),sc.2003(sc.2008,compilebox(msgbox)) | |
| return | |
| 17GuiEscape: | |
| 17GuiClose: | |
| hwnd({rem:17}) | |
| return | |
| mbtest: | |
| dynarun(compilebox(msgbox)) | |
| return | |
| } | |
| 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} | |
| } | |
| 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%,ahk_id%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 | |
| } | |
| m(x*){ | |
| for a,b in x | |
| list.=b "`n" | |
| MsgBox,,AHK Studio,% list | |
| } | |
| t(x*){ | |
| for a,b in x | |
| list.=b "`n" | |
| Tooltip,% list | |
| } | |
| Post_Multiple_Segment_Gist(){ | |
| get_access() | |
| ea:=xml.ea(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()) | |
| } | |
| new_segment(new="",text=""){ | |
| cur:=ssn(current(1),"@file").Text | |
| SplitPath,cur,,dir,,func | |
| if !new | |
| { | |
| FileSelectFile,new,s,%dir%\,Create a new Segment,*.ahk | |
| if ErrorLevel | |
| return | |
| SplitPath,new,filename,dir,,func | |
| new:=InStr(new,".ahk")?new:new ".ahk" | |
| } | |
| if node:=ssn(current(1),"file[@file='" new "']") | |
| return tv(ssn(node,"@tv").Text) | |
| SplitPath,new,file,newdir,,function | |
| incfile:=(newdir=dir)?file:new | |
| top:=TV_Add(file,ssn(current(1),"file/@tv").text),func:=clean(func) | |
| select:=files.under({node:"file",att:{file:new,filename:file,include:Chr(35) "Include " incfile,tv:top},under:current(1)}) | |
| mainfile:=ssn(current(1),"@file").text | |
| main:=update({get:mainfile}),main.="`n#Include " new | |
| update({file:mainfile,text:main}) | |
| current(1).firstchild.removeattribute("sc") | |
| if (text=""){ | |
| MsgBox,36,Insert Function?,Add a new function named %func% to the new Segment? | |
| IfMsgBox,Yes | |
| text:=func "(){`r`n`r`n}" | |
| } | |
| update({file:new,text:text}) | |
| update({edited:cur}),update({edited:new}) | |
| ;future add a way to add stuff to the new file | |
| tv(top) | |
| } | |
| new(filename=""){ | |
| if (filename=1){ | |
| index:=0 | |
| if !FileExist(A_WorkingDir "\Projects") | |
| FileCreateDir,% A_WorkingDir "\Projects" | |
| if !FileExist(A_WorkingDir "\Projects\Untitled") | |
| FileCreateDir,% A_WorkingDir "\Projects\Untitled" | |
| while,FileExist(A_WorkingDir "\Projects\Untitled\Untitled" A_Index) | |
| index:=A_Index | |
| index++ | |
| FileCreateDir,% A_WorkingDir "\Projects\Untitled\Untitled" index | |
| filename:=A_WorkingDir "\Projects\Untitled\Untitled" index "\Untitled.ahk" | |
| FileAppend,`;New File,%filename% | |
| }else if (filename=""){ | |
| FileSelectFile,filename,S,,Create A New Project,*.ahk | |
| if ErrorLevel | |
| return | |
| filename:=InStr(filename,".ahk")?filename:filename ".ahk" | |
| FileAppend,`;New File,%filename% | |
| } | |
| Gui,1:Default | |
| Gui,1:TreeView,SysTreeView321 | |
| root:=open(filename,1) | |
| TV_Modify(root,"Select Vis Focus") | |
| } | |
| New_Scintilla_Window(file=""){ | |
| sc:=csc() | |
| doc:=sc.2357 | |
| sc:=new s(1,{main:1,hide:1}) | |
| csc(sc) | |
| if file{ | |
| newdoc:=files.ssn("//*[@file='" file "']") | |
| m(newdoc.xml) | |
| }else{ | |
| sc.2358(0,doc) | |
| } | |
| Resize() | |
| sc.show() | |
| } | |
| Remove_Scintilla_Window(){ | |
| sc:=csc() | |
| s.delete(sc) | |
| } | |
| Next_Found(){ | |
| sc:=csc() | |
| sc.2606 | |
| sc.2169 | |
| } | |
| notify(csc=""){ | |
| notify: | |
| static last,painted:=0 | |
| if A_EventInfo=512 | |
| return csc(1) | |
| sc:=csc?csc:csc() | |
| csc:="" | |
| if sc.sc!=NumGet(A_EventInfo){ | |
| if (sc.2353(sc.2008-1)>0){ | |
| sc.2351(sc.2008-1,sc.2353(sc.2008-1)),v.highlight:=1 | |
| }else if (sc.2353(sc.2008)>0){ | |
| sc.2351(sc.2008,sc.2353(sc.2008)),v.highlight:=1 | |
| }else if v.highlight{ | |
| sc.2351(-1,-1),v.highlight:=0 | |
| } | |
| 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") | |
| } | |
| fn:=[ ],info:=A_EventInfo | |
| ;,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",3:"position",4:"ch",5:"mod",6:"modType",7:"text",8:"length",9:"linesadded",10:"msg",11:"wparam",12:"lparam",13:"line",14:"fold",22:"updated"} | |
| fn[b]:=NumGet(Info+(A_PtrSize*a)) | |
| cpos:=sc.2008 | |
| if (fn.code=2022){ | |
| actext:=StrGet(fn.text,"cp0") | |
| selcount:=sc.2570 | |
| Loop,%selcount% | |
| { | |
| b:=sc.2577(A_Index-1),start:=sc.2266(b,1),text:=sc.textrange(start,b) | |
| if !InStr(actext,text){ | |
| b:=sc.2577(A_Index-1),sc.2003(b,actext) | |
| }else{ | |
| b:=sc.2579(A_Index-1) | |
| if (l:=commands.ssn("//Context/*/*[text()='" RegExReplace(actext,"#") "']/@list").text){ | |
| if !v.lastbrace | |
| v.word:=actext,actext:=actext "," | |
| } | |
| sc.2190(start),sc.2192(b),sc.2194(StrLen(actext),actext) | |
| b:=sc.2579(A_Index-1),sc.2578(A_Index-1,b+StrLen(actext)),sc.2576(A_Index-1,b+StrLen(actext)) | |
| } | |
| } | |
| sc.2101 | |
| if !v.lastbrace | |
| SetTimer,automenu,10 | |
| v.lastbrace:="" | |
| } | |
| ;if (fn.code=2027) | |
| ;switch this out with 2027 and use GetKeyState("Control","P") and stuff | |
| if (fn.code=2019){ | |
| v.style:={style:sc.2010(fn.position),mod:fn.mod} | |
| if fn.mod=0 | |
| SetTimer,styleclick,1 | |
| if fn.mod=2 | |
| SetTimer,editfont,1 | |
| if fn.mod=4 | |
| SetTimer,editback,1 | |
| } | |
| if (fn.code=2008){ | |
| if ((fn.modtype&0x01)||(fn.modtype&0x02)){ | |
| update({sc:sc.2357}) | |
| v.word:=sc.textrange(sc.2266(cpos,1),sc.2267(cpos,1)) | |
| } | |
| if fn.linesadded | |
| marginwidth(sc) | |
| if (sc.sc=v.codevault.sc){ | |
| LV_GetText(code,LV_GetNext()) | |
| if !locker:=vault.ssn("//code[@name='" code "']") | |
| locker:=vault.Add({path:"code",att:{name:code},dup:1}) | |
| locker.text:=sc.gettext() | |
| } | |
| } | |
| if (fn.code=2004&&sc.sc=v.codevault.sc){ | |
| m("Please create or select a code snippet") | |
| } | |
| if (fn.code=2001){ | |
| if ((fn.ch=10||fn.ch=123||fn.ch=125)&&v.options.full_auto&&sc.2102=0){ | |
| if fn.ch=10 | |
| SetTimer,auto_indent,50 | |
| else | |
| SetTimer,auto_delete,250 | |
| }else if (fn.ch=10&&v.options.fix_next_line){ | |
| SetTimer,fix_next,50 | |
| } | |
| cpos:=sc.2008,start:=sc.2266(cpos,1),end:=sc.2267(cpos,1),word:=sc.textrange(sc.2266(cpos,1),cpos) | |
| if (StrLen(word)>1&&sc.2102=0){ | |
| list:=Trim(v.keywords[SubStr(word,1,1)]) | |
| if list&&instr(list,word) | |
| sc.2100(StrLen(word),list) | |
| } | |
| style:=sc.2010(sc.2008-2) | |
| settimer,context,150 | |
| c:=fn.ch | |
| lll=44,32 | |
| if c in %lll% | |
| replace() | |
| } | |
| if (fn.code=2010){ | |
| margin:=NumGet(info+64) | |
| if margin=0 | |
| return theme({margin:margin,mod:fn.mod}) | |
| scpos:=NumGet(info+12) | |
| modifier:=NumGet(info+20) | |
| if margin=2 | |
| sc.2231(sc.2166(scpos)) | |
| } | |
| if (fn.code=2001){ | |
| width:=sc.2276(32,"aaa") | |
| 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=2007){ | |
| if (sc.2353(sc.2008-1)>0){ | |
| sc.2351(sc.2008-1,sc.2353(sc.2008-1)),v.highlight:=1 | |
| }else if (sc.2353(sc.2008)>0){ | |
| sc.2351(sc.2008,sc.2353(sc.2008)),v.highlight:=1 | |
| }else if v.highlight{ | |
| sc.2351(-1,-1),v.highlight:=0 | |
| } 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") | |
| } | |
| return | |
| Full_Auto: | |
| Fix_Next_Line: | |
| onoff:=settings.ssn("//Auto_Indent/@ " A_ThisLabel).text?0:1 | |
| att:=[],att[A_ThisLabel]:=onoff | |
| settings.add({path:"Auto_Indent",att:att}) | |
| Menu,%A_ThisMenu%,ToggleCheck,%A_ThisMenuItem% | |
| v.options[A_ThisLabel]:=onoff | |
| return | |
| } | |
| Send_WM_COPYDATA(AID,String,Key=25565){ | |
| VarSetCapacity(Struct,12,0) | |
| NumPut(StrPut(string,"utf-8")*2,struct,4),NumPut(&string,struct,8) | |
| SendMessage,0x4a,%Key%,&Struct,,ahk_id %AID% ahk_class AutoHotkey | |
| } | |
| WM_COPYDATA(wParam,lParam){ | |
| if wParam != 25565 | |
| return false | |
| file:=StrGet(NumGet(lparam+8)) | |
| if (file){ | |
| open(file) | |
| v.tv:=files.ssn("//main[@file='" file "']/file/@tv").text | |
| tv(v.tv) | |
| WinActivate,% hwnd([1]) | |
| } | |
| return true | |
| } | |
| OtherInstance(){ | |
| WinGet,Wins,List,%A_ScriptFullPath% ahk_class AutoHotkey | |
| Loop, %Wins% | |
| if (Wins%A_Index% != A_ScriptHwnd) | |
| return Wins%A_Index% | |
| return 0 | |
| } | |
| open_folder(){ | |
| sc:=csc() | |
| file:=files.ssn("//*[@sc='" sc.2357 "']/@file").Text | |
| SplitPath,file,,dir | |
| Run,%dir% | |
| } | |
| open(filelist="",show=""){ | |
| static root,top | |
| if !filelist{ | |
| FileSelectFile,filename,,,,*.ahk | |
| if ErrorLevel | |
| return | |
| if ff:=files.ssn("//main[@file='" filename "']"){ | |
| Gui,1:Default | |
| tv:=ssn(ff.firstchild,"@tv").text | |
| TV_Modify(tv,"Select Vis Focus") | |
| return | |
| } | |
| fff:=FileOpen(filename,"RW","utf-8") | |
| file1:=file:=fff.read(fff.length) | |
| gosub,addfile | |
| Gui,1:TreeView,SysTreeView321 | |
| TV_Modify(root,"Select Vis Focus") | |
| }else{ | |
| for a,b in StrSplit(filelist,"`n"){ | |
| if files.ssn("//main[@file='" b "']") | |
| continue | |
| fff:=FileOpen(b,"RW","utf-8") | |
| file1:=file:=fff.read(fff.length) | |
| filename:=b | |
| gosub,addfile | |
| if show | |
| tv(root) | |
| } | |
| } | |
| return root | |
| addfile: | |
| Gui,1:Default | |
| SplitPath,filename,fn,dir | |
| top:=files.add({path:"main",att:{file:filename},dup:1}) | |
| pos:=1 | |
| root:=TV_Add(fn) | |
| ;file:=file1:=RegExReplace(file1,"(\r|\r\n)","`n") | |
| StringReplace,file,file,`r`n,`n,All | |
| StringReplace,file,file,`r,`n,All | |
| file1:=file | |
| files.under({under:top,node:"file",att:{file:filename,tv:root,filename:fn}}) | |
| for a,b in strsplit(file1,"`n"){ | |
| if InStr(b,"#include") | |
| while,(d:=substr(b,instr(b," ",0,1,a_index)+1))&&instr(b," ",0,1,a_index){ | |
| newfn:=FileExist(dir "\" d)?dir "\" d:FileExist(d)?d:"" | |
| if newfn | |
| break | |
| } | |
| if (newfn){ | |
| StringReplace,file1,file1,%b%,,All | |
| } | |
| if !newfn | |
| continue | |
| if ssn(top,"file[@file='" newfn "']") | |
| continue | |
| SplitPath,newfn,fn | |
| child:=TV_Add(fn,root,"Sort") | |
| top:=files.ssn("//main[@file='" filename "']") | |
| files.under({under:top,node:"file",att:{file:newfn,include:b,tv:child,filename:fn}}) | |
| ffff:=FileOpen(newfn,"RW","utf-8") | |
| text:=ffff.read(ffff.length) | |
| StringReplace,text,text,`r`n,`n,All | |
| update({file:newfn,text:text}) | |
| } | |
| update({file:filename,text:Trim(file,"`r`n")}) | |
| ff:=files.sn("//file") | |
| if !settings.ssn("//open/file[text()='" filename "']") | |
| settings.add({path:"open/file",text:filename,dup:1}) | |
| Gui,1:Default | |
| TV_Modify(TV_GetChild(0),"Select Focus Vis") | |
| return | |
| } | |
| options(){ | |
| static list:={show_eol:2356,Show_Caret_Line:2096,show_whitespace:2021,word_wrap:2268} | |
| Show_EOL: | |
| Show_Caret_Line: | |
| Show_WhiteSpace: | |
| sc:=csc() | |
| onoff:=settings.ssn("//options/@ " A_ThisLabel).text?0:1 | |
| att:=[],att[A_ThisLabel]:=onoff | |
| settings.add({path:"options",att:att}) | |
| togglemenu(A_ThisLabel) | |
| v.options[A_ThisLabel]:=onoff | |
| sc[list[A_ThisLabel]](onoff) | |
| option:=settings.ssn("//options") | |
| ea:=settings.ea(option) | |
| for c,d in s.main | |
| for a,b in ea | |
| d[list[a]](b) | |
| return | |
| Small_Icons: | |
| onoff:=settings.ssn("//options/@ " A_ThisLabel).text?0:1 | |
| att:=[],att[A_ThisLabel]:=onoff | |
| settings.add({path:"options",att:att}) | |
| togglemenu(A_ThisLabel) | |
| m("Requires a reboot to take effect.") | |
| return | |
| word_wrap: | |
| onoff:=settings.ssn("//options/@ " A_ThisLabel).text?0:1 | |
| att:=[],att[A_ThisLabel]:=onoff | |
| settings.add({path:"options",att:att}) | |
| togglemenu(A_ThisLabel) | |
| csc().2268(onoff) | |
| return | |
| } | |
| paste(){ | |
| paste: | |
| ControlGetFocus,Focus,% hwnd([1]) | |
| if !InStr(Focus,"Scintilla"){ | |
| ControlSend,%focus%,^v | |
| return | |
| } | |
| csc().2179 | |
| if InStr(Clipboard,"`n")||InStr(Clipboard,"`r") | |
| SetTimer,fix_paste,On | |
| return | |
| } | |
| 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,% hwnd([6]) | |
| Gui,Show,,Variables | |
| vars:=settings.sn("//Variables/*") | |
| while,vv:=vars.item(A_Index-1) | |
| LV_Add("",vv.text) | |
| ControlFocus,Edit1,% hwnd([6]) | |
| 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,,% hwnd([6]) | |
| return | |
| 6GuiClose: | |
| 6GuiEscape: | |
| keywords(),hwnd({rem:6}) | |
| refreshthemes() | |
| return | |
| } | |
| posinfo(){ | |
| sc:=csc() | |
| current:=sc.2008 | |
| line:=sc.2166(current),se:=[] | |
| ind:=sc.2128(line) | |
| lineend:=sc.2136(line) | |
| se[current]:=1,se[sc.2009]:=1 | |
| return {current:current,line:line,ind:ind,lineend:lineend,start:se.minindex(),end:se.maxindex()} | |
| } | |
| 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 | |
| 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) | |
| } | |
| publish(return=""){ | |
| sc:=csc(),text:=update("get").1,save() | |
| mainfile:=ssn(current(1),"@file").text | |
| publish:=update({get:mainfile}) | |
| includes:=sn(current(1),"*/@include/..") | |
| while,ii:=includes.item[A_Index-1] | |
| if InStr(publish,ssn(ii,"@include").text) | |
| StringReplace,publish,publish,% ssn(ii,"@include").text,% update({get:ssn(ii,"@file").text}),All | |
| ea:=xml.ea(vversion.ssn("//*[@file='" ssn(current(1),"@file").text "']")) | |
| newver:=ea.version "." ea.increment | |
| if InStr(publish,Chr(59) "auto_version") | |
| publish:=RegExReplace(publish,Chr(59) "auto_version",newver) | |
| 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 | |
| StringReplace,publish,publish,`n,`r`n,All | |
| Clipboard:=publish | |
| MsgBox,,AHK Studio,Project compiled and coppied to your clipboard,.6 | |
| } | |
| qf(){ | |
| static quickfind:=[],find | |
| qf: | |
| ControlGetText,find,Edit1,% hwnd([1]) | |
| pre:="O",find1:="" | |
| find1:=v.options.regex?find:"\Q" find "\E" | |
| pre.=v.options.greed?"":"U" | |
| pre.=v.options.case_sensitive?"":"i" | |
| find1:=pre ")(" find1 ")" | |
| sc:=csc() | |
| if (find=""||find="."||find=".*"||find="\"){ | |
| sc.2571 | |
| return | |
| } | |
| text:=sc.getuni() | |
| if sc.2508(0,start:=quickfind[sc.2357]+1)!=""{ | |
| end:=sc.2509(0,start) | |
| if end | |
| text:=SubStr(text,1,end) | |
| } | |
| pos:=start?start:1 | |
| pos:=pos=0?1:pos | |
| sc.2571 | |
| while,pos:=RegExMatch(text,find1,found,pos){ | |
| if (A_Index=1&&found.len()) | |
| sc.2160(pos-1+found.len(),pos-1) | |
| else | |
| sc.2573(pos-1+found.len(),pos-1) | |
| pos+=found.len() | |
| } | |
| sc.2574(0) | |
| sc.2169 | |
| return | |
| next: | |
| sc:=csc() | |
| sc.2606 | |
| sc.2169 | |
| return | |
| Quick_Find_Settingsguiescape: | |
| sc:=csc() | |
| sc.2400 | |
| return | |
| clear_selection: | |
| sc:=csc(),sc.2505(0,sc.2006) | |
| quickfind.remove(sc.2357),qf() | |
| return | |
| set_selection: | |
| sc:=csc() | |
| if (sc.2008=sc.2009) | |
| goto clear_selection | |
| sc.2505(0,sc.2006) | |
| minmax:=[] | |
| minmax[sc.2008]:=1,minmax[sc.2009]:=1 | |
| for a,b in s.main | |
| b.2080(0,8),b.2082(0,0xff00ff) | |
| quickfind[sc.2357]:=MinMax.MinIndex() | |
| sc.2504(MinMax.MinIndex(),MinMax.MaxIndex()-MinMax.MinIndex()),sc.2571,qf() | |
| return | |
| quick_find: | |
| gosub,set_selection | |
| ControlFocus,Edit1,% hwnd([1]) | |
| Send,^A | |
| qf() | |
| return | |
| Case_Sensitive: | |
| Regex: | |
| Greed: | |
| onoff:=settings.ssn("//Quick_Find_Settings/@ " A_ThisLabel).text?0:1 | |
| att:=[],att[A_ThisLabel]:=onoff | |
| settings.add({path:"Quick_Find_Settings",att:att}) | |
| togglemenu(A_ThisLabel) | |
| v.options[A_ThisLabel]:=onoff | |
| goto qf | |
| return | |
| checkqf: | |
| ControlGetFocus,Focus,% hwnd([1]) | |
| if (Focus="Edit1") | |
| goto qf | |
| return | |
| } | |
| togglemenu(Label){ | |
| item:=menus.ssn("//*[@clean='" Label "']") | |
| menu:=ssn(item.ParentNode,"@clean").text | |
| item:=ssn(item,"@name").text | |
| Menu,%Menu%,ToggleCheck,%item% | |
| } | |
| class rebar{ | |
| static hw:=[],keep:=[] | |
| __New(win=1,hwnd="",special=""){ | |
| static id:=0 | |
| id:=hwnd.id?hwnd.id:++id | |
| this.id:=id | |
| code:=0x10000000|0x40000000 | |
| code|=0x200|0x400|0x8000|0x2000|0x40 | |
| Gui,%win%:Add,custom,ClassReBarWindow32 hwndrhwnd w500 h400 grebar +%code% Background0 | |
| this.hwnd:=rhwnd,this.count:=count | |
| this.keep[rhwnd]:=this | |
| this.ahkid:="ahk_id" rhwnd | |
| v.rebarahkid:=this.ahkid | |
| this.parent:=hwnd | |
| Loop,2 | |
| SendMessage,0x400+19,0,0xff0000,,% this.ahkid | |
| rebar.hw.insert(this) | |
| } | |
| hide(id){ | |
| SendMessage,0x400+16,id,0,,% this.ahkid ;RB_IDTOINDEX | |
| SendMessage,0x400+35,%errorlevel%,0,,% this.ahkid ;RB_SHOWBAND | |
| } | |
| show(id){ | |
| SendMessage,0x400+16,id,0,,% this.ahkid ;RB_IDTOINDEX | |
| SendMessage,0x400+35,%errorlevel%,1,,% this.ahkid ;RB_SHOWBAND | |
| } | |
| add(gui,style="",mask=132){ | |
| static id:=10000,struct:={hwnd:32,height:40,width:44,id:52,max:60,int:64,ideal:68} | |
| mask|=0x20|0x100|0x2|0x10|0x200|0x40|0x08|0x1|0x4|0x80 | |
| style|=0x4|0x200|0x80 | |
| if gui.max | |
| style|=0x40 | |
| VarSetCapacity(BAND,80,0) | |
| if gui.label | |
| VarSetCapacity(BText,StrLen(gui.label)*2),StrPut(gui.label,&BText,"utf-8") | |
| win:=gui.win?gui.win:1 | |
| NumPut(225525,band,12) | |
| if hwnd:=toolbar.list[gui.id].hwnd | |
| gui.hwnd:=hwnd | |
| if hh:=toolbar.list[gui.id].barinfo().height | |
| gui.height:=hh | |
| for a,b in gui{ | |
| if struct[a] | |
| NumPut(b,band,struct[a]) | |
| } | |
| for a,b in {0:80,4:mask,8:style,20:&BText} | |
| if b | |
| NumPut(b,band,a) | |
| SendMessage,0x400+1,-1,&BAND,,% "ahk_id" this.hwnd | |
| } | |
| getpos(hwnd){ | |
| ControlGetPos,x,y,w,h,,ahk_id%hwnd% | |
| return {x:x,y:y,w:w,h:h} | |
| } | |
| save(){ | |
| lasttop:=0 | |
| for a,b in rebar.hw{ | |
| vis:=settings.sn("//rebar/band/@vis") | |
| top:=settings.ssn("//rebar") | |
| while,vv:=vis.item[A_Index-1] | |
| vv.text:=0 | |
| newline:=sn(top,"newline") | |
| while,new:=newline.item[A_Index-1] | |
| new.parentnode.removechild(new) | |
| SendMessage,0x400+12,0,0,,% b.ahkid ;RB_GETBANDCOUNT | |
| Loop,%ErrorLevel%{ | |
| NumPut(VarSetCapacity(band,80),&band,0),NumPut(0x140,&band,4) ;get the width and id of the band | |
| SendMessage,0x400+28,% A_Index-1,&band,,% b.ahkid ;RB_GETBANDINFOW | |
| id:=NumGet(&band,52) | |
| VarSetCapacity(rect,16) | |
| SendMessage,0x400+9,% A_Index-1,&rect,,% b.ahkid ;RB_GETRECT | |
| y:=NumGet(rect,4),width:=NumGet(rect,8)-NumGet(rect,0) | |
| if (y>lasttop) | |
| settings.under({under:top,node:"newline",att:{vis:1}}) | |
| lasttop:=y | |
| next:=settings.ssn("//rebar/band[@id='" id "']"),next.SetAttribute("width",width) | |
| next.setattribute("vis",1),next.parentnode.appendchild(next) | |
| } | |
| } | |
| } | |
| notify(){ | |
| rebar: | |
| code:=NumGet(A_EventInfo,8,"int") | |
| this:=rebar.keep[NumGet(A_EventInfo)] | |
| if (code=-841) | |
| m("Chevron Pushed") | |
| if (code=-831&&NumGet(A_EventInfo)=this.hwnd){ | |
| Resize() | |
| GuiControl,1:+Redraw,SysTreeView321 | |
| } | |
| if (code=-841){ | |
| NumPut(VarSetCapacity(band,80),band,0) | |
| NumPut(0x10,band,4) | |
| bd:=NumGet(A_EventInfo+12) | |
| SendMessage,0x400+28,%bd%,&band,,% this.ahkid | |
| childwindowhwnd:=NumGet(band,32) | |
| } | |
| return | |
| } | |
| } | |
| redo(){ | |
| csc().2011 | |
| } | |
| refreshthemes(){ | |
| refresh(),theme:=csc(1) | |
| Loop,31 | |
| v.theme.2409(A_Index,1) | |
| ea:=settings.ea("//fonts/font[@style='5']") | |
| hwnd:=hwnd("get") | |
| for win,b in hwnd{ | |
| if win>99 | |
| return | |
| winget,controllist,ControlList,% "ahk_id" b | |
| Gui,%win%:Default | |
| Gui,%win%:font,% "c" RGB(ea.color) " s" ea.size,% ea.font | |
| loop,Parse,ControlList,`n | |
| { | |
| if (win=1&&A_LoopField="Edit1") | |
| Gui,1:font,% "Normal s10",% ea.font | |
| GuiControl,% "+background" RGB(ea.Background) " c" rgb(ea.color),%A_LoopField% | |
| GuiControl,% "font",%A_LoopField% | |
| } | |
| } | |
| } | |
| Remove_Segment(){ | |
| current:=current() | |
| filename:=ssn(current(1),"@file").Text | |
| include:=ssn(current(),"@include").text | |
| if (ssn(current,"@file").text=filename) | |
| return m("You can not remove the main file from the project") | |
| MsgBox,260,Remove Segment from this Project?,Remove it? | |
| IfMsgBox,No | |
| return | |
| MsgBox,308,Delete this file from the computer?,Permanently delete this file? | |
| IfMsgBox,Yes | |
| FileDelete,% ssn(current,"@file").text | |
| mainfile:=update({get:filename}) | |
| StringReplace,mainfile,mainfile,%include%,,All | |
| update({file:filename,text:mainfile}) | |
| scin:=ssn(current(1),"file").removeattribute("sc") ;,scin.ParentNode.removechild(scin) | |
| TV(ssn(current(1),"@tv").text) | |
| Gui,1:TreeView,SysTreeView32 | |
| TV_Delete(ssn(current,"@tv").text) | |
| tv(ssn(current.previousSibling,"@tv").text) | |
| current.parentnode.removechild(current) | |
| up:=update({edited:filename}) | |
| } | |
| Remove_Spaces_From_Selected(){ | |
| sc:=csc(),pos:=posinfo() | |
| replace:=sc.textrange(pos.start,pos.end) | |
| replace:=RegExReplace(replace," ") | |
| sc.2170(0,replace) | |
| } | |
| replace_selected(){ | |
| InputBox,replace,Replace Selected,Input text to replace what is selected | |
| if ErrorLevel | |
| return | |
| sc:=csc() | |
| clip:=Clipboard | |
| strip:="``r,``n,``r``n,\r,\n,\r\n" | |
| for a,b in StrSplit(strip,","){ | |
| replace:=RegExReplace(replace,"i)\Q" b "\E",Chr(13)) | |
| } | |
| sc.2614(1) | |
| Clipboard:=replace | |
| sc.2179 | |
| Clipboard:=clip | |
| } | |
| replace(){ | |
| sc:=csc(),cp:=sc.2008 | |
| sc:=csc() | |
| selcount:=sc.2570 | |
| loop,%selcount% | |
| { | |
| word:=sc.textrange(start:=sc.2266(sc.2577(A_Index-1)-1,1),end:=sc.2267(sc.2577(A_Index-1)-1,1)) | |
| if w:=settings.ssn("//replacements/*[@replace='" word "']").text | |
| sc.2190(start),sc.2192(end),sc.2194(StrLen(w),w) | |
| } | |
| v.word:=w?w:word | |
| if !v.lastbrace | |
| SetTimer,automenu,10 | |
| } | |
| resize(info*){ | |
| static width,height,rheight,band | |
| if (info.1="get"){ | |
| WinGetPos,x,y,,,% hwnd([1]) | |
| return size:="x" x " y" y " w" width " h" height | |
| } | |
| if (A_Gui=1){ | |
| height:=info.2>>16?info.2>>16:height,width:=info.2&0xffff?info.2&0xffff:width | |
| SendMessage,0x400+27,0,0,,% "ahk_id" rebar.hw.1.hwnd | |
| rheight:=ErrorLevel | |
| } | |
| ControlGetPos,,y,,h,,% "ahk_id" rebar.hw.1.hwnd | |
| yoffset:=y+h | |
| ControlMove,,,,%width%,,% "ahk_id" rebar.hw.1.hwnd | |
| hh:=height-h-v.StatusBar-2 | |
| ;ControlMove,,,%yoffset%,%width%,%hh%,% "ahk_id" v.win3 | |
| x:=0,max:=s.main.MaxIndex() | |
| GuiControl,1:Move,SysTreeView321,x0 y%h% w200 h%hh% | |
| x+=200 | |
| for a,b in s.main{ | |
| if (A_Index!=max){ | |
| GuiControl,1:Move,% b.sc,% "x" x " y" h "w" round((width-200)/max) " h" hh | |
| x+=round((width-200)/max) | |
| } | |
| else | |
| GuiControl,1:Move,% b.sc,% "x" x " y" h "w" width-x " h" hh | |
| sleep,0 | |
| } | |
| GuiControl,+Redraw,% v.sbhwnd | |
| 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 | |
| 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,,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: | |
| file:=ssn(current(),"@file").text | |
| SplitPath,file,filename,dir | |
| LV_GetText(bdir,LV_GetNext()) | |
| ;FileRead,contents,% dir "\backup\" bdir "\" filename | |
| oldfile:=dir "\backup\" bdir "\" filename | |
| fff:=FileOpen(oldfile,"RW","utf-8") | |
| contents1:=fff.read(fff.length) | |
| length:=VarSetCapacity(text,strput(contents,"utf-8")) | |
| StrPut(contents1,&text,length,"utf-8") | |
| ;sc.2037(65001),sc.2181(0,&text),set(),sc.2175 | |
| csc().2181(0,&text) | |
| 16GuiClose: | |
| 16GuiEscape: | |
| hwnd({rem:16}) | |
| return | |
| } | |
| rgb(c){ | |
| setformat,IntegerFast,H | |
| c:=(c&255)<<16 | (c&65280) | (c>>16),c:=SubStr(c,1) | |
| SetFormat, integerfast,D | |
| return c | |
| } | |
| run_selected_text(){ | |
| dynarun(csc().getseltext()) | |
| } | |
| run(){ | |
| sc:=csc(),save() | |
| main:=files.ssn("//*[@sc='" sc.2357 "']..") | |
| file:=ssn(main,"@file").text | |
| if (file=A_ScriptFullPath) | |
| exit(1) | |
| SplitPath,file,,dir | |
| Run,%file%,%dir% | |
| if (file=A_ScriptFullPath) | |
| ExitApp | |
| } | |
| runfile(file){ | |
| SplitPath,file,,dir | |
| run,%file%,%dir% | |
| } | |
| save(){ | |
| info:=update("get"),now:=A_Now | |
| for filename in info.2{ | |
| ;if root:=files.ssn("//main[@file='" filename "']"){ | |
| ;inc:=sn(root,"*/@include") | |
| ;text:=info.1[filename] | |
| ;while,ii:=inc.item[A_Index-1] | |
| ;text.="`r`n" ii.text | |
| ;} | |
| ;else{ | |
| text:=info.1[filename] | |
| ;} | |
| SplitPath,filename,file,dir | |
| if !FileExist(dir "\backup") | |
| FileCreateDir,% dir "\backup" | |
| if !FileExist(dir "\backup\" now) | |
| FileCreateDir,% dir "\backup\" now | |
| FileMove,%filename%,% dir "\backup\" now "\" file,1 | |
| StringReplace,text,text,`n,`r`n,All | |
| FileAppend,%text%,%filename%,utf-8 | |
| } | |
| getpos(),savegui(),positions.save(1),vversion.save(1) | |
| lastfiles() | |
| update("clearupdated") | |
| } | |
| scintilla_code_lookup(){ | |
| static scintilla,slist,cs | |
| if !FileExist("lib\scintilla.xml"){ | |
| SplashTextOn,300,100,Downloading definitions,Please wait | |
| URLDownloadToFile,http://files.maestrith.com/scintilla/scintilla.xml,lib\scintilla.xml | |
| SplashTextOff | |
| } | |
| if !IsObject(scintilla) | |
| scintilla:=new xml("scintilla","lib\scintilla.xml") | |
| if scintilla.ssn("//date").text!=20140129 | |
| m("File may be out of date (or maestrith forgot to update this)") | |
| ;scintilla:=show_scintilla_code_in_line(1), | |
| slist:=scintilla.sn("//item"),scl:=setup(8,1) | |
| 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("",ssn(sl,"@name").text,ssn(sl,"@code").text,ssn(sl,"@syntax").text) | |
| Gui,show,,Scintilla Code Lookup | |
| Loop,3 | |
| LV_ModifyCol(A_Index,"AutoHDR") | |
| hotkeys([8],{up:"sclup",down:"scldn"}) | |
| return | |
| sclup: | |
| scldn: | |
| return lv_select(8,A_ThisLabel="sclup"?-1:1) | |
| docsite: | |
| Run,http://www.scintilla.org/ScintillaDoc.html | |
| return | |
| codesort: | |
| Gui,8:Submit,Nohide | |
| Gui,8:Default | |
| GuiControl,-Redraw,SysListView321 | |
| LV_Delete() | |
| slist:=scintilla.sn("//*[contains(@name,'" cs "')]") | |
| while,sl:=slist.item(A_Index-1) | |
| LV_Add("",ssn(sl,"@name").text,ssn(sl,"@code").text,ssn(sl,"@syntax").text) | |
| LV_Modify(1,"Select Vis Focus") | |
| GuiControl,+Redraw,SysListView321 | |
| return | |
| insert: | |
| LV_GetText(code,LV_GetNext(),2) | |
| sc:=csc() | |
| 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: | |
| hwnd({rem:8}) | |
| ;Destroy(8) | |
| return | |
| } | |
| Scratch_Pad(){ | |
| static file | |
| if !IsObject(file){ | |
| FileCreateDir,Projects | |
| file:=FileOpen("projects\Scratch Pad.ahk","rw") | |
| } | |
| setup(14) | |
| v.scratch:=new s(14,{pos:"w500 h300"}),hotkeys([14],{Esc:"14guiclose"}) | |
| csc({hwnd:v.scratch.sc}),v.scratch.2181(0,file.read(file.length)) | |
| Gui,Add,Button,gsprun,Run | |
| Gui,Add,Button,x+10 gspdyna,Dyna Run | |
| Gui,Add,Button,x+10 gspkill,Kill Process | |
| Gui,Show,,Scratch Pad | |
| bracesetup(14) | |
| return | |
| 14GuiClose: | |
| gosub spsave | |
| hwnd({rem:14}) | |
| csc("Scintilla1") | |
| goto spkill | |
| return | |
| sprun: | |
| gosub spsave | |
| Run,projects\Scratch Pad.ahk,,,pid | |
| v.scratchpid:=pid | |
| return | |
| spdyna: | |
| v.scratchpid:=dynarun(v.scratch.getText()) | |
| return | |
| spkill: | |
| if (v.scratchpid){ | |
| while,WinExist("ahk_pid" v.scratchpid){ | |
| WinClose,% "ahk_pid" v.scratchpid " ahk_class AutoHotkey",, 2 | |
| Sleep,500 | |
| if WinExist("ahk_pid" v.scratchpid) | |
| MsgBox,51,Unable to close the previous script,Try again? | |
| IfMsgBox,no | |
| break | |
| IfMsgBox,Cancel | |
| break | |
| } | |
| } | |
| return | |
| spsave: | |
| file.seek(0) | |
| file.write(v.scratch.gettext()) | |
| file.length(file.position),file.seek(0) | |
| return | |
| } | |
| set_as_default_editor(){ | |
| pgm= | |
| ( | |
| RegWrite,REG_SZ,HKEY_LOCAL_MACHINE,SOFTWARE\Classes\AutoHotkeyScript\Shell\Edit\Command,,"%A_AhkPath%" "%A_ScriptFullPath%" "```%1" | |
| ) | |
| m("The program must be run as administrator to use this feature.") | |
| dynarun(pgm) | |
| } | |
| set(){ | |
| sc:=csc() | |
| color(sc) | |
| } | |
| refresh(){ | |
| for a,b in s.Ctrl | |
| color(b) | |
| } | |
| color(con){ | |
| static options:={show_eol:2356,Show_Caret_Line:2096} | |
| 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.ea(n) | |
| if (ea.style=33) | |
| for a,b in [2290,2291] | |
| con[b](1,ea.Background) | |
| ea.style:=ea.style=5?32:ea.style | |
| for a,b in ea{ | |
| if list[a]&&ea.style!="" | |
| 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,20],[2242,2,13],[2460,3],[2462,1],[2134,1],[2260,1],[2246,2,1],[2115,1],[2242,1,0],[2029,2],[2031,2]] | |
| con[b.1](b.2,b.3) | |
| con.2132(1)con.2242(2,13),con.2077(0,"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ#_") | |
| con.2115(1),con.2036(5) | |
| con.2056(38,"Tahoma") | |
| con.4006(0,"asm"),con.2212,con.2371 | |
| ;con.2037(65001) | |
| con.2080(7,6) | |
| con.2082(7,0xff00ff) | |
| con.2498(1,7) | |
| for a,b in options | |
| if v.options[a] | |
| con[b](b) | |
| kwind:={indent:1,Directives:2,KeyNames:8,builtin:4,keywords:5,functions:6,Commands:3,flow:7,Personal:0} | |
| for a,b in v.color | |
| con.4005(kwind[a],RegExReplace(b,"#")) | |
| } | |
| setpos(tv){ | |
| static | |
| Sleep,0 | |
| sc:=csc() | |
| GuiControl,-Redraw,% sc.sc | |
| node:=files.ssn("//*[@tv='" tv "']") | |
| file:=ssn(node,"@file").text | |
| parent:=ssn(node,"../@file").text | |
| posinfo:=positions.ssn("//main[@file='" parent "']/file[@file='" file "']") | |
| doc:=ssn(node,"@sc").text | |
| ea:=xml.ea(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) | |
| GuiControl,+Redraw,% sc.sc | |
| } | |
| setup(window,nodisable=""){ | |
| ea:=settings.ea(settings.ssn("//fonts/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,+Owner1 | |
| Gui,color,% RGB(Background),% RGB(Background) | |
| Gui,Font,% "s" size " c" color " bold",%font% | |
| Gui,%window%:Default | |
| v.window[window]:=1,hwnd(window,hwnd) | |
| return hwnd | |
| } | |
| show_scintilla_code_in_line(get=""){ | |
| static scintilla | |
| if !FileExist("lib\scintilla.xml"){ | |
| SplashTextOn,300,100,Downloading definitions,Please wait | |
| URLDownloadToFile,http://files.maestrith.com/scintilla/scintilla.xml,lib\scintilla.xml | |
| SplashTextOff | |
| } | |
| if !IsObject(scintilla) | |
| scintilla:=new xml("scintilla","lib\scintilla.xml") | |
| if Get | |
| return scintilla | |
| sc:=csc() | |
| 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.=ssn(c,"@name").text " " | |
| pos+=5 | |
| list.="`n" | |
| } | |
| if list | |
| m(list) | |
| } | |
| sn(node,path){ | |
| return node.SelectNodes(path) | |
| } | |
| social(){ | |
| Run,http://goo.gl/9odUcj | |
| } | |
| Sort_Selected(){ | |
| static text,del | |
| sc:=csc(),text:=sc.getseltext() | |
| if !Text | |
| return m("Please select some text first.") | |
| setup(18) | |
| Gui,Add,Edit,w200 vdel | |
| Gui,Add,Button,x+10 gsortdel,Sort By Delimeter | |
| Gui,Add,Button,xm gsortbyslash,Sort By \ | |
| Gui,Add,Edit,w500 h500,%text% | |
| Gui,Add,Button,greplace,Replace Selected | |
| Gui,Show,,Sort Selected | |
| return | |
| sortbyslash: | |
| Sort,text,\ ;%del% | |
| StringReplace,text,text,`n,`r`n,all | |
| ControlSetText,Edit2,%text%,% hwnd([18]) | |
| Return | |
| sortdel: | |
| Gui,18:Submit,Nohide | |
| Sort,text,D%del% | |
| StringReplace,text,text,`n,`r`n,all | |
| ControlSetText,Edit2,%text%,% hwnd([18]) | |
| return | |
| 18GuiClose: | |
| 18GuiEscape: | |
| hwnd({rem:18}) | |
| replace: | |
| Gui,18:Submit | |
| StringReplace,text,text,`r`n,`n,all | |
| csc().2170(0,text) | |
| hwnd({rem:18}) | |
| Return | |
| } | |
| ssn(node,path){ | |
| return node.SelectSingleNode(path) | |
| } | |
| testing(){ | |
| m("This is a test") | |
| } | |
| +Esc:: | |
| ;Menu,Tray,Icon,shell32.dll,1,1 | |
| sc:=csc() | |
| m(sc.2010(sc.2008)) | |
| return | |
| Add_Spaces_After_Commas(){ | |
| sc:=csc() | |
| m(sc.getselection()) | |
| } | |
| Add_Spaces_Before_Commas(){ | |
| } | |
| Theme(info=""){ | |
| if info | |
| goto returnedinfo | |
| hwnd({rem:3}) | |
| setup(3),hotkeys([3],{Esc:"3GuiClose"}),v.themelist:=[] | |
| Gui,3:Default | |
| Gui,+hwndhwnd Owner1 | |
| Gui,Add,TreeView,w200 h500 gthemetv AltSubmit | |
| theme:=new s(3,{pos:"x+10 w500 h500"}),v.theme:=theme | |
| theme.2181(0,themetext()),csc({hwnd:theme.sc}),hotkeys([3],{Delete:"themedelete"}) | |
| Gui,Add,Button,Hidden x0 y0 gthemetv Default,go | |
| fix_indent() | |
| Loop,31 | |
| theme.2409(A_Index,1) | |
| Gui,Show,,Theme Editor | |
| theme.2246(0,1),theme.2400,theme.2563(0) | |
| v.themelist:=[] | |
| color:=TV_Add("Color") | |
| for a,b in ["Background","Default Background Color","Default Font Style","Caret","Caret Line Background","End Of Line Color","Reset To Default","Indent Guide","Multiple Selection Foreground","Multiple Selection Background" | |
| ,"Main Selection Foreground","Main Selection Background"] | |
| v.themelist[TV_Add(b,color,"Sort")]:=b | |
| options:=TV_Add("Theme Options") | |
| for a,b in ["Edit Theme Name","Edit Author","Download Themes","Export Theme","Import Theme","Save Theme"] | |
| v.themelist[TV_Add(b,options,"Sort")]:=b | |
| v.themelist[TV_Add("Color Input Method")]:="Color Input Method" | |
| themes:=TV_Add("Themes"),v.themetv:=themes | |
| tlist:=preset.sn("//preset/fonts/name") | |
| while,n:=tlist.item(A_Index-1) | |
| v.themelist[TV_Add(n.text,themes)]:="themes list" | |
| TV_Add("More Coming Soon...") | |
| for a,b in [color,options,themes] | |
| TV_Modify(b,"Expand") | |
| return event:="" | |
| themetv: | |
| event:=v.themelist[TV_GetSelection()] | |
| if (A_GuiEvent!="normal"&&A_GuiEvent!="K") | |
| return | |
| if (event="Themes List"){ | |
| TV_GetText(theme,TV_GetSelection()) | |
| overwrite:=preset.ssn("//name[text()='" theme "']..") | |
| clone:=overwrite.clonenode(1) | |
| rem:=settings.ssn("//fonts"),rem.ParentNode.RemoveChild(rem) | |
| settings.ssn("*").appendchild(clone) | |
| csc().2181(0,themetext()) | |
| refreshthemes() | |
| } | |
| if (event="export theme"){ | |
| FileCreateDir,Themes | |
| name:=settings.ssn("//fonts/name").text | |
| temp:=new xml("fonts","Themes\" name ".xml") | |
| font:=settings.ssn("//fonts") | |
| clone:=font.clonenode(1) | |
| temp.xml.loadxml(clone.xml) | |
| temp.save(1) | |
| m("Theme saved to " A_ScriptDir "\Themes\" name ".xml") | |
| } | |
| if (event="import theme"){ | |
| FileSelectFile,theme,,,,*.xml | |
| if ErrorLevel | |
| return | |
| temp:=ComObjCreate("MSXML2.DOMDocument"),temp.setProperty("SelectionLanguage","XPath") | |
| temp.load(theme) | |
| if !(ssn(temp,"//name").xml&&ssn(temp,"//author").xml&&ssn(temp,"//fonts").xml) | |
| return m("Theme not compatible") | |
| top:=ssn(temp,"*") | |
| rem:=settings.ssn("//fonts") | |
| rem.ParentNode.RemoveChild(rem) | |
| tt:=settings.ssn("*") | |
| tt.appendchild(top) | |
| event:="Save Theme" | |
| } | |
| if (event="Edit Author"){ | |
| author:=settings.ssn("//fonts/author") | |
| InputBox,newauthor,New Author,Enter your name,,,,,,,,% author.text | |
| if ErrorLevel | |
| return event:="" | |
| author.text:=newauthor | |
| csc().2181(0,themetext()) | |
| } | |
| if (event="Edit Theme Name"){ | |
| themename:=settings.ssn("//fonts/name") | |
| InputBox,newtheme,New Theme Name,Enter the new theme name,,,,,,,,% themename.Text | |
| if ErrorLevel | |
| return event:="" | |
| themename.text:=newtheme | |
| csc().2181(0,themetext()) | |
| } | |
| if (event="Color Input Method"){ | |
| method:=settings.ssn("//colorinput").text?0:1 | |
| settings.add({path:"colorinput",text:method}) | |
| mode:={0:"Gui",1:"Hex"} | |
| m("Your current color input mode is now set to " mode[method]) | |
| } | |
| if (v.themelist[TV_GetParent(A_EventInfo)]="Download Themes"){ | |
| temp:=new xml("temp"),TV_GetText(filename,A_EventInfo) | |
| info:=URLDownloadToVar("http://files.maestrith.com/AHKStudio/themes/" filename) | |
| temp.xml.loadxml(SubStr(info,InStr(info,"<"))) | |
| rem:=settings.ssn("//fonts"),rem.ParentNode.RemoveChild(rem) | |
| settings.ssn("*").appendchild(temp.ssn("*")) | |
| csc().2181(0,themetext()),event:="save theme" | |
| refreshthemes() | |
| } | |
| if (event="save theme"){ | |
| FileCreateDir,Themes | |
| font:=settings.ssn("//fonts") | |
| clone:=font.clonenode(1) | |
| name:=settings.ssn("//fonts/name").text | |
| rem:=preset.ssn("//fonts/name[text()='" name "']..") | |
| if rem | |
| rem.ParentNode.removechild(rem) | |
| Else | |
| v.themelist[TV_Add(name,v.themetv,"Sort")]:="themes list" | |
| top:=preset.ssn("*") | |
| top.appendchild(clone) | |
| preset.save(1) | |
| tlist:=preset.sn("//preset/*") | |
| noadd:=0 | |
| } | |
| if (event="Download Themes"){ | |
| parent:=TV_GetSelection() | |
| if child:=TV_GetChild(parent){ | |
| list:=[] | |
| list[child]:=1 | |
| while,child:=TV_GetNext(child) | |
| list[child]:=1 | |
| for a,b in List | |
| TV_Delete(a) | |
| } | |
| SplashTextOn,200,50,Downloading Themes,Please Wait... | |
| wb:=ComObjCreate("HTMLfile") | |
| wb.write(URLDownloadToVar("http://files.maestrith.com/AHKStudio/themes/")) | |
| while,aa:=wb.links.item[A_Index-1].innerhtml | |
| if InStr(aa,".xml") | |
| TV_Add(aa,parent) | |
| SplashTextOff,wb:="" | |
| TV_Modify(parent,"Expand") | |
| } | |
| if InStr(event,"Main Selection"){ | |
| code:=InStr(event,"foreground")?2067:2068 | |
| main:=settings.ssn("//fonts/font[@code='" code "']") | |
| color:=dlg_color(ssn(main,"@color").text,(hwnd(3))) | |
| if !ErrorLevel | |
| main.setattribute("color",color) | |
| refreshthemes() | |
| } | |
| if InStr(event,"Multiple Selection"){ | |
| code:=InStr(event,"fore")?2600:2601 | |
| multi:=settings.ssn("//fonts/font[@code='" code "']") | |
| color:=dlg_color(ssn(multi,"@color").text,(hwnd(3))) | |
| if !ErrorLevel | |
| multi.setattribute("color",color) | |
| refreshthemes() | |
| } | |
| if (event="Indent Guide"){ | |
| guide:=settings.ssn("//fonts/font[@style='37']") | |
| color:=dlg_color(ssn(guide,"@color").text,hwnd(3)) | |
| if !ErrorLevel | |
| guide.setattribute("color",color) | |
| refreshthemes() | |
| } | |
| if (event="End Of Line Color"){ | |
| eol:=settings.ssn("//fonts/font[@style='0']") | |
| color:=dlg_color(ssn(eol,"@color").text,hwnd(3)) | |
| if !ErrorLevel | |
| eol.setattribute("color",color) | |
| refreshthemes() | |
| } | |
| if (event="Default Font Style"){ | |
| rem:=settings.sn("//fonts/font[@style!='5' and @font]") | |
| while,rr:=rem.item[A_Index-1] | |
| rr.removeattribute("font") | |
| refreshthemes() | |
| } | |
| if (event="Caret Line Background"){ | |
| cb:=settings.ssn("//fonts/font[@code='" 2098 "']") | |
| color:=dlg_color(ssn(cb,"@color").text,hwnd(3)) | |
| if !ErrorLevel | |
| cb.setattribute("color",color) | |
| refreshthemes() | |
| } | |
| if (event="caret"){ | |
| caret:=settings.ssn("//fonts/font[@code='2069']") | |
| color:=dlg_color(ssn(caret,"@color").text,hwnd(3)) | |
| if !ErrorLevel | |
| caret.setattribute("color",color) | |
| refreshthemes() | |
| } | |
| if (event="Default Background Color"||event="Background"){ | |
| if InStr(event,"Default"){ | |
| rem:=settings.sn("//fonts/font[@style!='5' and @style!=33 and @background]") | |
| while,rr:=rem.item[A_Index-1] | |
| rr.removeattribute("background") | |
| } | |
| if !style:=settings.ssn("//fonts/font[@style='5']") | |
| style:=settings.add({path:"fonts/font",att:{style:5}}) | |
| default:=settings.ea("//fonts/font[@style='5']") | |
| color:=dlg_color(default.Background,hwnd(3)) | |
| if ErrorLevel | |
| return event:="" | |
| style.setattribute("background",color) | |
| refreshthemes() | |
| } | |
| if (event="reset to default"){ | |
| rem:=settings.ssn("//fonts") | |
| rem.parentnode.removechild(rem) | |
| defaultfont() | |
| refreshthemes() | |
| } | |
| event:="" | |
| return | |
| 3GuiEscape: | |
| 3GuiClose: | |
| hwnd({rem:3}),csc("Scintilla1").2400 | |
| return | |
| returnedinfo: | |
| if (info.style){ | |
| styleclick: | |
| SetTimer,%A_ThisLabel%,Off | |
| st:=v.style.style,mod:=v.style.mod | |
| if !style:=settings.ssn("//fonts/font[@style='" st "']") | |
| style:=settings.add({path:"fonts/font",att:{style:st},dup:1}) | |
| color:=dlg_color(ssn(style,"@color").text,hwnd(3)) | |
| if ErrorLevel | |
| return | |
| style.setattribute("color",color) | |
| Loop,2 | |
| settings.Transform() | |
| refreshthemes() | |
| return | |
| } | |
| if (info.editfont){ | |
| editfont: | |
| SetTimer,%A_ThisLabel%,Off | |
| if !style:=settings.ssn("//fonts/font[@style='" v.style.style "']") | |
| style:=settings.add({path:"fonts/font",att:{style:v.style.style}}) | |
| font:=settings.ea("//fonts/font[@style='" v.style.style "']") | |
| compare:=default:=settings.ea("//fonts/font[@style='5']") | |
| for a,b in font | |
| default[a]:=b | |
| dlg_font(Default,1,hwnd(3)) | |
| for a,b in compare{ | |
| if a not in style,Background | |
| if (default[a]!=b) | |
| style.setattribute(a,Default[a]) | |
| } | |
| refreshthemes() | |
| return | |
| } | |
| if (info.editback){ | |
| editback: | |
| SetTimer,%A_ThisLabel%,Off | |
| if !style:=settings.ssn("//fonts/font[@style='" v.style.style "']") | |
| style:=settings.add({path:"fonts/font",att:{style:v.style.style}}) | |
| default:=settings.ea("//fonts/font[@style='5']") | |
| font:=settings.ea("//fonts/font[@style='" v.style.style "']") | |
| color:=font.Background?font.Background:default.Background | |
| color:=dlg_color(color,hwnd(3)) | |
| if ErrorLevel | |
| return | |
| style.setattribute("background",color) | |
| refreshthemes() | |
| return | |
| } | |
| if (info.margin!=""){ | |
| style:=settings.ssn("//fonts/font[@style='33']") | |
| if (info.mod=0){ | |
| color:=ssn(style,"@color").text | |
| color:=dlg_color(color,hwnd(3)) | |
| if ErrorLevel | |
| return | |
| style.setattribute("color",color) | |
| refreshthemes() | |
| } | |
| if (info.mod=4){ | |
| color:=ssn(style,"@background").text | |
| color:=dlg_color(color,hwnd(3)) | |
| if ErrorLevel | |
| return | |
| style.setattribute("background",color) | |
| refreshthemes() | |
| } | |
| } | |
| return | |
| themedelete: | |
| Gui,3:Default | |
| if (v.themelist[TV_GetSelection()]="themes list"){ | |
| TV_GetText(theme,TV_GetSelection()) | |
| rem:=preset.ssn("//name[text()='" theme "']..") | |
| rem.ParentNode.RemoveChild(rem) | |
| TV_Delete(TV_GetSelection()) | |
| } | |
| return | |
| } | |
| themetext(theme=1){ | |
| if name:=settings.ssn("//fonts/name").text | |
| header:=name "`r`n`r`n" | |
| if author:=settings.ssn("//fonts/author").text | |
| header.="Theme by " author "`r`n`r`n" | |
| out=%header%/*`r`nMulti-Line`r`ncomments`r`n*/`r`n`r`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 | |
| for a,b in v.color | |
| out.=a " = " b "`n" | |
| th:=theme=1?settings.sn("//custom/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 | |
| } | |
| class toolbar{ | |
| static keep:=[],order:=[],list:=[],imagelist:="" | |
| __New(win,parent,id,mask=""){ | |
| static count:=0 | |
| count++ | |
| mask:=mask?mask:0x800|0x0800|0x0100|0x0040|0x0008|0x0004|0x10|0x20 | |
| Gui,Add,Custom,ClassToolbarWindow32 hwndhwnd gtoolbar +%mask% Background0 | |
| this.iconlist:=[] | |
| this.hwnd:=hwnd,this.count:=count | |
| this.buttons:=[],this.returnbutton:=[] | |
| this.keep[hwnd]:=this,this.ahkid:="ahk_id" hwnd | |
| this.parent:=parent,this.order[count]:=this | |
| onoff:=settings.ssn("//options/@Small_Icons").text?0:1 | |
| this.imagelist:=IL_Create(20,1,onoff) | |
| this.SetImageList() | |
| this.list[id]:=this,this.id:=id | |
| this.setmaxtextrows() | |
| return this | |
| } | |
| setstate(button,state){ | |
| SendMessage,0x400+17,button,0<<16|state&0xffff,,% this.ahkid | |
| } | |
| SetImageList(){ | |
| SendMessage,0x400+48,0,% this.imagelist,,% "ahk_id " this.hwnd | |
| } | |
| il(icon="",file=""){ | |
| if (icon!=""){ | |
| if this.iconlist[file,icon]!="" | |
| return this.iconlist[file,icon] | |
| if file contains .gif,.jpg,.png,.bmp | |
| index:=IL_Add(this.imagelist,file)-1 | |
| else | |
| index:=IL_Add(this.imagelist,file,icon+1)-1 | |
| this.iconlist[file,icon+1]:=index | |
| return index | |
| } | |
| } | |
| add(info){ | |
| new:=[] | |
| if (info.text){ | |
| VarSetCapacity(STR,StrLen(info.text)*2) | |
| StrPut(info.text,&STR,strlen(info.text)*2) | |
| SendMessage,0x400+77,0,&STR,,% "ahk_id " this.Hwnd | |
| Index:=ErrorLevel | |
| } | |
| iimage:=this.il(info.icon,info.file) | |
| this.buttons[info.id]:={icon:iimage,state:info.state,text:info.text,index:index,func:info.func,iimage:info.icon,file:info.file,id:info.id,runfile:info.runfile} | |
| this.returnbutton.Insert(this.buttons[info.id]) | |
| } | |
| addbutton(id){ | |
| VarSetCapacity(button,20,0) | |
| info:=this.buttons[id] | |
| if !info.id{ | |
| NumPut(1,button,9) | |
| SendMessage,1044,1,&button,,% "ahk_id" this.hwnd | |
| return | |
| } | |
| if (IsFunc(info.func)=0&&IsLabel(info.func)=0) | |
| return | |
| NumPut(info.icon,Button,0,"int") | |
| NumPut(info.id,Button,4,"int") | |
| NumPut(info.state,button,8,"char") | |
| NumPut(info.style,button,9,"char") | |
| NumPut(info.Index,button, 8 + (A_PtrSize * 2), "ptr") | |
| SendMessage,1044,1,&button,,% "ahk_id" this.hwnd ;TB_ADDBUTTONSW | |
| } | |
| SetMaxTextRows(MaxRows=0){ | |
| SendMessage,0x043C,MaxRows, 0,, % "ahk_id " this.Hwnd | |
| return (ErrorLevel = "FAIL") ? False : True | |
| } | |
| Customize(){ | |
| SendMessage,0x041B, 0, 0,, % "ahk_id " this.Hwnd | |
| return (ErrorLevel = "FAIL") ? False : True | |
| } | |
| barinfo(){ | |
| VarSetCapacity(size,8) | |
| VarSetCapacity(rect,16) | |
| WinGetPos,,,w,,% "ahk_id" this.hwnd | |
| SendMessage,0x400+29,0,&rect,,% "ahk_id" this.hwnd | |
| height:=NumGet(rect,12) | |
| SendMessage,0x400+99,0,&size,,% "ahk_id" this.hwnd ;TB_GETIDEALSIZE | |
| ideal:=NumGet(&size) | |
| return info:={ideal:ideal,id:this.id,height:height,hwnd:this.hwnd,width:ideal+20} | |
| } | |
| ideal(){ | |
| VarSetCapacity(size,8) | |
| SendMessage,0x400+99,0,&size,,% "ahk_id" this.hwnd ;TB_GETIDEALSIZE | |
| parent:=DllCall("GetParent","uptr",this.hwnd),parent:="ahk_id" parent | |
| NumPut(VarSetCapacity(band,80),&band,0),NumPut(0x200|0x40,band,4) | |
| SendMessage,0x400+16,% this.id,0,,% parent | |
| bandnum:=ErrorLevel | |
| SendMessage,0x400+28,%bandnum%,&band,,% parent ;getbandinfo | |
| NumPut(0x200|0x40,band,4) | |
| NumPut(NumGet(&size),&band,68) | |
| NumPut(NumGet(&size)+20,&band,44) | |
| SendMessage,0x400+11,%bandnum%,&band,,% parent ;setbandinfow | |
| } | |
| delete(button){ | |
| rem:=settings.ssn("//toolbar/bar[@id='" this.id "']/button[@id='" button.id "']") | |
| rem.ParentNode.RemoveChild(rem) | |
| SendMessage,0x400+25,% button.id,0,,% this.ahkid | |
| SendMessage,0x400+22,%ErrorLevel%,0,,% this.ahkid | |
| this.buttons[button.id]:="" | |
| ;button.id button.index | |
| } | |
| notify(){ | |
| toolbar: | |
| code:=NumGet(A_EventInfo+8,0,"Int"),Hwnd:=NumGet(A_EventInfo) | |
| this:=toolbar.keep[hwnd] | |
| If(Hwnd!=this.Hwnd) | |
| return | |
| if (code=-5) ;right click | |
| if GetKeyState("Ctrl","P")&&this.id!=10002 | |
| this.delete(this.buttons[NumGet(A_EventInfo+12)]) | |
| else | |
| this.customize() | |
| if (code=-2){ ;left click | |
| button:=this.buttons[NumGet(A_EventInfo+12)] | |
| if GetKeyState("Alt","P")&&this.id!=10002 | |
| addbutton(this) | |
| else if GetKeyState("Ctrl","P"){ | |
| if button | |
| new icon_browser([this.buttons[NumGet(A_EventInfo+12)],NumGet(A_EventInfo+12),this.ahkid,this]) | |
| }else if !button.runfile{ | |
| fun:=IsFunc(button.func)?button.func:"" | |
| if fun | |
| %fun%() | |
| if IsLabel(button.func){ | |
| lab:=button.func | |
| SetTimer,%lab%,10 | |
| sleep,12 | |
| SetTimer,%lab%,off | |
| } | |
| } | |
| else if button.runfile | |
| runfile(button.runfile) | |
| } | |
| if (code=-708) ;toolbar change | |
| this.ideal() | |
| If (code=-720){ | |
| if info:=this.returnbutton[NumGet(A_EventInfo+12)+1]{ | |
| for a,b in [[info.icon,0,"int"],[info.id,4,"int"],[info.state,8,"char"],[info.style,9,"char"],[info.index,16,"int"]] | |
| NumPut(b.1,A_EventInfo+16,b.2,b.3) | |
| PostMessage,1,,,,% "ahk_id" this.parent | |
| } | |
| } | |
| if (code=-723) ;TBN_INITCUSTOMIZE | |
| PostMessage,1,,,,% "ahk_id" this.parent | |
| If (code=-706) ;TBN_QUERYINSERT | |
| PostMessage,1,,,,% "ahk_id" this.parent | |
| If (code=-707) ;TBN_QUERYDELETE | |
| PostMessage,1,,,,% "ahk_id" this.parent | |
| return | |
| } | |
| save(){ | |
| VarSetCapacity(button) | |
| vis:=settings.sn("//toolbar/*/*/@vis") | |
| while,vv:=vis.item[A_Index-1] | |
| vv.text:=0 | |
| sep:=settings.sn("//toolbar/*/separator") | |
| while,vv:=sep.item[A_Index-1] | |
| vv.parentnode.removechild(vv) | |
| for Control,this in this.order{ | |
| SendMessage,0x400+24,0,0,,% this.ahkid ;TB_BUTTONCOUNT | |
| top:=settings.ssn("//toolbar") | |
| Loop,%ErrorLevel%{ | |
| VarSetCapacity(button,80) | |
| SendMessage,0x400+23,% A_Index-1,&button,,% this.ahkid ;TB_GETBUTTON | |
| if NumGet(&button,4)=0{ | |
| bar:=ssn(top,"bar[@id='" this.id "']") | |
| new:=settings.under({under:bar,node:"separator",text:1,att:{vis:1},dup:1}) | |
| before:=1 | |
| continue | |
| } | |
| id:=NumGet(&button,4) | |
| next:=ssn(top,"bar[@id='" this.id "']/button[@id='" id "']") | |
| next.setattribute("vis",1),next.parentnode.appendchild(next) | |
| if before | |
| top.insertbefore(next,new),before:=0 | |
| } | |
| } | |
| } | |
| } | |
| traymenu(){ | |
| Menu,Tray,NoStandard | |
| Menu,Tray,Add,Show AHK Studio,show | |
| Menu,Tray,Default,Show AHK Studio | |
| Menu,Tray,Standard | |
| } | |
| tv(tv=0){ | |
| Gui,1:Default | |
| Gui,1:TreeView,% hwnd(100) | |
| TV_Modify(tv,"Select Vis Focus") | |
| return | |
| tv: | |
| if (A_GuiEvent="+"||A_EventInfo=0) | |
| return | |
| if ((A_GuiEvent="S"||A_GuiEvent="Normal")){ | |
| getpos(),count:=0 | |
| ei:=TV_GetSelection(),sc:=csc() | |
| file:=files.ssn("//*[@tv='" ei "']") | |
| if !ssn(file,"@tv").text | |
| return | |
| if !doc:=ssn(file,"@sc"){ | |
| tvtop: | |
| Sleep,10 | |
| doc:=sc.2375 | |
| if !doc | |
| doc:=sc.2376(0,doc) | |
| if !(doc){ | |
| count++ | |
| if count=3 | |
| return m("error") | |
| goto tvtop | |
| } | |
| sc.2358(0,doc) | |
| fn:=ssn(file,"@file").text | |
| tt:=update({get:fn}) | |
| length:=VarSetCapacity(text,strput(tt,"utf-8")) | |
| StrPut(tt,&text,length,"utf-8") | |
| sc.2037(65001),sc.2181(0,&text),set(),sc.2175 | |
| file.SetAttribute("sc",doc) | |
| }else | |
| sc.2358(0,doc.text) | |
| setpos(ei),marginwidth(sc) | |
| current(1).SetAttribute("last",ssn(file,"@file").text) | |
| } | |
| return | |
| } | |
| undo(){ | |
| csc().2176 | |
| } | |
| update(info){ | |
| static update:=[],updated:=[] | |
| if (info.edited) | |
| return updated[info.edited]:=1 | |
| if (info="clearupdated") | |
| return updated:=[] | |
| if (info="get") | |
| return [update,updated] | |
| if (info.file&&info.text) | |
| return update[info.file]:=info.text | |
| if (info.get) | |
| return update[info.get] | |
| if (info.sc){ | |
| fn:=files.ssn("//*[@sc='" info.sc "']/@file").text | |
| if !fn | |
| return | |
| updated[fn]:=1 | |
| update[fn]:=csc().getuni() | |
| return | |
| } | |
| } | |
| 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","Text,section xm,Ftp Server:","DDL,x+10 ys-2 w200 vserver","Checkbox,vcompile xm,Compile","Checkbox,vgistversion xm Disabled,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 gupload1 xm Default,Upload"]}) | |
| file:=ssn(current(1),"@file").text | |
| list:=settings.sn("//ftp/server/@name"),lst:="|Choose a server...|" | |
| while,ll:=list.item[A_Index-1] | |
| lst.="|" ll.text | |
| GuiControl,10:,ComboBox1,%lst% | |
| Gui,show,AutoSize,%winname% | |
| node:=vversion.ssn("//info[@file='" file "']") | |
| GuiControl,10:ChooseString,ComboBox1,% ssn(node,"@server").text | |
| list:={compile:"Button1",version:"Edit1",increment:"Edit2",dir:"Edit4",gistversion:"Button2",upver:"Button3",versstyle:"Button4"} | |
| for a,b in vversion.ea(node) | |
| GuiControl,10:,% list[a],%b% | |
| GuiControl,10:,Edit3,% vversion.ssn("//info[@file='" file "']").text | |
| ControlFocus,Edit3,% hwnd([10]) | |
| Send,^{Home}{Down} | |
| return | |
| upload1: | |
| w:=window({get:10}) | |
| ControlGetText,server,ComboBox1,ahk_id%uphwnd% | |
| if (server="Choose a server..."||server="") | |
| return m("Please choose a server") | |
| gosub 10guiescape | |
| if w.compile | |
| compile() | |
| f:=new ftp(server) | |
| 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() | |
| hwnd({rem:10}) | |
| ftp.cleanup() | |
| return | |
| increment: | |
| info:=window({get:10}) | |
| ver:=info.version "." info.increment, | |
| search:=info.versioninfo | |
| if !RegExMatch(search,"\b" ver) | |
| ControlSetText,Edit3,% ver "`r`n`r`n" RegExReplace(info.versioninfo,"\n","`r`n"),% hwnd([10]) | |
| ControlFocus,Edit3,% hwnd([10]) | |
| Send,^{Home}{Down} | |
| return | |
| } | |
| URLDownloadToVar(url){ | |
| http:=ComObjCreate("WinHttp.WinHttpRequest.5.1") | |
| http.Open("GET",url),http.Send() | |
| return http.ResponseText | |
| } | |
| 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 | |
| } | |
| } | |
| class xml{ | |
| keep:=[] | |
| __New(param*){ | |
| if !FileExist(lib) | |
| FileCreateDir,lib | |
| 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 | |
| } | |
| search(node,find,return=""){ | |
| found:=this.xml.SelectNodes(node "[contains(.,'" RegExReplace(find,"&","')][contains(.,'") "')]") | |
| while,ff:=found.item(a_index-1) | |
| if (ff.text=find){ | |
| if return | |
| return ff.SelectSingleNode("../" return) | |
| return ff.SelectSingleNode("..") | |
| } | |
| } | |
| lang(info){ | |
| info:=info=""?"XPath":"XSLPattern" | |
| this.xml.temp.setProperty("SelectionLanguage",info) | |
| } | |
| unique(info){ | |
| if (info.check&&info.text) | |
| return | |
| if info.under{ | |
| if info.check | |
| find:=info.under.SelectSingleNode("*[@" info.check "='" info.att[info.check] "']") | |
| if info.Text | |
| find:=this.cssn(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 | |
| } | |
| 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[]) | |
| file.length(file.position) | |
| } | |
| remove(rem){ | |
| if !IsObject(rem) | |
| rem:=this.ssn(rem) | |
| rem.ParentNode.RemoveChild(rem) | |
| } | |
| ea(path){ | |
| list:=[] | |
| if nodes:=path.nodename | |
| nodes:=path.SelectNodes("@*") | |
| else if path.text | |
| nodes:=this.sn("//*[text()='" path.text "']/@*") | |
| else if !IsObject(path) | |
| nodes:=this.sn(path "/@*") | |
| 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 | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment