Browse Source

Merge branch 'origin/master' into newNR

newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
0d945a7d52
  1. 4
      data/templates/project/AddInWritingHelp.txt
  2. 2
      src/AddIns/Analysis/CodeQuality/Gui/Controls/VisibleMatrix.cs
  3. 3
      src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/ProfilerTestRunner.cs
  4. 2
      src/AddIns/Analysis/Profiler/Frontend/Controls/QueryView.xaml.cs
  5. 2
      src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj
  6. 8
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectViewModel.cs
  7. 8
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs
  8. 3
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcControllerFileGenerator.cs
  9. 13
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcFileGenerationErrorReporter.cs
  10. 3
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcViewFileGenerator.cs
  11. 8
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileGenerator.cs
  12. 23
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerationErrorReporter.cs
  13. 17
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs
  14. 8
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs
  15. 19
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcControllerFileGenerator.cs
  16. 7
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHost.cs
  17. 19
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcViewFileGenerator.cs
  18. 18
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcControllerToProjectViewModelTests.cs
  19. 17
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs
  20. 70
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs
  21. 70
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs
  22. 5
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/CodeManipulation.cs
  23. 3
      src/AddIns/BackendBindings/CppBinding/CppBinding/Project/ResourceScript.cs
  24. 8
      src/AddIns/BackendBindings/Scripting/Project/Src/ConsoleTextEditorKeyEventArgs.cs
  25. 8
      src/AddIns/BackendBindings/Scripting/Project/Src/ScriptingConsole.cs
  26. 2
      src/AddIns/BackendBindings/Scripting/Project/Src/ScriptingConsoleTextEditorKeyEventArgs.cs
  27. 18
      src/AddIns/BackendBindings/Scripting/Test/Console/ScriptingConsoleReadOnlyRegionsTests.cs
  28. 10
      src/AddIns/BackendBindings/Scripting/Test/Utils/FakeConsoleTextEditor.cs
  29. 4
      src/AddIns/BackendBindings/Scripting/Test/Utils/FakeConsoleTextEditorKeyEventArgs.cs
  30. 2
      src/AddIns/BackendBindings/WixBinding/Project/Src/WixDialog.cs
  31. 18
      src/AddIns/BackendBindings/XamlBinding/XamlBinding/CompletionDataHelper.cs
  32. 2
      src/AddIns/Debugger/Debugger.AddIn/Visualizers/PresentationBindings/GridViewColumnHider.cs
  33. 2
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Table.cs
  34. 2
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/CSDLType/TypeBaseDesigner.xaml.cs
  35. 2
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/DesignerCanvasPreview.cs
  36. 2
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/CSDL/Type/EntityType.cs
  37. 4
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/CSDLIO.cs
  38. 2
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/SSDLIO.cs
  39. 5
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs
  40. 2
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGridView.xaml.cs
  41. 56
      src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeSettings.cs
  42. 7
      src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptions.cs
  43. 27
      src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptionsView.xaml
  44. 7
      src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptionsView.xaml.cs
  45. 12
      src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptionsViewModel.cs
  46. 5
      src/AddIns/Misc/PackageManagement/Project/Src/PackageSourceViewModel.cs
  47. 2
      src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs
  48. 10
      src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSource.cs
  49. 34
      src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourceSettings.cs
  50. 9
      src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSources.cs
  51. 4
      src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourcesUserControl.xaml
  52. 6
      src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleViewModel.cs
  53. 26
      src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs
  54. 159
      src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsTests.cs
  55. 62
      src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsViewModelTests.cs
  56. 54
      src/AddIns/Misc/PackageManagement/Test/Src/PackageSourceViewModelTests.cs
  57. 30
      src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleViewModelTests.cs
  58. 2
      src/AddIns/Misc/UsageDataCollector/UsageDataCollector.AddIn/AnalyticsMonitor.cs
  59. 16
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/ExtensionMethods.cs
  60. 1
      src/Main/Base/Project/Src/Internal/ConditionEvaluators/ActiveWindowStateEvaluator.cs
  61. 1
      src/Main/Base/Project/Src/Project/MSBuildInternals.cs
  62. 12
      src/Main/Base/Project/Src/Project/MSBuildItemDefinitionGroup.cs
  63. 32
      src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs

4
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 We would like to point out that there are three locations where you can get information on how
to write SharpDevelop AddIns: 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 - The folder "doc/technotes" in the SharpDevelop source code download
- You can ask questions about AddIn development in the SharpDevelop forum: - You can ask questions about AddIn development in the SharpDevelop forum:
http://community.sharpdevelop.net/forums/ http://community.sharpdevelop.net/forums/
@ -17,7 +17,7 @@ The next steps:
See SharpDevelop/doc/technotes/AddInManager.rtf for more information. 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! - 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 This file serves as a reminder for you on how to find information on SharpDevelop AddIn development, you can

2
src/AddIns/Analysis/CodeQuality/Gui/Controls/VisibleMatrix.cs

@ -32,7 +32,7 @@ namespace ICSharpCode.CodeQuality.Gui
var items = type == HeaderType.Columns ? headerColumns : headerRows; var items = type == HeaderType.Columns ? headerColumns : headerRows;
foreach (var item in items) { 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; item.Visible = foundItem != null;
} }

3
src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/ProfilerTestRunner.cs

@ -73,8 +73,7 @@ namespace ICSharpCode.Profiler.AddIn
} }
if (selectedTests.Member == null) { if (selectedTests.Member == null) {
return content.Classes return content.Classes.First(c => c.FullyQualifiedName == selectedTests.Class.DotNetName).Methods
.Where(c => c.FullyQualifiedName == selectedTests.Class.DotNetName).First().Methods
.Where(m => m.Attributes.Any(a2 => a2.AttributeType.FullyQualifiedName == "NUnit.Framework.TestAttribute")) .Where(m => m.Attributes.Any(a2 => a2.AttributeType.FullyQualifiedName == "NUnit.Framework.TestAttribute"))
.Select(m2 => m2.FullyQualifiedName); .Select(m2 => m2.FullyQualifiedName);
} }

2
src/AddIns/Analysis/Profiler/Frontend/Controls/QueryView.xaml.cs

@ -138,7 +138,7 @@ namespace ICSharpCode.Profiler.Controls
CallTreeNodeViewModel GetViewModelFromPath(IEnumerable<NodePath> paths, SearchInfo info) CallTreeNodeViewModel GetViewModelFromPath(IEnumerable<NodePath> paths, SearchInfo info)
{ {
CallTreeNodeViewModel result = null; 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) { foreach (var path in paths) {
var items = parent.Children; var items = parent.Children;

2
src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj

@ -173,6 +173,7 @@
<Compile Include="Src\IISAdministrator.cs" /> <Compile Include="Src\IISAdministrator.cs" />
<Compile Include="Src\IISExpressAdministrator.cs" /> <Compile Include="Src\IISExpressAdministrator.cs" />
<Compile Include="Src\IISExpressProcessStartInfo.cs" /> <Compile Include="Src\IISExpressProcessStartInfo.cs" />
<Compile Include="Src\IMvcFileGenerationErrorReporter.cs" />
<Compile Include="Src\IMvcModelClassLocator.cs" /> <Compile Include="Src\IMvcModelClassLocator.cs" />
<Compile Include="Src\IMvcClass.cs" /> <Compile Include="Src\IMvcClass.cs" />
<Compile Include="Src\IMvcControllerFileGenerator.cs" /> <Compile Include="Src\IMvcControllerFileGenerator.cs" />
@ -193,6 +194,7 @@
<Compile Include="Src\IsMvcViewFolderSelectedConditionEvaluator.cs" /> <Compile Include="Src\IsMvcViewFolderSelectedConditionEvaluator.cs" />
<Compile Include="Configuration\AssemblyInfo.cs" /> <Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="Src\MvcControllerTextTemplate.cs" /> <Compile Include="Src\MvcControllerTextTemplate.cs" />
<Compile Include="Src\MvcFileGenerationErrorReporter.cs" />
<Compile Include="Src\MvcProjectMasterPageFile.cs" /> <Compile Include="Src\MvcProjectMasterPageFile.cs" />
<Compile Include="Src\MvcModelClassLocator.cs" /> <Compile Include="Src\MvcModelClassLocator.cs" />
<Compile Include="Src\MvcAddViewTextTemplateFolder.cs" /> <Compile Include="Src\MvcAddViewTextTemplateFolder.cs" />

8
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectViewModel.cs

@ -106,15 +106,17 @@ namespace ICSharpCode.AspNet.Mvc
public void AddMvcController() public void AddMvcController()
{ {
GenerateMvcControllerFile(); if (GenerateMvcControllerFile()) {
AddMvcControllerFileToProject(); AddMvcControllerFileToProject();
}
IsClosed = true; IsClosed = true;
} }
void GenerateMvcControllerFile() bool GenerateMvcControllerFile()
{ {
ConfigureMvcControllerGenerator(); ConfigureMvcControllerGenerator();
controllerGenerator.GenerateFile(controllerFileName); controllerGenerator.GenerateFile(controllerFileName);
return !controllerGenerator.HasErrors;
} }
void ConfigureMvcControllerGenerator() void ConfigureMvcControllerGenerator()

8
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs

@ -223,16 +223,18 @@ namespace ICSharpCode.AspNet.Mvc
public void AddMvcView() public void AddMvcView()
{ {
GenerateMvcViewFile(); if (GenerateMvcViewFile()) {
AddMvcViewFileToProject(); AddMvcViewFileToProject();
}
IsClosed = true; IsClosed = true;
} }
void GenerateMvcViewFile() bool GenerateMvcViewFile()
{ {
ConfigureMvcViewGenerator(); ConfigureMvcViewGenerator();
viewFileName.TemplateLanguage = GetTemplateLanguage(); viewFileName.TemplateLanguage = GetTemplateLanguage();
viewGenerator.GenerateFile(viewFileName); viewGenerator.GenerateFile(viewFileName);
return !viewGenerator.HasErrors;
} }
void ConfigureMvcViewGenerator() void ConfigureMvcViewGenerator()

3
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) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.CodeDom.Compiler;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.AspNet.Mvc namespace ICSharpCode.AspNet.Mvc
@ -10,6 +11,8 @@ namespace ICSharpCode.AspNet.Mvc
{ {
IMvcProject Project { get; set; } IMvcProject Project { get; set; }
MvcControllerTextTemplate Template { get; set; } MvcControllerTextTemplate Template { get; set; }
CompilerErrorCollection Errors { get; }
bool HasErrors { get; }
void GenerateFile(MvcControllerFileName fileName); void GenerateFile(MvcControllerFileName fileName);
} }

13
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);
}
}

