List:Commits« Previous MessageNext Message »
From:Reggie Burnett Date:January 17 2011 5:05pm
Subject:bzr commit into wex-installer-1.0 branch (reggie.burnett:256)
View as plain text  
#At file:///C:/Users/Reggie/work/wex/installer/ based on revid:iggy@stripped

  256 Reggie Burnett	2011-01-17
      initial implementation of catalog support

    added:
      WexInstaller/Core/ProductCatalog.cs
      WexInstaller/Core/ProductManifest.cs
      WexInstaller/Resources/MySQLInstallerProductCatalog_Download.png
      WexInstaller/Resources/MySQLInstallerProductCatalog_DownloadCom.png
      WexInstaller/Resources/MySQLInstallerProductCatalog_InPackage.png
      WexInstaller/Resources/MySQLInstallerProductCatalog_OnDisk.png
      WexInstaller/Resources/wex_product_catalog.png
    modified:
      Setup_Net/products.xml
      WexInstaller/Controls/FeatureTreeView.cs
      WexInstaller/Core/Product.cs
      WexInstaller/Core/ProductCategory.cs
      WexInstaller/Core/ProductManager.cs
      WexInstaller/InstallWizard/Features.Designer.cs
      WexInstaller/InstallWizard/Features.cs
      WexInstaller/InstallWizard/Features.resx
      WexInstaller/InstallWizard/InstallType.Designer.cs
      WexInstaller/InstallWizard/InstallType.cs
      WexInstaller/Properties/Resources.Designer.cs
      WexInstaller/Properties/Resources.resx
      WexInstaller/WexInstaller.csproj
=== modified file 'Setup_Net/products.xml'
=== modified file 'Setup_Net/products.xml'
--- a/Setup_Net/products.xml	2010-12-09 16:05:50 +0000
+++ b/Setup_Net/products.xml	2011-01-17 17:05:19 +0000
@@ -1,89 +1,104 @@
 <?xml version="1.0" encoding="utf-8"?>
 
-<ProductCategories>
+<ProductManifest>
+
+  <ProductCatalogs>
+    <ProductCatalog id="mysql-5.5-gpl" name="MySQL 5.5" description="MySQL 5.5 Community Edition" commercial="false" default="true">
+    </ProductCatalog>
+    <ProductCatalog id="mysql-5.5-com" name="MySQL 5.5" description="MySQL 5.5 Commercial Edition" commercial="true" default="false">
+      <Products>
+        <Product id="Connector-net" />
+      </Products>
+    </ProductCatalog>
+    <ProductCatalog id="mysql-5.1-gpl" name="MySQL 5.1" description="MySQL 5.1 Community Edition" commercial="false" default="false">
+    </ProductCatalog>
+  </ProductCatalogs>
+
+  <ProductCategories>
     <ProductCategory name="Server" title="MySql Servers" description="MySQL Database Servers">
-        <Product name="mysql-server" title="MySQL Server" description="The core MySQL database server" default="true" upgradeId="{49EB7A6A-1CEF-4A1E-9E89-B9A4993963E3}" urlBaseDir="mysql-5.5">
-            <Packages>
-                <Package id="{A2DDB7E9-6AD9-4482-9DDB-FC352B6C75B1}" type="MSI" arch="X86" filename="mysql-5.5.7-rc-win32.msi" thisVersion="5.5.7">
-                    <Feature name="MYSQLSERVER" title="MySQL Server" description="Install MySQL Server." size="0" default="true" display="true" hasComponents="true">
-                        <Feature name="DebugBinaries" title="Debug binaries" description="Debug/trace versions of executables and libraries" default="true" display="true" hasComponents="true"/>
-                        <Feature name="Client" title="Client Programs" description="Various helpful (commandline) tools including the mysql command line client" default="true" display="true" hasComponents="true" />
-                    </Feature>
-                    <Feature name="DEVEL" title="Development Components" description="Installs C/C++ header files and libraries" default="true" display="true" hasComponents="true">
-                        <Feature name="SharedLibraries" title="Client C API library (shared)" description="Installs shared client library" default="true" display="true" hasComponents="true" />
-                        <Feature name="Embedded" title="Embedded server library" description="Installs embedded server library" default="false" display="true" hasComponents="true" />
-                    </Feature>
-                    <Feature name="DEBUGSYMBOLS" title="Debug Symbols" description="Installs Debug Symbols" default="true" display="true" hasComponents="true" />
-                    <Feature name="MISC" title="MISC" description="MISC" default="true" display="0" hasComponents="0">
-                        <Feature name="IniFiles" title="" description="" default="true" display="0" hasComponents="true" />
-                        <Feature name="Server_Scripts" title="" description="" default="true" display="0" hasComponents="true" />
-                    </Feature>
-                    <Feature name="InstanceConfig" title="" description="" default="true" display="0" hasComponents="true" />
-                    <Feature name="ProgramMenu" title="" description="" default="true" display="0" hasComponents="true" />
-                    <Feature name="UserEditableDatafiles" title="" description="" default="true" display="0" hasComponents="true" />
-                    <Feature name="RegKeys" title="" description="" default="true" display="0" hasComponents="true" />
-                </Package>
-            </Packages>
-        </Product>
+      <Product name="mysql-server" title="MySQL Server" description="The core MySQL database server" default="true" upgradeId="{49EB7A6A-1CEF-4A1E-9E89-B9A4993963E3}" urlBaseDir="mysql-5.5">
+        <Packages>
+          <Package id="{A2DDB7E9-6AD9-4482-9DDB-FC352B6C75B1}" type="MSI" arch="X86" filename="mysql-5.5.7-rc-win32.msi" thisVersion="5.5.7">
+            <Feature name="MYSQLSERVER" title="MySQL Server" description="Install MySQL Server." size="0" default="true" display="true" hasComponents="true">
+              <Feature name="DebugBinaries" title="Debug binaries" description="Debug/trace versions of executables and libraries" default="true" display="true" hasComponents="true"/>
+              <Feature name="Client" title="Client Programs" description="Various helpful (commandline) tools including the mysql command line client" default="true" display="true" hasComponents="true" />
+            </Feature>
+            <Feature name="DEVEL" title="Development Components" description="Installs C/C++ header files and libraries" default="true" display="true" hasComponents="true">
+              <Feature name="SharedLibraries" title="Client C API library (shared)" description="Installs shared client library" default="true" display="true" hasComponents="true" />
+              <Feature name="Embedded" title="Embedded server library" description="Installs embedded server library" default="false" display="true" hasComponents="true" />
+            </Feature>
+            <Feature name="DEBUGSYMBOLS" title="Debug Symbols" description="Installs Debug Symbols" default="true" display="true" hasComponents="true" />
+            <Feature name="MISC" title="MISC" description="MISC" default="true" display="0" hasComponents="0">
+              <Feature name="IniFiles" title="" description="" default="true" display="0" hasComponents="true" />
+              <Feature name="Server_Scripts" title="" description="" default="true" display="0" hasComponents="true" />
+            </Feature>
+            <Feature name="InstanceConfig" title="" description="" default="true" display="0" hasComponents="true" />
+            <Feature name="ProgramMenu" title="" description="" default="true" display="0" hasComponents="true" />
+            <Feature name="UserEditableDatafiles" title="" description="" default="true" display="0" hasComponents="true" />
+            <Feature name="RegKeys" title="" description="" default="true" display="0" hasComponents="true" />
+          </Package>
+        </Packages>
+      </Product>
     </ProductCategory>
-  
+
     <ProductCategory name="Application" title="Applications" description="Applications that work with MySQL">
-        <Product name="Workbench" title="MySQL Workbench" description="The MySQL GUI Developer tool" default="true" upgradeId="{84C668F4-A0C9-4585-A463-AADE0EFC9391}" urlBaseDir="MySQLGUITools">
-            <Packages>
-                <Package id="{38766225-85FA-469B-A373-82BF1923A7E4}" type="MSI" arch="X86" filename="mysql-workbench-gpl-5.2.29-win32.msi" thisVersion="5.2.29">
-                    <Feature name="MysqlWorkbenchCore" title="MySQL Workbench Core" description="Core components needed to run MySQL Workbench" size="0" default="true" display="true" hasComponents="true"/>
-                    <Feature name="UpdateWizard" title="Update Feature" description="Built in update feature that connects to MySQL.com" size="0" default="true" display="true" hasComponents="true"/>
-                </Package>
-            </Packages>
-        </Product>
+      <Product name="Workbench" title="MySQL Workbench" description="The MySQL GUI Developer tool" default="true" upgradeId="{84C668F4-A0C9-4585-A463-AADE0EFC9391}" urlBaseDir="MySQLGUITools">
+        <Packages>
+          <Package id="{38766225-85FA-469B-A373-82BF1923A7E4}" type="MSI" arch="X86" filename="mysql-workbench-gpl-5.2.29-win32.msi" thisVersion="5.2.29">
+            <Feature name="MysqlWorkbenchCore" title="MySQL Workbench Core" description="Core components needed to run MySQL Workbench" size="0" default="true" display="true" hasComponents="true"/>
+            <Feature name="UpdateWizard" title="Update Feature" description="Built in update feature that connects to MySQL.com" size="0" default="true" display="true" hasComponents="true"/>
+          </Package>
+        </Packages>
+      </Product>
     </ProductCategory>
