/*

___________________________________________
______SmartGUI Creator   - Rajat___________
___________________________________________

     GUI creation tool for AutoHotkey
            (www.autohotkey.com)


___________________________________________


GUI1 = Main window
GUI2 = About window
GUI3 = Move group window
GUI4 = Font window
GUI5 = GUI Helper window
GUI6 = Set Position
GUI7 = Custom Control Option
GUI8 = Save Options
GUI9 = ToolBar

ToolTip1 = Toolbar help
ToolTip2 = Move Group selection

Support for new controls to be added in:
	-Main Menu
	-CreateCtrl
	-EditGUI
	-GUIStealer
	-Justify options

___________________________________________

Misc Notes:

Controls = Button,Checkbox,ComboBox,DateTime,DropDownList,Edit,GroupBox,ListBox,ListView,MonthCal,Progress,Picture,Radio,Slider,Tab,Text,UpDown,Hotkey

___________________________________________

*/

;___________________________________________
; Variable Declarations

;Release version
Rel = 4.0

MainWnd = GUI WorkSpace
MenuWnd = SmartGUI Creator
GeneratedWnd = New GUI Window
CustomOptions = -16|BackgroundTrans|Border|Buttons|Center|Checked|Disabled|Hidden|Horz|HScroll|Invert|Left|Limit|Lowercase|Multi|NoTicks|Number|Password|Range|ReadOnly|Right|Smooth|Theme|ToolTip|Uppercase|Vertical|VScroll|WantReturn|Wrap

;___________________________________________


#ErrorStdOut
#InstallKeybdHook
#InstallMouseHook
#SingleInstance Ignore
#NoTrayIcon

SetTitleMatchMode, Slow
SetControlDelay, 0
SetWinDelay, 0
SetFormat, float, 1.1
DetectHiddenWindows, On
Menu, Tray, Tip, SmartGUI Creator

;Include source with comments
StringCaseSense, On
IfEqual, 1, GiveMeSource
{
	FileInstall, e:\dos\batch\GUI\SGUI.ahk, %A_ScriptDir%\SmartGUI.Ahk
	ExitApp
}
StringCaseSense, Off




;Not to run on Win9x
IfEqual, A_OSType, WIN32_WINDOWS
{
	MsgBox,, Unsupported Windows Version, Your version of MS Windows is not supported by this SmartGUI Creator release.`nThe supported versions are Windows NT / 2000 / XP / 2003 and beyond.
	ExitApp
}


;Only one instance allowed
WinGetClass, SelfClass, %MainWnd%
IfEqual, SelfClass, AutoHotkeyGUI
{
	MsgBox,, SmartGUI Creator already running, Another instance of SmartGUI Creator found.`nOnly one instance is supported.
	ExitApp
}


;ask to read manual
IfNotExist, %A_ScriptDir%\SmartGUI.ini
{
	Msgbox, 4, WELCOME, Welcome to SmartGUI Creator`n`nIf you are using it for the first time, then it's recommended that you read the help manual, especially the 'Guidelines' section.`n`nWould you like to open it now?
	IfMsgbox, Yes
	{
		IfExist, %A_ScriptDir%\Manual.htm, run, %A_ScriptDir%\Manual.htm
		IfNotExist, %A_ScriptDir%\Manual.htm, MsgBox,, Error, Manual.htm not found!
	}
	Gosub, ShowHelp
}


IfExist, %A_ScriptDir%\Grid.gif
	GridFile = %A_ScriptDir%\Grid.gif
Else
{
	FileInstall, BlockGrid.gif, %Temp%\Grid.gif, 1
	GridFile = %Temp%\Grid.gif
}
FileInstall, splash.gif, %Temp%\splash.gif, 1
FileInstall, SGUI.ICL, %Temp%\SGUI.ICL, 1
FileDelete, %Temp%\SGUIControls.ini

SplashImage, %Temp%\splash.gif, B1 FS10 WS500

MenuGenerate:

