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=
+
+
+
+
+ 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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/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 @@
-
+