3
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) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.CodeDom.Compiler;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.AspNet.Mvc namespace ICSharpCode.AspNet.Mvc
@ -15,6 +16,8 @@ namespace ICSharpCode.AspNet.Mvc
string MasterPageFile { get; set; } string MasterPageFile { get; set; }
string PrimaryContentPlaceHolderId { get; set; } string PrimaryContentPlaceHolderId { get; set; }
MvcViewTextTemplate Template { get; set; } MvcViewTextTemplate Template { get; set; }
CompilerErrorCollection Errors { get; }
bool HasErrors { get; }
void GenerateFile(MvcViewFileName fileName); void GenerateFile(MvcViewFileName fileName);
} }

8
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileGenerator.cs

@ -11,14 +11,16 @@ namespace ICSharpCode.AspNet.Mvc
public MvcControllerFileGenerator() public MvcControllerFileGenerator()
: this( : this(
new MvcTextTemplateHostFactory(), new MvcTextTemplateHostFactory(),
new MvcTextTemplateHostAppDomainFactory()) new MvcTextTemplateHostAppDomainFactory(),
new MvcFileGenerationErrorReporter())
{ {
} }
public MvcControllerFileGenerator( public MvcControllerFileGenerator(
IMvcTextTemplateHostFactory hostFactory, IMvcTextTemplateHostFactory hostFactory,
IMvcTextTemplateHostAppDomainFactory appDomainFactory) IMvcTextTemplateHostAppDomainFactory appDomainFactory,
: base(hostFactory, appDomainFactory) IMvcFileGenerationErrorReporter errorReporter)
: base(hostFactory, appDomainFactory, errorReporter)
{ {
this.Template = new MvcControllerTextTemplate(); this.Template = new MvcControllerTextTemplate();
} }

23
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();
}
}
}

17
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs

@ -12,17 +12,25 @@ namespace ICSharpCode.AspNet.Mvc
{ {
IMvcTextTemplateHostFactory hostFactory; IMvcTextTemplateHostFactory hostFactory;
IMvcTextTemplateHostAppDomainFactory appDomainFactory; IMvcTextTemplateHostAppDomainFactory appDomainFactory;
IMvcFileGenerationErrorReporter errorReporter;
public MvcFileGenerator( public MvcFileGenerator(
IMvcTextTemplateHostFactory hostFactory, IMvcTextTemplateHostFactory hostFactory,
IMvcTextTemplateHostAppDomainFactory appDomainFactory) IMvcTextTemplateHostAppDomainFactory appDomainFactory,
IMvcFileGenerationErrorReporter errorReporter)
{ {
this.hostFactory = hostFactory; this.hostFactory = hostFactory;
this.appDomainFactory = appDomainFactory; this.appDomainFactory = appDomainFactory;
this.errorReporter = errorReporter;
} }
public MvcTextTemplateLanguage TemplateLanguage { get; set; } public MvcTextTemplateLanguage TemplateLanguage { get; set; }
public IMvcProject Project { 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) public void GenerateFile(MvcFileName fileName)
{ {
@ -50,10 +58,9 @@ namespace ICSharpCode.AspNet.Mvc
string outputViewFileName = fileName.GetPath(); string outputViewFileName = fileName.GetPath();
host.ProcessTemplate(templateFileName, outputViewFileName); host.ProcessTemplate(templateFileName, outputViewFileName);
if (host.Errors.Count > 0) { Errors = host.Errors;
CompilerError error = host.Errors[0]; if (HasErrors) {
Console.WriteLine("ProcessTemplate error: " + error.ErrorText); errorReporter.ShowErrors(Errors);
Console.WriteLine("ProcessTemplate error: Line: " + error.Line);
} }
} }

8
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs

@ -14,15 +14,17 @@ namespace ICSharpCode.AspNet.Mvc
: this( : this(
new MvcTextTemplateHostFactory(), new MvcTextTemplateHostFactory(),
new MvcTextTemplateRepository(), new MvcTextTemplateRepository(),
new MvcTextTemplateHostAppDomainFactory()) new MvcTextTemplateHostAppDomainFactory(),
new MvcFileGenerationErrorReporter())
{ {
} }
public MvcViewFileGenerator( public MvcViewFileGenerator(
IMvcTextTemplateHostFactory hostFactory, IMvcTextTemplateHostFactory hostFactory,
MvcTextTemplateRepository textTemplateRepository, MvcTextTemplateRepository textTemplateRepository,
IMvcTextTemplateHostAppDomainFactory appDomainFactory) IMvcTextTemplateHostAppDomainFactory appDomainFactory,
: base(hostFactory, appDomainFactory) IMvcFileGenerationErrorReporter errorReporter)
: base(hostFactory, appDomainFactory, errorReporter)
{ {
this.textTemplateRepository = textTemplateRepository; this.textTemplateRepository = textTemplateRepository;

19
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) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.CodeDom.Compiler;
using ICSharpCode.AspNet.Mvc; using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
@ -9,6 +10,11 @@ namespace AspNet.Mvc.Tests.Helpers
{ {
public class FakeMvcControllerFileGenerator : IMvcControllerFileGenerator public class FakeMvcControllerFileGenerator : IMvcControllerFileGenerator
{ {
public FakeMvcControllerFileGenerator()
{
this.Errors = new CompilerErrorCollection();
}
public IMvcProject Project { get; set; } public IMvcProject Project { get; set; }
public MvcControllerTextTemplate Template { get; set; } public MvcControllerTextTemplate Template { get; set; }
@ -20,5 +26,18 @@ namespace AspNet.Mvc.Tests.Helpers
FileNamePassedToGenerateController = fileName; FileNamePassedToGenerateController = fileName;
IsGenerateFileCalled = true; 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; }
}
} }
} }

7
src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHost.cs

@ -45,5 +45,12 @@ namespace AspNet.Mvc.Tests.Helpers
public string PrimaryContentPlaceHolderID { get; set; } public string PrimaryContentPlaceHolderID { get; set; }
public CompilerErrorCollection Errors { get; set; } public CompilerErrorCollection Errors { get; set; }
public CompilerError AddCompilerError()
{
var error = new CompilerError();
Errors.Add(error);
return error;
}
} }
} }

19
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) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.CodeDom.Compiler;
using ICSharpCode.AspNet.Mvc; using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
@ -9,6 +10,11 @@ namespace AspNet.Mvc.Tests.Helpers
{ {
public class FakeMvcViewFileGenerator : IMvcViewFileGenerator public class FakeMvcViewFileGenerator : IMvcViewFileGenerator
{ {
public FakeMvcViewFileGenerator()
{
this.Errors = new CompilerErrorCollection();
}
public IMvcProject Project { get; set; } public IMvcProject Project { get; set; }
public string ModelClassName { get; set; } public string ModelClassName { get; set; }
public string ModelClassAssemblyLocation { get; set; } public string ModelClassAssemblyLocation { get; set; }
@ -25,5 +31,18 @@ namespace AspNet.Mvc.Tests.Helpers
FileNamePassedToGenerateFile = fileName; FileNamePassedToGenerateFile = fileName;
IsGenerateFileCalled = true; 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; }
}
} }
} }

18
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcControllerToProjectViewModelTests.cs

@ -81,6 +81,11 @@ namespace AspNet.Mvc.Tests
viewModel.SelectedControllerTemplate = GetControllerTemplateFromViewModel("EmptyReadWrite"); viewModel.SelectedControllerTemplate = GetControllerTemplateFromViewModel("EmptyReadWrite");
} }
void AddCompilerErrorToControllerGenerator()
{
fakeControllerGenerator.AddCompilerError();
}
[Test] [Test]
public void AddMvcControllerCommand_ExecutedWhenControllerNameSpecified_MvcControllerIsGenerated() public void AddMvcControllerCommand_ExecutedWhenControllerNameSpecified_MvcControllerIsGenerated()
{ {
@ -279,5 +284,18 @@ namespace AspNet.Mvc.Tests
Assert.AreEqual(expectedFileName, fileName); Assert.AreEqual(expectedFileName, fileName);
} }
[Test]
public void AddMvcController_TemplateGenerationHasError_FileIsNotAddedToProject()
{
CreateViewModelWithCSharpProject();
viewModel.ControllerName = "Home";
AddCompilerErrorToControllerGenerator();
viewModel.AddMvcController();
string fileAddedToProject = fakeSelectedMvcControllerFolder.FileNamePassedToAddFile;
Assert.IsNull(fileAddedToProject);
}
} }
} }

17
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs

@ -106,6 +106,11 @@ namespace AspNet.Mvc.Tests
return fakeProject.AddModelClassToProject(fullyQualifiedClassName); return fakeProject.AddModelClassToProject(fullyQualifiedClassName);
} }
void AddCompilerErrorToViewGenerator()
{
fakeViewGenerator.AddCompilerError();
}
[Test] [Test]
public void AddMvcViewCommand_ExecutedWhenViewNameSpecified_MvcViewIsGenerated() public void AddMvcViewCommand_ExecutedWhenViewNameSpecified_MvcViewIsGenerated()
{ {
@ -1421,5 +1426,17 @@ namespace AspNet.Mvc.Tests
Assert.AreEqual(String.Empty, assemblyLocation); Assert.AreEqual(String.Empty, assemblyLocation);
} }
[Test]
public void AddMvcView_TemplateGenerationHasError_FileIsNotAddedToProject()
{
CreateViewModel();
AddCompilerErrorToViewGenerator();
viewModel.AddMvcView();
string fileAddedToProject = fakeSelectedMvcViewFolder.FileNamePassedToAddFile;
Assert.IsNull(fileAddedToProject);
}
} }
} }

70
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs

