private void DownloadsOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs args)
        {
            void canExecuteHandler(object o, PropertyChangedEventArgs eArgs)
            => ClearCompletedCommand.RaiseCanExecuteChanged();

            void canInstallHandler(object o, PropertyChangedEventArgs eArgs)
            {
                var handle = o as PackageDownloadHandle;

                // Hooking into propertyChanged works only if each download handle is added to
                // the Downloads collection before Download/Install begins.
                if (eArgs.PropertyName == nameof(PackageDownloadHandle.DownloadState))
                {
                    PackageManagerSearchElementViewModel sr = SearchResults.FirstOrDefault(x => x.Model.Name == handle.Name);
                    if (sr == null)
                    {
                        return;
                    }

                    sr.CanInstall = CanInstallPackage(o as PackageDownloadHandle);
                }
            }

            if (args.Action == NotifyCollectionChangedAction.Add)
            {
                foreach (var item in args.NewItems)
                {
                    var handle = (PackageDownloadHandle)item;
                    // Update CanInstall property every time the download handle's state changes
                    handle.PropertyChanged += canInstallHandler;
                    handle.PropertyChanged += canExecuteHandler;
                }
            }
            else if (args.Action == NotifyCollectionChangedAction.Remove)
            {
                foreach (var item in args.OldItems)
                {
                    var handle = (PackageDownloadHandle)item;
                    handle.PropertyChanged -= canInstallHandler;
                    handle.PropertyChanged -= canExecuteHandler;
                }
            }

            if (PackageManagerClientViewModel.Downloads.Count == 0)
            {
                ClearCompletedCommand.RaiseCanExecuteChanged();
            }

            RaisePropertyChanged(nameof(HasDownloads));
        }
        /// <summary>
        /// This method will be opening the SideBar Package Details (or closing it when enableFunction = false)
        /// </summary>
        /// <param name="stepInfo">Information about the Step</param>
        /// <param name="uiAutomationData">Information about UI Automation that is being executed</param>
        /// <param name="enableFunction">Variable used to know if we are executing the automation or undoing changes</param>
        /// <param name="currentFlow">Current Guide Flow</param>
        internal static void ExecuteViewDetailsSideBar(Step stepInfo, StepUIAutomation uiAutomationData, bool enableFunction, GuideFlow currentFlow)
        {
            const string packageDetailsName      = "Package Details";
            const string closeButtonName         = "CloseButton";
            const string packageSearchWindowName = "PackageSearch";

            CurrentExecutingStep = stepInfo;
            var stepMainWindow       = stepInfo.MainWindow as Window;
            var packageDetailsWindow = Guide.FindChild(stepMainWindow, stepInfo.HostPopupInfo.HostUIElementString) as UserControl;

            if (enableFunction)
            {
                //This section will open the Package Details Sidebar
                PackageManagerSearchView packageManager = Guide.FindWindowOwned(packageSearchWindowName, stepMainWindow) as PackageManagerSearchView;
                if (packageManager == null)
                {
                    return;
                }
                PackageManagerSearchViewModel packageManagerViewModel = packageManager.DataContext as PackageManagerSearchViewModel;

                //If the results in the PackageManagerSearch are null then we cannot open the Package Detail tab
                if (packageManagerViewModel == null || packageManagerViewModel.SearchResults.Count == 0)
                {
                    return;
                }

                //We take the first result from the PackageManagerSearch
                PackageManagerSearchElementViewModel packageManagerSearchElementViewModel = packageManagerViewModel.SearchResults[0];
                if (packageManagerSearchElementViewModel == null)
                {
                    return;
                }

                if (packageDetailsWindow == null)
                {
                    packageManagerViewModel.ViewPackageDetailsCommand.Execute(packageManagerSearchElementViewModel.Model);
                }

                //The PackageDetails sidebar is using events when is being shown then we need to execute those events before setting the Popup.PlacementTarget.
                //otherwise the sidebar will not be present (and we don't have host for the Popup) and the Popup will be located out of the Dynamo window
                CurrentExecutingStep.MainWindow.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { }));
            }
            else
            {
                //This section will close the Package Details Sidebar (just in case is still opened),
                //due that the sidebar (UserControl) is inserted inside a TabItem the only way to close is by using the method dynamoView.CloseExtensionTab
                var dynamoView = (stepMainWindow as DynamoView);
                if (packageDetailsWindow == null)
                {
                    return;
                }
                //In order to close the Package Details tab we need first to get the Tab, then get the Close button and finally call the event to close it
                TabItem tabitem = dynamoView.ExtensionTabItems.OfType <TabItem>().SingleOrDefault(n => n.Header.ToString() == packageDetailsName);
                if (tabitem == null)
                {
                    return;
                }
                //Get the Close button from the PackageDetailsView
                Button closeButton = Guide.FindChild(tabitem, closeButtonName) as Button;
                if (closeButton == null)
                {
                    return;
                }
                dynamoView.CloseExtensionTab(closeButton, null);
            }
        }
 private void AddToSearchResults(PackageManagerSearchElementViewModel element)
 {
     element.RequestDownload += this.PackageOnExecuted;
     this.SearchResults.Add(element);
 }
