Files
llamaplayer/Src/installer/winamp/pages/groupCheckList.nsh
2024-09-24 14:54:57 +02:00

349 lines
8.1 KiB
NSIS

!ifndef NULLSOFT_WINAMP_PAGE_SECTIONGROUPLIST_HEADER
!define NULLSOFT_WINAMP_PAGE_SECTIONGROUPLIST_HEADER
!include "util.nsh"
!include "nsDialogs.nsh"
!include "logicLib.nsh"
!include ".\utils\sectionDescription.nsh"
!define CLS_VCENTER 0x00000001
!define CLS_BOLDNAME 0x00000002
!define CLS_RADIOBUTTON 0x00000004
!define CLS_COMPACT 0x00000008
!define CLS_READONLY 0x00000010
!define CLIS_DISABLED 0x00000001
!define CLIS_CHECKED 0x00000002
!ifndef SWP_NOSIZE
!define SWP_NOSIZE 0x0001
!endif
!ifndef SWP_NOZORDER
!define SWP_NOZORDER 0x0004
!endif
!ifndef SWP_NOMOVE
!define SWP_NOMOVE 0x0002
!endif
!ifndef SWP_NOACTIVATE
!define SWP_NOACTIVATE 0x0010
!endif
!macro GroupCheckList_InsertSectionHelper __index
SectionGetFlags ${__index} ${GCL_FLAGS}
${IfNot} ${Errors}
IntOp ${GCL_TEMP} ${GCL_FLAGS} & ${SF_SECGRPEND}
${If} 0 != ${GCL_TEMP}
SetErrors
${Else}
StrCpy ${GCL_STYLE} 0
IntOp ${GCL_TEMP} ${GCL_FLAGS} & ${SF_RO}
${If} 0 != ${GCL_TEMP}
IntOp ${GCL_STYLE} ${GCL_STYLE} | ${CLIS_DISABLED}
${EndIf}
IntOp ${GCL_TEMP} ${GCL_FLAGS} & ${SF_SELECTED}
${If} 0 != ${GCL_TEMP}
IntOp ${GCL_STYLE} ${GCL_STYLE} | ${CLIS_CHECKED}
${EndIf}
SectionGetText ${__index} ${CGL_HEADER}
${IfNot} ${Errors}
${AndIf} "${CGL_HEADER}" != ""
StrCpy ${GCL_LISTTOP} ""
${If} ${GCL_DESCFUNC} != ""
Push ${__index}
Call "${GCL_DESCFUNC}"
Pop ${GCL_LISTTOP}
${EndIf}
StrCpy ${GCL_TEMP} ""
${If} ${GCL_NOTEFUNC} != ""
Push ${__index}
Call "${GCL_NOTEFUNC}"
Pop ${GCL_TEMP}
${EndIf}
nsis_chklist::InsertItem /NOUNLOAD ${GCL_CTLHWND} 200000 ${CGL_HEADER} "${GCL_TEMP}" "${GCL_LISTTOP}" ${GCL_STYLE} ${__index}
Pop ${GCL_TEMP}
ClearErrors
${EndIf}
${EndIf}
${EndIf}
!macroend
!macro GroupCheckList_CreatePageInternal
!ifndef __UNINSTALL__
!define GCL_SUFFIX inst
!else
!define GCL_SUFFIX uninst
!endif
!define GCL_DIALOG $0
!define GCL_INDEX $1
!define CGL_HEADER $2
!define CGL_FOOTER $3
!define GCL_STYLE $4
!define GCL_CTLHWND $5
!define GCL_TEMP $6
!define GCL_FLAGS $7
!define GCL_DESCFUNC $8
!define GCL_NOTEFUNC $9
nsDialogs::Create /NOUNLOAD 1018
Exch ${GCL_DIALOG}
${If} ${GCL_DIALOG} == error
Pop ${GCL_DIALOG}
Abort
${EndIf}
Exch 1
Exch ${GCL_INDEX}
Exch 2
Exch ${CGL_HEADER}
Exch 3
Exch ${CGL_FOOTER}
Exch 4
Exch ${GCL_STYLE}
Exch 5
Exch ${GCL_DESCFUNC}
Exch 6
Exch ${GCL_NOTEFUNC}
Push ${GCL_CTLHWND}
Push ${GCL_TEMP}
${If} ${CGL_HEADER} == "[groupName]"
ClearErrors
SectionGetText ${GCL_INDEX} ${CGL_HEADER}
${If} ${Errors}
StrCpy ${CGL_HEADER} ""
${EndIf}
${EndIf}
${If} ${CGL_FOOTER} == "[groupName]"
ClearErrors
SectionGetText ${GCL_INDEX} ${CGL_FOOTER}
${If} ${Errors}
StrCpy ${CGL_FOOTER} ""
${EndIf}
${EndIf}
${If} "${GCL_DESCFUNC}" == "default"
GetLabelAddress ${GCL_DESCFUNC} ".GroupCheckList_DefaultDescriptionProvider${GCL_SUFFIX}"
${EndIf}
${If} "${GCL_NOTEFUNC}" == "default"
GetLabelAddress ${GCL_NOTEFUNC} ".GroupCheckList_DefaultNoteProvider${GCL_SUFFIX}"
${EndIf}
!define GCL_LISTTOP $R0
!define GCL_LISTHEIGHT $R1
Push ${GCL_LISTTOP}
Push ${GCL_LISTHEIGHT}
StrCpy ${GCL_LISTTOP} 0
StrCpy ${GCL_LISTHEIGHT} "100%"
${If} ${CGL_HEADER} != ""
${NSD_CreateLabel} 0 0 100% 8u ${CGL_HEADER}
Pop ${GCL_CTLHWND}
${If} ${GCL_CTLHWND} != error
nsis_chklist::AdjustStaticHeight ${GCL_CTLHWND} 1 3
Pop ${GCL_TEMP}
IntOp ${GCL_LISTTOP} ${GCL_TEMP} + 13
${EndIf}
${EndIf}
${If} ${CGL_FOOTER} != ""
${NSD_CreateLabel} 0 0 100% 8u ${CGL_FOOTER}
Pop ${GCL_CTLHWND}
${If} ${GCL_CTLHWND} != error
nsis_chklist::AdjustStaticHeight ${GCL_CTLHWND} 1 3
Pop ${GCL_TEMP}
Push $R2
Push $R3
Push $R4
Push $R5
Push $R6
System::Call "*${stRECT} .R3"
System::Call "User32::GetClientRect(i, i) i (${GCL_DIALOG}, R3) .R2"
System::Call "*$R3${stRECT} (.R5, .R2, .R6, .R4)"
System::Free $R3
IntOp $R2 $R4 - $R2
Pop $R6
Pop $R5
Pop $R4
Pop $R3
IntOp $R2 $R2 - ${GCL_TEMP}
System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b (${GCL_CTLHWND}, 0, 0, $R2, 0, 0, ${SWP_NOACTIVATE}|${SWP_NOZORDER}|${SWP_NOSIZE})"
IntOp $R2 $R2 - 4
IntOp ${GCL_LISTHEIGHT} $R2 - ${GCL_LISTTOP}
Pop $R2
${EndIf}
${EndIf}
${If} ${GCL_STYLE} == ""
IntOp ${GCL_STYLE} ${CLS_BOLDNAME} | ${CLS_VCENTER}
${EndIf}
nsis_chklist::CreateControl /NOUNLOAD ${GCL_DIALOG} ${GCL_STYLE} 0u ${GCL_LISTTOP} 100% ${GCL_LISTHEIGHT}
Pop ${GCL_CTLHWND}
${If} ${GCL_CTLHWND} != "error"
GetLabelAddress ${GCL_TEMP} ".GroupCheckList_OnCheckChanged${GCL_SUFFIX}"
nsis_chklist::RegisterCallback /NOUNLOAD ${GCL_CTLHWND} ${GCL_TEMP}
SendMessage ${GCL_CTLHWND} ${WM_SETREDRAW} 0 0
CreateFont ${GCL_TEMP} "Tahoma" "8" "400"
SendMessage ${GCL_CTLHWND} ${WM_SETFONT} ${GCL_TEMP} 0
Push ${GCL_FLAGS}
SectionGetFlags ${GCL_INDEX} ${GCL_FLAGS}
IntOp ${GCL_TEMP} ${GCL_FLAGS} & 6;${SF_SECGRP}|${SF_SECGRPEND}
${If} ${SF_SECGRP} == ${GCL_TEMP}
${Do}
IntOp ${GCL_INDEX} ${GCL_INDEX} + 1
ClearErrors
!insertmacro 'GroupCheckList_InsertSectionHelper' ${GCL_INDEX}
${If} ${Errors}
${Break}
${EndIf}
${Loop}
${Else}
!insertmacro 'GroupCheckList_InsertSectionHelper' ${GCL_INDEX}
${EndIf}
Pop ${GCL_FLAGS}
!undef GCL_FLAGS
SendMessage ${GCL_CTLHWND} ${WM_SETREDRAW} 1 0
${EndIf}
Pop ${GCL_LISTTOP}
!undef GCL_LISTTOP
!undef GCL_LISTHEIGHT
nsDialogs::Show ; not return until the user clicks Next, Back or Cancel.
${If} ${GCL_CTLHWND} != ""
SendMessage ${GCL_CTLHWND} ${WM_GETFONT} 0 0 ${GCL_TEMP}
System::Call 'gdi32::DeleteObject(i ${GCL_TEMP}) i.s'
Pop ${GCL_TEMP}
${EndIf}
Pop ${GCL_TEMP}
Pop ${GCL_CTLHWND}
Pop ${GCL_NOTEFUNC}
Pop ${GCL_DIALOG}
Pop ${GCL_INDEX}
Pop ${CGL_HEADER}
Pop ${CGL_FOOTER}
Pop ${GCL_STYLE}
Pop ${GCL_DESCFUNC}
!undef GCL_DIALOG
!undef GCL_INDEX
!undef CGL_HEADER
!undef CGL_FOOTER
!undef GCL_STYLE
!undef GCL_DESCFUNC
!undef GCL_NOTEFUNC
!undef GCL_CTLHWND
!undef GCL_TEMP
Return
!ifndef GROUPCHECKLIST_ONCHECKCHNAGED_${GCL_SUFFIX}_DEFINED
!define GROUPCHECKLIST_ONCHECKCHNAGED_${GCL_SUFFIX}_DEFINED
.GroupCheckList_OnCheckChanged${GCL_SUFFIX}:
!insertmacro 'GroupCheckList_OnCheckChanged'
Return
!endif
!ifndef GROUPCHECKLIST_DEFAULTDESCRIPTIONPROVIDER_${GCL_SUFFIX}_DEFINED
!define GROUPCHECKLIST_DEFAULTDESCRIPTIONPROVIDER_${GCL_SUFFIX}_DEFINED
.GroupCheckList_DefaultDescriptionProvider${GCL_SUFFIX}:
!insertmacro 'GroupCheckList_DefaultDescriptionProvider'
Return
!endif
!ifndef GROUPCHECKLIST_DEFAULTNOTEPROVIDER_${GCL_SUFFIX}_DEFINED
!define GROUPCHECKLIST_DEFAULTNOTEPROVIDER_${GCL_SUFFIX}_DEFINED
.GroupCheckList_DefaultNoteProvider${GCL_SUFFIX}:
!insertmacro 'GroupCheckList_DefaultNoteProvider'
Return
!endif
!undef GCL_SUFFIX
!macroend
!macro GroupCheckList_OnCheckChanged
Exch $0 ; hwnd
Exch 1
Exch $1 ; item index
Exch 2
Exch $2 ; checked
Exch 3
Exch $3 ; item param
Push $4
SectionGetFlags $3 $4
${If} $2 != 1
IntOp $2 ${SF_SELECTED} ~
IntOp $4 $4 & $2
StrCpy $2 0
${Else}
IntOp $4 $4 | ${SF_SELECTED}
${EndIf}
SectionSetFlags $3 $4
Pop $4
Pop $3
Pop $0
Pop $1
Pop $2
!macroend
!macro GroupCheckList_DefaultDescriptionProvider
!ifndef __UNINSTALL__
Call GetSectionDescription
!else
Call un.GetSectionDescription
!endif
!macroend
!macro GroupCheckList_DefaultNoteProvider
Exch $0
Push $1
ClearErrors
SectionGetSize $0 $1
${If} ${Errors}
StrCpy $1 ""
${Else}
StrCpy $1 "($1)"
${EndIf}
Exch $1
Exch 1
Pop $0
!macroend
; if header or footer == [groupName] then it will be replaced with group name.
; if style == "" default style used
; if provider == "default" - default provider used
!macro GroupCheckList_CreatePage __groupIndex __header __footer __style __descriptionProvider __noteProvider
Push "${__noteProvider}"
Push "${__descriptionProvider}"
Push "${__style}"
Push "${__footer}"
Push "${__header}"
Push "${__groupIndex}"
${CallArtificialFunction} GroupCheckList_CreatePageInternal
!macroend
!define GroupCheckList_CreatePage `!insertmacro GroupCheckList_CreatePage`
!endif ;NULLSOFT_WINAMP_PAGE_SECTIONGROUPLIST_HEADER