-  
+
     <ProductCategory name="Connector" title="MySQL Connectors" description="Database drivers for programming languages">
-        <Product name="Connector-odbc" title="Connector/ODBC" description="MySQL Connector for ODBC" default="false" upgradeId="{FF073FBB-32E2-4052-B6B2-830C5ED4A809}" urlBaseDir="mysql-connector-odbc-5.1">
-            <Packages>
-                <Package id="{29042B1C-0713-4575-B7CA-5C8E7B0899D4}" type="MSI" arch="X86" filename="mysql-connector-odbc-5.1.6-win32.msi" thisVersion="5.1.6">
-                    <Feature name="ODBC_32" title="MySQL Connector/ODBC driver"  default="true" description="Installs the MySQL ODBC 5.1.6 32-bit driver." display="true" hasComponents="true"/>
-                    <Feature name="Help" title="MySQL Connector/ODBC 5.1.6 Documentation" default="true" description="Installs the MySQL ODBC driver help." display="true" hasComponents="true"/>
-                </Package>
-            </Packages>
-        </Product>
-    
-        <Product name="Connector-cpp" title="Connector/C++" description="MySQL Connector for C++" default="false" upgradeId="{FE990D78-8BB1-4880-930A-0430E707F3CA}" urlBaseDir="">
-            <Packages>
-                <Package id="{C13C9E31-F8D7-464D-A246-5A42AC0AB93E}" type="MSI" arch="X86" filename="mysql-connector-c++-1.0.5-win32.msi" thisVersion="1.0.5">
-                    <Feature name="ConnectorCPP" title="MySQL Connector C++" default="true" description="The MySQL Connector C++ client library." display="true" hasComponents="true"/>
-                    <Feature name="DebugLibraries" title="Debug Libary" default="false" description="Debug library and symbols." display="true" hasComponents="true"/>
-                </Package>
-            </Packages>
-        </Product>
-    
-        <Product name="Connector-C" title="Connector/C" description="MySQL Connector for C" default="false" upgradeId="" urlBaseDir="">
-            <Packages>
-                <Package id="{66F9302D-E145-4375-8C84-54DA2339C483}" type="MSI" arch="X86" filename="mysql-connector-c-6.0.2-win32.msi" thisVersion="6.0.2">
-                    <Feature name="ConnectorC" title="MySQL Connector C" default="true" description="The MySQL Connector C client library." display="true" hasComponents="true"/>
-                    <Feature name="DebugLibraries" title="Debug Libary" default="false" description="Debug library and symbols." display="true" hasComponents="true"/>
-                </Package>
-            </Packages>
-        </Product>
+      <Product name="Connector-odbc" title="Connector/ODBC" description="MySQL Connector for ODBC" default="false" upgradeId="{FF073FBB-32E2-4052-B6B2-830C5ED4A809}" urlBaseDir="mysql-connector-odbc-5.1">
+        <Packages>
+          <Package id="{29042B1C-0713-4575-B7CA-5C8E7B0899D4}" type="MSI" arch="X86" filename="mysql-connector-odbc-5.1.6-win32.msi" thisVersion="5.1.6">
+            <Feature name="ODBC_32" title="MySQL Connector/ODBC driver"  default="true" description="Installs the MySQL ODBC 5.1.6 32-bit driver." display="true" hasComponents="true"/>
+            <Feature name="Help" title="MySQL Connector/ODBC 5.1.6 Documentation" default="true" description="Installs the MySQL ODBC driver help." display="true" hasComponents="true"/>
+          </Package>
+        </Packages>
+      </Product>
+
+      <Product name="Connector-cpp" title="Connector/C++" description="MySQL Connector for C++" default="false" upgradeId="{FE990D78-8BB1-4880-930A-0430E707F3CA}" urlBaseDir="">
+        <Packages>
+          <Package id="{C13C9E31-F8D7-464D-A246-5A42AC0AB93E}" type="MSI" arch="X86" filename="mysql-connector-c++-1.0.5-win32.msi" thisVersion="1.0.5">
+            <Feature name="ConnectorCPP" title="MySQL Connector C++" default="true" description="The MySQL Connector C++ client library." display="true" hasComponents="true"/>
+            <Feature name="DebugLibraries" title="Debug Libary" default="false" description="Debug library and symbols." display="true" hasComponents="true"/>
+          </Package>
+        </Packages>
+      </Product>
+
+      <Product name="Connector-C" title="Connector/C" description="MySQL Connector for C" default="false" upgradeId="" urlBaseDir="">
+        <Packages>
+          <Package id="{66F9302D-E145-4375-8C84-54DA2339C483}" type="MSI" arch="X86" filename="mysql-connector-c-6.0.2-win32.msi" thisVersion="6.0.2">
+            <Feature name="ConnectorC" title="MySQL Connector C" default="true" description="The MySQL Connector C client library." display="true" hasComponents="true"/>
+            <Feature name="DebugLibraries" title="Debug Libary" default="false" description="Debug library and symbols." display="true" hasComponents="true"/>
+          </Package>
+        </Packages>
+      </Product>
     </ProductCategory>
-  
+
     <ProductCategory name="Documentation" title="Documentation" description="">
-        <Product name="Universal-Docs" title="MySQL Documentation" description="A collection of popular MySQL Documents" default="false" upgradeId="{D884632C-A8F2-46E6-9944-F784F5C6A10A}" urlBaseDir="http://wb.mysql.com/installer">
-            <Packages>
-                <Package id="{C2AF9668-BC9E-412F-B766-D8238A8517B0}" type="MSI" arch="X86" filename="mysql-universal-installer-document-bundle-1.0.0.0.msi" thisVersion="1.0.0">
-                    <Feature name="ConnCPPA4" title="MySQL Connector C++ User Guide A4" default="false" description="The MySQL Connector C++ User Guide in A4 format." display="true" hasComponents="true"/>
-                    <Feature name="ConnCPP" title="MySQL Connector C++ User Guide" default="true" description="The MySQL Connector C++ User Guide." display="true" hasComponents="true"/>
-                    <Feature name="ConnNETA4" title="MySQL Connector .NET User Guide A4" default="false" description="The MySQL Connector .NET User Guide in A4 fomat" display="true" hasComponents="true"/>
-                    <Feature name="ConnNET" title="MySQL Connector .NET User Guide" default="true" description="The MySQL Connector .NET User Guide." display="true" hasComponents="true"/>
-                    <Feature name="ConnODBCA4" title="MySQL Connector ODBC User Guide A4" default="false" description="The MySQL Connector ODBC User Guide in A4 format." display="true" hasComponents="true"/>
-                    <Feature name="ConnODBC" title="MySQL Connector ODBC User Guide" default="true" description="The MySQL Connector ODBC User Guide." display="true" hasComponents="true"/>
-                    <Feature name="ServerA4Feature" title="MySQL Server User Guide A4" default="false" description="The MySQL Server User Guide in A4 format." display="true" hasComponents="true"/>
-                    <Feature name="ServerFeature" title="MySQL Server User Guide" default="true" description="The MySQL Server User Guide." display="true" hasComponents="true"/>
-                    <Feature name="WBA4Feature" title="MySQL Workbench User Guide A4" default="false" description="MySQL Workbench User Guide in A4 format." display="true" hasComponents="true"/>
-                    <Feature name="WBFeature" title="MySQL Workbench User Guide" default="true" description="The MySQL Workbench User Guide." display="true" hasComponents="true"/>
-                </Package>
-            </Packages>
-        </Product>
+      <Product name="Universal-Docs" title="MySQL Documentation" description="A collection of popular MySQL Documents" default="false" upgradeId="{D884632C-A8F2-46E6-9944-F784F5C6A10A}" urlBaseDir="http://wb.mysql.com/installer">
+        <Packages>
+          <Package id="{C2AF9668-BC9E-412F-B766-D8238A8517B0}" type="MSI" arch="X86" filename="mysql-universal-installer-document-bundle-1.0.0.0.msi" thisVersion="1.0.0">
+            <Feature name="ConnCPPA4" title="MySQL Connector C++ User Guide A4" default="false" description="The MySQL Connector C++ User Guide in A4 format." display="true" hasComponents="true"/>
+            <Feature name="ConnCPP" title="MySQL Connector C++ User Guide" default="true" description="The MySQL Connector C++ User Guide." display="true" hasComponents="true"/>
+            <Feature name="ConnNETA4" title="MySQL Connector .NET User Guide A4" default="false" description="The MySQL Connector .NET User Guide in A4 fomat" display="true" hasComponents="true"/>
+            <Feature name="ConnNET" title="MySQL Connector .NET User Guide" default="true" description="The MySQL Connector .NET User Guide." display="true" hasComponents="true"/>
+            <Feature name="ConnODBCA4" title="MySQL Connector ODBC User Guide A4" default="false" description="The MySQL Connector ODBC User Guide in A4 format." display="true" hasComponents="true"/>
+            <Feature name="ConnODBC" title="MySQL Connector ODBC User Guide" default="true" description="The MySQL Connector ODBC User Guide." display="true" hasComponents="true"/>
+            <Feature name="ServerA4Feature" title="MySQL Server User Guide A4" default="false" description="The MySQL Server User Guide in A4 format." display="true" hasComponents="true"/>
+            <Feature name="ServerFeature" title="MySQL Server User Guide" default="true" description="The MySQL Server User Guide." display="true" hasComponents="true"/>
+            <Feature name="WBA4Feature" title="MySQL Workbench User Guide A4" default="false" description="MySQL Workbench User Guide in A4 format." display="true" hasComponents="true"/>
+            <Feature name="WBFeature" title="MySQL Workbench User Guide" default="true" description="The MySQL Workbench User Guide." display="true" hasComponents="true"/>
+          </Package>
+        </Packages>
+      </Product>
     </ProductCategory>
 