@ -2,10 +2,12 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.CodeDom.Compiler;
using AspNet.Mvc.Tests.Helpers; using AspNet.Mvc.Tests.Helpers;
using ICSharpCode.AspNet.Mvc; using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework; using NUnit.Framework;
using Rhino.Mocks;
namespace AspNet.Mvc.Tests namespace AspNet.Mvc.Tests
{ {
@ -17,13 +19,15 @@ namespace AspNet.Mvc.Tests
FakeMvcTextTemplateHostFactory fakeHostFactory; FakeMvcTextTemplateHostFactory fakeHostFactory;
FakeMvcTextTemplateHost fakeHost; FakeMvcTextTemplateHost fakeHost;
FakeMvcTextTemplateAppDomainFactory fakeAppDomainFactory; FakeMvcTextTemplateAppDomainFactory fakeAppDomainFactory;
IMvcFileGenerationErrorReporter fakeErrorReporter;
void CreateGenerator() void CreateGenerator()
{ {
fakeHostFactory = new FakeMvcTextTemplateHostFactory(); fakeHostFactory = new FakeMvcTextTemplateHostFactory();
fakeHost = fakeHostFactory.FakeMvcTextTemplateHost; fakeHost = fakeHostFactory.FakeMvcTextTemplateHost;
fakeAppDomainFactory = new FakeMvcTextTemplateAppDomainFactory(); fakeAppDomainFactory = new FakeMvcTextTemplateAppDomainFactory();
generator = new MvcControllerFileGenerator(fakeHostFactory, fakeAppDomainFactory); fakeErrorReporter = MockRepository.GenerateStub<IMvcFileGenerationErrorReporter>();
generator = new MvcControllerFileGenerator(fakeHostFactory, fakeAppDomainFactory, fakeErrorReporter);
projectUsedByGenerator = new FakeMvcProject(); projectUsedByGenerator = new FakeMvcProject();
generator.Project = projectUsedByGenerator; generator.Project = projectUsedByGenerator;
ProjectPassedToGeneratorIsCSharpProject(); ProjectPassedToGeneratorIsCSharpProject();
@ -66,6 +70,11 @@ namespace AspNet.Mvc.Tests
}; };
} }
CompilerError AddCompilerErrorToTemplateHost()
{
return fakeHost.AddCompilerError();
}
[Test] [Test]
public void GenerateFile_CSharpControllerTemplate_MvcTextTemplateHostIsCreated() public void GenerateFile_CSharpControllerTemplate_MvcTextTemplateHostIsCreated()
{ {
@ -202,5 +211,64 @@ namespace AspNet.Mvc.Tests
Assert.AreEqual(expectedAppDomain, appDomain); 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);
}
[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<CompilerErrorCollection>.Is.Anything));
}
} }
} }

70
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs

@ -2,10 +2,12 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.CodeDom.Compiler;
using AspNet.Mvc.Tests.Helpers; using AspNet.Mvc.Tests.Helpers;
using ICSharpCode.AspNet.Mvc; using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework; using NUnit.Framework;
using Rhino.Mocks;
namespace AspNet.Mvc.Tests namespace AspNet.Mvc.Tests
{ {
@ -18,6 +20,7 @@ namespace AspNet.Mvc.Tests
FakeMvcTextTemplateHostFactory fakeHostFactory; FakeMvcTextTemplateHostFactory fakeHostFactory;
FakeMvcTextTemplateHost fakeHost; FakeMvcTextTemplateHost fakeHost;
FakeMvcTextTemplateAppDomainFactory fakeAppDomainFactory; FakeMvcTextTemplateAppDomainFactory fakeAppDomainFactory;
IMvcFileGenerationErrorReporter fakeErrorReporter;
void CreateTemplateRepository(string templateRootDirectory) void CreateTemplateRepository(string templateRootDirectory)
{ {
@ -35,7 +38,8 @@ namespace AspNet.Mvc.Tests
fakeHostFactory = new FakeMvcTextTemplateHostFactory(); fakeHostFactory = new FakeMvcTextTemplateHostFactory();
fakeHost = fakeHostFactory.FakeMvcTextTemplateHost; fakeHost = fakeHostFactory.FakeMvcTextTemplateHost;
fakeAppDomainFactory = new FakeMvcTextTemplateAppDomainFactory(); fakeAppDomainFactory = new FakeMvcTextTemplateAppDomainFactory();
generator = new MvcViewFileGenerator(fakeHostFactory, templateRepository, fakeAppDomainFactory); fakeErrorReporter = MockRepository.GenerateStub<IMvcFileGenerationErrorReporter>();
generator = new MvcViewFileGenerator(fakeHostFactory, templateRepository, fakeAppDomainFactory, fakeErrorReporter);
projectUsedByGenerator = new FakeMvcProject(); projectUsedByGenerator = new FakeMvcProject();
generator.Project = projectUsedByGenerator; generator.Project = projectUsedByGenerator;
ProjectPassedToGeneratorIsCSharpProject(); ProjectPassedToGeneratorIsCSharpProject();
@ -78,6 +82,11 @@ namespace AspNet.Mvc.Tests
}; };
} }
CompilerError AddCompilerErrorToTemplateHost()
{
return fakeHost.AddCompilerError();
}
[Test] [Test]
public void GenerateFile_CSharpEmptyViewTemplate_MvcTextTemplateHostIsCreated() public void GenerateFile_CSharpEmptyViewTemplate_MvcTextTemplateHostIsCreated()
{ {
@ -315,5 +324,64 @@ namespace AspNet.Mvc.Tests
Assert.AreEqual(String.Empty, assemblyLocation); 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);
}
[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<CompilerErrorCollection>.Is.Anything));
}
} }
} }

5
src/AddIns/BackendBindings/CSharpBinding/Project/Src/CodeManipulation.cs

@ -218,8 +218,7 @@ namespace CSharpBinding
var selectionStart = editor.Document.OffsetToPosition(editor.SelectionStart); var selectionStart = editor.Document.OffsetToPosition(editor.SelectionStart);
var selectionEnd = editor.Document.OffsetToPosition(editor.SelectionStart + editor.SelectionLength); var selectionEnd = editor.Document.OffsetToPosition(editor.SelectionStart + editor.SelectionLength);
Ast.INode currentNode = parsedCU.Children.Select( Ast.INode currentNode = parsedCU.Children.Select(n => EditorContext.FindInnermostNodeContainingSelection(n, selectionStart, selectionEnd)).FirstOrDefault(n => n != null);
n => EditorContext.FindInnermostNodeContainingSelection(n, selectionStart, selectionEnd)).Where(n => n != null).FirstOrDefault();
if (currentNode == null) return null; if (currentNode == null) return null;
if (!IsNodeTypeInteresting(currentNode, interestingNodeTypes)) { if (!IsNodeTypeInteresting(currentNode, interestingNodeTypes)) {
// ignore uninteresting nodes in the AST // ignore uninteresting nodes in the AST
@ -305,7 +304,7 @@ namespace CSharpBinding
/// </summary> /// </summary>
Selection ExtendSelectionToEndOfLineComments(IDocument document, Location selectionStart, Location selectionEnd, IEnumerable<Comment> commentsBlankLines) Selection ExtendSelectionToEndOfLineComments(IDocument document, Location selectionStart, Location selectionEnd, IEnumerable<Comment> 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) { if (lineComment == null) {
return null; return null;
} }

3
src/AddIns/BackendBindings/CppBinding/CppBinding/Project/ResourceScript.cs

@ -48,8 +48,7 @@ namespace ICSharpCode.CppBinding.Project
} }
public void SetIcon(string resourceId, string newPath) { public void SetIcon(string resourceId, string newPath) {
ResourceIcon iconEntry = (ResourceIcon)Icons.Where( ResourceIcon iconEntry = (ResourceIcon)Icons.SingleOrDefault(icon => icon.ResourceID == resourceId);
icon => icon.ResourceID == resourceId).SingleOrDefault();
if (iconEntry != null) if (iconEntry != null)
iconEntry.Data = newPath; iconEntry.Data = newPath;
else else

8
src/AddIns/BackendBindings/Scripting/Project/Src/ConsoleTextEditorKeyEventArgs.cs

@ -11,16 +11,22 @@ namespace ICSharpCode.Scripting
public abstract class ConsoleTextEditorKeyEventArgs : EventArgs public abstract class ConsoleTextEditorKeyEventArgs : EventArgs
{ {
Key key; Key key;
ModifierKeys modifiers;
public ConsoleTextEditorKeyEventArgs(Key key) public ConsoleTextEditorKeyEventArgs(Key key, ModifierKeys modifiers)
{ {
this.key = key; this.key = key;
this.modifiers = modifiers;
} }
public Key Key { public Key Key {
get { return key; } get { return key; }
} }
public ModifierKeys Modifiers {
get { return modifiers; }
}
public abstract bool Handled { public abstract bool Handled {
get; set; get; set;
} }

8
src/AddIns/BackendBindings/Scripting/Project/Src/ScriptingConsole.cs

@ -136,11 +136,10 @@ namespace ICSharpCode.Scripting
/// </summary> /// </summary>
void ProcessPreviewKeyDown(object source, ConsoleTextEditorKeyEventArgs e) void ProcessPreviewKeyDown(object source, ConsoleTextEditorKeyEventArgs e)
{ {
Key keyPressed = e.Key; e.Handled = HandleKeyDown(e.Key, e.Modifiers);
e.Handled = HandleKeyDown(keyPressed);
} }
bool HandleKeyDown(Key keyPressed) bool HandleKeyDown(Key keyPressed, ModifierKeys keyModifiers)
{ {
if (textEditor.IsCompletionWindowDisplayed) { if (textEditor.IsCompletionWindowDisplayed) {
return false; return false;
@ -153,6 +152,9 @@ namespace ICSharpCode.Scripting
case Key.Up: case Key.Up:
case Key.Down: case Key.Down:
return false; return false;
case Key.C:
case Key.A:
return keyModifiers != ModifierKeys.Control;
default: default:
return true; return true;
} }

2
src/AddIns/BackendBindings/Scripting/Project/Src/ScriptingConsoleTextEditorKeyEventArgs.cs

@ -11,7 +11,7 @@ namespace ICSharpCode.Scripting
KeyEventArgs e; KeyEventArgs e;
public ScriptingConsoleTextEditorKeyEventArgs(KeyEventArgs e) public ScriptingConsoleTextEditorKeyEventArgs(KeyEventArgs e)
: base(e.Key) : base(e.Key, e.KeyboardDevice.Modifiers)
{ {
this.e = e; this.e = e;
} }

18
src/AddIns/BackendBindings/Scripting/Test/Console/ScriptingConsoleReadOnlyRegionsTests.cs

@ -155,5 +155,23 @@ namespace ICSharpCode.Scripting.Tests.Console
Assert.AreEqual(String.Empty, TestableScriptingConsole.GetCurrentLine()); 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);
}
[Test]
public void PreviewKeyDown_ControlAInReadOnlyRegion_HandledSetToFalseSoSelectAllInReadOnlyRegionAllowed()
{
FakeConsoleTextEditor.RaisePreviewKeyDownEventForDialogKey(Key.Left);
bool result = FakeConsoleTextEditor.RaisePreviewKeyDownEvent(Key.A, ModifierKeys.Control);
Assert.IsFalse(result);
}
} }
} }

10
src/AddIns/BackendBindings/Scripting/Test/Utils/FakeConsoleTextEditor.cs