Menu, Options, Add, Show Grid, Grid
Menu, Options, Check, Show Grid
;Menu, Options, Add, Show GUI Helper, Helper
;Menu, Options, Check, Show GUI Helper
Menu, Options, Add, Ask Control Label, CtrlText
Menu, Options, Add, MicroEditing, MicroEditing
Menu, Options, Add, Shift + Move Group, ShiftMove
Menu, Options, Add, Ask GUI Count, AskGUICount


Menu, Tray, NoStandard
Menu, Tray, UseErrorLevel

Menu, FileMenu, Add, `:`: SmartGUI Creator by Rajat `:`:, About
Menu, FileMenu, Default, `:`: SmartGUI Creator by Rajat `:`:
Menu, FileMenu, Add
Menu, FileMenu, Add, &Open Script, EditGUI
Menu, FileMenu, Add, &Test Script`t[F9], TestGUI
Menu, FileMenu, Add, &Save Script, SaveGUI2
Menu, FileMenu, Add, Save Script &As, SaveGUI
Menu, FileMenu, Add
Menu, FileMenu, Add, GUI St&ealer, Stealer
Menu, FileMenu, Add, Set GUI Count in Script, SetGUICount
Menu, FileMenu, Add
Menu, FileMenu, Add, &Reload, Reload
Menu, FileMenu, Add, E&xit, GuiClose


Menu, HelpMenu, Add, Help Manual, OpenManual
Menu, HelpMenu, Add, Keyboard Help, ShowHelp


Menu, ControlMenu, Add, Duplicate Control, Duplicate
Menu, ControlMenu, Add, Move Control, Modify
Menu, ControlMenu, Add, Set Position, SetPos
Menu, ControlMenu, Add, Delete Control, Delete
Menu, ControlMenu, Add, Change Label, ChangeLabel
Menu, ControlMenu, Add, Center Horizontally, CenterH
Menu, ControlMenu, Add, Center Vertically, CenterV
Menu, ControlMenu, Add, Custom Option, CustomOption


Menu, JustifyMenu, Add, Left, Justify
Menu, JustifyMenu, Add, Center, Justify
Menu, JustifyMenu, Add, Right, Justify


Menu, ControlMenu, add, Justify, :JustifyMenu


;Original Window settings
GuiW = 475
GuiH = 375

;For grid, label & microedit settings
G = 1
L = 0
M = 0


PosFields = XYWH
;___________________________________________
; Reading/Writing settings

IniRead, SaveDir, %A_ScriptDir%\SmartGUI.ini, Folders, SaveDir
IniRead, LoadDir, %A_ScriptDir%\SmartGUI.ini, Folders, LoadDir

IfEqual, SaveDir, ERROR, SetEnv, SaveDir,
IfEqual, LoadDir, ERROR, SetEnv, LoadDir,

IniRead, ShiftMove, %A_ScriptDir%\SmartGUI.ini, Settings, ShiftMove
IfEqual, ShiftMove, ERROR, IniWrite, No, %A_ScriptDir%\SmartGUI.ini, Settings, ShiftMove

;___________________________________________



Hotkey, *~LButton, LeftButton
Hotkey, RButton, RightButton




ToolBarGenerate:

Gui, 9:+Resize
;Gui, 9:Color, ECEADC
Menu, ToolBarMenu, Add, &File, :FileMenu
Menu, ToolBarMenu, Add, &Options, :Options
Menu, ToolBarMenu, Add, &Help, :HelpMenu
Gui, 9:Menu, ToolBarMenu
Gui, 9:Add, Text, -99 -99 1 1 +Border Hidden vButtonBorder,
Gui, 9:Add, Picture, x6 y7 w32 h32 gPreCreateCtrl vTBButton Icon1, %Temp%\SGUI.ICL
Gui, 9:Add, Picture, x46 y7 w32 h32 gPreCreateCtrl vTBCheckBox Icon2, %Temp%\SGUI.ICL
Gui, 9:Add, Picture, x286 y7 w32 h32 gPreCreateCtrl vTBDropDownList Icon5, %Temp%\SGUI.ICL
Gui, 9:Add, Picture, x166 y7 w32 h32 gPreCreateCtrl vTBText Icon17, %Temp%\SGUI.ICL
Gui, 9:Add, Picture, x366 y7 w32 h32 gPreCreateCtrl vTBListBox Icon9, %Temp%\SGUI.ICL
Gui, 9:Add, Picture, x486 y7 w32 h32 gPreCreateCtrl vTBMonthCal Icon11, %Temp%\SGUI.ICL
Gui, 9:Add, Picture, x526 y7 w32 h32 gPreCreateCtrl vTBProgress Icon13, %Temp%\SGUI.ICL
Gui, 9:Add, Picture, x206 y7 w32 h32 gPreCreateCtrl vTBGroupBox Icon7, %Temp%\SGUI.ICL
Gui, 9:Add, Picture, x606 y7 w32 h32 gPreCreateCtrl vTBHotkey Icon8, %Temp%\SGUI.ICL
Gui, 9:Add, Picture, x126 y7 w32 h32 gPreCreateCtrl vTBEdit Icon6, %Temp%\SGUI.ICL
Gui, 9:Add, Picture, x86 y7 w32 h32 gPreCreateCtrl vTBRadio Icon14, %Temp%\SGUI.ICL
Gui, 9:Add, Picture, x326 y7 w32 h32 gPreCreateCtrl vTBComboBox Icon3, %Temp%\SGUI.ICL
Gui, 9:Add, Picture, x246 y7 w32 h32 gPreCreateCtrl vTBPicture Icon12, %Temp%\SGUI.ICL
Gui, 9:Add, Picture, x406 y7 w32 h32 gPreCreateCtrl vTBListView Icon10, %Temp%\SGUI.ICL
Gui, 9:Add, Picture, x446 y7 w32 h32 gPreCreateCtrl vTBDateTime Icon4, %Temp%\SGUI.ICL
Gui, 9:Add, Picture, x566 y7 w32 h32 gPreCreateCtrl vTBSlider Icon15, %Temp%\SGUI.ICL
Gui, 9:Add, Picture, x646 y7 w32 h32 gPreCreateCtrl vTBTab Icon16, %Temp%\SGUI.ICL
Gui, 9:Add, Picture, x686 y7 w32 h32 gPreCreateCtrl vTBUpDown Icon18, %Temp%\SGUI.ICL
Gui, 9:Add, Picture, x726 y7 w32 h32 gChangeFont vTBFont Icon19, %Temp%\SGUI.ICL

;darker background for non-toolbar area
Gui, 9:Add, text, x1 y45 w3200 h2400 +0x4

;Gui, 9:Add, Text, x1 y1 h40 w%A_ScreenWidth%
WinHeight := A_ScreenHeight - 150
WinWidth := A_ScreenWidth - 100

Gui, 9:Show, h%WinHeight% w%WinWidth%, %MenuWnd%
Gui, 9:Maximize



WinGet, MenuWndID, ID, %MenuWnd%

WinGetPos, MenuWX, MenuWY, MenuWW, MenuWH, %MenuWnd%
MainWX := MenuWX + 135
MainWY := MenuWY + 95

Gui, 1:+Resize +Owner9
Gui, 1:Show, w%GuiW% h%GuiH% x%MainWX% y%MainWY%, %MainWnd%


WinGet, MainWndID, ID, %MainWnd%

;WinDiffW contains 1 border
;WinDiffH contains titlebar + bottom border
WinGetPos,,, WinW, WinH, ahk_id %MainWndID%
WinDiffW = %WinW%
WinDiffW -= %GuiW%
WinDiffW /= 2
WinDiffH = %WinH%
WinDiffH -= %GuiH%


;adjusting grid to adapt to different visual themes
GridY = %WinDiffH%
GridY -= %WinDiffW%

Gui, 1:add, Picture, x-%WinDiffW% y-%GridY%, %GridFile%
IfEqual, G, 0
{
	Control, hide,, Static1, ahk_id %MainWndID%
	Menu, Options, ToggleCheck, Show Grid
}

StaticCount = 1


IfEqual, ShiftMove, Yes, Menu, Options, Check, Shift + Move Group

HelperStatus = 1
SetTimer, GuiHelper, 500


Sleep, 500
SplashImage, Off


;dropped file on SmartGUI icon
IfExist, %1%
{
	GUIScript = %1%
	Goto, EditGUI
}

WinActivate, ahk_id %MenuWndID%
Return



;helps in debugging
^+D::
	Run, %Temp%\SGUIControls.ini,,UseErrorLevel
Return


Grid:
	IfEqual, G, 1
	{
		Menu, Options, ToggleCheck, Show Grid
		Control, hide,, Static1, ahk_id %MainWndID%
		G = 0
	}
	Else
	{
		Menu, Options, ToggleCheck, Show Grid
		Control, show,, Static1, ahk_id %MainWndID%
		G = 1
	}	   
Return



;Ask Control Label
CtrlText:
	IfEqual, L, 1
	{
		Menu, Options, ToggleCheck, Ask Control Label
		L = 0
	}
	Else
	{
		Menu, Options, ToggleCheck, Ask Control Label
		L = 1
	}	   
Return
	


MicroEditing:
	IfEqual, M, 1
	{
		Menu, Options, ToggleCheck, MicroEditing
		M = 0
	}
	Else
	{
		Menu, Options, ToggleCheck, MicroEditing
		M = 1
	}
Return



AskGUICount:
	IfEqual, AG, 1
	{
		Menu, Options, ToggleCheck, Ask GUI Count
		AG = 0
	}
	Else
	{
		Menu, Options, ToggleCheck, Ask GUI Count
		AG = 1
	}	   
Return



;Gui Helper
Helper:
	;status
	; 0 = not shown
	; 1 = created
	; 2 = showing
	IfEqual, HelperStatus, 0
		HelperStatus = 1
	
	Else
		HelperStatus = 0
Return



;little help   
~F1::
	IfWinNotActive, ahk_id %MainWndID%,, Return

ShowHelp:
	Gui, 1:+OwnDialogs
	
	MsgBox,, Command Help,
	(LTrim
		This Help`t`t`t`tHelp Menu / Press F1
		Create Control`t`t`tUse Toolbar Buttons
		Control Commands`t`t`tRight Mouse Click on target control
		Undo Last Removed Control`t`tPress Ctrl-Z
		Move Group of Controls`t`tDrag Left Mouse Button (Down-Right)
		Preview GUI`t`t`tFile Menu / Press F9
	)
