OutFile "NSIS.exe"
Name "NSIS Menu"
Unicode True
RequestExecutionLevel User
XPStyle On
ManifestDPIAware System
SetCompressor LZMA
ChangeUI IDD_INST "${NSISDIR}\Contrib\UIs\modern_headerbmp.exe"
Icon "${NSISDIR}\Contrib\Graphics\Icons\nsis-menu.ico"
BrandingText " "
MiscButtonText " " " " " " " "
InstallButtonText " "
CompletedText " "
LangString ^ClickInstall 0 " "
Caption "$(^Name)"

!macro UNPACKVERFIELD out in shr mask fmt
!define /redef /math ${out} ${in} >>> ${shr}
!define /redef /math ${out} ${${out}} & ${mask}
!define /redef /intfmt ${out} "${fmt}" ${${out}}
!macroend

!ifndef VER_MAJOR & VER_MINOR
!ifdef NSIS_PACKEDVERSION
!insertmacro UNPACKVERFIELD VER_MAJOR ${NSIS_PACKEDVERSION} 24 0x0ff "%X"
!insertmacro UNPACKVERFIELD VER_MINOR ${NSIS_PACKEDVERSION} 12 0xfff "%X"
!insertmacro UNPACKVERFIELD VER_REVISION ${NSIS_PACKEDVERSION} 4 255 "%X"
!insertmacro UNPACKVERFIELD VER_BUILD ${NSIS_PACKEDVERSION} 00 0x00f "%X"
!endif
!endif
!ifdef VER_MAJOR & VER_MINOR
!define /ifndef VER_REVISION 0
!define /ifndef VER_BUILD 0
!searchreplace VERSTR "${NSIS_VERSION}" "v" ""
VIProductVersion ${VER_MAJOR}.${VER_MINOR}.${VER_REVISION}.${VER_BUILD}
VIAddVersionKey "ProductName" "NSIS"
VIAddVersionKey "ProductVersion" "${VERSTR}"
VIAddVersionKey "FileVersion" "${VERSTR}"
VIAddVersionKey "FileDescription" "NSIS Menu"
VIAddVersionKey "LegalCopyright" "http://nsis.sf.net/License"
!endif

!include nsDialogs.nsh
!include WinMessages.nsh
!include LogicLib.nsh
!define /IfNDef IDC_CHILDRECT 1018
!define QUIT_ON_EXECUTE
!define PR $ExeDir ; Local root path
!define PD "Docs" ; Local with WWW fallback (located at the same relative path)
!define WWW "http://nsis.sf.net"

!define CB_HEADER '0x755585 0x222222'
!define UY_HEADER 28
!define CT_PAGE '0x000000 0xaaaaaa'
!define CB_PAGE '0xffffff 0x111111'
!define CT_SECTION '0x666666 0xeeeeee'
!define CB_SECTION '${CB_PAGE}'
!define UY_SECTION 11 ; Height of a section
!define UY_SECTIONBPAD 2 ; Extra padding on the bottom of section headers
!define UY_TXT 9 ; Height of a normal item
!define UY_TXTBPAD 1 ; Extra padding on the bottom of normal items
!define UX_COLPAD 7 ; Spacing between columns
!define UY_ROW2 104 ; Absolute position of the 2nd row
!define CT_LINK '0x0c6e97 0x0c6e97' ; SYSCLR:HOTLIGHT
!define /Math UX_PAGE 00 + ${UX_COLPAD}
!define /Math UY_PAGE ${UY_HEADER} + 20
!define UX ${UX_PAGE}
!define CB_FOOTERLINE '0xc4c4c4 0x333333'
!define CT_FOOTER '0xbbbbbb 0x444444'

Var UseLightTheme