Exemple #4
0
        public void TestPackageManagerSearchElementCanInstall()
        {
            var name1   = "non-duplicate";
            var name2   = "duplicate";
            var version = "1.0.0";

            var mockGreg   = new Mock <IGregClient>();
            var clientmock = new Mock <PackageManagerClient>(mockGreg.Object, MockMaker.Empty <IPackageUploadBuilder>(), string.Empty);
            var pmCVM      = new Mock <PackageManagerClientViewModel>(ViewModel, clientmock.Object);

            var ext    = Model.GetPackageManagerExtension();
            var loader = ext.PackageLoader;

            loader.Add(new Package("", name2, version, ""));

            var packageManagerSearchViewModel = new PackageManagerSearchViewModel(pmCVM.Object);

            packageManagerSearchViewModel.RegisterTransientHandlers();

            var newSE1 = new PackageManagerSearchElementViewModel(new PackageManagerSearchElement(new PackageHeader()
            {
                name = name1
            }), false);

            var newSE2 = new PackageManagerSearchElementViewModel(new PackageManagerSearchElement(new PackageHeader()
            {
                name = name2
            }), false);

            packageManagerSearchViewModel.AddToSearchResults(newSE1);
            packageManagerSearchViewModel.AddToSearchResults(newSE2);

            // Default CanInstall should be true
            Assert.AreEqual(true, newSE1.CanInstall);
            Assert.AreEqual(true, newSE2.CanInstall);

            var dHandle1 = new PackageDownloadHandle()
            {
                Id          = name1,
                VersionName = version,
                Name        = name1
            };

            var dHandle2 = new PackageDownloadHandle()
            {
                Id          = name2,
                VersionName = version,
                Name        = name2
            };

            pmCVM.Object.Downloads.Add(dHandle1);
            pmCVM.Object.Downloads.Add(dHandle2);

            Assert.AreEqual(true, newSE1.CanInstall);
            Assert.AreEqual(true, newSE2.CanInstall);

            dHandle1.DownloadState = PackageDownloadHandle.State.Downloading;
            Assert.AreEqual(false, newSE1.CanInstall);

            dHandle1.DownloadState = PackageDownloadHandle.State.Downloaded;
            Assert.AreEqual(false, newSE1.CanInstall);

            dHandle1.DownloadState = PackageDownloadHandle.State.Error;
            dHandle2.DownloadState = PackageDownloadHandle.State.Downloading;

            Assert.AreEqual(true, newSE1.CanInstall);
            Assert.AreEqual(false, newSE2.CanInstall);

            dHandle1.DownloadState = PackageDownloadHandle.State.Installing;
            dHandle2.DownloadState = PackageDownloadHandle.State.Downloaded;
            Assert.AreEqual(false, newSE1.CanInstall);
            Assert.AreEqual(false, newSE2.CanInstall);

            // Simulate that the package corresponding to name1 was added successfully
            var package1 = new Package("", name1, version, "")
            {
            };

            package1.SetAsLoaded();
            loader.Add(package1);

            dHandle1.DownloadState = PackageDownloadHandle.State.Installed;
            dHandle2.DownloadState = PackageDownloadHandle.State.Installed;

            Assert.AreEqual(false, newSE1.CanInstall);
            Assert.AreEqual(false, newSE2.CanInstall);

            packageManagerSearchViewModel.ClearSearchResults();
        }
