Browse Source

Prevent package install/uninstall events being captured by closed Add Package Reference dialog.

pull/15/head
Matt Ward 15 years ago
parent
commit
00e5a5206b
  1. 5
      src/AddIns/Misc/PackageManagement/Project/Src/AddPackageReferenceCommand.cs
  2. 10
      src/AddIns/Misc/PackageManagement/Project/Src/AddPackageReferenceView.xaml
  3. 45
      src/AddIns/Misc/PackageManagement/Project/Src/AddPackageReferenceViewModel.cs
  4. 14
      src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackagesViewModel.cs
  5. 91
      src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs
  6. 14
      src/AddIns/Misc/PackageManagement/Project/Src/RecentPackagesViewModel.cs
  7. 4
      src/AddIns/Misc/PackageManagement/Project/Src/ViewModelLocator.cs
  8. 44
      src/AddIns/Misc/PackageManagement/Test/Src/AddPackageReferenceViewModelTests.cs
  9. 54
      src/AddIns/Misc/PackageManagement/Test/Src/InstalledPackagesViewModelTests.cs
  10. 17
      src/AddIns/Misc/PackageManagement/Test/Src/PackagesViewModelTests.cs
  11. 50
      src/AddIns/Misc/PackageManagement/Test/Src/RecentPackagesViewModelTests.cs

5
src/AddIns/Misc/PackageManagement/Project/Src/AddPackageReferenceCommand.cs

@ -12,9 +12,12 @@ namespace ICSharpCode.PackageManagement @@ -12,9 +12,12 @@ namespace ICSharpCode.PackageManagement
{
public override void Run()
{
AddPackageReferenceView view = new AddPackageReferenceView();
var view = new AddPackageReferenceView();
view.Owner = WorkbenchSingleton.MainWindow;
view.ShowDialog();
var viewModel = view.MainPanel.DataContext as AddPackageReferenceViewModel;
viewModel.Dispose();
}
}
}

10
src/AddIns/Misc/PackageManagement/Project/Src/AddPackageReferenceView.xaml

@ -21,7 +21,7 @@ @@ -21,7 +21,7 @@
UriSource="pack://application:,,,/PackageManagement;component/Resources/exclamation.png"/>
</Window.Resources>
<DockPanel>
<DockPanel x:Name="MainPanel">
<!-- Use DockPanel.DataContext instead of Window.DataContext otherwise Visual Studio does not show
design time data -->
<DockPanel.DataContext>
@ -54,22 +54,22 @@ @@ -54,22 +54,22 @@
<TabControl>
<TabItem Header="Available">
<pm:PackagesView
x:Name="availablePackagesView"
x:Name="AvailablePackagesView"
DataContext="{Binding Path=AvailablePackagesViewModel}"/>
</TabItem>
<TabItem Header="Installed">
<pm:PackagesView
x:Name="installedPackagesView"
x:Name="InstalledPackagesView"
DataContext="{Binding Path=InstalledPackagesViewModel}"/>
</TabItem>
<TabItem Header="Updates">
<pm:PackagesView
x:Name="packageUpdatesView"
x:Name="PackageUpdatesView"
DataContext="{Binding Path=UpdatedPackagesViewModel}"/>
</TabItem>
<TabItem Header="Recent">
<pm:PackagesView
x:Name="recentPackagesView"
x:Name="RecentPackagesView"
DataContext="{Binding Path=RecentPackagesViewModel}"/>
</TabItem>
</TabControl>

45
src/AddIns/Misc/PackageManagement/Project/Src/AddPackageReferenceViewModel.cs