-</ProductCategories>
+  </ProductCategories>
+</ProductManifest>

=== modified file 'WexInstaller/Controls/FeatureTreeView.cs'
--- a/WexInstaller/Controls/FeatureTreeView.cs	2011-01-10 17:05:21 +0000
+++ b/WexInstaller/Controls/FeatureTreeView.cs	2011-01-17 17:05:19 +0000
@@ -34,16 +34,12 @@
             UpdateStyles();
         }
 
-        public void AddCategory(ProductCategory category)
+        public TreeNode AddCategory(ProductCategory category)
         {
             TreeNode node = Nodes.Add(category.Title);
             node.ToolTipText = category.Description;
             node.Tag = category;
-
-            foreach (Product p in category.Products)
-            {
-                AddProduct(p, node);
-            }
+            return node;
         }
 
         public void AddProduct(Product product, TreeNode parentNode)

=== modified file 'WexInstaller/Core/Product.cs'
--- a/WexInstaller/Core/Product.cs	2011-01-10 17:05:21 +0000
+++ b/WexInstaller/Core/Product.cs	2011-01-17 17:05:19 +0000
@@ -97,8 +97,8 @@
             proposedInstalled = shouldInstall;
         }
 
-        [XmlAttribute("default")]
-        public bool IncludeInDefault { get; set; }
+        //[XmlAttribute("default")]
+        //public bool IncludeInDefault { get; set; }
 
         [XmlAttribute("upgradeId")]
         public string UpgradeId { get; set; }

=== added file 'WexInstaller/Core/ProductCatalog.cs'
--- a/WexInstaller/Core/ProductCatalog.cs	1970-01-01 00:00:00 +0000
+++ b/WexInstaller/Core/ProductCatalog.cs	2011-01-17 17:05:19 +0000
@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml.Serialization;
+using System.Runtime.Serialization;
+
+namespace WexInstaller.Core
+{
+    public class ProductCatalog
+    {
+        [XmlAttribute("id")]
+        public string Id;
+        [XmlAttribute("name")]
+        public string Name;
+        [XmlAttribute("description")]
+        public string Description;
+        [XmlAttribute("commercial")]
+        public bool Commercial;
+        [XmlAttribute("default")]
+        public bool Default;
+        [XmlArray("SetupTypes")]
+        public List<SetupType> SetupTypes;
+        [XmlArray("CatalogProducts")]
+        public List<CatalogProduct> Products;
+    }
+
+    public class CatalogProduct
+    {
+        [XmlIgnore]
+        public Product ReferencedProduct;
+
+        [XmlAttribute("productId")]
+        public string ProductId;
+
+        [XmlAttribute("setupTypeFlags")]
+        public int SetupTypeFlag;
+    }
+
+    public enum SetupTypeFlag : int
+    {
+        Full=64,
+        Custom=128
+    }
+
+    public class SetupType
+    {
+        [XmlAttribute("flag")]
+        public int Flag;
+        [XmlAttribute("name")]
+        public string Name;
+        [XmlAttribute("description")]
+        public string Description;
+
+        public bool IsFull
+        {
+            get { return Flag == (int)SetupTypeFlag.Full; }
+        }
+
+        public bool IsCustom
+        {
+            get { return Flag == (int)SetupTypeFlag.Custom; }
+        }
+
+        public bool Includes(CatalogProduct product)
+        {
+            return IsFull || ((product.SetupTypeFlag & Flag) != 0);
+        }
+    }
+}

=== modified file 'WexInstaller/Core/ProductCategory.cs'
--- a/WexInstaller/Core/ProductCategory.cs	2010-11-12 19:56:12 +0000
+++ b/WexInstaller/Core/ProductCategory.cs	2011-01-17 17:05:19 +0000
@@ -13,18 +13,6 @@
         [XmlElement("Product")]
         public List<Product> Products { get; set; }
 
-        public void SetInstallType(SetupType setupType)
-        {
-            bool shouldInstall = setupType == SetupType.Full ||
-                (setupType == SetupType.ServerOnly && Type == ProductCategoryType.Server);
-
-            foreach (Product p in Products)
-            {
-                p.ProposedInstalled = shouldInstall ||
-                    (setupType == SetupType.DeveloperDefault && p.IncludeInDefault);
-            }
-        }
-
         public long GetInstallationSizeEstimate()
         {
             long sizeEst = 0;

=== modified file 'WexInstaller/Core/ProductManager.cs'
--- a/WexInstaller/Core/ProductManager.cs	2010-11-22 18:28:54 +0000
+++ b/WexInstaller/Core/ProductManager.cs	2011-01-17 17:05:19 +0000
@@ -18,71 +18,77 @@
 
     public static class ProductManager
     {
-        private static List<ProductCategory> categories = new List<ProductCategory>();
+        private static ProductManifest manifest;
 
         public static ReadOnlyCollection<ProductCategory> ProductCategories
         {
-            get { return categories.AsReadOnly(); }
+            get { return manifest.ProductCategories.AsReadOnly(); }
+        }
+
+        public static ReadOnlyCollection<ProductCatalog> Catalogs
+        {
+            get { return manifest.ProductCatalogs.AsReadOnly(); }
         }
 
         public static bool ProductsInstalled { get; private set; }
-
         public static bool ProductsUpgrade { get; private set; }
-
-        private static ProductCategory[] ObjectifyManifest(string fileName)
-        {
-            ProductCategory[] fromFile = null;
-
-            if (File.Exists(fileName))
-            {
-                XmlRootAttribute productCategories = new XmlRootAttribute("ProductCategories");
-                XmlSerializer s = new XmlSerializer(typeof(ProductCategory[]), productCategories);
-                TextReader w = new StreamReader(fileName);
-                fromFile = (ProductCategory[])s.Deserialize(w);
-                w.Close();
-            }
-
-            return fromFile;
-        }
+        public static ProductCatalog ActiveCatalog { get; set; }
 
         public static void Load()
         {
             Logger.LogTrace("ProductManager.Load()");
 
-            ProductCategory[] productArray = ObjectifyManifest(InstallerConfiguration.ProductsManifest);
-
-            if (productArray != null)
+            manifest = null;
+            if (File.Exists(InstallerConfiguration.ProductsManifest))
             {
-                lock (categories)
-                {
-                    categories.Clear();
-                    foreach (ProductCategory pc in productArray)
-                    {
-                        categories.Add(pc);
-                        foreach (Product p in pc.Products)
-                        {
-                            p.PostInitialize(true);
-                        }
-                    }
-                }
+                XmlRootAttribute productCategories = new XmlRootAttribute("ProductManifest");
+                XmlSerializer s = new XmlSerializer(typeof(ProductManifest));
+                TextReader w = new StreamReader(InstallerConfiguration.ProductsManifest);
+                manifest = (ProductManifest)s.Deserialize(w);
+                w.Close();
             }
 
-            foreach (ProductCategory cat in categories)
+            //TODO: fix this to handle it better
+            if (manifest == null || manifest.ProductCategories == null || manifest.ProductCatalogs == null)
+                throw new InvalidOperationException("Manifest failed to load properly");
+
+            foreach (ProductCategory pc in manifest.ProductCategories)
             {
-                cat.Type = (ProductCategoryType)Enum.Parse(typeof(ProductCategoryType), cat.Name);
-                foreach (Product p in cat.Products)
+                pc.Type = (ProductCategoryType)Enum.Parse(typeof(ProductCategoryType), pc.Name);
+                foreach (Product p in pc.Products)
                 {
+                    p.PostInitialize(true);
                     ProductsInstalled |= p.Installed;
                     ProductsUpgrade |= p.IsUpgrade;
-                    p.SetParent(cat);
+                    p.SetParent(pc);
                 }
             }
+
+            foreach (ProductCatalog catalog in manifest.ProductCatalogs)
+                foreach (CatalogProduct p in catalog.Products)
+                {
+                    p.ReferencedProduct = GetProductById(p.ProductId);
+                    if (p.ReferencedProduct == null)
+                        //TODO: handle this better
+                        throw new InvalidOperationException(); 
+                }
+
+            //TODO: replace this with catalog selection from command line
+            ActiveCatalog = manifest.ProductCatalogs[0];
         }
 
         public static event DownloadManifestProgressHandler DownloadManifestProgressChanged;
 
         public static event DownloadManifestCompleteHandler DownloadManifestCompleted;
 
+        public static Product GetProductById(string id)
+        {
+            foreach (ProductCategory cat in manifest.ProductCategories)
+                foreach (Product p in cat.Products)
+                    if (String.Compare(id, p.Name, true) == 0) return p;
+            return null;
+        }
+
         public static void CancelDownload()
         {
             Logger.LogTrace("ProductManager.CancelDownload().");

=== added file 'WexInstaller/Core/ProductManifest.cs'
--- a/WexInstaller/Core/ProductManifest.cs	1970-01-01 00:00:00 +0000
+++ b/WexInstaller/Core/ProductManifest.cs	2011-01-17 17:05:19 +0000
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml.Serialization;
+using System.IO;
+
+namespace WexInstaller.Core
+{
+    public sealed class ProductManifest
+    {
+        [XmlArray()]
+        public List<ProductCatalog> ProductCatalogs { get; set; }
+        [XmlArray]
+        public List<ProductCategory> ProductCategories { get; set; }
+    }
+}

=== modified file 'WexInstaller/InstallWizard/Features.Designer.cs'
--- a/WexInstaller/InstallWizard/Features.Designer.cs	2011-01-10 17:05:21 +0000
+++ b/WexInstaller/InstallWizard/Features.Designer.cs	2011-01-17 17:05:19 +0000
@@ -31,21 +31,18 @@
         {
             this.components = new System.ComponentModel.Container();
             System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FeatureSelection));
-            this.stateImages = new System.Windows.Forms.ImageList(this.components);
             this.label3 = new System.Windows.Forms.Label();
             this.driveSpace = new WexInstaller.Controls.DriveSpaceControl();
             this.imageList1 = new System.Windows.Forms.ImageList(this.components);
             this.featureBox = new WexInstaller.Controls.FeatureBox();
             this.featureTree = new WexInstaller.Controls.FeatureTreeView();
+            this.catalogList = new System.Windows.Forms.ComboBox();
+            this.pictureBox2 = new System.Windows.Forms.PictureBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.catalogImageList = new System.Windows.Forms.ImageList(this.components);
+            ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
             this.SuspendLayout();
             // 
-            // stateImages
-            // 
-            this.stateImages.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("stateImages.ImageStream")));
-            this.stateImages.TransparentColor = System.Drawing.Color.Transparent;
-            this.stateImages.Images.SetKeyName(0, "Add.ico");
-            this.stateImages.Images.SetKeyName(1, "Remove.ico");
-            // 
             // label3
             // 
             this.label3.AutoSize = true;