Return


OpenManual:
	IfExist, %A_ScriptDir%\Manual.htm, run, %A_ScriptDir%\Manual.htm
	IfNotExist, %A_ScriptDir%\Manual.htm, MsgBox,, Error, Manual.htm not found!
Return



ShiftMove:
	IfEqual, ShiftMove, Yes
	{
		Menu, Options, ToggleCheck, Shift + Move Group
		ShiftMove = No
		IniWrite, %ShiftMove%, %A_ScriptDir%\SmartGUI.ini, Settings, ShiftMove
	}
	
	Else
	{
		Menu, Options, ToggleCheck, Shift + Move Group
		ShiftMove = Yes
		IniWrite, %ShiftMove%, %A_ScriptDir%\SmartGUI.ini, Settings, ShiftMove
	}	   
Return



Reload:
	IfNotExist, %Temp%\SGUIControls.ini, Reload
	Else
	{
		Msgbox, 4, RELOAD?, All unsaved data will be lost. Proceed?
		IfMsgBox, Yes, Reload
	}
Return




AddControl:
	StringTrimLeft, Ctrl2Add, A_ThisMenuItem, 4
	CtrlLabel =
	Goto, CreateCtrl
Return  



AddControl2:
	Ctrl2Add = %A_GuiControl%
	CtrlLabel =
	Goto, CreateCtrl