Function .onGUIInit
ReadRegDWORD $UseLightTheme HKCU "Software\NSIS" "UseLightTheme"
StrCmp $UseLightTheme "" 0 +2
ReadRegDWORD $UseLightTheme HKCU "Software\Microsoft\Windows\CurrentVersion\Themes\Personalize" "AppsUseLightTheme"
StrCmp $UseLightTheme "" 0 +2
StrCpy $UseLightTheme 1 ; Default

StrCmp $UseLightTheme "0" 0 +5
System::Call 'DWMAPI::DwmSetWindowAttribute(p$hWndParent,i20,*i1,i4)i.r0' ; 20H1
IntCmp $0 0 +3 +3
System::Call 'DWMAPI::DwmSetWindowAttribute(p$hWndParent,i19,*i1,i4)i.r0' ; ; 19H1
System::Call 'USER32::SetProp(p$hWndParent,t"UseImmersiveDarkModeColors",i1)' ; 1809
FunctionEnd

!define SetCtlColors "!insertmacro SetCtlColors "
!macro SetCtlColors hWnd ctlig ctdar cblig cbdar
StrCmp $UseLightTheme "0" 0 +3
SetCtlColors ${hWnd} "${ctdar}" ${cbdar}
Goto +2
SetCtlColors ${hWnd} "${ctlig}" ${cblig}
!macroend


Function PageLeave
System::Call 'USER32::GetFocus()p.r0'
System::Call 'USER32::GetDlgCtrlID(pr0)i.r1'
System::Call 'USER32::GetParent(pr0)p.r2'
SendMessage $2 ${WM_COMMAND} $1 $0 ; Handle <ENTER> in dialog by pretending it was a click on the active control
Abort
FunctionEnd

Function PageCreate
GetDlgItem $0 $hWndParent 1
ShowWindow $0 0
GetDlgItem $0 $hWndParent 2
ShowWindow $0 0

System::Call 'USER32::GetClientRect(p$hWndParent,@r0)'
System::Call '*$0(i,i,i.r3,i.r4)'
GetDlgItem $0 $hWndParent ${IDC_CHILDRECT}
System::Call 'USER32::MoveWindow(pr0,i0,i0,ir3,ir4,i0)'

nsDialogs::Create ${IDC_CHILDRECT}
Pop $R9
${SetCtlColors} $R9 ${CT_PAGE} ${CB_PAGE}

!macro StartColumn W
!define /ReDef UY ${UY_PAGE}
!define /ReDef UX_W ${W}
!ifdef UX_INTERNAL_PREV_W
!define /ReDef /Math UX ${UX} + ${UX_INTERNAL_PREV_W}
!define /ReDef /Math UX ${UX} + ${UX_COLPAD}
!define /ReDef UX_INTERNAL_PREV_W ${UX_W}
!else
!define /Math UX_INTERNAL_PREV_W 0 + ${UX_W}
!endif
!macroend
!macro CreateHeader Txt W
!define /ReDef /Math W ${W} + 4 ; Make it slightly wider
${NSD_CreateLabel} ${UX}u ${UY}u ${W}u ${UY_SECTION}u "${Txt}"
Pop $0
${SetCtlColors} $0 ${CT_SECTION} transparent transparent
SendMessage $0 ${WM_SETFONT} ${HF_HEADER} 1
!define /ReDef /Math UY ${UY} + ${UY_SECTION}
!define /ReDef /Math UY ${UY} + ${UY_SECTIONBPAD}
!macroend
!macro CreateControl Class Txt W H
${NSD_Create${Class}} ${UX}u ${UY}u ${W}u ${H}u "${Txt}"
!define /ReDef /Math UY ${UY} + ${H}
!define /ReDef /Math UY ${UY} + ${UY_TXTBPAD}
!macroend
!macro CreateSimpleLinkHelper Txt Url W
!insertmacro CreateControl Link "${Txt}|${Url}" ${W} ${UY_TXT}
!macroend
!macro CreateSimpleLink Txt Url W
!insertmacro CreateSimpleLinkHelper "${Txt}" "${Url}" ${W}
Call ConfigureLink
!macroend