@@ -84,10 +81,10 @@
             this.featureBox.BackColor = System.Drawing.SystemColors.Window;
             this.featureBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
             this.featureBox.Font = new System.Drawing.Font("Tahoma", 8.25F);
-            this.featureBox.Location = new System.Drawing.Point(302, 121);
+            this.featureBox.Location = new System.Drawing.Point(302, 157);
             this.featureBox.Name = "featureBox";
             this.featureBox.SelectedObject = null;
-            this.featureBox.Size = new System.Drawing.Size(244, 292);
+            this.featureBox.Size = new System.Drawing.Size(244, 256);
             this.featureBox.TabIndex = 11;
             // 
             // featureTree
@@ -103,22 +100,70 @@
             this.featureTree.ImageIndex = 0;
             this.featureTree.ImageList = this.imageList1;
             this.featureTree.ItemHeight = 40;
-            this.featureTree.Location = new System.Drawing.Point(15, 121);
+            this.featureTree.Location = new System.Drawing.Point(15, 157);
             this.featureTree.Name = "featureTree";
             this.featureTree.SelectedImageIndex = 0;
             this.featureTree.ShowLines = false;
             this.featureTree.ShowPlusMinus = false;
             this.featureTree.ShowRootLines = false;
-            this.featureTree.Size = new System.Drawing.Size(279, 292);
+            this.featureTree.Size = new System.Drawing.Size(279, 256);
             this.featureTree.TabIndex = 12;
             this.featureTree.BeforeCheck += new System.Windows.Forms.TreeViewCancelEventHandler(this.featureTree_BeforeCheck);
             this.featureTree.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.featureTree_NodeMouseClick);
             // 
+            // catalogList
+            // 
+            this.catalogList.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.catalogList.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
+            this.catalogList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.catalogList.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.catalogList.FormattingEnabled = true;
+            this.catalogList.ItemHeight = 20;
+            this.catalogList.Location = new System.Drawing.Point(53, 125);
+            this.catalogList.Name = "catalogList";
+            this.catalogList.Size = new System.Drawing.Size(493, 26);
+            this.catalogList.TabIndex = 13;
+            this.catalogList.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.catalogList_DrawItem);
+            this.catalogList.SelectedIndexChanged += new System.EventHandler(this.catalogList_SelectedIndexChanged);
+            // 
+            // pictureBox2
+            // 
+            this.pictureBox2.Image = global::WexInstaller.Properties.Resources.wex_product_catalog;
+            this.pictureBox2.Location = new System.Drawing.Point(15, 111);
+            this.pictureBox2.Name = "pictureBox2";
+            this.pictureBox2.Size = new System.Drawing.Size(32, 45);
+            this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
+            this.pictureBox2.TabIndex = 14;
+            this.pictureBox2.TabStop = false;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label1.Location = new System.Drawing.Point(53, 108);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(98, 14);
+            this.label1.TabIndex = 15;
+            this.label1.Text = "Product Catalog:";
+            // 
+            // catalogImageList
+            // 
+            this.catalogImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("catalogImageList.ImageStream")));
+            this.catalogImageList.TransparentColor = System.Drawing.Color.Transparent;
+            this.catalogImageList.Images.SetKeyName(0, "MySQLInstallerProductCatalog_Download.png");
+            this.catalogImageList.Images.SetKeyName(1, "MySQLInstallerProductCatalog_DownloadCom.png");
+            this.catalogImageList.Images.SetKeyName(2, "MySQLInstallerProductCatalog_InPackage.png");
+            this.catalogImageList.Images.SetKeyName(3, "MySQLInstallerProductCatalog_OnDisk.png");
+            // 
             // FeatureSelection
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
             this.BackColor = System.Drawing.SystemColors.Window;
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.pictureBox2);
+            this.Controls.Add(this.catalogList);
             this.Controls.Add(this.featureTree);
             this.Controls.Add(this.featureBox);
             this.Controls.Add(this.driveSpace);
@@ -131,6 +176,10 @@
             this.Controls.SetChildIndex(this.driveSpace, 0);
             this.Controls.SetChildIndex(this.featureBox, 0);
             this.Controls.SetChildIndex(this.featureTree, 0);
+            this.Controls.SetChildIndex(this.catalogList, 0);
+            this.Controls.SetChildIndex(this.pictureBox2, 0);
+            this.Controls.SetChildIndex(this.label1, 0);
+            ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();
             this.ResumeLayout(false);
             this.PerformLayout();
 
@@ -139,10 +188,13 @@
         #endregion
 
         private System.Windows.Forms.Label label3;
-        private System.Windows.Forms.ImageList stateImages;
         private DriveSpaceControl driveSpace;
         private System.Windows.Forms.ImageList imageList1;
         private FeatureBox featureBox;
         private FeatureTreeView featureTree;
+        private System.Windows.Forms.ComboBox catalogList;
+        private System.Windows.Forms.PictureBox pictureBox2;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.ImageList catalogImageList;
     }
 }

=== modified file 'WexInstaller/InstallWizard/Features.cs'
--- a/WexInstaller/InstallWizard/Features.cs	2010-11-30 14:52:06 +0000
+++ b/WexInstaller/InstallWizard/Features.cs	2011-01-17 17:05:19 +0000
@@ -9,6 +9,7 @@
 using WexInstaller.Properties;
 using WexInstaller.Core;
 using WexInstaller.Controls;
+using System.Windows.Forms.VisualStyles;
 namespace WexInstaller
 {
     public partial class FeatureSelection : InstallerPanel
@@ -22,24 +23,16 @@
 
         public override void Activate()
         {
-            
-            featureTree.Nodes.Clear();
-            foreach (ProductCategory pc in ProductManager.ProductCategories)
+            // load our catalog dropdown
+            catalogList.Items.Clear();
+            foreach (ProductCatalog catalog in ProductManager.Catalogs)
             {
-                if (pc.Products.Count == 1)
-                {
-                    Product p = pc.Products[0];
-                    featureTree.AddProduct(p, null);
-                }
-                else
-                {
-                    featureTree.AddCategory(pc);
-                }
+                catalogList.Items.Add(new CatalogState(catalog));
             }
+            catalogList.Items.Add(new CatalogState(Resources.AllMySQLProducts, true));
+            catalogList.Items.Add(new CatalogState(Resources.InstalledMySQLProducts, false));
+            catalogList.SelectedIndex = 0;
 
-            featureTree.SelectedNode = featureTree.Nodes[0];
-            featureBox.SelectedObject = featureTree.SelectedNode.Tag as ProductElement;
-            driveSpace.Calculate();
             NextButton.Text = Properties.Resources.NextButtonDefaultText;
             base.Activate();
         }
@@ -58,5 +51,145 @@
             }
         }
 