@ -28,14 +28,14 @@ namespace ICSharpCode.Scripting.Tests.Utils
public StringBuilder PreviousLines = new StringBuilder(); public StringBuilder PreviousLines = new StringBuilder();
public StringBuilder LineBuilder = new StringBuilder(); public StringBuilder LineBuilder = new StringBuilder();
public event ConsoleTextEditorKeyEventHandler PreviewKeyDown; public event ConsoleTextEditorKeyEventHandler PreviewKeyDown;
public FakeConsoleTextEditor() public FakeConsoleTextEditor()
{ {
TotalLines = 1; TotalLines = 1;
} }
public void Dispose() public void Dispose()
{ {
IsDisposed = true; 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); OnPreviewKeyDown(e);
if (!e.Handled) { if (!e.Handled) {
KeyConverter converter = new KeyConverter(); KeyConverter converter = new KeyConverter();
@ -174,7 +174,7 @@ namespace ICSharpCode.Scripting.Tests.Utils
IsCompletionWindowDisplayed = true; IsCompletionWindowDisplayed = true;
this.CompletionProviderPassedToShowCompletionWindow = completionDataProvider; this.CompletionProviderPassedToShowCompletionWindow = completionDataProvider;
} }
public void MakeCurrentContentReadOnly() public void MakeCurrentContentReadOnly()
{ {
IsMakeCurrentContentReadOnlyCalled = true; IsMakeCurrentContentReadOnlyCalled = true;

4
src/AddIns/BackendBindings/Scripting/Test/Utils/FakeConsoleTextEditorKeyEventArgs.cs

@ -11,8 +11,8 @@ namespace ICSharpCode.Scripting.Tests.Utils
{ {
bool handled; bool handled;
public FakeConsoleTextEditorKeyEventArgs(Key key) public FakeConsoleTextEditorKeyEventArgs(Key key, ModifierKeys modifiers = ModifierKeys.None)
: base(key) : base(key, modifiers)
{ {
} }

2
src/AddIns/BackendBindings/WixBinding/Project/Src/WixDialog.cs

@ -157,7 +157,7 @@ namespace ICSharpCode.WixBinding
public Form CreateDialog(IComponentCreator componentCreator) public Form CreateDialog(IComponentCreator componentCreator)
{ {
if (componentCreator == null) { if (componentCreator == null) {
throw new ArgumentException("Cannot be null.", "componentCreator"); throw new ArgumentNullException("componentCreator");
} }
Form dialog = CreateForm(componentCreator); Form dialog = CreateForm(componentCreator);

18
src/AddIns/BackendBindings/XamlBinding/XamlBinding/CompletionDataHelper.cs

@ -1021,7 +1021,7 @@ namespace ICSharpCode.XamlBinding
static IEnumerable<ICompletionItem> CreateEventCompletion(XamlCompletionContext context, IClass c) static IEnumerable<ICompletionItem> 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) { if (invoker != null && context.ActiveElement != null) {
var item = context.ActiveElement; var item = context.ActiveElement;
var evt = ResolveAttribute(context.Attribute.ToQualifiedName(), context) as IEvent; 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); string eventName = field.Name.Remove(field.Name.Length - "Event".Length);
IMethod method = c.Methods IMethod method = c.Methods.FirstOrDefault(m => m.IsPublic && m.IsStatic && m.Parameters.Count == 2 && (m.Name == "Add" + eventName + "Handler" || m.Name == "Remove" + eventName + "Handler"));
.Where(m =>
m.IsPublic &&
m.IsStatic &&
m.Parameters.Count == 2 &&
(m.Name == "Add" + eventName + "Handler" ||
m.Name == "Remove" + eventName + "Handler"))
.FirstOrDefault();
if (method == null) if (method == null)
return null; return null;
@ -1346,12 +1339,7 @@ namespace ICSharpCode.XamlBinding
string propertyName = field.Name.Remove(field.Name.Length - "Property".Length); string propertyName = field.Name.Remove(field.Name.Length - "Property".Length);
IMethod method = c.Methods IMethod method = c.Methods.FirstOrDefault(m => m.IsPublic && m.IsStatic && m.Name == "Get" + propertyName);
.Where(m =>
m.IsPublic &&
m.IsStatic &&
m.Name == "Get" + propertyName)
.FirstOrDefault();
if (method == null) if (method == null)
return null; return null;

2
src/AddIns/Debugger/Debugger.AddIn/Visualizers/PresentationBindings/GridViewColumnHider.cs

@ -91,7 +91,7 @@ namespace Debugger.AddIn.Visualizers
private GridViewColumnWithVisibility findColumn(string header) private GridViewColumnWithVisibility findColumn(string header)
{ {
return allColumns.Where(columnVis => columnVis.Header == header).First(); return allColumns.First(columnVis => columnVis.Header == header);
} }
void hideColumn(string header) void hideColumn(string header)

2
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Table.cs

@ -79,7 +79,7 @@ namespace ICSharpCode.Data.Core.DatabaseObjects
{ {
get get
{ {
if (Items.Where(column => column.IsPrimaryKey).Count() > 1) if (Items.Count(column => column.IsPrimaryKey) > 1)
return true; return true;
else else
return false; return false;

2
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<UIRelatedProperty>().Where(uirp => uirp.RelatedType == UIType && !RelationsContenerByRelatedProperty.ContainsKey(uirp))) foreach (var relatedProperty in Designer.DesignerView.SelectMany(dv => dv.UIType.Properties).OfType<UIRelatedProperty>().Where(uirp => uirp.RelatedType == UIType && !RelationsContenerByRelatedProperty.ContainsKey(uirp)))
{ {
var otherType = Designer.Children.OfType<TypeBaseDesigner>().Where(td => td.UIType.Properties.Contains(relatedProperty)).FirstOrDefault(); var otherType = Designer.Children.OfType<TypeBaseDesigner>().FirstOrDefault(td => td.UIType.Properties.Contains(relatedProperty));
if (otherType != null) if (otherType != null)
otherType.DrawRelation(relatedProperty); otherType.DrawRelation(relatedProperty);
} }

2
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/DesignerCanvasPreview.cs

@ -93,7 +93,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.UserControls
get get
{ {
if (_typebaseDesignerListView == null) if (_typebaseDesignerListView == null)
_typebaseDesignerListView = VisualTreeHelperUtil.GetControlsDecendant<ListView>(Content.Children.OfType<TypeBaseDesigner>().Where(tbd => tbd.UIType.BusinessInstance == UIType.BusinessInstance).First()).First(); _typebaseDesignerListView = VisualTreeHelperUtil.GetControlsDecendant<ListView>(Content.Children.OfType<TypeBaseDesigner>().First(tbd => tbd.UIType.BusinessInstance == UIType.BusinessInstance)).First();
return _typebaseDesignerListView; return _typebaseDesignerListView;
} }
} }

2
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) private void _navigationProperties_ItemRemoved(NavigationProperty navigationProperty)
{ {
_navigationProperties.ItemRemoved -= _navigationProperties_ItemRemoved; _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) if (!navigationProperty2.IsDeleted)
navigationProperty2.EntityType.NavigationProperties.Remove(navigationProperty2); navigationProperty2.EntityType.NavigationProperties.Remove(navigationProperty2);
_navigationProperties.ItemRemoved += _navigationProperties_ItemRemoved; _navigationProperties.ItemRemoved += _navigationProperties_ItemRemoved;

4
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 }; var entityType = new EntityType { Name = typeName, BaseType = baseType };
SetBoolValueFromAttribute(entityTypeElement, "Abstract", isAbstract => entityType.Abstract = isAbstract); 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) if (entitySetElement != null)
{ {
entityType.EntitySetName = entitySetElement.Attribute("Name").Value; entityType.EntitySetName = entitySetElement.Attribute("Name").Value;
@ -149,7 +149,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO
} }
else 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; var scalarProp = (ScalarProperty)property;
SetBoolValueFromAttribute(propertyElement, "Nullable", nullable => scalarProp.Nullable = nullable); SetBoolValueFromAttribute(propertyElement, "Nullable", nullable => scalarProp.Nullable = nullable);
SetVisibilityValueFromAttribute(propertyElement, "SetterAccess", setterAccess => scalarProp.SetVisibility = setterAccess); SetVisibilityValueFromAttribute(propertyElement, "SetterAccess", setterAccess => scalarProp.SetVisibility = setterAccess);

2
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))) foreach (var propertyElement in entityTypeElement.Elements(XName.Get("Property", ssdlNamespace.NamespaceName)))
{ {
var name = propertyElement.Attribute("Name").Value; 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); SetBoolValueFromAttribute(propertyElement, "Nullable", nullable => property.Nullable = nullable);
SetIntValueFromAttribute(propertyElement, "MaxLength", maxLength => property.MaxLength = maxLength); SetIntValueFromAttribute(propertyElement, "MaxLength", maxLength => property.MaxLength = maxLength);
SetBoolValueFromAttribute(propertyElement, "FixedLength", fixedLength => property.FixedLength = fixedLength); SetBoolValueFromAttribute(propertyElement, "FixedLength", fixedLength => property.FixedLength = fixedLength);

5
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs

@ -179,7 +179,7 @@ namespace ICSharpCode.WpfDesign.AddIn
if (!propertyGridView.PropertyGrid.IsNameCorrect) return; if (!propertyGridView.PropertyGrid.IsNameCorrect) return;
// get the XAML file // 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; if (fileName == null) return;
// parse the XAML file // parse the XAML file
@ -188,8 +188,7 @@ namespace ICSharpCode.WpfDesign.AddIn
if (info.CompilationUnit.Classes.Count != 1) return; if (info.CompilationUnit.Classes.Count != 1) return;
// rename the member // rename the member
IMember member = info.CompilationUnit.Classes[0].AllMembers IMember member = info.CompilationUnit.Classes [0].AllMembers.FirstOrDefault(m => m.Name == propertyGridView.PropertyGrid.OldName);
.Where(m => m.Name == propertyGridView.PropertyGrid.OldName).FirstOrDefault();
if (member != null) { if (member != null) {
FindReferencesAndRenameHelper.RenameMember(member, propertyGridView.PropertyGrid.Name); FindReferencesAndRenameHelper.RenameMember(member, propertyGridView.PropertyGrid.Name);
} }

2
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) protected override void OnMouseRightButtonUp(MouseButtonEventArgs e)
{ {
var ancestors = (e.OriginalSource as DependencyObject).GetVisualAncestors(); var ancestors = (e.OriginalSource as DependencyObject).GetVisualAncestors();
Border row = ancestors.OfType<Border>().Where(b => b.Name == "uxPropertyNodeRow").FirstOrDefault(); Border row = ancestors.OfType<Border>().FirstOrDefault(b => b.Name == "uxPropertyNodeRow");
if (row == null) return; if (row == null) return;
PropertyNode node = row.DataContext as PropertyNode; PropertyNode node = row.DataContext as PropertyNode;

56
src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeSettings.cs

@ -12,6 +12,9 @@ namespace ICSharpCode.PackageManagement.Design
public List<KeyValuePair<string, string>> PackageSources public List<KeyValuePair<string, string>> PackageSources
= new List<KeyValuePair<string, string>>(); = new List<KeyValuePair<string, string>>();
public List<KeyValuePair<string, string>> DisabledPackageSources
= new List<KeyValuePair<string, string>>();
public List<KeyValuePair<string, string>> ActivePackageSourceSettings = public List<KeyValuePair<string, string>> ActivePackageSourceSettings =
new List<KeyValuePair<string, string>>(); new List<KeyValuePair<string, string>>();
@ -22,11 +25,21 @@ namespace ICSharpCode.PackageManagement.Design
{ {
Sections.Add(RegisteredPackageSourceSettings.PackageSourcesSectionName, PackageSources); Sections.Add(RegisteredPackageSourceSettings.PackageSourcesSectionName, PackageSources);
Sections.Add(RegisteredPackageSourceSettings.ActivePackageSourceSectionName, ActivePackageSourceSettings); Sections.Add(RegisteredPackageSourceSettings.ActivePackageSourceSectionName, ActivePackageSourceSettings);
Sections.Add(RegisteredPackageSourceSettings.DisabledPackageSourceSectionName, DisabledPackageSources);
} }
public string GetValue(string section, string key) public string GetValue(string section, string key)
{ {
throw new NotImplementedException(); if (!Sections.ContainsKey(section))
return null;
IList<KeyValuePair<string, string>> values = Sections[section];
foreach (KeyValuePair<string, string> keyPair in values) {
if (keyPair.Key == key) {
return keyPair.Value;
}
}
return null;
} }
public IList<KeyValuePair<string, string>> GetValues(string section) public IList<KeyValuePair<string, string>> GetValues(string section)
@ -87,6 +100,12 @@ namespace ICSharpCode.PackageManagement.Design
} }
} }
public bool IsDisabledPackageSourcesSectionDeleted {
get {
return SectionsDeleted.Contains(RegisteredPackageSourceSettings.DisabledPackageSourceSectionName);
}
}
public bool IsActivePackageSourceSectionDeleted { public bool IsActivePackageSourceSectionDeleted {
get { get {
return SectionsDeleted.Contains(RegisteredPackageSourceSettings.ActivePackageSourceSectionName); return SectionsDeleted.Contains(RegisteredPackageSourceSettings.ActivePackageSourceSectionName);
@ -128,5 +147,40 @@ namespace ICSharpCode.PackageManagement.Design
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
public void AddDisabledPackageSource(PackageSource packageSource)
{
var valuePair = new KeyValuePair<string, string>(packageSource.Name, packageSource.Source);
DisabledPackageSources.Add(valuePair);
}
public IList<KeyValuePair<string, string>> GetValuesPassedToSetValuesForDisabledPackageSourcesSection()
{
return SavedSectionValueLists[RegisteredPackageSourceSettings.DisabledPackageSourceSectionName];
}
public bool AnyValuesPassedToSetValuesForDisabledPackageSourcesSection {
get {
return SavedSectionValueLists.ContainsKey(RegisteredPackageSourceSettings.DisabledPackageSourceSectionName);
}
}
public void SetPackageRestoreSetting(bool enabled)
{
var items = new List<KeyValuePair<string, string>>();
items.Add(new KeyValuePair<string, string>("enabled", enabled.ToString()));
Sections.Add("packageRestore", items);
}
public KeyValuePair<string, string> GetValuePassedToSetValueForPackageRestoreSection()
{
return SavedSectionValues["packageRestore"];
}
public bool IsPackageRestoreSectionDeleted {
get {
return SectionsDeleted.Contains("packageRestore");
}
}
} }
} }

7
src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptions.cs

@ -18,11 +18,13 @@ namespace ICSharpCode.PackageManagement
RegisteredPackageSourceSettings registeredPackageSourceSettings; RegisteredPackageSourceSettings registeredPackageSourceSettings;
Properties properties; Properties properties;
List<RecentPackageInfo> recentPackages; List<RecentPackageInfo> recentPackages;
PackageRestoreConsent packageRestoreConsent;
public PackageManagementOptions(Properties properties, ISettings settings) public PackageManagementOptions(Properties properties, ISettings settings)
{ {
this.properties = properties; this.properties = properties;
registeredPackageSourceSettings = new RegisteredPackageSourceSettings(settings); registeredPackageSourceSettings = new RegisteredPackageSourceSettings(settings);
packageRestoreConsent = new PackageRestoreConsent(settings);
} }
public PackageManagementOptions(Properties properties) 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 { public RegisteredPackageSources PackageSources {
get { return registeredPackageSourceSettings.PackageSources; } get { return registeredPackageSourceSettings.PackageSources; }
} }

27
src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptionsView.xaml

@ -5,19 +5,20 @@
xmlns:pm="clr-namespace:ICSharpCode.PackageManagement" xmlns:pm="clr-namespace:ICSharpCode.PackageManagement"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<gui:OptionPanel.Resources>
<pm:PackageManagementViewModels x:Key="ViewModels"/>
<BooleanToVisibilityConverter x:Key="BoolToVisibility"/>
</gui:OptionPanel.Resources>
<gui:OptionPanel.DataContext>
<Binding Source="{StaticResource ViewModels}" Path="PackageManagementOptionsViewModel"/>
</gui:OptionPanel.DataContext>
<Grid> <Grid>
<Grid.Resources>
<pm:PackageManagementViewModels x:Key="ViewModels"/>
<BooleanToVisibilityConverter x:Key="BoolToVisibility"/>
</Grid.Resources>
<Grid.DataContext>
<Binding Source="{StaticResource ViewModels}" Path="PackageManagementOptionsViewModel"/>
</Grid.DataContext>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<GroupBox <GroupBox
@ -55,5 +56,13 @@
Text="No cached packages"/> Text="No cached packages"/>
</StackPanel> </StackPanel>
</GroupBox> </GroupBox>
<GroupBox
Grid.Row="2"
Header="R_estore Packages">
<CheckBox
Margin="4, 4"
IsChecked="{Binding Path=IsPackageRestoreEnabled}"
Content="Enable package restore"/>
</GroupBox>
</Grid> </Grid>
</gui:OptionPanel> </gui:OptionPanel>

7
src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptionsView.xaml.cs

@ -12,5 +12,12 @@ namespace ICSharpCode.PackageManagement
{ {
InitializeComponent(); InitializeComponent();
} }
public override bool SaveOptions()
{
var viewModel = DataContext as PackageManagementOptionsViewModel;
viewModel.SaveOptions();
return true;
}
} }
} }

