From 45646ca2daaaeda804dfbe7e72dca8e2fe039a02 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Tue, 18 Sep 2012 20:26:52 +0100 Subject: [PATCH 01/15] Fix copy shortcut working in Package Management console. --- .../Project/Src/ConsoleTextEditorKeyEventArgs.cs | 8 +++++++- .../Scripting/Project/Src/ScriptingConsole.cs | 7 ++++--- .../Src/ScriptingConsoleTextEditorKeyEventArgs.cs | 2 +- .../Console/ScriptingConsoleReadOnlyRegionsTests.cs | 9 +++++++++ .../Scripting/Test/Utils/FakeConsoleTextEditor.cs | 10 +++++----- .../Test/Utils/FakeConsoleTextEditorKeyEventArgs.cs | 4 ++-- 6 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/AddIns/BackendBindings/Scripting/Project/Src/ConsoleTextEditorKeyEventArgs.cs b/src/AddIns/BackendBindings/Scripting/Project/Src/ConsoleTextEditorKeyEventArgs.cs index 6739db5e95..f636756969 100644 --- a/src/AddIns/BackendBindings/Scripting/Project/Src/ConsoleTextEditorKeyEventArgs.cs +++ b/src/AddIns/BackendBindings/Scripting/Project/Src/ConsoleTextEditorKeyEventArgs.cs @@ -11,16 +11,22 @@ namespace ICSharpCode.Scripting public abstract class ConsoleTextEditorKeyEventArgs : EventArgs { Key key; + ModifierKeys modifiers; - public ConsoleTextEditorKeyEventArgs(Key key) + public ConsoleTextEditorKeyEventArgs(Key key, ModifierKeys modifiers) { this.key = key; + this.modifiers = modifiers; } public Key Key { get { return key; } } + public ModifierKeys Modifiers { + get { return modifiers; } + } + public abstract bool Handled { get; set; } diff --git a/src/AddIns/BackendBindings/Scripting/Project/Src/ScriptingConsole.cs b/src/AddIns/BackendBindings/Scripting/Project/Src/ScriptingConsole.cs index 7e2dee9aca..765ad4967a 100644 --- a/src/AddIns/BackendBindings/Scripting/Project/Src/ScriptingConsole.cs +++ b/src/AddIns/BackendBindings/Scripting/Project/Src/ScriptingConsole.cs @@ -136,11 +136,10 @@ namespace ICSharpCode.Scripting /// void ProcessPreviewKeyDown(object source, ConsoleTextEditorKeyEventArgs e) { - Key keyPressed = e.Key; - e.Handled = HandleKeyDown(keyPressed); + e.Handled = HandleKeyDown(e.Key, e.Modifiers); } - bool HandleKeyDown(Key keyPressed) + bool HandleKeyDown(Key keyPressed, ModifierKeys keyModifiers) { if (textEditor.IsCompletionWindowDisplayed) { return false; @@ -153,6 +152,8 @@ namespace ICSharpCode.Scripting case Key.Up: case Key.Down: return false; + case Key.C: + return keyModifiers != ModifierKeys.Control; default: return true; } diff --git a/src/AddIns/BackendBindings/Scripting/Project/Src/ScriptingConsoleTextEditorKeyEventArgs.cs b/src/AddIns/BackendBindings/Scripting/Project/Src/ScriptingConsoleTextEditorKeyEventArgs.cs index c7eca6e5f1..a427ae59d4 100644 --- a/src/AddIns/BackendBindings/Scripting/Project/Src/ScriptingConsoleTextEditorKeyEventArgs.cs +++ b/src/AddIns/BackendBindings/Scripting/Project/Src/ScriptingConsoleTextEditorKeyEventArgs.cs @@ -11,7 +11,7 @@ namespace ICSharpCode.Scripting KeyEventArgs e; public ScriptingConsoleTextEditorKeyEventArgs(KeyEventArgs e) - : base(e.Key) + : base(e.Key, e.KeyboardDevice.Modifiers) { this.e = e; } diff --git a/src/AddIns/BackendBindings/Scripting/Test/Console/ScriptingConsoleReadOnlyRegionsTests.cs b/src/AddIns/BackendBindings/Scripting/Test/Console/ScriptingConsoleReadOnlyRegionsTests.cs index 0b0a70dca0..83d3d0a5c4 100644 --- a/src/AddIns/BackendBindings/Scripting/Test/Console/ScriptingConsoleReadOnlyRegionsTests.cs +++ b/src/AddIns/BackendBindings/Scripting/Test/Console/ScriptingConsoleReadOnlyRegionsTests.cs @@ -155,5 +155,14 @@ namespace ICSharpCode.Scripting.Tests.Console Assert.AreEqual(String.Empty, TestableScriptingConsole.GetCurrentLine()); } + + [Test] + public void PreviewKeyDown_ControlCInReadOnlyRegion_HandledSetToFalseSoCopyInReadOnlyRegionAllowed() + { + FakeConsoleTextEditor.RaisePreviewKeyDownEventForDialogKey(Key.Left); + bool result = FakeConsoleTextEditor.RaisePreviewKeyDownEvent(Key.C, ModifierKeys.Control); + + Assert.IsFalse(result); + } } } diff --git a/src/AddIns/BackendBindings/Scripting/Test/Utils/FakeConsoleTextEditor.cs b/src/AddIns/BackendBindings/Scripting/Test/Utils/FakeConsoleTextEditor.cs index bf5ba2446e..b2710b8e5f 100644 --- a/src/AddIns/BackendBindings/Scripting/Test/Utils/FakeConsoleTextEditor.cs +++ b/src/AddIns/BackendBindings/Scripting/Test/Utils/FakeConsoleTextEditor.cs @@ -28,14 +28,14 @@ namespace ICSharpCode.Scripting.Tests.Utils public StringBuilder PreviousLines = new StringBuilder(); public StringBuilder LineBuilder = new StringBuilder(); - + public event ConsoleTextEditorKeyEventHandler PreviewKeyDown; public FakeConsoleTextEditor() { TotalLines = 1; } - + public void Dispose() { IsDisposed = true; @@ -68,9 +68,9 @@ namespace ICSharpCode.Scripting.Tests.Utils } } - public bool RaisePreviewKeyDownEvent(Key key) + public bool RaisePreviewKeyDownEvent(Key key, ModifierKeys modifiers = ModifierKeys.None) { - FakeConsoleTextEditorKeyEventArgs e = new FakeConsoleTextEditorKeyEventArgs(key); + FakeConsoleTextEditorKeyEventArgs e = new FakeConsoleTextEditorKeyEventArgs(key, modifiers); OnPreviewKeyDown(e); if (!e.Handled) { KeyConverter converter = new KeyConverter(); @@ -174,7 +174,7 @@ namespace ICSharpCode.Scripting.Tests.Utils IsCompletionWindowDisplayed = true; this.CompletionProviderPassedToShowCompletionWindow = completionDataProvider; } - + public void MakeCurrentContentReadOnly() { IsMakeCurrentContentReadOnlyCalled = true; diff --git a/src/AddIns/BackendBindings/Scripting/Test/Utils/FakeConsoleTextEditorKeyEventArgs.cs b/src/AddIns/BackendBindings/Scripting/Test/Utils/FakeConsoleTextEditorKeyEventArgs.cs index 011ae2f621..ad8a3ba418 100644 --- a/src/AddIns/BackendBindings/Scripting/Test/Utils/FakeConsoleTextEditorKeyEventArgs.cs +++ b/src/AddIns/BackendBindings/Scripting/Test/Utils/FakeConsoleTextEditorKeyEventArgs.cs @@ -11,8 +11,8 @@ namespace ICSharpCode.Scripting.Tests.Utils { bool handled; - public FakeConsoleTextEditorKeyEventArgs(Key key) - : base(key) + public FakeConsoleTextEditorKeyEventArgs(Key key, ModifierKeys modifiers = ModifierKeys.None) + : base(key, modifiers) { } From a2a7220b721be2cdb3dcea47a2575a2fb26b3e9f Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Tue, 18 Sep 2012 20:32:32 +0100 Subject: [PATCH 02/15] Support select all shortcut in scripting editor read-only region. --- .../Scripting/Project/Src/ScriptingConsole.cs | 1 + .../Test/Console/ScriptingConsoleReadOnlyRegionsTests.cs | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/src/AddIns/BackendBindings/Scripting/Project/Src/ScriptingConsole.cs b/src/AddIns/BackendBindings/Scripting/Project/Src/ScriptingConsole.cs index 765ad4967a..750ff0dbc2 100644 --- a/src/AddIns/BackendBindings/Scripting/Project/Src/ScriptingConsole.cs +++ b/src/AddIns/BackendBindings/Scripting/Project/Src/ScriptingConsole.cs @@ -153,6 +153,7 @@ namespace ICSharpCode.Scripting case Key.Down: return false; case Key.C: + case Key.A: return keyModifiers != ModifierKeys.Control; default: return true; diff --git a/src/AddIns/BackendBindings/Scripting/Test/Console/ScriptingConsoleReadOnlyRegionsTests.cs b/src/AddIns/BackendBindings/Scripting/Test/Console/ScriptingConsoleReadOnlyRegionsTests.cs index 83d3d0a5c4..8c465c6ad8 100644 --- a/src/AddIns/BackendBindings/Scripting/Test/Console/ScriptingConsoleReadOnlyRegionsTests.cs +++ b/src/AddIns/BackendBindings/Scripting/Test/Console/ScriptingConsoleReadOnlyRegionsTests.cs @@ -164,5 +164,14 @@ namespace ICSharpCode.Scripting.Tests.Console Assert.IsFalse(result); } + + [Test] + public void PreviewKeyDown_ControlAInReadOnlyRegion_HandledSetToFalseSoSelectAllInReadOnlyRegionAllowed() + { + FakeConsoleTextEditor.RaisePreviewKeyDownEventForDialogKey(Key.Left); + bool result = FakeConsoleTextEditor.RaisePreviewKeyDownEvent(Key.A, ModifierKeys.Control); + + Assert.IsFalse(result); + } } } From f9988e30e465c2d28fb318f3a7f6f4709457f009 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 28 Sep 2012 19:40:34 +0200 Subject: [PATCH 03/15] Update link to wiki in AddInWritingHelp. --- data/templates/project/AddInWritingHelp.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/templates/project/AddInWritingHelp.txt b/data/templates/project/AddInWritingHelp.txt index 06b530b67f..87a8d2945e 100644 --- a/data/templates/project/AddInWritingHelp.txt +++ b/data/templates/project/AddInWritingHelp.txt @@ -2,7 +2,7 @@ You have created a new SharpDevelop AddIn project. We would like to point out that there are three locations where you can get information on how to write SharpDevelop AddIns: -- http://wiki.sharpdevelop.net/ (section Developer Zone) +- https://github.com/icsharpcode/SharpDevelop/wiki (section Developer Zone) - The folder "doc/technotes" in the SharpDevelop source code download - You can ask questions about AddIn development in the SharpDevelop forum: http://community.sharpdevelop.net/forums/ @@ -17,7 +17,7 @@ The next steps: See SharpDevelop/doc/technotes/AddInManager.rtf for more information. - Once you have published your AddIn on the Internet, please add it to the SharpDevelop wiki to let other users know! - http://wiki.sharpdevelop.net/3rdPartyAddins.ashx + https://github.com/icsharpcode/SharpDevelop/wiki/Third-Party-AddIns This file serves as a reminder for you on how to find information on SharpDevelop AddIn development, you can From b718df13b1d0747774f8675eac82b462927de608 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 29 Sep 2012 17:24:20 +0200 Subject: [PATCH 04/15] Add EnvDTEHelpers to solution to fix build error when doing a clean build inside SharpDevelop. --- SharpDevelop.Tests.sln | 15 +++++++++++++++ SharpDevelop.sln | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/SharpDevelop.Tests.sln b/SharpDevelop.Tests.sln index 77ab0851de..ec6adad7be 100644 --- a/SharpDevelop.Tests.sln +++ b/SharpDevelop.Tests.sln @@ -452,6 +452,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PackageManagement.Cmdlets.T EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PackageManagement.PowerShell", "src\AddIns\Misc\PackageManagement\PowerShell\Project\PackageManagement.PowerShell.csproj", "{A406803B-C584-43A3-BCEE-A0BB3132CB5F}" EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "PackageManagement.EnvDTEHelpers", "src\AddIns\Misc\PackageManagement\EnvDTEHelpers\Project\PackageManagement.EnvDTEHelpers.vbproj", "{F7886FB7-3764-4574-B981-25EB164B532E}" +EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Display Bindings", "Display Bindings", "{11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}" ProjectSection(SolutionItems) = postProject EndProjectSection @@ -2098,6 +2100,18 @@ Global {7DB80259-24D4-46C3-A024-53FF1987733D}.Release|Win32.ActiveCfg = Release|Any CPU {7DB80259-24D4-46C3-A024-53FF1987733D}.Release|x86.Build.0 = Release|Any CPU {7DB80259-24D4-46C3-A024-53FF1987733D}.Release|x86.ActiveCfg = Release|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Debug|Win32.Build.0 = Debug|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Debug|Win32.ActiveCfg = Debug|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Debug|x86.Build.0 = Debug|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Debug|x86.ActiveCfg = Debug|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Release|Any CPU.Build.0 = Release|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Release|Win32.Build.0 = Release|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Release|Win32.ActiveCfg = Release|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Release|x86.Build.0 = Release|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2202,6 +2216,7 @@ Global {E0A5E80A-003B-4335-A9DC-A76E2E46D38D} = {C6410CCE-C29F-4BF4-94BF-545DE1CBB144} {11115C83-3DB1-431F-8B98-59040359238D} = {C6410CCE-C29F-4BF4-94BF-545DE1CBB144} {A406803B-C584-43A3-BCEE-A0BB3132CB5F} = {C6410CCE-C29F-4BF4-94BF-545DE1CBB144} + {F7886FB7-3764-4574-B981-25EB164B532E} = {C6410CCE-C29F-4BF4-94BF-545DE1CBB144} {AD8272AC-5C9E-4061-90FB-CEF15A9A3F41} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F} {85226AFB-CE71-4851-9A75-7EEC663A8E8A} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F} {C7F29FC2-1B03-4CDD-9E30-400F4765FF04} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F} diff --git a/SharpDevelop.sln b/SharpDevelop.sln index 4d832edd34..0fcadbf744 100644 --- a/SharpDevelop.sln +++ b/SharpDevelop.sln @@ -279,6 +279,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PackageManagement", "src\Ad EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PackageManagement.PowerShell", "src\AddIns\Misc\PackageManagement\PowerShell\Project\PackageManagement.PowerShell.csproj", "{A406803B-C584-43A3-BCEE-A0BB3132CB5F}" EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "PackageManagement.EnvDTEHelpers", "src\AddIns\Misc\PackageManagement\EnvDTEHelpers\Project\PackageManagement.EnvDTEHelpers.vbproj", "{F7886FB7-3764-4574-B981-25EB164B532E}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HelpViewer", "src\AddIns\Misc\HelpViewer\HelpViewer.csproj", "{80F76D10-0B44-4D55-B4BD-DAEB5464090C}" ProjectSection(ProjectDependencies) = postProject {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} @@ -1618,6 +1620,18 @@ Global {7DB80259-24D4-46C3-A024-53FF1987733D}.Release|Win32.ActiveCfg = Release|Any CPU {7DB80259-24D4-46C3-A024-53FF1987733D}.Release|x86.Build.0 = Release|Any CPU {7DB80259-24D4-46C3-A024-53FF1987733D}.Release|x86.ActiveCfg = Release|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Debug|Win32.Build.0 = Debug|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Debug|Win32.ActiveCfg = Debug|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Debug|x86.Build.0 = Debug|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Debug|x86.ActiveCfg = Debug|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Release|Any CPU.Build.0 = Release|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Release|Win32.Build.0 = Release|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Release|Win32.ActiveCfg = Release|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Release|x86.Build.0 = Release|Any CPU + {F7886FB7-3764-4574-B981-25EB164B532E}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1696,6 +1710,7 @@ Global {E0A5E80A-003B-4335-A9DC-A76E2E46D38D} = {50B51AAA-80E3-4C4A-8B2D-CAF440A82B78} {AE4AB0FA-6087-4480-AF37-0FA1452B3DA1} = {50B51AAA-80E3-4C4A-8B2D-CAF440A82B78} {A406803B-C584-43A3-BCEE-A0BB3132CB5F} = {50B51AAA-80E3-4C4A-8B2D-CAF440A82B78} + {F7886FB7-3764-4574-B981-25EB164B532E} = {50B51AAA-80E3-4C4A-8B2D-CAF440A82B78} {6B1CFE35-DA17-4DEB-9C6E-227E5E251DA0} = {DEFC8584-BEC3-4921-BD0F-40482E450B7B} {0008FCE9-9EB4-4E2E-979B-553278E5BBA6} = {DEFC8584-BEC3-4921-BD0F-40482E450B7B} {85226AFB-CE71-4851-9A75-7EEC663A8E8A} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F} From a4038fc1a1546a1f35a57d29aabc7b99e6d7cd7a Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 29 Sep 2012 17:25:44 +0200 Subject: [PATCH 05/15] Use tools from .NET 4.5 SDK if available. --- .../Src/Services/FileUtility/FileUtility.cs | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs b/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs index c46eb8982a..674aabb6a9 100644 --- a/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs +++ b/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs @@ -61,6 +61,22 @@ namespace ICSharpCode.Core return null; } + static string GetPathFromRegistryX86(string key, string valueName) + { + using (RegistryKey baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)) { + using (RegistryKey installRootKey = baseKey.OpenSubKey(key)) { + if (installRootKey != null) { + object o = installRootKey.GetValue(valueName); + if (o != null) { + string r = o.ToString(); + if (!string.IsNullOrEmpty(r)) + return r; + } + } + } + } + return null; + } #region InstallRoot Properties static string netFrameworkInstallRoot = null; @@ -154,6 +170,18 @@ namespace ICSharpCode.Core } } + static string windowsSdk80InstallRoot = null; + /// + /// Location of the .NET 4.5 SDK (Windows SDK 8.0) install root. + /// + public static string WindowsSdk80NetFxTools { + get { + if (windowsSdk80InstallRoot == null) { + windowsSdk80InstallRoot = GetPathFromRegistryX86(@"SOFTWARE\Microsoft\Microsoft SDKs\Windows\v8.0A\WinSDK-NetFx40Tools", "InstallationFolder") ?? string.Empty; + } + return windowsSdk80InstallRoot; + } + } #endregion [Obsolete("Use System.IO.Path.Combine instead")] @@ -216,6 +244,10 @@ namespace ICSharpCode.Core /// The path of the executable, or null if the exe is not found. public static string GetSdkPath(string exeName) { string execPath; + if (!string.IsNullOrEmpty(WindowsSdk80NetFxTools)) { + execPath = Path.Combine(WindowsSdk80NetFxTools, exeName); + if (File.Exists(execPath)) { return execPath; } + } if (!string.IsNullOrEmpty(WindowsSdk71InstallRoot)) { execPath = Path.Combine(WindowsSdk71InstallRoot, "bin\\" + exeName); if (File.Exists(execPath)) { return execPath; } From c67061996d56440b386a3ca1dc8cc56c716bd576 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 29 Sep 2012 17:53:33 +0100 Subject: [PATCH 06/15] Fix FileNotFoundException if MVC T4 template processing fails. Do not attempt to open the view or controller if the T4 text templating processing returns an error. --- .../Src/AddMvcControllerToProjectViewModel.cs | 8 ++-- .../Src/AddMvcViewToProjectViewModel.cs | 8 ++-- .../Src/IMvcControllerFileGenerator.cs | 3 ++ .../Project/Src/IMvcViewFileGenerator.cs | 3 ++ .../Project/Src/MvcFileGenerator.cs | 7 ++++ .../Helpers/FakeMvcControllerFileGenerator.cs | 19 +++++++++ .../Test/Helpers/FakeMvcTextTemplateHost.cs | 7 ++++ .../Test/Helpers/FakeMvcViewFileGenerator.cs | 19 +++++++++ ...AddMvcControllerToProjectViewModelTests.cs | 18 ++++++++ .../Src/AddMvcViewToProjectViewModelTests.cs | 17 ++++++++ .../Src/MvcControllerFileGeneratorTests.cs | 42 +++++++++++++++++++ .../Test/Src/MvcViewFileGeneratorTests.cs | 42 +++++++++++++++++++ 12 files changed, 187 insertions(+), 6 deletions(-) diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectViewModel.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectViewModel.cs index 2c52fa7c68..10a011af89 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectViewModel.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectViewModel.cs @@ -106,15 +106,17 @@ namespace ICSharpCode.AspNet.Mvc public void AddMvcController() { - GenerateMvcControllerFile(); - AddMvcControllerFileToProject(); + if (GenerateMvcControllerFile()) { + AddMvcControllerFileToProject(); + } IsClosed = true; } - void GenerateMvcControllerFile() + bool GenerateMvcControllerFile() { ConfigureMvcControllerGenerator(); controllerGenerator.GenerateFile(controllerFileName); + return !controllerGenerator.HasErrors; } void ConfigureMvcControllerGenerator() diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs index 393bb2c424..975736ceb2 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs @@ -223,16 +223,18 @@ namespace ICSharpCode.AspNet.Mvc public void AddMvcView() { - GenerateMvcViewFile(); - AddMvcViewFileToProject(); + if (GenerateMvcViewFile()) { + AddMvcViewFileToProject(); + } IsClosed = true; } - void GenerateMvcViewFile() + bool GenerateMvcViewFile() { ConfigureMvcViewGenerator(); viewFileName.TemplateLanguage = GetTemplateLanguage(); viewGenerator.GenerateFile(viewFileName); + return !viewGenerator.HasErrors; } void ConfigureMvcViewGenerator() diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcControllerFileGenerator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcControllerFileGenerator.cs index e0ec5cc3f1..e13bc811ca 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcControllerFileGenerator.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcControllerFileGenerator.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.CodeDom.Compiler; using ICSharpCode.SharpDevelop.Project; namespace ICSharpCode.AspNet.Mvc @@ -10,6 +11,8 @@ namespace ICSharpCode.AspNet.Mvc { IMvcProject Project { get; set; } MvcControllerTextTemplate Template { get; set; } + CompilerErrorCollection Errors { get; } + bool HasErrors { get; } void GenerateFile(MvcControllerFileName fileName); } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcViewFileGenerator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcViewFileGenerator.cs index 90a26770f7..232e7d56ce 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcViewFileGenerator.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcViewFileGenerator.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.CodeDom.Compiler; using ICSharpCode.SharpDevelop.Project; namespace ICSharpCode.AspNet.Mvc @@ -15,6 +16,8 @@ namespace ICSharpCode.AspNet.Mvc string MasterPageFile { get; set; } string PrimaryContentPlaceHolderId { get; set; } MvcViewTextTemplate Template { get; set; } + CompilerErrorCollection Errors { get; } + bool HasErrors { get; } void GenerateFile(MvcViewFileName fileName); } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs index f203dff084..06525d03ba 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs @@ -23,6 +23,11 @@ namespace ICSharpCode.AspNet.Mvc public MvcTextTemplateLanguage TemplateLanguage { get; set; } public IMvcProject Project { get; set; } + public CompilerErrorCollection Errors { get; private set; } + + public bool HasErrors { + get { return Errors.Count > 0; } + } public void GenerateFile(MvcFileName fileName) { @@ -50,6 +55,8 @@ namespace ICSharpCode.AspNet.Mvc string outputViewFileName = fileName.GetPath(); host.ProcessTemplate(templateFileName, outputViewFileName); + Errors = host.Errors; + if (host.Errors.Count > 0) { CompilerError error = host.Errors[0]; Console.WriteLine("ProcessTemplate error: " + error.ErrorText); diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcControllerFileGenerator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcControllerFileGenerator.cs index 9262deaa24..3f6bc1688b 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcControllerFileGenerator.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcControllerFileGenerator.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.CodeDom.Compiler; using ICSharpCode.AspNet.Mvc; using ICSharpCode.SharpDevelop.Project; @@ -9,6 +10,11 @@ namespace AspNet.Mvc.Tests.Helpers { public class FakeMvcControllerFileGenerator : IMvcControllerFileGenerator { + public FakeMvcControllerFileGenerator() + { + this.Errors = new CompilerErrorCollection(); + } + public IMvcProject Project { get; set; } public MvcControllerTextTemplate Template { get; set; } @@ -20,5 +26,18 @@ namespace AspNet.Mvc.Tests.Helpers FileNamePassedToGenerateController = fileName; IsGenerateFileCalled = true; } + + public CompilerErrorCollection Errors { get; set; } + + public CompilerError AddCompilerError() + { + var error = new CompilerError(); + Errors.Add(error); + return error; + } + + public bool HasErrors { + get { return Errors.Count > 0; } + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHost.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHost.cs index 6cfeea9f0e..02728b2fd7 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHost.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHost.cs @@ -45,5 +45,12 @@ namespace AspNet.Mvc.Tests.Helpers public string PrimaryContentPlaceHolderID { get; set; } public CompilerErrorCollection Errors { get; set; } + + public CompilerError AddCompilerError() + { + var error = new CompilerError(); + Errors.Add(error); + return error; + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcViewFileGenerator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcViewFileGenerator.cs index fb5003e580..bcb870449d 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcViewFileGenerator.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcViewFileGenerator.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.CodeDom.Compiler; using ICSharpCode.AspNet.Mvc; using ICSharpCode.SharpDevelop.Project; @@ -9,6 +10,11 @@ namespace AspNet.Mvc.Tests.Helpers { public class FakeMvcViewFileGenerator : IMvcViewFileGenerator { + public FakeMvcViewFileGenerator() + { + this.Errors = new CompilerErrorCollection(); + } + public IMvcProject Project { get; set; } public string ModelClassName { get; set; } public string ModelClassAssemblyLocation { get; set; } @@ -25,5 +31,18 @@ namespace AspNet.Mvc.Tests.Helpers FileNamePassedToGenerateFile = fileName; IsGenerateFileCalled = true; } + + public CompilerErrorCollection Errors { get; set; } + + public CompilerError AddCompilerError() + { + var error = new CompilerError(); + Errors.Add(error); + return error; + } + + public bool HasErrors { + get { return Errors.Count > 0; } + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcControllerToProjectViewModelTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcControllerToProjectViewModelTests.cs index 468014ba01..9253beaef5 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcControllerToProjectViewModelTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcControllerToProjectViewModelTests.cs @@ -81,6 +81,11 @@ namespace AspNet.Mvc.Tests viewModel.SelectedControllerTemplate = GetControllerTemplateFromViewModel("EmptyReadWrite"); } + void AddCompilerErrorToControllerGenerator() + { + fakeControllerGenerator.AddCompilerError(); + } + [Test] public void AddMvcControllerCommand_ExecutedWhenControllerNameSpecified_MvcControllerIsGenerated() { @@ -279,5 +284,18 @@ namespace AspNet.Mvc.Tests Assert.AreEqual(expectedFileName, fileName); } + + [Test] + public void AddMvcController_TemplateGenerationHasError_FileIsNotAddedToProject() + { + CreateViewModelWithCSharpProject(); + viewModel.ControllerName = "Home"; + AddCompilerErrorToControllerGenerator(); + + viewModel.AddMvcController(); + + string fileAddedToProject = fakeSelectedMvcControllerFolder.FileNamePassedToAddFile; + Assert.IsNull(fileAddedToProject); + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs index 9efd388f4e..d6b0354c50 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs @@ -106,6 +106,11 @@ namespace AspNet.Mvc.Tests return fakeProject.AddModelClassToProject(fullyQualifiedClassName); } + void AddCompilerErrorToViewGenerator() + { + fakeViewGenerator.AddCompilerError(); + } + [Test] public void AddMvcViewCommand_ExecutedWhenViewNameSpecified_MvcViewIsGenerated() { @@ -1421,5 +1426,17 @@ namespace AspNet.Mvc.Tests Assert.AreEqual(String.Empty, assemblyLocation); } + + [Test] + public void AddMvcView_TemplateGenerationHasError_FileIsNotAddedToProject() + { + CreateViewModel(); + AddCompilerErrorToViewGenerator(); + + viewModel.AddMvcView(); + + string fileAddedToProject = fakeSelectedMvcViewFolder.FileNamePassedToAddFile; + Assert.IsNull(fileAddedToProject); + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs index ed1e0e3461..e7340602d7 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.CodeDom.Compiler; using AspNet.Mvc.Tests.Helpers; using ICSharpCode.AspNet.Mvc; using ICSharpCode.SharpDevelop.Project; @@ -66,6 +67,11 @@ namespace AspNet.Mvc.Tests }; } + CompilerError AddCompilerErrorToTemplateHost() + { + return fakeHost.AddCompilerError(); + } + [Test] public void GenerateFile_CSharpControllerTemplate_MvcTextTemplateHostIsCreated() { @@ -202,5 +208,41 @@ namespace AspNet.Mvc.Tests Assert.AreEqual(expectedAppDomain, appDomain); } + + [Test] + public void GenerateFile_TemplateProcessedWithCompilerError_ErrorsSavedByGenerator() + { + CreateGenerator(); + ProjectPassedToGeneratorIsCSharpProject(); + CompilerError error = AddCompilerErrorToTemplateHost(); + + GenerateFile(); + + Assert.AreEqual(1, generator.Errors.Count); + Assert.AreEqual(error, generator.Errors[0]); + } + + [Test] + public void HasErrors_NoErrors_ReturnsFalse() + { + CreateGenerator(); + GenerateFile(); + + bool result = generator.HasErrors; + + Assert.IsFalse(result); + } + + [Test] + public void HasErrors_OneError_ReturnsTrue() + { + CreateGenerator(); + AddCompilerErrorToTemplateHost(); + GenerateFile(); + + bool result = generator.HasErrors; + + Assert.IsTrue(result); + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs index 6aa9b4a642..f8ea3e545f 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.CodeDom.Compiler; using AspNet.Mvc.Tests.Helpers; using ICSharpCode.AspNet.Mvc; using ICSharpCode.SharpDevelop.Project; @@ -78,6 +79,11 @@ namespace AspNet.Mvc.Tests }; } + CompilerError AddCompilerErrorToTemplateHost() + { + return fakeHost.AddCompilerError(); + } + [Test] public void GenerateFile_CSharpEmptyViewTemplate_MvcTextTemplateHostIsCreated() { @@ -315,5 +321,41 @@ namespace AspNet.Mvc.Tests Assert.AreEqual(String.Empty, assemblyLocation); } + + [Test] + public void GenerateFile_TemplateProcessedWithCompilerError_ErrorsSavedByGenerator() + { + CreateGenerator(); + ProjectPassedToGeneratorIsCSharpProject(); + CompilerError error = AddCompilerErrorToTemplateHost(); + + GenerateFile(); + + Assert.AreEqual(1, generator.Errors.Count); + Assert.AreEqual(error, generator.Errors[0]); + } + + [Test] + public void HasErrors_NoErrors_ReturnsFalse() + { + CreateGenerator(); + GenerateFile(); + + bool result = generator.HasErrors; + + Assert.IsFalse(result); + } + + [Test] + public void HasErrors_OneError_ReturnsTrue() + { + CreateGenerator(); + AddCompilerErrorToTemplateHost(); + GenerateFile(); + + bool result = generator.HasErrors; + + Assert.IsTrue(result); + } } } From 356e7bfc6ff1a69c2967ffb1f3d05e20fdb62976 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 29 Sep 2012 18:52:56 +0100 Subject: [PATCH 07/15] Add MVC T4 processing errors to Errors window. Add View and Add Controller dialogs now report T4 template processing errors to the Errors window instead of logging them to the console window. --- .../AspNet.Mvc/Project/AspNet.Mvc.csproj | 2 ++ .../Src/IMvcFileGenerationErrorReporter.cs | 13 +++++++++ .../Project/Src/MvcControllerFileGenerator.cs | 8 ++++-- .../Src/MvcFileGenerationErrorReporter.cs | 23 +++++++++++++++ .../Project/Src/MvcFileGenerator.cs | 12 ++++---- .../Project/Src/MvcViewFileGenerator.cs | 8 ++++-- .../Src/MvcControllerFileGeneratorTests.cs | 28 ++++++++++++++++++- .../Test/Src/MvcViewFileGeneratorTests.cs | 28 ++++++++++++++++++- 8 files changed, 108 insertions(+), 14 deletions(-) create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcFileGenerationErrorReporter.cs create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerationErrorReporter.cs diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj index d16b77692d..cc1a4d6b6b 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj @@ -173,6 +173,7 @@ + @@ -193,6 +194,7 @@ + diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcFileGenerationErrorReporter.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcFileGenerationErrorReporter.cs new file mode 100644 index 0000000000..c958323c3a --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcFileGenerationErrorReporter.cs @@ -0,0 +1,13 @@ +// 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.CodeDom.Compiler; + +namespace ICSharpCode.AspNet.Mvc +{ + public interface IMvcFileGenerationErrorReporter + { + void ShowErrors(CompilerErrorCollection errors); + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileGenerator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileGenerator.cs index 7349e2a403..9cfaa97237 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileGenerator.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileGenerator.cs @@ -11,14 +11,16 @@ namespace ICSharpCode.AspNet.Mvc public MvcControllerFileGenerator() : this( new MvcTextTemplateHostFactory(), - new MvcTextTemplateHostAppDomainFactory()) + new MvcTextTemplateHostAppDomainFactory(), + new MvcFileGenerationErrorReporter()) { } public MvcControllerFileGenerator( IMvcTextTemplateHostFactory hostFactory, - IMvcTextTemplateHostAppDomainFactory appDomainFactory) - : base(hostFactory, appDomainFactory) + IMvcTextTemplateHostAppDomainFactory appDomainFactory, + IMvcFileGenerationErrorReporter errorReporter) + : base(hostFactory, appDomainFactory, errorReporter) { this.Template = new MvcControllerTextTemplate(); } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerationErrorReporter.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerationErrorReporter.cs new file mode 100644 index 0000000000..726e8fa37c --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerationErrorReporter.cs @@ -0,0 +1,23 @@ +// 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.CodeDom.Compiler; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.TextTemplating; + +namespace ICSharpCode.AspNet.Mvc +{ + public class MvcFileGenerationErrorReporter : IMvcFileGenerationErrorReporter + { + public void ShowErrors(CompilerErrorCollection errors) + { + TaskService.ClearExceptCommentTasks(); + foreach (CompilerError error in errors) { + TaskService.Add(new CompilerErrorTask(error)); + } + WorkbenchSingleton.Workbench.GetPad(typeof(ErrorListPad)).BringPadToFront(); + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs index 06525d03ba..c898cb1465 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs @@ -12,13 +12,16 @@ namespace ICSharpCode.AspNet.Mvc { IMvcTextTemplateHostFactory hostFactory; IMvcTextTemplateHostAppDomainFactory appDomainFactory; + IMvcFileGenerationErrorReporter errorReporter; public MvcFileGenerator( IMvcTextTemplateHostFactory hostFactory, - IMvcTextTemplateHostAppDomainFactory appDomainFactory) + IMvcTextTemplateHostAppDomainFactory appDomainFactory, + IMvcFileGenerationErrorReporter errorReporter) { this.hostFactory = hostFactory; this.appDomainFactory = appDomainFactory; + this.errorReporter = errorReporter; } public MvcTextTemplateLanguage TemplateLanguage { get; set; } @@ -56,11 +59,8 @@ namespace ICSharpCode.AspNet.Mvc host.ProcessTemplate(templateFileName, outputViewFileName); Errors = host.Errors; - - if (host.Errors.Count > 0) { - CompilerError error = host.Errors[0]; - Console.WriteLine("ProcessTemplate error: " + error.ErrorText); - Console.WriteLine("ProcessTemplate error: Line: " + error.Line); + if (HasErrors) { + errorReporter.ShowErrors(Errors); } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs index ab221bb583..4753ffa7c7 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs @@ -14,15 +14,17 @@ namespace ICSharpCode.AspNet.Mvc : this( new MvcTextTemplateHostFactory(), new MvcTextTemplateRepository(), - new MvcTextTemplateHostAppDomainFactory()) + new MvcTextTemplateHostAppDomainFactory(), + new MvcFileGenerationErrorReporter()) { } public MvcViewFileGenerator( IMvcTextTemplateHostFactory hostFactory, MvcTextTemplateRepository textTemplateRepository, - IMvcTextTemplateHostAppDomainFactory appDomainFactory) - : base(hostFactory, appDomainFactory) + IMvcTextTemplateHostAppDomainFactory appDomainFactory, + IMvcFileGenerationErrorReporter errorReporter) + : base(hostFactory, appDomainFactory, errorReporter) { this.textTemplateRepository = textTemplateRepository; diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs index e7340602d7..46732c2a09 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs @@ -7,6 +7,7 @@ using AspNet.Mvc.Tests.Helpers; using ICSharpCode.AspNet.Mvc; using ICSharpCode.SharpDevelop.Project; using NUnit.Framework; +using Rhino.Mocks; namespace AspNet.Mvc.Tests { @@ -18,13 +19,15 @@ namespace AspNet.Mvc.Tests FakeMvcTextTemplateHostFactory fakeHostFactory; FakeMvcTextTemplateHost fakeHost; FakeMvcTextTemplateAppDomainFactory fakeAppDomainFactory; + IMvcFileGenerationErrorReporter fakeErrorReporter; void CreateGenerator() { fakeHostFactory = new FakeMvcTextTemplateHostFactory(); fakeHost = fakeHostFactory.FakeMvcTextTemplateHost; fakeAppDomainFactory = new FakeMvcTextTemplateAppDomainFactory(); - generator = new MvcControllerFileGenerator(fakeHostFactory, fakeAppDomainFactory); + fakeErrorReporter = MockRepository.GenerateStub(); + generator = new MvcControllerFileGenerator(fakeHostFactory, fakeAppDomainFactory, fakeErrorReporter); projectUsedByGenerator = new FakeMvcProject(); generator.Project = projectUsedByGenerator; ProjectPassedToGeneratorIsCSharpProject(); @@ -244,5 +247,28 @@ namespace AspNet.Mvc.Tests Assert.IsTrue(result); } + + [Test] + public void GenerateFile_TemplateProcessedWithCompilerError_ErrorsReported() + { + CreateGenerator(); + ProjectPassedToGeneratorIsCSharpProject(); + CompilerError error = AddCompilerErrorToTemplateHost(); + + GenerateFile(); + + fakeErrorReporter.AssertWasCalled(reporter => reporter.ShowErrors(generator.Errors)); + } + + [Test] + public void GenerateFile_TemplateProcessedNoErrors_NoErrorsReported() + { + CreateGenerator(); + ProjectPassedToGeneratorIsCSharpProject(); + + GenerateFile(); + + fakeErrorReporter.AssertWasNotCalled(reporter => reporter.ShowErrors(Arg.Is.Anything)); + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs index f8ea3e545f..71cc0da5bf 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs @@ -7,6 +7,7 @@ using AspNet.Mvc.Tests.Helpers; using ICSharpCode.AspNet.Mvc; using ICSharpCode.SharpDevelop.Project; using NUnit.Framework; +using Rhino.Mocks; namespace AspNet.Mvc.Tests { @@ -19,6 +20,7 @@ namespace AspNet.Mvc.Tests FakeMvcTextTemplateHostFactory fakeHostFactory; FakeMvcTextTemplateHost fakeHost; FakeMvcTextTemplateAppDomainFactory fakeAppDomainFactory; + IMvcFileGenerationErrorReporter fakeErrorReporter; void CreateTemplateRepository(string templateRootDirectory) { @@ -36,7 +38,8 @@ namespace AspNet.Mvc.Tests fakeHostFactory = new FakeMvcTextTemplateHostFactory(); fakeHost = fakeHostFactory.FakeMvcTextTemplateHost; fakeAppDomainFactory = new FakeMvcTextTemplateAppDomainFactory(); - generator = new MvcViewFileGenerator(fakeHostFactory, templateRepository, fakeAppDomainFactory); + fakeErrorReporter = MockRepository.GenerateStub(); + generator = new MvcViewFileGenerator(fakeHostFactory, templateRepository, fakeAppDomainFactory, fakeErrorReporter); projectUsedByGenerator = new FakeMvcProject(); generator.Project = projectUsedByGenerator; ProjectPassedToGeneratorIsCSharpProject(); @@ -357,5 +360,28 @@ namespace AspNet.Mvc.Tests Assert.IsTrue(result); } + + [Test] + public void GenerateFile_TemplateProcessedWithCompilerError_ErrorsReported() + { + CreateGenerator(); + ProjectPassedToGeneratorIsCSharpProject(); + CompilerError error = AddCompilerErrorToTemplateHost(); + + GenerateFile(); + + fakeErrorReporter.AssertWasCalled(reporter => reporter.ShowErrors(generator.Errors)); + } + + [Test] + public void GenerateFile_TemplateProcessedNoErrors_NoErrorsReported() + { + CreateGenerator(); + ProjectPassedToGeneratorIsCSharpProject(); + + GenerateFile(); + + fakeErrorReporter.AssertWasNotCalled(reporter => reporter.ShowErrors(Arg.Is.Anything)); + } } } From df62b5a0b68ab81bcbd9788fac9104f9250715d9 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 30 Sep 2012 11:58:47 +0100 Subject: [PATCH 08/15] Use latest official NuGet feed source. --- .../PackageManagement/Project/Src/RegisteredPackageSources.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSources.cs b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSources.cs index 67c9c9101e..4b9f2574b7 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSources.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSources.cs @@ -11,7 +11,7 @@ namespace ICSharpCode.PackageManagement { public class RegisteredPackageSources : ObservableCollection { - public static readonly string DefaultPackageSourceUrl = "https://go.microsoft.com/fwlink/?LinkID=206669"; + public static readonly string DefaultPackageSourceUrl = "https://nuget.org/api/v2/"; public static readonly string DefaultPackageSourceName = "NuGet Official Package Source"; public static readonly PackageSource DefaultPackageSource = From 4d27532e1ad53edbc3ff8eac445c0e3baa192298 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 30 Sep 2012 13:31:12 +0100 Subject: [PATCH 09/15] Support disabling NuGet package sources. Add checkbox to NuGet package sources in Tools Options that can be used to enable or disable a package source. --- .../Project/Src/Design/FakeSettings.cs | 35 +++++- .../Project/Src/PackageSourceViewModel.cs | 5 + .../Project/Src/RegisteredPackageSource.cs | 10 +- .../Src/RegisteredPackageSourceSettings.cs | 34 +++++- .../RegisteredPackageSourcesUserControl.xaml | 4 +- .../Test/Src/PackageManagementOptionsTests.cs | 106 +++++++++++++++--- .../Test/Src/PackageSourceViewModelTests.cs | 54 +++++++++ 7 files changed, 222 insertions(+), 26 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeSettings.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeSettings.cs index 84afc7bf54..59b21e1373 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeSettings.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeSettings.cs @@ -12,6 +12,9 @@ namespace ICSharpCode.PackageManagement.Design public List> PackageSources = new List>(); + public List> DisabledPackageSources + = new List>(); + public List> ActivePackageSourceSettings = new List>(); @@ -22,11 +25,18 @@ namespace ICSharpCode.PackageManagement.Design { Sections.Add(RegisteredPackageSourceSettings.PackageSourcesSectionName, PackageSources); Sections.Add(RegisteredPackageSourceSettings.ActivePackageSourceSectionName, ActivePackageSourceSettings); + Sections.Add(RegisteredPackageSourceSettings.DisabledPackageSourceSectionName, DisabledPackageSources); } public string GetValue(string section, string key) { - throw new NotImplementedException(); + IList> values = Sections[section]; + foreach (KeyValuePair keyPair in values) { + if (keyPair.Key == key) { + return keyPair.Value; + } + } + return null; } public IList> GetValues(string section) @@ -87,6 +97,12 @@ namespace ICSharpCode.PackageManagement.Design } } + public bool IsDisabledPackageSourcesSectionDeleted { + get { + return SectionsDeleted.Contains(RegisteredPackageSourceSettings.DisabledPackageSourceSectionName); + } + } + public bool IsActivePackageSourceSectionDeleted { get { return SectionsDeleted.Contains(RegisteredPackageSourceSettings.ActivePackageSourceSectionName); @@ -128,5 +144,22 @@ namespace ICSharpCode.PackageManagement.Design { throw new NotImplementedException(); } + + public void AddDisabledPackageSource(PackageSource packageSource) + { + var valuePair = new KeyValuePair(packageSource.Name, packageSource.Source); + DisabledPackageSources.Add(valuePair); + } + + public IList> GetValuesPassedToSetValuesForDisabledPackageSourcesSection() + { + return SavedSectionValueLists[RegisteredPackageSourceSettings.DisabledPackageSourceSectionName]; + } + + public bool AnyValuesPassedToSetValuesForDisabledPackageSourcesSection { + get { + return SavedSectionValueLists.ContainsKey(RegisteredPackageSourceSettings.DisabledPackageSourceSectionName); + } + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageSourceViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageSourceViewModel.cs index d24345d865..c6a6f15032 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageSourceViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageSourceViewModel.cs @@ -29,5 +29,10 @@ namespace ICSharpCode.PackageManagement get { return packageSource.Source; } set { packageSource.Source = value; } } + + public bool IsEnabled { + get { return packageSource.IsEnabled; } + set { packageSource.IsEnabled = value; } + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSource.cs b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSource.cs index 5f427eb212..c1dc210073 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSource.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSource.cs @@ -10,26 +10,22 @@ namespace ICSharpCode.PackageManagement { public string Source { get; set; } public string Name { get; set; } + public bool IsEnabled { get; set; } public RegisteredPackageSource() { } - public RegisteredPackageSource(string name, string source) - { - this.Name = name; - this.Source = source; - } - public RegisteredPackageSource(PackageSource packageSource) { Source = packageSource.Source; Name = packageSource.Name; + IsEnabled = packageSource.IsEnabled; } public PackageSource ToPackageSource() { - return new PackageSource(Source, Name); + return new PackageSource(Source, Name, IsEnabled); } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourceSettings.cs b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourceSettings.cs index f894e96898..5ca49b1238 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourceSettings.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourceSettings.cs @@ -14,6 +14,7 @@ namespace ICSharpCode.PackageManagement { public static readonly string PackageSourcesSectionName = "packageSources"; public static readonly string ActivePackageSourceSectionName = "activePackageSource"; + public static readonly string DisabledPackageSourceSectionName = "disabledPackageSources"; public static readonly PackageSource AggregatePackageSource = new PackageSource("(Aggregate source)", "All"); @@ -64,7 +65,16 @@ namespace ICSharpCode.PackageManagement IEnumerable GetPackageSourcesFromSettings() { IList> savedPackageSources = settings.GetValues(PackageSourcesSectionName); - return PackageSourceConverter.ConvertFromKeyValuePairs(savedPackageSources); + foreach (PackageSource packageSource in PackageSourceConverter.ConvertFromKeyValuePairs(savedPackageSources)) { + packageSource.IsEnabled = IsPackageSourceEnabled(packageSource); + yield return packageSource; + } + } + + bool IsPackageSourceEnabled(PackageSource packageSource) + { + string disabled = settings.GetValue(DisabledPackageSourceSectionName, packageSource.Name); + return String.IsNullOrEmpty(disabled); } void PackageSourcesChanged(object sender, NotifyCollectionChangedEventArgs e) @@ -74,8 +84,10 @@ namespace ICSharpCode.PackageManagement void UpdatePackageSourceSettingsWithChanges() { - var newPackageSourceSettings = GetSettingsFromPackageSources(); + IList> newPackageSourceSettings = GetSettingsFromPackageSources(); SavePackageSourceSettings(newPackageSourceSettings); + IList> disabledPackageSourceSettings = GetSettingsForDisabledPackageSources(); + SaveDisabledPackageSourceSettings(disabledPackageSourceSettings); } IList> GetSettingsFromPackageSources() @@ -94,6 +106,22 @@ namespace ICSharpCode.PackageManagement settings.SetValues(PackageSourcesSectionName, newPackageSourceSettings); } + IList> GetSettingsForDisabledPackageSources() + { + return packageSources + .Where(source => !source.IsEnabled) + .Select(source => new KeyValuePair(source.Name, "true")) + .ToList(); + } + + void SaveDisabledPackageSourceSettings(IList> disabledPackageSourceSettings) + { + settings.DeleteSection(DisabledPackageSourceSectionName); + if (disabledPackageSourceSettings.Any()) { + settings.SetValues(DisabledPackageSourceSectionName, disabledPackageSourceSettings); + } + } + public PackageSource ActivePackageSource { get { if (activePackageSource != null) { @@ -125,7 +153,7 @@ namespace ICSharpCode.PackageManagement { RemoveActivePackageSourceSetting(); - var activePackageSourceSetting = PackageSourceConverter.ConvertToKeyValuePair(activePackageSource); + KeyValuePair activePackageSourceSetting = PackageSourceConverter.ConvertToKeyValuePair(activePackageSource); SaveActivePackageSourceSetting(activePackageSourceSetting); } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourcesUserControl.xaml b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourcesUserControl.xaml index 69b2c00ec4..9e01edf5e1 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourcesUserControl.xaml +++ b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourcesUserControl.xaml @@ -41,7 +41,9 @@ - + diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsTests.cs index b0acb97dfe..58ea7a53b2 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsTests.cs @@ -80,7 +80,7 @@ namespace PackageManagement.Tests fakeSettings.AddFakePackageSource(packageSource); CreateOptions(fakeSettings); - var actualSources = options.PackageSources; + RegisteredPackageSources actualSources = options.PackageSources; List expectedSources = new List(); expectedSources.Add(packageSource); @@ -97,7 +97,7 @@ namespace PackageManagement.Tests List expectedSources = new List(); expectedSources.Add(RegisteredPackageSources.DefaultPackageSource); - var actualPackageSources = options.PackageSources; + RegisteredPackageSources actualPackageSources = options.PackageSources; CollectionAssert.AreEqual(expectedSources, actualPackageSources); } @@ -108,16 +108,16 @@ namespace PackageManagement.Tests CreateSettings(); CreateOptions(fakeSettings); - var packageSources = options.PackageSources; + RegisteredPackageSources packageSources = options.PackageSources; - var defaultSource = RegisteredPackageSources.DefaultPackageSource; + PackageSource defaultSource = RegisteredPackageSources.DefaultPackageSource; var expectedSavedPackageSourceSettings = new List>(); string name = defaultSource.Name; string sourceUrl = defaultSource.Source; expectedSavedPackageSourceSettings.Add(new KeyValuePair(name, sourceUrl)); - var actualSavedPackageSourceSettings = fakeSettings.GetValuesPassedToSetValuesForPackageSourcesSection(); + IList> actualSavedPackageSourceSettings = fakeSettings.GetValuesPassedToSetValuesForPackageSourcesSection(); Assert.AreEqual(expectedSavedPackageSourceSettings, actualSavedPackageSourceSettings); } @@ -127,7 +127,7 @@ namespace PackageManagement.Tests { CreateSettings(); CreateOptions(fakeSettings); - var registeredPackageSources = options.PackageSources; + RegisteredPackageSources registeredPackageSources = options.PackageSources; var packageSource = new PackageSource("http://codeplex.com", "Test"); registeredPackageSources.Clear(); @@ -136,7 +136,7 @@ namespace PackageManagement.Tests var expectedSavedPackageSourceSettings = new List>(); expectedSavedPackageSourceSettings.Add(new KeyValuePair("Test", "http://codeplex.com")); - var actualSavedPackageSourceSettings = fakeSettings.GetValuesPassedToSetValuesForPackageSourcesSection(); + IList> actualSavedPackageSourceSettings = fakeSettings.GetValuesPassedToSetValuesForPackageSourcesSection(); Assert.AreEqual(expectedSavedPackageSourceSettings, actualSavedPackageSourceSettings); } @@ -146,7 +146,7 @@ namespace PackageManagement.Tests { CreateSettings(); CreateOptions(fakeSettings); - var registeredPackageSources = options.PackageSources; + RegisteredPackageSources registeredPackageSources = options.PackageSources; var packageSource = new PackageSource("http://codeplex.com", "Test"); registeredPackageSources.Clear(); @@ -185,7 +185,7 @@ namespace PackageManagement.Tests options.ActivePackageSource = packageSource; var expectedKeyValuePair = new KeyValuePair("Test", "http://sharpdevelop.com"); - var actualKeyValuePair = fakeSettings.GetValuePassedToSetValueForActivePackageSourceSection(); + KeyValuePair actualKeyValuePair = fakeSettings.GetValuePassedToSetValueForActivePackageSourceSection(); Assert.AreEqual(expectedKeyValuePair, actualKeyValuePair); } @@ -227,7 +227,7 @@ namespace PackageManagement.Tests var differentSource = new PackageSource("http://different-url", "Test2"); options.ActivePackageSource = differentSource; - var activeSource = options.ActivePackageSource; + PackageSource activeSource = options.ActivePackageSource; Assert.IsNull(activeSource); } @@ -280,7 +280,7 @@ namespace PackageManagement.Tests options.RecentPackages.Add(recentPackage); CreateOptions(properties); - var recentPackages = options.RecentPackages; + IList recentPackages = options.RecentPackages; var expectedRecentPackages = new RecentPackageInfo[] { new RecentPackageInfo(package) @@ -293,7 +293,7 @@ namespace PackageManagement.Tests public void RecentPackages_SaveRecentPackages_DoesNotThrowInvalidOperationException() { CreateOptions(); - var recentPackage = AddRecentPackageToOptions("id", "1.0"); + RecentPackageInfo recentPackage = AddRecentPackageToOptions("id", "1.0"); Assert.DoesNotThrow(() => SaveOptions()); } @@ -302,13 +302,91 @@ namespace PackageManagement.Tests public void ActivePackageSource_AggregatePackageSourceIsActivePackageSourceInSettings_ReturnsAggregatePackageSource() { CreateSettings(); - var expectedPackageSource = RegisteredPackageSourceSettings.AggregatePackageSource; + PackageSource expectedPackageSource = RegisteredPackageSourceSettings.AggregatePackageSource; fakeSettings.SetFakeActivePackageSource(expectedPackageSource); CreateOptions(fakeSettings); - var activePackageSource = options.ActivePackageSource; + PackageSource activePackageSource = options.ActivePackageSource; Assert.AreEqual(expectedPackageSource, activePackageSource); } + + [Test] + public void PackageSources_OneEnabledPackageSourceInSettings_ContainsSingleEnabledPackageSourceFromSettings() + { + CreateSettings(); + var packageSource = new PackageSource("http://codeplex.com", "Test") { IsEnabled = true }; + fakeSettings.AddFakePackageSource(packageSource); + CreateOptions(fakeSettings); + + RegisteredPackageSources actualSources = options.PackageSources; + + Assert.IsTrue(actualSources[0].IsEnabled); + } + + [Test] + public void PackageSources_OneDisabledPackageSourceInSettings_ContainsSingleDisabledPackageSourceFromSettings() + { + CreateSettings(); + var packageSource = new PackageSource("http://codeplex.com", "Test") { IsEnabled = false }; + fakeSettings.AddFakePackageSource(packageSource); + fakeSettings.AddDisabledPackageSource(packageSource); + CreateOptions(fakeSettings); + + RegisteredPackageSources actualSources = options.PackageSources; + + Assert.IsFalse(actualSources[0].IsEnabled); + } + + [Test] + public void PackageSources_OnePackageSourceAdded_DisabledPackageSourcesSectionDeletedFromSettings() + { + CreateSettings(); + CreateOptions(fakeSettings); + RegisteredPackageSources registeredPackageSources = options.PackageSources; + + var packageSource = new PackageSource("http://codeplex.com", "Test"); + registeredPackageSources.Clear(); + registeredPackageSources.Add(packageSource); + + bool sectionDeleted = fakeSettings.IsDisabledPackageSourcesSectionDeleted; + + Assert.IsTrue(sectionDeleted); + } + + [Test] + public void PackageSources_OneDisabledPackageSourceAdded_DisabledPackageSourcesSectionSaved() + { + CreateSettings(); + CreateOptions(fakeSettings); + RegisteredPackageSources registeredPackageSources = options.PackageSources; + + var packageSource = new PackageSource("http://codeplex.com", "Test") { IsEnabled = false }; + registeredPackageSources.Clear(); + registeredPackageSources.Add(packageSource); + + var expectedSavedPackageSourceSettings = new List>(); + expectedSavedPackageSourceSettings.Add(new KeyValuePair(packageSource.Name, "true")); + + IList> actualSavedPackageSourceSettings = + fakeSettings.GetValuesPassedToSetValuesForDisabledPackageSourcesSection(); + Assert.AreEqual(expectedSavedPackageSourceSettings, actualSavedPackageSourceSettings); + } + + [Test] + public void PackageSources_OneEnabledPackageSourceAdded_DisabledPackageSourcesSectionNotChanged() + { + CreateSettings(); + CreateOptions(fakeSettings); + RegisteredPackageSources registeredPackageSources = options.PackageSources; + + var packageSource = new PackageSource("http://codeplex.com", "Test") { IsEnabled = true }; + registeredPackageSources.Clear(); + registeredPackageSources.Add(packageSource); + + bool result = fakeSettings.AnyValuesPassedToSetValuesForDisabledPackageSourcesSection; + + Assert.IsFalse(result); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageSourceViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageSourceViewModelTests.cs index d0afd9c9b3..1f03e156ac 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageSourceViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageSourceViewModelTests.cs @@ -39,6 +39,18 @@ namespace PackageManagement.Tests viewModel = new PackageSourceViewModel(packageSource); } + void CreateEnabledPackageSource() + { + CreatePackageSource(); + packageSource.IsEnabled = true; + } + + void CreateDisabledPackageSource() + { + CreatePackageSource(); + packageSource.IsEnabled = false; + } + [Test] public void Name_InstanceCreatedWithRegisteredPackageSource_MatchesRegisteredPackageSourceName() { @@ -76,5 +88,47 @@ namespace PackageManagement.Tests Assert.AreEqual("changed", viewModel.SourceUrl); } + + [Test] + public void IsEnabled_PackageSourceIsEnabled_ReturnsTrue() + { + CreateEnabledPackageSource(); + CreateViewModel(packageSource); + + Assert.IsTrue(viewModel.IsEnabled); + } + + [Test] + public void IsEnabled_PackageSourceIsNotEnabled_ReturnsFalse() + { + CreateDisabledPackageSource(); + CreateViewModel(packageSource); + + Assert.IsFalse(viewModel.IsEnabled); + } + + [Test] + public void IsEnabled_ChangedFromTrueToFalse_UpdatesPackageSource() + { + CreateEnabledPackageSource(); + CreateViewModel(packageSource); + + viewModel.IsEnabled = false; + + PackageSource updatedPackageSource = viewModel.GetPackageSource(); + Assert.IsFalse(updatedPackageSource.IsEnabled); + } + + [Test] + public void IsEnabled_ChangedFromFalseToTrue_UpdatesPackageSource() + { + CreateDisabledPackageSource(); + CreateViewModel(packageSource); + + viewModel.IsEnabled = true; + + PackageSource updatedPackageSource = viewModel.GetPackageSource(); + Assert.IsTrue(updatedPackageSource.IsEnabled); + } } } From 878cd428dbc098306487a1642b9ef463673299d7 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 30 Sep 2012 13:53:44 +0100 Subject: [PATCH 10/15] Hide disabled NuGet package sources in package management console. --- .../Project/Src/RegisteredPackageSources.cs | 7 ++++- .../PackageManagementConsoleViewModel.cs | 6 ++-- .../PackageManagementConsoleViewModelTests.cs | 30 +++++++++++++++++-- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSources.cs b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSources.cs index 4b9f2574b7..4596ccea84 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSources.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSources.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; - +using System.Linq; using NuGet; namespace ICSharpCode.PackageManagement @@ -51,5 +51,10 @@ namespace ICSharpCode.PackageManagement public bool HasMultiplePackageSources { get { return Count > 1; } } + + public IEnumerable GetEnabledPackageSources() + { + return this.Where(packageSource => packageSource.IsEnabled); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleViewModel.cs index 203b941e45..55003e7c44 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleViewModel.cs @@ -82,14 +82,14 @@ namespace ICSharpCode.PackageManagement.Scripting void UpdatePackageSourceViewModels() { packageSources.Clear(); - AddRegisteredPackageSourceViewModels(); + AddEnabledPackageSourceViewModels(); AddAggregatePackageSourceViewModelIfMoreThanOnePackageSourceViewModelAdded(); SelectActivePackageSource(); } - void AddRegisteredPackageSourceViewModels() + void AddEnabledPackageSourceViewModels() { - foreach (PackageSource packageSource in registeredPackageSources) { + foreach (PackageSource packageSource in registeredPackageSources.GetEnabledPackageSources()) { AddPackageSourceViewModel(packageSource); } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleViewModelTests.cs index dd1146b9a0..40768123a2 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleViewModelTests.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Linq; using ICSharpCode.PackageManagement; using ICSharpCode.PackageManagement.Design; @@ -82,6 +83,18 @@ namespace PackageManagement.Tests.Scripting return activePackageSource; } + PackageSource CreateViewModelWithTwoRegisteredPackageSourcesAndFirstOneIsDisabledPackageSource() + { + CreateConsoleHost(); + var packageSources = new List(); + var disabledPackageSource = new PackageSource("Disabled source") { IsEnabled = false }; + var enabledPackageSource = new PackageSource("Enabled source") { IsEnabled = true }; + packageSources.Add(disabledPackageSource); + packageSources.Add(enabledPackageSource); + CreateViewModel(packageSources, consoleHost); + return enabledPackageSource; + } + Solution CreateViewModelWithOneProjectOpen() { CreateConsoleHost(); @@ -122,7 +135,7 @@ namespace PackageManagement.Tests.Scripting PackageSourceViewModel SelectSecondPackageSource() { - var selectedPackageSource = viewModel.PackageSources[1]; + PackageSourceViewModel selectedPackageSource = viewModel.PackageSources[1]; viewModel.ActivePackageSource = selectedPackageSource; return selectedPackageSource; } @@ -168,7 +181,7 @@ namespace PackageManagement.Tests.Scripting solution.RemoveFolder(project); return project; } - + [Test] public void PackageSources_OneRegisteredPackageSourceWhenConsoleCreated_OnePackageSourceDisplayed() { @@ -537,5 +550,18 @@ namespace PackageManagement.Tests.Scripting CreateViewModel(); Assert.DoesNotThrow(() => viewModel.ActivePackageSource = null); } + + [Test] + public void PackageSources_TwoRegisteredPackageSourcesButOnlyOneEnabledWhenConsoleCreated_OnlyEnabledPackageSourceDisplayed() + { + PackageSource enabledPackageSource = + CreateViewModelWithTwoRegisteredPackageSourcesAndFirstOneIsDisabledPackageSource(); + + ObservableCollection actualPackageSources = viewModel.PackageSources; + + var expectedPackageSources = new List(); + expectedPackageSources.Add(enabledPackageSource); + PackageSourceCollectionAssert.AreEqual(expectedPackageSources, actualPackageSources); + } } } From 1dfa232205ee97f75e75bf63a4971ce183cb5e78 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 30 Sep 2012 14:33:59 +0100 Subject: [PATCH 11/15] Hide disabled NuGet package sources in manage packages dialog. --- .../Project/Src/PackagesViewModel.cs | 2 +- .../Src/AvailablePackagesViewModelTests.cs | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs index e57e114f84..511a4587d2 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs @@ -342,7 +342,7 @@ namespace ICSharpCode.PackageManagement public IEnumerable PackageSources { get { - foreach (PackageSource packageSource in registeredPackageRepositories.PackageSources) { + foreach (PackageSource packageSource in registeredPackageRepositories.PackageSources.GetEnabledPackageSources()) { yield return packageSource; } if (registeredPackageRepositories.PackageSources.HasMultiplePackageSources) { diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs index 537068d345..0f1fd884cb 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs @@ -76,6 +76,17 @@ namespace PackageManagement.Tests registeredPackageRepositories.AddPackageSources(sources); } + PackageSource AddTwoPackageSourcesToRegisteredSourcesWithFirstOneDisabled() + { + var expectedPackageSources = new PackageSource[] { + new PackageSource("http://first.com", "First") { IsEnabled = false }, + new PackageSource("http://second.com", "Second") { IsEnabled = true } + }; + AddPackageSourcesToRegisteredSources(expectedPackageSources); + registeredPackageRepositories.HasMultiplePackageSources = true; + return expectedPackageSources[0]; + } + void CreateNewActiveRepositoryWithDifferentPackages() { var package = new FakePackage("NewRepositoryPackageId"); @@ -429,5 +440,20 @@ namespace PackageManagement.Tests }; PackageCollectionAssert.AreEqual(expectedPackages, allPackages); } + + [Test] + public void PackageSources_TwoPackageSourcesButFirstIsDisabled_DoesNotReturnDisabledPackageSource() + { + CreateRegisteredPackageRepositories(); + AddTwoPackageSourcesToRegisteredSourcesWithFirstOneDisabled(); + CreateViewModel(registeredPackageRepositories); + + IEnumerable packageSources = viewModel.PackageSources; + + bool containsDisabledPackageSource = packageSources.Contains(registeredPackageRepositories.PackageSources[0]); + bool containsEnabledPackageSource = packageSources.Contains(registeredPackageRepositories.PackageSources[1]); + Assert.IsFalse(containsDisabledPackageSource); + Assert.IsTrue(containsEnabledPackageSource); + } } } From 11c7563d429830cadae2e8d047e19b7f90149e00 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 30 Sep 2012 15:33:34 +0100 Subject: [PATCH 12/15] Add option to enable/disable NuGet package restore. Package restore setting in Tools Options dialog is now used to update the NuGet.config in the user's profile. --- .../Project/Src/Design/FakeSettings.cs | 21 +++++++ .../Project/Src/PackageManagementOptions.cs | 7 +++ .../Src/PackageManagementOptionsView.xaml | 27 +++++--- .../Src/PackageManagementOptionsView.xaml.cs | 7 +++ .../Src/PackageManagementOptionsViewModel.cs | 12 +++- .../Test/Src/PackageManagementOptionsTests.cs | 53 ++++++++++++++++ .../PackageManagementOptionsViewModelTests.cs | 62 ++++++++++++++++++- 7 files changed, 177 insertions(+), 12 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeSettings.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeSettings.cs index 59b21e1373..39859b0dd7 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeSettings.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeSettings.cs @@ -30,6 +30,9 @@ namespace ICSharpCode.PackageManagement.Design public string GetValue(string section, string key) { + if (!Sections.ContainsKey(section)) + return null; + IList> values = Sections[section]; foreach (KeyValuePair keyPair in values) { if (keyPair.Key == key) { @@ -161,5 +164,23 @@ namespace ICSharpCode.PackageManagement.Design return SavedSectionValueLists.ContainsKey(RegisteredPackageSourceSettings.DisabledPackageSourceSectionName); } } + + public void SetPackageRestoreSetting(bool enabled) + { + var items = new List>(); + items.Add(new KeyValuePair("enabled", enabled.ToString())); + Sections.Add("packageRestore", items); + } + + public KeyValuePair GetValuePassedToSetValueForPackageRestoreSection() + { + return SavedSectionValues["packageRestore"]; + } + + public bool IsPackageRestoreSectionDeleted { + get { + return SectionsDeleted.Contains("packageRestore"); + } + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptions.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptions.cs index 25772f88ab..d3b4a7626a 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptions.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptions.cs @@ -18,11 +18,13 @@ namespace ICSharpCode.PackageManagement RegisteredPackageSourceSettings registeredPackageSourceSettings; Properties properties; List recentPackages; + PackageRestoreConsent packageRestoreConsent; public PackageManagementOptions(Properties properties, ISettings settings) { this.properties = properties; registeredPackageSourceSettings = new RegisteredPackageSourceSettings(settings); + packageRestoreConsent = new PackageRestoreConsent(settings); } public PackageManagementOptions(Properties properties) @@ -35,6 +37,11 @@ namespace ICSharpCode.PackageManagement { } + public bool IsPackageRestoreEnabled { + get { return packageRestoreConsent.IsGrantedInSettings; } + set { packageRestoreConsent.IsGrantedInSettings = value; } + } + public RegisteredPackageSources PackageSources { get { return registeredPackageSourceSettings.PackageSources; } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptionsView.xaml b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptionsView.xaml index 6249dbfbe8..39538e1c2f 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptionsView.xaml +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptionsView.xaml @@ -5,19 +5,20 @@ xmlns:pm="clr-namespace:ICSharpCode.PackageManagement" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> + + + + + + + + + - - - - - - - - - + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptionsView.xaml.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptionsView.xaml.cs index 4d637af26b..4cd1daadbf 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptionsView.xaml.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptionsView.xaml.cs @@ -12,5 +12,12 @@ namespace ICSharpCode.PackageManagement { InitializeComponent(); } + + public override bool SaveOptions() + { + var viewModel = DataContext as PackageManagementOptionsViewModel; + viewModel.SaveOptions(); + return true; + } } } \ No newline at end of file diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptionsViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptionsViewModel.cs index 3f30fe14a7..442d44d0f5 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptionsViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptionsViewModel.cs @@ -9,32 +9,37 @@ namespace ICSharpCode.PackageManagement { public class PackageManagementOptionsViewModel : ViewModelBase { + PackageManagementOptions options; IRecentPackageRepository recentPackageRepository; IMachinePackageCache machinePackageCache; IProcess process; public PackageManagementOptionsViewModel(IRecentPackageRepository recentPackageRepository) - : this(recentPackageRepository, new MachinePackageCache(), new Process()) + : this(PackageManagementServices.Options, recentPackageRepository, new MachinePackageCache(), new Process()) { } public PackageManagementOptionsViewModel( + PackageManagementOptions options, IRecentPackageRepository recentPackageRepository, IMachinePackageCache machinePackageCache, IProcess process) { + this.options = options; this.recentPackageRepository = recentPackageRepository; this.machinePackageCache = machinePackageCache; this.process = process; this.HasNoRecentPackages = !RecentPackageRepositoryHasPackages(); this.HasNoCachedPackages = !MachinePackageCacheHasPackages(); + this.IsPackageRestoreEnabled = options.IsPackageRestoreEnabled; CreateCommands(); } public bool HasNoRecentPackages { get; private set; } public bool HasNoCachedPackages { get; private set; } + public bool IsPackageRestoreEnabled { get; set; } bool MachinePackageCacheHasPackages() { @@ -78,5 +83,10 @@ namespace ICSharpCode.PackageManagement { process.Start(machinePackageCache.Source); } + + public void SaveOptions() + { + options.IsPackageRestoreEnabled = IsPackageRestoreEnabled; + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsTests.cs index 58ea7a53b2..5320fdcffa 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsTests.cs @@ -72,6 +72,11 @@ namespace PackageManagement.Tests return recentPackage; } + void EnablePackageRestoreInSettings() + { + fakeSettings.SetPackageRestoreSetting(true); + } + [Test] public void PackageSources_OnePackageSourceInSettings_ContainsSinglePackageSourceFromSettings() { @@ -388,5 +393,53 @@ namespace PackageManagement.Tests Assert.IsFalse(result); } + + [Test] + public void IsPackageRestoreEnabled_EnabledInSettings_ReturnsTrue() + { + CreateSettings(); + EnablePackageRestoreInSettings(); + CreateOptions(fakeSettings); + + bool enabled = options.IsPackageRestoreEnabled; + + Assert.IsTrue(enabled); + } + + [Test] + public void IsPackageRestoreEnabled_PackageRestoreNotInSettings_ReturnsFalse() + { + CreateOptions(); + + bool enabled = options.IsPackageRestoreEnabled; + + Assert.IsFalse(enabled); + } + + [Test] + public void IsPackageRestoreEnabled_NotInSettingsOriginallyButSetToTrue_PackageRestoreEnabledInSettings() + { + CreateOptions(); + + options.IsPackageRestoreEnabled = true; + + KeyValuePair keyPair = fakeSettings.GetValuePassedToSetValueForPackageRestoreSection(); + + Assert.AreEqual("enabled", keyPair.Key); + Assert.AreEqual("True", keyPair.Value); + } + + [Test] + public void IsPackageRestoreEnabled_OriginallyEnabledInSettingsButSetToTrue_PackageRestoreSectionDeletedFromSettings() + { + CreateSettings(); + EnablePackageRestoreInSettings(); + CreateOptions(fakeSettings); + + options.IsPackageRestoreEnabled = false; + + bool deleted = fakeSettings.IsPackageRestoreSectionDeleted; + Assert.IsTrue(deleted); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsViewModelTests.cs index b9a685ff8d..a5e789ddae 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsViewModelTests.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using ICSharpCode.Core; using ICSharpCode.PackageManagement; using ICSharpCode.PackageManagement.Design; using NUnit.Framework; @@ -18,6 +19,8 @@ namespace PackageManagement.Tests FakeMachinePackageCache fakeMachineCache; FakeProcess fakeProcess; List propertiesChanged; + PackageManagementOptions options; + FakeSettings fakeSettings; void CreateRecentRepository() { @@ -29,18 +32,37 @@ namespace PackageManagement.Tests fakeMachineCache = new FakeMachinePackageCache(); } + void CreateOptions() + { + var properties = new Properties(); + fakeSettings = new FakeSettings(); + options = new PackageManagementOptions(properties, fakeSettings); + } + + void EnablePackageRestoreInOptions() + { + fakeSettings.SetPackageRestoreSetting(true); + } + void CreateViewModelUsingCreatedMachineCache() { CreateRecentRepository(); + CreateOptions(); fakeProcess = new FakeProcess(); - viewModel = new PackageManagementOptionsViewModel(fakeRecentRepository, fakeMachineCache, fakeProcess); + CreateViewModel(options); } void CreateViewModelUsingCreatedRecentRepository() { CreateMachineCache(); + CreateOptions(); fakeProcess = new FakeProcess(); - viewModel = new PackageManagementOptionsViewModel(fakeRecentRepository, fakeMachineCache, fakeProcess); + CreateViewModel(options); + } + + void CreateViewModel(PackageManagementOptions options) + { + viewModel = new PackageManagementOptionsViewModel(options, fakeRecentRepository, fakeMachineCache, fakeProcess); } void AddPackageToRecentRepository() @@ -277,5 +299,41 @@ namespace PackageManagement.Tests Assert.AreEqual(expectedFileName, fileName); } + + [Test] + public void IsPackageRestoreEnabled_TrueInOptions_ReturnsTrue() + { + CreateOptions(); + EnablePackageRestoreInOptions(); + CreateViewModel(options); + + bool result = viewModel.IsPackageRestoreEnabled; + + Assert.IsTrue(result); + } + + [Test] + public void IsPackageRestoreEnabled_FalseInOptions_ReturnsFalse() + { + CreateOptions(); + CreateViewModel(options); + + bool result = viewModel.IsPackageRestoreEnabled; + + Assert.IsFalse(result); + } + + [Test] + public void SaveOptions_PackageRestoreChangedFromFalseToTrue_PackageRestoreUpdatedInSettings() + { + CreateOptions(); + CreateViewModel(options); + viewModel.IsPackageRestoreEnabled = true; + + viewModel.SaveOptions(); + + KeyValuePair keyPair = fakeSettings.GetValuePassedToSetValueForPackageRestoreSection(); + Assert.AreEqual("True", keyPair.Value); + } } } From 8bf4153027378f09f686113122e936d12d06277a Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 4 Oct 2012 19:47:57 +0200 Subject: [PATCH 13/15] [AvalonEdit] Adjust epsilon used for IsClose() --- .../Utils/ExtensionMethods.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/ExtensionMethods.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/ExtensionMethods.cs index 0676256552..7c1ae6a1a6 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/ExtensionMethods.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/ExtensionMethods.cs @@ -14,10 +14,18 @@ namespace ICSharpCode.AvalonEdit.Utils static class ExtensionMethods { #region Epsilon / IsClose / CoerceValue - public const double Epsilon = 1e-8; + /// + /// Epsilon used for IsClose() implementations. + /// We can use up quite a few digits in front of the decimal point (due to visual positions being relative to document origin), + /// and there's no need to be too accurate (we're dealing with pixels here), + /// so we will use the value 0.01. + /// Previosly we used 1e-8 but that was causing issues: + /// http://community.sharpdevelop.net/forums/t/16048.aspx + /// + public const double Epsilon = 0.01; /// - /// Returns true if the doubles are close (difference smaller than 10^-8). + /// Returns true if the doubles are close (difference smaller than 0.01). /// public static bool IsClose(this double d1, double d2) { @@ -27,7 +35,7 @@ namespace ICSharpCode.AvalonEdit.Utils } /// - /// Returns true if the doubles are close (difference smaller than 10^-8). + /// Returns true if the doubles are close (difference smaller than 0.01). /// public static bool IsClose(this Size d1, Size d2) { @@ -35,7 +43,7 @@ namespace ICSharpCode.AvalonEdit.Utils } /// - /// Returns true if the doubles are close (difference smaller than 10^-8). + /// Returns true if the doubles are close (difference smaller than 0.01). /// public static bool IsClose(this Vector d1, Vector d2) { From 8293675a92872f56ae2c5a9f32d4cdb9a93805a3 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 5 Oct 2012 15:47:32 +0200 Subject: [PATCH 14/15] Replace 'Where(pred).FirstOrDefault()' with 'FirstOrDefault(pred)' --- .../CodeQuality/Gui/Controls/VisibleMatrix.cs | 2 +- .../Frontend/AddIn/Src/ProfilerTestRunner.cs | 3 +-- .../Frontend/Controls/QueryView.xaml.cs | 2 +- .../Project/Src/CodeManipulation.cs | 5 ++--- .../CppBinding/Project/ResourceScript.cs | 3 +-- .../WixBinding/Project/Src/WixDialog.cs | 2 +- .../XamlBinding/CompletionDataHelper.cs | 18 +++--------------- .../GridViewColumnHider.cs | 2 +- .../DatabaseObjects/Table.cs | 2 +- .../CSDLType/TypeBaseDesigner.xaml.cs | 2 +- .../UserControls/DesignerCanvasPreview.cs | 2 +- .../EDMObjects/CSDL/Type/EntityType.cs | 2 +- .../IO/CSDLIO.cs | 4 ++-- .../IO/SSDLIO.cs | 2 +- .../WpfDesign.AddIn/Src/WpfViewContent.cs | 5 ++--- .../PropertyGrid/PropertyGridView.xaml.cs | 2 +- .../AnalyticsMonitor.cs | 2 +- .../ActiveWindowStateEvaluator.cs | 1 + .../Src/Project/MSBuildItemDefinitionGroup.cs | 12 +++++------- src/Main/Base/Test/MemberLookupHelperTests.cs | 6 +++--- 20 files changed, 31 insertions(+), 48 deletions(-) diff --git a/src/AddIns/Analysis/CodeQuality/Gui/Controls/VisibleMatrix.cs b/src/AddIns/Analysis/CodeQuality/Gui/Controls/VisibleMatrix.cs index 9ca89bf6c2..89d22f4fda 100644 --- a/src/AddIns/Analysis/CodeQuality/Gui/Controls/VisibleMatrix.cs +++ b/src/AddIns/Analysis/CodeQuality/Gui/Controls/VisibleMatrix.cs @@ -32,7 +32,7 @@ namespace ICSharpCode.CodeQuality.Gui var items = type == HeaderType.Columns ? headerColumns : headerRows; foreach (var item in items) { - var foundItem = visibleItems.Where(n => n.Equals(item.Value)).SingleOrDefault(); + var foundItem = visibleItems.SingleOrDefault(n => n.Equals(item.Value)); item.Visible = foundItem != null; } diff --git a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/ProfilerTestRunner.cs b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/ProfilerTestRunner.cs index 42e13fdffd..f189bb7f90 100644 --- a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/ProfilerTestRunner.cs +++ b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/ProfilerTestRunner.cs @@ -73,8 +73,7 @@ namespace ICSharpCode.Profiler.AddIn } if (selectedTests.Member == null) { - return content.Classes - .Where(c => c.FullyQualifiedName == selectedTests.Class.DotNetName).First().Methods + return content.Classes.First(c => c.FullyQualifiedName == selectedTests.Class.DotNetName).Methods .Where(m => m.Attributes.Any(a2 => a2.AttributeType.FullyQualifiedName == "NUnit.Framework.TestAttribute")) .Select(m2 => m2.FullyQualifiedName); } diff --git a/src/AddIns/Analysis/Profiler/Frontend/Controls/QueryView.xaml.cs b/src/AddIns/Analysis/Profiler/Frontend/Controls/QueryView.xaml.cs index d01394396a..d20d4b744c 100644 --- a/src/AddIns/Analysis/Profiler/Frontend/Controls/QueryView.xaml.cs +++ b/src/AddIns/Analysis/Profiler/Frontend/Controls/QueryView.xaml.cs @@ -138,7 +138,7 @@ namespace ICSharpCode.Profiler.Controls CallTreeNodeViewModel GetViewModelFromPath(IEnumerable paths, SearchInfo info) { CallTreeNodeViewModel result = null; - var parent = list.Roots.Where(i => i.Node.Equals(info.ResultRoot)).FirstOrDefault(); + var parent = list.Roots.FirstOrDefault(i => i.Node.Equals(info.ResultRoot)); foreach (var path in paths) { var items = parent.Children; diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CodeManipulation.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CodeManipulation.cs index c26d91968b..e240e54f07 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CodeManipulation.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CodeManipulation.cs @@ -219,8 +219,7 @@ namespace CSharpBinding var selectionStart = editor.Document.OffsetToPosition(editor.SelectionStart); var selectionEnd = editor.Document.OffsetToPosition(editor.SelectionStart + editor.SelectionLength); - Ast.INode currentNode = parsedCU.Children.Select( - n => EditorContext.FindInnermostNodeContainingSelection(n, selectionStart, selectionEnd)).Where(n => n != null).FirstOrDefault(); + Ast.INode currentNode = parsedCU.Children.Select(n => EditorContext.FindInnermostNodeContainingSelection(n, selectionStart, selectionEnd)).FirstOrDefault(n => n != null); if (currentNode == null) return null; if (!IsNodeTypeInteresting(currentNode, interestingNodeTypes)) { // ignore uninteresting nodes in the AST @@ -306,7 +305,7 @@ namespace CSharpBinding /// Selection ExtendSelectionToEndOfLineComments(IDocument document, Location selectionStart, Location selectionEnd, IEnumerable commentsBlankLines) { - var lineComment = commentsBlankLines.Where(c => c.StartPosition.Line == selectionEnd.Line && c.StartPosition >= selectionEnd).FirstOrDefault(); + var lineComment = commentsBlankLines.FirstOrDefault(c => c.StartPosition.Line == selectionEnd.Line && c.StartPosition >= selectionEnd); if (lineComment == null) { return null; } diff --git a/src/AddIns/BackendBindings/CppBinding/CppBinding/Project/ResourceScript.cs b/src/AddIns/BackendBindings/CppBinding/CppBinding/Project/ResourceScript.cs index 5069986a9a..968f1cbb2c 100644 --- a/src/AddIns/BackendBindings/CppBinding/CppBinding/Project/ResourceScript.cs +++ b/src/AddIns/BackendBindings/CppBinding/CppBinding/Project/ResourceScript.cs @@ -48,8 +48,7 @@ namespace ICSharpCode.CppBinding.Project } public void SetIcon(string resourceId, string newPath) { - ResourceIcon iconEntry = (ResourceIcon)Icons.Where( - icon => icon.ResourceID == resourceId).SingleOrDefault(); + ResourceIcon iconEntry = (ResourceIcon)Icons.SingleOrDefault(icon => icon.ResourceID == resourceId); if (iconEntry != null) iconEntry.Data = newPath; else diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/WixDialog.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/WixDialog.cs index 2cdc4047ca..ade730f417 100644 --- a/src/AddIns/BackendBindings/WixBinding/Project/Src/WixDialog.cs +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/WixDialog.cs @@ -157,7 +157,7 @@ namespace ICSharpCode.WixBinding public Form CreateDialog(IComponentCreator componentCreator) { if (componentCreator == null) { - throw new ArgumentException("Cannot be null.", "componentCreator"); + throw new ArgumentNullException("componentCreator"); } Form dialog = CreateForm(componentCreator); diff --git a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/CompletionDataHelper.cs b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/CompletionDataHelper.cs index 6ab91827e8..256b18155a 100644 --- a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/CompletionDataHelper.cs +++ b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/CompletionDataHelper.cs @@ -1021,7 +1021,7 @@ namespace ICSharpCode.XamlBinding static IEnumerable CreateEventCompletion(XamlCompletionContext context, IClass c) { - IMethod invoker = c.Methods.Where(method => method.Name == "Invoke").FirstOrDefault(); + IMethod invoker = c.Methods.FirstOrDefault(method => method.Name == "Invoke"); if (invoker != null && context.ActiveElement != null) { var item = context.ActiveElement; var evt = ResolveAttribute(context.Attribute.ToQualifiedName(), context) as IEvent; @@ -1324,14 +1324,7 @@ namespace ICSharpCode.XamlBinding string eventName = field.Name.Remove(field.Name.Length - "Event".Length); - IMethod method = c.Methods - .Where(m => - m.IsPublic && - m.IsStatic && - m.Parameters.Count == 2 && - (m.Name == "Add" + eventName + "Handler" || - m.Name == "Remove" + eventName + "Handler")) - .FirstOrDefault(); + IMethod method = c.Methods.FirstOrDefault(m => m.IsPublic && m.IsStatic && m.Parameters.Count == 2 && (m.Name == "Add" + eventName + "Handler" || m.Name == "Remove" + eventName + "Handler")); if (method == null) return null; @@ -1346,12 +1339,7 @@ namespace ICSharpCode.XamlBinding string propertyName = field.Name.Remove(field.Name.Length - "Property".Length); - IMethod method = c.Methods - .Where(m => - m.IsPublic && - m.IsStatic && - m.Name == "Get" + propertyName) - .FirstOrDefault(); + IMethod method = c.Methods.FirstOrDefault(m => m.IsPublic && m.IsStatic && m.Name == "Get" + propertyName); if (method == null) return null; diff --git a/src/AddIns/Debugger/Debugger.AddIn/Visualizers/PresentationBindings/GridViewColumnHider.cs b/src/AddIns/Debugger/Debugger.AddIn/Visualizers/PresentationBindings/GridViewColumnHider.cs index db1ed8f2ad..44d83edba1 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Visualizers/PresentationBindings/GridViewColumnHider.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Visualizers/PresentationBindings/GridViewColumnHider.cs @@ -91,7 +91,7 @@ namespace Debugger.AddIn.Visualizers private GridViewColumnWithVisibility findColumn(string header) { - return allColumns.Where(columnVis => columnVis.Header == header).First(); + return allColumns.First(columnVis => columnVis.Header == header); } void hideColumn(string header) diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Table.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Table.cs index 5716ef1ccb..2de0fdb58b 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Table.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Table.cs @@ -79,7 +79,7 @@ namespace ICSharpCode.Data.Core.DatabaseObjects { get { - if (Items.Where(column => column.IsPrimaryKey).Count() > 1) + if (Items.Count(column => column.IsPrimaryKey) > 1) return true; else return false; diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/CSDLType/TypeBaseDesigner.xaml.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/CSDLType/TypeBaseDesigner.xaml.cs index 8b97b1d6ac..bf9a2d0f0e 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/CSDLType/TypeBaseDesigner.xaml.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/CSDLType/TypeBaseDesigner.xaml.cs @@ -85,7 +85,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.CSDLType { foreach (var relatedProperty in Designer.DesignerView.SelectMany(dv => dv.UIType.Properties).OfType().Where(uirp => uirp.RelatedType == UIType && !RelationsContenerByRelatedProperty.ContainsKey(uirp))) { - var otherType = Designer.Children.OfType().Where(td => td.UIType.Properties.Contains(relatedProperty)).FirstOrDefault(); + var otherType = Designer.Children.OfType().FirstOrDefault(td => td.UIType.Properties.Contains(relatedProperty)); if (otherType != null) otherType.DrawRelation(relatedProperty); } diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/DesignerCanvasPreview.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/DesignerCanvasPreview.cs index a3d8f631f9..08ad3f48a1 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/DesignerCanvasPreview.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/DesignerCanvasPreview.cs @@ -93,7 +93,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.UserControls get { if (_typebaseDesignerListView == null) - _typebaseDesignerListView = VisualTreeHelperUtil.GetControlsDecendant(Content.Children.OfType().Where(tbd => tbd.UIType.BusinessInstance == UIType.BusinessInstance).First()).First(); + _typebaseDesignerListView = VisualTreeHelperUtil.GetControlsDecendant(Content.Children.OfType().First(tbd => tbd.UIType.BusinessInstance == UIType.BusinessInstance)).First(); return _typebaseDesignerListView; } } diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/CSDL/Type/EntityType.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/CSDL/Type/EntityType.cs index 46766e3186..6d21aed2a0 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/CSDL/Type/EntityType.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/CSDL/Type/EntityType.cs @@ -301,7 +301,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.EDMObjects.CSDL.Type private void _navigationProperties_ItemRemoved(NavigationProperty navigationProperty) { _navigationProperties.ItemRemoved -= _navigationProperties_ItemRemoved; - var navigationProperty2 = navigationProperty.Association.PropertiesEnd.Where(pe => pe != navigationProperty).First(); + var navigationProperty2 = navigationProperty.Association.PropertiesEnd.First(pe => pe != navigationProperty); if (!navigationProperty2.IsDeleted) navigationProperty2.EntityType.NavigationProperties.Remove(navigationProperty2); _navigationProperties.ItemRemoved += _navigationProperties_ItemRemoved; diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/CSDLIO.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/CSDLIO.cs index 8e467ee0c0..735e4b3f36 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/CSDLIO.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/CSDLIO.cs @@ -120,7 +120,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO { var entityType = new EntityType { Name = typeName, BaseType = baseType }; SetBoolValueFromAttribute(entityTypeElement, "Abstract", isAbstract => entityType.Abstract = isAbstract); - var entitySetElement = entityContainerElement.Elements(XName.Get("EntitySet", csdlNamespace.NamespaceName)).Where(ese => GetName(ese.Attribute("EntityType").Value) == entityType.Name).FirstOrDefault(); + var entitySetElement = entityContainerElement.Elements(XName.Get("EntitySet", csdlNamespace.NamespaceName)).FirstOrDefault(ese => GetName(ese.Attribute("EntityType").Value) == entityType.Name); if (entitySetElement != null) { entityType.EntitySetName = entitySetElement.Attribute("Name").Value; @@ -149,7 +149,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO } else { - property = new ScalarProperty() { Name = name, IsKey = keyElement != null && keyElement.Elements(XName.Get("PropertyRef", csdlNamespace.NamespaceName)).Where(pr => pr.Attribute("Name").Value == name).Any(), Type = propertyType.Value }; + property = new ScalarProperty() { Name = name, IsKey = keyElement != null && keyElement.Elements(XName.Get("PropertyRef", csdlNamespace.NamespaceName)).Any(pr => pr.Attribute("Name").Value == name), Type = propertyType.Value }; var scalarProp = (ScalarProperty)property; SetBoolValueFromAttribute(propertyElement, "Nullable", nullable => scalarProp.Nullable = nullable); SetVisibilityValueFromAttribute(propertyElement, "SetterAccess", setterAccess => scalarProp.SetVisibility = setterAccess); diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/SSDLIO.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/SSDLIO.cs index 23c326caa8..4243dcf458 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/SSDLIO.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/SSDLIO.cs @@ -213,7 +213,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO foreach (var propertyElement in entityTypeElement.Elements(XName.Get("Property", ssdlNamespace.NamespaceName))) { var name = propertyElement.Attribute("Name").Value; - var property = new Property(entityType) { Name = name, Type = propertyElement.Attribute("Type").Value, IsKey = entityTypeElement.Element(XName.Get("Key", ssdlNamespace.NamespaceName)).Elements(XName.Get("PropertyRef", ssdlNamespace.NamespaceName)).Where(pr => pr.Attribute("Name").Value == name).Any() }; + var property = new Property(entityType) { Name = name, Type = propertyElement.Attribute("Type").Value, IsKey = entityTypeElement.Element(XName.Get("Key", ssdlNamespace.NamespaceName)).Elements(XName.Get("PropertyRef", ssdlNamespace.NamespaceName)).Any(pr => pr.Attribute("Name").Value == name) }; SetBoolValueFromAttribute(propertyElement, "Nullable", nullable => property.Nullable = nullable); SetIntValueFromAttribute(propertyElement, "MaxLength", maxLength => property.MaxLength = maxLength); SetBoolValueFromAttribute(propertyElement, "FixedLength", fixedLength => property.FixedLength = fixedLength); diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs index 44952fcbca..5aa39daf07 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs @@ -179,7 +179,7 @@ namespace ICSharpCode.WpfDesign.AddIn if (!propertyGridView.PropertyGrid.IsNameCorrect) return; // get the XAML file - OpenedFile fileName = this.Files.Where(f => f.FileName.ToString().EndsWith(".xaml")).FirstOrDefault(); + OpenedFile fileName = this.Files.FirstOrDefault(f => f.FileName.ToString().EndsWith(".xaml")); if (fileName == null) return; // parse the XAML file @@ -188,8 +188,7 @@ namespace ICSharpCode.WpfDesign.AddIn if (info.CompilationUnit.Classes.Count != 1) return; // rename the member - IMember member = info.CompilationUnit.Classes[0].AllMembers - .Where(m => m.Name == propertyGridView.PropertyGrid.OldName).FirstOrDefault(); + IMember member = info.CompilationUnit.Classes [0].AllMembers.FirstOrDefault(m => m.Name == propertyGridView.PropertyGrid.OldName); if (member != null) { FindReferencesAndRenameHelper.RenameMember(member, propertyGridView.PropertyGrid.Name); } diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGridView.xaml.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGridView.xaml.cs index fe5fb0c8bd..1fc38c0ea3 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGridView.xaml.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGridView.xaml.cs @@ -63,7 +63,7 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid protected override void OnMouseRightButtonUp(MouseButtonEventArgs e) { var ancestors = (e.OriginalSource as DependencyObject).GetVisualAncestors(); - Border row = ancestors.OfType().Where(b => b.Name == "uxPropertyNodeRow").FirstOrDefault(); + Border row = ancestors.OfType().FirstOrDefault(b => b.Name == "uxPropertyNodeRow"); if (row == null) return; PropertyNode node = row.DataContext as PropertyNode; diff --git a/src/AddIns/Misc/UsageDataCollector/UsageDataCollector.AddIn/AnalyticsMonitor.cs b/src/AddIns/Misc/UsageDataCollector/UsageDataCollector.AddIn/AnalyticsMonitor.cs index 0d47ff46e0..fcd2801ce0 100644 --- a/src/AddIns/Misc/UsageDataCollector/UsageDataCollector.AddIn/AnalyticsMonitor.cs +++ b/src/AddIns/Misc/UsageDataCollector/UsageDataCollector.AddIn/AnalyticsMonitor.cs @@ -151,7 +151,7 @@ namespace ICSharpCode.UsageDataCollector new UsageDataEnvironmentProperty { Name = "appVersion", Value = RevisionClass.Major + "." + RevisionClass.Minor + "." + RevisionClass.Build + "." + RevisionClass.Revision }, new UsageDataEnvironmentProperty { Name = "language", Value = ResourceService.Language }, new UsageDataEnvironmentProperty { Name = "culture", Value = CultureInfo.CurrentCulture.Name }, - new UsageDataEnvironmentProperty { Name = "userAddInCount", Value = AddInTree.AddIns.Where(a => !a.IsPreinstalled).Count().ToString() }, + new UsageDataEnvironmentProperty { Name = "userAddInCount", Value = AddInTree.AddIns.Count(a => !a.IsPreinstalled).ToString() }, new UsageDataEnvironmentProperty { Name = "branch", Value = BranchName }, new UsageDataEnvironmentProperty { Name = "commit", Value = CommitHash }, new UsageDataEnvironmentProperty { Name = "renderingTier", Value = (RenderCapability.Tier >> 16).ToString() } diff --git a/src/Main/Base/Project/Src/Internal/ConditionEvaluators/ActiveWindowStateEvaluator.cs b/src/Main/Base/Project/Src/Internal/ConditionEvaluators/ActiveWindowStateEvaluator.cs index bfcf7d965c..e2e797714a 100644 --- a/src/Main/Base/Project/Src/Internal/ConditionEvaluators/ActiveWindowStateEvaluator.cs +++ b/src/Main/Base/Project/Src/Internal/ConditionEvaluators/ActiveWindowStateEvaluator.cs @@ -9,6 +9,7 @@ using ICSharpCode.SharpDevelop.Gui; namespace ICSharpCode.SharpDevelop { + [Flags] public enum WindowState { None = 0, Untitled = 1, diff --git a/src/Main/Base/Project/Src/Project/MSBuildItemDefinitionGroup.cs b/src/Main/Base/Project/Src/Project/MSBuildItemDefinitionGroup.cs index 901ac88953..995d40601a 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildItemDefinitionGroup.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildItemDefinitionGroup.cs @@ -29,7 +29,7 @@ namespace ICSharpCode.SharpDevelop.Project public MSBuildItemDefinitionGroup(MSBuildBasedProject project, string condition) { ProjectRootElement root = project.MSBuildProjectFile; - group = root.ItemDefinitionGroups.Where(item => item.Condition == condition).SingleOrDefault(); + group = root.ItemDefinitionGroups.SingleOrDefault(item => item.Condition == condition); if (group == null) { group = root.CreateItemDefinitionGroupElement(); @@ -61,11 +61,10 @@ namespace ICSharpCode.SharpDevelop.Project public string GetElementMetadata(string element, string name) { ProjectItemDefinitionElement elem; - elem = (ProjectItemDefinitionElement)group.Children.Where( - item => item is ProjectItemDefinitionElement && ((ProjectItemDefinitionElement)item).ItemType == element).SingleOrDefault(); + elem = (ProjectItemDefinitionElement)group.Children.SingleOrDefault(item => item is ProjectItemDefinitionElement && ((ProjectItemDefinitionElement)item).ItemType == element); if (elem == null) return null; ProjectMetadataElement metadataElement; - metadataElement = elem.Metadata.Where(item => item.Name == name).SingleOrDefault(); + metadataElement = elem.Metadata.SingleOrDefault(item => item.Name == name); if (metadataElement == null) return null; return metadataElement.Value; } @@ -79,12 +78,11 @@ namespace ICSharpCode.SharpDevelop.Project public void SetElementMetadata(string element, string name, string value) { ProjectItemDefinitionElement elem; - elem = (ProjectItemDefinitionElement)group.Children.Where( - item => item is ProjectItemDefinitionElement && ((ProjectItemDefinitionElement)item).ItemType == element).SingleOrDefault(); + elem = (ProjectItemDefinitionElement)group.Children.SingleOrDefault(item => item is ProjectItemDefinitionElement && ((ProjectItemDefinitionElement)item).ItemType == element); if (elem == null) elem = AddElement(element); ProjectMetadataElement metadataElement; - metadataElement = elem.Metadata.Where(item => item.Name == name).SingleOrDefault(); + metadataElement = elem.Metadata.SingleOrDefault(item => item.Name == name); if (metadataElement != null) metadataElement.Value = value; else diff --git a/src/Main/Base/Test/MemberLookupHelperTests.cs b/src/Main/Base/Test/MemberLookupHelperTests.cs index cfa344fa89..6461f9a90a 100644 --- a/src/Main/Base/Test/MemberLookupHelperTests.cs +++ b/src/Main/Base/Test/MemberLookupHelperTests.cs @@ -427,9 +427,9 @@ namespace ICSharpCode.SharpDevelop.Tests IClass form = swf.GetClass("System.Windows.Forms.PrintPreviewDialog", 0); IMethod[] methods = OverrideCompletionItemProvider.GetOverridableMethods(form); IProperty[] properties = OverrideCompletionItemProvider.GetOverridableProperties(form); - Assert.AreEqual(1, properties.Where(m=>m.Name=="AutoScroll").Count()); - Assert.AreEqual(1, properties.Where(m=>m.Name=="CanRaiseEvents").Count()); - Assert.AreEqual(1, methods.Where(m=>m.Name=="AdjustFormScrollbars").Count()); + Assert.AreEqual(1, properties.Count(m => m.Name == "AutoScroll")); + Assert.AreEqual(1, properties.Count(m => m.Name == "CanRaiseEvents")); + Assert.AreEqual(1, methods.Count(m => m.Name == "AdjustFormScrollbars")); } [Test] From 8d0a6afd1c422da936c43c3e544388c7ca1afe07 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 6 Oct 2012 20:41:02 +0200 Subject: [PATCH 15/15] Fixed duplicate project references in portable library projects. --- src/Main/Base/Project/Src/Project/MSBuildInternals.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Main/Base/Project/Src/Project/MSBuildInternals.cs b/src/Main/Base/Project/Src/Project/MSBuildInternals.cs index 0a97799714..7c552c5793 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildInternals.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildInternals.cs @@ -231,6 +231,7 @@ namespace ICSharpCode.SharpDevelop.Project var query = from msbuildItem in resolvedAssemblyProjectItems + where msbuildItem.GetMetadataValue("ReferenceSourceTarget") != "ProjectReference" let originalInclude = msbuildItem.GetMetadataValue("OriginalItemSpec") join item in referenceProjectItems.Where(p => p.ItemType != ItemType.ProjectReference) on originalInclude equals item.Include into referenceItems select new {