+        private void catalogList_DrawItem(object sender, DrawItemEventArgs e)
+        {
+            if (e.Index < 0) return;
+
+            CatalogState state = catalogList.Items[e.Index] as CatalogState;
+
+            // Draw the background of the item.
+            e.Graphics.FillRectangle(Brushes.White, e.Bounds);
+
+            Rectangle r = e.Bounds;
+            r.X += 2;
+
+            catalogImageList.Draw(e.Graphics, r.X, r.Y, state.DownloadState);
+            r.X += catalogImageList.ImageSize.Width + 5;
+
+            e.Graphics.DrawString(state.Text, Font, Brushes.Black, r);
+            SizeF textSize = e.Graphics.MeasureString(state.Text, Font);
+            r.X += textSize.ToSize().Width + 5;
+            e.Graphics.DrawString(state.SubText, Font, state.NeedsDownload ? Brushes.LightGreen : Brushes.LightGray, r);
+
+            // Draw the focus rectangle if the mouse hovers over an item.
+            e.DrawFocusRectangle();
+        }
+
+        private void catalogList_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            // first we need to clear our feature tree
+            featureTree.Nodes.Clear();
+
+            ProductCatalog catalog = null;
+            bool installedItems = catalogList.SelectedIndex == (catalogList.Items.Count-1);
+            bool allProducts = catalogList.SelectedIndex == (catalogList.Items.Count-2);
+            if (!installedItems && !allProducts)
+                catalog = ProductManager.Catalogs[catalogList.SelectedIndex];
+
+            foreach (ProductCategory pc in ProductManager.ProductCategories)
+            {
+                List<Product> products = new List<Product>();
+
+                foreach (Product p in pc.Products)
+                {
+                    if (allProducts)
+                        products.Add(p);
+                    else if (installedItems)
+                    {
+                        if (p.Installed) products.Add(p);
+                    }
+                    else
+                    {
+                        foreach (CatalogProduct cp in catalog.Products)
+                            if (String.Compare(cp.ProductId, p.Name, true) == 0)
+                                products.Add(p);
+                    }
+                }
+                if (products.Count == 1)
+                    featureTree.AddProduct(products[0], null);
+                else if (products.Count > 1)
+                {
+                    TreeNode node = featureTree.AddCategory(pc);
+                    foreach (Product p in products)
+                        featureTree.AddProduct(p, node);
+                }
+            }
+
+            if (featureTree.Nodes.Count > 0)
+            {
+                featureTree.SelectedNode = featureTree.Nodes[0];
+                featureBox.SelectedObject = featureTree.SelectedNode.Tag as ProductElement;
+            }
+            else
+                featureBox.SelectedObject = null;
+            driveSpace.Calculate();
+        }
+    }
+
+    // This class represents a line in the catalog drop down.  The state item indicates the download
+    // state of the products
+    class CatalogState
+    {
+        public const int ProductsDownload = 0;
+        public const int ProductsDownloadCommercial = 1;
+        public const int ProductsInCache = 2;
+        public const int InstalledProducts = 3;
+
+        public int DownloadState;
+        public string Text;
+
+        public CatalogState(ProductCatalog catalog)
+        {
+            Text = catalog.Description;
+            DownloadState = ProductsInCache;
+            DownloadState = GetCatalogDownloadState(catalog);
+        }
+
+        public CatalogState(string text, bool isAllProducts)
+        {
+            Text = text;
+            DownloadState = ProductsInCache;
+            DownloadState = isAllProducts ? GetAllDownloadState() : InstalledProducts;
+        }
+
+        public bool NeedsDownload
+        {
+            get { return DownloadState == ProductsDownload || DownloadState == ProductsDownloadCommercial; }
+        }
+
+        public string SubText
+        {
+            get
+            {
+                if (DownloadState == ProductsInCache) return Resources.PackagesAvailable;
+                if (DownloadState == InstalledProducts) return Resources.PackagesAlreadyInstalled;
+                if (DownloadState == ProductsDownloadCommercial) return Resources.PackagesAvailableForCommercialDownload;
+                return Resources.PackagesAvailableForDownload;
+            }
+        }
+
+        public int GetCatalogDownloadState(ProductCatalog catalog)
+        {
+            int index = ProductsInCache;
+            foreach (CatalogProduct cp in catalog.Products)
+                if (!cp.ReferencedProduct.FoundLocal)
+                {
+                    index = ProductsDownload;
+                    break;
+                }
+            if (catalog.Commercial && index == ProductsDownload)
+                index = ProductsDownloadCommercial;
+            return index;
+        }
+
+        public int GetAllDownloadState()
+        {
+            int index = ProductsInCache;
+            foreach (ProductCategory cat in ProductManager.ProductCategories)
+                foreach (Product p in cat.Products)
+                    if (!p.FoundLocal)
+                        index = ProductsDownload;
+            return index;
+        }
     }
 }

=== modified file 'WexInstaller/InstallWizard/Features.resx'
--- a/WexInstaller/InstallWizard/Features.resx	2010-08-11 15:20:48 +0000
+++ b/WexInstaller/InstallWizard/Features.resx	2011-01-17 17:05:19 +0000
@@ -117,56 +117,15 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <metadata name="stateImages.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-  <data name="stateImages.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
-        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
-        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAe
-        BwAAAk1TRnQBSQFMAgEBAgEAAdgBAAHYAQABEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
-        AwABEAMAAQEBAAEYBgABDCEAARoBdQEcARoBdQEcAQsBbwEPAQsBbwENAQgBawELAQgBawELrgABGgF1
-        ARwBbgHQAYQBIQG+AUwBIQG+AUoBHAGoATkBCAFrAQuuAAEaAXUBHAFuAdEBhAEhAcABTwEhAcABTQEc
-        AaoBOwEIAWsBC64AARoBdQEcAW4B0gGHAR4BwgFSASEBwgFQARwBrQE+AQgBawELrgABGgF1ARwBbwHV
-        AYwBIQHDAVMBHgHDAVMBHAGvAT8BCAFrAQsPAAJKAcoBPAFAAdsBOAE6AdYBOAE7AdYBOAE6AdYBOAE7
-        AdYBOAE6AdUBOAE5AdQBNwE4AdMBNwE4AdIBNgE4AdECNwHRAjYBzwE4ATYBzgE2ATQBzwFHAUYBxmAA
-        ASABgwEpARoBdQEcARoBdQEcARoBdQEcARoBdQEcAQgBawELAVwBywF8AR8BxgFaAR8BxgFYARsBrgFC
-        AQgBawELAQgBawELAQgBawELAQgBawELAQgBawELAQgBawELARgBIAHUASwBSgHyARkBMAHuARwBMQHu
-        ARcBLQHuARYBKQHuARMBKAHtARIBIwHtARABHwHtAQ8BGwHsAQ0BFgHsAQwBEgHsAQsBDgHrAQoBCwHq
-        AQoBBwHsAQMBAQHNYAABJwGNATQBGwG0AU0BGwG0AU0BGwG0AU0BGwG0AU0BGwG0AU0BXAHLAXwBHwHJ
-        AV0BHwHIAVsBGwGuAUIBGwGuAUIBGwG0AU0BGwG0AU0BGwG0AU0BGwG0AU0BEAGAARwBWgFiAfIBRgF0
-        Af8BIQFIAf8BKgFQAf8BKQFLAf8BJgFGAf8BIwFBAf8BIAE9Af8BHQE4Af8BGwE1Af8BGAEtAf8BFgEo
-        Af8BFAEhAf8BEgEcAf8BEQEYAf8BHgEcAetgAAEoAZMBOAEYAdQBcQEcAdUBcwEcAdMBbgEeAdEBbQEe
-        AdABaQEeAdABaAEfAc0BZQEfAc0BYgEfAckBXgEfAckBXQEfAcgBWwEfAcYBVwEfAcUBVwEhAcUBVQES
-        AYcBIAF8AX4B9QGBAaAB/wFGAWgB/wEyAVYB/wEmAUkB/wEkAUUB/wEhAUAB/wEdATsB/wEaATYB/wEX
-        ATIB/wEUAS4B/wESASoB/wEPASUB/wENAR0B/wEOAR4B/wEWARcB8WAAASkBlgE7ARcB2AF1ARwB2AF2
-        ARwB1QFzARwB1QFxAR4B0wFtAR4B0QFrAR4B0AFoAR4BzgFmAR8BzQFjAR8BywFgAR8ByQFdAR8ByAFd
-        AR8BxgFaAR8BxgFYARIBiwEjAXYBeQH7AY4BsAH/AXQBkwH/AXUBlAH/AWkBiQH/AVUBeAH/AUcBawH/
-        AT8BYAH/ATIBUgH/AS4BTQH/ASsBSQH/ASkBRAH/ASUBQQH/ASIBOgH/ASIBPAH/ASkBMAH7YAABKwGe
-        AUEBTAHvAaMBTgHwAaIBTwHuAZ4BTwHtAZwBUwHoAZoBGAHVAXABHAHTAXABHgHTAW4BHQHPAWgBHAHM
-        AWEBUgHjAY0BUgHiAYsBUgHgAYgBUgHdAYYBHgGYATIBcQF2Af8BpgHEAf8BkQGsAf8BlAGxAf8BlgGv
-        Af8BlQGwAf8BlAGwAf8BkwGwAf8BkwGsAf8BkAGqAf8BjgGmAf8BjAGkAf8BigGfAf8BhgGcAf8BiAGm
-        Af8BYQFoAf9gAAEkAZ4BPAEkAZ4BPAEkAZ4BPAEkAZ4BPAEkAZ4BPAEkAZ4BPAFuAeUBoAEcAdYBcwEc
-        AdUBcQEZAcMBXgESAYwBIwESAYwBIwESAYwBIwESAYwBIwESAYwBIwESAYwBIwF/AXsB+QGIAYoB+wGE
-        AYMB+wGEAYMB+wGEAYMB+wGEAYMB+wGEAYMB+wKDAfsBgwGCAfsBgwGCAfsCggH7AYIBgwH7AYMBgAH7
-        AYIBgAH7AoUB+wF+AXoB+W8AAR4BmAEyAW0B6gGmARsB2wF8ARsB2wF7ARsByAFkAR4BmAEyrgABHgGY
-        ATIBcAHsAaYBGQHeAYEBGQHcAX4BGwHLAWgBHgGYATKuAAEeAZgBMgFvAe4BqgEZAeABhAEZAeABhAEZ
-        AdIBcwEeAZgBMq4AAR4BmAEyAW4B8AGqARIB3gF/ARIB3gF/ARQB0wFwAR4BmAEyrgABJAGeATwBLAG7
-        AVMBMQHBAVcBMQHBAVcBLAG7AVMBJAGeATyfAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEBAQABAQUA
-        AYAXAAP/AQAB+AEfAv8EAAH4AR8C/wQAAfgBHwL/BAAB+AEfAv8EAAH4AR82AAH4AR8C/wQAAfgBHwL/
-        BAAB+AEfAv8EAAH4AR8C/wQAAfgBHwL/BAAL
-</value>
-  </data>
   <metadata name="imageList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>134, 17</value>
