luthar
30th July 2007 20:12 UTC
New Checkbox modifying components checkbox state
Hello,
I hope my subject is clear.
Basicly, I want to be able to add a new checkbox to the Modern UI components page. To do this, I will go with the extract/write in ini files.
My main problem is that I want to be able to modify the state of the components checkbox (basicly gray/ungray them).
I saw a couple of threads about similar things but I can't seem to find a way to do it.
Here are the solutions I tought, yet none are imho nicely programmed:
- Use the checkbox as a *next* button. Use the MUI_PAGE_CUSTOMFUNCTION_LEAVE macro to call a function that will SetSectionFlags. Reload the page (can this be done?!)
- Use the checkbox as a *next* button. Create two components page, one with checkbox grayed and other one not grayed. Use the MUI_PAGE_CUSTOMFUNCTION_LEAVE to switch from one page to another. When the real next button is pressed, jump to Directory page.
Any ideas on this? If so, any references to examples/code/eetc...
Red Wine
30th July 2007 21:18 UTC
The .OnSelChange callback might be useful,
http://nsis.sourceforge.net/Docs/Cha...html#4.7.2.1.8
luthar
30th July 2007 22:28 UTC
So what have I done so far...Any tips would be welcomed..
Hacked the UI to add a checkbox control...to Dialog 104 (Components)
CONTROL "", 1044, BUTTON, BS_CHECKBOX | WS_CHILD | WS_VISIBLE, 0, 68, 90, 18
>
I added the following lines to create the Components page...
!define MUI_PAGE_CUSTOMFUNCTION_PRE Component_pre
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE Component_leave
!insertmacro MUI_PAGE_COMPONENTS
>
Made the following functions:
Component_pre
FindWindow$0 "#32770" "" $HWNDPARENT
GetDlgItem$1 $0 1044
SendMessage$1 ${WM_SETTEXT} 0 "TESTING 123"
>FunctionEnd
>Function Component_leave
#
# Missing code to get the CheckBox Id (I know its reference to 1044 but how to get the event that called this function?
${If} ......
${if} $
0 == "0"
# default disable so no RO
SectionGetFlags ${SECMatlab} $3
IntOp$3 ${SF_SELECTED} | ${SF_RO}
SectionSetFlags ${SECMatlab} $3
SectionGetFlags${SECDotNet} $3
IntOp$3 $3 | ${SF_RO}
SectionSetFlags ${SECDotNet} $3
${else}
SectionGetFlags ${SECMatlab} $3
IntOp$3 $3 | ${SF_RO}
SectionSetFlags ${SECMatlab} $3
SectionGetFlags${SECDotNet} $3
IntOp$3 $3 | ${SF_RO}
SectionSetFlags ${SECDotNet} $3
${endif}
abort
${EndIf}
>FunctionEnd
>
The new checkbox added does not respond to any click events (it doesn't show the checkmark when clicked )
Afrow UK
30th July 2007 22:40 UTC
Do check boxes send the BN_CLICKED notification? If so, you can use the ButtonEvent plug-in.
Stu
luthar
30th July 2007 23:47 UTC
Everything worked perfectly with the ButtonEvent.
I still have a problem tought...
When in a section I put SectionIn RO, the components becomes greyed...
Yet with the code below it doesn't get grayed and the clear doesn't seem to work.
Component_Modification
# Swap Values of Checkbox
${If} $DefaultCheckBox == 1
Strcpy $DefaultCheckBox "0"
${Else}
StrCpy $DefaultCheckBox "1"
${EndIf}
# Has user checked the check box ?
FindWindow $R0 "#32770" "" $HWNDPARENT
GetDlgItem $R1 $R0 1200
SendMessage $R1${BM_SETCHECK} $DefaultCheckBox 0
${If} $DefaultCheckBox != 1 # User has not checked check box.
; default disable so no RO and must turn grey
SectionGetFlags${SECMatlab} $3
!insertmacro ClearSectionFlag $3 ${SF_RO}
SectionSetFlags ${SECMatlab} $3
SectionGetFlags${SECDotNet} $3
!insertmacro ClearSectionFlag $3 ${SF_RO}
SectionSetFlags ${SECDotNet} $3
${else}
SectionGetFlags ${SECMatlab} $3
IntOp$3 $3 | ${SF_RO}
SectionSetFlags ${SECMatlab} $3
SectionGetFlags${SECDotNet} $3
IntOp$3 $3 | ${SF_RO}
SectionSetFlags ${SECDotNet} $3
${EndIf}
>FunctionEnd
>
luthar
30th July 2007 23:53 UTC
Is it possible to put the section checkbox to gray, I would need to send the BM_SETSTATE message.
If so, is there anyway to get access to the CheckBox from the section?