aboutsummaryrefslogtreecommitdiff
path: root/Src/installer/winamp/pages/groupCheckList.nsh
blob: 98665483cf2a5a50e803ea88a932225266ef6a09 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
!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