InstallOptions 2
The InstallOptions plug-in is deprecated. For new scripts, it is recommended to use the new nsDialogs plug-in instead.
Introduction
InstallOptions is an NSIS plugin which allows you to create custom pages for NSIS installers, to prompt the user for extra information.
The dialogs created by InstallOptions are based on INI files which define the controls on the dialog and their properties. These INI files can be modified from the script to adjust the dialogs on runtime.
The format of INI files is described in a Wikipedia article.
INI file structure
The INI file has one required section. This section includes the number of controls to be created as well as general window attributes. The INI file also includes a variable number of Field sections which are used to create the controls to be displayed.
The required section is named "Settings". It can contain the following values:
NumFields | (required) | The number of control elements to be displayed on the dialog window. |
Title | (optional) | If specified, gives the text to set the titlebar to. Otherwise, the titlebar text is not changed. |
CancelEnabled | (optional) | If specified, overrides NSIS settings and enables or disables the cancel button. If set to 1, the cancel button will be enabled. If set to 0, the cancel button will be disabled. |
CancelShow | (optional) | If specified, overrides NSIS settings and shows or hides the cancel button If set to 1, the cancel button will be shown. If set to 0, the cancel button will be hidden. |
BackEnabled | (optional) | If specified, overrides NSIS settings and enables or disables the back button. If set to 1, the back button will be enabled. If set to 0, the back button will be disabled. |
CancelButtonText | (optional) | Overrides the text for the cancel button. If not specified, the cancel button text will not be changed. |
NextButtonText | (optional) | Overrides the text for the next button. If not specified, the next button text will not be changed. |
BackButtonText | (optional) | Overrides the text for the back button. If not specified, the back button text will not be changed. |
Rect | (optional) | Overrides the default rect ID to run over. This will make IO resize itself according to a different rect than NSIS's dialogs rect. |
RTL | (optional) | If 1 is specified the dialog will be mirrored and all texts will be aligned to the right. The INSTALLOPTIONS_EXTRACT macros automatically set this field to the right value for the current installer language as given by the NSIS string $(^RTL). |
State | (output) | This is not something you have to supply yourself but is set by InstallOptions, before calling your custom page validation function, to the field number of the custom Button control (or other control having the Notify flag) the user pressed, if any. |
Each field section has the heading "Field #" where # must be sequential numbers from 1 to NumFields. Each Field section can contain the following values:
Type | (required) | Type of control to be created. Valid values are "Label", "Text", "Password", "Combobox", "DropList", "Listbox", "CheckBox", "RadioButton", "FileRequest", "DirRequest" "Icon", "Bitmap", "GroupBox", "HLine", "VLine", "Link" or "Button". A "Label" is used to display static text. (i.e. a caption for a textbox) | ||||||||||||||||||||||||||||||||||||||||||||||||||
Text | (optional) | Specifies the caption of a label, checkbox, or radio button control. For DirRequest control this specifies the title of the browse dialog. For icon and bitmaps control this specifies the path to the image. Note: For labels, \r\n will be converted to a newline. To use a back-slash in your text you have to escape it using another back-slash - \\. Described below are NSIS functions for converting text to/from this format. | ||||||||||||||||||||||||||||||||||||||||||||||||||
State | (optional) | Specifies the state of the control. This is updated when the user closes the window, so you can read from it from NSIS. For edit texts and dir and file request boxes, this is the string that is specified. For radio button and check boxes, this can be '0' or '1' (for unchecked or checked). For list boxes, combo boxes and drop lists this is the selected items separated by pipes ('|'). For Links and Buttons this can specify something to be executed or opened (using ShellExecute). Note: For Text fields with the MULTILINE flag, \r\n will be converted to a newline. To use a back-slash in your text you have to escape it using another back-slash - \\. Described below are NSIS functions for converting text to/from this format. | ||||||||||||||||||||||||||||||||||||||||||||||||||
ListItems | (optional) | A list of items to display in a combobox, droplist, or listbox. This is a single line of text with each item separated by a pipe character '|' | ||||||||||||||||||||||||||||||||||||||||||||||||||
MaxLen | (optional) | Causes validation on the selected control to limit the maximum length of text. If the user specifies more text than this, a message box will appear when they click "OK" and the dialog will not be dismissed. You should not use this on a "combobox" since the user can not control what is selected. This should be set to a maximum of 260 for "FileRequest" and "DirRequest" controls. Ignored on "Label" controls. | ||||||||||||||||||||||||||||||||||||||||||||||||||
MinLen | (optional) | Causes validation on the selected control to force the user to enter a minimum amount of text. If the user specifies less text than this, a message box will appear when they click "OK" and the dialog will not be dismissed. Unlike MaxLen, this is useful for "Combobox" controls. By setting this to a value of "1" the program will force the user to select an item. Ignored on "Label" controls. | ||||||||||||||||||||||||||||||||||||||||||||||||||
ValidateText | (optional) | If the field fails the test for "MinLen" or "MaxLen", a messagebox will be displayed with this text. Note: \r\n will be converted to a newline, two back-slashes will be converted to one - \\. Described below are NSIS functions for converting text to/from this format. | ||||||||||||||||||||||||||||||||||||||||||||||||||
Left Right Top Bottom | (required) | The position on the dialog where this control appears. All sizes should be set in dialog units. To get the right dimensions for your controls, design your dialog using a resource editor and copy the dimensions to the INI file. Note: You can specify negative coordinates to specify the distance from the right or bottom edge. Note (2): For combobox or droplist, the "bottom" value is not used in the same way. Note (3): FileRequest and DirRequest controls will allocate 15 dialog units to the browse button. Make this control wide enough the contents of the textbox can be seen. | ||||||||||||||||||||||||||||||||||||||||||||||||||
Filter | (optional) | Specifies the filter to be used in the "FileRequest" control. This is constructed by putting pairs of entries together, each item separated by a | character. The first value in each pair is the text to display for the filter. The second value is the pattern to use to match files. For example, you might specify: Filter=Text Files|*.txt|Programs|*.exe;*.com|All Files|*.* If not specified, then the filter defaults to All Files|*.* Note: you should not put any extra spaces around the | characters. | ||||||||||||||||||||||||||||||||||||||||||||||||||
Root | (optional) | Used by DirRequest controls to specify the root directory of the search. By default, this allows the user to browse any directory on the computer. This will limit the search to a particular directory on the system. | ||||||||||||||||||||||||||||||||||||||||||||||||||
Flags | (optional) | This specifies additional flags for the display of different controls. Each value should be separated by a | character, and you should be careful not to put any spaces around the | character.
| ||||||||||||||||||||||||||||||||||||||||||||||||||
TxtColor | (optional) | Used by Link controls to specify the foreground color of the text. Format: 0xBBGGRR (hexadecimal). | ||||||||||||||||||||||||||||||||||||||||||||||||||
HWND HWND2 | (output) | After initDialog returns, this will contain the HWND of the control created by this field. It can be used instead of FindWindow and GetDlgItem. HWND2 contains the HWND of an additional control, such as the browse button. |
Header file
The InstallOptions header files provides macros and functions to easily create custom dialogs. You can include it on the top of your script as follows:
!include InstallOptions.nsh
Creating dialogs
Extracting the INI file
First, you have to extract your InstallOptions INI files in the .onInit function (or un.onInit for the uninstaller) using the INSTALLOPTIONS_EXTRACT macro. The files will be extracted to a temporary folder (the NSIS plug-ins folder) that is automatically created.
Function .onInit
!insertmacro INSTALLOPTIONS_EXTRACT "ioFile.ini"
FunctionEnd
If the INI file is located in another directory, use INSTALLOPTIONS_EXTRACT_AS. The second parameter is the filename in the temporary folder, which is the filename that should be used as input for the other macros.
Function .onInit
!insertmacro INSTALLOPTIONS_EXTRACT_AS "..\ioFile.ini" "ioFile.ini"
FunctionEnd
Displaying the dialog
You can call InstallOptions in a page function defined with the Page or UninstPage command. Check the NSIS documentation (Scripting Reference -> Pages) for information about the page system.
Page custom CustomPageFunction
To display the dialog, use the INSTALLOPTIONS_DISPLAY macro:
Function CustomPageFunction ;Function name defined with Page command
!insertmacro INSTALLOPTIONS_DISPLAY "ioFile.ini"
FunctionEnd
User input
To get the input of the user, read the State value of a Field using the INSTALLOPTIONS_READ macro:
!insertmacro INSTALLOPTIONS_READ $VAR "ioFile.ini" "Field #" "Name"
Writing to INI files
The INSTALLOPTIONS_WRITE macro allows you to write values to the INI file to change texts or control settings on runtime:
!insertmacro INSTALLOPTIONS_WRITE "ioFile.ini" "Field #" "Name" "Value"
Escaped values
Some InstallOptions values are escaped (in a similar manner to "C" strings) to allow characters to be used that are not normally valid in INI file values. The affected values are:
- The ValidateText field
- The Text value of Label fields
- The State value of Text fields that have the MULTILINE flag
The escape character is the back-slash character ("\") and the available escape sequences are:
"\\" | Back-slash |
"\r" | Carriage return (ASCII 13) |
"\n" | Line feed (ASCII 10) |
"\t" | Tab (ASCII 9) |
The INSTALLOPTIONS_READ_CONVERT and INSTALLOPTIONS_WRITE_CONVERT macros automatically convert these characters in installer code. In uninstaller code, use INSTALLOPTIONS_READ_UNCONVERT and INSTALLOPTIONS_WRITE_UNCONVERT.
To use these macros in your script, the conversion functions need to be included:
;For INSTALLOPTIONS_READ_CONVERT
!insertmacro INSTALLOPTIONS_FUNCTION_READ_CONVERT
;For INSTALLOPTIONS_WRITE_CONVERT
!insertmacro INSTALLOPTIONS_FUNCTION_WRITE_CONVERT
;For INSTALLOPTIONS_READ_UNCONVERT
!insertmacro INSTALLOPTIONS_UNFUNCTION_READ_CONVERT
;For INSTALLOPTIONS_WRITE_UNCONVERT
!insertmacro INSTALLOPTIONS_UNFUNCTION_WRITE_CONVERT
Input validation
To validate the user input (for example, to check whether the user has filled in a textbox) use the leave function of the Page command and Abort when the validation has failed:
Function ValidateCustom!insertmacro INSTALLOPTIONS_READ $R0 "test.ini" "Field 1" "State"
StrCmp $R0 "" 0 +3
MessageBox MB_ICONEXCLAMATION|MB_OK "Please enter your name."
AbortFunctionEnd
Return value
- success - The user has pressed the Next button
- back - The user has pressed the Back button
- cancel - The user has pressed the Cancel button
- error - An error has occurred, the dialog cannot be displayed.
You only have to check this value if you need something really special, such as doing something when the user pressed the Back button.
If you need the return value, use the INSTALLOPTIONS_DISPLAY_RETURN or INSTALLOPTIONS_SHOW_RETURN macro. The return value will be added to the stack, so you can use the Pop command to get it.
Reserve files
When using solid compression, it's important that files which are being extracted in user interface functions are located before other files in the data block. Otherwise there may be a delay before a page can be displayed.
To ensure that this is the case, add ReserveFile commands for InstallOptions and the INI files before all sections and functions:
ReserveFile "test.ini"
ReserveFile "${NSISDIR}\Plugins\InstallOptions.dll"
Fonts and colors
To customize fonts or colors on InstallOptions dialogs, the INSTALLOPTIONS_INITDIALOG and INSTALLOPTIONS_SHOW macro can be used.
INSTALLOPTIONS_INITDIALOG creates the dialog in memory, but does not show it. After inserting this macro, you can set the fonts and colors, and then insert INSTALLOPTIONS_SHOW to show the dialog.
The INSTALLOPTIONS_INITDIALOG macro also pushes the HWND of the custom dialog to the stack. Control HWND's are available for each control in the HWND entry of the corresponding field in the INI file.
Example of using a custom font:
Var HWND
Var DLGITEM
Var FONTFunction FunctionName ;FunctionName defined with Page command
!insertmacro INSTALLOPTIONS_INITDIALOG "ioFile.ini"
Pop $HWND ;HWND of dialog
!insertmacro INSTALLOPTIONS_READ $DLGITEM "ioFile.ini" "Field 1" "HWND"
;$DLGITEM contains the HWND of the first field
CreateFont $FONT "Tahoma" 10 700
SendMessage $DLGITEM ${WM_SETFONT} $FONT 0
!insertmacro INSTALLOPTIONS_SHOWFunctionEnd
Credits
Original version by Michael Bishop
DLL version by Nullsoft, Inc.
DLL version 2 by Amir Szekely, ORTIM, Joost Verburg
New documentation by Joost Verburg
License
Original version Copyright © 2001 Michael Bishop
DLL version 1 Copyright © 2001-2002 Nullsoft, Inc., ORTIM
DLL version 2 Copyright © 2003-2008 Amir Szekely, Joost Verburg, Dave LaundonThis software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute
it freely, subject to the following restrictions:1. The origin of this software must not be misrepresented;
you must not claim that you wrote the original software.
If you use this software in a product, an acknowledgment in the
product documentation would be appreciated but is not required.
2. Altered versions must be plainly marked as such,
and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any distribution.