Return  



ChangeFont:
	MouseGetPos,,,, GuiCtrl
	ControlGetPos, cX, cY, cW, cH, %GuiCtrl%, %MenuWnd%
	cX2 := cX - 1
	cY2 := cY - 1
	cW2 := cW + 2
	cH2 := cH + 2
	ControlMove, Static1, %cX2%, %CY2%, %cW2%, %cH2%, %MenuWnd%
	GuiControl, 9:Show, ButtonBorder
	KeyWait, LButton
	GuiControl, 9:Hide, ButtonBorder

	IfNotEqual, FirstTimeF, No
	{
		Gui, 4:+owner1 +ToolWindow
		Gui, 4:Add, Text, x7 y21 w110 h20, Enter valid font name
		Gui, 4:Add, Text, x7 y51 w110 h20, Font size
		Gui, 4:Add, Text, x7 y81 w110 h20, Font Color
		Gui, 4:Add, Edit, x127 y21 w110 h20 vFName, Verdana
		Gui, 4:Add, Edit, x127 y51 w110 h20 vFSize, 8
		Gui, 4:Add, Edit, x127 y81 w110 h20 vFColor, Default
		Gui, 4:Add, Checkbox, x17 y113 w110 h20 vFBold, Bold
		Gui, 4:Add, Checkbox, x137 y113 w110 h20 vFItalic, Italic
		Gui, 4:Add, Checkbox, x17 y143 w110 h20 vFUnderline, Underline
		Gui, 4:Add, Checkbox, x137 y143 w110 h20 vFStrike, Strikeout
		Gui, 4:Add, Button, 0x8000 x26 y182 w60 h20, OK
		Gui, 4:Add, Button, 0x8000 x96 y182 w60 h20, Default
		Gui, 4:Add, Button, 0x8000 x166 y182 w60 h20, Cancel
		FirstTimeF = No
	}
	
	WinGetPos, MenuWX, MenuWY, MenuWW, MenuWH, %MenuWnd%
	FontWX := MenuWX + 630
	FontWY := MenuWY + 95

	
	Gui, 4:Show, h220 w245 x%FontWX% y%FontWY%, Enter Font Settings
