InstallOptionsEx

Introduction

InstallOptionsEx is a NSIS plugin which allows you to create custom pages for NSIS installers, to prompt the user for extra information. This is a expanded version of original InstallOptions, with additional controls, flags and options. This readme file contains the original readme + changes indicated by colors:

     Added
     Changed
     Removed

InstallOptionsEx will create a dialog which will be displayed inside the NSIS window. The controls on the dialog can be defined in an INI file.

NSIS 2 has a new page system, which allows you to add custom pages to your installer without messing with Prev/Next functions. With the new plugin system, you also don't have to worry anymore about extracting and deleting the DLL file. When you store the INI files in the plugins directory, NSIS will also delete them automatically.

This version of InstallOptionsEx has been designed for NSIS 2. It supports customized user interfaces and custom font and DPI settings.

INI File

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 (Removed) This is detected automatically by the .dll
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. Use NSIS's $(^RTL) to fill this field, it's the easiest way.
State (output) This is not something you have to supply yourself but is set by InstallOptionsEx, 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 starting at 1. Each Field section can contain the following values:

Type Type of control to be created. Valid values are:
Label Used to display static text. (i.e. a caption for a textbox)
Text Accepts text input from the user.
Password Accepts password input from the user. The input is masked with * characters.
Combobox Allows the user to type text not in the popup list.
DropList Only allows selection of items in the list.
Listbox Shows multiple items and can optionally allow the user to select more than one item.
CheckBox Displays a check box with label.
RadioButton Displays a radio button with label.
FileRequest
DirRequest
Use Text and Button controls to make one that fits your style.
Icon Displays an icon. Use no "Text" to use the installer icon.
Bitmap Displays a bitmap.
Animation Displays an AVI video. Has to be without sound.
ProgressBar Displays a bar to show progress.
TrackBar Displays a bar where the user can select with the slider one of the options indicated by ticks. It doesn't include labels.
IPAddress Displays an edit box used for IP address input.
DateTime Displays a combo box where the user can pick or select a date or time he/she wants.
MonthCalendar Displays a month calendar where the user can select a date he/she wants.
GroupBox Displays a frame to group controls.
Link Displays a static hot text. When the user clicks the control the contents of State (e.g. http://...) will be executed using ShellExecute. Alternatively State can be omitted and the NOTIFY flag used to have your NSIS script called. See the "NOTIFY" flag below for more information.
Button Displays a push button that can be used in the same way as the "Link" control above.
UpDown Displays a pair of arrow buttons that the user can click to increment or decrement a number in a Text or ComboBox buddy controls, to change the selection upwards or downwards of a ListBox control, or to be used alone (without the user knowing what number he/she selected). See Text, State and Left Right Top Bottom commands for more information on how to use it on the specified situations.
 
Text Generally specifies control caption, but this can depend on the control type:
Label
Checkbox
RadioButton
(Input) Specifies the control caption.

Note: For Label controls, $\r$\n will be converted to a newline. Described below.
Icon
Bitmap
Animation
(Input) Specifies the path to a file for its type.
ComboBox
DropList
(Input) Specifies the bitmap file to load containing a slot for each item in the list specified by "ListItems". Each bitmap slot (for each list item) is 16x16 pixels long, with transparent color set to #FF00FF (format #RRGGBB). Limit of 256 bitmap slots for now. The slots have to be ordered as the list items.
DateTime (Input) Specifies the format to show State. Default is the date format specified by the user in the Regional and Language Options from Control Panel.
Button (Input) Specifies control's text. If ICON or BITMAP flags are associated with a button control, this specifies the path where the icon or bitmap are.
UpDown (Input) Specifies the buddy control field number (where the UpDown attaches itself into another). Recommended types of buddy controls are: Text, ComboBox and ListBox. If you don't want to have a buddy control, you have to leave this as blank.
 
State Specifies the state of the control. This is updated when the user closes the window, so you can read from it from NSIS. The input/output depends on the control type:
Edit
Password
DirRequest
IPAddress
(Input/Output) String to appear (or last appeared).
RadioButton
CheckBox
(Input/Output) '0' or '1' (for unchecked or checked).
ListBox (Input/Output) Selected items separated by pipes ('|').
ComboBox
DropList
(Input/Output) Selected item name.
Link (Input) Specify something to be executed or opened (like "Exec" command from NSIS).
Button (Input) Specify something to be executed or opened (like "Exec" command from NSIS). If you specify FILEREQUEST or DIRREQUEST flags this specify to what control field number the result value will be returned. Recommended controls are: Text and ComboBox controls.
ProgressBar (Input/Output) Specify at what point the progress is. Maximum limit is 100 when MaxLen is not specified.
TrackBar (Input/Output) Specify the number of the option selected.
DateTime (Input/Output) Specify the date and time to show. Has to be based on this format:

d/m/yyyy h:m:s w (w = day of the week as a number -> Sunday = 0, Monday = 1...)

The separators can be:

"/", "\", "-", ":" or " ".

If you don't want to specify all those numbers, you can just keep it empty, i.e.:

27//2003

Only will be used the day and the year.
UpDown (Input/Output) Specify the number of the option selected. NOTE: If a UpDown control has its buddy control a Text control, it will replace its state for UpDown's.
 
ListItems (Input) 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 (Input) Causes validation on the selected control to limit the maximum length of text (or options).
If the user specifies more text than this, a message box will appear when they click "OK" and the dialog will not be dismissed.
Text If the control has FILEREQUEST or DIRREQUEST flags, this should be set to 260.
ComboBox You should not use this with this control since the user can not control what is selected.
Animation Is the ending frame of the animation. -1 is the last frame animation.
ProgressBar
TrackBar
This limits the number of maximum progress/options.
 
MinLen (Input) 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.
ComboBox If you set this to "1" the program will force the user to select an item.
Animation Is the starting frame of the animation. 0 is the first frame.
ProgressBar Is the value when the progress starts. If State is lower than this value, the progress won't show up.
TrackBar Is the starting option number.
 
ValidateText (Input) 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. Described below.
 
Left
Right
Top
Bottom
(Input) 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.
ComboBox
DropList
The Bottom value is not used in the same way.
In this case, the bottom value is the maximum size of the window when the pop-up list is being displayed. All other times, the combobox is automatically sized to be one element tall. If you have trouble where you can not see the combobox drop-down, then check the bottom value and ensure it is large enough. A rough guide for the height required is the number of items in the list multiplied by 8, plus 20.
ProgressBar When using XPStyle on, the minimum height (or width if using VERTICAL flag) has to be above 5 dialog units or the ProgressBar will not be redrawn right.
MonthCalendar Recommended size: 131x95.
 
Filter (Input) Specifies the filter to be used in the Text controls that use FILEREQUEST flag.
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 (Input) Used by "DirRequest" control 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 (Input) 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.
Value Meaning
GROUP Add this flag to the first control of a group of controls to group them. Grouping controls allows you to create multiple groups of radio button and makes keyboard navigation using arrow keys easier.
REQ_SAVE This causes Button controls with FILEREQUEST flag to display a Save As dialog. If not specified, an Open dialog is used.
FILE_MUST_EXIST Used by Button controls with FILEREQUEST flag to determine if the selected file must exist.
This only applies if an "Open" dialog is being displayed.
This currently does not force the file to exist other than through the browse button.
FILE_EXPLORER Used by Button controls with FILEREQUEST flag, enables new file request look (recommended)
FILE_HIDEREADONLY Used by Button controls with FILEREQUEST flag, hides "open read only" checkbox in open dialog.
WARN_IF_EXIST Used by Button controls with FILEREQUEST flag to display a warning message if the selected file already exists.
The warning message is only displayed for files selected with the browse button.
PATH_MUST_EXIST Used by Button controls with FILEREQUEST flag to force the path to exist. Prevents the user from typing a non-existent path into the browse dialog window.
This only validates path's selected with the browse button.
PROMPT_CREATE Used by Button controls with FILEREQUEST flag to display a warning if the selected file does not exist. However, it still allows the user to select the file.
This only displays the warning for files selected with the browse button.
Doesn't work along with REQ_SAVE.
RIGHT Used by CheckBox and RadioButton controls to specify you want the checkbox to the right of the text instead of the left as is the default.
MULTISELECT Used by ListBox controls. Turns string selection on or off each time the user clicks or double-clicks a string in the list box. The user can select any number of strings. If this flag and EXTENDEDSELCT are not specified, only one item can be selected from the list.
EXTENDEDSELCT Used by ListBox controls. Allows multiple items to be selected by using the SHIFT key and the mouse or special key combinations. If this flag and MULTISELECT are not specified, only one item can be selected from the list.
RESIZETOFIT This causes Bitmap controls to resize the image to the size of the control. Also useful to support custom DPI settings. Without this, the image will be centered within the specified area.
NOTABSTOP Do not stop on the control when the user pressed the Tab key. Add NOTABSTOP to all controls of a group except the first one to allow navigation between groups with the Tab key.
DISABLED Causes a control to be disabled.
ONLY_NUMBERS Used by Text controls. Forces the user to enter only numbers into the edit box.
MULTILINE Used by Text controls. Causes the control to accept multiple-lines.
WANTRETURN Used by Text controls with multiple-line. Specifies that a carriage return be inserted when the user presses the ENTER key while entering text into the text box.
NOWORDWRAP Used by Text controls with multiple-line. Disables the word-wrap that occurs when long lines are entered. Long lines instead scroll off to the side. Specifying the HSCROLL flag also has this effect.
HSCROLL Show a horizontal scrollbar. When used by "Text" controls with multiple-lines this also disables word-wrap.
VSCROLL Show a vertical scrollbar.
READONLY Used by Text controls. Prevents the user from entering or editing text in the edit control, but allow the user to select and copy the text.
NOTIFY Used by Text, Password, ComboBox, DropList, ListBox, CheckBox, RadioButton, Button and Link controls. Causes InstallOptionsEx to call your NSIS custom page validation/leave function whenever the control's selection changes. Your validation/leave function can read the State value from the Settings section to determine which control caused the notification, if any, and perform some appropriate action followed by an Abort instruction (to tell NSIS to return to the page). The Contrib\InstallOptionsEx folder contains an example script showing how this might be used.
CENTER Used by Animation controls. Makes the animation centered.
SMOOTH Used by ProgressBar controls. Makes the progress bar smooth.
VERTICAL Used by ProgressBar controls. Makes the progress bar to appear as a vertical progress bar with the indicator bar starting from bottom.
BACK_RECT Used by Trackbar controls. Makes the control show a white rectangle where the slider passes on.
TOOLTIPS Used by Trackbar controls. Makes the control show tooltips when the user changes the slider position.
NO_TICKS Used by Trackbar controls. Makes the control do not show ticks on the entire control.
BITMAP Used by Button controls. Makes the control show a bitmap instead of text. Don't use this with ICON flag.
ICON Used by Button controls. Makes the control show an icon instead of text. Don't use this with BITMAP flag.
UPDOWN Used by DateTime controls. Makes the control like the UpDown control from Windows, but using date and time.
NOTODAY Used by MonthCalendar controls. Makes the control to do not display the "today" date at the bottom of the control. Recommended control height is 75.
NOTODAYCIRCLE Used by MonthCalendar controls. Makes the control to do not circle the "today" date.
WEEKNUMBERS Used by MonthCalendar controls. Makes the control to display week numbers (1-52) to the left of each row of days. Week 1 is defined as the first week that contains at least four days. Recommended control width is 134.
FILEREQUEST Used by Button controls. Makes the control to display a common dialog requiring a file for input. See State option for more details on how to output it to another control.
DIRREQUEST Used by Button controls. Makes the control to display a common dialog requiring a directory for input. See State option for more details on how to output it to another control.
LEFT Used by UpDown controls. Makes the control to position to the left of its buddy control. If it doesn't have a buddy control, it will be ignored.
HORIZONTAL Used by UpDown controls. Makes the arrows of the control to point left and right instead of up and down.
WRAP Used by UpDown controls. Makes the position to "wrap" if it is incremented or decremented beyond the ending or beginning of the range.
 
TxtColor Used by Link controls to specify the foreground color of the text. Format: 0xBBRRGG (hexadecimal).

How to use

Modern UI

As this is a different module than the original InstallOptions, none of the commands provided by Modern UI supports InstallOptionsEx.dll, but you can make a "trick" by renaming this dll to InstallOptions.dll. But remember, if you use mixed Modern UI with these commands below, you'll have to call like you would for the normal InstallOptions.dll. Both dlls calling are similar. If you do this above, you can normally see instructions from Modern UI documentation.

Extract the INI File

First, you have to extract the INI files for the dialogs in the .onInit function:

Function .onInit

  InitPluginsDir
  File /oname=$PLUGINSDIR\test.ini test.ini

FunctionEnd

Call the DLL

You can call InstallOptionsEx in a page function, check the NSIS documentation for information about the page system. Example:

Page custom SetCustom ValidateCustom

The InstallOptionsEx DLL has three functions:

  • dialog - Creates the dialog immediately
  • initDialog - Creates the dialog in memory, does not show it
  • show - Shows a dialog created in memory

Usually, you only need to use the dialog function:

Function SetCustom ;FunctionName defined with Page command

  ;Display the InstallOptionsEx dialog

  Push $R0

  InstallOptionsEx::dialog $PLUGINSDIR\test.ini
  Pop $R0

FunctionEnd

Get the input

To get the input of the user, read the State value of a Field using ReadINIStr:

ReadINIStr $R0 "$PLUGINSDIR\test.ini" "Field 1" "State"

Note:

Some InstallOptionsEx values are escaped (in a similar manner to NSIS 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

New Lines and Tabs have the NSIS default usage:

$\r Carriage return (ASCII 13)
$\n Line feed (ASCII 10)
$\t Tab (ASCII 9)

Validate the input

If you want to validate the input on the page, for example, you want 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

  ReadINIStr $R0 "$PLUGINSDIR\test.ini" "Field 1" "State"
  StrCmp $0 "" 0 +3
    MessageBox MB_ICONEXCLAMATION|MB_OK "Please enter your name."
    Abort

FunctionEnd

Return value

After you have called the DLL, InstallOptionsEx adds one string to the stack, with one of the following values:

  • 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.

Usually, you don't need to check this value, but you still have to remove it from the stack (have a look at the example above).

You only have to check this value if you need something really special, such as doing something when the user pressed the Back button.

Reserve files

If you are using BZIP2 (solid) compression, it's important that files which are being extracted in init- or page functions function are located before other files in the data block, because this will make your installer faster.

If there are File commands in your sections or functions above the init- or page functions, add ReserveFile commands above your sections and functions:

ReserveFile "test.ini"
ReserveFile "${NSISDIR}\Plugins\InstallOptionsEx.dll"

Fonts and colors

If you want to use custom fonts or colors on your InstallOptionsEx dialogs, you should use the initDialog and show functions. initDialog creates the dialog in memory, but does not show it. After calling initDialog, you can set the fonts and colors, and call show to show the dialog. initDialog pushes the HWND of the custom dialog to the stack. To get the HWND of the controls use:

GetDlgItem (output var) (hwnd of the custom dialog) (1200 + Field number - 1)

Example of using a custom font:

Function FunctionName ;FunctionName defined with Page command

  ;Display the InstallOptionsEx dialog

  Push $R0
  Push $R1
  Push $R2

    InstallOptionsEx::initDialog /NOUNLOAD $PLUGINSDIR\test.ini
    Pop $R0

    GetDlgItem $R1 $R0 1200 ;1200 + Field number - 1

    ;$R1 contains the HWND of the first field
    CreateFont $R2 "Tahoma" 10 700
    SendMessage $R1 ${WM_SETFONT} $R2 0

    InstallOptionsEx::show
    Pop $R0

  Pop $R2
  Pop $R1
  Pop $R0

FunctionEnd

Version History

  • Ex DLL version 2.4 beta 4 (6/11/2004)
    • Added UpDown control.
    • Removed FileRequest and DirRequest controls. Use Text and Button controls instead.
    • Added FILEREQUEST and DIRREQUEST flags for Button controls and LEFT, HORIZONTAL and WRAP flags for UpDown controls.
    • NSIS $\n, $\r and $\t imported to remove the need for conversions between NSIS characters and plugin's.
  • Ex DLL version 2.4 beta 3 (6/7/2004)
    • Added DateTime and MonthCalendar controls.
    • Added UPDOWN flag for DateTime controls and NOTODAY, NOTODAYCIRCLE and WEEKNUMBERS flags for MonthCalendar controls.
  • Ex DLL version 2.4 beta 2 (5/31/2004)
    • Added TrackBar and IPAddress controls.
    • Added ability of Button controls of supporting an image or icon.
    • Added BACK_RECT, TOOLTIPS and NO_TICKS flags for TrackBar controls and BITMAP and ICON flags for Button controls.
    • Added support of NOTIFY flag for IPAddress control.
    • Removed TRANSPARENT and NOAUTOPLAY flags for Animation control.
  • Ex DLL version 2.4 beta 1 (5/24/2004)
    • Removed NumFields from INI File "Settings" section.
    • Added Animation and ProgressBar controls.
    • Added ability of ComboBox and DropList controls of supporting images for each item in their list boxes.
    • Added TRANSPARENT, CENTER and NOAUTOPLAY flags for Animation controls and SMOOTH and VERTICAL flags for ProgressBar controls.
    • Added support of NOTIFY flag for Text, Password and ComboBox controls.

Version History of original InstallOptions

  • Original InstallOptions DLL version 2.4 (1/4/2004)
    • Initial focus is set in "initDialog" making it possible to override it from NSIS prior to calling "show"
    • When initial focus is to a Text field InstallOptions now follows standard Windows behaviour by having the text selected
    • Label and other static fields no longer have State= written to the INI file when leaving the dialog
    • NOTIFY flag can now be used with Link fields (State should be omitted in this case)
    • Likewise, State can now be used with Button fields (behaves the same as with Link fields)
    • NOTIFY flag can also now be used with ListBox and DropList fields to have NSIS notified when the selection changes
    • Meaning of RIGHT flag is now reversed in right-to-left language mode
    • HSCROLL and VSCROLL flags are no longer restricted to Text fields
    • Various Link field fixes
  • Original InstallOptions DLL version 2.3 (12/4/2003)
    • Added new control type "Button"
    • Added new flag "NOTIFY"
    • Added new flag "NOWORDWRAP" for multi-line text boxes
    • Reduced size down to 12K
    • Better RTL support
  • Original InstallOptions DLL version 2.2 (4/9/2003)
    • Added new control "link"
    • \r\n converts to newline in Multiline edit box
    • Support for multiline edit box
    • Better tab order in DirRequest and FileRequest
    • Added RTL support
    • Minor fixes
  • Original InstallOptions DLL version 2.1 (3/15/2003)
    • \r\n converts to newline in both label Text and ValidateText
    • New browse dialog style (modern)
    • Word wrapping for check boxes and radio buttons
    • No ugly border for edit fields under XP
    • Scroll bar for list boxes
    • Works with SetStaticBkColor
    • DISABLED dir and file request fields now disable the browse button too
    • No more STATE value for labels
    • Minor fixes
  • Original InstallOptions DLL version 2.0 (1/4/2003)
    • Supports custom font and DPI settings (by Joost Verburg)
    • INI files should contain dialog units now, no pixels (by Joost Verburg)
    • RESIZETOFIT flag for Bitmap control (by Amir Szekely)
    • New documentation (by Joost Verburg)
    • New GROUP/NOTABSTOP/DISABLED flags

Complete version history of Original InstallOptions DLL

Credits

Original version by Michael Bishop
DLL version by Nullsoft, Inc.
DLL version 2 by Amir Szekely, ORTIM, Joost Verburg
InstallOptionsEx DLL (modificaded from original InstallOptions 2) by Diego Pedroso

Documentation for InstallOptions 2 by Joost Verburg
InstallOptionsEx Documentation (modificaded from original InstallOptions 2) by Diego Pedroso

License

Original version Copyright © 2001 Michael Bishop
DLL version 1 Copyright © 2001-2002 Nullsoft, Inc., ORTIM
DLL version 2 Copyright © 2003-2004 Amir Szekely, Joost Verburg, Dave Laundon
InstallOptionsEx DLL (modificaded from original InstallOptions 2) by Diego Pedroso

This 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.