1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
5
using System.Collections.Generic;
9
namespace ICSharpCode.PackageManagement
11
public class RecentPackageRepository : IRecentPackageRepository
13
public const int DefaultMaximumPackagesCount = 20;
15
List<IPackage> packages = new List<IPackage>();
16
int maximumPackagesCount = DefaultMaximumPackagesCount;
17
IList<RecentPackageInfo> savedRecentPackages;
18
IPackageRepository aggregateRepository;
19
IPackageManagementEvents packageManagementEvents;
21
public RecentPackageRepository(
22
IList<RecentPackageInfo> recentPackages,
23
IPackageRepository aggregateRepository,
24
IPackageManagementEvents packageManagementEvents)
26
this.savedRecentPackages = recentPackages;
27
this.aggregateRepository = aggregateRepository;
28
this.packageManagementEvents = packageManagementEvents;
30
this.packageManagementEvents.ParentPackageInstalled += ParentPackageInstalled;
33
void ParentPackageInstalled(object sender, ParentPackageOperationEventArgs e)
35
AddPackage(e.Package);
38
public string Source {
39
get { return "RecentPackages"; }
42
public void AddPackage(IPackage package)
44
RemovePackageIfAlreadyAdded(package);
45
AddPackageAtBeginning(package);
46
RemoveLastPackageIfCurrentPackageCountExceedsMaximum();
47
UpdateRecentPackagesInOptions();
50
void RemovePackageIfAlreadyAdded(IPackage package)
52
int index = FindPackage(package);
54
packages.RemoveAt(index);
58
int FindPackage(IPackage package)
60
return packages.FindIndex(p => PackageEqualityComparer.IdAndVersion.Equals(package, p));
63
void AddPackageAtBeginning(IPackage package)
65
packages.Insert(0, package);
68
void RemoveLastPackageIfCurrentPackageCountExceedsMaximum()
70
if (packages.Count > maximumPackagesCount) {
75
void RemoveLastPackage()
77
packages.RemoveAt(packages.Count - 1);
80
void UpdateRecentPackagesInOptions()
82
savedRecentPackages.Clear();
83
savedRecentPackages.AddRange(GetRecentPackagesInfo());
86
List<RecentPackageInfo> GetRecentPackagesInfo()
88
List<RecentPackageInfo> allRecentPackages = new List<RecentPackageInfo>();
89
foreach (IPackage package in packages) {
90
var recentPackageInfo = new RecentPackageInfo(package);
91
allRecentPackages.Add(recentPackageInfo);
93
return allRecentPackages;
96
public void RemovePackage(IPackage package)
100
public IQueryable<IPackage> GetPackages()
103
return packages.AsQueryable();
106
void UpdatePackages()
108
if (!HasRecentPackagesBeenRead() && HasRecentPackages) {
109
IEnumerable<IPackage> recentPackages = GetRecentPackages();
110
packages.AddRange(recentPackages);
114
bool HasRecentPackagesBeenRead()
116
return packages.Count > 0;
119
public bool HasRecentPackages {
120
get { return savedRecentPackages.Count > 0; }
123
IEnumerable<IPackage> GetRecentPackages()
125
IEnumerable<IPackage> recentPackages = GetRecentPackagesFilteredById();
126
return GetRecentPackagesFilteredByVersion(recentPackages);
129
IEnumerable<IPackage> GetRecentPackagesFilteredById()
131
IEnumerable<string> recentPackageIds = GetRecentPackageIds();
132
return aggregateRepository.FindPackages(recentPackageIds);
135
IEnumerable<string> GetRecentPackageIds()
137
foreach (RecentPackageInfo recentPackageInfo in savedRecentPackages) {
138
yield return recentPackageInfo.Id;
142
IEnumerable<IPackage> GetRecentPackagesFilteredByVersion(IEnumerable<IPackage> recentPackages)
144
List<IPackage> filteredRecentPackages = new List<IPackage>();
145
foreach (IPackage recentPackage in recentPackages) {
146
foreach (RecentPackageInfo savedRecentPackageInfo in savedRecentPackages) {
147
if (savedRecentPackageInfo.IsMatch(recentPackage)) {
148
filteredRecentPackages.Add(recentPackage);
152
return filteredRecentPackages;
155
public int MaximumPackagesCount {
156
get { return maximumPackagesCount; }
157
set { maximumPackagesCount = value; }
163
UpdateRecentPackagesInOptions();