+    <value>15, 16</value>
   </metadata>
   <data name="imageList1.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
     <value>
         AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABQ
-        DwAAAk1TRnQBSQFMAgEBBAEAAYABAAGAAQABGAEAARgBAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        DwAAAk1TRnQBSQFMAgEBBAEAAbgBAAG4AQABGAEAARgBAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
         AwABYAMAATADAAEBAQABCAYAARIYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
         AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
         AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
@@ -234,6 +193,64 @@
         AwABAQEAAQEFAAFAAQIWAAP//wD/AEMACw==
 </value>
   </data>
+  <metadata name="catalogImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>111, 18</value>
+  </metadata>
+  <data name="catalogImageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAE
+        CwAAAk1TRnQBSQFMAgEBBAEAATABAAEwAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
+        AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
+        AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
+        AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
+        AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
+        AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
+        ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
+        AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
+        AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
+        AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
+        AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
+        AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
+        AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
+        AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
+        AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
+        ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
+        Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
+        AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
+        AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
+        AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
+        ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
+        Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
+        AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
+        AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
+        AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
+        AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
+        AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
+        AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD//8A/wD/AP8ATAAC/w4A
+        Av8MAAH/AfIBvAHxAfQB/xwAAfIB9AH/DQAB8gH0Af8KAAH/AbwDSwFuARwB8wH/GQAB8QGYAQgB/wwA
+        AfEBmAEIAf8JAAH/AbwBSwEkBUsB7wH0Af8HAAT/CgAB/wHyAZgBwgIIAv8IAAH/AfIBmAHCAggB9AL2
+        Af8EAAH/Ae8DJAdLAfQDAAL/AfQB8gG8Ae8BkgH3AfAC/wcAAfMBmAKeAp8BCAH0Af8HAAHzAZgCngGf
+        AZgDeQEaAf8DAAH0AUsCIwEkAksBTAJLAUUBSwH0AgAB/wHyAfACBwK8AZgB7wGSAQcB8gYAAfMCmAN9
+        AZ4CCAH/BgAB8wKYAn0BeAF5AV4DWQEaAf8CAAHzA0sBJAFLAUwCdAFSAUwBSwHzAgAB8wIHBrwB9wHt
+        AfcB8AH0AwAB/wHzAfABeAGXAVYBlwF9AZgB8wH0BQAB9AEcAbwBUAJWAVcDWQF6AZkBeQH0AgAB8wR0
+        AVIHdAHzAQAB8wEHAu8BvAHwAfIB8wLxAe8B7QH3AQcB/wQAAfQBmAGXAlYBeAGYAf8FAAH/AZkB5QF5
+        BFkBegFZAV4BmQH0AXkB9AH/AfQBmQN0AVgBNwNSBHQB9AEAAfQB8AHxA/MB9AHxAbwB8AHxAQcB9wHv
+        AfQEAAH0AZgBlwFVAVYBeAGYAf8FAAH/ARoBmQF5BFgBegHlAV4BWQF5AZkB/wH0AZMDdAFYBTcCUgF0
+        ARoB/wEAAf8B9AHyAvED9AHzAvEB9AHwAQcB9AQAAfQBmAFWAlUBeAGYAf8GAAH/AfYB8wF4AVYBVQFW
+        AXgB5QJeAVkB8wL/ARsBmQFSAzcBWAU3AVgBGgH/AwAB/wH0AfMB8AHxAvMB8QHwAbwB8QHzAf8EAAH0
+        AZgBlwFVAVYBeAGYAf8IAAH0AZgBlwFVAVYBeAFyApkB9AMAAf8BGgM3A1gBWQFYATcBOAFZAZoB9AcA
+        AfQC8QHzAfQB/wcAAfQCmAKXApgB/wgAAfQCmAKXApgB/wUAAfYBmgVZAlgEWQGaARoUAAH/AfEE8AHx
+        Af8IAAH/AfEE8AHxAf8FAAH/ARoBmgJ6BFkDegGaARsB9DEAA/8B9AEbAZoFegEaAv84AAH0AhoB9AL/
+        EwABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/4EACP8B/gF/Af4BfwH4AR8C/wH+
+        AT8B/gE/AfABBwL/AfwBPwH8AT8B4AEBAfwBPwHwAQ8B8AEDAcABAQHAAQcB8AEHAfABAQHAAQEBgAEH
+        AeABBwHgAQABwAEBAYABAQHAAQcBwAEAAcABAAGAAQAB8AEPAYADAAGAAQAB8AEPAYADAAGAAQAB8AEP
+        AcADAAHgAQAB8AEPAfABAwGAAQAB/gEHAfABDwHwAQ8BgAEAAv8B8AEPAfABDwGAAQAG/wGAAQEG/wH+
+        AQcC/ws=
+</value>
+  </data>
   <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>62</value>
   </metadata>

=== modified file 'WexInstaller/InstallWizard/InstallType.Designer.cs'
--- a/WexInstaller/InstallWizard/InstallType.Designer.cs	2010-11-30 20:23:23 +0000
+++ b/WexInstaller/InstallWizard/InstallType.Designer.cs	2011-01-17 17:05:19 +0000
@@ -28,10 +28,6 @@
         /// </summary>
         private void InitializeComponent()
         {
-            this.defaultType = new System.Windows.Forms.RadioButton();
-            this.serverOnlyType = new System.Windows.Forms.RadioButton();
-            this.fullType = new System.Windows.Forms.RadioButton();
-            this.customType = new System.Windows.Forms.RadioButton();
             this.setupTypeDescription = new System.Windows.Forms.TextBox();
             this.installPathLabel = new System.Windows.Forms.Label();
             this.installPath = new System.Windows.Forms.TextBox();
@@ -43,68 +39,11 @@
             this.setupTypeDescriptionLabel = new System.Windows.Forms.Label();
             this.label1 = new System.Windows.Forms.Label();
             this.actionLabel = new System.Windows.Forms.Label();
+            this.setupTypePanel = new System.Windows.Forms.FlowLayoutPanel();
             ((System.ComponentModel.ISupportInitialize)(this.warningSign)).BeginInit();
             ((System.ComponentModel.ISupportInitialize)(this.abort)).BeginInit();
             this.SuspendLayout();
             // 
-            // defaultType
-            // 
-            this.defaultType.AutoSize = true;
-            this.defaultType.Checked = true;
-            this.defaultType.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold);
-            this.defaultType.Location = new System.Drawing.Point(12, 132);
-            this.defaultType.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
-            this.defaultType.Name = "defaultType";
-            this.defaultType.Size = new System.Drawing.Size(127, 17);
-            this.defaultType.TabIndex = 1;
-            this.defaultType.TabStop = true;
-            this.defaultType.Tag = "0";
-            this.defaultType.Text = "&Developer Default";
-            this.defaultType.UseVisualStyleBackColor = true;
-            this.defaultType.CheckedChanged += new System.EventHandler(this.setupType_CheckedChanged);
-            // 
-            // serverOnlyType
-            // 
-            this.serverOnlyType.AutoSize = true;
-            this.serverOnlyType.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold);
-            this.serverOnlyType.Location = new System.Drawing.Point(12, 158);
-            this.serverOnlyType.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
-            this.serverOnlyType.Name = "serverOnlyType";
-            this.serverOnlyType.Size = new System.Drawing.Size(91, 17);
-            this.serverOnlyType.TabIndex = 2;
-            this.serverOnlyType.Tag = "1";
-            this.serverOnlyType.Text = "&Server Only";
-            this.serverOnlyType.UseVisualStyleBackColor = true;
-            this.serverOnlyType.CheckedChanged += new System.EventHandler(this.setupType_CheckedChanged);
-            // 
-            // fullType
-            // 
-            this.fullType.AutoSize = true;
-            this.fullType.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold);
-            this.fullType.Location = new System.Drawing.Point(12, 184);
-            this.fullType.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
-            this.fullType.Name = "fullType";
-            this.fullType.Size = new System.Drawing.Size(44, 17);
-            this.fullType.TabIndex = 3;
-            this.fullType.Tag = "2";
-            this.fullType.Text = "&Full";
-            this.fullType.UseVisualStyleBackColor = true;
-            this.fullType.CheckedChanged += new System.EventHandler(this.setupType_CheckedChanged);
-            // 
-            // customType
-            // 
-            this.customType.AutoSize = true;
-            this.customType.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold);
-            this.customType.Location = new System.Drawing.Point(12, 210);
-            this.customType.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
-            this.customType.Name = "customType";
-            this.customType.Size = new System.Drawing.Size(68, 17);
-            this.customType.TabIndex = 4;
-            this.customType.Tag = "3";
-            this.customType.Text = "C&ustom";
-            this.customType.UseVisualStyleBackColor = true;
-            this.customType.CheckedChanged += new System.EventHandler(this.setupType_CheckedChanged);
-            // 
             // setupTypeDescription
             // 
             this.setupTypeDescription.BackColor = System.Drawing.Color.White;