; --- Header ---
!define HF_HEADER $R8
CreateFont ${HF_HEADER} "Arial" ${UY_SECTION} 700

nsDialogs::CreateControl ${__NSD_Label_CLASS} ${__NSD_Label_STYLE} ${__NSD_Label_EXSTYLE} 33u 0 -33u ${UY_HEADER}u ""
Pop $0
${SetCtlColors} $0 0xffffff 0xffffff ${CB_HEADER}

; CCv5 does not paint the background outside of the icon correctly when SS_CENTERIMAGE is used so we have to overlay a small icon on top of the background
nsDialogs::CreateControl ${__NSD_Icon_CLASS} ${__NSD_Icon_STYLE} ${__NSD_Icon_EXSTYLE} 4u 4u 33u ${UY_HEADER}u ""
Pop $0
${SetCtlColors} $0 "" "" ${CB_HEADER}
${NSD_SetIconFromInstaller} $0 $1
nsDialogs::CreateControl ${__NSD_Icon_CLASS} ${__NSD_Icon_STYLE}|${SS_CENTERIMAGE}|${SS_CENTER} ${__NSD_Icon_EXSTYLE} 0 0 33u ${UY_HEADER}u ""
Pop $0
${SetCtlColors} $0 "" "" ${CB_HEADER}

CreateFont $1 "Trebuchet MS" 17
!searchreplace VERSTR "${NSIS_VERSION}" "v" ""
nsDialogs::CreateControl ${__NSD_Label_CLASS} ${__NSD_Label_STYLE}|${SS_CENTERIMAGE}|${SS_ENDELLIPSIS} ${__NSD_Label_EXSTYLE} 34u 1u -34u ${UY_HEADER}u "nullsoft scriptable install system ${VERSTR}"
Pop $0
SetCtlColors $0 0x3A2A42 transparent
SendMessage $0 ${WM_SETFONT} $1 1
nsDialogs::CreateControl ${__NSD_Label_CLASS} ${__NSD_Label_STYLE}|${SS_CENTERIMAGE}|${SS_ENDELLIPSIS} ${__NSD_Label_EXSTYLE} 33u 0 -33u ${UY_HEADER}u "nullsoft scriptable install system ${VERSTR}"
Pop $0
SetCtlColors $0 0xffffff transparent
SendMessage $0 ${WM_SETFONT} $1 1


; --- Page ---
!insertmacro StartColumn 90
!insertmacro CreateHeader "Compiler" ${UX_W}
!insertmacro CreateSimpleLink "Compile NSI scripts" "${PR}\MakeNSISW" ${UX_W}
!insertmacro CreateSimpleLink "Installer based on .ZIP file" "${PR}\bin\Zip2Exe" ${UX_W}


!define /ReDef UY ${UY_ROW2}
!insertmacro CreateHeader "Developer Center" ${UX_W}
!define /ReDef UY_MULTILINE 42
!insertmacro CreateControl Label "Many more examples, tutorials, plug-ins and NSIS-related software are available at the online Developer Center." ${UX_W} ${UY_MULTILINE}
Pop $0
${SetCtlColors} $0 ${CT_PAGE} ${CB_PAGE}


!insertmacro StartColumn 80
!insertmacro CreateHeader "Documentation" ${UX_W}
!insertmacro CreateSimpleLink "NSIS Users Manual" "${PR}\NSIS.chm|${WWW}/Docs/" ${UX_W}
!insertmacro CreateSimpleLink "Example scripts" "${PR}\Examples|${WWW}/Examples" ${UX_W}
!insertmacro CreateSimpleLink "Modern UI 2" "${PD}\Modern UI 2\Readme.html" ${UX_W}