@ -8,13 +8,9 @@ using NuGet; @@ -8,13 +8,9 @@ using NuGet;
namespace ICSharpCode.PackageManagement
{
public class AddPackageReferenceViewModel : ViewModelBase<AddPackageReferenceViewModel>, IMessageReporter
public class AddPackageReferenceViewModel : ViewModelBase<AddPackageReferenceViewModel>, IMessageReporter, IDisposable
{
IPackageManagementService packageManagementService;
InstalledPackagesViewModel installedPackagesViewModel;
AvailablePackagesViewModel availablePackagesViewModel;
UpdatedPackagesViewModel updatedPackagesViewModel;
RecentPackagesViewModel recentPackagesViewModel;
string message;
bool hasError;
@ -25,31 +21,28 @@ namespace ICSharpCode.PackageManagement @@ -25,31 +21,28 @@ namespace ICSharpCode.PackageManagement
this.packageManagementService = packageManagementService;
this.packageManagementService.OutputMessagesView.Clear();
availablePackagesViewModel = new AvailablePackagesViewModel(packageManagementService, this, taskFactory);
installedPackagesViewModel = new InstalledPackagesViewModel(packageManagementService, this, taskFactory);
updatedPackagesViewModel = new UpdatedPackagesViewModel(packageManagementService, this, taskFactory);
recentPackagesViewModel = new RecentPackagesViewModel(packageManagementService, this, taskFactory);
AvailablePackagesViewModel = new AvailablePackagesViewModel(packageManagementService, this, taskFactory);
InstalledPackagesViewModel = new InstalledPackagesViewModel(packageManagementService, this, taskFactory);
UpdatedPackagesViewModel = new UpdatedPackagesViewModel(packageManagementService, this, taskFactory);
RecentPackagesViewModel = new RecentPackagesViewModel(packageManagementService, this, taskFactory);
availablePackagesViewModel.ReadPackages();
installedPackagesViewModel.ReadPackages();
updatedPackagesViewModel.ReadPackages();
recentPackagesViewModel.ReadPackages();
AvailablePackagesViewModel.ReadPackages();
InstalledPackagesViewModel.ReadPackages();
UpdatedPackagesViewModel.ReadPackages();
RecentPackagesViewModel.ReadPackages();
}
public InstalledPackagesViewModel InstalledPackagesViewModel {
get { return installedPackagesViewModel; }
}
public AvailablePackagesViewModel AvailablePackagesViewModel {
get { return availablePackagesViewModel; }
}
public AvailablePackagesViewModel AvailablePackagesViewModel { get; private set; }
public InstalledPackagesViewModel InstalledPackagesViewModel { get; private set; }
public RecentPackagesViewModel RecentPackagesViewModel { get; private set; }
public UpdatedPackagesViewModel UpdatedPackagesViewModel { get; private set; }
public UpdatedPackagesViewModel UpdatedPackagesViewModel {
get { return updatedPackagesViewModel; }
}
public RecentPackagesViewModel RecentPackagesViewModel {
get { return recentPackagesViewModel; }
public void Dispose()
{
AvailablePackagesViewModel.Dispose();
InstalledPackagesViewModel.Dispose();
RecentPackagesViewModel.Dispose();
UpdatedPackagesViewModel.Dispose();
}
public void ShowErrorMessage(string message)

14
src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackagesViewModel.cs

@ -20,8 +20,8 @@ namespace ICSharpCode.PackageManagement @@ -20,8 +20,8 @@ namespace ICSharpCode.PackageManagement
ITaskFactory taskFactory)
: base(packageManagementService, messageReporter, taskFactory)
{
packageManagementService.ParentPackageInstalled += PackageInstalled;
packageManagementService.ParentPackageUninstalled += PackageUninstalled;
packageManagementService.ParentPackageInstalled += ParentPackageInstalled;
packageManagementService.ParentPackageUninstalled += ParentPackageUninstalled;
GetActiveProjectManager();
}
@ -35,16 +35,22 @@ namespace ICSharpCode.PackageManagement @@ -35,16 +35,22 @@ namespace ICSharpCode.PackageManagement
}
}
void PackageInstalled(object sender, EventArgs e)
void ParentPackageInstalled(object sender, EventArgs e)
{
ReadPackages();
}
void PackageUninstalled(object sender, EventArgs e)
void ParentPackageUninstalled(object sender, EventArgs e)
{
ReadPackages();
}
protected override void OnDispose()
{
PackageManagementService.ParentPackageInstalled -= ParentPackageInstalled;
PackageManagementService.ParentPackageUninstalled -= ParentPackageUninstalled;
}
protected override void UpdateRepositoryBeforeReadPackagesTaskStarts()
{
if (projectManager != null) {

91
src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs

@ -11,27 +11,15 @@ using NuGet; @@ -11,27 +11,15 @@ using NuGet;
namespace ICSharpCode.PackageManagement
{
public abstract class PackagesViewModel : ViewModelBase<PackagesViewModel>
public abstract class PackagesViewModel : ViewModelBase<PackagesViewModel>, IDisposable
{
DelegateCommand showNextPageCommand;
DelegateCommand showPreviousPageCommand;
DelegateCommand showPageCommand;
DelegateCommand searchCommand;
ObservableCollection<PackageViewModel> packageViewModels =
new ObservableCollection<PackageViewModel>();
Pages pages = new Pages();
IPackageManagementService packageManagementService;
IPackageViewModelFactory packageViewModelFactory;
ITaskFactory taskFactory;
IEnumerable<IPackage> allPackages;
string searchTerms;
bool isReadingPackages;
ITask<PackagesForSelectedPageResult> task;
int totalItems;
bool hasError;
string errorMessage = String.Empty;
public PackagesViewModel(
IPackageManagementService packageManagementService,
@ -66,53 +54,47 @@ namespace ICSharpCode.PackageManagement @@ -66,53 +54,47 @@ namespace ICSharpCode.PackageManagement
this.packageViewModelFactory = packageViewModelFactory;
this.taskFactory = taskFactory;
PackageViewModels = new ObservableCollection<PackageViewModel>();
ErrorMessage = String.Empty;
CreateCommands();
}
void CreateCommands()
{
showNextPageCommand = new DelegateCommand(param => ShowNextPage());
showPreviousPageCommand = new DelegateCommand(param => ShowPreviousPage());
showPageCommand = new DelegateCommand(param => ExecuteShowPageCommand(param));
searchCommand = new DelegateCommand(param => Search());
ShowNextPageCommand = new DelegateCommand(param => ShowNextPage());
ShowPreviousPageCommand = new DelegateCommand(param => ShowPreviousPage());
ShowPageCommand = new DelegateCommand(param => ExecuteShowPageCommand(param));
SearchCommand = new DelegateCommand(param => Search());
}
public ICommand ShowNextPageCommand {
get { return showNextPageCommand; }
}
public ICommand ShowNextPageCommand { get; private set; }
public ICommand ShowPreviousPageCommand { get; private set; }
public ICommand ShowPageCommand { get; private set; }
public ICommand SearchCommand { get; private set; }
public ICommand ShowPreviousPageCommand {
get { return showPreviousPageCommand; }
public void Dispose()
{
OnDispose();
IsDisposed = true;
}
public ICommand ShowPageCommand {
get { return showPageCommand; }
protected virtual void OnDispose()
{
}
public ICommand SearchCommand {
get { return searchCommand; }
}
public bool IsDisposed { get; private set; }
public bool HasError {
get { return hasError; }
}
public bool HasError { get; private set; }
public string ErrorMessage { get; private set; }
public string ErrorMessage {
get { return errorMessage; }
}
public ObservableCollection<PackageViewModel> PackageViewModels {
get { return packageViewModels; }
set { packageViewModels = value; }
}
public ObservableCollection<PackageViewModel> PackageViewModels { get; set; }
public IPackageManagementService PackageManagementService {
get { return packageManagementService; }
}
public bool IsReadingPackages {
get { return isReadingPackages; }
}
public bool IsReadingPackages { get; private set; }
public void ReadPackages()
{
@ -124,8 +106,8 @@ namespace ICSharpCode.PackageManagement @@ -124,8 +106,8 @@ namespace ICSharpCode.PackageManagement
void StartReadPackagesTask()
{
isReadingPackages = true;
hasError = false;
IsReadingPackages = true;
HasError = false;
ClearPackages();
CancelReadPackagesTask();
CreateReadPackagesTask();
@ -153,12 +135,12 @@ namespace ICSharpCode.PackageManagement @@ -153,12 +135,12 @@ namespace ICSharpCode.PackageManagement
PackagesForSelectedPageResult GetPackagesForSelectedPageResult()
{
IEnumerable<IPackage> packages = GetPackagesForSelectedPage();
return new PackagesForSelectedPageResult(packages, totalItems);
return new PackagesForSelectedPageResult(packages, TotalItems);
}
void OnPackagesReadForSelectedPage(ITask<PackagesForSelectedPageResult> task)
{
isReadingPackages = false;
IsReadingPackages = false;
if (task.IsFaulted) {
SaveError(task.Exception);
} else if (task.IsCancelled) {
@ -176,8 +158,8 @@ namespace ICSharpCode.PackageManagement @@ -176,8 +158,8 @@ namespace ICSharpCode.PackageManagement
protected void SaveError(Exception ex)
{
hasError = true;
errorMessage = ex.Message;
HasError = true;
ErrorMessage = ex.Message;
}
void UpdatePackagesForSelectedPage(PackagesForSelectedPageResult result)
@ -205,7 +187,7 @@ namespace ICSharpCode.PackageManagement @@ -205,7 +187,7 @@ namespace ICSharpCode.PackageManagement
IQueryable<IPackage> packages = GetAllPackages();
packages = OrderPackages(packages);
packages = FilterPackagesBySearchCriteria(packages);
totalItems = packages.Count();
TotalItems = packages.Count();
allPackages = GetFilteredPackagesBeforePagingResults(packages);
}
return allPackages;
@ -225,10 +207,10 @@ namespace ICSharpCode.PackageManagement @@ -225,10 +207,10 @@ namespace ICSharpCode.PackageManagement
string GetSearchCriteria()
{
if (String.IsNullOrWhiteSpace(searchTerms)) {
if (String.IsNullOrWhiteSpace(SearchTerms)) {
return null;
}
return searchTerms;
return SearchTerms;
}
protected virtual IQueryable<IPackage> FilterPackagesBySearchCriteria(IQueryable<IPackage> packages, string searchCriteria)
@ -333,9 +315,7 @@ namespace ICSharpCode.PackageManagement @@ -333,9 +315,7 @@ namespace ICSharpCode.PackageManagement
set { pages.MaximumSelectablePages = value; }
}
public int TotalItems {
get { return totalItems; }
}
public int TotalItems { get; private set; }
public void ShowNextPage()
{
@ -360,10 +340,7 @@ namespace ICSharpCode.PackageManagement @@ -360,10 +340,7 @@ namespace ICSharpCode.PackageManagement
public bool IsSearchable { get; set; }
public string SearchTerms {
get { return searchTerms; }
set { searchTerms = value; }
}
public string SearchTerms { get; set; }
public void Search()
{

14
src/AddIns/Misc/PackageManagement/Project/Src/RecentPackagesViewModel.cs

@ -18,20 +18,26 @@ namespace ICSharpCode.PackageManagement @@ -18,20 +18,26 @@ namespace ICSharpCode.PackageManagement
: base(packageManagementService, messageReporter, taskFactory)
{
recentPackageRepository = packageManagementService.RecentPackageRepository;
packageManagementService.ParentPackageInstalled += PackageInstalled;
packageManagementService.ParentPackageUninstalled += PackageUninstalled;
packageManagementService.ParentPackageInstalled += ParentPackageInstalled;
packageManagementService.ParentPackageUninstalled += ParentPackageUninstalled;
}
void PackageInstalled(object sender, EventArgs e)
void ParentPackageInstalled(object sender, EventArgs e)
{
ReadPackages();
}
void PackageUninstalled(object sender, EventArgs e)
void ParentPackageUninstalled(object sender, EventArgs e)
{
ReadPackages();
}
protected override void OnDispose()
{
PackageManagementService.ParentPackageInstalled -= ParentPackageInstalled;
PackageManagementService.ParentPackageUninstalled -= ParentPackageUninstalled;
}
protected override IQueryable<IPackage> GetAllPackages()
{
return recentPackageRepository.GetPackages();

4
src/AddIns/Misc/PackageManagement/Project/Src/ViewModelLocator.cs

@ -16,9 +16,7 @@ namespace ICSharpCode.PackageManagement @@ -16,9 +16,7 @@ namespace ICSharpCode.PackageManagement
public AddPackageReferenceViewModel AddPackageReferenceViewModel {
get {
if (addPackageReferenceViewModel == null) {
CreateAddPackageReferenceViewModel();
}
CreateAddPackageReferenceViewModel();
return addPackageReferenceViewModel;
}
}

44
src/AddIns/Misc/PackageManagement/Test/Src/AddPackageReferenceViewModelTests.cs

@ -215,5 +215,49 @@ namespace PackageManagement.Tests @@ -215,5 +215,49 @@ namespace PackageManagement.Tests
Assert.IsFalse(viewModel.HasError);
}
[Test]
public void Dispose_ContainedViewModelsAreDisposed_AvailablePackagesViewModelIsDisposed()
{
CreateViewModel();
viewModel.Dispose();
bool disposed = viewModel.AvailablePackagesViewModel.IsDisposed;
Assert.IsTrue(disposed);
}
[Test]
public void Dispose_ContainedViewModelsAreDisposed_InstaledPackagesViewModelIsDisposed()
{
CreateViewModel();
viewModel.Dispose();
bool disposed = viewModel.InstalledPackagesViewModel.IsDisposed;
Assert.IsTrue(disposed);
}
[Test]
public void Dispose_ContainedViewModelsAreDisposed_UpdatedPackagesViewModelIsDisposed()
{
CreateViewModel();
viewModel.Dispose();
bool disposed = viewModel.UpdatedPackagesViewModel.IsDisposed;
Assert.IsTrue(disposed);
}
[Test]
public void Dispose_ContainedViewModelsAreDisposed_RecentPackagesViewModelIsDisposed()
{
CreateViewModel();
viewModel.Dispose();
bool disposed = viewModel.RecentPackagesViewModel.IsDisposed;
Assert.IsTrue(disposed);
}
}
}

54
src/AddIns/Misc/PackageManagement/Test/Src/InstalledPackagesViewModelTests.cs

@ -51,16 +51,21 @@ namespace PackageManagement.Tests @@ -51,16 +51,21 @@ namespace PackageManagement.Tests
taskFactory.ClearAllFakeTasks();
}
FakePackage AddPackageToProjectManagerLocalPackageRepository()
{
var package = new FakePackage("Test");
FakePackageRepository repository = packageManagementService.FakeActiveProjectManager.FakeLocalRepository;
repository.FakePackages.Add(package);
return package;
}
[Test]
public void PackageViewModels_PackageReferenceIsAdded_PackageViewModelsIsUpdated()
{
CreateViewModel();
viewModel.ReadPackages();
CompleteReadPackagesTask();
FakePackage package = new FakePackage();
package.Id = "Test";
FakePackageRepository repository = packageManagementService.FakeActiveProjectManager.FakeLocalRepository;
repository.FakePackages.Add(package);
FakePackage package = AddPackageToProjectManagerLocalPackageRepository();
ClearReadPackagesTasks();
packageManagementService.FireParentPackageInstalled();
@ -74,14 +79,11 @@ namespace PackageManagement.Tests @@ -74,14 +79,11 @@ namespace PackageManagement.Tests
public void PackageViewModels_PackageReferenceIsRemoved_PackageViewModelsIsUpdated()
{
CreateViewModel();
FakePackage package = new FakePackage();
package.Id = "Test";
FakePackageRepository repository = packageManagementService.FakeActiveProjectManager.FakeLocalRepository;
repository.FakePackages.Add(package);
FakePackage package = AddPackageToProjectManagerLocalPackageRepository();
viewModel.ReadPackages();
CompleteReadPackagesTask();
repository.FakePackages.Clear();
packageManagementService.FakeActiveProjectManager.FakeLocalRepository.FakePackages.Clear();
ClearReadPackagesTasks();
packageManagementService.FireParentPackageUninstalled();
@ -115,5 +117,39 @@ namespace PackageManagement.Tests @@ -115,5 +117,39 @@ namespace PackageManagement.Tests
Assert.AreEqual(1, viewModel.PackageViewModels.Count);
}
[Test]
public void PackageViewModels_PackageReferenceIsAddedAfterViewModelIsDisposed_PackageViewModelsIsNotUpdated()
{
CreateViewModel();
viewModel.ReadPackages();
CompleteReadPackagesTask();
FakePackage package = AddPackageToProjectManagerLocalPackageRepository();
ClearReadPackagesTasks();
viewModel.Dispose();
packageManagementService.FireParentPackageInstalled();
CompleteReadPackagesTask();
Assert.AreEqual(0, viewModel.PackageViewModels.Count);
}
[Test]
public void PackageViewModels_PackageReferenceIsRemovedAfterViewModelIsDisposed_PackageViewModelsIsNotUpdated()
{
CreateViewModel();
FakePackage package = AddPackageToProjectManagerLocalPackageRepository();
viewModel.ReadPackages();
CompleteReadPackagesTask();
packageManagementService.FakeActiveProjectManager.FakeLocalRepository.FakePackages.Clear();
ClearReadPackagesTasks();
viewModel.Dispose();
packageManagementService.FireParentPackageUninstalled();
CompleteReadPackagesTask();
Assert.AreEqual(1, viewModel.PackageViewModels.Count);
}
}
}

17
src/AddIns/Misc/PackageManagement/Test/Src/PackagesViewModelTests.cs

@ -1235,5 +1235,22 @@ namespace PackageManagement.Tests @@ -1235,5 +1235,22 @@ namespace PackageManagement.Tests
Assert.IsNull(viewModel.SearchCriteriaPassedToFilterPackagesBySearchCriteria);
}
[Test]
public void IsDisposed_DisposeMethodCalled_ReturnsTrue()
{
CreateViewModel();
viewModel.Dispose();
Assert.IsTrue(viewModel.IsDisposed);
}
[Test]
public void IsDisposed_DisposeMethodNotCalled_ReturnsFalse()
{
CreateViewModel();
Assert.IsFalse(viewModel.IsDisposed);
}
}
}

50
src/AddIns/Misc/PackageManagement/Test/Src/RecentPackagesViewModelTests.cs

@ -44,15 +44,21 @@ namespace PackageManagement.Tests @@ -44,15 +44,21 @@ namespace PackageManagement.Tests
taskFactory.ClearAllFakeTasks();
}
FakePackage AddPackageToRecentPackageRepository()
{
var package = new FakePackage("Test");
FakePackageRepository repository = packageManagementService.FakeRecentPackageRepository;
repository.FakePackages.Add(package);
return package;
}
[Test]
public void PackageViewModels_PackageIsInstalledAfterRecentPackagesDisplayed_PackagesOnDisplayAreUpdated()
{
CreateViewModel();
viewModel.ReadPackages();
CompleteReadPackagesTask();
var package = new FakePackage("Test");
FakePackageRepository repository = packageManagementService.FakeRecentPackageRepository;
repository.FakePackages.Add(package);
var package = AddPackageToRecentPackageRepository();
ClearReadPackagesTasks();
packageManagementService.FireParentPackageInstalled();
@ -71,9 +77,7 @@ namespace PackageManagement.Tests @@ -71,9 +77,7 @@ namespace PackageManagement.Tests
CreateViewModel();
viewModel.ReadPackages();
CompleteReadPackagesTask();
var package = new FakePackage("Test");
FakePackageRepository repository = packageManagementService.FakeRecentPackageRepository;
repository.FakePackages.Add(package);
var package = AddPackageToRecentPackageRepository();
ClearReadPackagesTasks();
packageManagementService.FireParentPackageUninstalled();
@ -85,5 +89,39 @@ namespace PackageManagement.Tests @@ -85,5 +89,39 @@ namespace PackageManagement.Tests
PackageCollectionAssert.AreEqual(expectedPackages, viewModel.PackageViewModels);
}
[Test]
public void PackageViewModels_PackageIsUninstalledAfterViewModelIsDisposed_PackagesOnDisplayAreNotUpdated()
{
CreateViewModel();
viewModel.ReadPackages();
CompleteReadPackagesTask();
AddPackageToRecentPackageRepository();
ClearReadPackagesTasks();
viewModel.Dispose();
packageManagementService.FireParentPackageUninstalled();
CompleteReadPackagesTask();
Assert.AreEqual(0, viewModel.PackageViewModels.Count);
}
[Test]
public void PackageViewModels_PackageIsInstalledAfterViewModelIsDisposed_PackagesOnDisplayAreNotUpdated()
{
CreateViewModel();
viewModel.ReadPackages();
CompleteReadPackagesTask();
AddPackageToRecentPackageRepository();
ClearReadPackagesTasks();
viewModel.Dispose();
packageManagementService.FireParentPackageInstalled();
CompleteReadPackagesTask();
Assert.AreEqual(0, viewModel.PackageViewModels.Count);
}
}
}

Loading…
Cancel
Save