diff --git a/CITATION.cff b/CITATION.cff index 6ffa2109..12829758 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -2,8 +2,8 @@ cff-version: 1.2.0 message: "If you use this software, please cite it as below." type: software title: "WPF Framework" -version: "1.0.3" -date-released: "2026-07-14" +version: "1.0.4" +date-released: "2026-07-17" license: 0BSD repository-code: "https://github.com/USACE-RMC/WPF-Framework" url: "https://github.com/USACE-RMC/WPF-Framework" diff --git a/Directory.Build.props b/Directory.Build.props index 77c75074..cb8e22a9 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -14,9 +14,9 @@ https://github.com/USACE-RMC/WPF-Framework https://github.com/USACE-RMC/WPF-Framework git - 1.0.3 - 1.0.3.0 - 1.0.3.0 + 1.0.4 + 1.0.4.0 + 1.0.4.0 false false diff --git a/Directory.Packages.props b/Directory.Packages.props index d5d2d565..cc7d0081 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -15,10 +15,10 @@ 4.2.1 3.14.0 4.5.0 - - 2.* + + 2.1.4 - [2.1.1,3.0.0) + [2.1.4,3.0.0) 3.50.4.5 2.0.2 2.9.2 diff --git a/README.md b/README.md index d24ec387..a2a41f02 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ WPF Framework is a free and open-source .NET 10.0 application framework for buil WPF Framework can be consumed from source project references or packaged into NuGet bundles with `scripts/pack-wpf-framework.ps1`. The package layout follows the internal dependency map: Core, Models, Support, then Controls. -The framework depends on [RMC.Numerics](https://github.com/USACE-RMC/Numerics) through central NuGet package management in `Directory.Packages.props`. Source builds restore the latest compatible 2.x package; NuGet bundles declare compatibility with RMC.Numerics 2.1.1 or later, below 3.0.0. +The framework depends on [RMC.Numerics](https://github.com/USACE-RMC/Numerics) through central NuGet package management in `Directory.Packages.props`. Source builds restore RMC.Numerics 2.1.4; NuGet bundles declare compatibility with RMC.Numerics 2.1.4 or later, below 3.0.0. ## Solution Structure @@ -51,7 +51,7 @@ dotnet test WPF-Framework.sln ### Build Packages ```bash -.\scripts\pack-wpf-framework.ps1 -Configuration Release -Version 1.0.3 +.\scripts\pack-wpf-framework.ps1 -Configuration Release -Version 1.0.4 ``` This creates and validates the following NuGet packages in `artifacts/packages/`: @@ -61,7 +61,7 @@ This creates and validates the following NuGet packages in `artifacts/packages/` | [`RMC.Wpf.Framework.Core`](https://www.nuget.org/packages/RMC.Wpf.Framework.Core/) | FrameworkInterfaces, Themes | None | | [`RMC.Wpf.Framework.Models`](https://www.nuget.org/packages/RMC.Wpf.Framework.Models/) | DAG, DatabaseManager, ExpressionParser, OxyPlot libraries | ClosedXML, DocumentFormat.OpenXml, ExcelNumberFormat, FastMember, SourceGear.sqlite3, System.Data.SQLite | | [`RMC.Wpf.Framework.Support`](https://www.nuget.org/packages/RMC.Wpf.Framework.Support/) | SoftwareUpdate and updater content files | None | -| [`RMC.Wpf.Framework.Controls`](https://www.nuget.org/packages/RMC.Wpf.Framework.Controls/) | FrameworkUI, control libraries, AvalonDock fork | Core, Models, Support, RMC.Numerics 2.x | +| [`RMC.Wpf.Framework.Controls`](https://www.nuget.org/packages/RMC.Wpf.Framework.Controls/) | FrameworkUI, control libraries, AvalonDock fork | Core, Models, Support, RMC.Numerics 2.1.4+ | ### Minimal Application diff --git a/codemeta.json b/codemeta.json index 36c0cede..66128ddb 100644 --- a/codemeta.json +++ b/codemeta.json @@ -3,9 +3,9 @@ "@type": "SoftwareSourceCode", "name": "WPF Framework", "description": "A free and open-source .NET 10 application framework for building Windows desktop project management applications. Provides a docking application shell with theming, project explorer, undo/redo, and specialized controls for charting, numeric input, databases, expression parsing, and directed acyclic graphs.", - "version": "1.0.3", + "version": "1.0.4", "dateCreated": "2025-12-29", - "dateModified": "2026-07-14", + "dateModified": "2026-07-17", "license": "https://spdx.org/licenses/0BSD", "codeRepository": "https://github.com/USACE-RMC/WPF-Framework", "issueTracker": "https://github.com/USACE-RMC/WPF-Framework/issues", diff --git a/docs/architecture.md b/docs/architecture.md index cf40bf28..1171a113 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -83,9 +83,9 @@ The packaging projects in `src/Packaging/` create four bundles. Packages should | `RMC.Wpf.Framework.Core` | FrameworkInterfaces, Themes | None | | `RMC.Wpf.Framework.Models` | DAG, DatabaseManager, ExpressionParser, OxyPlot, OxyPlot.Wpf, OxyPlot.Wpf.Shared | ClosedXML, DocumentFormat.OpenXml, ExcelNumberFormat, FastMember, SourceGear.sqlite3, System.Data.SQLite | | `RMC.Wpf.Framework.Support` | SoftwareUpdate plus SoftwareUpdate.Updater content files | None | -| `RMC.Wpf.Framework.Controls` | FrameworkUI, GenericControls, NumericControls, OxyPlotControls, DatabaseControls, ExpressionParserControls, DAGControls, Xceed.Wpf.AvalonDock, Xceed.Wpf.AvalonDock.Themes.VS2013 | `RMC.Wpf.Framework.Core`, `RMC.Wpf.Framework.Models`, `RMC.Wpf.Framework.Support`, `RMC.Numerics` 2.x | +| `RMC.Wpf.Framework.Controls` | FrameworkUI, GenericControls, NumericControls, OxyPlotControls, DatabaseControls, ExpressionParserControls, DAGControls, Xceed.Wpf.AvalonDock, Xceed.Wpf.AvalonDock.Themes.VS2013 | `RMC.Wpf.Framework.Core`, `RMC.Wpf.Framework.Models`, `RMC.Wpf.Framework.Support`, `RMC.Numerics` 2.1.4+ | -AvalonDock is a vendored UI dependency and is packaged with `RMC.Wpf.Framework.Controls`, not Core. `RMC.Numerics` is consumed as a NuGet package through central package management and should not be referenced through local `HintPath` DLLs. Source builds use the floating `2.*` version, while packages declare a compatible `[2.1.1,3.0.0)` dependency range. +AvalonDock is a vendored UI dependency and is packaged with `RMC.Wpf.Framework.Controls`, not Core. `RMC.Numerics` is consumed as a NuGet package through central package management and should not be referenced through local `HintPath` DLLs. Source builds restore `RMC.Numerics` 2.1.4, while packages declare a compatible `[2.1.4,3.0.0)` dependency range. ## 3. Core Framework @@ -217,7 +217,7 @@ Key additions beyond upstream: | Dependency | Source | Purpose | |-----------|--------|---------| -| **RMC.Numerics** | [USACE-RMC/Numerics](https://github.com/USACE-RMC/Numerics) NuGet package, latest compatible 2.x | Statistical distributions, parameter estimation, bootstrap analysis. Required by NumericControls and DatabaseControls. | +| **RMC.Numerics** | [USACE-RMC/Numerics](https://github.com/USACE-RMC/Numerics) NuGet package, 2.1.4 or later compatible 2.x | Statistical distributions, parameter estimation, bootstrap analysis. Required by NumericControls and DatabaseControls. | All other dependencies are either vendored into the solution (AvalonDock, OxyPlot) or available as NuGet packages (System.Data.SQLite, DocumentFormat.OpenXml, etc.). diff --git a/docs/getting-started.md b/docs/getting-started.md index 9896704c..d778470b 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -30,7 +30,7 @@ For NuGet consumption, reference the Controls bundle. It brings in Core, Models, ```xml - + ``` diff --git a/scripts/pack-wpf-framework.ps1 b/scripts/pack-wpf-framework.ps1 index 08078b0c..b86b1f3e 100644 --- a/scripts/pack-wpf-framework.ps1 +++ b/scripts/pack-wpf-framework.ps1 @@ -99,10 +99,16 @@ $expectedVersionedEntries = @{ } $expectedReleaseNotes = @{ - "RMC.Wpf.Framework.Core" = "Coordinated WPF Framework 1.0.3 release; no package-specific functional changes." - "RMC.Wpf.Framework.Models" = "Coordinated WPF Framework 1.0.3 release; no package-specific functional changes." - "RMC.Wpf.Framework.Support" = "Coordinated WPF Framework 1.0.3 release; no package-specific functional changes." - "RMC.Wpf.Framework.Controls" = "Version 1.0.3 defaults the DatabaseControls TableViewer Export Table dialog to CSV while retaining DBF, Excel, and SQLite options." + "RMC.Wpf.Framework.Core" = "Coordinated WPF Framework 1.0.4 release; no package-specific functional changes." + "RMC.Wpf.Framework.Models" = "Coordinated WPF Framework 1.0.4 release; no package-specific functional changes." + "RMC.Wpf.Framework.Support" = "Coordinated WPF Framework 1.0.4 release; no package-specific functional changes." + "RMC.Wpf.Framework.Controls" = "Version 1.0.4 updates RMC.Numerics to 2.1.4 and improves NumericControls validation and distribution selector compatibility." +} + +$expectedPackageDependencies = @{ + "RMC.Wpf.Framework.Controls" = @{ + "RMC.Numerics" = "[2.1.4,3.0.0)" + } } foreach ($packageId in $expectedEntries.Keys) { @@ -156,6 +162,23 @@ foreach ($packageId in $expectedEntries.Keys) { throw "$($package.Name) has unexpected NuGet release notes." } + if ($expectedPackageDependencies.ContainsKey($packageId)) { + foreach ($dependencyId in $expectedPackageDependencies[$packageId].Keys) { + $dependency = $nuspec.SelectSingleNode("/n:package/n:metadata/n:dependencies/n:group/n:dependency[@id='$dependencyId']", $namespaceManager) + if ($dependency -eq $null) { + throw "$($package.Name) is missing NuGet dependency $dependencyId." + } + + $dependencyVersion = $dependency.Attributes["version"].Value + $expectedDependencyVersion = $expectedPackageDependencies[$packageId][$dependencyId] + $normalizedDependencyVersion = $dependencyVersion.Replace(" ", "") + $normalizedExpectedDependencyVersion = $expectedDependencyVersion.Replace(" ", "") + if ($normalizedDependencyVersion -ne $normalizedExpectedDependencyVersion) { + throw "$($package.Name) declares $dependencyId dependency $dependencyVersion instead of $expectedDependencyVersion." + } + } + } + $numericVersion = ($packageVersion -split '-')[0] $expectedBinaryVersion = "$numericVersion.0" $inspectionDirectory = Join-Path ([System.IO.Path]::GetTempPath()) "wpf-framework-package-$([Guid]::NewGuid().ToString('N'))" diff --git a/src/DAGControls/Properties/AssemblyInfo.cs b/src/DAGControls/Properties/AssemblyInfo.cs index cb9a9684..395978ca 100644 --- a/src/DAGControls/Properties/AssemblyInfo.cs +++ b/src/DAGControls/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -using System.Reflection; +using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -50,5 +50,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.3.0")] -[assembly: AssemblyFileVersion("1.0.3.0")] +[assembly: AssemblyVersion("1.0.4.0")] +[assembly: AssemblyFileVersion("1.0.4.0")] diff --git a/src/NumericControls/Data/Uncertain Curve Editor/DistributionDataItem.cs b/src/NumericControls/Data/Uncertain Curve Editor/DistributionDataItem.cs index fad0edf2..a0765bc9 100644 --- a/src/NumericControls/Data/Uncertain Curve Editor/DistributionDataItem.cs +++ b/src/NumericControls/Data/Uncertain Curve Editor/DistributionDataItem.cs @@ -240,7 +240,13 @@ public DistributionDataItem(UncertainOrderedPairedData d, UnivariateDistribution _isStrictY = strictY; _xOrder = orderX; _yOrder = orderY; - DistributionName = UnivariateDistributionFactory.CreateDistribution(Distribution).DisplayName; + if (_data is not null && _data.Count > 0) + DistributionName = _data[0].Y.DisplayName; + else if (UnivariateDistributionFactory.TryCreateDistribution(Distribution, out var distribution) && + distribution is not null) + DistributionName = distribution.DisplayName; + else + DistributionName = Distribution.ToString(); Refresh(); } diff --git a/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedDataSelectorControl.xaml.cs b/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedDataSelectorControl.xaml.cs index 8aa6053e..ab9130cf 100644 --- a/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedDataSelectorControl.xaml.cs +++ b/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedDataSelectorControl.xaml.cs @@ -434,7 +434,6 @@ private static void DistributionOptionsCallback(DependencyObject d, DependencyPr { UncertainOrderedDataSelectorControl thisControl = (UncertainOrderedDataSelectorControl)d; thisControl.Distributions.Clear(); - UnivariateDistributionBase distribution; if ((e.NewValue == null) || (e.NewValue.GetType() != typeof(List))) { thisControl.DistributionOptions = DefaultDistributionOptions; @@ -443,8 +442,8 @@ private static void DistributionOptionsCallback(DependencyObject d, DependencyPr { foreach (var dist in (List)e.NewValue) { - distribution = UnivariateDistributionFactory.CreateDistribution(dist); - if (distribution == null) continue; + if (!UnivariateDistributionFactory.TryCreateDistribution(dist, out var distribution) || + distribution is null) continue; // var ordinates = new List(); for (int i = 0; i <= 5; i++) @@ -459,9 +458,9 @@ private static void DistributionOptionsCallback(DependencyObject d, DependencyPr } /// - /// Currently does not support bivariate, univariate, or kernel density. + /// Returns the default distribution types supported by the uncertain curve selector. /// - /// + /// A list of supported distribution types. public static List DefaultDistributionOptions { get @@ -480,6 +479,7 @@ public static List DefaultDistributionOptions (o != UnivariateDistributionType.KernelDensity) && (o != UnivariateDistributionType.Mixture) && (o != UnivariateDistributionType.NoncentralT) && + (o != UnivariateDistributionType.UserDefined) && (o != UnivariateDistributionType.UniformDiscrete) && (o != UnivariateDistributionType.Poisson)).ToList(); } @@ -698,8 +698,13 @@ private void ValidationGrid_PreviewAddRows(int startRowIndex, int nRows, ref boo // DistributionDataItem selectedItem = (DistributionDataItem)CurveUncertaintyComboBox.SelectedItem; var type = selectedItem.Data.Distribution; + UnivariateDistributionBase distribution; + if (selectedItem.Data.Count > 0) + distribution = selectedItem.Data[0].Y.Clone(); + else if (!UnivariateDistributionFactory.TryCreateDistribution(type, out distribution) || distribution is null) + return; for (int i = startRowIndex; i < startRowIndex + nRows; i++) - selectedItem.Data.Insert(i, new UncertainOrdinate(0d, UnivariateDistributionFactory.CreateDistribution(type))); + selectedItem.Data.Insert(i, new UncertainOrdinate(0d, distribution.Clone())); // Refresh the view selectedItem.Refresh(); // MinimumX, MaximumX, MinimumY, MaximumY, IsStrictX, IsStrictY, OrderX, OrderY) ValidationGrid.Items.Refresh(); diff --git a/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedDataTableEditor.xaml.cs b/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedDataTableEditor.xaml.cs index 935ffede..41dce879 100644 --- a/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedDataTableEditor.xaml.cs +++ b/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedDataTableEditor.xaml.cs @@ -375,7 +375,6 @@ public IList DistributionOptions private static void DistributionOptionsCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { UncertainOrderedDataTableEditor thisControl = (UncertainOrderedDataTableEditor)d; - UnivariateDistributionBase distribution; IList distOptions = e.NewValue as IList; if (e.NewValue == null || distOptions == null) { @@ -397,11 +396,11 @@ private static void DistributionOptionsCallback(DependencyObject d, DependencyPr foreach (var dist in distOptions) { if (thisControl._distributions.Any(o => o.Distribution == dist)) continue; - distribution = UnivariateDistributionFactory.CreateDistribution(dist); - if (distribution == null) continue; + if (!UnivariateDistributionFactory.TryCreateDistribution(dist, out var distribution) || + distribution is null) continue; var ordinates = new List(); for (int i = 0; i <= 1; i++) - ordinates.Add(new UncertainOrdinate(i, UnivariateDistributionFactory.CreateDistribution(dist))); + ordinates.Add(new UncertainOrdinate(i, distribution.Clone())); var uncertainData = new UncertainOrderedPairedData(ordinates, thisControl.IsStrictX, thisControl.OrderX, thisControl.IsStrictY, thisControl.OrderY, dist); thisControl._distributions.Add(uncertainData); } @@ -409,9 +408,9 @@ private static void DistributionOptionsCallback(DependencyObject d, DependencyPr } /// - /// Currently does not support bivariate, empirical, or kernel density. + /// Returns the default distribution types supported by the uncertain curve table editor. /// - /// + /// A list of supported distribution types. public static List DefaultDistributionOptions { get @@ -430,6 +429,7 @@ public static List DefaultDistributionOptions (o != UnivariateDistributionType.KernelDensity) && (o != UnivariateDistributionType.Mixture) && (o != UnivariateDistributionType.NoncentralT) && + (o != UnivariateDistributionType.UserDefined) && (o != UnivariateDistributionType.UniformDiscrete) && (o != UnivariateDistributionType.Poisson)).ToList(); } @@ -504,7 +504,9 @@ public object Convert(object value, Type targetType, object parameter, CultureIn UncertainOrderedPairedData val = value as UncertainOrderedPairedData; if (val == null) return ""; if (val.Count > 0) return val[0].Y.DisplayName; - return UnivariateDistributionFactory.CreateDistribution(val.Distribution).DisplayName; + if (UnivariateDistributionFactory.TryCreateDistribution(val.Distribution, out var distribution) && + distribution is not null) return distribution.DisplayName; + return val.Distribution.ToString(); } /// diff --git a/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedTableEditor.xaml.cs b/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedTableEditor.xaml.cs index 127f6329..bfb2d991 100644 --- a/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedTableEditor.xaml.cs +++ b/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedTableEditor.xaml.cs @@ -539,8 +539,13 @@ private void ValidationGrid_PreviewAddRows(int startRowIndex, int nRows, ref boo // var type = UncertainOrderedData.Distribution; var itemsToInsert = new List(); + UnivariateDistributionBase distribution; + if (UncertainOrderedData.Count > 0) + distribution = UncertainOrderedData[0].Y.Clone(); + else if (!UnivariateDistributionFactory.TryCreateDistribution(type, out distribution) || distribution is null) + return; for (int i = startRowIndex; i < startRowIndex + nRows; i++) - itemsToInsert.Add(new UncertainOrdinate(0d, UnivariateDistributionFactory.CreateDistribution(type))); + itemsToInsert.Add(new UncertainOrdinate(0d, distribution.Clone())); // Let it update the UI since this is a preview event that is being canceled. if (UncertainOrderedData.SuppressCollectionChanged == true) { diff --git a/src/NumericControls/Distributions/Univariate/Distribution Selector/DistributionSelectorControl.xaml.cs b/src/NumericControls/Distributions/Univariate/Distribution Selector/DistributionSelectorControl.xaml.cs index c7073527..d169a0a7 100644 --- a/src/NumericControls/Distributions/Univariate/Distribution Selector/DistributionSelectorControl.xaml.cs +++ b/src/NumericControls/Distributions/Univariate/Distribution Selector/DistributionSelectorControl.xaml.cs @@ -461,7 +461,8 @@ public double[] SampleData } /// - /// Excludes Empirical, KernelDensity, and UserDefined distribution types. + /// Returns directly constructible distributions supported by the selector, excluding empirical, + /// kernel-density, user-defined, and component-only distribution types. /// /// public static List DefaultDistributions @@ -474,9 +475,9 @@ public static List DefaultDistributions if (distributionType == UnivariateDistributionType.Empirical) { continue; } if (distributionType == UnivariateDistributionType.KernelDensity) { continue; } if (distributionType == UnivariateDistributionType.UserDefined) { continue; } - // - UnivariateDistributionBase distributionToAdd = UnivariateDistributionFactory.CreateDistribution(distributionType); - if (distributionToAdd is not null) { distributions.Add(distributionToAdd); } + if (UnivariateDistributionFactory.TryCreateDistribution(distributionType, out var distributionToAdd) && + distributionToAdd is not null) + distributions.Add(distributionToAdd); } // return distributions; diff --git a/src/NumericControls/Distributions/Univariate/Distribution Selector/Selector.xaml.cs b/src/NumericControls/Distributions/Univariate/Distribution Selector/Selector.xaml.cs index 7f88f4f5..18b6d375 100644 --- a/src/NumericControls/Distributions/Univariate/Distribution Selector/Selector.xaml.cs +++ b/src/NumericControls/Distributions/Univariate/Distribution Selector/Selector.xaml.cs @@ -393,7 +393,8 @@ public double[] SampleData } /// - /// Excludes Empirical, KernelDensity, and UserDefined distribution types. + /// Returns directly constructible distributions supported by the selector, excluding empirical, + /// kernel-density, user-defined, and component-only distribution types. /// /// public static List DefaultDistributions @@ -406,9 +407,9 @@ public static List DefaultDistributions if (distributionType == UnivariateDistributionType.Empirical) { continue; } if (distributionType == UnivariateDistributionType.KernelDensity) { continue; } if (distributionType == UnivariateDistributionType.UserDefined) { continue; } - // - UnivariateDistributionBase distributionToAdd = UnivariateDistributionFactory.CreateDistribution(distributionType); - if (distributionToAdd is not null) { distributions.Add(distributionToAdd); } + if (UnivariateDistributionFactory.TryCreateDistribution(distributionType, out var distributionToAdd) && + distributionToAdd is not null) + distributions.Add(distributionToAdd); } // return distributions; @@ -648,9 +649,10 @@ public void SetDistributionOptions(IEnumerable univa { _distributions.Add(_selectedDistribution); } - else + else if (UnivariateDistributionFactory.TryCreateDistribution(d, out var distribution) && + distribution is not null) { - _distributions.Add(UnivariateDistributionFactory.CreateDistribution(d)); + _distributions.Add(distribution); } } DistributionCombobox.ItemsSource = _distributions; diff --git a/src/OxyPlotControls/Properties/AssemblyInfo.cs b/src/OxyPlotControls/Properties/AssemblyInfo.cs index 99132de8..39c2b885 100644 --- a/src/OxyPlotControls/Properties/AssemblyInfo.cs +++ b/src/OxyPlotControls/Properties/AssemblyInfo.cs @@ -28,8 +28,8 @@ // Build Number // Revision // -[assembly: AssemblyVersion("1.0.3.0")] -[assembly: AssemblyFileVersion("1.0.3.0")] +[assembly: AssemblyVersion("1.0.4.0")] +[assembly: AssemblyFileVersion("1.0.4.0")] [assembly: ThemeInfo( ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located diff --git a/src/Packaging/RMC.Wpf.Framework.Controls/RMC.Wpf.Framework.Controls.csproj b/src/Packaging/RMC.Wpf.Framework.Controls/RMC.Wpf.Framework.Controls.csproj index 7f06e0dd..10a47ee8 100644 --- a/src/Packaging/RMC.Wpf.Framework.Controls/RMC.Wpf.Framework.Controls.csproj +++ b/src/Packaging/RMC.Wpf.Framework.Controls/RMC.Wpf.Framework.Controls.csproj @@ -3,7 +3,7 @@ net10.0-windows true false - 1.0.3 + 1.0.4 RMC.Wpf.Framework.Controls.nuspec $(MSBuildProjectDirectory) configuration=$(Configuration);version=$(Version);rmcNumericsPackageDependencyVersion=$(RmcNumericsPackageDependencyVersion) diff --git a/src/Packaging/RMC.Wpf.Framework.Controls/RMC.Wpf.Framework.Controls.nuspec b/src/Packaging/RMC.Wpf.Framework.Controls/RMC.Wpf.Framework.Controls.nuspec index b3db213f..a9bb67aa 100644 --- a/src/Packaging/RMC.Wpf.Framework.Controls/RMC.Wpf.Framework.Controls.nuspec +++ b/src/Packaging/RMC.Wpf.Framework.Controls/RMC.Wpf.Framework.Controls.nuspec @@ -10,7 +10,7 @@ README.md WPF controls, framework UI, DAG controls, database controls, numeric controls, OxyPlot controls, and AvalonDock assemblies for the RMC WPF Framework. - Version 1.0.3 defaults the DatabaseControls TableViewer Export Table dialog to CSV while retaining DBF, Excel, and SQLite options. + Version 1.0.4 updates RMC.Numerics to 2.1.4 and improves NumericControls validation and distribution selector compatibility. RMC WPF framework controls AvalonDock OxyPlot numeric database DAG diff --git a/src/Packaging/RMC.Wpf.Framework.Core/RMC.Wpf.Framework.Core.csproj b/src/Packaging/RMC.Wpf.Framework.Core/RMC.Wpf.Framework.Core.csproj index 9b19b29a..0b1c3f8b 100644 --- a/src/Packaging/RMC.Wpf.Framework.Core/RMC.Wpf.Framework.Core.csproj +++ b/src/Packaging/RMC.Wpf.Framework.Core/RMC.Wpf.Framework.Core.csproj @@ -3,7 +3,7 @@ net10.0-windows true false - 1.0.3 + 1.0.4 RMC.Wpf.Framework.Core.nuspec $(MSBuildProjectDirectory) configuration=$(Configuration);version=$(Version) diff --git a/src/Packaging/RMC.Wpf.Framework.Core/RMC.Wpf.Framework.Core.nuspec b/src/Packaging/RMC.Wpf.Framework.Core/RMC.Wpf.Framework.Core.nuspec index 49da43b9..e3879e63 100644 --- a/src/Packaging/RMC.Wpf.Framework.Core/RMC.Wpf.Framework.Core.nuspec +++ b/src/Packaging/RMC.Wpf.Framework.Core/RMC.Wpf.Framework.Core.nuspec @@ -10,7 +10,7 @@ README.md Core interfaces, project model contracts, undo/redo infrastructure, messaging, and WPF themes for the RMC WPF Framework. - Coordinated WPF Framework 1.0.3 release; no package-specific functional changes. + Coordinated WPF Framework 1.0.4 release; no package-specific functional changes. RMC WPF framework themes undo-redo diff --git a/src/Packaging/RMC.Wpf.Framework.Models/RMC.Wpf.Framework.Models.csproj b/src/Packaging/RMC.Wpf.Framework.Models/RMC.Wpf.Framework.Models.csproj index 24742ea2..54709311 100644 --- a/src/Packaging/RMC.Wpf.Framework.Models/RMC.Wpf.Framework.Models.csproj +++ b/src/Packaging/RMC.Wpf.Framework.Models/RMC.Wpf.Framework.Models.csproj @@ -3,7 +3,7 @@ net10.0-windows true false - 1.0.3 + 1.0.4 RMC.Wpf.Framework.Models.nuspec $(MSBuildProjectDirectory) configuration=$(Configuration);version=$(Version);closedXmlVersion=$(ClosedXmlVersion);documentFormatOpenXmlVersion=$(DocumentFormatOpenXmlVersion);excelNumberFormatVersion=$(ExcelNumberFormatVersion);fastMemberVersion=$(FastMemberVersion);sourceGearSqlite3Version=$(SourceGearSqlite3Version);systemDataSQLiteVersion=$(SystemDataSQLiteVersion) diff --git a/src/Packaging/RMC.Wpf.Framework.Models/RMC.Wpf.Framework.Models.nuspec b/src/Packaging/RMC.Wpf.Framework.Models/RMC.Wpf.Framework.Models.nuspec index 69be73ba..2801dba9 100644 --- a/src/Packaging/RMC.Wpf.Framework.Models/RMC.Wpf.Framework.Models.nuspec +++ b/src/Packaging/RMC.Wpf.Framework.Models/RMC.Wpf.Framework.Models.nuspec @@ -10,7 +10,7 @@ README.md Model, graph, database, expression-parser, and vendored OxyPlot assemblies for the RMC WPF Framework. - Coordinated WPF Framework 1.0.3 release; no package-specific functional changes. + Coordinated WPF Framework 1.0.4 release; no package-specific functional changes. RMC WPF framework database expression-parser DAG OxyPlot diff --git a/src/Packaging/RMC.Wpf.Framework.Support/RMC.Wpf.Framework.Support.csproj b/src/Packaging/RMC.Wpf.Framework.Support/RMC.Wpf.Framework.Support.csproj index 73bb61e1..d6fdd71b 100644 --- a/src/Packaging/RMC.Wpf.Framework.Support/RMC.Wpf.Framework.Support.csproj +++ b/src/Packaging/RMC.Wpf.Framework.Support/RMC.Wpf.Framework.Support.csproj @@ -3,7 +3,7 @@ net10.0-windows true false - 1.0.3 + 1.0.4 $(NoWarn);NU5100 RMC.Wpf.Framework.Support.nuspec diff --git a/src/Packaging/RMC.Wpf.Framework.Support/RMC.Wpf.Framework.Support.nuspec b/src/Packaging/RMC.Wpf.Framework.Support/RMC.Wpf.Framework.Support.nuspec index 3dfdff43..86f13fe6 100644 --- a/src/Packaging/RMC.Wpf.Framework.Support/RMC.Wpf.Framework.Support.nuspec +++ b/src/Packaging/RMC.Wpf.Framework.Support/RMC.Wpf.Framework.Support.nuspec @@ -10,7 +10,7 @@ README.md Software update services and deployable updater helper for the RMC WPF Framework. - Coordinated WPF Framework 1.0.3 release; no package-specific functional changes. + Coordinated WPF Framework 1.0.4 release; no package-specific functional changes. RMC WPF framework software-update updater diff --git a/src/SoftwareUpdate.Updater/SoftwareUpdate.Updater.csproj b/src/SoftwareUpdate.Updater/SoftwareUpdate.Updater.csproj index e9f05f1d..18444878 100644 --- a/src/SoftwareUpdate.Updater/SoftwareUpdate.Updater.csproj +++ b/src/SoftwareUpdate.Updater/SoftwareUpdate.Updater.csproj @@ -8,9 +8,9 @@ enable enable latest - 1.0.3 - 1.0.3.0 - 1.0.3.0 + 1.0.4 + 1.0.4.0 + 1.0.4.0 diff --git a/tests/NumericControls.Tests/Distributions/DistributionFactoryCompatibilityTests.cs b/tests/NumericControls.Tests/Distributions/DistributionFactoryCompatibilityTests.cs new file mode 100644 index 00000000..2735e4bc --- /dev/null +++ b/tests/NumericControls.Tests/Distributions/DistributionFactoryCompatibilityTests.cs @@ -0,0 +1,60 @@ +using global::NumericControls; +using global::NumericControls.Distributions.Univariate; +using Numerics.Distributions; +using Xunit; + +namespace NumericControls.Tests.Distributions; + +/// +/// Guards NumericControls against distribution types that require external component configuration. +/// +public class DistributionFactoryCompatibilityTests +{ + /// + /// Verifies that both selector defaults initialize without throwing and contain exact constructible types. + /// + [StaFact] + public void DefaultSelectorDistributions_AreDirectlyConstructible() + { + var expectedTypes = Enum.GetValues() + .Where(type => type != UnivariateDistributionType.Empirical && + type != UnivariateDistributionType.KernelDensity && + type != UnivariateDistributionType.UserDefined) + .Where(type => UnivariateDistributionFactory.TryCreateDistribution(type, out _)) + .ToArray(); + + var selectorTypes = Selector.DefaultDistributions.Select(distribution => distribution.Type).ToArray(); + var controlTypes = DistributionSelectorControl.DefaultDistributions + .Select(distribution => distribution.Type) + .ToArray(); + + Assert.Equal(expectedTypes, selectorTypes); + Assert.Equal(expectedTypes, controlTypes); + } + + /// + /// Verifies that unsupported types are absent from uncertain-curve defaults. + /// + [StaFact] + public void DefaultUncertainDistributionOptions_ExcludeUnsupportedTypes() + { + var selectorOptions = UncertainOrderedDataSelectorControl.DefaultDistributionOptions; + var editorOptions = UncertainOrderedDataTableEditor.DefaultDistributionOptions; + + Assert.All(selectorOptions, AssertDirectlyConstructible); + Assert.All(editorOptions, AssertDirectlyConstructible); + Assert.DoesNotContain(UnivariateDistributionType.UserDefined, selectorOptions); + Assert.DoesNotContain(UnivariateDistributionType.UserDefined, editorOptions); + } + + /// + /// Asserts that a distribution type can be constructed without external components. + /// + /// Distribution type to validate. + private static void AssertDirectlyConstructible(UnivariateDistributionType type) + { + Assert.True(UnivariateDistributionFactory.TryCreateDistribution(type, out var distribution)); + Assert.NotNull(distribution); + Assert.Equal(type, distribution.Type); + } +}