From d7d4243b78ca816bd6beb33b499a3b0c85b5a53d Mon Sep 17 00:00:00 2001
From: Bob Arnson <bob@firegiant.com>
Date: Thu, 22 Sep 2022 21:26:45 -0400
Subject: Add WixUI/@InstallDirectory to simplify authoring.

Fixes https://github.com/wixtoolset/issues/issues/6926.
---
 .../WixToolsetTest.UI/TestData/WixUI_InstallDir/Package.wxs  |  4 ++--
 src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs      |  6 +++++-
 src/ext/UI/wixext/UICompiler.cs                              | 12 ++++++++++++
 3 files changed, 19 insertions(+), 3 deletions(-)

(limited to 'src')

diff --git a/src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_InstallDir/Package.wxs b/src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_InstallDir/Package.wxs
index b6f2344a..68e1177d 100644
--- a/src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_InstallDir/Package.wxs
+++ b/src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_InstallDir/Package.wxs
@@ -1,4 +1,4 @@
-<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:ui="http://wixtoolset.org/schemas/v4/wxs/ui">
+<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:ui="http://wixtoolset.org/schemas/v4/wxs/ui">
     <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" InstallerVersion="200">
         <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
 
@@ -12,7 +12,7 @@
             </Component>
         </ComponentGroup>
 
-        <ui:WixUI Id="WixUI_InstallDir" />
+        <ui:WixUI Id="WixUI_InstallDir" InstallDirectory="INSTALLFOLDER" />
     </Package>
 
     <Fragment>
diff --git a/src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs b/src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs
index f93f232c..9c0e2ed6 100644
--- a/src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs
+++ b/src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs
@@ -138,7 +138,7 @@ namespace WixToolsetTest.UI
             var bindFolder = TestData.Get(@"TestData\data");
             var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder });
 
-            var results = build.BuildAndQuery(Build, "Binary", "Dialog", "CustomAction");
+            var results = build.BuildAndQuery(Build, "Binary", "Dialog", "CustomAction", "Property");
             Assert.Single(results, result => result.StartsWith("Dialog:InstallDirDlg\t"));
             WixAssert.CompareLineByLine(new[]
             {
@@ -155,6 +155,10 @@ namespace WixToolsetTest.UI
                 "CustomAction:WixUIPrintEula\t65\tWixUiCa_X86\tPrintEula\t",
                 "CustomAction:WixUIValidatePath\t65\tWixUiCa_X86\tValidatePath\t",
             }, results.Where(r => r.StartsWith("CustomAction:")).ToArray());
+            WixAssert.CompareLineByLine(new[]
+            {
+                "Property:WIXUI_INSTALLDIR\tINSTALLFOLDER",
+            }, results.Where(r => r.StartsWith("Property:WIXUI")).ToArray());
         }
 
         [Fact]
diff --git a/src/ext/UI/wixext/UICompiler.cs b/src/ext/UI/wixext/UICompiler.cs
index 1d845237..44ab4cdc 100644
--- a/src/ext/UI/wixext/UICompiler.cs
+++ b/src/ext/UI/wixext/UICompiler.cs
@@ -55,6 +55,7 @@ namespace WixToolset.UI
         {
             var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
             string id = null;
+            string installDirectory = null;
 
             foreach (var attrib in element.Attributes())
             {
@@ -65,6 +66,9 @@ namespace WixToolset.UI
                         case "Id":
                             id = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
                             break;
+                        case "InstallDirectory":
+                            installDirectory = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
+                            break;
                         default:
                             this.ParseHelper.UnexpectedAttribute(element, attrib);
                             break;
@@ -111,6 +115,14 @@ namespace WixToolset.UI
                     IgnoreResult = true,
                     ExecutionType = CustomActionExecutionType.Immediate,
                 });
+
+                if (installDirectory != null)
+                {
+                    section.AddSymbol(new PropertySymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "WIXUI_INSTALLDIR"))
+                    {
+                        Value = installDirectory
+                    });
+                }
             }
 
             this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
-- 
cgit v1.2.3-55-g6feb