@@ -121,7 +60,7 @@
             // installPathLabel
             // 
             this.installPathLabel.Font = new System.Drawing.Font("Tahoma", 8.25F);
-            this.installPathLabel.Location = new System.Drawing.Point(12, 298);
+            this.installPathLabel.Location = new System.Drawing.Point(12, 306);
             this.installPathLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
             this.installPathLabel.Name = "installPathLabel";
             this.installPathLabel.Size = new System.Drawing.Size(229, 19);
@@ -131,7 +70,7 @@
             // installPath
             // 
             this.installPath.Font = new System.Drawing.Font("Tahoma", 8.25F);
-            this.installPath.Location = new System.Drawing.Point(15, 319);
+            this.installPath.Location = new System.Drawing.Point(15, 327);
             this.installPath.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
             this.installPath.Name = "installPath";
             this.installPath.Size = new System.Drawing.Size(379, 21);
@@ -141,7 +80,7 @@
             // pathBrowseButton
             // 
             this.pathBrowseButton.Font = new System.Drawing.Font("Tahoma", 8.25F);
-            this.pathBrowseButton.Location = new System.Drawing.Point(415, 315);
+            this.pathBrowseButton.Location = new System.Drawing.Point(415, 323);
             this.pathBrowseButton.Name = "pathBrowseButton";
             this.pathBrowseButton.Size = new System.Drawing.Size(28, 26);
             this.pathBrowseButton.TabIndex = 6;
@@ -164,7 +103,7 @@
             // 
             this.pathExistsLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold);
             this.pathExistsLabel.ForeColor = System.Drawing.Color.DimGray;
-            this.pathExistsLabel.Location = new System.Drawing.Point(36, 347);
+            this.pathExistsLabel.Location = new System.Drawing.Point(36, 355);
             this.pathExistsLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
             this.pathExistsLabel.Name = "pathExistsLabel";
             this.pathExistsLabel.Size = new System.Drawing.Size(322, 19);
@@ -186,7 +125,7 @@
             // 
             // abort
             // 
-            this.abort.Location = new System.Drawing.Point(15, 347);
+            this.abort.Location = new System.Drawing.Point(15, 355);
             this.abort.Name = "abort";
             this.abort.Size = new System.Drawing.Size(16, 16);
             this.abort.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
@@ -224,11 +163,20 @@
             this.actionLabel.TabIndex = 30;
             this.actionLabel.Text = "Please select a setup type.";
             // 
+            // setupTypePanel
+            // 
+            this.setupTypePanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
+            this.setupTypePanel.Location = new System.Drawing.Point(7, 129);
+            this.setupTypePanel.Name = "setupTypePanel";
+            this.setupTypePanel.Size = new System.Drawing.Size(180, 166);
+            this.setupTypePanel.TabIndex = 31;
+            // 
             // InstallType
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
             this.Caption = "Please select the Setup Type that suits your use case.";
+            this.Controls.Add(this.setupTypePanel);
             this.Controls.Add(this.actionLabel);
             this.Controls.Add(this.label1);
             this.Controls.Add(this.setupTypeDescriptionLabel);
@@ -236,10 +184,6 @@
             this.Controls.Add(this.installPath);
             this.Controls.Add(this.installPathLabel);
             this.Controls.Add(this.setupTypeDescription);
-            this.Controls.Add(this.customType);
-            this.Controls.Add(this.fullType);
-            this.Controls.Add(this.serverOnlyType);
-            this.Controls.Add(this.defaultType);
             this.Controls.Add(this.pathExistsLabel);
             this.Controls.Add(this.invalidPath);
             this.Controls.Add(this.abort);
@@ -253,10 +197,6 @@
             this.Controls.SetChildIndex(this.abort, 0);
             this.Controls.SetChildIndex(this.invalidPath, 0);
             this.Controls.SetChildIndex(this.pathExistsLabel, 0);
-            this.Controls.SetChildIndex(this.defaultType, 0);
-            this.Controls.SetChildIndex(this.serverOnlyType, 0);
-            this.Controls.SetChildIndex(this.fullType, 0);
-            this.Controls.SetChildIndex(this.customType, 0);
             this.Controls.SetChildIndex(this.setupTypeDescription, 0);
             this.Controls.SetChildIndex(this.installPathLabel, 0);
             this.Controls.SetChildIndex(this.installPath, 0);
@@ -264,6 +204,7 @@
             this.Controls.SetChildIndex(this.setupTypeDescriptionLabel, 0);
             this.Controls.SetChildIndex(this.label1, 0);
             this.Controls.SetChildIndex(this.actionLabel, 0);
+            this.Controls.SetChildIndex(this.setupTypePanel, 0);
             ((System.ComponentModel.ISupportInitialize)(this.warningSign)).EndInit();
             ((System.ComponentModel.ISupportInitialize)(this.abort)).EndInit();
             this.ResumeLayout(false);
@@ -273,10 +214,6 @@
 
         #endregion
 
-        private System.Windows.Forms.RadioButton defaultType;
-        private System.Windows.Forms.RadioButton serverOnlyType;
-        private System.Windows.Forms.RadioButton fullType;
-        private System.Windows.Forms.RadioButton customType;
         private System.Windows.Forms.TextBox setupTypeDescription;
         private System.Windows.Forms.Label installPathLabel;
         private System.Windows.Forms.TextBox installPath;
@@ -288,5 +225,6 @@
         private System.Windows.Forms.Label setupTypeDescriptionLabel;
         private System.Windows.Forms.Label label1;
         private System.Windows.Forms.Label actionLabel;
+        private System.Windows.Forms.FlowLayoutPanel setupTypePanel;
     }
 }

=== modified file 'WexInstaller/InstallWizard/InstallType.cs'
--- a/WexInstaller/InstallWizard/InstallType.cs	2010-09-24 21:01:12 +0000
+++ b/WexInstaller/InstallWizard/InstallType.cs	2011-01-17 17:05:19 +0000
@@ -15,7 +15,7 @@
     public partial class InstallType : InstallerPanel
     {
         private bool nextOk;
-        private bool typeSet;
+        private SetupType currentType;
 
         public InstallType()
         {
@@ -28,13 +28,37 @@
         public override void Activate()
         {
             base.Activate();
-            if (!typeSet)
+            if (currentType == null)
             {
-                setupType_CheckedChanged(defaultType, EventArgs.Empty);
-                typeSet = true;
+                int tabIndex = 1;
+                foreach (SetupType setupType in ProductManager.ActiveCatalog.SetupTypes)
+                {
+                    RadioButton radio = new RadioButton();
+                    radio.AutoSize = true;
+                    radio.TabIndex = tabIndex++;
+                    radio.TabStop = true;
+                    radio.UseVisualStyleBackColor = true;
+                    radio.Text = setupType.Name;
+                    radio.Padding = new Padding(4);
+                    radio.Tag = setupType;
+                    radio.Font = new Font(Font, FontStyle.Bold);
+                    radio.Click += new EventHandler(setupTypeClicked);
+                    setupTypePanel.Controls.Add(radio);
+                }
+                (setupTypePanel.Controls[0] as RadioButton).PerformClick();
             }
         }
 
+        void setupTypeClicked(object sender, EventArgs e)
+        {
+            RadioButton rb = sender as RadioButton;
+            currentType =  rb.Tag as SetupType;
+            setupTypeDescription.Text = currentType.Description;
+
+            (ParentControl as InstallWizardControl).ShowFeatureSelection(currentType.Flag == (int)SetupTypeFlag.Custom);
+            SignalChange();
+        }
+
         private void pathBrowseButton_Click(object sender, EventArgs e)
         {
             FolderBrowserDialog d = new FolderBrowserDialog();
@@ -44,6 +68,21 @@
             SignalChange();
         }
 
+        public override bool Next()
+        {
+            // turn off installation of all products as we are redoing it here
+            foreach (ProductCategory cat in ProductManager.ProductCategories)
+                foreach (Product p in cat.Products)
+                    p.ProposedInstalled = false;
+
+            foreach (CatalogProduct product in ProductManager.ActiveCatalog.Products)
+            {
+                product.ReferencedProduct.ProposedInstalled = currentType.Includes(product);
+            }
+
+            return base.Next();
+        }
+
         public override bool NextOk()
         {
             return nextOk;
@@ -79,50 +118,15 @@
             }
         }
 
-        private void setupType_CheckedChanged(object sender, EventArgs e)
-        {
-            RadioButton rb = sender as RadioButton;
-            SetupType type = SetupType.DeveloperDefault;
-            switch (Int32.Parse(rb.Tag as string))
-            {
-                case 0:
-                    setupTypeDescription.Text = Resources.DefaultSetupTypeDesc;
-                    break;
-                case 1:
-                    setupTypeDescription.Text = Resources.ServerOnlySetupTypeDesc;
-                    type = SetupType.ServerOnly;
-                    break;
-                case 2:
-                    setupTypeDescription.Text = Resources.FullSetupTypeDesc;
-                    type = SetupType.Full;
-                    break;
-                case 3:
-                    setupTypeDescription.Text = Resources.CustomSetupTypeDesc;
-                    type = SetupType.Custom;
-                    break;
-            }
-            foreach (ProductCategory cat in ProductManager.ProductCategories)
-            {
-                cat.SetInstallType(type);
-            }
-
-            (ParentControl as InstallWizardControl).ShowFeatureSelection(customType.Checked == true);
-            SignalChange();
-        }
-
         private void InstallType_Paint(object sender, PaintEventArgs e)
         {
             Graphics gfx = e.Graphics;
             Pen myPen = new Pen(Color.LightGray);
-            gfx.DrawLine(myPen, 168, 126, 168, 226);
+            Point top = setupTypePanel.Location;
+            top.X += setupTypePanel.Width + 4;
+            Point bottom = top;
+            bottom.Y += setupTypePanel.Height;
+            gfx.DrawLine(myPen, top, bottom);
         }
     }
