Separate Publish Event from Control - wix

I have a UI dialog which is common to several WiX projects.
But according to the project, the dialog before (Back) or after (Next) that common UI may be different.
To avoid code duplication, I would like to have the common dialog alone (without the Publish Event) and the Publish Event for that UI defined in each WiX project.
Is it possible and how to do this?

Yes it is, you could just have a look at the wix source code under src\ext\uiextension\wixlib. You'll notice that all the dialogs are in their own file and the UI sets are separated.
For example, in WixUI_Mondo.wxs, you have DialogRef tags to import your dialogs and a bunch of Publish tags to reorder the sequence. In, say, InstallDirDlg, there are the controls, and next to no Publish tags.
Your UI would look like:
<UI Id="MyUI">
<DialogRef="WelcomeDlg"/>
<DialogRef="InstallDirDlg"/>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg">CONDITION</Publish>
<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish>
</UI>
And in your dialog's file:
<UI>
<Dialog Id="WelcomeDlg" Width="370" Height="270" Title="Welcome">
<Control ... />
</Dialog>
</UI>
You can also have multiple InstallUISequence tags in your project. So if your dialog will always call a custom action, or be shown before another, you might as well put it in that file.
You can download the source code here

Related

how to disable back button in setup build using wixtoolset on VerifyReadyDlg

I am making a customize setup using wixtoolset v 3.11
On the custom diaglog CustomDlgOTP the next button pass to VerifyReadyDlg
<Control Id="Next" Type="PushButton" Text="&Next" TabSkip="no" Default="yes" Height="17" Width="56" X="236" Y="243">
<Publish Event="NewDialog" Value="VerifyReadyDlg"><![CDATA[propertyreturncode = "200"]]></Publish>
</Control>
<!-- <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="CustomDlgOTP" Order="1"> NOT Installed </Publish> -->
I want user should not be able to hit back button from VerifyReadyDlg. I tried commenting but the button is still visible but with no action.
Need a way to disable the back button on VerifyReadyDlg
You disabled action bounded to that button, but didn't disable the button itself. You should rewrite VerifyReadyDlg, remove back button from it, and then add edited dialog to your UI instead of original one.
In Wix source code find file VerifyReadyDlg.wxs. Copy it to your project. In copied file rename Dialog Id="VerifyReadyDlg" to Dialog Id="MyVerifyReadyDlg"
In copied file delete/comment Control Id="Back" element.
In your UI (which you presented in question) add element <DialogRef Id="MyVerifyReadyDlg" />
In your UI replace all occurrences of VerifyReadyDlg to MyVerifyReadyDlg (commented part should stay commented)

How to modify a feature installation in Wix with custom property

Wix newbie - but I expect that is apparent.
I am using a modified version of the WixUI FeatureTree extension for an application that basically just copies files to specific directories. The installation wants to copy or remove based on a checkbox selection.
I have a feature for each installation package. I'm creating properties for each option and using them as a condition for each feature, changing the feature level to 1 or 0.
<!--Features for REVIT v2020-->
<Feature Id="Product2020" Title="Performance Seating v2020" Level="1">
<Condition Level="1">
<![CDATA[REVIT2020SELECTED = "Selected"]]>
</Condition>
<Condition Level="0">
<![CDATA[REVIT2020SELECTED <> "Selected"]]>
</Condition>
<!--Reference to Components.wxs component list hard coded-->
<ComponentGroupRef Id="2020Components" />
</Feature>
In the UI, I set the state of the property at the checkbox.
<Control Id="cbRevit2020"
Type="CheckBox"
Property="REVIT2020SELECTED"
X="50"
Y="110"
Height="10"
Width="150"
CheckBoxValue="Selected"
Text="Revit 2020"/>
The installation runs as expected on first run - features are installed based on the checkbox selection. Uninstall also works fine. Modify, however, does nothing regardless of checkbox state. I haven't changed anything in the FeatureTree.wxs custom file other than referencing my custom CustomizeDlg file.
I found reference to the issue (I think) here - https://robmensching.com/blog/posts/2010/5/2/the-wix-toolsets-remember-property-pattern/ However, it's over 10 years old and seems overly complex for what I need to do.
Does someone have a better approach?
BTW - yes, I know this is solvable simply by using the FeatureTree element. This is purely a personal preference, as I'm not a fan of that user interface in this application.
Thank you for any assistance.
Issue solved after quite a bit of searching and am posting in case it helps anyone else.
This article describes my desire and offers a good description of what is going on. https://www.joyofsetup.com/2007/05/30/feature-conditions-and-ui/
I removed the condition from the feature and moved it into the dialog as a publish event under the Next button control.
<Control Id="Next" Type="PushButton" X="248" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)">
<Subscribe Event="SelectionNoItems" Attribute="Enabled" />
<Publish Event="AddLocal" Value="ALL">1</Publish>
<Publish Event="Remove" Value="PRODUCT2020">NOT REVIT2020SELECTED</Publish>
<Publish Event="Remove" Value="PRODUCT2021">NOT REVIT2021SELECTED</Publish>
<Publish Event="Remove" Value="PRODUCT2022">NOT REVIT2022SELECTED</Publish>
<Publish Event="Remove" Value="PRODUCTFAMILIES">NOT FAMILIESSELECTED</Publish>
I preset selections in the dialog based on install condition.
<SetProperty Id="REVIT2020SELECTED"
After="MigrateFeatureStates"
Value="Selected">
<![CDATA[REVIT2020INSTALLED AND (NOT Installed OR NOT !PRODUCT2020=2)]]>
</SetProperty>