!define /ReDef UY ${UY_ROW2}
!insertmacro CreateHeader "Online Help" ${UX_W}
!insertmacro CreateSimpleLink "Developer Center" "${WWW}/Developer_Center" ${UX_W}
!insertmacro CreateSimpleLink "FAQ" "${WWW}/FAQ" ${UX_W}
!insertmacro CreateSimpleLink "Forum" "http://forums.winamp.com/forumdisplay.php?forumid=65" ${UX_W}
;"Project Tracker" "http://sourceforge.net/tracker/?group_id=22049"
!insertmacro CreateSimpleLink "Bug Tracker" "http://sourceforge.net/tracker/?group_id=22049&atid=373085" ${UX_W}
!insertmacro CreateSimpleLink "Stackoverflow" "http://stackoverflow.com/questions/tagged/nsis" ${UX_W}
!insertmacro CreateSimpleLink "Chat" "${WWW}/r/Chat" ${UX_W}
;insertmacro CreateSimpleLink "IRC channel" "irc://irc.landoleet.org/nsis" ${UX_W}
;"Pastebin" "http://nsis.pastebin.com/index/1FtyKP89"
;"Search" "http://www.google.com/cse/home?cx=005317984255499820329:c_glv1-6a6a"


!insertmacro StartColumn 130
!insertmacro CreateHeader "Plug-ins" ${UX_W}
!macro CreatePluginLink Name Desc Url
!define /ReDef SAVE_UY ${UY}
!insertmacro CreateSimpleLinkHelper "${Name}" "${Url}" ${UX_W} ; AdjustLinkPair will configure this link
!define /ReDef UY ${SAVE_UY}
!insertmacro CreateControl Label "${Name} - ${Desc}" ${UX_W} ${UY_TXT}
Call AdjustLinkPair
!macroend
!insertmacro CreatePluginLink "AdvSplash" "splash with fade in/out"     "${PD}\AdvSplash\advsplash.txt"
!insertmacro CreatePluginLink "Banner"    "banner with custom text"     "${PD}\Banner\Readme.txt"
!insertmacro CreatePluginLink "BgImage"   "background image"            "${PD}\BgImage\BgImage.txt"
!insertmacro CreatePluginLink "Dialer"    "internet connection"         "${PD}\Dialer\Dialer.txt"
!insertmacro CreatePluginLink "Math"      "math operations"             "${PD}\Math\Math.txt"
!insertmacro CreatePluginLink "nsDialogs" "custom wizard pages"         "${PD}\nsDialogs\Readme.html"
!insertmacro CreatePluginLink "nsExec"    "launch command line tools"   "${PD}\nsExec\nsExec.txt"
!insertmacro CreatePluginLink "NSISdl"    "download files"              "${PD}\NSISdl\Readme.txt"
!insertmacro CreatePluginLink "Splash"    "splash screen"               "${PD}\Splash\splash.txt"
!insertmacro CreatePluginLink "StartMenu" "Start Menu folder selection" "${PD}\StartMenu\Readme.txt"
!insertmacro CreatePluginLink "System"    "Windows API calls"           "${PD}\System\System.html"
!insertmacro CreatePluginLink "VPatch"    "update existing files"       "${PD}\VPatch\Readme.html"


; --- Footer ---
${NSD_CreateLabel} 0 -22u 100% 1 ""
Pop $0
${SetCtlColors} $0 000000 000000 ${CB_FOOTERLINE}

nsDialogs::CreateControl ${__NSD_Label_CLASS} ${__NSD_Label_STYLE}|${SS_CENTERIMAGE}|${SS_NOTIFY} ${__NSD_Label_EXSTYLE} -110u -20u 100% 20u "nsis.sourceforge.net"
Pop $0
${SetCtlColors} $0 ${CT_FOOTER} transparent transparent
SendMessage $0 ${WM_SETFONT} ${HF_HEADER} 1
nsDialogs::SetUserData $0 "https://nsis.sourceforge.io"
${NSD_OnClick} $0 OnLinkClick

nsDialogs::Show
FunctionEnd

