From d9028a73bc888f8fa5d82851b5e04069195c3837 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Tue, 1 Jan 2013 18:42:25 +0000 Subject: [PATCH 01/22] Fix FormatException in Class Diagram addin. Visual Studio class diagrams do not store the Collapsed xml attribute when the item is not collapsed. --- .../ClassCanvas/ClassCanvas.csproj | 1 + .../ClassCanvas/Src/ClassCanvasItem.cs | 4 ++-- .../Src/XPathNavigatorExtensions.cs | 21 +++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 src/AddIns/DisplayBindings/ClassDiagram/ClassCanvas/Src/XPathNavigatorExtensions.cs diff --git a/src/AddIns/DisplayBindings/ClassDiagram/ClassCanvas/ClassCanvas.csproj b/src/AddIns/DisplayBindings/ClassDiagram/ClassCanvas/ClassCanvas.csproj index 6934cb8827..d2c30e8591 100644 --- a/src/AddIns/DisplayBindings/ClassDiagram/ClassCanvas/ClassCanvas.csproj +++ b/src/AddIns/DisplayBindings/ClassDiagram/ClassCanvas/ClassCanvas.csproj @@ -78,6 +78,7 @@ + ClassCanvas.Designer.cs diff --git a/src/AddIns/DisplayBindings/ClassDiagram/ClassCanvas/Src/ClassCanvasItem.cs b/src/AddIns/DisplayBindings/ClassDiagram/ClassCanvas/Src/ClassCanvasItem.cs index bdd450f963..e02d34ce4e 100644 --- a/src/AddIns/DisplayBindings/ClassDiagram/ClassCanvas/Src/ClassCanvasItem.cs +++ b/src/AddIns/DisplayBindings/ClassDiagram/ClassCanvas/Src/ClassCanvasItem.cs @@ -625,7 +625,7 @@ namespace ClassDiagram { base.LoadFromXml(navigator); - Collapsed = bool.Parse(navigator.GetAttribute("Collapsed", "")); + Collapsed = navigator.GetBooleanAttribute("Collapsed"); XPathNodeIterator compNI = navigator.Select("Compartments/Compartment"); while (compNI.MoveNext()) @@ -634,7 +634,7 @@ namespace ClassDiagram InteractiveHeaderedItem grp; if (groupsByName.TryGetValue(compNav.GetAttribute("Name", ""), out grp)) { - grp.Collapsed = bool.Parse(compNav.GetAttribute("Collapsed", "")); + grp.Collapsed = compNav.GetBooleanAttribute("Collapsed"); } } } diff --git a/src/AddIns/DisplayBindings/ClassDiagram/ClassCanvas/Src/XPathNavigatorExtensions.cs b/src/AddIns/DisplayBindings/ClassDiagram/ClassCanvas/Src/XPathNavigatorExtensions.cs new file mode 100644 index 0000000000..44ff473669 --- /dev/null +++ b/src/AddIns/DisplayBindings/ClassDiagram/ClassCanvas/Src/XPathNavigatorExtensions.cs @@ -0,0 +1,21 @@ +// 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.Xml.XPath; + +namespace ClassDiagram +{ + public static class XPathNavigatorExtensions + { + public static bool GetBooleanAttribute(this XPathNavigator navigator, string name, string namespaceUri = "") + { + string attributeValue = navigator.GetAttribute(name, namespaceUri); + bool result = false; + if (bool.TryParse(attributeValue, out result)) { + return true; + } + return false; + } + } +} From 5f770be65662758ca50839ed8dfa2e5fa908e834 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 23 Dec 2012 17:02:51 +0100 Subject: [PATCH 02/22] Fixed SearchAndReplaceBinding.Detach --- .../SearchAndReplace/Project/SearchOptions.cs | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/AddIns/Misc/SearchAndReplace/Project/SearchOptions.cs b/src/AddIns/Misc/SearchAndReplace/Project/SearchOptions.cs index 3414b68982..843a635687 100644 --- a/src/AddIns/Misc/SearchAndReplace/Project/SearchOptions.cs +++ b/src/AddIns/Misc/SearchAndReplace/Project/SearchOptions.cs @@ -159,15 +159,18 @@ namespace SearchAndReplace public class SearchAndReplaceBinding : DefaultLanguageBinding { + TextArea textArea; SearchInputHandler handler; public override void Attach(ITextEditor editor) { - TextArea textArea = editor.GetService(typeof(TextArea)) as TextArea; - if (textArea == null) return; - handler = new SearchInputHandler(textArea); - textArea.DefaultInputHandler.NestedInputHandlers.Add(handler); - handler.SearchOptionsChanged += SearchOptionsChanged; + base.Attach(editor); + textArea = editor.GetService(typeof(TextArea)) as TextArea; + if (textArea != null) { + handler = new SearchInputHandler(textArea); + textArea.DefaultInputHandler.NestedInputHandlers.Add(handler); + handler.SearchOptionsChanged += SearchOptionsChanged; + } } void SearchOptionsChanged(object sender, SearchOptionsChangedEventArgs e) @@ -180,10 +183,12 @@ namespace SearchAndReplace public override void Detach() { - if (handler != null) { - handler.SearchOptionsChanged -= SearchOptionsChanged; + base.Detach(); + if (textArea != null) { + textArea.DefaultInputHandler.NestedInputHandlers.Remove(handler); + textArea = null; + handler = null; } - handler = null; } } } From 176b2834c05f55d9b4ca7238dfe5393bdd5a1fcd Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Thu, 3 Jan 2013 13:36:35 +0000 Subject: [PATCH 03/22] Allow enter key when editing standard file headers. --- .../Dialogs/OptionPanels/IDEOptions/EditStandardHeaderPanel.xaml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/IDEOptions/EditStandardHeaderPanel.xaml b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/IDEOptions/EditStandardHeaderPanel.xaml index 7640030384..b90f89d24e 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/IDEOptions/EditStandardHeaderPanel.xaml +++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/IDEOptions/EditStandardHeaderPanel.xaml @@ -17,6 +17,7 @@ Content="{core:Localize Dialog.Options.IDEOptions.EditStandardHeaderPanel.HeaderLabel}"> From f75a871712181577d5d3b16fad6f2b1ad4dd4c0a Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Thu, 3 Jan 2013 18:54:56 +0000 Subject: [PATCH 04/22] Fix blank package summary in Manage Packages dialog packages list. Display NuGet package description if the summary is missing. --- .../Project/Src/PackageViewModel.cs | 7 +++++- .../Test/Src/PackageViewModelTests.cs | 23 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs index 0b86281138..d1dae577ea 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs @@ -130,7 +130,12 @@ namespace ICSharpCode.PackageManagement } public string Summary { - get { return package.Summary; } + get { + if (!String.IsNullOrEmpty(package.Summary)) { + return package.Summary; + } + return package.Description; + } } public SemanticVersion Version { diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageViewModelTests.cs index 810901c44d..8b250c30c3 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageViewModelTests.cs @@ -1246,5 +1246,28 @@ namespace PackageManagement.Tests ILogger actualLogger = project.Logger; Assert.AreEqual(expectedLogger, actualLogger); } + + [Test] + public void Summary_PackageHasSummary_PackageSummaryReturned() + { + CreateViewModel(); + fakePackage.Summary = "Expected summary"; + + string summary = viewModel.Summary; + + Assert.AreEqual("Expected summary", summary); + } + + [Test] + public void Summary_PackageHasDescriptionButNoSummary_PackageDescriptionReturned() + { + CreateViewModel(); + fakePackage.Summary = String.Empty; + fakePackage.Description = "Expected description"; + + string summary = viewModel.Summary; + + Assert.AreEqual("Expected description", summary); + } } } From 5bacb5f5dd0a1df9078fea3a208cee1695cd332d Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 5 Jan 2013 00:42:45 +0100 Subject: [PATCH 05/22] Fix progress bar when running a search in the background. --- .../Project/Gui/SearchAndReplacePanel.cs | 44 ++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchAndReplacePanel.cs b/src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchAndReplacePanel.cs index 7d7a423c5e..367605aacb 100644 --- a/src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchAndReplacePanel.cs +++ b/src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchAndReplacePanel.cs @@ -100,33 +100,37 @@ namespace SearchAndReplace void FindAllButtonClicked(object sender, EventArgs e) { WritebackOptions(); - using (var monitor = WorkbenchSingleton.StatusBar.CreateProgressMonitor()) { - monitor.TaskName = StringParser.Parse("${res:AddIns.SearchReplace.SearchProgressTitle}"); - try { - var location = new SearchLocation(SearchOptions.SearchTarget, SearchOptions.LookIn, SearchOptions.LookInFiletypes, SearchOptions.IncludeSubdirectories, SearchOptions.SearchTarget == SearchTarget.CurrentSelection ? SearchManager.GetActiveSelection(false) : null); - var strategy = SearchStrategyFactory.Create(SearchOptions.FindPattern, !SearchOptions.MatchCase, SearchOptions.MatchWholeWord, SearchOptions.SearchMode); - var results = SearchManager.FindAllParallel(strategy, location, monitor); - SearchManager.ShowSearchResults(SearchOptions.FindPattern, results); - } catch (SearchPatternException ex) { - MessageService.ShowError(ex.Message); - } catch (OperationCanceledException) {} + var location = new SearchLocation(SearchOptions.SearchTarget, SearchOptions.LookIn, SearchOptions.LookInFiletypes, SearchOptions.IncludeSubdirectories, SearchOptions.SearchTarget == SearchTarget.CurrentSelection ? SearchManager.GetActiveSelection(false) : null); + ISearchStrategy strategy; + try { + strategy = SearchStrategyFactory.Create(SearchOptions.FindPattern, !SearchOptions.MatchCase, SearchOptions.MatchWholeWord, SearchOptions.SearchMode); + } catch (SearchPatternException ex) { + MessageService.ShowError(ex.Message); + return; } + // No using block for the monitor; it is disposed when the asynchronous search finishes + var monitor = WorkbenchSingleton.StatusBar.CreateProgressMonitor(); + monitor.TaskName = StringParser.Parse("${res:AddIns.SearchReplace.SearchProgressTitle}"); + var results = SearchManager.FindAllParallel(strategy, location, monitor); + SearchManager.ShowSearchResults(SearchOptions.FindPattern, results); } void BookmarkAllButtonClicked(object sender, EventArgs e) { WritebackOptions(); - using (var monitor = WorkbenchSingleton.StatusBar.CreateProgressMonitor()) { - monitor.TaskName = StringParser.Parse("${res:AddIns.SearchReplace.SearchProgressTitle}"); - try { - var location = new SearchLocation(SearchOptions.SearchTarget, SearchOptions.LookIn, SearchOptions.LookInFiletypes, SearchOptions.IncludeSubdirectories, SearchOptions.SearchTarget == SearchTarget.CurrentSelection ? SearchManager.GetActiveSelection(false) : null); - var strategy = SearchStrategyFactory.Create(SearchOptions.FindPattern, !SearchOptions.MatchCase, SearchOptions.MatchWholeWord, SearchOptions.SearchMode); - var results = SearchManager.FindAllParallel(strategy, location, monitor); - SearchManager.MarkAll(results); - } catch (SearchPatternException ex) { - MessageService.ShowError(ex.Message); - } catch (OperationCanceledException) {} + var location = new SearchLocation(SearchOptions.SearchTarget, SearchOptions.LookIn, SearchOptions.LookInFiletypes, SearchOptions.IncludeSubdirectories, SearchOptions.SearchTarget == SearchTarget.CurrentSelection ? SearchManager.GetActiveSelection(false) : null); + ISearchStrategy strategy; + try { + strategy = SearchStrategyFactory.Create(SearchOptions.FindPattern, !SearchOptions.MatchCase, SearchOptions.MatchWholeWord, SearchOptions.SearchMode); + } catch (SearchPatternException ex) { + MessageService.ShowError(ex.Message); + return; } + // No using block for the monitor; it is disposed when the asynchronous search finishes + var monitor = WorkbenchSingleton.StatusBar.CreateProgressMonitor(); + monitor.TaskName = StringParser.Parse("${res:AddIns.SearchReplace.SearchProgressTitle}"); + var results = SearchManager.FindAllParallel(strategy, location, monitor); + SearchManager.MarkAll(results); } void ReplaceAllButtonClicked(object sender, EventArgs e) From 2d45e51d813883b1154123bd387d14c4bb09c87c Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 5 Jan 2013 13:43:31 +0000 Subject: [PATCH 06/22] Fix blank summary in NuGet package license accept dialog. Use description if the package summary is missing. --- .../Project/PackageManagement.csproj | 2 + .../Project/Src/IPackageExtensions.cs | 21 +++++++ .../Project/Src/LicenseAcceptanceViewModel.cs | 8 ++- .../Project/Src/PackageLicenseViewModel.cs | 30 ++++++++++ .../Project/Src/PackageViewModel.cs | 7 +-- .../Test/PackageManagement.Tests.csproj | 1 + .../Test/Src/IPackageExtensionsTests.cs | 55 +++++++++++++++++++ .../Src/LicenseAcceptanceViewModelTests.cs | 11 +++- 8 files changed, 125 insertions(+), 10 deletions(-) create mode 100644 src/AddIns/Misc/PackageManagement/Project/Src/IPackageExtensions.cs create mode 100644 src/AddIns/Misc/PackageManagement/Project/Src/PackageLicenseViewModel.cs create mode 100644 src/AddIns/Misc/PackageManagement/Test/Src/IPackageExtensionsTests.cs diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj index 7dc8c26465..f00dfc4d90 100644 --- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj +++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj @@ -149,6 +149,7 @@ + @@ -220,6 +221,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageExtensions.cs b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageExtensions.cs new file mode 100644 index 0000000000..5ddc014a53 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageExtensions.cs @@ -0,0 +1,21 @@ +// 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 NuGet; + +namespace ICSharpCode.PackageManagement +{ + public static class IPackageExtensions + { + /// + /// Returns description if summary is missing. + /// + public static string SummaryOrDescription(this IPackage package) + { + if (String.IsNullOrEmpty(package.Summary)) + return package.Description; + return package.Summary; + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/LicenseAcceptanceViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/LicenseAcceptanceViewModel.cs index 04d91af7bc..cc368db0f3 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/LicenseAcceptanceViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/LicenseAcceptanceViewModel.cs @@ -10,14 +10,16 @@ namespace ICSharpCode.PackageManagement { public class LicenseAcceptanceViewModel : ViewModelBase { - IList packages; + IList packages; public LicenseAcceptanceViewModel(IEnumerable packages) { - this.packages = packages.ToList(); + this.packages = packages + .Select(p => new PackageLicenseViewModel(p)) + .ToList(); } - public IEnumerable Packages { + public IEnumerable Packages { get { return packages; } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageLicenseViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageLicenseViewModel.cs new file mode 100644 index 0000000000..e077304a18 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageLicenseViewModel.cs @@ -0,0 +1,30 @@ +// 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 NuGet; + +namespace ICSharpCode.PackageManagement +{ + public class PackageLicenseViewModel : ViewModelBase + { + IPackage package; + + public PackageLicenseViewModel(IPackage package) + { + this.package = package; + } + + public string Id { + get { return package.Id; } + } + + public string Summary { + get { return package.SummaryOrDescription(); } + } + + public Uri LicenseUrl { + get { return package.LicenseUrl; } + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs index d1dae577ea..5a3fdb1b90 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs @@ -130,12 +130,7 @@ namespace ICSharpCode.PackageManagement } public string Summary { - get { - if (!String.IsNullOrEmpty(package.Summary)) { - return package.Summary; - } - return package.Description; - } + get { return package.SummaryOrDescription(); } } public SemanticVersion Version { diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj index c9770d7d18..ead1877239 100644 --- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj +++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj @@ -134,6 +134,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/IPackageExtensionsTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/IPackageExtensionsTests.cs new file mode 100644 index 0000000000..65c535cf10 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/IPackageExtensionsTests.cs @@ -0,0 +1,55 @@ +// 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 ICSharpCode.PackageManagement; +using ICSharpCode.SharpDevelop; +using ICSharpCode.PackageManagement.Design; +using NuGet; +using NUnit.Framework; + +namespace PackageManagement.Tests +{ + [TestFixture] + public class IPackageExtensionsTests + { + FakePackage package; + + void CreatePackageWithSummary(string summary) + { + package = new FakePackage() { Summary = summary }; + } + + [Test] + public void SummaryOrDescription_PackageHasSummary_ReturnsSummary() + { + CreatePackageWithSummary("summary"); + + string result = package.SummaryOrDescription(); + + Assert.AreEqual("summary", result); + } + + [Test] + public void SummaryOrDescription_PackageHasDescriptionButNullSummary_ReturnsDescription() + { + CreatePackageWithSummary(null); + package.Description = "description"; + + string result = package.SummaryOrDescription(); + + Assert.AreEqual("description", result); + } + + [Test] + public void SummaryOrDescription_PackageHasDescriptionButEmptySummary_ReturnsDescription() + { + CreatePackageWithSummary(String.Empty); + package.Description = "description"; + + string result = package.SummaryOrDescription(); + + Assert.AreEqual("description", result); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/LicenseAcceptanceViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/LicenseAcceptanceViewModelTests.cs index 2e5685cdbf..9a4d20962f 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/LicenseAcceptanceViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/LicenseAcceptanceViewModelTests.cs @@ -3,6 +3,8 @@ using System; using System.Collections.Generic; +using System.Linq; + using ICSharpCode.PackageManagement; using ICSharpCode.PackageManagement.Design; using NuGet; @@ -65,7 +67,14 @@ namespace PackageManagement.Tests { CreateViewModelWithOnePackage(); - CollectionAssert.AreEqual(packages, viewModel.Packages); + List packageViewModels = viewModel.Packages.ToList(); + PackageLicenseViewModel firstPackageViewModel = packageViewModels.FirstOrDefault(); + + FakePackage expectedPackage = packages[0]; + Assert.AreEqual(1, packageViewModels.Count); + Assert.AreEqual(expectedPackage.Id, firstPackageViewModel.Id); + Assert.AreEqual(expectedPackage.LicenseUrl, firstPackageViewModel.LicenseUrl); + Assert.AreEqual(expectedPackage.SummaryOrDescription(), firstPackageViewModel.Summary); } [Test] From c7e1cece1a3761cecee424bcf28a69cbfaf4149e Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 6 Jan 2013 13:00:41 +0000 Subject: [PATCH 07/22] Fix index out of range exception in Package Sources option panel. Disable move buttons if no package source selected. --- .../Src/RegisteredPackageSourcesViewModel.cs | 15 +++++++++--- .../RegisteredPackageSourcesViewModelTests.cs | 24 +++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourcesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourcesViewModel.cs index 0d605f85d1..0b9cc60bf2 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourcesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourcesViewModel.cs @@ -170,7 +170,7 @@ namespace ICSharpCode.PackageManagement } public bool CanRemovePackageSource { - get { return selectedPackageSourceViewModel != null; } + get { return IsPackageSourceSelected(); } } void RemoveSelectedPackageSourceViewModel() @@ -192,10 +192,17 @@ namespace ICSharpCode.PackageManagement public bool CanMovePackageSourceUp { get { - return HasAtLeastTwoPackageSources() && !IsFirstPackageSourceSelected(); + return HasAtLeastTwoPackageSources() && + IsPackageSourceSelected() && + !IsFirstPackageSourceSelected(); } } + bool IsPackageSourceSelected() + { + return selectedPackageSourceViewModel != null; + } + bool IsFirstPackageSourceSelected() { return selectedPackageSourceViewModel == packageSourceViewModels[0]; @@ -210,7 +217,9 @@ namespace ICSharpCode.PackageManagement public bool CanMovePackageSourceDown { get { - return HasAtLeastTwoPackageSources() && !IsLastPackageSourceSelected(); + return HasAtLeastTwoPackageSources() && + IsPackageSourceSelected() && + !IsLastPackageSourceSelected(); } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/RegisteredPackageSourcesViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/RegisteredPackageSourcesViewModelTests.cs index 34256818e4..cc915dac12 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/RegisteredPackageSourcesViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/RegisteredPackageSourcesViewModelTests.cs @@ -445,6 +445,30 @@ namespace PackageManagement.Tests Assert.IsFalse(result); } + [Test] + public void CanMovePackageSourceUp_TwoPackageSourcesAndNothingIsSelected_ReturnsFalse() + { + CreateViewModelWithTwoPackageSources(); + viewModel.Load(); + viewModel.SelectedPackageSourceViewModel = null; + + bool result = viewModel.CanMovePackageSourceUp; + + Assert.IsFalse(result); + } + + [Test] + public void CanMovePackageSourceDown_TwoPackageSourcesAndNothingIsSelected_ReturnsFalse() + { + CreateViewModelWithTwoPackageSources(); + viewModel.Load(); + viewModel.SelectedPackageSourceViewModel = null; + + bool result = viewModel.CanMovePackageSourceDown; + + Assert.IsFalse(result); + } + [Test] public void SelectedPackageSourceViewModel_PropertyChanged_FiresPropertyChangedEvent() { From 33049ce242c513ff6258f4f87973d1d03ef78f7b Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 6 Jan 2013 14:43:49 +0100 Subject: [PATCH 08/22] Fix context actions popup disappearing when clicking the SharpDevelop title bar. --- src/Main/ICSharpCode.Core.Presentation/ExtendedPopup.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Main/ICSharpCode.Core.Presentation/ExtendedPopup.cs b/src/Main/ICSharpCode.Core.Presentation/ExtendedPopup.cs index e2f284004b..3dd4e3d793 100644 --- a/src/Main/ICSharpCode.Core.Presentation/ExtendedPopup.cs +++ b/src/Main/ICSharpCode.Core.Presentation/ExtendedPopup.cs @@ -10,7 +10,7 @@ using System.Windows.Interop; namespace ICSharpCode.Core.Presentation { /// - /// Extends WPF popup to prevent it from being the topmost window on the screen. + /// Extends WPF popup to hide the popup while SharpDevelop isn't the active application. /// public class ExtendedPopup : Popup { @@ -19,7 +19,7 @@ namespace ICSharpCode.Core.Presentation protected override void OnOpened(EventArgs e) { hwnd = ((HwndSource)PresentationSource.FromVisual(Child)).Handle; - SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, NoChangeFlags); + SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, NoChangeFlags); Application.Current.Activated += ApplicationActivated; Application.Current.Deactivated += ApplicationDeactivated; From 60855c954266b0ce91acc6720ad3a66a3fe18bb9 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 6 Jan 2013 15:08:40 +0100 Subject: [PATCH 09/22] ChangeMarkerMargin: Horizontally align diff popup with the text view --- .../AvalonEdit.AddIn/Src/ChangeMarkerMargin.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ChangeMarkerMargin.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ChangeMarkerMargin.cs index 05da508e74..764275787f 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ChangeMarkerMargin.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ChangeMarkerMargin.cs @@ -245,10 +245,11 @@ namespace ICSharpCode.AvalonEdit.AddIn } }; + const double borderThickness = 1; tooltip.Child = new Border() { Child = differ, BorderBrush = editor.TextArea.Foreground, - BorderThickness = new Thickness(1) + BorderThickness = new Thickness(borderThickness) }; if (tooltip.IsOpen) @@ -259,7 +260,7 @@ namespace ICSharpCode.AvalonEdit.AddIn tooltip.Closed += delegate { if (marker != null) markerService.Remove(marker); }; - tooltip.HorizontalOffset = -10; + tooltip.HorizontalOffset = -borderThickness - TextView.ScrollOffset.X; tooltip.VerticalOffset = TextView.GetVisualTopByDocumentLine(startLine) - TextView.ScrollOffset.Y; tooltip.Placement = PlacementMode.Top; From b4149dee8bffdf8a9de202a051ece86d03ab8c81 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 6 Jan 2013 15:27:56 +0100 Subject: [PATCH 10/22] fix http://community.sharpdevelop.net/forums/p/16476/44890.aspx --- .../ICSharpCode.AvalonEdit/Search/SearchCommands.cs | 4 +--- .../AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchPanel.cs | 4 +++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchCommands.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchCommands.cs index bda001d9ba..b7c125528e 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchCommands.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchCommands.cs @@ -73,9 +73,7 @@ namespace ICSharpCode.AvalonEdit.Search void ExecuteFind(object sender, ExecutedRoutedEventArgs e) { - if (panel.IsClosed) { - panel.Open(); - } + panel.Open(); panel.SearchPattern = TextArea.Selection.GetText(); Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Input, (Action)delegate { panel.Reactivate(); }); } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchPanel.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchPanel.cs index b3522537af..ec9119b0cf 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchPanel.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchPanel.cs @@ -379,10 +379,12 @@ namespace ICSharpCode.AvalonEdit.Search /// public void Open() { + if (!IsClosed) return; var layer = AdornerLayer.GetAdornerLayer(textArea); if (layer != null) layer.Add(adorner); textArea.TextView.BackgroundRenderers.Add(renderer); + IsClosed = false; } /// @@ -391,7 +393,7 @@ namespace ICSharpCode.AvalonEdit.Search public event EventHandler SearchOptionsChanged; /// - /// Raises the event. + /// Raises the event. /// protected virtual void OnSearchOptionsChanged(SearchOptionsChangedEventArgs e) { From 3c84135a41a372daea2e70054ec4beabdd228d8e Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 6 Jan 2013 17:08:43 +0000 Subject: [PATCH 11/22] Fix NuGet package id not displayed in logging output. --- .../Project/Src/PackageFromRepository.cs | 5 +++++ .../Test/Src/PackageFromRepositoryTests.cs | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageFromRepository.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageFromRepository.cs index 7936717173..d92cd16fee 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageFromRepository.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageFromRepository.cs @@ -169,5 +169,10 @@ namespace ICSharpCode.PackageManagement { return package.GetSupportedFrameworks(); } + + public override string ToString() + { + return package.ToString(); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageFromRepositoryTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageFromRepositoryTests.cs index 5d7e72fb72..bcd25c1407 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageFromRepositoryTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageFromRepositoryTests.cs @@ -395,5 +395,17 @@ namespace PackageManagement.Tests Assert.AreEqual(1, supportedFrameworks.Count); Assert.AreEqual(expectedFramework, supportedFrameworks[0]); } + + [Test] + public void ToString_PackageHasIdAndVersion_ReturnsWrappedPackageToString() + { + CreatePackage(); + fakePackage.Id = "MyPackage"; + fakePackage.Version = new SemanticVersion("1.1"); + + string result = package.ToString(); + + Assert.AreEqual("MyPackage 1.1", result); + } } } From 64ce9a7f6fb84a25e6140016d9cf41c3367b4d0e Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Mon, 7 Jan 2013 07:03:00 +0100 Subject: [PATCH 12/22] AvalonEdit IME: Fix crash on threadMgr.SetFocus(null); in 64-bit process. --- .../Editing/ImeNativeWrapper.cs | 16 ++++++++-------- .../ICSharpCode.AvalonEdit/Editing/ImeSupport.cs | 3 ++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeNativeWrapper.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeNativeWrapper.cs index 98d707c519..d8d0de240c 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeNativeWrapper.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeNativeWrapper.cs @@ -211,14 +211,14 @@ namespace ICSharpCode.AvalonEdit.Editing { void Activate(out int clientId); void Deactivate(); - void CreateDocumentMgr(out object docMgr); - void EnumDocumentMgrs(out object enumDocMgrs); - void GetFocus(out object docMgr); - void SetFocus(object docMgr); - void AssociateFocus(IntPtr hwnd, object newDocMgr, out object prevDocMgr); + void CreateDocumentMgr(out IntPtr docMgr); + void EnumDocumentMgrs(out IntPtr enumDocMgrs); + void GetFocus(out IntPtr docMgr); + void SetFocus(IntPtr docMgr); + void AssociateFocus(IntPtr hwnd, IntPtr newDocMgr, out IntPtr prevDocMgr); void IsThreadFocus([MarshalAs(UnmanagedType.Bool)] out bool isFocus); - void GetFunctionProvider(ref Guid classId, out object funcProvider); - void EnumFunctionProviders(out object enumProviders); - void GetGlobalCompartment(out object compartmentMgr); + void GetFunctionProvider(ref Guid classId, out IntPtr funcProvider); + void EnumFunctionProviders(out IntPtr enumProviders); + void GetGlobalCompartment(out IntPtr compartmentMgr); } } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeSupport.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeSupport.cs index 3a5e87ebd3..10fa063524 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeSupport.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeSupport.cs @@ -3,6 +3,7 @@ using System; using System.ComponentModel; +using System.Diagnostics; using System.Linq; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -77,7 +78,7 @@ namespace ICSharpCode.AvalonEdit.Editing if (threadMgr != null) { // Even though the docu says passing null is invalid, this seems to help // activating the IME on the default input context that is shared with WPF - threadMgr.SetFocus(null); + threadMgr.SetFocus(IntPtr.Zero); } } } From 231cde5e9ea066e4d136d77ee04e19cc11b2438e Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Mon, 7 Jan 2013 12:34:50 +0000 Subject: [PATCH 13/22] Fix disabled package sources being used in Manage Packages dialog. Selecting All in the package source list was searching across all package sources including disabled ones. --- .../Project/Src/PackageRepositoryCache.cs | 6 ++--- .../ProjectTemplatePackageRepositoryCache.cs | 7 +++++- .../Test/Src/PackageRepositoryCacheTests.cs | 24 +++++++++++++++++++ ...jectTemplatePackageRepositoryCacheTests.cs | 18 ++++++++++++++ 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageRepositoryCache.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageRepositoryCache.cs index be95abfacb..aa05822a7e 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageRepositoryCache.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageRepositoryCache.cs @@ -69,13 +69,13 @@ namespace ICSharpCode.PackageManagement public IPackageRepository CreateAggregateRepository() { - IEnumerable allRepositories = CreateAllRepositories(); + IEnumerable allRepositories = CreateAllEnabledRepositories(); return CreateAggregateRepository(allRepositories); } - IEnumerable CreateAllRepositories() + IEnumerable CreateAllEnabledRepositories() { - foreach (PackageSource source in registeredPackageSources) { + foreach (PackageSource source in registeredPackageSources.GetEnabledPackageSources()) { yield return CreateRepository(source.Source); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/ProjectTemplatePackageRepositoryCache.cs b/src/AddIns/Misc/PackageManagement/Project/Src/ProjectTemplatePackageRepositoryCache.cs index cb827da187..943e8808b9 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/ProjectTemplatePackageRepositoryCache.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/ProjectTemplatePackageRepositoryCache.cs @@ -41,11 +41,16 @@ namespace ICSharpCode.PackageManagement IEnumerable GetRegisteredPackageRepositories() { - foreach (PackageSource packageSource in registeredPackageSources.PackageSources) { + foreach (PackageSource packageSource in GetEnabledPackageSources()) { yield return CreateRepository(packageSource.Source); } } + public IEnumerable GetEnabledPackageSources() + { + return registeredPackageSources.PackageSources.GetEnabledPackageSources(); + } + public ISharedPackageRepository CreateSharedRepository(IPackagePathResolver pathResolver, IFileSystem fileSystem, IFileSystem configSettingsFileSystem) { throw new NotImplementedException(); diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageRepositoryCacheTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageRepositoryCacheTests.cs index f9044d8a61..5bdbabacab 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageRepositoryCacheTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageRepositoryCacheTests.cs @@ -159,6 +159,30 @@ namespace PackageManagement.Tests Assert.AreEqual(expectedRepository, aggregateRepository); } + [Test] + public void CreateAggregatePackageRepository_TwoRegisteredPackageSourcesButOneDisabled_ReturnsAggregateRepositoryCreatedWithOnlyEnabledPackageSource() + { + CreatePackageSources(); + packageSourcesHelper.AddTwoPackageSources("Source1", "Source2"); + packageSourcesHelper.RegisteredPackageSources[0].IsEnabled = false; + CreateCacheUsingPackageSources(); + FakePackageRepository repository1 = AddFakePackageRepositoryForPackageSource("Source1"); + FakePackageRepository repository2 = AddFakePackageRepositoryForPackageSource("Source2"); + var expectedRepositories = new FakePackageRepository[] { + repository2 + }; + + cache.CreateAggregateRepository(); + + IEnumerable repositoriesUsedToCreateAggregateRepository = + fakePackageRepositoryFactory.RepositoriesPassedToCreateAggregateRepository; + + var actualRepositoriesAsList = new List(repositoriesUsedToCreateAggregateRepository); + IPackageRepository[] actualRepositories = actualRepositoriesAsList.ToArray(); + + CollectionAssert.AreEqual(expectedRepositories, actualRepositories); + } + [Test] public void CreateAggregatePackageRepository_TwoRegisteredPackageRepositories_AllRegisteredRepositoriesUsedToCreateAggregateRepositoryFromFactory() { diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/ProjectTemplatePackageRepositoryCacheTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/ProjectTemplatePackageRepositoryCacheTests.cs index 8e5b32b48a..b809f811c9 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/ProjectTemplatePackageRepositoryCacheTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/ProjectTemplatePackageRepositoryCacheTests.cs @@ -83,5 +83,23 @@ namespace PackageManagement.Tests Assert.AreEqual(expectedRepositories, repositories); } + + [Test] + public void CreateAggregatePackageRepository_TwoRegisteredPackageSourcesButOneDisabled_ReturnsAggregateRepositoryCreatedWithOnlyEnabledPackageSource() + { + CreateCache(); + ClearRegisteredPackageSources(); + FakePackageRepository fakeRepository1 = AddRegisteredPackageRepository("http://sharpdevelop.com", "Test"); + FakePackageRepository fakeRepository2 = AddRegisteredPackageRepository("http://test", "Test2"); + registeredPackageSources.PackageSources[0].IsEnabled = false; + + IPackageRepository repository = cache.CreateAggregateRepository(); + + IEnumerable repositories = fakeMainCache.RepositoriesPassedToCreateAggregateRepository; + var expectedRepositories = new List(); + expectedRepositories.Add(fakeRepository2); + + Assert.AreEqual(expectedRepositories, repositories); + } } } From 199c8059b4d2fe3afab47dfcffd0345ad7b07f5c Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Mon, 7 Jan 2013 13:21:30 +0000 Subject: [PATCH 14/22] Show package sources drop down in updated packages tab. Allow user to choose which package source when looking for updated packages. --- .../FakeRegisteredPackageRepositories.cs | 6 +- .../Project/Src/PackagesView.xaml | 6 +- .../Project/Src/UpdatedPackagesViewModel.cs | 9 ++- .../Test/Src/ManagePackagesViewModelTests.cs | 4 +- .../Test/Src/UpdatedPackagesViewModelTests.cs | 80 ++++++++++++++++--- 5 files changed, 85 insertions(+), 20 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeRegisteredPackageRepositories.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeRegisteredPackageRepositories.cs index 4f95dbb025..25ca9d0005 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeRegisteredPackageRepositories.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeRegisteredPackageRepositories.cs @@ -70,9 +70,11 @@ namespace ICSharpCode.PackageManagement.Design PackageSources.AddRange(sources); } - public FakePackage AddFakePackageWithVersionToAggregrateRepository(string version) + public FakePackage AddFakePackageWithVersionToActiveRepository(string version) { - return AddFakePackageWithVersionToAggregrateRepository("Test", version); + var package = FakePackage.CreatePackageWithVersion("Test", version); + FakeActiveRepository.FakePackages.Add(package); + return package; } public FakePackage AddFakePackageWithVersionToAggregrateRepository(string id, string version) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesView.xaml b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesView.xaml index a7429e0b2a..05694252a6 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesView.xaml +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesView.xaml @@ -310,7 +310,7 @@ + Visibility="{Binding Path=ShowPackageSources, Converter={StaticResource BoolToVisibility}}"> @@ -330,6 +330,7 @@ + Margin="4" + Visibility="{Binding Path=IsSearchable, Converter={StaticResource BoolToVisibility}}"> diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs index 408a605894..2fc9c869c0 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs @@ -18,7 +18,7 @@ namespace ICSharpCode.PackageManagement public UpdatedPackagesViewModel( IPackageManagementSolution solution, IRegisteredPackageRepositories registeredPackageRepositories, - UpdatedPackageViewModelFactory packageViewModelFactory, + UpdatedPackageViewModelFactory packageViewModelFactory, ITaskFactory taskFactory) : base( registeredPackageRepositories, @@ -26,14 +26,15 @@ namespace ICSharpCode.PackageManagement taskFactory) { this.selectedProjects = new PackageManagementSelectedProjects(solution); + ShowPackageSources = registeredPackageRepositories.HasMultiplePackageSources; } protected override void UpdateRepositoryBeforeReadPackagesTaskStarts() { try { - IPackageRepository aggregateRepository = RegisteredPackageRepositories.CreateAggregateRepository(); - IQueryable installedPackages = GetInstalledPackages(aggregateRepository); - updatedPackages = new UpdatedPackages(installedPackages, aggregateRepository); + IPackageRepository repository = RegisteredPackageRepositories.ActiveRepository; + IQueryable installedPackages = GetInstalledPackages(repository); + updatedPackages = new UpdatedPackages(installedPackages, repository); } catch (Exception ex) { errorMessage = ex.Message; } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/ManagePackagesViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/ManagePackagesViewModelTests.cs index 1454540bab..e01af7e2de 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/ManagePackagesViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/ManagePackagesViewModelTests.cs @@ -175,11 +175,11 @@ namespace PackageManagement.Tests Id = "Test", Version = new SemanticVersion("2.0.0.0") }; - fakeRegisteredPackageRepositories.FakeAggregateRepository.FakePackages.Add(newPackage); + fakeRegisteredPackageRepositories.FakeActiveRepository.FakePackages.Add(newPackage); CreateViewModel(fakeSolution); - List expectedPackages = fakeRegisteredPackageRepositories.FakeAggregateRepository.FakePackages; + List expectedPackages = fakeRegisteredPackageRepositories.FakeActiveRepository.FakePackages; PackageCollectionAssert.AreEqual(expectedPackages, viewModel.UpdatedPackagesViewModel.PackageViewModels); } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs index 77ffb2c70c..b090342cf2 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs @@ -4,6 +4,7 @@ using System; using ICSharpCode.PackageManagement; using ICSharpCode.PackageManagement.Design; +using NuGet; using NUnit.Framework; using PackageManagement.Tests.Helpers; @@ -36,9 +37,14 @@ namespace PackageManagement.Tests } void CreateViewModel(FakePackageManagementSolution solution) + { + CreateRegisteredPackageRepositories(); + CreateViewModel(solution, registeredPackageRepositories); + } + + void CreateViewModel(FakePackageManagementSolution solution, FakeRegisteredPackageRepositories registeredPackageRepositories) { taskFactory = new FakeTaskFactory(); - registeredPackageRepositories = new FakeRegisteredPackageRepositories(); var packageViewModelFactory = new FakePackageViewModelFactory(); var updatedPackageViewModelFactory = new UpdatedPackageViewModelFactory(packageViewModelFactory); viewModel = new UpdatedPackagesViewModel( @@ -48,6 +54,17 @@ namespace PackageManagement.Tests taskFactory); } + void CreateRegisteredPackageRepositories() + { + registeredPackageRepositories = new FakeRegisteredPackageRepositories(); + } + + void CreateViewModel(FakeRegisteredPackageRepositories registeredPackageRepositories) + { + CreateSolution(); + CreateViewModel(solution, registeredPackageRepositories); + } + void CreateExceptionThrowingSolution() { exceptionThrowingSolution = new ExceptionThrowingPackageManagementSolution(); @@ -66,9 +83,9 @@ namespace PackageManagement.Tests return package; } - FakePackage AddPackageToAggregateRepository(string version) + FakePackage AddPackageToActiveRepository(string version) { - return registeredPackageRepositories.AddFakePackageWithVersionToAggregrateRepository(version); + return registeredPackageRepositories.AddFakePackageWithVersionToActiveRepository(version); } FakePackage AddPackageToSolution(string version) @@ -78,12 +95,35 @@ namespace PackageManagement.Tests return package; } + void AddOnePackageSourceToRegisteredSources() + { + registeredPackageRepositories.ClearPackageSources(); + registeredPackageRepositories.AddOnePackageSource(); + registeredPackageRepositories.HasMultiplePackageSources = false; + } + + void AddTwoPackageSourcesToRegisteredSources() + { + var expectedPackageSources = new PackageSource[] { + new PackageSource("http://first.com", "First"), + new PackageSource("http://second.com", "Second") + }; + AddPackageSourcesToRegisteredSources(expectedPackageSources); + registeredPackageRepositories.HasMultiplePackageSources = true; + } + + void AddPackageSourcesToRegisteredSources(PackageSource[] sources) + { + registeredPackageRepositories.ClearPackageSources(); + registeredPackageRepositories.AddPackageSources(sources); + } + [Test] public void ReadPackages_OneNewerPackageVersionAvailable_NewerPackageVersionDisplayed() { CreateViewModel(); AddPackageToLocalRepository("1.0.0.0"); - FakePackage newerPackage = AddPackageToAggregateRepository("1.1.0.0"); + FakePackage newerPackage = AddPackageToActiveRepository("1.1.0.0"); viewModel.ReadPackages(); CompleteReadPackagesTask(); @@ -100,8 +140,8 @@ namespace PackageManagement.Tests { CreateViewModel(); AddPackageToLocalRepository("1.0.0.0"); - AddPackageToAggregateRepository("1.0.0.0"); - FakePackage newerPackage = AddPackageToAggregateRepository("1.1.0.0"); + AddPackageToActiveRepository("1.0.0.0"); + FakePackage newerPackage = AddPackageToActiveRepository("1.1.0.0"); viewModel.ReadPackages(); CompleteReadPackagesTask(); @@ -118,7 +158,7 @@ namespace PackageManagement.Tests { CreateViewModel(); AddPackageToLocalRepository("1.0.0.0"); - FakePackage newerPackage = AddPackageToAggregateRepository("1.1.0.0"); + FakePackage newerPackage = AddPackageToActiveRepository("1.1.0.0"); viewModel.ReadPackages(); @@ -148,7 +188,7 @@ namespace PackageManagement.Tests NoProjectsSelected(); CreateViewModel(solution); AddPackageToSolution("1.0.0.0"); - FakePackage newerPackage = AddPackageToAggregateRepository("1.1.0.0"); + FakePackage newerPackage = AddPackageToActiveRepository("1.1.0.0"); viewModel.ReadPackages(); CompleteReadPackagesTask(); @@ -167,7 +207,7 @@ namespace PackageManagement.Tests NoProjectsSelected(); CreateViewModel(solution); AddPackageToSolution("1.0.0.0"); - FakePackage newerPackage = AddPackageToAggregateRepository("1.1.0.0"); + FakePackage newerPackage = AddPackageToActiveRepository("1.1.0.0"); viewModel.ReadPackages(); CompleteReadPackagesTask(); @@ -192,12 +232,32 @@ namespace PackageManagement.Tests CreateViewModel(); AddPackageToLocalRepository("1.0.0"); - FakePackage newerPackage = AddPackageToAggregateRepository("1.1.0-alpha"); + FakePackage newerPackage = AddPackageToActiveRepository("1.1.0-alpha"); viewModel.ReadPackages(); CompleteReadPackagesTask(); Assert.AreEqual(0, viewModel.PackageViewModels.Count); } + + [Test] + public void ShowSources_TwoPackageSources_ReturnsTrue() + { + CreateRegisteredPackageRepositories(); + AddTwoPackageSourcesToRegisteredSources(); + CreateViewModel(registeredPackageRepositories); + + Assert.IsTrue(viewModel.ShowPackageSources); + } + + [Test] + public void ShowPackageSources_OnePackageSources_ReturnsFalse() + { + CreateRegisteredPackageRepositories(); + AddOnePackageSourceToRegisteredSources(); + CreateViewModel(registeredPackageRepositories); + + Assert.IsFalse(viewModel.ShowPackageSources); + } } } From 1a6dc15c983e3bc628bf4d8b03c554df58611ba2 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Mon, 7 Jan 2013 13:31:29 +0000 Subject: [PATCH 15/22] Remove All from package source combo box when only one source. Disabled package sources were being counted when deciding whether to add All to the combo box in the Manage Packages dialog. --- .../Project/Src/PackagesViewModel.cs | 2 +- .../Project/Src/RegisteredPackageRepositories.cs | 2 +- .../Project/Src/RegisteredPackageSources.cs | 4 ++-- .../Test/Src/RegisteredPackageRepositoriesTests.cs | 14 ++++++++++++++ 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs index 511a4587d2..01246df9c9 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs @@ -345,7 +345,7 @@ namespace ICSharpCode.PackageManagement foreach (PackageSource packageSource in registeredPackageRepositories.PackageSources.GetEnabledPackageSources()) { yield return packageSource; } - if (registeredPackageRepositories.PackageSources.HasMultiplePackageSources) { + if (registeredPackageRepositories.PackageSources.HasMultipleEnabledPackageSources) { yield return RegisteredPackageSourceSettings.AggregatePackageSource; } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageRepositories.cs b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageRepositories.cs index 0add26e9fd..0637ef34e9 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageRepositories.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageRepositories.cs @@ -43,7 +43,7 @@ namespace ICSharpCode.PackageManagement } public bool HasMultiplePackageSources { - get { return registeredPackageSources.HasMultiplePackageSources; } + get { return registeredPackageSources.HasMultipleEnabledPackageSources; } } public PackageSource ActivePackageSource { diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSources.cs b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSources.cs index 4596ccea84..dabec52ea3 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSources.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSources.cs @@ -48,8 +48,8 @@ namespace ICSharpCode.PackageManagement get { return Count == 0; } } - public bool HasMultiplePackageSources { - get { return Count > 1; } + public bool HasMultipleEnabledPackageSources { + get { return GetEnabledPackageSources().Count() > 1; } } public IEnumerable GetEnabledPackageSources() diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/RegisteredPackageRepositoriesTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/RegisteredPackageRepositoriesTests.cs index 00e4ad3959..d146db0938 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/RegisteredPackageRepositoriesTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/RegisteredPackageRepositoriesTests.cs @@ -80,6 +80,7 @@ namespace PackageManagement.Tests { CreateRegisteredPackageRepositories(); packageSourcesHelper.AddOnePackageSource(); + bool result = registeredRepositories.HasMultiplePackageSources; Assert.IsFalse(result); @@ -90,11 +91,24 @@ namespace PackageManagement.Tests { CreateRegisteredPackageRepositories(); packageSourcesHelper.AddTwoPackageSources(); + bool result = registeredRepositories.HasMultiplePackageSources; Assert.IsTrue(result); } + [Test] + public void HasMultiplePackageSources_TwoPackageSourcesButOneIsDisabled_ReturnsFalse() + { + CreateRegisteredPackageRepositories(); + packageSourcesHelper.AddTwoPackageSources(); + packageSourcesHelper.RegisteredPackageSources[0].IsEnabled = false; + + bool result = registeredRepositories.HasMultiplePackageSources; + + Assert.IsFalse(result); + } + [Test] public void ActivePackageSource_TwoPackageSources_ByDefaultReturnsFirstPackageSource() { From 0089d00bb8425e2439eb063e59257992b023671c Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Mon, 7 Jan 2013 13:36:33 +0000 Subject: [PATCH 16/22] Always show package sources in Available and Updates tab. Do not hide the package sources combo box in the Manage Packages dialog when only on package source is defined. --- .../Project/Src/AvailablePackagesViewModel.cs | 2 +- .../PackageManagement/Project/Src/UpdatedPackagesViewModel.cs | 2 +- .../Test/Src/AvailablePackagesViewModelTests.cs | 4 ++-- .../Test/Src/UpdatedPackagesViewModelTests.cs | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/AvailablePackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/AvailablePackagesViewModel.cs index 11272f1338..7a144063b5 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/AvailablePackagesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/AvailablePackagesViewModel.cs @@ -21,7 +21,7 @@ namespace ICSharpCode.PackageManagement : base(registeredPackageRepositories, packageViewModelFactory, taskFactory) { IsSearchable = true; - ShowPackageSources = registeredPackageRepositories.HasMultiplePackageSources; + ShowPackageSources = true; } protected override void UpdateRepositoryBeforeReadPackagesTaskStarts() diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs index 2fc9c869c0..feaa614be4 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs @@ -26,7 +26,7 @@ namespace ICSharpCode.PackageManagement taskFactory) { this.selectedProjects = new PackageManagementSelectedProjects(solution); - ShowPackageSources = registeredPackageRepositories.HasMultiplePackageSources; + ShowPackageSources = true; } protected override void UpdateRepositoryBeforeReadPackagesTaskStarts() diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs index 0f1fd884cb..600b38d9a5 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs @@ -221,13 +221,13 @@ namespace PackageManagement.Tests } [Test] - public void ShowPackageSources_OnePackageSources_ReturnsFalse() + public void ShowPackageSources_OnePackageSources_ReturnsTrue() { CreateRegisteredPackageRepositories(); AddOnePackageSourceToRegisteredSources(); CreateViewModel(registeredPackageRepositories); - Assert.IsFalse(viewModel.ShowPackageSources); + Assert.IsTrue(viewModel.ShowPackageSources); } [Test] diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs index b090342cf2..6090de0390 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs @@ -251,13 +251,13 @@ namespace PackageManagement.Tests } [Test] - public void ShowPackageSources_OnePackageSources_ReturnsFalse() + public void ShowPackageSources_OnePackageSources_ReturnsTrue() { CreateRegisteredPackageRepositories(); AddOnePackageSourceToRegisteredSources(); CreateViewModel(registeredPackageRepositories); - Assert.IsFalse(viewModel.ShowPackageSources); + Assert.IsTrue(viewModel.ShowPackageSources); } } } From 225ec195fbc680a8baf0b255ab4d9316e9f1922a Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 12 Jan 2013 17:02:34 +0000 Subject: [PATCH 17/22] Allow missing projects to be removed from solution. Remove menu item is now enabled for a missing project. --- .../Base/Project/ICSharpCode.SharpDevelop.addin | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin index b5f7132fac..5aa4fac871 100755 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin @@ -552,12 +552,14 @@ icon = "Icons.16x16.PasteIcon" loadclasslazy = "false" class = "ICSharpCode.SharpDevelop.Project.Commands.PasteProjectBrowserNode"/> - + + + Date: Mon, 14 Jan 2013 21:31:34 +0000 Subject: [PATCH 18/22] Fix highlighting colours unavailable for Ruby and Python. Upgrade Ruby and Python syntax highlighting definitions to version 2.0 so all named highlighting colours can be modified in Tools | Options | Highlighting --- .../Project/Resources/Python.xshd | 230 ++++++----- .../RubyBinding/Project/Resources/Ruby.xshd | 368 ++++++++++-------- 2 files changed, 328 insertions(+), 270 deletions(-) diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Resources/Python.xshd b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Resources/Python.xshd index c7dc7234d8..2f7076e5c4 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Resources/Python.xshd +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Resources/Python.xshd @@ -1,105 +1,135 @@ - - - - - - - + - - - - ()[]{}@,:.`=;+-*/% &|^>< - - - """ - """ - - - - ''' - ''' - + + + + + + + + + + + + + + + + + + + + - - # - - - - " - " - - - - ' - ' - - - ( + - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + """ + """ + + + + ''' + ''' + + + + \# + + + + " + " + + + + + + + + ' + ' + + + + + + + + assert + del + exec + global + lambda + print + + + + class + + + + except + finally + raise + try + + + + def + + + + import + from + + + + for + in + while + + + + break + continue + yield + return + + + + and + as + is + not + or + + + + pass + + + + elif + else + if + + + + with + + + + None + + + \b[\d\w_]+(?=(\s*\()) + \b0[xX][0-9a-fA-F]+|(\b\d+(\.[0-9]+)?|\.[0-9]+)([eE][+-]?[0-9]+)? + + + [?,.;()\[\]{}+\-/%*<>^+~!|&]+ + + diff --git a/src/AddIns/BackendBindings/Ruby/RubyBinding/Project/Resources/Ruby.xshd b/src/AddIns/BackendBindings/Ruby/RubyBinding/Project/Resources/Ruby.xshd index 9f3b282a16..f9b1cc75dd 100644 --- a/src/AddIns/BackendBindings/Ruby/RubyBinding/Project/Resources/Ruby.xshd +++ b/src/AddIns/BackendBindings/Ruby/RubyBinding/Project/Resources/Ruby.xshd @@ -1,174 +1,202 @@ - + - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - ()[]{}@,:.`=;+-*/%~ &|^>< - - - ' - ' - - - - """ - """ - - - - =begin - =end - - - - # - - - - " - " - - - ( + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + ' + ' + + + + + + + + """ + """ + + + + =begin + =end + + + + \# + + + + " + " + + + + + + + + abort + Array + at_exit + autoload + binding + callcc + caller + chomp + chop + eval + exec + exit + fail + Float + fork + format + gets + global_variables + gsub + Integer + lambda + proc + load + local_variables + loop + open + p + print + print + printf + putc + puts + rand + readline + scan + select + set_trace_func + sleep + split + sprintf + srand + String + syscall + system + sub + test + throw + trace_var + trap + untrace_var + + + + class + module + public + protected + private + + + + begin + rescue + ensure + raise + catch + + + + def + end + undef + + + + require + alias + + + + for + do + in + while + until + + + + break + yield + redo + return + retry + next + + + + and + not + or + + + + nil + + + + elsif + else + if + then + case + unless + + + + true + false + + + + defined + + + + self + + + + super + + + \b[\d\w_]+(?=(\s*\()) + \b0[xX][0-9a-fA-F]+|(\b\d+(\.[0-9]+)?|\.[0-9]+)([eE][+-]?[0-9]+)? + + + [?,.;()\[\]{}+\-/%*<>^+~!|&]+ + + From 71c9dc6486774a458c86656138468feb179de46b Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 18 Jan 2013 17:21:19 +0100 Subject: [PATCH 19/22] Fix version number of HTML clipboard. Version 1.0 does not exist: http://blogs.msdn.com/b/oldnewthing/archive/2013/01/18/10386079.aspx --- .../ICSharpCode.AvalonEdit/Highlighting/HtmlClipboard.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HtmlClipboard.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HtmlClipboard.cs index 43658d8e85..ca9d787d27 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HtmlClipboard.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HtmlClipboard.cs @@ -23,7 +23,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting static string BuildHeader(int startHTML, int endHTML, int startFragment, int endFragment) { StringBuilder b = new StringBuilder(); - b.AppendLine("Version:1.0"); + b.AppendLine("Version:0.9"); b.AppendLine("StartHTML:" + startHTML.ToString("d8", CultureInfo.InvariantCulture)); b.AppendLine("EndHTML:" + endHTML.ToString("d8", CultureInfo.InvariantCulture)); b.AppendLine("StartFragment:" + startFragment.ToString("d8", CultureInfo.InvariantCulture)); From 0e41ae37ba45148c72d5f9d66a678b2d8cdcfaf0 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 18 Jan 2013 17:21:47 +0100 Subject: [PATCH 20/22] Document that git must be available on the PATH --- README.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.txt b/README.txt index d99e1e9523..b711867f05 100644 --- a/README.txt +++ b/README.txt @@ -32,7 +32,8 @@ Extended Requirements (building SharpDevelop) - Windows SDK 7.1 - Windows SDK 7.0 (optional; C++ compiler needed for profiler) - Windows PowerShell - + - if you have cloned the SD git repository: git must be available on your PATH + Libraries and integrated tools: AvalonDock: New BSD License (BSD) (thanks to Adolfo Marinucci) GraphSharp From 768a0c81aa47fcf23fde240b4cecb2e58db72856 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 19 Jan 2013 15:04:00 +0000 Subject: [PATCH 21/22] Fix FxCop failing to find rules defined in project. Setting two or more FxCop rules to be flagged as errors instead of warnings was adding the rules into the CodeAnalysisRules element of the MSBuild project file with the semi-colon separators being escaped. This escaping then causes FxCopCmd.exe to fail. --- .../CodeAnalysis/Src/AnalysisProjectOptionsPanel.xaml.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AddIns/Analysis/CodeAnalysis/Src/AnalysisProjectOptionsPanel.xaml.cs b/src/AddIns/Analysis/CodeAnalysis/Src/AnalysisProjectOptionsPanel.xaml.cs index 84d5d16ea7..2e010bc2f2 100644 --- a/src/AddIns/Analysis/CodeAnalysis/Src/AnalysisProjectOptionsPanel.xaml.cs +++ b/src/AddIns/Analysis/CodeAnalysis/Src/AnalysisProjectOptionsPanel.xaml.cs @@ -41,12 +41,12 @@ namespace ICSharpCode.CodeAnalysis } public ProjectProperty CodeAnalysisRuleAssemblies { - get { return GetProperty("CodeAnalysisRuleAssemblies","",TextBoxEditMode.EditEvaluatedProperty); } + get { return GetProperty("CodeAnalysisRuleAssemblies", "", TextBoxEditMode.EditEvaluatedProperty); } } public ProjectProperty CodeAnalysisRules { - get { return GetProperty("CodeAnalysisRules","",TextBoxEditMode.EditEvaluatedProperty); } + get { return GetProperty("CodeAnalysisRules", "", TextBoxEditMode.EditRawProperty); } } #region Rule Assemblies Property From b0fb6a4a7395d35003aa3fff20df1db27ea199e7 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 20 Jan 2013 19:29:28 +0100 Subject: [PATCH 22/22] GitStatusCache: calling ClearCachedStatus() shouldn't wait for running GetStatusSet() calls in the background. This fixes a performance issue when running "Include In Project" on a folder with many files (when using git). --- .../GitAddIn/Src/GitStatusCache.cs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/AddIns/VersionControl/GitAddIn/Src/GitStatusCache.cs b/src/AddIns/VersionControl/GitAddIn/Src/GitStatusCache.cs index c856dcc3f9..ee68007bff 100644 --- a/src/AddIns/VersionControl/GitAddIn/Src/GitStatusCache.cs +++ b/src/AddIns/VersionControl/GitAddIn/Src/GitStatusCache.cs @@ -22,6 +22,7 @@ namespace ICSharpCode.GitAddIn public static class GitStatusCache { + static object getStatusLock = new object(); static List> statusSetDict = new List>(); public static void ClearCachedStatus(string fileName) @@ -46,17 +47,24 @@ namespace ICSharpCode.GitAddIn public static GitStatusSet GetStatusSet(string wcRoot) { - lock (statusSetDict) { + // Prevent multiple GetStatusSet calls from running in parallel + lock (getStatusLock) { GitStatusSet statusSet; - foreach (var pair in statusSetDict) { - if (FileUtility.IsEqualFileName(pair.Key, wcRoot)) - return pair.Value; + // Don't hold statusSetDict during the whole operation; we don't want + // to slow down other threads calling ClearCachedStatus() + lock (statusSetDict) { + foreach (var pair in statusSetDict) { + if (FileUtility.IsEqualFileName(pair.Key, wcRoot)) + return pair.Value; + } } statusSet = new GitStatusSet(); GitGetFiles(wcRoot, statusSet); GitGetStatus(wcRoot, statusSet); - statusSetDict.Add(new KeyValuePair(wcRoot, statusSet)); + lock (statusSetDict) { + statusSetDict.Add(new KeyValuePair(wcRoot, statusSet)); + } return statusSet; } }