#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

239 lines
6.6 KiB

// 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 System.Collections.Specialized;
using System.Linq;
using ICSharpCode.SharpDevelop;
using ICSharpCode.AddInManager2.Model;
using NuGet;
namespace ICSharpCode.AddInManager2.ViewModel
{
/// <summary>
/// Base class for view models displaying NuGet
/// </summary>
public class NuGetAddInsViewModelBase : AddInsViewModelBase
{
private AddInManagerTask<ReadPackagesResult> _task;
private IEnumerable<IPackage> _allPackages;
public NuGetAddInsViewModelBase()
: base()
{
}
public NuGetAddInsViewModelBase(IAddInManagerServices services)
: base(services)
{
}
/// <summary>
/// Returns all the packages.
/// </summary>
protected virtual IQueryable<IPackage> GetAllPackages()
{
return null;
}
public override void ReadPackages()
{
base.ReadPackages();
_allPackages = null;
UpdateRepositoryBeforeReadPackagesTaskStarts();
StartReadPackagesTask();
}
private void StartReadPackagesTask()
{
IsReadingPackages = true;
HasError = false;
ClearPackages();
CancelReadPackagesTask();
CreateReadPackagesTask();
_task.Start();
// SD.Log.Debug("[AddInManager2] NuGetAddInsViewModelBase: Started task");
}
protected virtual void UpdateRepositoryBeforeReadPackagesTaskStarts()
{
}
private void CancelReadPackagesTask()
{
if (_task != null)
{
// SD.Log.Debug("[AddInManager2] NuGetAddInsViewModelBase: Cancelled task");
_task.Cancel();
}
}
private void CreateReadPackagesTask()
{
_task = AddInManagerTask.Create(
GetPackagesForSelectedPageResult,
OnPackagesReadForSelectedPage);
// SD.Log.Debug("[AddInManager2] NuGetAddInsViewModelBase: Created task");
}
private ReadPackagesResult GetPackagesForSelectedPageResult()
{
IEnumerable<IPackage> packages = GetPackagesForSelectedPage();
return new ReadPackagesResult(packages, TotalItems);
}
private void OnPackagesReadForSelectedPage(AddInManagerTask<ReadPackagesResult> task)
{
// SD.Log.Debug("[AddInManager2] NuGetAddInsViewModelBase: Task has returned");
IsReadingPackages = false;
bool wasSuccessful = false;
bool wasCancelled = false;
if (task.IsFaulted)
{
SaveError(task.Exception);
}
else if (task.IsCancelled)
{
// Ignore
// SD.Log.Debug("[AddInManager2] NuGetAddInsViewModelBase: Task ignored, because cancelled");
wasCancelled = true;
}
else
{
// SD.Log.Debug("[AddInManager2] NuGetAddInsViewModelBase: Task successfully finished.");
UpdatePackagesForSelectedPage(task.Result);
wasSuccessful = true;
}
base.OnPropertyChanged(null);
AddInManager.Events.OnPackageListDownloadEnded(this, new PackageListDownloadEndedEventArgs(wasSuccessful, wasCancelled));
}
private void UpdatePackagesForSelectedPage(ReadPackagesResult result)
{
PagesCollection.TotalItems = result.TotalPackages;
PagesCollection.TotalItemsOnSelectedPage = result.TotalPackagesOnPage;
UpdatePackageViewModels(result.Packages);
}
private void PagesChanged(object sender, NotifyCollectionChangedEventArgs e)
{
StartReadPackagesTask();
base.OnPropertyChanged(null);
}
private IEnumerable<IPackage> GetPackagesForSelectedPage()
{
IEnumerable<IPackage> filteredPackages = GetFilteredPackagesBeforePagingResults();
return GetPackagesForSelectedPage(filteredPackages);
}
private IEnumerable<IPackage> GetFilteredPackagesBeforePagingResults()
{
if (_allPackages == null)
{
IQueryable<IPackage> packages = GetAllPackages();
packages = OrderPackages(packages);
packages = FilterPackagesBySearchCriteria(packages);
TotalItems = packages.Count();
_allPackages = GetFilteredPackagesBeforePagingResults(packages);
}
return _allPackages;
}
private IQueryable<IPackage> OrderPackages(IQueryable<IPackage> packages)
{
return packages
.OrderBy(package => package.Id)
.ThenBy(package => package.Version);
}
private IQueryable<IPackage> FilterPackagesBySearchCriteria(IQueryable<IPackage> packages)
{
string searchCriteria = GetSearchCriteria();
return FilterPackagesBySearchCriteria(packages, searchCriteria);
}
private IQueryable<IPackage> FilterPackagesByStaticFilter(IQueryable<IPackage> packages)
{
// Look for "SharpDevelopAddIn" tag to show only SD AddIn packages
return packages.Find(new string[] { "Tags" }, "sharpdevelopaddin");
}
private string GetSearchCriteria()
{
if (String.IsNullOrWhiteSpace(SearchTerms))
{
return null;
}
return SearchTerms;
}
protected IQueryable<IPackage> FilterPackagesBySearchCriteria(IQueryable<IPackage> packages, string searchCriteria)
{
return packages.Find(searchCriteria);
}
private IEnumerable<IPackage> GetPackagesForSelectedPage(IEnumerable<IPackage> allPackages)
{
int packagesToSkip = PagesCollection.ItemsBeforeFirstPage;
return allPackages
.Skip(packagesToSkip)
.Take(PagesCollection.PageSize);
}
/// <summary>
/// Allows filtering of the packages before paging the results. Call base class method
/// to run default filtering.
/// </summary>
protected virtual IEnumerable<IPackage> GetFilteredPackagesBeforePagingResults(IQueryable<IPackage> allPackages)
{
return GetBufferedPackages(allPackages)
.Where(package => ShowPrereleases || package.IsReleaseVersion())
.DistinctLast(PackageEqualityComparer.Id);
}
private IEnumerable<IPackage> GetBufferedPackages(IQueryable<IPackage> allPackages)
{
return allPackages.AsBufferedEnumerable(30);
}
protected virtual void UpdatePackageViewModels(IEnumerable<IPackage> packages)
{
IEnumerable<AddInPackageViewModelBase> currentViewModels = ConvertToAddInViewModels(packages);
UpdatePackageViewModels(currentViewModels);
}
protected IEnumerable<AddInPackageViewModelBase> ConvertToAddInViewModels(IEnumerable<IPackage> packages)
{
foreach (IPackage package in packages)
{
yield return CreateAddInViewModel(package);
}
}
protected virtual AddInPackageViewModelBase CreateAddInViewModel(IPackage package)
{
return new NuGetPackageViewModel(AddInManager, package);
}
public override int SelectedPageNumber
{
get
{
return base.SelectedPageNumber;
}
set
{
if (base.SelectedPageNumber != value)
{
base.SelectedPageNumber = value;
StartReadPackagesTask();
base.OnPropertyChanged(null);
}
}
}
}
}