12
src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptionsViewModel.cs

@ -9,32 +9,37 @@ namespace ICSharpCode.PackageManagement
{ {
public class PackageManagementOptionsViewModel : ViewModelBase<PackageManagementOptionsViewModel> public class PackageManagementOptionsViewModel : ViewModelBase<PackageManagementOptionsViewModel>
{ {
PackageManagementOptions options;
IRecentPackageRepository recentPackageRepository; IRecentPackageRepository recentPackageRepository;
IMachinePackageCache machinePackageCache; IMachinePackageCache machinePackageCache;
IProcess process; IProcess process;
public PackageManagementOptionsViewModel(IRecentPackageRepository recentPackageRepository) public PackageManagementOptionsViewModel(IRecentPackageRepository recentPackageRepository)
: this(recentPackageRepository, new MachinePackageCache(), new Process()) : this(PackageManagementServices.Options, recentPackageRepository, new MachinePackageCache(), new Process())
{ {
} }
public PackageManagementOptionsViewModel( public PackageManagementOptionsViewModel(
PackageManagementOptions options,
IRecentPackageRepository recentPackageRepository, IRecentPackageRepository recentPackageRepository,
IMachinePackageCache machinePackageCache, IMachinePackageCache machinePackageCache,
IProcess process) IProcess process)
{ {
this.options = options;
this.recentPackageRepository = recentPackageRepository; this.recentPackageRepository = recentPackageRepository;
this.machinePackageCache = machinePackageCache; this.machinePackageCache = machinePackageCache;
this.process = process; this.process = process;
this.HasNoRecentPackages = !RecentPackageRepositoryHasPackages(); this.HasNoRecentPackages = !RecentPackageRepositoryHasPackages();
this.HasNoCachedPackages = !MachinePackageCacheHasPackages(); this.HasNoCachedPackages = !MachinePackageCacheHasPackages();
this.IsPackageRestoreEnabled = options.IsPackageRestoreEnabled;
CreateCommands(); CreateCommands();
} }
public bool HasNoRecentPackages { get; private set; } public bool HasNoRecentPackages { get; private set; }
public bool HasNoCachedPackages { get; private set; } public bool HasNoCachedPackages { get; private set; }
public bool IsPackageRestoreEnabled { get; set; }
bool MachinePackageCacheHasPackages() bool MachinePackageCacheHasPackages()
{ {
@ -78,5 +83,10 @@ namespace ICSharpCode.PackageManagement
{ {
process.Start(machinePackageCache.Source); process.Start(machinePackageCache.Source);
} }
public void SaveOptions()
{
options.IsPackageRestoreEnabled = IsPackageRestoreEnabled;
}
} }
} }

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

@ -29,5 +29,10 @@ namespace ICSharpCode.PackageManagement
get { return packageSource.Source; } get { return packageSource.Source; }
set { packageSource.Source = value; } set { packageSource.Source = value; }
} }
public bool IsEnabled {
get { return packageSource.IsEnabled; }
set { packageSource.IsEnabled = value; }
}
} }
} }

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