Return



4ButtonCancel:
	GUI, 4:Cancel
Return



4ButtonDefault:
	ControlSetText, Edit1,, Enter Font Settings, Enter valid
	ControlSetText, Edit2,, Enter Font Settings, Enter valid
	ControlSetText, Edit3,, Enter Font Settings, Enter valid
	
	Control, Uncheck,, Button1, Enter Font Settings, Enter valid
	Control, Uncheck,, Button2, Enter Font Settings, Enter valid
	Control, Uncheck,, Button3, Enter Font Settings, Enter valid
	Control, Uncheck,, Button4, Enter Font Settings, Enter valid
Return



4ButtonOK:
	FSet =
	GUI, 4:Submit

	IfNotEqual, FSize,, SetEnv, FSet, %FSet% S%FSize%
	IfNotEqual, FColor,, SetEnv, FSet, %FSet% C%FColor%
	
	IfEqual, FBold, 1, SetEnv, FSet, %FSet% Bold
	IfEqual, FItalic, 1, SetEnv, FSet, %FSet% Italic
	IfEqual, FUnderline, 1, SetEnv, FSet, %FSet% Underline
	IfEqual, FStrike, 1, SetEnv, FSet, %FSet% Strike

	Gui, 1:Font, %FSet%, %FName%
	
	FontCount ++

	IniRead, ItemList, %Temp%\SGUIControls.ini, Main, ItemList, |
	IniWrite, %ItemList%Font%FontCount%|, %Temp%\SGUIControls.ini, Main, ItemList
	IniWrite, %FName%, %Temp%\SGUIControls.ini, Font%FontCount%, Label
	IniWrite, %FSet%, %Temp%\SGUIControls.ini, Font%FontCount%, Options
Return