Exemple #5
0
        public void PackageSearchDialogSearchIntersectAgainstFilters()
        {
            //Arrange
            int    numberOfPackages         = 9;
            string packageId                = "c5ecd20a-d41c-4e0c-8e11-8ddfb953d77f";
            string packageVersionNumber     = "1.0.0.0";
            string packageCreatedDateString = "2016 - 12 - 02T13:13:20.135000 + 00:00";
            string advSteelFilterName       = "Advance Steel";
            string formItFilterName         = "FormIt";

            //Formit Packages
            List <string> formItPackagesName = new List <string> {
                "DynamoIronPython2.7", "dynamo", "Celery for Dynamo 2.5"
            };
            //Advance Steel Packages
            List <string> advanceSteelPackagesName = new List <string> {
                "DynamoIronPython2.7", "dynamo", "mise en barre", "Test-PackageDependencyFilter"
            };
            //Advance Steel Packages & Formit
            List <string> intersectionPackagesName = new List <string> {
                "DynamoTestPackage1", "DynamoTestPackage2"
            };

            var mockGreg   = new Mock <IGregClient>();
            var clientmock = new Mock <PackageManagerClient>(mockGreg.Object, MockMaker.Empty <IPackageUploadBuilder>(), string.Empty);
            var pmCVM      = new Mock <PackageManagerClientViewModel>(ViewModel, clientmock.Object);

            var packageManagerSearchViewModel = new PackageManagerSearchViewModel(pmCVM.Object);

            packageManagerSearchViewModel.RegisterTransientHandlers();

            //Adds the filters for FormIt and Advance Steel
            packageManagerSearchViewModel.HostFilter = new List <FilterEntry>
            {
                new FilterEntry(advSteelFilterName, packageManagerSearchViewModel)
                {
                    OnChecked = true
                },
                new FilterEntry(formItFilterName, packageManagerSearchViewModel)
                {
                    OnChecked = true
                },
            };

            //Adding FormIt packages
            foreach (var package in formItPackagesName)
            {
                var tmpPackageVersion = new PackageVersion {
                    version = packageVersionNumber, host_dependencies = new List <string> {
                        formItFilterName
                    }, created = packageCreatedDateString
                };
                var tmpPackage = new PackageManagerSearchElementViewModel(new PackageManagerSearchElement(new PackageHeader()
                {
                    _id      = packageId,
                    name     = package,
                    versions = new List <PackageVersion> {
                        tmpPackageVersion
                    },
                    host_dependencies = new List <string> {
                        formItFilterName
                    },
                }), false);
                packageManagerSearchViewModel.AddToSearchResults(tmpPackage);
            }

            //Adding Advance Steel packages
            foreach (var package in advanceSteelPackagesName)
            {
                var tmpPackageVersion = new PackageVersion {
                    version = packageVersionNumber, host_dependencies = new List <string> {
                        advSteelFilterName
                    }, created = packageCreatedDateString
                };
                var tmpPackage = new PackageManagerSearchElementViewModel(new PackageManagerSearchElement(new PackageHeader()
                {
                    _id      = packageId,
                    name     = package,
                    versions = new List <PackageVersion> {
                        tmpPackageVersion
                    },
                    host_dependencies = new List <string> {
                        advSteelFilterName
                    },
                }), false);
                packageManagerSearchViewModel.AddToSearchResults(tmpPackage);
            }

            //Adding packages that belong to FormIt and Advance Steel (intersection packages)
            foreach (var package in intersectionPackagesName)
            {
                var tmpPackageVersion = new PackageVersion {
                    version = packageVersionNumber, host_dependencies = new List <string> {
                        advSteelFilterName, formItFilterName
                    }, created = packageCreatedDateString
                };
                var tmpPackage = new PackageManagerSearchElementViewModel(new PackageManagerSearchElement(new PackageHeader()
                {
                    _id      = packageId,
                    name     = package,
                    versions = new List <PackageVersion> {
                        tmpPackageVersion
                    },
                    host_dependencies = new List <string> {
                        advSteelFilterName, formItFilterName
                    },
                }), false);
                packageManagerSearchViewModel.AddToSearchResults(tmpPackage);
            }

            //We need to add the PackageManagerSearchElementViewModel because otherwise the search will crash
            packageManagerSearchViewModel.LastSync = new List <PackageManagerSearchElement>();
            foreach (var result in packageManagerSearchViewModel.SearchResults)
            {
                packageManagerSearchViewModel.LastSync.Add(result.Model);
            }

            //Validate the total added packages match
            Assert.That(packageManagerSearchViewModel.SearchResults.Count == numberOfPackages);

            //Act
            //Check the Advance Steel filter
            packageManagerSearchViewModel.HostFilter[0].FilterCommand.Execute(advSteelFilterName);
            //Check the FormIt filter
            packageManagerSearchViewModel.HostFilter[1].FilterCommand.Execute(formItFilterName);

            //Assert
            //Validates that we have results and that the result match the expected 2 packages (intersection)
            Assert.IsNotNull(packageManagerSearchViewModel.SearchResults, "There was no results");
            Assert.That(packageManagerSearchViewModel.SearchResults.Count > 0, "There was no results");
            Assert.That(packageManagerSearchViewModel.SearchResults.Count == intersectionPackagesName.Count, "The search results are not getting the packages intersected");
        }