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();