349 lines
8.1 KiB
NSIS
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 |