diff --git a/src/AssemblySharedInfoGenerator/AssemblySharedInfo.cs b/src/AssemblySharedInfoGenerator/AssemblySharedInfo.cs index 997cd2d7505..c1df0ad9e2c 100644 --- a/src/AssemblySharedInfoGenerator/AssemblySharedInfo.cs +++ b/src/AssemblySharedInfoGenerator/AssemblySharedInfo.cs @@ -45,7 +45,7 @@ // to distinguish one build from another. AssemblyFileVersion is specified // in AssemblyVersionInfo.cs so that it can be easily incremented by the // automated build process. -[assembly: AssemblyVersion("2.2.0.4207")] +[assembly: AssemblyVersion("2.4.0.5965")] // By default, the "Product version" shown in the file properties window is @@ -64,4 +64,4 @@ // 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: AssemblyFileVersion("2.2.0.4207")] +[assembly: AssemblyFileVersion("2.4.0.5965")] diff --git a/src/DynamoCore/Graph/Workspaces/PackageDependencyInfo.cs b/src/DynamoCore/Graph/Workspaces/PackageDependencyInfo.cs index 3a0124af83c..3c38f5214ff 100644 --- a/src/DynamoCore/Graph/Workspaces/PackageDependencyInfo.cs +++ b/src/DynamoCore/Graph/Workspaces/PackageDependencyInfo.cs @@ -6,29 +6,45 @@ namespace Dynamo.Graph.Workspaces /// /// Enum containing the different types of package dependency states. /// - internal enum PackageDependencyState + public enum PackageDependencyState { Loaded, // Correct package and version loaded. IncorrectVersion, // Correct package but incorrect version. Missing, // package is completely missing. Warning, // Actual package is missing but the nodes are resolved by some other package. - RequiresRestart // Restart needed inorder to complete the uninstall of some package. + RequiresRestart // Restart needed in order to complete the uninstall of some package. + } + + /// + /// Interface for types containing info about a package + /// + public interface IPackageInfo + { + /// + /// Name of the package + /// + string Name { get; } + + /// + /// Version of the package + /// + Version Version { get; } } /// /// Class containing info about a package /// - public class PackageInfo + public class PackageInfo : IPackageInfo { /// /// Name of the package /// - internal string Name { get; set; } + public string Name { get; private set; } /// /// Version of the package /// - internal Version Version { get; set; } + public Version Version { get; internal set; } /// /// Create a package info object from the package name and version @@ -133,12 +149,17 @@ interface INodeLibraryDependencyInfo /// [Obsolete("This property is obsolete", false)] bool IsLoaded { get; set; } + + /// + /// The state of this dependency + /// + PackageDependencyState State { get; } } /// /// Class containing info about a workspace package dependency /// - internal class PackageDependencyInfo : INodeLibraryDependencyInfo + internal class PackageDependencyInfo : INodeLibraryDependencyInfo, IPackageInfo { private PackageDependencyState _state; /// @@ -154,7 +175,18 @@ internal class PackageDependencyInfo : INodeLibraryDependencyInfo /// /// Version of the package /// - public Version Version => PackageInfo.Version; + public Version Version + { + get + { + return PackageInfo.Version; + } + internal set + { + if(PackageInfo.Version != value) + PackageInfo.Version = value; + } + } /// /// Indicates whether this package is loaded in the current session diff --git a/src/DynamoCoreWpf/DynamoCoreWpf.csproj b/src/DynamoCoreWpf/DynamoCoreWpf.csproj index 273c3983b2e..2782a29710d 100644 --- a/src/DynamoCoreWpf/DynamoCoreWpf.csproj +++ b/src/DynamoCoreWpf/DynamoCoreWpf.csproj @@ -295,6 +295,7 @@ + diff --git a/src/DynamoCoreWpf/Extensions/ViewLoadedParams.cs b/src/DynamoCoreWpf/Extensions/ViewLoadedParams.cs index 075af04ea21..95438682412 100644 --- a/src/DynamoCoreWpf/Extensions/ViewLoadedParams.cs +++ b/src/DynamoCoreWpf/Extensions/ViewLoadedParams.cs @@ -49,6 +49,15 @@ public IRenderPackageFactory RenderPackageFactory get { return dynamoViewModel.RenderPackageFactoryViewModel.Factory; } } + /// + /// A reference to package install operations on the package manager + /// + public IPackageInstaller PackageInstaller + { + get { return dynamoViewModel.PackageManagerClientViewModel; } + } + + /// /// A reference to the Dynamo Window object. Useful for correctly setting the parent of a /// newly created window. @@ -82,7 +91,7 @@ public void AddMenuItem(MenuBarType type, MenuItem menuItem, int index = -1) /// Instance of the view extension object that is being added to the extensions side bar. /// Control UI element with a single piece of content of any type. /// - internal void AddToExtensionsSideBar(IViewExtension viewExtension, ContentControl contentControl) + public void AddToExtensionsSideBar(IViewExtension viewExtension, ContentControl contentControl) { TabItem tabItem = dynamoView.AddTabItem(viewExtension, contentControl); @@ -141,8 +150,8 @@ private void AddItemToMenu(MenuBarType type, Control itemToAdd, int index) } /// - /// Searchs for dynamo parent menu item. Parent item can be: - /// file menu, edit menu, view menu and help mebu bars. + /// Searches for dynamo parent menu item. Parent item can be: + /// file menu, edit menu, view menu and help menu bars. /// /// File, Edit, View or Help. private MenuItem SearchForMenuItem(MenuBarType type) diff --git a/src/DynamoCoreWpf/Properties/Resources.Designer.cs b/src/DynamoCoreWpf/Properties/Resources.Designer.cs index 2999762ee62..52971509cad 100644 --- a/src/DynamoCoreWpf/Properties/Resources.Designer.cs +++ b/src/DynamoCoreWpf/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace Dynamo.Wpf.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class Resources { @@ -3253,6 +3253,24 @@ public static string MessagePackageNewerDynamo { } } + /// + /// Looks up a localized string similar to {0} was not found and could not be downloaded.. + /// + public static string MessagePackageNotFound { + get { + return ResourceManager.GetString("MessagePackageNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version {0} of {1} could not be found.. + /// + public static string MessagePackageVersionNotFound { + get { + return ResourceManager.GetString("MessagePackageVersionNotFound", resourceCulture); + } + } + /// /// Looks up a localized string similar to You must select at least one custom node.. /// @@ -4367,24 +4385,6 @@ public static string PreviewText { } } - /// - /// Looks up a localized string similar to Provide Feedback. - /// - public static string ProvideFeedbackButton { - get { - return ResourceManager.GetString("ProvideFeedbackButton", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Could not re-direct to the Dynamo forum page for feedback:. - /// - public static string ProvideFeedbackError { - get { - return ResourceManager.GetString("ProvideFeedbackError", resourceCulture); - } - } - /// /// Looks up a localized string similar to Publish Online. /// diff --git a/src/DynamoCoreWpf/Properties/Resources.en-US.resx b/src/DynamoCoreWpf/Properties/Resources.en-US.resx index d62c475e159..710dedba11f 100644 --- a/src/DynamoCoreWpf/Properties/Resources.en-US.resx +++ b/src/DynamoCoreWpf/Properties/Resources.en-US.resx @@ -2207,15 +2207,9 @@ Restart Dynamo to complete the uninstall. Uninstall the following packages: {0}? - - Provide Feedback - This Feature is in Preview! - - Could not re-direct to the Dynamo forum page for feedback: - This package contains node(s) that depend on applications outside Dynamo. To fully utilize node(s) in this package, you will need to have these external applications installed. @@ -2228,6 +2222,12 @@ Uninstall the following packages: {0}? "The package {0} is already installed. To reinstall it, you must first uninstall it and restart to complete the uninstall. Would you like to mark {0} for uninstall?" + + {0} was not found and could not be downloaded. + + + Version {0} of {1} could not be found. + External Dependency (optional) diff --git a/src/DynamoCoreWpf/Properties/Resources.resx b/src/DynamoCoreWpf/Properties/Resources.resx index e8d32472ebf..14863f667f8 100644 --- a/src/DynamoCoreWpf/Properties/Resources.resx +++ b/src/DynamoCoreWpf/Properties/Resources.resx @@ -2210,15 +2210,9 @@ Restart Dynamo to complete the uninstall. Uninstall the following packages: {0}? - - Provide Feedback - This Feature is in Preview! - - Could not re-direct to the Dynamo forum page for feedback: - This package contains node(s) that depend on applications outside Dynamo. To fully utilize node(s) in this package, you will need to have these external applications installed. @@ -2231,6 +2225,12 @@ Uninstall the following packages: {0}? "The package {0} is already installed. To reinstall it, you must first uninstall it and restart to complete the uninstall. Would you like to mark {0} for uninstall?" + + {0} was not found and could not be downloaded. + + + Version {0} of {1} could not be found. + External Dependency (optional) diff --git a/src/DynamoCoreWpf/ViewModels/PackageManager/IPackageInstaller.cs b/src/DynamoCoreWpf/ViewModels/PackageManager/IPackageInstaller.cs new file mode 100644 index 00000000000..0ac19a6ecae --- /dev/null +++ b/src/DynamoCoreWpf/ViewModels/PackageManager/IPackageInstaller.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Dynamo.Graph.Workspaces; + +namespace Dynamo.ViewModels +{ + /// + /// An interface containing operations for installing Dynamo packages + /// + public interface IPackageInstaller + { + /// + /// Initiates download and install of a package + /// + /// Package Info of the package to be downloaded--includes package name and version + /// Path to download location of the package + void DownloadAndInstallPackage(IPackageInfo package, string downloadPath = null); + } +} diff --git a/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerClientViewModel.cs b/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerClientViewModel.cs index ca5a7a218d2..615dbcd0686 100644 --- a/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerClientViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerClientViewModel.cs @@ -17,9 +17,11 @@ using Dynamo.PackageManager; using Dynamo.PackageManager.UI; using Dynamo.Selection; +using Dynamo.Utilities; using Dynamo.Wpf.Interfaces; using Dynamo.Wpf.Properties; using Greg.AuthProviders; +using Greg.Responses; using Microsoft.Practices.Prism.Commands; namespace Dynamo.ViewModels @@ -165,7 +167,7 @@ private void ShowTermsOfUseForPublishing() /// A thin wrapper on the Greg rest client for performing IO with /// the Package Manager /// - public class PackageManagerClientViewModel : NotificationObject + public class PackageManagerClientViewModel : NotificationObject, IPackageInstaller { #region Properties/Fields @@ -441,6 +443,232 @@ public List ListAll() return CachedPackageList; } + /// + /// Download and install a specific package from the package manager + /// + /// + /// + public void DownloadAndInstallPackage(IPackageInfo packageInfo, string downloadPath = null) + { + // User needs to accept terms of use before any packages can be downloaded from package manager + var prefSettings = DynamoViewModel.Model.PreferenceSettings; + var touAccepted = prefSettings.PackageDownloadTouAccepted; + if (!touAccepted) + { + touAccepted = TermsOfUseHelper.ShowTermsOfUseDialog(false, null); + prefSettings.PackageDownloadTouAccepted = touAccepted; + if (!touAccepted) + { + return; + } + } + + // Try to get the package header for this package + var header = Model.GetPackageHeader(packageInfo); + if (header == null) + { + var result = MessageBox.Show(string.Format(Resources.MessagePackageNotFound, packageInfo.Name), + Resources.PackageDownloadErrorMessageBoxTitle, + MessageBoxButton.OKCancel, MessageBoxImage.Question); + return; + } + + // Try to get the package version for this package + var version = Model.GetGregPackageVersion(header, packageInfo.Version); + if (version == null) + { + var result = MessageBox.Show(string.Format(Resources.MessagePackageVersionNotFound, packageInfo.Version.ToString(), packageInfo.Name), + Resources.PackageDownloadErrorMessageBoxTitle, + MessageBoxButton.OKCancel, MessageBoxImage.Question); + return; + } + + ExecutePackageDownload(packageInfo.Name, version, downloadPath); + } + + private string JoinPackageNames(IEnumerable pkgs) + { + return String.Join(", ", pkgs.Select(x => x.Name + " " + x.VersionName)); + } + + internal void ExecutePackageDownload(string name, PackageVersion version, string downloadPath) + { + string msg = String.IsNullOrEmpty(downloadPath) ? + String.Format(Resources.MessageConfirmToInstallPackage, name, version.version) : + String.Format(Resources.MessageConfirmToInstallPackageToFolder, name, version.version, downloadPath); + + var result = MessageBox.Show(msg, + Resources.PackageDownloadConfirmMessageBoxTitle, + MessageBoxButton.OKCancel, MessageBoxImage.Question); + + var pmExt = DynamoViewModel.Model.GetPackageManagerExtension(); + if (result == MessageBoxResult.OK) + { + // get all of the headers + var headers = version.full_dependency_ids.Select(dep => dep._id).Select((id) => + { + PackageHeader pkgHeader; + var res = Model.DownloadPackageHeader(id, out pkgHeader); + + if (!res.Success) + MessageBox.Show(String.Format(Resources.MessageFailedToDownloadPackage, id), + Resources.PackageDownloadErrorMessageBoxTitle, + MessageBoxButton.OK, MessageBoxImage.Error); + + return pkgHeader; + }).ToList(); + + // if any header download fails, abort + if (headers.Any(x => x == null)) + { + return; + } + + var allPackageVersions = PackageManagerSearchElement.ListRequiredPackageVersions(headers, version); + + // determine if any of the packages contain binaries or python scripts. + var containsBinaries = + allPackageVersions.Any( + x => x.Item2.contents.Contains(PackageManagerClient.PackageContainsBinariesConstant) || x.Item2.contains_binaries); + + var containsPythonScripts = + allPackageVersions.Any( + x => x.Item2.contents.Contains(PackageManagerClient.PackageContainsPythonScriptsConstant)); + + // if any do, notify user and allow cancellation + if (containsBinaries || containsPythonScripts) + { + var res = MessageBox.Show(Resources.MessagePackageContainPythonScript, + Resources.PackageDownloadMessageBoxTitle, + MessageBoxButton.OKCancel, MessageBoxImage.Exclamation); + + if (res == MessageBoxResult.Cancel) return; + } + + // Determine if there are any dependencies that are made with a newer version + // of Dynamo (this includes the root package) + var dynamoVersion = DynamoViewModel.Model.Version; + var dynamoVersionParsed = VersionUtilities.PartialParse(dynamoVersion, 3); + var futureDeps = allPackageVersions.FilterFuturePackages(dynamoVersionParsed); + + // If any of the required packages use a newer version of Dynamo, show a dialog to the user + // allowing them to cancel the package download + if (futureDeps.Any()) + { + var versionList = FormatPackageVersionList(futureDeps); + + if (MessageBox.Show(String.Format(Resources.MessagePackageNewerDynamo, + DynamoViewModel.BrandingResourceProvider.ProductName, + versionList), + string.Format(Resources.PackageUseNewerDynamoMessageBoxTitle, + DynamoViewModel.BrandingResourceProvider.ProductName), + MessageBoxButton.OKCancel, + MessageBoxImage.Warning) == MessageBoxResult.Cancel) + { + return; + } + } + + var localPkgs = pmExt.PackageLoader.LocalPackages; + + var uninstallsRequiringRestart = new List(); + var uninstallRequiringUserModifications = new List(); + var immediateUninstalls = new List(); + + // if a package is already installed we need to uninstall it, allowing + // the user to cancel if they do not want to uninstall the package + foreach (var localPkg in headers.Select(x => localPkgs.FirstOrDefault(v => v.Name == x.name))) + { + if (localPkg == null) continue; + + if (localPkg.LoadedAssemblies.Any()) + { + uninstallsRequiringRestart.Add(localPkg); + continue; + } + + if (localPkg.InUse(DynamoViewModel.Model)) + { + uninstallRequiringUserModifications.Add(localPkg); + continue; + } + + immediateUninstalls.Add(localPkg); + } + + if (uninstallRequiringUserModifications.Any()) + { + MessageBox.Show(String.Format(Resources.MessageUninstallToContinue, + DynamoViewModel.BrandingResourceProvider.ProductName, + JoinPackageNames(uninstallRequiringUserModifications)), + Resources.CannotDownloadPackageMessageBoxTitle, + MessageBoxButton.OK, MessageBoxImage.Error); + return; + } + + var settings = DynamoViewModel.Model.PreferenceSettings; + + if (uninstallsRequiringRestart.Any()) + { + + var message = string.Format(Resources.MessageUninstallToContinue2, + DynamoViewModel.BrandingResourceProvider.ProductName, + JoinPackageNames(uninstallsRequiringRestart), + name + " " + version.version); + // different message for the case that the user is + // trying to install the same package/version they already have installed. + if (uninstallsRequiringRestart.Count == 1 && + uninstallsRequiringRestart.First().Name == name && + uninstallsRequiringRestart.First().VersionName == version.version) + { + message = String.Format(Resources.MessageUninstallSamePackage, name + " " + version.version); + } + var dialogResult = MessageBox.Show(message, + Resources.CannotDownloadPackageMessageBoxTitle, + MessageBoxButton.YesNo, MessageBoxImage.Error); + + if (dialogResult == MessageBoxResult.Yes) + { + // mark for uninstallation + uninstallsRequiringRestart.ForEach(x => x.MarkForUninstall(settings)); + } + return; + } + + if (immediateUninstalls.Any()) + { + // if the package is not in use, tell the user we will be uninstall it and give them the opportunity to cancel + if (MessageBox.Show(String.Format(Resources.MessageAlreadyInstallDynamo, + DynamoViewModel.BrandingResourceProvider.ProductName, + JoinPackageNames(immediateUninstalls)), + Resources.DownloadWarningMessageBoxTitle, + MessageBoxButton.OKCancel, MessageBoxImage.Warning) == MessageBoxResult.Cancel) + return; + } + + // add custom path to custom package folder list + if (!String.IsNullOrEmpty(downloadPath)) + { + if (!settings.CustomPackageFolders.Contains(downloadPath)) + settings.CustomPackageFolders.Add(downloadPath); + } + + // form header version pairs and download and install all packages + allPackageVersions + .Select(x => new PackageDownloadHandle(x.Item1, x.Item2)) + .ToList() + .ForEach(x => DownloadAndInstall(x, downloadPath)); + } + } + + /// + /// Returns a newline delimited string representing the package name and version of the argument + /// + public static string FormatPackageVersionList(IEnumerable> packages) + { + return String.Join("\r\n", packages.Select(x => x.Item1.name + " " + x.Item2.version)); + } + /// /// This method downloads the package represented by the PackageDownloadHandle, /// uninstalls its current installation if necessary, and installs the package. diff --git a/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerSearchViewModel.cs b/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerSearchViewModel.cs index 4d67ba68948..d84fcddf81c 100644 --- a/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerSearchViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerSearchViewModel.cs @@ -586,180 +586,9 @@ private void ClearSearchResults() this.SearchResults.Clear(); } - private string JoinPackageNames(IEnumerable pkgs) - { - return String.Join(", ", pkgs.Select(x => x.Name + " " + x.VersionName)); - } - private void PackageOnExecuted(PackageManagerSearchElement element, PackageVersion version, string downloadPath) { - string msg = String.IsNullOrEmpty(downloadPath) ? - String.Format(Resources.MessageConfirmToInstallPackage, element.Name, version.version) : - String.Format(Resources.MessageConfirmToInstallPackageToFolder, element.Name, version.version, downloadPath); - - var result = MessageBox.Show(msg, - Resources.PackageDownloadConfirmMessageBoxTitle, - MessageBoxButton.OKCancel, MessageBoxImage.Question); - - var pmExt = PackageManagerClientViewModel.DynamoViewModel.Model.GetPackageManagerExtension(); - if (result == MessageBoxResult.OK) - { - // get all of the headers - var headers = version.full_dependency_ids.Select(dep => dep._id).Select((id) => - { - PackageHeader pkgHeader; - var res = pmExt.PackageManagerClient.DownloadPackageHeader(id, out pkgHeader); - - if (!res.Success) - MessageBox.Show(String.Format(Resources.MessageFailedToDownloadPackage, id), - Resources.PackageDownloadErrorMessageBoxTitle, - MessageBoxButton.OK, MessageBoxImage.Error); - - return pkgHeader; - }).ToList(); - - // if any header download fails, abort - if (headers.Any(x => x == null)) - { - return; - } - - var allPackageVersions = PackageManagerSearchElement.ListRequiredPackageVersions(headers, version); - - // determine if any of the packages contain binaries or python scripts. - var containsBinaries = - allPackageVersions.Any( - x => x.Item2.contents.Contains(PackageManagerClient.PackageContainsBinariesConstant) || x.Item2.contains_binaries); - - var containsPythonScripts = - allPackageVersions.Any( - x => x.Item2.contents.Contains(PackageManagerClient.PackageContainsPythonScriptsConstant)); - - // if any do, notify user and allow cancellation - if (containsBinaries || containsPythonScripts) - { - var res = MessageBox.Show(Resources.MessagePackageContainPythonScript, - Resources.PackageDownloadMessageBoxTitle, - MessageBoxButton.OKCancel, MessageBoxImage.Exclamation); - - if (res == MessageBoxResult.Cancel) return; - } - - // Determine if there are any dependencies that are made with a newer version - // of Dynamo (this includes the root package) - var dynamoVersion = this.PackageManagerClientViewModel.DynamoViewModel.Model.Version; - var dynamoVersionParsed = VersionUtilities.PartialParse(dynamoVersion, 3); - var futureDeps = allPackageVersions.FilterFuturePackages(dynamoVersionParsed); - - // If any of the required packages use a newer version of Dynamo, show a dialog to the user - // allowing them to cancel the package download - if (futureDeps.Any()) - { - var versionList = FormatPackageVersionList(futureDeps); - - if (MessageBox.Show(String.Format(Resources.MessagePackageNewerDynamo, - PackageManagerClientViewModel.DynamoViewModel.BrandingResourceProvider.ProductName, - versionList), - string.Format(Resources.PackageUseNewerDynamoMessageBoxTitle, - PackageManagerClientViewModel.DynamoViewModel.BrandingResourceProvider.ProductName), - MessageBoxButton.OKCancel, - MessageBoxImage.Warning) == MessageBoxResult.Cancel) - { - return; - } - } - - var localPkgs = pmExt.PackageLoader.LocalPackages; - - var uninstallsRequiringRestart = new List(); - var uninstallRequiringUserModifications = new List(); - var immediateUninstalls = new List(); - - // if a package is already installed we need to uninstall it, allowing - // the user to cancel if they do not want to uninstall the package - foreach (var localPkg in headers.Select(x => localPkgs.FirstOrDefault(v => v.Name == x.name))) - { - if (localPkg == null) continue; - - if (localPkg.LoadedAssemblies.Any()) - { - uninstallsRequiringRestart.Add(localPkg); - continue; - } - - if (localPkg.InUse(this.PackageManagerClientViewModel.DynamoViewModel.Model)) - { - uninstallRequiringUserModifications.Add(localPkg); - continue; - } - - immediateUninstalls.Add(localPkg); - } - - if (uninstallRequiringUserModifications.Any()) - { - MessageBox.Show(String.Format(Resources.MessageUninstallToContinue, - PackageManagerClientViewModel.DynamoViewModel.BrandingResourceProvider.ProductName, - JoinPackageNames(uninstallRequiringUserModifications)), - Resources.CannotDownloadPackageMessageBoxTitle, - MessageBoxButton.OK, MessageBoxImage.Error); - return; - } - - var settings = PackageManagerClientViewModel.DynamoViewModel.Model.PreferenceSettings; - - if (uninstallsRequiringRestart.Any()) - { - - var message = string.Format(Resources.MessageUninstallToContinue2, - PackageManagerClientViewModel.DynamoViewModel.BrandingResourceProvider.ProductName, - JoinPackageNames(uninstallsRequiringRestart), - element.Name + " " + version.version); - // different message for the case that the user is - // trying to install the same package/version they already have installed. - if(uninstallsRequiringRestart.Count == 1 && - uninstallsRequiringRestart.First().Name == element.Name && - uninstallsRequiringRestart.First().VersionName == version.version) - { - message = String.Format(Resources.MessageUninstallSamePackage, element.Name + " " + version.version); - } - var dialogResult = MessageBox.Show(message, - Resources.CannotDownloadPackageMessageBoxTitle, - MessageBoxButton.YesNo, MessageBoxImage.Error); - - if (dialogResult == MessageBoxResult.Yes) - { - // mark for uninstallation - uninstallsRequiringRestart.ForEach(x => x.MarkForUninstall(settings)); - } - return; - } - - if (immediateUninstalls.Any()) - { - // if the package is not in use, tell the user we will be uninstall it and give them the opportunity to cancel - if (MessageBox.Show(String.Format(Resources.MessageAlreadyInstallDynamo, - PackageManagerClientViewModel.DynamoViewModel.BrandingResourceProvider.ProductName, - JoinPackageNames(immediateUninstalls)), - Resources.DownloadWarningMessageBoxTitle, - MessageBoxButton.OKCancel, MessageBoxImage.Warning) == MessageBoxResult.Cancel) - return; - } - - // add custom path to custom package folder list - if (!String.IsNullOrEmpty(downloadPath)) - { - if (!settings.CustomPackageFolders.Contains(downloadPath)) - settings.CustomPackageFolders.Add(downloadPath); - } - - // form header version pairs and download and install all packages - allPackageVersions - .Select(x => new PackageDownloadHandle(x.Item1, x.Item2)) - .ToList() - .ForEach(x => this.PackageManagerClientViewModel.DownloadAndInstall(x, downloadPath)); - - } + this.PackageManagerClientViewModel.ExecutePackageDownload(element.Name, version, downloadPath); } /// diff --git a/src/DynamoPackages/PackageLoader.cs b/src/DynamoPackages/PackageLoader.cs index 2010f63b64f..e6142bc411e 100644 --- a/src/DynamoPackages/PackageLoader.cs +++ b/src/DynamoPackages/PackageLoader.cs @@ -4,7 +4,6 @@ using System.Linq; using System.Reflection; using Dynamo.Core; -using Dynamo.Engine; using Dynamo.Exceptions; using Dynamo.Extensions; using Dynamo.Interfaces; diff --git a/src/DynamoPackages/PackageManagerClient.cs b/src/DynamoPackages/PackageManagerClient.cs index c76e503a807..a1b2a537fc2 100644 --- a/src/DynamoPackages/PackageManagerClient.cs +++ b/src/DynamoPackages/PackageManagerClient.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using Dynamo.Graph.Workspaces; using Greg; using Greg.Requests; using Greg.Responses; @@ -89,6 +90,41 @@ internal IEnumerable ListAll() }, new List()); } + /// + /// Gets the PackageHeader for a specific package + /// + /// + /// + internal PackageHeader GetPackageHeader(IPackageInfo packageInfo) + { + var header = FailFunc.TryExecute(() => + { + var nv = new HeaderDownload("dynamo", packageInfo.Name); + var pkgResponse = this.client.ExecuteAndDeserializeWithContent(nv); + return pkgResponse.content; + }, null); + + return header; + } + + /// + /// Gets the Greg PackageVersion object for a specific version of a package + /// + /// + /// + /// + internal PackageVersion GetGregPackageVersion(PackageHeader header, Version version) + { + foreach (var v in header.versions) + { + if (new Version(v.version) == version) + { + return v; + } + } + return null; + } + /// /// Make a call to Package Manager to get the known /// supported hosts for package publishing and filtering diff --git a/src/WorkspaceDependencyViewExtension/Properties/AssemblyInfo.cs b/src/WorkspaceDependencyViewExtension/Properties/AssemblyInfo.cs index 45a919ae249..518d2001255 100644 --- a/src/WorkspaceDependencyViewExtension/Properties/AssemblyInfo.cs +++ b/src/WorkspaceDependencyViewExtension/Properties/AssemblyInfo.cs @@ -9,3 +9,6 @@ // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("5e76aab3-6302-473e-9655-081b53fb1419")] + +// Visible to DynamoCoreWpfTests dll for unit testing +[assembly: InternalsVisibleTo("DynamoCoreWpfTests")] \ No newline at end of file diff --git a/src/WorkspaceDependencyViewExtension/Properties/Resources.Designer.cs b/src/WorkspaceDependencyViewExtension/Properties/Resources.Designer.cs index 31958cb8a63..6ddbcddd729 100644 --- a/src/WorkspaceDependencyViewExtension/Properties/Resources.Designer.cs +++ b/src/WorkspaceDependencyViewExtension/Properties/Resources.Designer.cs @@ -19,10 +19,10 @@ namespace Dynamo.WorkspaceDependency.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { + public class Resources { private static global::System.Resources.ResourceManager resourceMan; @@ -36,7 +36,7 @@ internal Resources() { /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { + public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Dynamo.WorkspaceDependency.Properties.Resources", typeof(Resources).Assembly); @@ -51,7 +51,7 @@ internal Resources() { /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { + public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } @@ -60,13 +60,124 @@ internal Resources() { } } + /// + /// Looks up a localized string similar to Error from WorkspaceDependencyViewExtension: {0}. + /// + public static string DependencyViewExtensionErrorTemplate { + get { + return ResourceManager.GetString("DependencyViewExtensionErrorTemplate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Some nodes in this graph were originally created with {0} v{1}, which you do not have installed. Instead you have a different version of {0} installed, would you keep the installed version?. + /// + public static string DetailsMessageIncorrectVersion { + get { + return ResourceManager.GetString("DetailsMessageIncorrectVersion", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} {1} is installed and loaded.. + /// + public static string DetailsMessageLoaded { + get { + return ResourceManager.GetString("DetailsMessageLoaded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This graph depends on {0} {1}. Would you like to download and install this package?. + /// + public static string DetailsMessageMissing { + get { + return ResourceManager.GetString("DetailsMessageMissing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Some nodes in this graph were originally created with {0} v{1}, which you do not have installed. You may have a different version of {0} installed, or you may have a different package which resolves these nodes.. + /// + public static string DetailsMessageWarning { + get { + return ResourceManager.GetString("DetailsMessageWarning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Install Specified Version. + /// + public static string InstallButtonText { + get { + return ResourceManager.GetString("InstallButtonText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Keep Installed Version. + /// + public static string KeepLocalButtonText { + get { + return ResourceManager.GetString("KeepLocalButtonText", resourceCulture); + } + } + /// /// Looks up a localized string similar to Show Graph Package Dependency. /// - internal static string MenuItemString { + public static string MenuItemString { get { return ResourceManager.GetString("MenuItemString", resourceCulture); } } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap NodeLibraryDependency_Loaded { + get { + object obj = ResourceManager.GetObject("NodeLibraryDependency_Loaded", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap NodeLibraryDependency_Missing { + get { + object obj = ResourceManager.GetObject("NodeLibraryDependency_Missing", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap NodeLibraryDependency_Warning { + get { + object obj = ResourceManager.GetObject("NodeLibraryDependency_Warning", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized string similar to Provide Feedback. + /// + public static string ProvideFeedbackButton { + get { + return ResourceManager.GetString("ProvideFeedbackButton", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Could not redirect to the Dynamo forum page for feedback:. + /// + public static string ProvideFeedbackError { + get { + return ResourceManager.GetString("ProvideFeedbackError", resourceCulture); + } + } } } diff --git a/src/WorkspaceDependencyViewExtension/Properties/Resources.en-US.resx b/src/WorkspaceDependencyViewExtension/Properties/Resources.en-US.resx index 29528b72713..83cf6d7c78c 100644 --- a/src/WorkspaceDependencyViewExtension/Properties/Resources.en-US.resx +++ b/src/WorkspaceDependencyViewExtension/Properties/Resources.en-US.resx @@ -117,7 +117,249 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Error from WorkspaceDependencyViewExtension: {0} + + + Some nodes in this graph were originally created with {0} v{1}, which you do not have installed. Instead you have a different version of {0} installed, would you keep the installed version? + + + {0} {1} is installed and loaded. + + + This graph depends on {0} {1}. Would you like to download and install this package? + + + Some nodes in this graph were originally created with {0} v{1}, which you do not have installed. You may have a different version of {0} installed, or you may have a different package which resolves these nodes. + + + Install Specified Version + + + Keep Installed Version + Show Graph Package Dependency + + + + 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 + /fU/gZr5x/j8g1IAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAAS0AAAEsCAYAAACWv+VLAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAu + IwAALiMBeKU/dgAAFIRJREFUeF7t3cuRHMkRhGGKQBFWBIqwovBGirMiQASKQBFw45Ui0GwFANO53gQw + +AfTj8qqyAw/fGZrMdPdlRGegYctbP705cuXiIhlYDEioiosRkRUhcWIiKqwGBFRFRYjIqrCYkREVViM + iKgKixERVWExIqIqLEZEVIXFiIiqsBgRURUWIyKqwmJERFVYjIioCosREVVhMSKiKixGRFSFxYiIqrAY + EVEVFiMiqsJiRERVWIyIqAqLERFVYTEioios7uhff//br0Jfi1hdp3xjcQce4qfhP8OXN/49/Db8Qq+N + qG5k95ZvZZnyra/9hV67OiyubAzql+Gfw9tBvkfD/TO9V0Q1yurwD2f3HvrerfKNxVWN4ehXH/qd1Uf0 + K9OWvyrFPpTR4Zl86zXb5BuLKxpD+es3Q3rGVoONvSibzihl9x7b5BuLqxnDeHVh3WRxRTnKpLNJmX3E + FvnG4krGEI5aWDdZXFGGsuhMUlafsXy+sbiK0fyjF9ZNFldcThl0Fimjr1g631hcwWj6rIV1k8UVl1H2 + nEHK5hGWzTcWqxvNnr2wbrK44nTKnLNHmTzSkvnGYmWjyWctrJssrjiNsubMURZnWC7fWKxqNPfshXWT + xRXTKWPOGmVwpqXyjcWKRlOvWlg3WVwxjbLljFH2zrBMvrFYzWjm1QvrJosrDqdMOVuUuTMtkW8sVjKa + WGVh3WRxxWGUJWeKsnaF8vnGYhWjedUW1k0WV7xMGXKWKGNXKp1vLFYwmlZ1Yd1kccXTlB1niLJVQdl8 + Y/Fqo1nVF9ZNFlc8TJlxdihTlZTMNxavNJq0ysK6yeKKuykrzgxlqaJy+cbiVUZzVltYN1lc8SFlxFmh + DFVWKt9YvMJoyqoL6yaLK96lbDgjlJ0VlMk3Fs82mrH6wrrJ4oofKBPOBmVmJSXyjcUzjSbssrBusrji + /5QFZ4KysqLL843Fs+jwbgI1Z2VZXJF8T4LFM+jQPjw1ZQdZXI1p9s4AZWMHl+Ubi7ONw+rHfO080Jss + roY0c8+eMrETnfH0H0+GxdnGQR/5uYSry+JqRLP2zCkLO/pEfZgJizONQ+pnE9Lhd5bF1YBm7FlTBnZ2 + 6k9qx+JM44CP/HTcnWRxbUyz9Yxp9rv7jXoyCxZnGgfsOljJ4tqQZurZ0sw7+Ex9mQWLs4zD6S/g6dCd + ZHFtRLP0TGnWbbzty0xYnGUcruPfZ5Esrg1ohp4lzbiVt72ZCYuzjMNlaX2VxbUwzc4zpNm287Y/M2Fx + lnG4/PHwe1lcC9LMPDuaaUtvezQTFmcaB8ywv5fFtRDNyjOjWXa171/EyzjgpzcHjiyuJWhGnhXNsLPt + /5eH/L0Wy+IqTLPxjGh23e39P5fKOGSnf8bziCyugjQTz4Zm1t2pv8sSLM42DtrlH0w/I4urEM3CM6FZ + dfd56PEPpmUcNmF4XxZXAZqBZ0Ez6u6yjGLxLDq0D09N6S6L60LqvWdAs+nu0mxi8Uw6vJtAzekui+sC + 6rl7TzPp7vJMYvFsaoKbQU3qLovrROq1e06z6K5EFrF4BTXDTaFmdZfFdQL12L2mGXRXJoNYvIqa4uZQ + 07rL4ppIvXWPqffdlcoeFq+k5rhJ1LzusrgmUE/dW+p5d+Uyh8WrqUluFjWxuyyuA6mX7in1uruSWcNi + BWqWm0bN7C6L6wDqoXtJPe6ubMawWIWa5uZRU7vL4nqBeuceUm+7K50tLFai5rmJ1NzusrieoJ65d9TT + 7spnCovVqIluJjW5uyyuB6hX7hn1srslsoTFitRMN5Wa3V0W1x3UI/eKetjdMhnCYlVqqptLTe8ui+sn + 1Bv3iHrX3VLZwWJlaq6bTM3vLosLqCfuDfWsu+Uyg8Xq1GQ3m4bQXRbXN9QL94R61d2SWcHiCtRsN52G + 0V0W16AeuBfUo+6WzQgWV6Gmu/k0lO5aLy6d3T2g3nS3dDawuBI130Og4XTXcnHpzD479aS75TOBxdVo + CB4GDam7VotLZ/WZqRfdbZEFLK5Iw/BQaFjdtVhcOqPPSj3obpsMYHFVGoqHQ0PrbuvFpbP5jHT27raa + PRZXpuF4SDS87rZcXDqTz0Zn7m67mWNxdRqSh0VD7G6rEOssPhOdtbvtFpZgcQcalodGw+xuizDrDD4L + nbG7LReWYHEXGpqHR0PtbulQ69l9Bjpbd9suLMHiTjQ8D5GG292S4dYz+9npTN1tvbAEi7vRED1MGnJ3 + S4Vcz+pnprN0t/3CEizuSMP0UGnY3S0Rdj2jn5XO0F2LhSVY3JWG6uHS0LsrHXo9m5+Rnr27NgtLsLgz + DddDpuF3VzL8eiY/Gz1zd60WlmBxdxqyh00h6K7UJdCz+JnoWbtrt7AEix1o2B46haG7EpdBz+BnoWfs + ruXCEix2oaF7+BSK7i69FPpsPwM9W3dtF5ZgsRMN3yGgcHR3yeXQZ/qz6Zm6a72wBIvdKAQOA4Wku1Mv + iT7Ln0nP0l37hSVY7EhhcCgoLN2dcln0Gf4seobusrAMi10pFA4Hhaa7qZdG7+3PoM/uLgvrG1jsTOFw + SCg83U25PHpPvzd9ZndZWG9gsTuFxGGhEHV36CXSe/k96bO6y8ICWIxcpg8ccpn0Hn4v+ozusrDegcX4 + g0Lj8FCounvpUum1fg967+6ysH4Ci/GVwuMQUbi6e+py6TV+Lb1nd1lYH8BifE8hcpgoZN09dMn0vX4N + vVd3WVh3wGL8SGFyqChs3d112fQ9/l56j+6ysO6ExWAKlcNFoevup5dOX/P30Gu7y8J6ABbjfQqXQ0bh + 6w4vn2r+Gr2muyysB2Exfk4hc9gohN19dwn1367R93aXhfUELMbHFDaHjsLY3f8uo6VHLAvrSViM+yh0 + Dh+Fsrvfjb7WXRbWC7AY91P4HEIKZ8RbWVgvwmI8RiF0GCmkETdZWAfAYjxOYXQoKawRWVgHwWI8R6F0 + OCm00VcW1oGwGM9TOB1SCm/0k4V1MCzGaxRSh5VCHH1kYU2AxXidwurQUphjf1lYk2AxjqHQOrwU6thX + FtZEWIzjKLwOMYU79pOFNRkW41gKscNMIY99ZGGdAItxPIXZoaawx/qysE6CxZhDoXa4KfSxriysE2Ex + 5lG4HXIKf6wnC+tkWIy5FHKHnS5BrCML6wJYjPkUdoeeLkPUl4V1ESzGORR6h58uRdSVhXUhLMZ5FH5f + ArocUU8W1sWwGOfSJfBloEsSdWRhFYDFOJ8ugy8FXZa4XhZWEViMa+hS+HLQpYnrZGEVgsW4ji6HLwld + njhfFlYxWIxr6ZL4stAlivNkYRWExbieLosvDV2mmC8LqygsRg26NL48dKliniyswrAYdejy+BLR5Yrj + ZWEVh8WoRZfIl4kuWRwnC2sBWIx6dJl8qeiyxeuysBaBxahJl8qXiy5dPC8LayFYjLp0uXzJ6PLF47Kw + FoPFqE2XzJeNLmHcLwtrQViM+nTZfOnoMsbHsrAWhcVYgy6dLx9dynhfFtbCsBjr0OXzJaTLGT/Kwloc + FmMtuoS+jHRJ46ssrA1gMdajyzj87ssZP1JvsrA2gMVYjy6kLyZd2MjS2gYWYy26jEP+ePix/PFwA1iM + degS+jLSJY0fZXEtDouxBl0+X0K6nPG+LK6FYTHq06Xz5aNLGR/L4loUFqM2XTZfOrqMcb8srgVhMerS + JfNlo0sYj8viWgwWoyZdLl8yunzxvCyuhWAx6tGl8uWiSxevy+JaBBajFl0mXyq6bHGcLK4FYDHq0CXy + ZaJLFsfL4ioOi1GDLo8vEV2umCeLqzAsxvV0aXx56FLFfFlcRWExrqXL4ktDlynOk8VVEBbjOrokvix0 + ieJ8WVzFYDGuocvhS0KXJ66TxVUIFuN8uhS+HHRp4npZXEVgMc6ly+BLQZcl6sjiKgCLcR5dAl8GuiRR + TxbXxbAY51D4fQnockRdWVwXwmLMp9A7/HQpor4srotgMeZS2B16ugyxjiyuC2Ax5lHIHXa6BLGeLK6T + YTHmULgdcgp/rCuL60RYjOMp1A43hT7Wl8V1EizGsRRmh5rCHvvI4joBFuM4CrHDTCGP/WRxTYbFOIbC + 6xBTuGNfWVwTYTFep9A6vBTq2F8W1yRYjNcorA4thTn6yOKaAIvxPIXUYaUQRz9ZXAfDYjxH4XRIKbzR + VxbXgbAYj1MoHU4KbUQW10GwGI9RGB1KCmvETRbXAbAY91MIHUYKacRbWVwvwmLcR+FzCCmc3f1u9LXu + srhegMX4mELn8FEou/vfpbT0iGVxPQmL8XMKm0NHYezuu8uo/3aNvre7LK4nYDHep5A5bBTC7vASquav + 0Wu6y+J6EBaDKVwOGYWvu59ePn3N30Ov7S6L6wFYjB8pVA4Xha67uy6dvsffS+/RXRbXnbAY31OYHCoK + W3cPXTZ9r19D79VdFtcdsBhfKUQOE4Wsu6cumV7j19J7dpfF9QEsxh8UHoeIwtXdS5dLr/V70Ht3l8X1 + E1iMXKoPHHKp9B5+L/qM7rK43oHF7hQWh4bC1N2hl0nv5fekz+ouiwtgsTOFxGGhEHU35RLpPf3e9Jnd + ZXG9gcWuFA6HhMLT3dTLo/f2Z9Bnd5fF9Q0sdqRQOBwUmu5OuTT6DH8WPUN3WVyGxW4UBoeCwtLdqZdF + n+XPpGfpLotrwGInCoHDQCHp7pJLos/0Z9Mzddd+cWGxCw3fIaBwdHfp5dBn+xno2bprvbiw2IGG7uFT + KLorcSn0DH4Wesbu2i4uLO5Ow/bQKQzdlboMehY/Ez1rdy0XFxZ3piF72BSC7kpeAj2Tn42eubt2iwuL + u9JwPWQafnelw69n8zPSs3fXanFhcUcaqodLQ+9uidDrGf2sdIbu2iwuLO5Gw/RQadjdLRV2Paufmc7S + XYvFhcWdaIgeJg25uyVDrmf2s9OZutt+cWFxFxqeh0jD7W7pcOvZfQY6W3dbLy4s7kBD8/BoqN1tEWqd + wWehM3a37eLC4uo0LA+NhtndVmHWWXwmOmt3Wy4uLK5MQ/KwaIjdbRlinclnozN3t93MsbgqDcdDouF1 + t+XCutHZfEY6e3dbzR6LK9JQPBwaWndbL6wbndFnpR50t00GsLgaDcNDoWF112Jh3eisPjP1orstsoDF + lWgIHgYNqbtWC+tGZ/bZqSfdLZ8JLK5CzfcQaDjdtVxYNzq7e0C96W7pbGBxBWq6m09D6a71wrpRD9wL + 6lF3y2YEi9Wp2W46DaO7LKxvqBfuCfWquyWzgsXK1GQ3m4bQXRYWUE/cG+pZd8tlBotVqbluMjW/uyys + n1Bv3CPqXXdLZQeLFampbi41vbssrDuoR+4V9bC7ZTKExWrUTDeVmt1dFtYD1Cv3jHrZ3RJZwmIlaqKb + SU3uLgvrCeqZe0c97a58prBYhZrnJlJzu8vCeoF65x5Sb7srnS0sVqCmuXnU1O6ysA6gHrqX1OPuymYM + i1dTs9w0amZ3WVgHUi/dU+p1dyWzhsUrqUluFjWxuyysCdRT95Z63l25zGHxKmqOm0TN6y4LayL11j2m + 3ndXKntYvIKa4uZQ07rLwjqBeuxe0wy6K5NBLJ5NzXBTqFndZWGdSL12z2kW3ZXIIhbPpCa4GdSk7rKw + LqCeu/c0k+4uzyQWz6LDuwnUnO6ysC6k3nsGNJvuLs0mFs+gQ/vw1JTusrAK0Aw8C5pRd5dlFIuzjcP+ + 4kNTM7rLwipEs/BMaFbdfR7+TH2bCYuzjYP+85uDx1dZWAVpJp4Nzay736hnM2FxpnHIX98cOv6QhVWY + ZuMZ0ey6+4V6NgsWZxoH/PTmwJGFtQTNyLOiGXZ26u+2sDjTOGCG/r0srIVoVp4ZzbKrz9SrWbA4yzic + /gKeDt1VFtaCNDPPjmba0tsezYTFWcbh8vdZX2VhLUyz8wxptu287c9MWJxlHC5L6w9ZWBvQDD1LmnEr + b3szExZnGYfLHw+zsLaiWXqmNOs23vZlJizONA7YecBZWBvSTD1bmnkH+/5FvIwD/uPNgbvIwtqYZusZ + 0+x3t/3/8tDx77WysBrQjD1rysDO9v6fS2UcstM/48nCakSz9swpCzv6RH2YCYuzjYN2+QfTWVgNaeae + PWViJzpjj38wLeOwuw82C6sxzd4ZoGzs4LJ8Y/EsOrQPT01ZWRZWJN+TYPFMOrybQM1ZURZW/J+y4ExQ + VlZ0eb6xeDY1wc2gJq0kCyt+oEw4G5SZlZTINxavoGa4KdSsFWRhxbuUDWeEsrOCMvnG4lXUFDeHmlZZ + FlZ8SBlxVihDlZXKNxavpOa4SdS8irKw4m7KijNDWaqoXL6xeDU1yc2iJlaShRUPU2acHcpUJSXzjcUK + 1Cw3jZpZQRZWPE3ZcYYoWxWUzTcWq1DT3Dxq6pWysOJlypCzRBm7Uul8Y7ESNc9NpOZeIQsrDqMsOVOU + tSuUzzcWq1ET3Uxq8pmysOJwypSzRZk70xL5xmJFaqabSs0+QxZWTKNsOWOUvTMsk28sVqWmurnU9Jmy + sGI6ZcxZowzOtFS+sViZmusmU/NnyMKK0yhrzhxlcYbl8o3F6tRkN5uGcKQsrDidMufsUSaPtGS+sbgC + NdtNp2EcIQsrLqPsOYOUzSMsm28srkJNd/NpKK/IworLKYPOImX0FUvnG4srUfM9BBrOM7Kwogxl0Zmk + rD5j+XxjcTUagodBQ3pEFlaUo0w6m5TZR2yRbyyuSMPwUGhY98jCirKUTWeUsnuPbfKNxVVpKB4ODe1n + Pg9ZWFGaMjo8k++tfkHG4srGcPTjyR75uYqfhtN/DFLEM5TV4ZGf0q7v3SrfWNzBGJR+krUWEv3K9O/h + t+HUn4wbcZSRXf2uS/lWlinf+tqWf3rA4o7GALXE8kfA2JLz/St9bTdYjIioCosREVVhMSKiKixGRFSF + xYiIqrAYEVEVFiMiqsJiRERVWIyIqAqLERFVYTEioiosRkRUhcWIiKqwGBFRFRYjIqrCYkREVViMiKgK + ixERVWExIqIqLEZEVIXFiIiqsBgRURUWIyKqwmJERFVYjIioCosRETV9+dN/AQ/ELgr6/yGdAAAAAElF + TkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAu + IwAALiMBeKU/dgAACzBJREFUeF7t3bGVlVcWRGGF0CEoBEIgABkEIIMQCIEQOgRCIAQCGIMQyEBYcpl7 + tZoZ6Wj3jDRrJG7V3cbnlMH7y6iz3nt0r/7uy5cvkhQBQ0k6EYaSdCIMJelEGErSiTCUpBNhKEknwlCS + ToShJJ0IQ0k6EYaSdCIMJelEGErSiTCUpBNhKEknwlCSToShJJ0IQ0k6EYbSc37+6ccXy8s/4AfIphf0 + GtJzMJS2dVAeltfLu+XT8uUvsv/t/Rr7tR7oWaQNQ91tH43l7fJ5oQPzV9qvuV/bw6XfwVD3WofizdPR + oGPyd9rP8IaeUffCUPdZx2G/q3r/dCxOsp/Jd1v6BYa6yz4Iy8enA3Gi/WweLXmwbrcPwdNBoENxEo+W + PFi3W0fgxI+Bz3lPHXQPDHWHdQD2F+x0GE7mF/EXw1D91vD3R8ET/jfwz9rP7EfDS2Gofmv0+2ed6CAk + eEud1A9D9VujT3x39dVn6qR+GKrbGvyrcQASvaJu6oahuq2x79/boyOQ5JG6qRuG6rbGnvBzV//NR+qm + bhiqG4w/0uylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/ + 0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiq + G40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eyl + fhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/ + 0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiq + G40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eyl + fhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/ + 0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiq + G40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eyl + fhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/ + 0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiq + G40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eyl + fhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/ + 0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiq + G40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eyl + fhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/ + 0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiq + G40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eyl + fhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/ + 0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiq + G40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eyl + fhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/ + 0eylfhiq1xr693P4qWY39cNQ3Wj8iWYv9cNQ3Wj8iWYv9cNQ3dbYP8zxB/pA3dQNQ3VbY38c40/0SN3U + DUN1W2N/Ncaf6BV1UzcM1W8N/tM4AEk+USf1w1D91ujfjiOQ5C11Uj8M1W+N/mFJfJe1n/mBOqkfhrrD + Gn7id1l+d3UxDHWPdQDejYNwsnfUQffAUHdZh+DjOAwn+kjPrrtgqLusY7C/zzr5aO1n83srebD0b+so + nPjx0I+B+hcMda91IPYX8Sf87+F+Br9g129gqLutQ7E/Iu6f0/oWh2u/5n5tPwLqdzCUvlqHY7/j2r97 + +Ff+wvT+t/dr+I5K/xGGknQiDCXpRBhK0okwlKQTYShJJ8JQkk6EoSSdCENJOhGGknQiDCXpRBhK0okw + lKQTYShJJ8JQkk6EoSSdCENJOhGGknQiDCXpRBhK0okwlKQTYShJJ8JQkk6EoSSdCENJOhGGknQiDCXp + RBhK0okwlKQTYShJJ8JQkk6EoSSdCENJOhGGknQiDCXpRBhK0okwlKQTYSh99fNPPz4sr5a3y4c/4R+Q + PWf/2/s1HugZpK8wlNbxeLm8W778zfZrvqRnkjDUvdax+H55/3Q8vqX9DN/TM+peGOpO60C8Xj4/HYwT + 7Gd5Tc+qO2Go+6zD8PirQ3GaR3pm3QdD3WUdhG/xXdWf9Y6eXXfBUPdYh2B/DKQDcSI/Hl4OQ91hHYAX + 4yAkeEFddAcMdYc1/v0zUHQUTvaBuugOGKrfGn7SR8HJj4aXwlD91ug/jiOQ5CN1Uj8M1W0NPvG7q8nv + si6Eobqtse/f3aMjkOQtdVM3DNVtjT3xy/bJL98vhKG6rbGf9Os3/6vP1E3dMFQ3GH+k2Uv9MFQ3Gn+i + 2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3 + Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9 + MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFS3Nfbkv0n4lX+b8EIYqtsa++MYf6JH + 6qZuGKrbGvurMf5Er6ibumGofmvwyX/qyz/xdSkM1W+NPvmvP/tXny+Fofqt0T8sie+y9jM/UCf1w1B3 + WMN/86tDkOINddEdMNQ91gF4Pw7Cyd5TB90DQ91jHYH90TDh57L2M/pR8HIY6i77EDwdBDoUJ/BY6RcY + 6j77ICwnfjzcz+Sx0i8w1L3WcdhfxJ/wv4f7GfyCXb+Boe62DsV+t7V/TutbHK79mvu1fVel38FQ2vbR + WF4v75ZPCx2Y/4f9b+/X2K/lodKzMJSesw7Ki+XlH/ADZNMLeg3pORhK0okwlKQTYShJJ8JQkk6EoSSd + CENJOhGGknQiDCXpRBhK0okwlKQTYShJJ8JQkk6EoSSdCENJOhGGknQiDCXpRBhK0okwlKTzfPnunwM4 + jDoyqebiAAAAAElFTkSuQmCC + + + + Provide Feedback + + + Could not redirect to the Dynamo forum page for feedback: + \ No newline at end of file diff --git a/src/WorkspaceDependencyViewExtension/Properties/Resources.resx b/src/WorkspaceDependencyViewExtension/Properties/Resources.resx index 29528b72713..83cf6d7c78c 100644 --- a/src/WorkspaceDependencyViewExtension/Properties/Resources.resx +++ b/src/WorkspaceDependencyViewExtension/Properties/Resources.resx @@ -117,7 +117,249 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Error from WorkspaceDependencyViewExtension: {0} + + + Some nodes in this graph were originally created with {0} v{1}, which you do not have installed. Instead you have a different version of {0} installed, would you keep the installed version? + + + {0} {1} is installed and loaded. + + + This graph depends on {0} {1}. Would you like to download and install this package? + + + Some nodes in this graph were originally created with {0} v{1}, which you do not have installed. You may have a different version of {0} installed, or you may have a different package which resolves these nodes. + + + Install Specified Version + + + Keep Installed Version + Show Graph Package Dependency + + + + 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 + /fU/gZr5x/j8g1IAAAAASUVORK5CYII= + + + + + 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 + TkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAu + IwAALiMBeKU/dgAACzBJREFUeF7t3bGVlVcWRGGF0CEoBEIgABkEIIMQCIEQOgRCIAQCGIMQyEBYcpl7 + tZoZ6Wj3jDRrJG7V3cbnlMH7y6iz3nt0r/7uy5cvkhQBQ0k6EYaSdCIMJelEGErSiTCUpBNhKEknwlCS + ToShJJ0IQ0k6EYaSdCIMJelEGErSiTCUpBNhKEknwlCSToShJJ0IQ0k6EYbSc37+6ccXy8s/4AfIphf0 + GtJzMJS2dVAeltfLu+XT8uUvsv/t/Rr7tR7oWaQNQ91tH43l7fJ5oQPzV9qvuV/bw6XfwVD3WofizdPR + oGPyd9rP8IaeUffCUPdZx2G/q3r/dCxOsp/Jd1v6BYa6yz4Iy8enA3Gi/WweLXmwbrcPwdNBoENxEo+W + PFi3W0fgxI+Bz3lPHXQPDHWHdQD2F+x0GE7mF/EXw1D91vD3R8ET/jfwz9rP7EfDS2Gofmv0+2ed6CAk + eEud1A9D9VujT3x39dVn6qR+GKrbGvyrcQASvaJu6oahuq2x79/boyOQ5JG6qRuG6rbGnvBzV//NR+qm + bhiqG4w/0uylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/ + 0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiq + G40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eyl + fhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/ + 0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiq + G40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eyl + fhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/ + 0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiq + G40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eyl + fhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/ + 0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiq + G40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eyl + fhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/ + 0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiq + G40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eyl + fhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/ + 0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiq + G40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eyl + fhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/ + 0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiq + G40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eyl + fhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/0eylfhiqG40/ + 0eylfhiq1xr693P4qWY39cNQ3Wj8iWYv9cNQ3Wj8iWYv9cNQ3dbYP8zxB/pA3dQNQ3VbY38c40/0SN3U + DUN1W2N/Ncaf6BV1UzcM1W8N/tM4AEk+USf1w1D91ujfjiOQ5C11Uj8M1W+N/mFJfJe1n/mBOqkfhrrD + Gn7id1l+d3UxDHWPdQDejYNwsnfUQffAUHdZh+DjOAwn+kjPrrtgqLusY7C/zzr5aO1n83srebD0b+so + nPjx0I+B+hcMda91IPYX8Sf87+F+Br9g129gqLutQ7E/Iu6f0/oWh2u/5n5tPwLqdzCUvlqHY7/j2r97 + +Ff+wvT+t/dr+I5K/xGGknQiDCXpRBhK0okwlKQTYShJJ8JQkk6EoSSdCENJOhGGknQiDCXpRBhK0okw + lKQTYShJJ8JQkk6EoSSdCENJOhGGknQiDCXpRBhK0okwlKQTYShJJ8JQkk6EoSSdCENJOhGGknQiDCXp + RBhK0okwlKQTYShJJ8JQkk6EoSSdCENJOhGGknQiDCXpRBhK0okwlKQTYSh99fNPPz4sr5a3y4c/4R+Q + PWf/2/s1HugZpK8wlNbxeLm8W778zfZrvqRnkjDUvdax+H55/3Q8vqX9DN/TM+peGOpO60C8Xj4/HYwT + 7Gd5Tc+qO2Go+6zD8PirQ3GaR3pm3QdD3WUdhG/xXdWf9Y6eXXfBUPdYh2B/DKQDcSI/Hl4OQ91hHYAX + 4yAkeEFddAcMdYc1/v0zUHQUTvaBuugOGKrfGn7SR8HJj4aXwlD91ug/jiOQ5CN1Uj8M1W0NPvG7q8nv + si6Eobqtse/f3aMjkOQtdVM3DNVtjT3xy/bJL98vhKG6rbGf9Os3/6vP1E3dMFQ3GH+k2Uv9MFQ3Gn+i + 2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3 + Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9 + MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFQ3Gn+i2Uv9MFS3Nfbkv0n4lX+b8EIYqtsa++MYf6JH + 6qZuGKrbGvurMf5Er6ibumGofmvwyX/qyz/xdSkM1W+NPvmvP/tXny+Fofqt0T8sie+y9jM/UCf1w1B3 + WMN/86tDkOINddEdMNQ91gF4Pw7Cyd5TB90DQ91jHYH90TDh57L2M/pR8HIY6i77EDwdBDoUJ/BY6RcY + 6j77ICwnfjzcz+Sx0i8w1L3WcdhfxJ/wv4f7GfyCXb+Boe62DsV+t7V/TutbHK79mvu1fVel38FQ2vbR + WF4v75ZPCx2Y/4f9b+/X2K/lodKzMJSesw7Ki+XlH/ADZNMLeg3pORhK0okwlKQTYShJJ8JQkk6EoSSd + CENJOhGGknQiDCXpRBhK0okwlKQTYShJJ8JQkk6EoSSdCENJOhGGknQiDCXpRBhK0okwlKTzfPnunwM4 + jDoyqebiAAAAAElFTkSuQmCC + + + + Provide Feedback + + + Could not redirect to the Dynamo forum page for feedback: + \ No newline at end of file diff --git a/src/WorkspaceDependencyViewExtension/WorkspaceDependencyView.xaml b/src/WorkspaceDependencyViewExtension/WorkspaceDependencyView.xaml index 2c171070d07..a7bcea98aee 100644 --- a/src/WorkspaceDependencyViewExtension/WorkspaceDependencyView.xaml +++ b/src/WorkspaceDependencyViewExtension/WorkspaceDependencyView.xaml @@ -4,6 +4,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:p="clr-namespace:Dynamo.Wpf.Properties;assembly=DynamoCoreWpf" + xmlns:w="clr-namespace:Dynamo.WorkspaceDependency.Properties" xmlns:ui="clr-namespace:Dynamo.UI;assembly=DynamoCoreWpf" mc:Ignorable="d" VerticalAlignment="Top" @@ -11,93 +12,191 @@ + + + + + + + + + + + - + + + - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - + - - --> + Grid.Row="1" + Height="10000" + VerticalAlignment="Stretch"> + - + @@ -105,7 +204,7 @@ - +