@ -342,7 +342,7 @@ namespace ICSharpCode.PackageManagement
public IEnumerable<PackageSource> PackageSources { public IEnumerable<PackageSource> PackageSources {
get { get {
foreach (PackageSource packageSource in registeredPackageRepositories.PackageSources) { foreach (PackageSource packageSource in registeredPackageRepositories.PackageSources.GetEnabledPackageSources()) {
yield return packageSource; yield return packageSource;
} }
if (registeredPackageRepositories.PackageSources.HasMultiplePackageSources) { if (registeredPackageRepositories.PackageSources.HasMultiplePackageSources) {

10
src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSource.cs

@ -10,26 +10,22 @@ namespace ICSharpCode.PackageManagement
{ {
public string Source { get; set; } public string Source { get; set; }
public string Name { get; set; } public string Name { get; set; }
public bool IsEnabled { get; set; }
public RegisteredPackageSource() public RegisteredPackageSource()
{ {
} }
public RegisteredPackageSource(string name, string source)
{
this.Name = name;
this.Source = source;
}
public RegisteredPackageSource(PackageSource packageSource) public RegisteredPackageSource(PackageSource packageSource)
{ {
Source = packageSource.Source; Source = packageSource.Source;
Name = packageSource.Name; Name = packageSource.Name;
IsEnabled = packageSource.IsEnabled;
} }
public PackageSource ToPackageSource() public PackageSource ToPackageSource()
{ {
return new PackageSource(Source, Name); return new PackageSource(Source, Name, IsEnabled);
} }
} }
} }

34
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 PackageSourcesSectionName = "packageSources";
public static readonly string ActivePackageSourceSectionName = "activePackageSource"; public static readonly string ActivePackageSourceSectionName = "activePackageSource";
public static readonly string DisabledPackageSourceSectionName = "disabledPackageSources";
public static readonly PackageSource AggregatePackageSource = public static readonly PackageSource AggregatePackageSource =
new PackageSource("(Aggregate source)", "All"); new PackageSource("(Aggregate source)", "All");
@ -64,7 +65,16 @@ namespace ICSharpCode.PackageManagement
IEnumerable<PackageSource> GetPackageSourcesFromSettings() IEnumerable<PackageSource> GetPackageSourcesFromSettings()
{ {
IList<KeyValuePair<string, string>> savedPackageSources = settings.GetValues(PackageSourcesSectionName); IList<KeyValuePair<string, string>> 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) void PackageSourcesChanged(object sender, NotifyCollectionChangedEventArgs e)
@ -74,8 +84,10 @@ namespace ICSharpCode.PackageManagement
void UpdatePackageSourceSettingsWithChanges() void UpdatePackageSourceSettingsWithChanges()
{ {
var newPackageSourceSettings = GetSettingsFromPackageSources(); IList<KeyValuePair<string, string>> newPackageSourceSettings = GetSettingsFromPackageSources();
SavePackageSourceSettings(newPackageSourceSettings); SavePackageSourceSettings(newPackageSourceSettings);
IList<KeyValuePair<string, string>> disabledPackageSourceSettings = GetSettingsForDisabledPackageSources();
SaveDisabledPackageSourceSettings(disabledPackageSourceSettings);
} }
IList<KeyValuePair<string, string>> GetSettingsFromPackageSources() IList<KeyValuePair<string, string>> GetSettingsFromPackageSources()
@ -94,6 +106,22 @@ namespace ICSharpCode.PackageManagement
settings.SetValues(PackageSourcesSectionName, newPackageSourceSettings); settings.SetValues(PackageSourcesSectionName, newPackageSourceSettings);
} }
IList<KeyValuePair<string, string>> GetSettingsForDisabledPackageSources()
{
return packageSources
.Where(source => !source.IsEnabled)
.Select(source => new KeyValuePair<string, string>(source.Name, "true"))
.ToList();
}
void SaveDisabledPackageSourceSettings(IList<KeyValuePair<string, string>> disabledPackageSourceSettings)
{
settings.DeleteSection(DisabledPackageSourceSectionName);
if (disabledPackageSourceSettings.Any()) {
settings.SetValues(DisabledPackageSourceSectionName, disabledPackageSourceSettings);
}
}
public PackageSource ActivePackageSource { public PackageSource ActivePackageSource {
get { get {
if (activePackageSource != null) { if (activePackageSource != null) {
@ -125,7 +153,7 @@ namespace ICSharpCode.PackageManagement
{ {
RemoveActivePackageSourceSetting(); RemoveActivePackageSourceSetting();
var activePackageSourceSetting = PackageSourceConverter.ConvertToKeyValuePair(activePackageSource); KeyValuePair<string, string> activePackageSourceSetting = PackageSourceConverter.ConvertToKeyValuePair(activePackageSource);
SaveActivePackageSourceSetting(activePackageSourceSetting); SaveActivePackageSourceSetting(activePackageSourceSetting);
} }

9
src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSources.cs

@ -4,14 +4,14 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Linq;
using NuGet; using NuGet;
namespace ICSharpCode.PackageManagement namespace ICSharpCode.PackageManagement
{ {
public class RegisteredPackageSources : ObservableCollection<PackageSource> public class RegisteredPackageSources : ObservableCollection<PackageSource>
{ {
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 string DefaultPackageSourceName = "NuGet Official Package Source";
public static readonly PackageSource DefaultPackageSource = public static readonly PackageSource DefaultPackageSource =
@ -51,5 +51,10 @@ namespace ICSharpCode.PackageManagement
public bool HasMultiplePackageSources { public bool HasMultiplePackageSources {
get { return Count > 1; } get { return Count > 1; }
} }
public IEnumerable<PackageSource> GetEnabledPackageSources()
{
return this.Where(packageSource => packageSource.IsEnabled);
}
} }
} }

4
src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourcesUserControl.xaml

@ -41,7 +41,9 @@
<StackPanel <StackPanel
x:Name="PackageSourceStackPanel" x:Name="PackageSourceStackPanel"
Margin="4"> Margin="4">
<TextBlock Text="{Binding Path=Name}"/> <CheckBox
Content="{Binding Path=Name}"
IsChecked="{Binding Path=IsEnabled}"/>
<TextBlock> <TextBlock>
<Hyperlink> <Hyperlink>
<TextBlock Text="{Binding Path=SourceUrl}"/> <TextBlock Text="{Binding Path=SourceUrl}"/>

6
src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleViewModel.cs

@ -82,14 +82,14 @@ namespace ICSharpCode.PackageManagement.Scripting
void UpdatePackageSourceViewModels() void UpdatePackageSourceViewModels()
{ {
packageSources.Clear(); packageSources.Clear();
AddRegisteredPackageSourceViewModels(); AddEnabledPackageSourceViewModels();
AddAggregatePackageSourceViewModelIfMoreThanOnePackageSourceViewModelAdded(); AddAggregatePackageSourceViewModelIfMoreThanOnePackageSourceViewModelAdded();
SelectActivePackageSource(); SelectActivePackageSource();
} }
void AddRegisteredPackageSourceViewModels() void AddEnabledPackageSourceViewModels()
{ {
foreach (PackageSource packageSource in registeredPackageSources) { foreach (PackageSource packageSource in registeredPackageSources.GetEnabledPackageSources()) {
AddPackageSourceViewModel(packageSource); AddPackageSourceViewModel(packageSource);
} }
} }

26
src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs

@ -76,6 +76,17 @@ namespace PackageManagement.Tests
registeredPackageRepositories.AddPackageSources(sources); 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() void CreateNewActiveRepositoryWithDifferentPackages()
{ {
var package = new FakePackage("NewRepositoryPackageId"); var package = new FakePackage("NewRepositoryPackageId");
@ -429,5 +440,20 @@ namespace PackageManagement.Tests
}; };
PackageCollectionAssert.AreEqual(expectedPackages, allPackages); PackageCollectionAssert.AreEqual(expectedPackages, allPackages);
} }
[Test]
public void PackageSources_TwoPackageSourcesButFirstIsDisabled_DoesNotReturnDisabledPackageSource()
{
CreateRegisteredPackageRepositories();
AddTwoPackageSourcesToRegisteredSourcesWithFirstOneDisabled();
CreateViewModel(registeredPackageRepositories);
IEnumerable<PackageSource> packageSources = viewModel.PackageSources;
bool containsDisabledPackageSource = packageSources.Contains(registeredPackageRepositories.PackageSources[0]);
bool containsEnabledPackageSource = packageSources.Contains(registeredPackageRepositories.PackageSources[1]);
Assert.IsFalse(containsDisabledPackageSource);
Assert.IsTrue(containsEnabledPackageSource);
}
} }
} }

159
src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsTests.cs

@ -72,6 +72,11 @@ namespace PackageManagement.Tests
return recentPackage; return recentPackage;
} }
void EnablePackageRestoreInSettings()
{
fakeSettings.SetPackageRestoreSetting(true);
}
[Test] [Test]
public void PackageSources_OnePackageSourceInSettings_ContainsSinglePackageSourceFromSettings() public void PackageSources_OnePackageSourceInSettings_ContainsSinglePackageSourceFromSettings()
{ {
@ -80,7 +85,7 @@ namespace PackageManagement.Tests
fakeSettings.AddFakePackageSource(packageSource); fakeSettings.AddFakePackageSource(packageSource);
CreateOptions(fakeSettings); CreateOptions(fakeSettings);
var actualSources = options.PackageSources; RegisteredPackageSources actualSources = options.PackageSources;
List<PackageSource> expectedSources = new List<PackageSource>(); List<PackageSource> expectedSources = new List<PackageSource>();
expectedSources.Add(packageSource); expectedSources.Add(packageSource);
@ -97,7 +102,7 @@ namespace PackageManagement.Tests
List<PackageSource> expectedSources = new List<PackageSource>(); List<PackageSource> expectedSources = new List<PackageSource>();
expectedSources.Add(RegisteredPackageSources.DefaultPackageSource); expectedSources.Add(RegisteredPackageSources.DefaultPackageSource);
var actualPackageSources = options.PackageSources; RegisteredPackageSources actualPackageSources = options.PackageSources;
CollectionAssert.AreEqual(expectedSources, actualPackageSources); CollectionAssert.AreEqual(expectedSources, actualPackageSources);
} }
@ -108,16 +113,16 @@ namespace PackageManagement.Tests
CreateSettings(); CreateSettings();
CreateOptions(fakeSettings); CreateOptions(fakeSettings);
var packageSources = options.PackageSources; RegisteredPackageSources packageSources = options.PackageSources;
var defaultSource = RegisteredPackageSources.DefaultPackageSource; PackageSource defaultSource = RegisteredPackageSources.DefaultPackageSource;
var expectedSavedPackageSourceSettings = new List<KeyValuePair<string, string>>(); var expectedSavedPackageSourceSettings = new List<KeyValuePair<string, string>>();
string name = defaultSource.Name; string name = defaultSource.Name;
string sourceUrl = defaultSource.Source; string sourceUrl = defaultSource.Source;
expectedSavedPackageSourceSettings.Add(new KeyValuePair<string, string>(name, sourceUrl)); expectedSavedPackageSourceSettings.Add(new KeyValuePair<string, string>(name, sourceUrl));
var actualSavedPackageSourceSettings = fakeSettings.GetValuesPassedToSetValuesForPackageSourcesSection(); IList<KeyValuePair<string, string>> actualSavedPackageSourceSettings = fakeSettings.GetValuesPassedToSetValuesForPackageSourcesSection();
Assert.AreEqual(expectedSavedPackageSourceSettings, actualSavedPackageSourceSettings); Assert.AreEqual(expectedSavedPackageSourceSettings, actualSavedPackageSourceSettings);
} }
@ -127,7 +132,7 @@ namespace PackageManagement.Tests
{ {
CreateSettings(); CreateSettings();
CreateOptions(fakeSettings); CreateOptions(fakeSettings);
var registeredPackageSources = options.PackageSources; RegisteredPackageSources registeredPackageSources = options.PackageSources;
var packageSource = new PackageSource("http://codeplex.com", "Test"); var packageSource = new PackageSource("http://codeplex.com", "Test");
registeredPackageSources.Clear(); registeredPackageSources.Clear();
@ -136,7 +141,7 @@ namespace PackageManagement.Tests
var expectedSavedPackageSourceSettings = new List<KeyValuePair<string, string>>(); var expectedSavedPackageSourceSettings = new List<KeyValuePair<string, string>>();
expectedSavedPackageSourceSettings.Add(new KeyValuePair<string, string>("Test", "http://codeplex.com")); expectedSavedPackageSourceSettings.Add(new KeyValuePair<string, string>("Test", "http://codeplex.com"));
var actualSavedPackageSourceSettings = fakeSettings.GetValuesPassedToSetValuesForPackageSourcesSection(); IList<KeyValuePair<string, string>> actualSavedPackageSourceSettings = fakeSettings.GetValuesPassedToSetValuesForPackageSourcesSection();
Assert.AreEqual(expectedSavedPackageSourceSettings, actualSavedPackageSourceSettings); Assert.AreEqual(expectedSavedPackageSourceSettings, actualSavedPackageSourceSettings);
} }
@ -146,7 +151,7 @@ namespace PackageManagement.Tests
{ {
CreateSettings(); CreateSettings();
CreateOptions(fakeSettings); CreateOptions(fakeSettings);
var registeredPackageSources = options.PackageSources; RegisteredPackageSources registeredPackageSources = options.PackageSources;
var packageSource = new PackageSource("http://codeplex.com", "Test"); var packageSource = new PackageSource("http://codeplex.com", "Test");
registeredPackageSources.Clear(); registeredPackageSources.Clear();
@ -185,7 +190,7 @@ namespace PackageManagement.Tests
options.ActivePackageSource = packageSource; options.ActivePackageSource = packageSource;
var expectedKeyValuePair = new KeyValuePair<string, string>("Test", "http://sharpdevelop.com"); var expectedKeyValuePair = new KeyValuePair<string, string>("Test", "http://sharpdevelop.com");
var actualKeyValuePair = fakeSettings.GetValuePassedToSetValueForActivePackageSourceSection(); KeyValuePair<string, string> actualKeyValuePair = fakeSettings.GetValuePassedToSetValueForActivePackageSourceSection();
Assert.AreEqual(expectedKeyValuePair, actualKeyValuePair); Assert.AreEqual(expectedKeyValuePair, actualKeyValuePair);
} }
@ -227,7 +232,7 @@ namespace PackageManagement.Tests
var differentSource = new PackageSource("http://different-url", "Test2"); var differentSource = new PackageSource("http://different-url", "Test2");
options.ActivePackageSource = differentSource; options.ActivePackageSource = differentSource;
var activeSource = options.ActivePackageSource; PackageSource activeSource = options.ActivePackageSource;
Assert.IsNull(activeSource); Assert.IsNull(activeSource);
} }
@ -280,7 +285,7 @@ namespace PackageManagement.Tests
options.RecentPackages.Add(recentPackage); options.RecentPackages.Add(recentPackage);
CreateOptions(properties); CreateOptions(properties);
var recentPackages = options.RecentPackages; IList<RecentPackageInfo> recentPackages = options.RecentPackages;
var expectedRecentPackages = new RecentPackageInfo[] { var expectedRecentPackages = new RecentPackageInfo[] {
new RecentPackageInfo(package) new RecentPackageInfo(package)
@ -293,7 +298,7 @@ namespace PackageManagement.Tests
public void RecentPackages_SaveRecentPackages_DoesNotThrowInvalidOperationException() public void RecentPackages_SaveRecentPackages_DoesNotThrowInvalidOperationException()
{ {
CreateOptions(); CreateOptions();
var recentPackage = AddRecentPackageToOptions("id", "1.0"); RecentPackageInfo recentPackage = AddRecentPackageToOptions("id", "1.0");
Assert.DoesNotThrow(() => SaveOptions()); Assert.DoesNotThrow(() => SaveOptions());
} }
@ -302,13 +307,139 @@ namespace PackageManagement.Tests
public void ActivePackageSource_AggregatePackageSourceIsActivePackageSourceInSettings_ReturnsAggregatePackageSource() public void ActivePackageSource_AggregatePackageSourceIsActivePackageSourceInSettings_ReturnsAggregatePackageSource()
{ {
CreateSettings(); CreateSettings();
var expectedPackageSource = RegisteredPackageSourceSettings.AggregatePackageSource; PackageSource expectedPackageSource = RegisteredPackageSourceSettings.AggregatePackageSource;
fakeSettings.SetFakeActivePackageSource(expectedPackageSource); fakeSettings.SetFakeActivePackageSource(expectedPackageSource);
CreateOptions(fakeSettings); CreateOptions(fakeSettings);
var activePackageSource = options.ActivePackageSource; PackageSource activePackageSource = options.ActivePackageSource;
Assert.AreEqual(expectedPackageSource, 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<KeyValuePair<string, string>>();
expectedSavedPackageSourceSettings.Add(new KeyValuePair<string, string>(packageSource.Name, "true"));
IList<KeyValuePair<string, string>> 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);
}
[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<string, string> 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);
}
} }
} }