WiX statement "CDATA[NOT Installed]" is not working

I am trying to make the DemoDatabaseDlg dialog conditional, so if it is the FIRST time the user is installing the installer then "DemoDatabaseDlg" should be displayed. If it is NOT the first time installation then skip this dialog and jump to the next dialog.
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="DemoDatabaseDlg">1</Publish>
<Publish Dialog="DemoDatabaseDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">
<![CDATA[NOT Installed]]>
</Publish>
<Publish Dialog="DemoDatabaseDlg" Control="Next" Event="NewDialog" Value="PrepareDlg">1</Publish>
<Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
However, after the first installation, when I try to increase the version number and re-install again, I still CAN see the DemoDatabaseDlg dialog. How can I skip this dialog using CDATA conditions?
Typically you have a Welcome dialog and a Maintenance dialog in the UI sequence as the first dialog. It's hard to say for sure without seeing the rest of your code or an installation log file but my guess is you are doing major upgrades and changing the ProductCode property with each build. In this scenario each new version is not yet installed from MSI's perspective.

Removing license dialog

I'm using Wix 3.6 to make a simple MSI which is used internally. I would like to know if there is an easy way to remove the license agreement dialog.
Thanks for any suggestions
I skipped it using:
<UI>
<UIRef Id="WixUI_InstallDir" />
<Publish Dialog="WelcomeDlg"
Control="Next"
Event="NewDialog"
Value="InstallDirDlg"
Order="2">1</Publish>
<Publish Dialog="InstallDirDlg"
Control="Back"
Event="NewDialog"
Value="WelcomeDlg"
Order="2">1</Publish>
</UI>
This simplification of the XML referred to above (http://www.howdoicode.net/2011/09/wix-how-to-hide-license-agreement.html) worked for me; this effectively skips the license rather than hooking in a custom page
<UI Id='Mondo'>
<UIRef Id="WixUI_Mondo" />
<UIRef Id="WixUI_ErrorProgressText" />
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="SetupTypeDlg" Order="3">1</Publish>
<!-- skip the page on the way back too -->
<Publish Dialog="SetupTypeDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="3">1</Publish>
</UI>
I gotta say the general approach of copy the wix code and hack it about a bit ("Changing the UI sequence of a built-in dialog set"(http://wixtoolset.org/documentation/manual/v3/wixui/wixui_customizations.html)) is kinda doomed really.... but hey
I've recently come across a project Wix# that mimics the Wix XML files, but enables you code the setup in C#. You can find this project on https://wixsharp.codeplex.com. I initially had the same problem with a license file with the "Terms and Conditions" that need to be accepted before the user can install the software. With the solution not being of such a nature that it required "Terms and Conditions" to be accepted, I had to find a way to remove this dialog.
After a bit of searching (in Wix#), I came up with the following:
WixSharp.CommonTasks.Tasks.RemoveDialogsBetween(project,
WixSharp.Controls.NativeDialogs.WelcomeDlg,
NativeDialogs.InstallDirDlg);
Okay, I get that this doesn't solve the problem outright, because this will mean that you'd have to re-code your solution, so the next port of call was to look at the WiX Source File that was emitted during this process.
So from that, I saw that there was a <UI> element with the following:
<UI>
<Publish Dialog="WelcomeDlg"
Control="Next"
Event="NewDialog"
Value="InstallDirDlg"
Order="5">1</Publish>
<Publish Dialog="InstallDirDlg"
Control="Back"
Event="NewDialog"
Value="WelcomeDlg"
Order="5">1</Publish>
</UI>
Which binds the Next button on the welcome dialog to the install directory dialog (or the dialog after the license dialog), and the Back button of the install dialog to the welcome dialog - effectively removing the license dialog box.
The key is to make a custom UI and hook up different pages. See the page on WixWiki
You want to grab the WixUI code for the dialog set you are using (e.g Minimal, etc), Call it <UI Id='MyAppWix_UIMinimal'> and modify it a bit and reference it in your main wxs. Instead of the WelcomeEulaDlg welcome dialog, you want to use the WelcomeDlg. Adjust the references, and wire up the Next button on the WelcomeDlg to the next dialog in the stack.
Here is a good link with code: http://www.howdoicode.net/2011/09/wix-how-to-hide-license-agreement.html

Including modified FilesInUse dialog in WIX project

I have a modified FilesInUse dialog. Just including it in project and changing reference in UI does not help - I get "ICE20: Standard Dialog: 'FilesInUse' not found in Dialog table" error when building installation project.
Browsing the Net I've found one advice - to supress ICE validation for ICE20. Well, building the project with such settings works fine, and the msi also works fine, but I'm not sure that's a good solution to the problem.
Another advice was to modify FilesInUse and remove WixUIExtension from references, but as far as I know this way I'll end up with copying all the needed dialog files to my project. This I'd like to avoid.
So, what can be done to include my custom FilesInUse in WIX project correctly?
You could use a custom FilesInUse Dialog in the following manner:
<Fragment>
<UI>
<Dialog Id="FilesInUse" Width="370" Height="270" Title="Your product name">
<Control Id="Retry" Type="PushButton" X="304" Y ="243" Width="56" Height="17" Text="Retry" Default="yes" Cancel="yes">
<Publish Event="EndDialog" Value="Retry">1</Publish>
</Control>
<Control Id="Ignore" Type="PushButton" X="235" Y ="243" Width="56" Height="17" Text="Ignore">
<Publish Event="EndDialog" Value="Ignore">1</Publish>
</Control>
<Control Id="Exit" Type="PushButton" X="235" Y ="243" Width="56" Height="17" Text="Exit">
<Publish Event="EndDialog" Value="Exit">1</Publish>
</Control>
<Control Id ="InUseFiles" Type="ListBox" Width="300" Height="150" X="30" Y ="60" Property="FileInUseProcess" Sorted="yes" TabSkip="yes" />
</Dialog>
</UI>
</Fragment>
You just have to reference this Dialog into your Custom InstallDialog with the tag
<DialogRef Id="FilesInUse" />
All the tags mentioned are part of the ICE20 Dialog Requierements
Hope this helps. Have a nice day.
OK, I just spent some time trying to figure out how to solve this problem.
Though there are some good references in suggested thread, I think the FilesInUse dialog is a bit more specific to customize, so I decided to write a more concrete solution to the problem.
See, the problem is that MSI uses the FilesInUse dialog automatically, so if you try to change it somehow, you get errors such as FilesInUse not existing in Dialog table or duplicate FilesInUse dialog in table if you are referencing your custom dialog from other files.
The solution I found working was not to use DialogRef to Wix's FilesInUse dialog at all, but to make my custom dialog in main UI file (Where I would normally put DialogRef to FilesInUse) and name it FilesInUse.
Hope this helps other people having the same problem.
One more wrinkle is that the custom FilesInUse dialog will not be displayed when clicking Uninstall in Programs and Features since the uninstall is run with UILevel 3, so only the built-in FilesInUse will be displayed.
To work around that include this in your product.wxs:
<Property Id="ARPNOREMOVE" Value="1" />
Then when users press the Change (or Modify) button in Programs and Features, the Maintenance dialog will have a Remove button they can use to uninstall, and that will show custom dialogs. Products like Visual Studio only have a Change/Modify button.
One more thing is that Apps and Features (Windows 10) will disable the Modify button if the Uninstall key doesn't have a ModifyPath setting. It should be set to
MsiExec.exe /I{<yourproductcode>}
Your bootstrapper will need to do this. Not sure if the MSI can set it.
If building on the command line: light.exe -sice:ICE20...
If working in Visual Studio: Right click your setup project, select "Properties", Select "Tool settings" on left side of screen, Add "ICE20" to the "Suppress Specific ICE validation:" edit box.
See the related question and answers here: WiX replace dialog
User Yan Sklyarenko answered on Mar 25 '11:
Couple of articles to help you:
WiX
Tutorial
Neil Sleightholm's
article
You should find all the info you need for your case there.
User Bob Arnson answered on Mar 25 '11:
See "Changing the UI sequence of a built-in dialog set" in the topic
"Customizing Built-in WixUI Dialog Sets" in WiX.chm.