OnExit, HS_Edit_Exit Menu, HS_Edit_Menu, Add, Delete, HS_Edit_Del Menu, HS_Edit_Menu, Add, Edit, HS_Edit_Edit Menu, HS_Edit_Menu, Add, Menu, HS_Edit_Menu, Add, Basic, HS_Edit_Bas GuiX = 200 GuiY = 95 GoSub, HS_Edit_Bas Return GuiControlGet, focused_control, focus GuiContextMenu: If (A_GuiControl <> "HS_Edit_List") Return HS_Edit_CurrentRow := A_EventInfo Menu, HS_Edit_Menu, Show, % A_GuiX, % A_GuiY Return GuiClose: ExitApp HS_Edit_Add: HS_Edit_Changes := 1 Gui, Submit, NoHide If (!HS_Edit_Lvl) HS_Edit_NOpt := (HS_Edit_NCtxt := "") If (!HS_Edit_NAbbr or !HS_Edit_NPhra or !RegExMatch(HS_Edit_NAbbr,"^[^:]+$") or !RegExMatch(HS_Edit_NPhra,"^.+$") or !RegExMatch(HS_Edit_NOpt,"^(([Cc]0?1?)|([Kk]-?\d+)|([\*\?BbOoZz]0?)|([Pp]\d+)|([Ss][IiPpEe]0?))*$") or !RegExMatch(HS_Edit_NCtxt,"^(#IfWin(Not)?((Active)|(Exist))\s+.+)?$")) { Gui +Disabled MsgBox, 4112, Invalid Hotstring, One or more of the parameters you entered for your hotstring is invalid. Gui -Disabled Gui, Show Return } If (!HS_Edit_CurEdit) LV_Add("",HS_Edit_NAbbr,HS_Edit_NPhra,HS_Edit_NOpt,HS_Edit_NCtxt) Else { LV_Modify(HS_Edit_CurEdit,"",HS_Edit_NAbbr,HS_Edit_NPhra,HS_Edit_NOpt,HS_Edit_NCtxt) HS_Edit_CurEdit := 0 } GoSub, HS_Edit_Clr Return HS_Edit_Adv: HS_Edit_Data := HS_Edit_BuildData() HS_Edit_Lvl := 1 Gui, +LastFound If (WinActive()) WinGetPos, GuiX, GuiY Gui, Destroy ; Set up Advanced Menu Menu, HS_Edit_Menu, Delete, Advanced Menu, HS_Edit_Menu, Add, Basic, HS_Edit_Bas ; Create Advanced GUI Gui, Add, Text, x6 y192 w260 h20, New/Edit hotstring here Gui, Add, Edit, x41 y212 w50 h20 vHS_Edit_NAbbr, Abbr Gui, Add, Edit, x96 y212 w170 h20 vHS_Edit_NPhra, Phrase Gui, Add, Button, x6 y262 w60 h20 gHS_Edit_Add, Add Gui, Add, Button, x76 y262 w60 h20 gHS_Edit_Clr, Clear Gui, Add, Button, x186 y262 w80 h20 gHS_Edit_Save, Save Changes Gui, Add, Text, x6 y7 w260 h20, List of current hotstrings Gui, Add, ListView, x6 y27 w260 h160 vHS_Edit_List, Abbr %A_Space%|Phrase|Opt|Context Gui, Add, Edit, x6 y212 w30 h20 vHS_Edit_NOpt, Opt. Gui, Add, Text, x6 y237 w80 h20, Context Gui, Add, Edit, x96 y237 w170 h20 vHS_Edit_NCtxt, Gui, Show, x%GuiX% y%GuiY% h290 w275, Hotstring Editor HS_Edit_Populate(HS_Edit_Data) Return HS_Edit_Bas: HS_Edit_Data := HS_Edit_BuildData() HS_Edit_Lvl := 0 Gui, +LastFound If (WinActive()) WinGetPos, GuiX, GuiY Gui, Destroy ; Set Up Basic Menu Menu, HS_Edit_Menu, Delete, Basic Menu, HS_Edit_Menu, Add, Advanced, HS_Edit_Adv ; Create Basic GUI Gui, Add, Text, x6 y192 w260 h20, New/Edit hotstring here Gui, Add, Edit, x6 y212 w50 h20 vHS_Edit_NAbbr, Abbr Gui, Add, Edit, x66 y212 w200 h20 vHS_Edit_NPhra, Phrase Gui, Add, Button, x6 y242 w60 h20 gHS_Edit_Add, Add Gui, Add, Button, x76 y242 w60 h20 gHS_Edit_Clr, Clear Gui, Add, Button, x186 y242 w80 h20 gHS_Edit_Save, Save Changes Gui, Add, Text, x6 y7 w260 h20, List of current hotstrings Gui, Add, ListView, x6 y27 w260 h160 vHS_Edit_List, Abbr %A_Space%|Phrase|Opt|Context LV_ModifyCol(3,0) LV_ModifyCol(4,0) LV_ModifyCol(1,50) LV_ModifyCol(2,205) Gui, Show, x%GuiX% y%GuiY% h265 w275, Hotstring Editor HS_Edit_Populate(HS_Edit_Data) Return HS_Edit_Clr: GuiControl,, HS_Edit_NAbbr, GuiControl,, HS_Edit_NPhra, If (HS_Edit_Lvl) { GuiControl,, HS_Edit_NOpt, GuiControl,, HS_Edit_NCtxt, } Return HS_Edit_Del: LV_Delete(HS_Edit_CurrentRow) Return HS_Edit_Edit: Loop, 4 LV_GetText(HS_Edit_LV%A_Index%, HS_Edit_CurrentRow, A_Index) GuiControl,, HS_Edit_NAbbr, % HS_Edit_LV1 GuiControl,, HS_Edit_NPhra, % HS_Edit_LV2 If (HS_Edit_Lvl) { Loop, 2 LV_GetText(HS_Edit_LV%A_Index%, HS_Edit_CurrentRow, A_Index+2) GuiControl,, HS_Edit_NOpt, % HS_Edit_LV1 GuiControl,, HS_Edit_NCtxt, % HS_Edit_LV2 } HS_Edit_CurEdit := HS_Edit_CurrentRow Return HS_Edit_Exit: If (HS_Edit_Changes) { Gui +Disabled MsgBox, 4148, Unsaved Changes, You have unsaved changes that will be lost if you exit. Would you like to quit anyway? IfMsgBox No { Gui -Disabled Gui, Show Return } } ExitApp HS_Edit_Save: FileAppend, % HS_Edit_BuildData(), Hotstring.ahk HS_Edit_Changes := 0 Return HS_Edit_Populate(Data) { LastMatch = 0 Loop { If (!(LastMatch := RegExMatch(Data,"(?:(#IfWin(?:Not)?(?:(?:Active)|(?:Exist))\s+.+?)[\r\n\s]+)?:((?:(?:[Cc]0?1?)|(?:[Kk]-?\d+)|(?:[\*\?BbOoZz]0?)|(?:[Pp]\d+)|(?:[Ss][IiPpEe]0?))*):([^:]+)::([^`n]+)",HS_Dat,LastMatch+StrLen(HS_Dat)+1))) Break LV_Add("",HS_Dat3,HS_Dat4,HS_Dat2,HS_Dat1) } } HS_Edit_BuildData() { Global HS_Edit_Lvl Str= Loop % LV_GetCount() { R := A_Index Loop, 4 LV_GetText(LV%A_Index%, R, A_Index) Str .= (Str ? "`n" : "") (LV4 ? LV4 : "#IfWinActive") "`n:" LV3 ":" LV1 "::" LV2 } Return Str }