SetPos:
	ControlGetPos, CtrlX, CtrlY, CtrlW, CtrlH, %CtrlNameCount%, ahk_id %MainWndID%
	IfNotEqual, FirstTimeSP, No
	{
		Gui, 6:+owner1 +ToolWindow
		Gui, 6:Add, Text, x6 y17 w20 h20, X :
		Gui, 6:Add, Edit, x26 y12 w40 h20 vCtrlSetX, 
		Gui, 6:Add, UpDown, Range-2147483648-2147483647
		Gui, 6:Add, Text, x81 y17 w20 h20, Y :
		Gui, 6:Add, Edit, x101 y12 w40 h20 vCtrlSetY, 
		Gui, 6:Add, UpDown, Range-2147483648-2147483647
		Gui, 6:Add, Text, x6 y47 w20 h20, W :
		Gui, 6:Add, Edit, x26 y42 w40 h20 vCtrlSetW, 
		Gui, 6:Add, UpDown, Range-2147483648-2147483647
		Gui, 6:Add, Text, x81 y47 w20 h20, H :
		Gui, 6:Add, Edit, x101 y42 w40 h20 vCtrlSetH, 
		Gui, 6:Add, UpDown, Range-2147483648-2147483647
		Gui, 6:Add, Button, x21 y77 w50 h20 Default, OK
		Gui, 6:Add, Button, x81 y77 w50 h20, Cancel
		Gui, 6:Add, GroupBox, x2 y-1 w144 h74,  
		FirstTimeSP = No
	}
	
	Gui, 6:Show, h102 w148, Set Position
	
	GuiControl, 6:, CtrlSetX, %CtrlX%
	GuiControl, 6:, CtrlSetY, %CtrlY%
	GuiControl, 6:, CtrlSetW, %CtrlW%
	GuiControl, 6:, CtrlSetH, %CtrlH%
Return



6ButtonCancel:
	Gui, 6:Cancel
Return



6ButtonOk:
	Gui, 6:Submit
	ControlMove, %CtrlNameCount%, %CtrlSetX%, %CtrlSetY%, %CtrlSetW%, %CtrlSetH%, ahk_id %MainWndID%

	Control, Hide,, %CtrlNameCount%, ahk_id %MainWndID%
	Control, Show,, %CtrlNameCount%, ahk_id %MainWndID%
	
	;fix for title bar & border 
	CtrlSetX -= %WinDiffW%
	CtrlSetY -= %WinDiffH%
	CtrlSetY += %WinDiffW%
	

	;here we get Ctrl2Add (ahk name)
	IniRead, Ctrl2Add, %Temp%\SGUIControls.ini, %CtrlNameCount%, Name

	;Here we get correct Ctrl text after modification
	IniRead, CtrlText, %Temp%\SGUIControls.ini, %CtrlNameCount%, Label

	Loop, Parse, PosFields
	{
		CurrPos := CtrlSet%A_LoopField%
		IniWrite, %CurrPos%, %Temp%\SGUIControls.ini, %CtrlNameCount%, %A_LoopField%
	}
Return