-
-    public enum SetupType
-    {
-        DeveloperDefault = 0,
-        ServerOnly,
-        Full,
-        Custom
-    }
 }

=== modified file 'WexInstaller/Properties/Resources.Designer.cs'
--- a/WexInstaller/Properties/Resources.Designer.cs	2010-11-30 14:52:06 +0000
+++ b/WexInstaller/Properties/Resources.Designer.cs	2011-01-17 17:05:19 +0000
@@ -183,6 +183,15 @@
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to All MySQL Products.
+        /// </summary>
+        internal static string AllMySQLProducts {
+            get {
+                return ResourceManager.GetString("AllMySQLProducts", resourceCulture);
+            }
+        }
+        
         internal static System.Drawing.Bitmap Application_Icon {
             get {
                 object obj = ResourceManager.GetObject("Application_Icon", resourceCulture);
@@ -374,6 +383,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Installed MySQL Products.
+        /// </summary>
+        internal static string InstalledMySQLProducts {
+            get {
+                return ResourceManager.GetString("InstalledMySQLProducts", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Choosing a Setup Type.
         /// </summary>
         internal static string InstallTypeCaption {
@@ -507,6 +525,42 @@
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to (available on this system).
+        /// </summary>
+        internal static string PackagesAlreadyInstalled {
+            get {
+                return ResourceManager.GetString("PackagesAlreadyInstalled", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to (available in this package).
+        /// </summary>
+        internal static string PackagesAvailable {

+            get {
+                return ResourceManager.GetString("PackagesAvailable", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to (available for commercial download).
+        /// </summary>
+        internal static string PackagesAvailableForCommercialDownload {
+            get {
+                return ResourceManager.GetString("PackagesAvailableForCommercialDownload", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to (available for download).
+        /// </summary>
+        internal static string PackagesAvailableForDownload {
+            get {
+                return ResourceManager.GetString("PackagesAvailableForDownload", resourceCulture);
+            }
+        }
+        
         internal static System.Drawing.Bitmap plus_sign {
             get {
                 object obj = ResourceManager.GetObject("plus_sign", resourceCulture);
@@ -682,6 +736,13 @@
             }
         }
         
+        internal static System.Drawing.Bitmap wex_product_catalog {
+            get {
+                object obj = ResourceManager.GetObject("wex_product_catalog", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         internal static System.Drawing.Bitmap WizardSelection {
             get {
                 object obj = ResourceManager.GetObject("WizardSelection", resourceCulture);

=== modified file 'WexInstaller/Properties/Resources.resx'
--- a/WexInstaller/Properties/Resources.resx	2010-11-30 14:52:06 +0000
+++ b/WexInstaller/Properties/Resources.resx	2011-01-17 17:05:19 +0000
@@ -360,4 +360,25 @@
   <data name="NoneSelectedForRemovalTitle" xml:space="preserve">
     <value>Nothing to do.</value>
   </data>
+  <data name="wex_product_catalog" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\wex_product_catalog.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="AllMySQLProducts" xml:space="preserve">
+    <value>All MySQL Products</value>
+  </data>
+  <data name="InstalledMySQLProducts" xml:space="preserve">
+    <value>Installed MySQL Products</value>
+  </data>
+  <data name="PackagesAlreadyInstalled" xml:space="preserve">
+    <value>(available on this system)</value>
+  </data>
+  <data name="PackagesAvailable" xml:space="preserve">
+    <value>(available in this package)</value>
+  </data>
+  <data name="PackagesAvailableForCommercialDownload" xml:space="preserve">
+    <value>(available for commercial download)</value>
+  </data>
+  <data name="PackagesAvailableForDownload" xml:space="preserve">
+    <value>(available for download)</value>
+  </data>
 </root>
\ No newline at end of file

=== added file 'WexInstaller/Resources/MySQLInstallerProductCatalog_Download.png'
Binary files a/WexInstaller/Resources/MySQLInstallerProductCatalog_Download.png	1970-01-01 00:00:00 +0000 and b/WexInstaller/Resources/MySQLInstallerProductCatalog_Download.png	2011-01-17 17:05:19 +0000 differ
=== added file 'WexInstaller/Resources/MySQLInstallerProductCatalog_DownloadCom.png'
Binary files a/WexInstaller/Resources/MySQLInstallerProductCatalog_DownloadCom.png	1970-01-01 00:00:00 +0000 and b/WexInstaller/Resources/MySQLInstallerProductCatalog_DownloadCom.png	2011-01-17 17:05:19 +0000 differ
=== added file 'WexInstaller/Resources/MySQLInstallerProductCatalog_InPackage.png'
Binary files a/WexInstaller/Resources/MySQLInstallerProductCatalog_InPackage.png	1970-01-01 00:00:00 +0000 and b/WexInstaller/Resources/MySQLInstallerProductCatalog_InPackage.png	2011-01-17 17:05:19 +0000 differ
=== added file 'WexInstaller/Resources/MySQLInstallerProductCatalog_OnDisk.png'
Binary files a/WexInstaller/Resources/MySQLInstallerProductCatalog_OnDisk.png	1970-01-01 00:00:00 +0000 and b/WexInstaller/Resources/MySQLInstallerProductCatalog_OnDisk.png	2011-01-17 17:05:19 +0000 differ
=== added file 'WexInstaller/Resources/wex_product_catalog.png'
Binary files a/WexInstaller/Resources/wex_product_catalog.png	1970-01-01 00:00:00 +0000 and b/WexInstaller/Resources/wex_product_catalog.png	2011-01-17 17:05:19 +0000 differ
=== modified file 'WexInstaller/WexInstaller.csproj'
--- a/WexInstaller/WexInstaller.csproj	2010-12-13 19:08:38 +0000
+++ b/WexInstaller/WexInstaller.csproj	2011-01-17 17:05:19 +0000
@@ -123,8 +123,10 @@
       <SubType>Component</SubType>
     </Compile>
     <Compile Include="Core\Package.cs" />
+    <Compile Include="Core\ProductCatalog.cs" />
     <Compile Include="Core\ProductCategory.cs" />
     <Compile Include="Core\ProductFeature.cs" />
+    <Compile Include="Core\ProductManifest.cs" />
     <Compile Include="HiddenTabsControl.cs">
       <SubType>Component</SubType>
     </Compile>
@@ -428,9 +430,11 @@
     <None Include="Resources\about.rtf" />
     <None Include="Resources\license.txt" />
     <None Include="Resources\my-template.ini" />
+    <None Include="Resources\product_catalog" />
     <None Include="Resources\WizardSelection.png" />
   </ItemGroup>
   <ItemGroup>
+    <None Include="Resources\wex_product_catalog.png" />
     <None Include="Resources\AboutBanner.png" />
     <None Include="Resources\AddOnsCategoryIcon.png" />
     <None Include="Resources\ConnectorCategoryIcon.png" />

Attachment: [text/bzr-bundle] bzr/reggie.burnett@oracle.com-20110117170519-2c3f6rmuq6nwq1ed.bundle
Thread
bzr commit into wex-installer-1.0 branch (reggie.burnett:256) Reggie Burnett17 Jan