62
src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsViewModelTests.cs

@ -3,6 +3,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using ICSharpCode.Core;
using ICSharpCode.PackageManagement; using ICSharpCode.PackageManagement;
using ICSharpCode.PackageManagement.Design; using ICSharpCode.PackageManagement.Design;
using NUnit.Framework; using NUnit.Framework;
@ -18,6 +19,8 @@ namespace PackageManagement.Tests
FakeMachinePackageCache fakeMachineCache; FakeMachinePackageCache fakeMachineCache;
FakeProcess fakeProcess; FakeProcess fakeProcess;
List<string> propertiesChanged; List<string> propertiesChanged;
PackageManagementOptions options;
FakeSettings fakeSettings;
void CreateRecentRepository() void CreateRecentRepository()
{ {
@ -29,18 +32,37 @@ namespace PackageManagement.Tests
fakeMachineCache = new FakeMachinePackageCache(); fakeMachineCache = new FakeMachinePackageCache();
} }
void CreateOptions()
{
var properties = new Properties();
fakeSettings = new FakeSettings();
options = new PackageManagementOptions(properties, fakeSettings);
}
void EnablePackageRestoreInOptions()
{
fakeSettings.SetPackageRestoreSetting(true);
}
void CreateViewModelUsingCreatedMachineCache() void CreateViewModelUsingCreatedMachineCache()
{ {
CreateRecentRepository(); CreateRecentRepository();
CreateOptions();
fakeProcess = new FakeProcess(); fakeProcess = new FakeProcess();
viewModel = new PackageManagementOptionsViewModel(fakeRecentRepository, fakeMachineCache, fakeProcess); CreateViewModel(options);
} }
void CreateViewModelUsingCreatedRecentRepository() void CreateViewModelUsingCreatedRecentRepository()
{ {
CreateMachineCache(); CreateMachineCache();
CreateOptions();
fakeProcess = new FakeProcess(); fakeProcess = new FakeProcess();
viewModel = new PackageManagementOptionsViewModel(fakeRecentRepository, fakeMachineCache, fakeProcess); CreateViewModel(options);
}
void CreateViewModel(PackageManagementOptions options)
{
viewModel = new PackageManagementOptionsViewModel(options, fakeRecentRepository, fakeMachineCache, fakeProcess);
} }
void AddPackageToRecentRepository() void AddPackageToRecentRepository()
@ -277,5 +299,41 @@ namespace PackageManagement.Tests
Assert.AreEqual(expectedFileName, fileName); 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<string, string> keyPair = fakeSettings.GetValuePassedToSetValueForPackageRestoreSection();
Assert.AreEqual("True", keyPair.Value);
}
} }
} }

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

@ -39,6 +39,18 @@ namespace PackageManagement.Tests
viewModel = new PackageSourceViewModel(packageSource); viewModel = new PackageSourceViewModel(packageSource);
} }
void CreateEnabledPackageSource()
{
CreatePackageSource();
packageSource.IsEnabled = true;
}
void CreateDisabledPackageSource()
{
CreatePackageSource();
packageSource.IsEnabled = false;
}
[Test] [Test]
public void Name_InstanceCreatedWithRegisteredPackageSource_MatchesRegisteredPackageSourceName() public void Name_InstanceCreatedWithRegisteredPackageSource_MatchesRegisteredPackageSourceName()
{ {
@ -76,5 +88,47 @@ namespace PackageManagement.Tests
Assert.AreEqual("changed", viewModel.SourceUrl); 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);
}
} }
} }

30
src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleViewModelTests.cs

@ -3,6 +3,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using ICSharpCode.PackageManagement; using ICSharpCode.PackageManagement;
using ICSharpCode.PackageManagement.Design; using ICSharpCode.PackageManagement.Design;
@ -82,6 +83,18 @@ namespace PackageManagement.Tests.Scripting
return activePackageSource; return activePackageSource;
} }
PackageSource CreateViewModelWithTwoRegisteredPackageSourcesAndFirstOneIsDisabledPackageSource()
{
CreateConsoleHost();
var packageSources = new List<PackageSource>();
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() Solution CreateViewModelWithOneProjectOpen()
{ {
CreateConsoleHost(); CreateConsoleHost();
@ -122,7 +135,7 @@ namespace PackageManagement.Tests.Scripting
PackageSourceViewModel SelectSecondPackageSource() PackageSourceViewModel SelectSecondPackageSource()
{ {
var selectedPackageSource = viewModel.PackageSources[1]; PackageSourceViewModel selectedPackageSource = viewModel.PackageSources[1];
viewModel.ActivePackageSource = selectedPackageSource; viewModel.ActivePackageSource = selectedPackageSource;
return selectedPackageSource; return selectedPackageSource;
} }
@ -168,7 +181,7 @@ namespace PackageManagement.Tests.Scripting
solution.RemoveFolder(project); solution.RemoveFolder(project);
return project; return project;
} }
[Test] [Test]
public void PackageSources_OneRegisteredPackageSourceWhenConsoleCreated_OnePackageSourceDisplayed() public void PackageSources_OneRegisteredPackageSourceWhenConsoleCreated_OnePackageSourceDisplayed()
{ {
@ -537,5 +550,18 @@ namespace PackageManagement.Tests.Scripting
CreateViewModel(); CreateViewModel();
Assert.DoesNotThrow(() => viewModel.ActivePackageSource = null); Assert.DoesNotThrow(() => viewModel.ActivePackageSource = null);
} }
[Test]
public void PackageSources_TwoRegisteredPackageSourcesButOnlyOneEnabledWhenConsoleCreated_OnlyEnabledPackageSourceDisplayed()
{
PackageSource enabledPackageSource =
CreateViewModelWithTwoRegisteredPackageSourcesAndFirstOneIsDisabledPackageSource();
ObservableCollection<PackageSourceViewModel> actualPackageSources = viewModel.PackageSources;
var expectedPackageSources = new List<PackageSource>();
expectedPackageSources.Add(enabledPackageSource);
PackageSourceCollectionAssert.AreEqual(expectedPackageSources, actualPackageSources);
}
} }
} }

