diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj index c8b10b72eb..d1e99f1ec2 100644 --- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj +++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj @@ -232,6 +232,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/AvailablePackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/AvailablePackagesViewModel.cs index c80774b0b4..710b5ae08b 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/AvailablePackagesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/AvailablePackagesViewModel.cs @@ -84,7 +84,7 @@ namespace ICSharpCode.PackageManagement .Where(package => package.IsAbsoluteLatestVersion); } return repository - .Search(SearchTerms, IncludePrerelease) + .Search(searchCriteria, IncludePrerelease) .Where(package => package.IsLatestVersion); } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesForSelectedPageQuery.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesForSelectedPageQuery.cs new file mode 100644 index 0000000000..ebe73cc093 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesForSelectedPageQuery.cs @@ -0,0 +1,32 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.Generic; + +using NuGet; + +namespace ICSharpCode.PackageManagement +{ + public class PackagesForSelectedPageQuery + { + public PackagesForSelectedPageQuery ( + PackagesViewModel viewModel, + IEnumerable allPackages, + string searchCriteria) + { + Skip = viewModel.ItemsBeforeFirstPage; + Take = viewModel.PageSize; + AllPackages = allPackages; + SearchCriteria = searchCriteria; + TotalPackages = viewModel.TotalItems; + } + + public int Skip { get; private set; } + public int Take { get; private set; } + public string SearchCriteria { get; private set; } + + public int TotalPackages { get; set; } + public IEnumerable AllPackages { get; set; } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesForSelectedPageResult.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesForSelectedPageResult.cs index dae0427062..88881423d7 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesForSelectedPageResult.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesForSelectedPageResult.cs @@ -26,15 +26,19 @@ namespace ICSharpCode.PackageManagement { public class PackagesForSelectedPageResult { - public PackagesForSelectedPageResult(IEnumerable packages, int totalPackages) + public PackagesForSelectedPageResult(IEnumerable packages, PackagesForSelectedPageQuery query) { this.Packages = packages; this.TotalPackagesOnPage = packages.Count(); - this.TotalPackages = totalPackages; + this.TotalPackages = query.TotalPackages; + this.AllPackages = query.AllPackages; + this.Query = query; } + public PackagesForSelectedPageQuery Query { get; set; } public IEnumerable Packages { get; set; } public int TotalPackagesOnPage { get; set; } public int TotalPackages { get; set; } + public IEnumerable AllPackages { get; set; } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs index 284909775a..f860cc6856 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs @@ -41,6 +41,7 @@ namespace ICSharpCode.PackageManagement IEnumerable allPackages; ITask task; bool includePrerelease; + PackagesForSelectedPageQuery packagesForSelectedPageQuery; public PackagesViewModel( IPackageManagementSolution solution, @@ -153,15 +154,18 @@ namespace ICSharpCode.PackageManagement void CreateReadPackagesTask() { + var query = new PackagesForSelectedPageQuery(this, allPackages, GetSearchCriteria()); + packagesForSelectedPageQuery = query; + task = taskFactory.CreateTask( - () => GetPackagesForSelectedPageResult(), + () => GetPackagesForSelectedPageResult(query), OnPackagesReadForSelectedPage); } - PackagesForSelectedPageResult GetPackagesForSelectedPageResult() + PackagesForSelectedPageResult GetPackagesForSelectedPageResult(PackagesForSelectedPageQuery query) { - IEnumerable packages = GetPackagesForSelectedPage(); - return new PackagesForSelectedPageResult(packages, TotalItems); + IEnumerable packages = GetPackagesForSelectedPage(query); + return new PackagesForSelectedPageResult(packages, query); } void OnPackagesReadForSelectedPage(ITask task) @@ -171,12 +175,19 @@ namespace ICSharpCode.PackageManagement SaveError(task.Exception); } else if (task.IsCancelled) { // Ignore + } else if (!IsCurrentQuery(task.Result)) { + // Ignore. } else { UpdatePackagesForSelectedPage(task.Result); } base.OnPropertyChanged(null); } + bool IsCurrentQuery(PackagesForSelectedPageResult result) + { + return packagesForSelectedPageQuery == result.Query; + } + void SaveError(AggregateException ex) { HasError = true; @@ -194,6 +205,8 @@ namespace ICSharpCode.PackageManagement { pages.TotalItems = result.TotalPackages; pages.TotalItemsOnSelectedPage = result.TotalPackagesOnPage; + TotalItems = result.TotalPackages; + allPackages = result.AllPackages; UpdatePackageViewModels(result.Packages); } @@ -203,20 +216,20 @@ namespace ICSharpCode.PackageManagement base.OnPropertyChanged(null); } - IEnumerable GetPackagesForSelectedPage() + IEnumerable GetPackagesForSelectedPage(PackagesForSelectedPageQuery query) { - IEnumerable filteredPackages = GetFilteredPackagesBeforePagingResults(); - return GetPackagesForSelectedPage(filteredPackages); + IEnumerable filteredPackages = GetFilteredPackagesBeforePagingResults(query); + return GetPackagesForSelectedPage(filteredPackages, query); } - IEnumerable GetFilteredPackagesBeforePagingResults() + IEnumerable GetFilteredPackagesBeforePagingResults(PackagesForSelectedPageQuery query) { - if (allPackages == null) { - IQueryable packages = GetPackagesFromPackageSource(); - TotalItems = packages.Count(); - allPackages = GetFilteredPackagesBeforePagingResults(packages); + if (query.AllPackages == null) { + IQueryable packages = GetPackagesFromPackageSource(query.SearchCriteria); + query.TotalPackages = packages.Count(); + query.AllPackages = GetFilteredPackagesBeforePagingResults(packages); } - return allPackages; + return query.AllPackages; } /// @@ -224,7 +237,12 @@ namespace ICSharpCode.PackageManagement /// public IQueryable GetPackagesFromPackageSource() { - IQueryable packages = GetAllPackages(GetSearchCriteria()); + return GetPackagesFromPackageSource(GetSearchCriteria()); + } + + IQueryable GetPackagesFromPackageSource(string searchCriteria) + { + IQueryable packages = GetAllPackages(searchCriteria); return OrderPackages(packages); } @@ -242,12 +260,11 @@ namespace ICSharpCode.PackageManagement return SearchTerms; } - IEnumerable GetPackagesForSelectedPage(IEnumerable allPackages) + IEnumerable GetPackagesForSelectedPage(IEnumerable allPackages, PackagesForSelectedPageQuery query) { - int packagesToSkip = pages.ItemsBeforeFirstPage; return allPackages - .Skip(packagesToSkip) - .Take(pages.PageSize); + .Skip(query.Skip) + .Take(query.Take); } /// @@ -325,6 +342,10 @@ namespace ICSharpCode.PackageManagement set { pages.PageSize = value; } } + public int ItemsBeforeFirstPage { + get { return pages.ItemsBeforeFirstPage; } + } + public bool IsPaged { get { return pages.IsPaged; } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTaskFactory.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTaskFactory.cs index 60bb147677..1f1ae481e3 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTaskFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTaskFactory.cs @@ -51,6 +51,12 @@ namespace PackageManagement.Tests.Helpers } } + public void ExecuteTask(int index) + { + var task = FakeTasksCreated[index] as FakeTask; + task.ExecuteTaskCompletely(); + } + public void ClearAllFakeTasks() { FakeTasksCreated.Clear(); diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestablePackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestablePackagesViewModel.cs index e31f664f4c..c1d62b976f 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestablePackagesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestablePackagesViewModel.cs @@ -64,10 +64,11 @@ namespace PackageManagement.Tests.Helpers AddFakePackage("Test"); } - public void AddFakePackage(string packageId) + public FakePackage AddFakePackage(string packageId) { FakePackage package = CreateFakePackage(packageId); FakePackages.Add(package); + return package; } FakePackage CreateFakePackage(string packageId) diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackagesViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackagesViewModelTests.cs index 99cb4a5b70..bacd3c2411 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackagesViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackagesViewModelTests.cs @@ -333,22 +333,20 @@ namespace PackageManagement.Tests } [Test] - public void ReadPackages_RepositoryHasThreePackagesWhenSelectedPageIsOneAndPageSizeIsTwo_TwoPackageViewModelsCreatedForFirstTwoPackages() + public void ReadPackages_SecondQueryFinishesBeforeFirst_PackagesInViewModelAreForSecondQuery() { CreateViewModel(); - viewModel.PageSize = 2; - viewModel.SelectedPageNumber = 1; viewModel.AddThreeFakePackages(); + FakePackage package = viewModel.AddFakePackage("MyTest"); viewModel.ReadPackages(); - CompleteReadPackagesTask(); + viewModel.SearchTerms = "MyTest"; - var expectedPackages = new List(); - expectedPackages.Add(viewModel.FakePackages[0]); - expectedPackages.Add(viewModel.FakePackages[1]); + var expectedPackages = new FakePackage [] { package }; - ClearReadPackagesTasks(); viewModel.ReadPackages(); - CompleteReadPackagesTask(); + taskFactory.ExecuteTask(1); + taskFactory.ExecuteTask(0); + ClearReadPackagesTasks(); PackageCollectionAssert.AreEqual(expectedPackages, viewModel.PackageViewModels); } @@ -1072,7 +1070,8 @@ namespace PackageManagement.Tests CreateViewModel(); viewModel.AddSixFakePackages(); viewModel.ReadPackages(); - taskFactory.FirstFakeTaskCreated.Result = new PackagesForSelectedPageResult(viewModel.FakePackages, 6); + var query = new PackagesForSelectedPageQuery(viewModel, null, null); + taskFactory.FirstFakeTaskCreated.Result = new PackagesForSelectedPageResult(viewModel.FakePackages, query); taskFactory.FirstFakeTaskCreated.IsFaulted = true; CompleteReadPackagesTask();