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.
177 lines
5.5 KiB
177 lines
5.5 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.ObjectModel; |
|
using System.Collections.Specialized; |
|
using System.Linq; |
|
using System.Text; |
|
using System.Windows.Input; |
|
using ICSharpCode.AddInManager2.Model; |
|
using ICSharpCode.Core; |
|
using ICSharpCode.SharpDevelop; |
|
using Microsoft.Win32; |
|
using NuGet; |
|
|
|
namespace ICSharpCode.AddInManager2.ViewModel |
|
{ |
|
public class InstalledAddInsViewModel : NuGetAddInsViewModelBase |
|
{ |
|
public InstalledAddInsViewModel() |
|
: base() |
|
{ |
|
Initialize(); |
|
} |
|
|
|
public InstalledAddInsViewModel(IAddInManagerServices services) |
|
: base(services) |
|
{ |
|
Initialize(); |
|
} |
|
|
|
private void Initialize() |
|
{ |
|
AllowInstallFromArchive = true; |
|
HasFilterForPreinstalled = true; |
|
Title = SD.ResourceService.GetString("AddInManager2.Views.Installed"); |
|
|
|
// Load preinstalled AddIn filter |
|
LoadPreinstalledAddInFilter(); |
|
|
|
AddInManager.Events.AddInInstalled += InstalledAddInsChanged; |
|
AddInManager.Events.AddInUninstalled += InstalledAddInsChanged; |
|
AddInManager.Events.AddInStateChanged += InstalledAddInStateChanged; |
|
} |
|
|
|
protected override void OnDispose() |
|
{ |
|
AddInManager.Events.AddInInstalled -= InstalledAddInsChanged; |
|
AddInManager.Events.AddInUninstalled -= InstalledAddInsChanged; |
|
AddInManager.Events.AddInStateChanged -= InstalledAddInStateChanged; |
|
} |
|
|
|
protected override IQueryable<IPackage> GetAllPackages() |
|
{ |
|
return AddInManager.NuGet.Packages.LocalRepository.GetPackages(); |
|
} |
|
|
|
protected override IEnumerable<IPackage> GetFilteredPackagesBeforePagingResults(IQueryable<IPackage> allPackages) |
|
{ |
|
return base.GetFilteredPackagesBeforePagingResults(allPackages) |
|
.Where(package => package.IsReleaseVersion()) |
|
.DistinctLast(PackageEqualityComparer.Id); |
|
} |
|
|
|
protected override void UpdatePackageViewModels(IEnumerable<IPackage> packages) |
|
{ |
|
IEnumerable<AddInPackageViewModelBase> offlineAddInViewModels = GetInstalledAddIns(packages); |
|
// IEnumerable<AddInPackageViewModelBase> nuGetViewModels = ConvertToAddInViewModels(packages); |
|
|
|
// Merge lists of offline entries (internal AddIn objects) and online entries (installed NuGet packages) |
|
// IEnumerable<AddInPackageViewModelBase> viewModels = CombineOnlineAndOfflineAddIns(nuGetViewModels, offlineAddInViewModels); |
|
// UpdatePackageViewModels(viewModels.OrderBy(vm => vm.Name)); |
|
|
|
UpdatePackageViewModels(offlineAddInViewModels.OrderBy(vm => vm.Name)); |
|
} |
|
|
|
private IEnumerable<AddInPackageViewModelBase> CombineOnlineAndOfflineAddIns( |
|
IEnumerable<AddInPackageViewModelBase> onlineAddIns, IEnumerable<AddInPackageViewModelBase> offlineAddIns) |
|
{ |
|
return offlineAddIns.GroupJoin( |
|
onlineAddIns, |
|
offlinevm => offlinevm.Id, |
|
onlinevm => onlinevm.Id, |
|
(offlinevm, e) => e.ElementAtOrDefault(0) ?? offlinevm); |
|
} |
|
|
|
private IEnumerable<AddInPackageViewModelBase> GetInstalledAddIns(IEnumerable<IPackage> installedPackages) |
|
{ |
|
AddInPackageViewModelBase addInPackage; |
|
|
|
// Fill set of ID of installed NuGet packages, so we can later quickly check, whether NuGet package is installed for an AddIn |
|
HashSet<string> nuGetPackageIDs = new HashSet<string>(); |
|
foreach (IPackage package in installedPackages) |
|
{ |
|
if (!nuGetPackageIDs.Contains(package.Id)) |
|
{ |
|
nuGetPackageIDs.Add(package.Id); |
|
} |
|
} |
|
|
|
List<ManagedAddIn> addInList = new List<ManagedAddIn>(AddInManager.Setup.AddInsWithMarkedForInstallation); |
|
addInList.Sort(delegate(ManagedAddIn a, ManagedAddIn b) |
|
{ |
|
return a.AddIn.Name.CompareTo(b.AddIn.Name); |
|
}); |
|
foreach (ManagedAddIn addIn in addInList) |
|
{ |
|
if (string.Equals(addIn.AddIn.Properties["addInManagerHidden"], "true", StringComparison.OrdinalIgnoreCase)) |
|
{ |
|
// This excludes the SharpDevelop application appearing as AddIn in the tree |
|
continue; |
|
} |
|
if (!ShowPreinstalledAddIns && AddInManager.Setup.IsAddInPreinstalled(addIn.AddIn)) |
|
{ |
|
continue; |
|
} |
|
|
|
string nuGetPackageID = addIn.AddIn.Properties["nuGetPackageID"]; |
|
if (!string.IsNullOrEmpty(nuGetPackageID)) |
|
{ |
|
if (nuGetPackageIDs.Contains(nuGetPackageID)) |
|
{ |
|
addIn.InstallationSource = AddInInstallationSource.NuGetRepository; |
|
} |
|
} |
|
|
|
addInPackage = new OfflineAddInsViewModel(addIn); |
|
yield return addInPackage; |
|
} |
|
} |
|
|
|
protected override void UpdatePreinstalledFilter() |
|
{ |
|
// Save the preinstalled AddIn filter |
|
SavePreinstalledAddInFilter(); |
|
|
|
// Update the list |
|
Search(); |
|
} |
|
|
|
private void InstalledAddInsChanged(object sender, AddInInstallationEventArgs e) |
|
{ |
|
ReadPackages(); |
|
} |
|
|
|
private void InstalledAddInStateChanged(object sender, AddInInstallationEventArgs e) |
|
{ |
|
UpdateInstallationState(); |
|
} |
|
|
|
private void LoadPreinstalledAddInFilter() |
|
{ |
|
ShowPreinstalledAddIns = AddInManager.Settings.ShowPreinstalledAddIns; |
|
} |
|
|
|
private void SavePreinstalledAddInFilter() |
|
{ |
|
AddInManager.Settings.ShowPreinstalledAddIns = ShowPreinstalledAddIns; |
|
} |
|
|
|
protected override void InstallFromArchive() |
|
{ |
|
OpenFileDialog dlg = new OpenFileDialog(); |
|
dlg.Filter = SD.ResourceService.GetString("AddInManager2.SDAddInFileFilter"); |
|
dlg.Multiselect = true; |
|
var showDialogResult = dlg.ShowDialog(); |
|
if (showDialogResult.HasValue && showDialogResult.Value) |
|
{ |
|
foreach (var file in dlg.FileNames) |
|
{ |
|
AddInManager.Setup.InstallAddIn(file); |
|
} |
|
} |
|
} |
|
} |
|
}
|
|
|