// 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 GetAllPackages() { return AddInManager.NuGet.Packages.LocalRepository.GetPackages(); } protected override IEnumerable GetFilteredPackagesBeforePagingResults(IQueryable allPackages) { return base.GetFilteredPackagesBeforePagingResults(allPackages) .Where(package => package.IsReleaseVersion()) .DistinctLast(PackageEqualityComparer.Id); } protected override void UpdatePackageViewModels(IEnumerable packages) { IEnumerable offlineAddInViewModels = GetInstalledAddIns(packages); // IEnumerable nuGetViewModels = ConvertToAddInViewModels(packages); // Merge lists of offline entries (internal AddIn objects) and online entries (installed NuGet packages) // IEnumerable viewModels = CombineOnlineAndOfflineAddIns(nuGetViewModels, offlineAddInViewModels); // UpdatePackageViewModels(viewModels.OrderBy(vm => vm.Name)); UpdatePackageViewModels(offlineAddInViewModels.OrderBy(vm => vm.Name)); } private IEnumerable CombineOnlineAndOfflineAddIns( IEnumerable onlineAddIns, IEnumerable offlineAddIns) { return offlineAddIns.GroupJoin( onlineAddIns, offlinevm => offlinevm.Id, onlinevm => onlinevm.Id, (offlinevm, e) => e.ElementAtOrDefault(0) ?? offlinevm); } private IEnumerable GetInstalledAddIns(IEnumerable 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 nuGetPackageIDs = new HashSet(); foreach (IPackage package in installedPackages) { if (!nuGetPackageIDs.Contains(package.Id)) { nuGetPackageIDs.Add(package.Id); } } List addInList = new List(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); } } } } }