2
src/AddIns/Misc/UsageDataCollector/UsageDataCollector.AddIn/AnalyticsMonitor.cs

@ -152,7 +152,7 @@ namespace ICSharpCode.UsageDataCollector
new UsageDataEnvironmentProperty { Name = "appVersion", Value = RevisionClass.Major + "." + RevisionClass.Minor + "." + RevisionClass.Build + "." + RevisionClass.Revision }, new UsageDataEnvironmentProperty { Name = "appVersion", Value = RevisionClass.Major + "." + RevisionClass.Minor + "." + RevisionClass.Build + "." + RevisionClass.Revision },
new UsageDataEnvironmentProperty { Name = "language", Value = ResourceService.Language }, new UsageDataEnvironmentProperty { Name = "language", Value = ResourceService.Language },
new UsageDataEnvironmentProperty { Name = "culture", Value = CultureInfo.CurrentCulture.Name }, new UsageDataEnvironmentProperty { Name = "culture", Value = CultureInfo.CurrentCulture.Name },
new UsageDataEnvironmentProperty { Name = "userAddInCount", Value = SD.AddInTree.AddIns.Where(a => !a.IsPreinstalled).Count().ToString() }, new UsageDataEnvironmentProperty { Name = "userAddInCount", Value = SD.AddInTree.AddIns.Count(a => !a.IsPreinstalled).ToString() },
new UsageDataEnvironmentProperty { Name = "branch", Value = BranchName }, new UsageDataEnvironmentProperty { Name = "branch", Value = BranchName },
new UsageDataEnvironmentProperty { Name = "commit", Value = CommitHash }, new UsageDataEnvironmentProperty { Name = "commit", Value = CommitHash },
new UsageDataEnvironmentProperty { Name = "renderingTier", Value = (RenderCapability.Tier >> 16).ToString() } new UsageDataEnvironmentProperty { Name = "renderingTier", Value = (RenderCapability.Tier >> 16).ToString() }

16
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/ExtensionMethods.cs

@ -14,10 +14,18 @@ namespace ICSharpCode.AvalonEdit.Utils
static class ExtensionMethods static class ExtensionMethods
{ {
#region Epsilon / IsClose / CoerceValue #region Epsilon / IsClose / CoerceValue
public const double Epsilon = 1e-8; /// <summary>
/// Epsilon used for <c>IsClose()</c> 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
/// </summary>
public const double Epsilon = 0.01;
/// <summary> /// <summary>
/// Returns true if the doubles are close (difference smaller than 10^-8). /// Returns true if the doubles are close (difference smaller than 0.01).
/// </summary> /// </summary>
public static bool IsClose(this double d1, double d2) public static bool IsClose(this double d1, double d2)
{ {
@ -27,7 +35,7 @@ namespace ICSharpCode.AvalonEdit.Utils
} }
/// <summary> /// <summary>
/// Returns true if the doubles are close (difference smaller than 10^-8). /// Returns true if the doubles are close (difference smaller than 0.01).
/// </summary> /// </summary>
public static bool IsClose(this Size d1, Size d2) public static bool IsClose(this Size d1, Size d2)
{ {
@ -35,7 +43,7 @@ namespace ICSharpCode.AvalonEdit.Utils
} }
/// <summary> /// <summary>
/// Returns true if the doubles are close (difference smaller than 10^-8). /// Returns true if the doubles are close (difference smaller than 0.01).
/// </summary> /// </summary>
public static bool IsClose(this Vector d1, Vector d2) public static bool IsClose(this Vector d1, Vector d2)
{ {

1
src/Main/Base/Project/Src/Internal/ConditionEvaluators/ActiveWindowStateEvaluator.cs

@ -9,6 +9,7 @@ using ICSharpCode.SharpDevelop.Workbench;
namespace ICSharpCode.SharpDevelop namespace ICSharpCode.SharpDevelop
{ {
[Flags]
public enum WindowState { public enum WindowState {
None = 0, None = 0,
Untitled = 1, Untitled = 1,

1
src/Main/Base/Project/Src/Project/MSBuildInternals.cs

@ -230,6 +230,7 @@ namespace ICSharpCode.SharpDevelop.Project
var query = var query =
from msbuildItem in resolvedAssemblyProjectItems from msbuildItem in resolvedAssemblyProjectItems
where msbuildItem.GetMetadataValue("ReferenceSourceTarget") != "ProjectReference"
let originalInclude = msbuildItem.GetMetadataValue("OriginalItemSpec") let originalInclude = msbuildItem.GetMetadataValue("OriginalItemSpec")
join item in referenceProjectItems.Where(p => p.ItemType != ItemType.ProjectReference) on originalInclude equals item.Include into referenceItems join item in referenceProjectItems.Where(p => p.ItemType != ItemType.ProjectReference) on originalInclude equals item.Include into referenceItems
select new { select new {

12
src/Main/Base/Project/Src/Project/MSBuildItemDefinitionGroup.cs

@ -29,7 +29,7 @@ namespace ICSharpCode.SharpDevelop.Project
public MSBuildItemDefinitionGroup(MSBuildBasedProject project, string condition) public MSBuildItemDefinitionGroup(MSBuildBasedProject project, string condition)
{ {
ProjectRootElement root = project.MSBuildProjectFile; ProjectRootElement root = project.MSBuildProjectFile;
group = root.ItemDefinitionGroups.Where(item => item.Condition == condition).SingleOrDefault(); group = root.ItemDefinitionGroups.SingleOrDefault(item => item.Condition == condition);
if (group == null) if (group == null)
{ {
group = root.CreateItemDefinitionGroupElement(); group = root.CreateItemDefinitionGroupElement();
@ -61,11 +61,10 @@ namespace ICSharpCode.SharpDevelop.Project
public string GetElementMetadata(string element, string name) public string GetElementMetadata(string element, string name)
{ {
ProjectItemDefinitionElement elem; ProjectItemDefinitionElement elem;
elem = (ProjectItemDefinitionElement)group.Children.Where( elem = (ProjectItemDefinitionElement)group.Children.SingleOrDefault(item => item is ProjectItemDefinitionElement && ((ProjectItemDefinitionElement)item).ItemType == element);
item => item is ProjectItemDefinitionElement && ((ProjectItemDefinitionElement)item).ItemType == element).SingleOrDefault();
if (elem == null) return null; if (elem == null) return null;
ProjectMetadataElement metadataElement; ProjectMetadataElement metadataElement;
metadataElement = elem.Metadata.Where(item => item.Name == name).SingleOrDefault(); metadataElement = elem.Metadata.SingleOrDefault(item => item.Name == name);
if (metadataElement == null) return null; if (metadataElement == null) return null;
return metadataElement.Value; return metadataElement.Value;
} }
@ -79,12 +78,11 @@ namespace ICSharpCode.SharpDevelop.Project
public void SetElementMetadata(string element, string name, string value) public void SetElementMetadata(string element, string name, string value)
{ {
ProjectItemDefinitionElement elem; ProjectItemDefinitionElement elem;
elem = (ProjectItemDefinitionElement)group.Children.Where( elem = (ProjectItemDefinitionElement)group.Children.SingleOrDefault(item => item is ProjectItemDefinitionElement && ((ProjectItemDefinitionElement)item).ItemType == element);
item => item is ProjectItemDefinitionElement && ((ProjectItemDefinitionElement)item).ItemType == element).SingleOrDefault();
if (elem == null) if (elem == null)
elem = AddElement(element); elem = AddElement(element);
ProjectMetadataElement metadataElement; ProjectMetadataElement metadataElement;
metadataElement = elem.Metadata.Where(item => item.Name == name).SingleOrDefault(); metadataElement = elem.Metadata.SingleOrDefault(item => item.Name == name);
if (metadataElement != null) if (metadataElement != null)
metadataElement.Value = value; metadataElement.Value = value;
else else

32
src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs

@ -60,6 +60,22 @@ namespace ICSharpCode.Core
return null; 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 #region InstallRoot Properties
static string netFrameworkInstallRoot = null; static string netFrameworkInstallRoot = null;
@ -153,6 +169,18 @@ namespace ICSharpCode.Core
} }
} }
static string windowsSdk80InstallRoot = null;
/// <summary>
/// Location of the .NET 4.5 SDK (Windows SDK 8.0) install root.
/// </summary>
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 #endregion
public static bool IsUrl(string path) public static bool IsUrl(string path)
@ -201,6 +229,10 @@ namespace ICSharpCode.Core
/// <returns>The path of the executable, or null if the exe is not found.</returns> /// <returns>The path of the executable, or null if the exe is not found.</returns>
public static string GetSdkPath(string exeName) { public static string GetSdkPath(string exeName) {
string execPath; string execPath;
if (!string.IsNullOrEmpty(WindowsSdk80NetFxTools)) {
execPath = Path.Combine(WindowsSdk80NetFxTools, exeName);
if (File.Exists(execPath)) { return execPath; }
}
if (!string.IsNullOrEmpty(WindowsSdk71InstallRoot)) { if (!string.IsNullOrEmpty(WindowsSdk71InstallRoot)) {
execPath = Path.Combine(WindowsSdk71InstallRoot, "bin\\" + exeName); execPath = Path.Combine(WindowsSdk71InstallRoot, "bin\\" + exeName);
if (File.Exists(execPath)) { return execPath; } if (File.Exists(execPath)) { return execPath; }

Loading…
Cancel
Save