ChangeLabel:
	IniRead, OLabel, %Temp%\SGUIControls.ini, %CtrlNameCount%, Label
	
	StringReplace, OLabel, OLabel, ```,, `,, A
	StringReplace, OLabel, OLabel, ````, ``, A
	StringReplace, OLabel, OLabel, ```%, `%, A
	InputBox, CtrlText, Label, Enter Control Label,, 250, 125,,,,,%OLabel%  
	IfEqual, ErrorLevel, 1, Return
	
	StringReplace, TmpCtrlText, CtrlText, ``n, `n, A

	;replacing earlier contents of ctrl label
	If CtrlNameCount Contains SysTabControl,ListBox,ComBoBox
		GuiControl, 1:, %CtrlNameCount%, |%TmpCtrlText%
	Else
		GuiControl, 1:, %CtrlNameCount%, %TmpCtrlText%

	Gosub, FixText
	
	;leading pipe removed from controltext
	;this pipe is added to control labels to clear previous contents
	;eg. for listbox and tabs
	StringLeft, Test, CtrlText, 1
	IfEqual, Test, |, StringTrimLeft, CtrlText, CtrlText, 1 
	
	IniWrite, %CtrlText%, %Temp%\SGUIControls.ini, %CtrlNameCount%, Label
Return




Modify:
	ControlGetPos, cX, cY,,, %CtrlNameCount%, ahk_id %MainWndID%
	IniRead, Ctrl2Add, %Temp%\SGUIControls.ini, %CtrlNameCount%, Name
	IniRead, CtrlText, %Temp%\SGUIControls.ini, %CtrlNameCount%, Label

	If Ctrl2Add Not In Button,Checkbox,ComboBox,DateTime,DropDownList,Edit,GroupBox,ListBox,ListView,MonthCal,Progress,Picture,Radio,Slider,Tab,Text,UpDown,Hotkey
		Return
	
	;get CtrlName & CtrlCount
	Loop
	{
		StringRight, check, CtrlNameCount, %a_index%
		if check is integer
		{
			CtrlCount = %check%
			StringTrimRight, CtrlName, CtrlNameCount, %a_index%
		}
		Else Break
	}

	;here we get Ctrl2Add (ahk name)
	IniRead, Ctrl2Add, %Temp%\SGUIControls.ini, %CtrlNameCount%, Name
	
	;Here we get correct Ctrl text after modification
	IniRead, CtrlText, %Temp%\SGUIControls.ini, %CtrlNameCount%, Label

	Goto, Alter
return



Duplicate:
	ControlGetPos, cX, cY, cW, cH, %CtrlNameCount%, ahk_id %MainWndID%
	
	;get separate CtrlName and CtrlCount from CtrlNameCount
	Loop
	{
		StringRight, check, CtrlNameCount, %a_index%
		if check is integer
		{
			CtrlCount = %check%
			StringTrimRight, CtrlName, CtrlNameCount, %a_index%
		}
		Else Break
	}

	;No Tab duplication
	IfEqual, CtrlName, SysTabControl, Return
		
	;read from ini the Ctrl data
	IniRead, Ctrl2Add, %Temp%\SGUIControls.ini, %CtrlNameCount%, Name
	IniRead, CtrlLabel, %Temp%\SGUIControls.ini, %CtrlNameCount%, Label

	JustCopy = Y
	Goto, CreateCtrl
Return



Delete:
	;get and store undo information and then hide control
	IniRead, ItemList, %Temp%\SGUIControls.ini, Main, ItemList
	StringReplace, ItemList, ItemList, |%CtrlNameCount%|, |^DELETED^%CtrlNameCount%|, A
	IniWrite, %ItemList%, %Temp%\SGUIControls.ini, Main, ItemList

	Control, hide,, %CtrlNameCount%, ahk_id %MainWndID%
	LastDel = %CtrlNameCount%|%lastDel%
Return


~^Z::
	IfWinNotActive, ahk_id %MainWndID%,,Return
	
	;Showing the last hidden control
	StringGetPos, PPos, LastDel, |, R
	StringLeft, CtrlNameCount, LastDel, %PPos%
	PPos ++
	StringTrimLeft, LastDel, LastDel, %PPos%
	Control, Show,, %CtrlNameCount%, ahk_id %MainWndID%
	
	IniRead, ItemList, %Temp%\SGUIControls.ini, Main, ItemList
	StringReplace, ItemList, ItemList, |^DELETED^%CtrlNameCount%|, |%CtrlNameCount%|, A
	IniWrite, %ItemList%, %Temp%\SGUIControls.ini, Main, ItemList
Return



CenterH:
	ControlGetPos,,, cW,, %CtrlNameCount%, ahk_id %MainWndID%
	WinGetPos,,, wW,, ahk_id %MainWndID%
	
	wW -= %cW%
	wW /= 2
	
	ControlMove, %CtrlNameCount%, %wW%,,,, ahk_id %MainWndID%
	ControlGetPos, cX, cY, cW, cH, %CtrlNameCount%, ahk_id %MainWndID%
	
	;get CtrlText
	IniRead, CtrlText, %Temp%\SGUIControls.ini, %CtrlNameCount%, Label
	
	;fix for title bar & border 
	cX -= %WinDiffW%
	cY -= %WinDiffH%
	cY += %WinDiffW%

	Loop, Parse, PosFields
	{
		CurrPos := c%A_LoopField%
		IniWrite, %CurrPos%, %Temp%\SGUIControls.ini, %CtrlNameCount%, %A_LoopField%
	}
Return




CenterV:
	ControlGetPos,,,, cH, %CtrlNameCount%, ahk_id %MainWndID%
	WinGetPos,,,, wH, ahk_id %MainWndID%
	
	wH += %WinDiffH%
	wH -= %cH%
	wH /= 2
	wH -= %WinDiffW%
	
	ControlMove, %CtrlNameCount%,, %wH%,,, ahk_id %MainWndID%
	ControlGetPos, cX, cY, cW, cH, %CtrlNameCount%, ahk_id %MainWndID%
	
	;get CtrlText
	IniRead, CtrlText, %Temp%\SGUIControls.ini, %CtrlNameCount%, Label
	
	;fix for title bar & border 
	cX -= %WinDiffW%
	cY -= %WinDiffH%
	cY += %WinDiffW%

	Loop, Parse, PosFields
	{
		CurrPos := c%A_LoopField%
		IniWrite, %CurrPos%, %Temp%\SGUIControls.ini, %CtrlNameCount%, %A_LoopField%
	}
Return



CustomOption:
	IfNotEqual, COptionGUIShown, 1
	{
		Gui, 7:+Border -Caption +Owner1
		Gui, 7:Add, ComboBox, x6 y7 w220 h190 vNewOption, %CustomOptions%
		Gui, 7:Add, Button, x-10 y-10 w5 h5 Default , OK
		COptionGUIShown = 1
	}
	Gui, 7:Show, h37 w236, Custom Control Option
	Send, !{Down}
Return


7GuiClose:
7GuiEscape:
	Gui, 7:Cancel
Return


7ButtonOK:
	Gui, 7:Submit
	
	StringLeft, Test, NewOption, 1
	IfNotEqual, Test, -
	IfNotEqual, Test, +
		NewOption = +%NewOption%
	
	IniRead, Options, %Temp%\SGUIControls.ini, %CtrlNameCount%, Options, %A_Space%
	GuiControl, 1:%NewOption%, %CtrlNameCount%
	Options = %Options% %NewOption%
	IniWrite, %Options%, %Temp%\SGUIControls.ini, %CtrlNameCount%, Options
Return


PreCreateCtrl:
	;so that one doesn't select another control to create before placing the previous one
	;this requires all sections to set 'Ctrl2Add =' otherwise the toolbar will get disabled
	IfNotEqual, Ctrl2Add,, Return

	MouseGetPos,,,, GuiCtrl
	ControlGetPos, cX, cY, cW, cH, %GuiCtrl%, %MenuWnd%
	cX2 := cX - 1
	cY2 := cY - 1
	cW2 := cW + 2
	cH2 := cH + 2
	ControlMove, Static1, %cX2%, %CY2%, %cW2%, %cH2%, %MenuWnd%
	GuiControl, 9:Show, ButtonBorder
	KeyWait, LButton
	GuiControl, 9:Hide, ButtonBorder
	
	StringTrimLeft, Ctrl2Add, A_GuiControl, 2
	Goto, CreateCtrl
Return



CreateCtrl:
	Gui, 9:+OwnDialogs
	;only one tab allowed
	IfEqual, Ctrl2Add, Tab
	IfEqual, TabCreated, 1
	{
		Ctrl2Add =
		Return
	}

	;default labels
	CtrlText = %Ctrl2Add%
	IfEqual, Ctrl2Add, Tab
		CtrlText = Tab1|Tab2
	IfEqual, Ctrl2Add, Tab
		CtrlText = Tab1|Tab2
	If Ctrl2Add In Progress,Slider
		CtrlText = 25
	If Ctrl2Add In Hotkey,MonthCal,DateTime
		CtrlText =

	;preset width & height if not copying control
	IfNotEqual, JustCopy, Y
	{
		;so that control label is always asked if option is on
		IfEqual, L, 1, InputBox, CtrlText, Label, Enter Control Label,, 250, 125,,,,,%CtrlText%
		IfEqual, ErrorLevel, 1, Return
		StringReplace, CtrlText, CtrlText, ``n, `n, A

		cW = 100
		cH = 30

		IfEqual, Ctrl2Add, MonthCal
		{
			cW = 190
			cH = 160
		}
	}
	
	WinActivate, ahk_id %MainWndID%
	
	;select picture
	IfEqual, Ctrl2Add, Picture
	{
		;For duplication, file selection isn't reqd
		IfNotEqual, JustCopy, Y
		{
			Hotkey, *~LButton, Off
			FileSelectFile, PicFile,, %A_ScriptDir%,