Function OnLinkClick
Pop $1 ; HWND
nsDialogs::GetUserData $1
Call SplitPipe
Pop $0 ; First URL in UserData from SplitPipe
StrCpy $3 ""
StrCpy $1 $0 4 ; Copy length of ${PD}
${IfThen} $1 == "${PD}" ${|} StrCpy $3 "${PR}\" ${|}
!ifdef QUIT_ON_EXECUTE
System::Call 'USER32::GetKeyState(i0x11)i.r9' ; VK_CONTROL
!endif
ClearErrors
ExecShell "" "$3$0"
Pop $1 ; ... the rest of SplitPipe ...
${If} $1 != ""  ; ... might contain a fallback location
	StrCpy $0 $1
	StrCpy $3 ""
${ElseIf} $3 != "" ; Local docs path failed, use WWW fallback
	StrCpy $3 0
	slashconvloop:
		StrCpy $2 $0 1 $3
		${If} $2 == "\"
			StrCpy $2 $0 $3
			IntOp $3 $3 + 1
			StrCpy $0 $0 "" $3
			StrCpy $0 "$2/$0"
		${Else}
			IntOp $3 $3 + 1
		${EndIf}
		StrCmp $2 "" 0 slashconvloop
	StrCpy $3 "${WWW}/"
${EndIf}
${If} "$3$1" != ""
${AndIf} ${Errors}
	ExecShell "" "$3$0"
${EndIf}
${If} ${Errors}
	!ifdef QUIT_ON_EXECUTE
	StrCpy $9 0 ; Don't allow close
	!endif
	MessageBox MB_IconStop 'Error: Unable to open "$0"!'
${EndIf}
!ifdef QUIT_ON_EXECUTE
${IfThen} $9 & 0x8000 ${|} SendMessage $hWndParent ${WM_CLOSE} 0 0 ${|}
!endif
FunctionEnd

Function ConfigureLink
Pop $1 ; HWND
${NSD_OnClick} $1 OnLinkClick
${SetCtlColors} $1 ${CT_LINK} ${CB_PAGE}
${NSD_GetText} $1 $4
Push $4
Call SplitPipe
Pop $4
Pop $2
${NSD_SetText} $1 $4
nsDialogs::SetUserData $1 $2
System::Call 'USER32::GetDC(pr1)p.r3'
SendMessage $1 ${WM_GETFONT} 0 0 $5
System::Call 'GDI32::SelectObject(pr3,pr5)p.s'
StrLen $5 $4
System::Call 'GDI32::GetTextExtentPoint32(pr3,tr4,ir5,@r5)'
System::Call '*$5(i.r6)'
System::Call 'GDI32::SelectObject(pr3,ps)'
System::Call 'USER32::ReleaseDC(pr1,pr3)'
System::Call 'USER32::GetWindowRect(pr1,@r3)'
System::Call '*$3(i,i.r5,i,i.r7)'
IntOp $7 $7 - $5
IntOp $6 $6 + 4 ; Padding for focus rect
System::Call 'USER32::SetWindowPos(pr1,p,i,i,ir6,ir7,i0x16)'
FunctionEnd

Function AdjustLinkPair
Pop $2 ; Label
${SetCtlColors} $2 ${CT_PAGE} ${CB_PAGE}
Call ConfigureLink
FunctionEnd

Function SplitPipe
Exch $0
Push $1
Push $2
StrCpy $2 0
findSep:
StrCpy $1 $0 1 $2
IntOp $2 $2 + 1
StrCmp $1 "" +2
StrCmp $1 "|" "" findSep
StrCpy $1 $0 "" $2
IntOp $2 $2 - 1
StrCpy $0 $0 $2
Pop $2
Exch $1
Exch
Exch $0
FunctionEnd

Section
SectionEnd

Page Custom PageCreate PageLeave
!pragma warning disable 8000 ; Page instfiles not used