Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorMarius Ungureanu <marius.ungureanu@xamarin.com>2014-05-29 22:06:37 +0400
committerMarius Ungureanu <marius.ungureanu@xamarin.com>2014-05-29 22:06:37 +0400
commit0e6566160d614683124e6521f581b2aa85fb17b1 (patch)
tree341a632ef9cbacf43d4d99786a6c25a1a7493c09 /main
parente2c0b3d7b180620b0da6c3b82b4c8aceb68a8000 (diff)
parentb1d501371db3a5325d122150d0e546063aa44776 (diff)
Merge remote-tracking branch 'mono/master' into nativeWindowsDialogs
Conflicts: main/Main.sln
Diffstat (limited to 'main')
-rw-r--r--main/Main.sln2232
-rw-r--r--main/configure.in5
m---------main/external/cecil0
m---------main/external/debugger-libs0
m---------main/external/fsharpbinding14
m---------main/external/guiunit0
m---------main/external/mono-addins0
m---------main/external/nrefactory0
m---------main/external/nuget-binary0
m---------main/external/xwt0
-rw-r--r--main/po/es.po612
-rw-r--r--main/po/sl.po2
-rw-r--r--main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Deployment/WebDeployService.cs19
-rw-r--r--main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet/AspNetAppProject.cs19
-rw-r--r--main/src/addins/CBinding/Compiler/GNUCompiler.cs68
-rw-r--r--main/src/addins/CSharpBinding/CSharpBinding.addin.xml6
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.CodeGeneration/ExportCodeGenerator.cs2
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/CSharpCompletionTextEditorExtension.cs17
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Formatting/CSharpTextEditorIndentation.cs9
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Parser/TypeSystemProvider.cs4
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/Actions/MoveTypeToFile.cs12
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/MDRefactoringContext.cs53
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/MDRefactoringScript.cs4
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/NRefactoryCodeAction.cs2
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeIssues/NamingInspection/NameConventionEditRuleDialog.cs11
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpCodeGenerator.cs2
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Resolver/TextEditorResolverProvider.cs13
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Tooltips/LanguageItemTooltipProvider.cs8
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp/AstStockIcons.cs16
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp/PathedDocumentTextEditorExtension.cs17
-rw-r--r--main/src/addins/CSharpBinding/templates/SharedAssetsProject.xpt.xml8
-rw-r--r--main/src/addins/Deployment/MonoDevelop.Deployment.Linux/MonoDevelop.Deployment.Linux/DotDesktopViewWidget.cs15
-rw-r--r--main/src/addins/MacPlatform/MacInterop/Keychain.cs18
-rw-r--r--main/src/addins/MacPlatform/MacProxyCredentialProvider.cs111
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserViewContent.cs10
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserWidget.cs12
-rw-r--r--main/src/addins/MonoDevelop.Autotools/MakefileProjectServiceExtension.cs40
-rw-r--r--main/src/addins/MonoDevelop.Autotools/SolutionDeployer.cs60
-rw-r--r--main/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft.AspNet/AspNetSoftDebuggerEngine.cs13
-rw-r--r--main/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/CustomSoftDebuggerEngine.cs17
-rw-r--r--main/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/SoftDebuggerEngine.cs18
-rw-r--r--main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/Extensions/DebuggerExtensions.cs4
-rw-r--r--main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/Metadata/MetadataPropertyInfo.cs4
-rw-r--r--main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/Metadata/MetadataType.cs4
-rw-r--r--main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/debug/Debugger.cs2
-rw-r--r--main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/ArrayAdaptor.cs3
-rw-r--r--main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/CorDebuggerBacktrace.cs22
-rw-r--r--main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/CorDebuggerSession.cs144
-rw-r--r--main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/CorObjectAdaptor.cs130
-rw-r--r--main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/MtaThread.cs49
-rw-r--r--main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/PropertyReference.cs26
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests.TestApp/BreakpointsAndStepping.cs94
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests.TestApp/MonoDevelop.Debugger.Tests.TestApp.csproj1
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests.TestApp/TestEvaluation.cs767
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/BreakpointsAndSteppingTests.cs339
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/CorEvaluationTests.cs1
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/CorStackFrameTests.cs2
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/DebugTests.cs112
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/EvaluationTests.cs1256
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/StackFrameTests.cs32
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.addin.xml4
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.csproj9
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebugCommands.cs4
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerConsoleView.cs6
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerEngine.cs17
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerEngineBackend.cs93
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerOptionsPanelWidget.cs25
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggingService.cs111
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ExceptionCaughtDialog.cs2
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/IDebuggerEngine.cs1
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/LocalsPad.cs55
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValuePad.cs2
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValueTreeView.cs14
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/PinnedWatchStore.cs7
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/StackTracePad.cs22
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ThreadsPad.cs17
-rw-r--r--main/src/addins/MonoDevelop.Debugger/gtk-gui/MonoDevelop.Debugger.DebuggerOptionsPanelWidget.cs64
-rw-r--r--main/src/addins/MonoDevelop.Debugger/gtk-gui/gui.stetic385
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/breakpoint-16.pngbin871 -> 940 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/breakpoint-16@2x.pngbin2456 -> 2618 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/bug-16.pngbin536 -> 0 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/bug-16@2x.pngbin1719 -> 0 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-16.pngbin750 -> 754 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-16@2x.pngbin799 -> 807 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-22.pngbin1612 -> 1622 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-22@2x.pngbin1654 -> 1659 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-24.pngbin1618 -> 1621 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-24@2x.pngbin1666 -> 2612 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-32.pngbin1633 -> 1639 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-32@2x.pngbin1708 -> 2662 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-15.pngbin715 -> 740 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-15@2x.pngbin1658 -> 1703 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-invalid-15.pngbin731 -> 750 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-invalid-15@2x.pngbin1496 -> 1525 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-15.pngbin612 -> 631 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-15@2x.pngbin1370 -> 1428 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-invalid-15.pngbin557 -> 578 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-invalid-15@2x.pngbin1120 -> 1199 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/prefs-debugger-16.pngbin0 -> 754 bytes
-rw-r--r--main/src/addins/MonoDevelop.Debugger/icons/light/prefs-debugger-16@2x.pngbin0 -> 1835 bytes
-rw-r--r--main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/IToolboxLoader.cs4
-rw-r--r--main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/ItemToolboxNode.cs6
-rw-r--r--main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/TextToolboxNode.cs4
-rw-r--r--main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/ToolboxItemToolboxLoader.cs41
-rw-r--r--main/src/addins/MonoDevelop.DocFood/MonoDevelop.DocFood/DocGenerator.cs12
-rw-r--r--main/src/addins/MonoDevelop.Gettext/MonoDevelop.Gettext.csproj6
-rw-r--r--main/src/addins/MonoDevelop.Gettext/gtk-gui/MonoDevelop.Gettext.Translator.LanguageChooserDialog.cs2
-rw-r--r--main/src/addins/MonoDevelop.Gettext/icons/light/done-16.pngbin846 -> 825 bytes
-rw-r--r--main/src/addins/MonoDevelop.Gettext/icons/light/done-16@2x.pngbin2003 -> 1943 bytes
-rw-r--r--main/src/addins/MonoDevelop.Gettext/icons/light/error-16.pngbin830 -> 894 bytes
-rw-r--r--main/src/addins/MonoDevelop.Gettext/icons/light/error-16@2x.pngbin1854 -> 1967 bytes
-rw-r--r--main/src/addins/MonoDevelop.Gettext/icons/light/prefs-language-16.pngbin0 -> 598 bytes
-rw-r--r--main/src/addins/MonoDevelop.Gettext/icons/light/prefs-language-16@2x.pngbin0 -> 1732 bytes
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/PackageSourcesOptionsPanel.cs36
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/PackageSourcesWidget.cs14
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/ProjectPackagesProjectNodeBuilderExtension.cs4
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/CollectionAssert.cs41
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/ExceptionThrowingProcessPackageAction.cs42
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/ExceptionThrowingRegisteredPackageRepositories.cs46
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeDotNetProject.cs117
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeFileService.cs63
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeFileSystem.cs150
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeInstallPackageAction.cs64
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeLogger.cs77
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeMachineCache.cs54
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeOperationAwareRepository.cs66
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackage.cs233
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageAssemblyReference.cs69
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProject.cs295
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProjectFactory.cs81
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProjectService.cs75
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementSolution.cs203
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManager.cs240
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagerFactory.cs49
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperation.cs48
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperationResolver.cs52
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperationResolverFactory.cs78
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackagePathResolver.cs60
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepository.cs96
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryFactory.cs114
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryFactoryEvents.cs44
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryWithHttpClientEvents.cs44
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageViewModelFactory.cs72
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProcess.cs42
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProgressMonitor.cs126
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProgressMonitorFactory.cs44
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProject.cs61
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectManager.cs209
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectSystem.cs99
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectSystemFactory.cs45
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeRecentPackageRepository.cs68
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeRegisteredPackageRepositories.cs122
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeServiceBasedRepository.cs65
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSettings.cs238
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSharedPackageRepository.cs70
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolution.cs48
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolutionPackageRepository.cs86
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolutionPackageRepositoryFactory.cs45
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeTask.cs89
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeTaskFactory.cs67
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeUninstallPackageAction.cs51
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeUpdatePackageAction.cs59
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeWebRequest.cs42
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FileNameAndDirectory.cs67
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FileNameAndProjectName.cs66
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/InstallPackageHelper.cs83
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/OneRegisteredPackageSourceHelper.cs86
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageCollectionAssert.cs62
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageOperationHelper.cs52
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageReferenceRepositoryHelper.cs57
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageSourceCollectionAssert.cs82
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/RecentPackageInfoCollectionAssert.cs53
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/ReferenceAndProjectName.cs67
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/SelectedProjectCollectionAssert.cs61
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestPackageHelper.cs66
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableBackgroundPackageActionRunner.cs74
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableMonoDevelopProjectSystem.cs119
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageFromRepository.cs57
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageManagementEventsMonitor.cs68
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageManagementOptions.cs51
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageViewModel.cs79
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableProcessPackageAction.cs70
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableProjectManager.cs105
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableViewModelBase.cs37
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/UninstallPackageHelper.cs68
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/UpdatePackageHelper.cs82
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/WindowsPath.cs52
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.csproj127
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/AvailablePackagesViewModelTests.cs695
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/BackgroundPackageActionRunnerTests.cs438
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/DelegateCommandTests.cs94
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/IPackageExtensionsTests.cs114
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/InstallPackageActionTests.cs499
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MSBuildProjectExtensionsTests.cs (renamed from main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MSBuildProjectExtensionsTests.cs)48
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopPackageManagerFactoryTests.cs141
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopPackageManagerTests.cs1139
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectManagerTests.cs110
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectSystemTests.cs1091
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/NuGetPackageRestoreCommandLineTests.cs86
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/OpenDotNetProjectTests.cs90
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageFilesTests.cs170
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageFromRepositoryTests.cs467
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementEventsTests.cs463
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementLoggerTests.cs109
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementOptionsTests.cs473
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementOptionsViewModelTests.cs330
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementProjectTests.cs758
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSelectedProjectTests.cs85
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSelectedProjectsTests.cs536
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSolutionTests.cs665
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageOperationMessageTests.cs73
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageRepositoryCacheTests.cs383
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageSourceViewModelTests.cs158
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageViewModelTests.cs771
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ProcessPackageActionTests.cs110
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ProjectHelper.cs129
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RecentPackageInfoTests.cs91
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RecentPackageRepositoryTests.cs216
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ReducedPackageOperationsTests.cs188
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RegisteredPackageRepositoriesTests.cs314
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RegisteredPackageSourcesViewModelTests.cs531
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/SolutionPackageRepositoryPathTests.cs117
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/SolutionPackageRepositoryTests.cs247
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ThreadSafePackageManagementEventsTests.cs607
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UninstallPackageActionTests.cs287
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UpdateAllPackagesInProjectTests.cs233
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UpdateAllPackagesInSolutionTests.cs258
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UpdatePackageActionTests.cs371
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UserAgentGeneratorForRepositoryRequestsTests.cs106
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ViewModelBaseTests.cs71
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/XmlDocumentTransformTests.cs147
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.addin.xml18
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj19
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/BackgroundPackageActionRunner.cs34
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ConfigSettingsFileSystem.cs3
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs45
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectProxy.cs89
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IDotNetProject.cs48
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectFactory.cs4
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectService.cs9
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementSolution.cs7
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagerFactory.cs6
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IProject.cs44
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ISolution.cs38
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ISolutionPackageRepositoryFactory.cs3
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ManagePackagesUserPrompts.cs124
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ManagePackagesViewModel.cs6
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopCredentialProvider.cs13
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/NuGetPackageRestoreCommandLine.cs24
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/OpenDotNetProjects.cs19
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementEventsMonitor.cs25
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementOptionsViewModel.cs3
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProgressProvider.cs12
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProject.cs19
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectFactory.cs8
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectService.cs48
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProject.cs12
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProjects.cs21
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementServices.cs14
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSolution.cs48
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementViewModels.cs3
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageSourceViewModelChecker.cs30
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageViewModel.cs22
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackagesRequiringLicenseAcceptance.cs17
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackagesViewModel.cs2
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackagesViewModels.cs4
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProcessPackageAction.cs2
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectProxy.cs70
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTargetFramework.cs9
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateNuGetPackageInstaller.cs14
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RecentPackageRepository.cs7
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RegisteredPackageRepositories.cs19
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RegisteredPackageSourceSettings.cs30
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RegisteredPackageSourcesViewModel.cs42
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SearchPackagesDataSource.cs7
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopPackageManagerFactory.cs11
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopPackageRepositoryFactory.cs14
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopProjectSystem.cs47
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepository.cs10
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryFactory.cs5
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryPath.cs11
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionProxy.cs51
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ThreadSafePackageManagementEvents.cs33
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/UserAgentGeneratorForRepositoryRequests.cs4
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/icons/light/prefs-package-16.pngbin0 -> 589 bytes
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/icons/light/prefs-package-16@2x.pngbin0 -> 1304 bytes
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/icons/light/prefs-package-source-16.pngbin0 -> 657 bytes
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/icons/light/prefs-package-source-16@2x.pngbin0 -> 1254 bytes
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/MonoDevelop.AnalysisCore/Gui/ResultMarker.cs22
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeActions/CodeActionEditorExtension.cs2
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeIssues/CodeIssuePanelWidget.cs2
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.addin.xml18
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.csproj20
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/ExtensionMethods.cs48
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoringOptions.cs15
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoringService.cs5
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-actions-16.pngbin0 -> 642 bytes
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-actions-16@2x.pngbin0 -> 1841 bytes
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-analysis-16.pngbin0 -> 329 bytes
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-analysis-16@2x.pngbin0 -> 708 bytes
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-rules-16.pngbin0 -> 335 bytes
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-rules-16@2x.pngbin0 -> 697 bytes
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor.OptionPanels/HighlightingPanel.cs6
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor.addin.xml27
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor.csproj36
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/ExtensibleTextEditor.cs10
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/SourceEditorWidget.cs20
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-completion-appearance-16.pngbin0 -> 318 bytes
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-completion-appearance-16@2x.pngbin0 -> 935 bytes
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-completion-behavior-16.pngbin0 -> 318 bytes
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-completion-behavior-16@2x.pngbin0 -> 935 bytes
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-markers-rulers-16.pngbin0 -> 444 bytes
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-markers-rulers-16@2x.pngbin0 -> 820 bytes
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-syntax-highlighting-16.pngbin0 -> 456 bytes
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-syntax-highlighting-16@2x.pngbin0 -> 879 bytes
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-text-editor-behavior-16.pngbin0 -> 813 bytes
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-text-editor-behavior-16@2x.pngbin0 -> 2225 bytes
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-text-editor-general-16.pngbin0 -> 389 bytes
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-text-editor-general-16@2x.pngbin0 -> 675 bytes
-rwxr-xr-xmain/src/addins/MonoDevelop.XmlEditor/MonoDevelop.Xml.StateEngine/Parser.cs35
-rw-r--r--main/src/addins/MonoDevelop.XmlEditor/MonoDevelop.Xml.StateEngine/XmlClosingTagState.cs5
-rw-r--r--main/src/addins/MonoDevelop.XmlEditor/MonoDevelop.XmlEditor.addin.xml9
-rw-r--r--main/src/addins/MonoDevelop.XmlEditor/MonoDevelop.XmlEditor.csproj14
-rw-r--r--main/src/addins/MonoDevelop.XmlEditor/icons/light/prefs-xml-16.pngbin0 -> 422 bytes
-rw-r--r--main/src/addins/MonoDevelop.XmlEditor/icons/light/prefs-xml-16@2x.pngbin0 -> 917 bytes
-rw-r--r--main/src/addins/MonoDevelop.XmlEditor/icons/light/prefs-xml-schemas-16.pngbin0 -> 422 bytes
-rw-r--r--main/src/addins/MonoDevelop.XmlEditor/icons/light/prefs-xml-schemas-16@2x.pngbin0 -> 917 bytes
-rw-r--r--main/src/addins/MonoDeveloperExtensions/MonoSolutionItemHandler.cs38
-rw-r--r--main/src/addins/NUnit/Gui/icons/light/unit-failed-16.pngbin515 -> 530 bytes
-rw-r--r--main/src/addins/NUnit/Gui/icons/light/unit-failed-16@2x.pngbin1156 -> 1163 bytes
-rw-r--r--main/src/addins/NUnit/Gui/icons/light/unit-mixed-results-16.pngbin813 -> 816 bytes
-rw-r--r--main/src/addins/NUnit/Gui/icons/light/unit-mixed-results-16@2x.pngbin1902 -> 1933 bytes
-rw-r--r--main/src/addins/NUnit/Gui/icons/light/unit-running-16.pngbin533 -> 627 bytes
-rw-r--r--main/src/addins/NUnit/Gui/icons/light/unit-running-16@2x.pngbin1242 -> 1468 bytes
-rw-r--r--main/src/addins/NUnit/Gui/icons/light/unit-success-16.pngbin565 -> 566 bytes
-rw-r--r--main/src/addins/NUnit/Gui/icons/light/unit-success-16@2x.pngbin1160 -> 1140 bytes
-rw-r--r--main/src/addins/NUnit/Services/AbstractResultsStore.cs35
-rw-r--r--main/src/addins/NUnit/Services/NUnitProjectTestSuite.cs2
-rw-r--r--main/src/addins/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplatingEngine.cs4
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl.Git.Tests/BaseGitRepositoryTests.cs46
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl.Git.Tests/BaseRepositoryTests.cs85
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git.addin.xml2
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/Commands.cs37
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs41
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitService.cs3
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Tests/BaseSvnRepositoryTests.cs12
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Tests/RepositoryTests.cs10
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs61
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion/MonoDevelop.VersionControl.Subversion/SubversionRepository.cs10
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion/MonoDevelop.VersionControl.Subversion/SubversionVersionControl.cs2
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Dialogs/CommitDialog.cs10
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/BlameWidget.cs6
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/LogWidget.cs8
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/MergeView.cs16
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/StatusView.cs33
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/VersionControlDocumentInfo.cs3
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.csproj18
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/CommitCommand.cs46
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Repository.cs21
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlCommandHandler.cs1
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlService.cs39
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionInfoCache.cs4
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/VersionControl.addin.xml15
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/gtk-gui/gui.stetic1
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/branch-16.pngbin567 -> 577 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/branch-16@2x.pngbin1269 -> 1287 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/commit-16.pngbin888 -> 885 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/commit-16@2x.pngbin2238 -> 2247 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/local-status-16.pngbin816 -> 800 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/local-status-16@2x.pngbin1946 -> 1956 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-commit-message-style-16.pngbin0 -> 885 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-commit-message-style-16@2x.pngbin0 -> 2247 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-git-16.pngbin0 -> 821 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-git-16@2x.pngbin0 -> 1909 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-version-control-general-16.pngbin0 -> 413 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-version-control-general-16@2x.pngbin0 -> 723 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/refresh-16.pngbin910 -> 892 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/refresh-16@2x.pngbin2250 -> 2231 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/remote-status-16.pngbin828 -> 828 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/remote-status-16@2x.pngbin1966 -> 1984 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/removed-overlay-16.pngbin327 -> 337 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/removed-overlay-16@2x.pngbin467 -> 497 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/repository-16.pngbin392 -> 413 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/repository-16@2x.pngbin659 -> 723 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/revert-16.pngbin868 -> 911 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/revert-16@2x.pngbin2150 -> 2242 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/unlocked-overlay-16.pngbin297 -> 304 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/unlocked-overlay-16@2x.pngbin407 -> 400 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/vcs-removed-16.pngbin516 -> 536 bytes
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/vcs-removed-16@2x.pngbin1059 -> 1138 bytes
-rw-r--r--main/src/addins/VersionControl/Subversion.Win32.Tests/RepositoryTests.cs10
-rw-r--r--main/src/addins/VersionControl/Subversion.Win32/SvnSharpClient.cs31
-rw-r--r--main/src/addins/WindowsPlatform/WindowsPlatform/WindowsProxyCredentialProvider.cs70
-rw-r--r--main/src/core/Makefile.am3
-rw-r--r--main/src/core/Mono.Texteditor/Mono.TextEditor.Highlighting/Chunk.cs5
-rw-r--r--main/src/core/Mono.Texteditor/Mono.TextEditor.Highlighting/SyntaxMode.cs5
-rw-r--r--main/src/core/Mono.Texteditor/Mono.TextEditor.Highlighting/SyntaxModeService.cs109
-rw-r--r--main/src/core/Mono.Texteditor/Mono.TextEditor.Vi/ViActionMaps.cs4
-rw-r--r--main/src/core/Mono.Texteditor/Mono.TextEditor.Vi/ViActions.cs12
-rw-r--r--main/src/core/Mono.Texteditor/Mono.TextEditor.Vi/ViWordFindStrategy.cs57
-rw-r--r--main/src/core/Mono.Texteditor/Mono.TextEditor/Document/FoldSegment.cs10
-rw-r--r--main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/FoldingScreenbackgroundRenderer.cs2
-rw-r--r--main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/TextArea.cs3
-rw-r--r--main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/TextViewMargin.cs8
-rw-r--r--main/src/core/Mono.Texteditor/SyntaxModes/FSharpSyntaxMode.xml31
-rw-r--r--main/src/core/Mono.Texteditor/SyntaxModes/JavascriptSyntaxMode.xml2
-rw-r--r--main/src/core/Mono.Texteditor/SyntaxModes/TypescriptSyntaxMode.xml3
-rw-r--r--main/src/core/MonoDevelop.Core/Makefile.am3
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoFrameworkBackend.cs3
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/IDebugConsole.cs35
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.ProgressMonitoring/ConsoleProgressMonitor.cs73
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/CredentialProviderExtensions.cs (renamed from main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/CredentialsUtility.cs)49
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/CredentialStore.cs59
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/CredentialType.cs15
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/ICredentialCache.cs28
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/ICredentialProvider.cs25
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/IHttpWebResponse.cs32
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/IProxyAuthenticationHandler.cs26
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/IProxyCache.cs29
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/MemoryCache.cs150
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/MonoAddinsProxyWrapper.cs68
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/NullCredentialProvider.cs30
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/ProxyAuthenticationHandler.cs78
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/ProxyCache.cs19
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/RequestHelper.cs358
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/STSAuthHelper.cs153
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/StringExtensions.cs29
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/WIFTypeProvider.cs163
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/WebService.cs105
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.addin.xml1
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.csproj22
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core/FileService.cs2
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core/LoggingService.cs31
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core/MacSystemInformation.cs1
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core/Runtime.cs4
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core/WebRequestHelper.cs336
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProject.cs5
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectHandler.cs57
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectService.cs10
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/SlnFileFormat.cs2
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs85
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProjectMSBuildExtension.cs2
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProjectMSBuildHandler.cs9
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Text/TextFile.cs1
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectReference.cs11
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectService.cs10
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectServiceExtension.cs28
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Solution.cs13
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionFolder.cs30
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionItem.cs14
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/UnknownProject.cs6
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/UnknownSolutionItem.cs5
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Workspace.cs13
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/WorkspaceItem.cs18
-rw-r--r--main/src/core/MonoDevelop.Ide/ExtensionModel/Commands.addin.xml2
-rw-r--r--main/src/core/MonoDevelop.Ide/ExtensionModel/DefaultPolicyPanels.addin.xml10
-rw-r--r--main/src/core/MonoDevelop.Ide/ExtensionModel/GlobalOptionsDialog.addin.xml32
-rw-r--r--main/src/core/MonoDevelop.Ide/ExtensionModel/ItemOptionPanels.addin.xml22
-rw-r--r--main/src/core/MonoDevelop.Ide/ExtensionModel/MimeTypes.addin.xml8
-rw-r--r--main/src/core/MonoDevelop.Ide/ExtensionModel/Pads.addin.xml2
-rw-r--r--main/src/core/MonoDevelop.Ide/ExtensionModel/StockIcons.addin.xml75
-rw-r--r--main/src/core/MonoDevelop.Ide/Makefile.am8
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Commands/CommandCheckMenuItem.cs1
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Commands/CommandMenuItem.cs1
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/ConfigurationMerger.cs1
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/MainToolbar.cs20
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Components/CellRendererImage.cs25
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Components/DropDownBoxListWindow.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Components/ImageLoader.cs31
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PathBar.cs15
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ListWidget.cs17
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindow.cs1
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Commands/ProjectCommands.cs6
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CustomTools/ResXFileCodeGenerator.cs17
-rwxr-xr-xmain/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/ReferencesFinder.cs5
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/SearchResult.cs22
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/SearchResultWidget.cs112
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Fonts/FontService.cs3
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/ExtensibleTreeView.cs24
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/LogView.cs108
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/PadTreeView.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/TransactedTreeBuilder.cs21
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/TreeBuilder.cs12
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/OptionsDialog.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/SplashScreen.cs4
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.OptionPanels/LoadSavePanel.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/FileOperationsBuilderExtension.cs11
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFileNodeBuilder.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectSolutionPad.cs1
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/CommonTextEditorOptions.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/SdiWorkspaceWindow.cs5
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/StockIcons.cs4
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ViewCommandHandlers.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Navigation/NavigationHistoryService.cs1
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects.OptionPanels/GeneralProjectOptions.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects.OptionPanels/PortableRuntimeOptionsPanel.cs19
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/ConfirmProjectDeleteDialog.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/ExportSolutionDialog.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/NewPolicySetDialog.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/NewProjectDialog.cs38
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/NewProjectOptionsWidget.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/CommentTasksView.cs12
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/Task.cs4
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplate.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplate.cs16
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplatePackageInstaller.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemParserNode.cs11
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs6
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj339
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/Ide.cs5
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ImageService.cs10
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ProjectOperations.cs44
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/RootWorkspace.cs62
-rw-r--r--main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ConfirmProjectDeleteDialog.cs12
-rw-r--r--main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ExportSolutionDialog.cs12
-rw-r--r--main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.NewPolicySetDialog.cs8
-rw-r--r--main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.NewProjectDialog.cs793
-rw-r--r--main/src/core/MonoDevelop.Ide/gtk-gui/gui.stetic4
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/compiler-options-16.pngbin721 -> 0 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/custom-commands-16.pngbin996 -> 0 bytes
-rwxr-xr-xmain/src/core/MonoDevelop.Ide/icons/drive-16.pngbin424 -> 0 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/formatting-16.pngbin732 -> 0 bytes
-rwxr-xr-xmain/src/core/MonoDevelop.Ide/icons/hammer-16.pngbin575 -> 0 bytes
-rwxr-xr-xmain/src/core/MonoDevelop.Ide/icons/keyboard-shortcuts-16.pngbin461 -> 0 bytes
-rwxr-xr-xmain/src/core/MonoDevelop.Ide/icons/letters-16.pngbin312 -> 0 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/add-16.pngbin445 -> 424 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/add-16@2x.pngbin858 -> 848 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/breakpoint-16.pngbin871 -> 940 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/breakpoint-16@2x.pngbin2456 -> 2618 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/breakpoint-invalid-16.pngbin810 -> 857 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/breakpoint-invalid-16@2x.pngbin2048 -> 2172 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/breakpoint-new-16.pngbin882 -> 947 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/breakpoint-new-16@2x.pngbin2475 -> 2613 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/breakpoint-on-off-16.pngbin893 -> 932 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/breakpoint-on-off-16@2x.pngbin2359 -> 2485 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/copy-16.pngbin0 -> 388 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/copy-16@2x.pngbin0 -> 724 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/done-16.pngbin846 -> 825 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/done-16@2x.pngbin2003 -> 1943 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/element-exception-16.pngbin0 -> 399 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/element-exception-16@2x.pngbin0 -> 869 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/element-fs-field-16.pngbin0 -> 450 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/element-fs-field-16@2x.pngbin0 -> 817 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/element-method-new-16.pngbin482 -> 479 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/element-method-new-16@2x.pngbin990 -> 1002 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/element-module-16.pngbin0 -> 455 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/element-module-16@2x.pngbin0 -> 967 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/element-other-declaration-16.pngbin0 -> 557 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/element-other-declaration-16@2x.pngbin0 -> 1090 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/element-type-16.pngbin0 -> 408 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/element-type-16@2x.pngbin0 -> 742 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/error-16.pngbin830 -> 894 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/error-16@2x.pngbin1854 -> 1967 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/error-24.pngbin1348 -> 1398 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/error-24@2x.pngbin2901 -> 3092 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/error-32.pngbin1854 -> 1967 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/error-32@2x.pngbin4097 -> 4309 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/error-48.pngbin2901 -> 3092 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/error-48@2x.pngbin6497 -> 6846 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/file-script-16.pngbin0 -> 478 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/file-script-16@2x.pngbin0 -> 1014 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/file-script-32.pngbin0 -> 1014 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/file-script-32@2x.pngbin0 -> 2249 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/find-16.pngbin0 -> 826 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/find-16@2x.pngbin0 -> 2045 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/find-and-replace-16.pngbin0 -> 869 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/find-and-replace-16@2x.pngbin0 -> 2184 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/go-back-16.pngbin0 -> 435 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/go-back-16@2x.pngbin0 -> 833 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/go-down-16.pngbin0 -> 466 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/go-down-16@2x.pngbin0 -> 867 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/go-forward-16.pngbin0 -> 441 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/go-forward-16@2x.pngbin0 -> 824 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/go-up-16.pngbin0 -> 452 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/go-up-16@2x.pngbin0 -> 905 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/home-16.pngbin0 -> 494 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/home-16@2x.pngbin0 -> 1140 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/information-16@2x.pngbin1886 -> 1870 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/information-32.pngbin1886 -> 1870 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/jump-to-16.pngbin0 -> 453 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/jump-to-16@2x.pngbin0 -> 1100 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/media-play-16.pngbin0 -> 642 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/media-play-16@2x.pngbin0 -> 1319 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/missing-image-16.pngbin0 -> 453 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/missing-image-16@2x.pngbin0 -> 1379 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/open-16.pngbin0 -> 637 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/package-22.pngbin678 -> 0 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/package-22@2x.pngbin1256 -> 0 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/package-24.pngbin0 -> 701 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/package-24@2x.pngbin0 -> 1390 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-author-information-16.pngbin0 -> 609 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-author-information-16@2x.pngbin0 -> 1626 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-build-16.pngbin0 -> 471 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-build-16@2x.pngbin0 -> 1228 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-code-formatting-16.pngbin0 -> 408 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-code-formatting-16@2x.pngbin0 -> 768 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-code-templates-16.pngbin0 -> 305 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-code-templates-16@2x.pngbin0 -> 574 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-csharp-16.pngbin0 -> 482 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-csharp-16@2x.pngbin0 -> 1033 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-dotnet-naming-policies-16.pngbin0 -> 477 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-dotnet-naming-policies-16@2x.pngbin0 -> 932 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-external-tools-16.pngbin0 -> 512 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-external-tools-16@2x.pngbin0 -> 1117 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-fonts-16.pngbin0 -> 516 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-fonts-16@2x.pngbin0 -> 1124 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-generic-16.pngbin0 -> 538 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-generic-16@2x.pngbin0 -> 1518 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-key-bindings-16.pngbin0 -> 656 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-key-bindings-16@2x.pngbin0 -> 1719 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-language-16.pngbin0 -> 598 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-language-16@2x.pngbin0 -> 1732 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-load-save-16.pngbin0 -> 377 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-load-save-16@2x.pngbin0 -> 738 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-name-conventions-16.pngbin0 -> 437 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-name-conventions-16@2x.pngbin0 -> 888 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-play-16.pngbin0 -> 526 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-play-16@2x.pngbin0 -> 1253 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-sdk-locations-16.pngbin0 -> 351 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-sdk-locations-16@2x.pngbin0 -> 771 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-standard-header-16.pngbin0 -> 364 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-standard-header-16@2x.pngbin0 -> 703 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-task-list-16.pngbin0 -> 402 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-task-list-16@2x.pngbin0 -> 822 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-updates-16.pngbin0 -> 797 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/prefs-updates-16@2x.pngbin0 -> 1922 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/question-16.pngbin0 -> 820 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/question-16@2x.pngbin0 -> 2021 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/question-24.pngbin0 -> 1289 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/question-24@2x.pngbin0 -> 3120 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/question-32.pngbin0 -> 2021 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/question-32@2x.pngbin0 -> 4515 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/question-48.pngbin0 -> 3120 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/question-48@2x.pngbin0 -> 7283 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/refresh-16.pngbin0 -> 788 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/refresh-16@2x.pngbin0 -> 1825 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/remove-16.pngbin567 -> 583 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/remove-16@2x.pngbin1248 -> 1355 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/save-16.pngbin0 -> 536 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/save-all-16.pngbin0 -> 561 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/stop-16.pngbin613 -> 648 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/stop-16@2x.pngbin1368 -> 1408 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/undo-16.pngbin0 -> 785 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/undo-16@2x.pngbin0 -> 1958 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/updates-16.pngbin811 -> 797 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/updates-16@2x.pngbin1942 -> 1922 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/warning-8.pngbin0 -> 243 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/warning-8@2x.pngbin0 -> 669 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/zoom-in-16.pngbin0 -> 428 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/zoom-in-16@2x.pngbin0 -> 1018 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/zoom-out-16.pngbin0 -> 354 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/light/zoom-out-16@2x.pngbin0 -> 828 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/locale-16.pngbin410 -> 0 bytes
-rwxr-xr-xmain/src/core/MonoDevelop.Ide/icons/markers-rulers-16.pngbin729 -> 0 bytes
-rwxr-xr-xmain/src/core/MonoDevelop.Ide/icons/monkey-16.pngbin1677 -> 0 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/save-all-16.pngbin471 -> 0 bytes
-rwxr-xr-xmain/src/core/MonoDevelop.Ide/icons/sdk-locations-16.pngbin488 -> 0 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/syntax-highlighting-16.pngbin573 -> 0 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/text-editor-16.pngbin574 -> 0 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/text-editor-behavior-16.pngbin750 -> 0 bytes
-rwxr-xr-xmain/src/core/MonoDevelop.Ide/icons/text-quickfix-16.pngbin739 -> 0 bytes
-rwxr-xr-xmain/src/core/MonoDevelop.Ide/icons/tools-external-tools-16.pngbin907 -> 0 bytes
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/Main.cs2
-rw-r--r--main/src/core/MonoDevelop.TextEditor.Tests/Makefile.am1
-rw-r--r--main/src/core/MonoDevelop.TextEditor.Tests/Mono.TextEditor.Tests/SyntaxHighlightingTests.cs9
-rw-r--r--main/tests/Ide.Tests/Makefile.am1
-rw-r--r--main/tests/Makefile.am2
-rw-r--r--main/tests/TestRunner/Makefile.am1
-rw-r--r--main/tests/UnitTests/MonoDevelop.Projects/ProjectTests.cs16
-rw-r--r--main/tests/UnitTests/MonoDevelop.Projects/SharedAssetsProjectTests.cs63
-rw-r--r--main/tests/UnitTests/MonoDevelop.Projects/SolutionTests.cs28
-rw-r--r--main/tests/UnitTests/MonoDevelop.Projects/WebProjectTests.cs56
-rw-r--r--main/tests/UnitTests/UnitTests.csproj1
-rw-r--r--main/tests/test-projects/WebProjectTest/WebProject/WebProject.csproj45
-rw-r--r--main/tests/test-projects/WebProjectTest/WebProjectTest.sln20
-rw-r--r--main/tests/test-projects/generated-shared-project/Shared.projitems3
-rw-r--r--main/tests/test-projects/generated-shared-project/Shared.projitems.saved13
-rw-r--r--main/tests/test-projects/unsupported-project/library2/library2.csproj7
-rw-r--r--main/tests/test-projects/unsupported-project/library2/library2.csproj.saved7
679 files changed, 29514 insertions, 5019 deletions
diff --git a/main/Main.sln b/main/Main.sln
index 9c399e45f4..bf3350c84c 100644
--- a/main/Main.sln
+++ b/main/Main.sln
@@ -2,6 +2,9 @@
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{9D360D43-0C05-49D6-84DB-4E7AB2F38F82}"
+ ProjectSection(MonoDevelopProperties) = preProject
+ BaseDirectory = src\core
+ EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoDevelop.Core", "src\core\MonoDevelop.Core\MonoDevelop.Core.csproj", "{7525BB88-6142-4A26-93B9-A30C6983390A}"
EndProject
@@ -72,6 +75,9 @@ EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoDevelop.WebReferences", "src\addins\MonoDevelop.WebReferences\MonoDevelop.WebReferences.csproj", "{2A00A871-C641-4116-ADFD-29B7799952B4}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CSharpBinding", "CSharpBinding", "{B480BF1B-1DCD-4288-9212-F5BEDF763797}"
+ ProjectSection(MonoDevelopProperties) = preProject
+ BaseDirectory = src\addins\CSharpBinding
+ EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpBinding", "src\addins\CSharpBinding\CSharpBinding.csproj", "{07CC7654-27D6-421D-A64C-0FFA40456FA2}"
EndProject
@@ -136,6 +142,9 @@ EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.TextTemplating.Tests", "src\addins\TextTemplating\Mono.TextTemplating.Tests\Mono.TextTemplating.Tests.csproj", "{CB590106-8331-4CBE-8131-B154E7BF79E1}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MonoDevelop.Debugger.Soft", "MonoDevelop.Debugger.Soft", "{33248236-FF84-4336-A73B-65E6B1090D15}"
+ ProjectSection(MonoDevelopProperties) = preProject
+ BaseDirectory = src\addins\MonoDevelop.Debugger.Soft
+ EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoDevelop.Debugger.Soft", "src\addins\MonoDevelop.Debugger.Soft\MonoDevelop.Debugger.Soft\MonoDevelop.Debugger.Soft.csproj", "{3D363F0C-5731-42AA-9022-B7F4657F298A}"
EndProject
@@ -171,17 +180,26 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoDevelop.PackageManageme
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoDevelop.PackageManagement", "src\addins\MonoDevelop.PackageManagement\MonoDevelop.PackageManagement.csproj", "{F218643D-2E74-4309-820E-206A54B7133F}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WindowsPlatform", "WindowsPlatform", "{EA393253-E9C8-422A-8CFD-4FDB529B3F8D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsPlatform", "src\addins\WindowsPlatform\WindowsPlatform\WindowsPlatform.csproj", "{459868D2-54DC-415B-B1AB-BE39BDBD352F}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WindowsPlatform", "WindowsPlatform", "{4AE0B284-72F2-49C7-9B42-812EBE379FFB}"
+ ProjectSection(MonoDevelopProperties) = preProject
+ BaseDirectory = src\addins\WindowsPlatform
+ EndProjectSection
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WindowsAPICodePack", "WindowsAPICodePack", "{6DD5F9E5-09D3-4763-A91B-E824812285CB}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WindowsAPICodePack", "WindowsAPICodePack", "{DA5A3BAC-74C9-4EF9-B2FF-BFA4BF38F80F}"
+ ProjectSection(MonoDevelopProperties) = preProject
+ BaseDirectory = src\addins\WindowsPlatform\WindowsAPICodePack
+ EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core", "src\addins\WindowsPlatform\WindowsAPICodePack\Core\Core.csproj", "{2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shell", "src\addins\WindowsPlatform\WindowsAPICodePack\Shell\Shell.csproj", "{AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsPlatform", "src\addins\WindowsPlatform\WindowsPlatform\WindowsPlatform.csproj", "{459868D2-54DC-415B-B1AB-BE39BDBD352F}"
+EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "contrib", "contrib", "{F12939F1-D55A-4CE9-9F33-8D959BFC7D6C}"
+ ProjectSection(MonoDevelopProperties) = preProject
+ BaseDirectory = external
+ EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Debugger.Soft", "external\debugger-libs\Mono.Debugger.Soft\Mono.Debugger.Soft.csproj", "{372E8E3E-29D5-4B4D-88A2-4711CD628C4E}"
EndProject
@@ -286,2042 +304,1618 @@ Global
DebugMac|Any CPU = DebugMac|Any CPU
DebugWin32|Any CPU = DebugWin32|Any CPU
Release|Any CPU = Release|Any CPU
- Debug|x86 = Debug|x86
- Release|x86 = Release|x86
- Debug|x64 = Debug|x64
- Release|x64 = Release|x64
- CodeAnalysisDebug|Any CPU = CodeAnalysisDebug|Any CPU
- CodeAnalysisDebug|x64 = CodeAnalysisDebug|x64
+ DebugGnome|Any CPU = DebugGnome|Any CPU
+ ReleaseMac|Any CPU = ReleaseMac|Any CPU
+ ReleaseGnome|Any CPU = ReleaseGnome|Any CPU
+ ReleaseWin32|Any CPU = ReleaseWin32|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {0413DB7D-8B35-423F-9752-D75C9225E7DE}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {0413DB7D-8B35-423F-9752-D75C9225E7DE}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {0413DB7D-8B35-423F-9752-D75C9225E7DE}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {0413DB7D-8B35-423F-9752-D75C9225E7DE}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
{0413DB7D-8B35-423F-9752-D75C9225E7DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0413DB7D-8B35-423F-9752-D75C9225E7DE}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {0413DB7D-8B35-423F-9752-D75C9225E7DE}.Debug|x64.ActiveCfg = Debug|Any CPU
- {0413DB7D-8B35-423F-9752-D75C9225E7DE}.Debug|x64.Build.0 = Debug|Any CPU
- {0413DB7D-8B35-423F-9752-D75C9225E7DE}.Debug|x86.ActiveCfg = Debug|Any CPU
- {0413DB7D-8B35-423F-9752-D75C9225E7DE}.Debug|x86.Build.0 = Debug|Any CPU
+ {0413DB7D-8B35-423F-9752-D75C9225E7DE}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {0413DB7D-8B35-423F-9752-D75C9225E7DE}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{0413DB7D-8B35-423F-9752-D75C9225E7DE}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{0413DB7D-8B35-423F-9752-D75C9225E7DE}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{0413DB7D-8B35-423F-9752-D75C9225E7DE}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{0413DB7D-8B35-423F-9752-D75C9225E7DE}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{0413DB7D-8B35-423F-9752-D75C9225E7DE}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {0413DB7D-8B35-423F-9752-D75C9225E7DE}.Release|x64.ActiveCfg = Release|Any CPU
- {0413DB7D-8B35-423F-9752-D75C9225E7DE}.Release|x64.Build.0 = Release|Any CPU
- {0413DB7D-8B35-423F-9752-D75C9225E7DE}.Release|x86.ActiveCfg = Release|Any CPU
- {0413DB7D-8B35-423F-9752-D75C9225E7DE}.Release|x86.Build.0 = Release|Any CPU
- {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|x86
- {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|x86
- {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.CodeAnalysisDebug|x64.ActiveCfg = Debug|x86
- {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.CodeAnalysisDebug|x64.Build.0 = Debug|x86
+ {0413DB7D-8B35-423F-9752-D75C9225E7DE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0413DB7D-8B35-423F-9752-D75C9225E7DE}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {0413DB7D-8B35-423F-9752-D75C9225E7DE}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {0413DB7D-8B35-423F-9752-D75C9225E7DE}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {0413DB7D-8B35-423F-9752-D75C9225E7DE}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {0413DB7D-8B35-423F-9752-D75C9225E7DE}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {0413DB7D-8B35-423F-9752-D75C9225E7DE}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.Debug|Any CPU.ActiveCfg = Debug|x86
{05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.Debug|Any CPU.Build.0 = Debug|x86
- {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.Debug|x64.ActiveCfg = Debug|x86
- {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.Debug|x64.Build.0 = Debug|x86
- {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.Debug|x86.ActiveCfg = Debug|x86
- {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.Debug|x86.Build.0 = Debug|x86
+ {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.DebugGnome|Any CPU.ActiveCfg = Debug|x86
+ {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.DebugGnome|Any CPU.Build.0 = Debug|x86
{05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.DebugMac|Any CPU.ActiveCfg = Debug|x86
{05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.DebugMac|Any CPU.Build.0 = Debug|x86
{05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.DebugWin32|Any CPU.ActiveCfg = Debug|x86
{05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.DebugWin32|Any CPU.Build.0 = Debug|x86
{05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.Release|Any CPU.ActiveCfg = Release|x86
- {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.Release|x64.ActiveCfg = Release|x86
- {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.Release|x64.Build.0 = Release|x86
- {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.Release|x86.ActiveCfg = Release|x86
- {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.Release|x86.Build.0 = Release|x86
- {07CC7654-27D6-421D-A64C-0FFA40456FA2}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {07CC7654-27D6-421D-A64C-0FFA40456FA2}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {07CC7654-27D6-421D-A64C-0FFA40456FA2}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {07CC7654-27D6-421D-A64C-0FFA40456FA2}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.Release|Any CPU.Build.0 = Release|x86
+ {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.ReleaseGnome|Any CPU.ActiveCfg = Release|x86
+ {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.ReleaseGnome|Any CPU.Build.0 = Release|x86
+ {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.ReleaseMac|Any CPU.ActiveCfg = Release|x86
+ {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.ReleaseMac|Any CPU.Build.0 = Release|x86
+ {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.ReleaseWin32|Any CPU.ActiveCfg = Release|x86
+ {05EDFE55-C8D1-47E4-BB61-0BC809CD82E2}.ReleaseWin32|Any CPU.Build.0 = Release|x86
{07CC7654-27D6-421D-A64C-0FFA40456FA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{07CC7654-27D6-421D-A64C-0FFA40456FA2}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {07CC7654-27D6-421D-A64C-0FFA40456FA2}.Debug|x64.ActiveCfg = Debug|Any CPU
- {07CC7654-27D6-421D-A64C-0FFA40456FA2}.Debug|x64.Build.0 = Debug|Any CPU
- {07CC7654-27D6-421D-A64C-0FFA40456FA2}.Debug|x86.ActiveCfg = Debug|Any CPU
- {07CC7654-27D6-421D-A64C-0FFA40456FA2}.Debug|x86.Build.0 = Debug|Any CPU
+ {07CC7654-27D6-421D-A64C-0FFA40456FA2}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {07CC7654-27D6-421D-A64C-0FFA40456FA2}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{07CC7654-27D6-421D-A64C-0FFA40456FA2}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{07CC7654-27D6-421D-A64C-0FFA40456FA2}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{07CC7654-27D6-421D-A64C-0FFA40456FA2}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{07CC7654-27D6-421D-A64C-0FFA40456FA2}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{07CC7654-27D6-421D-A64C-0FFA40456FA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {07CC7654-27D6-421D-A64C-0FFA40456FA2}.Release|x64.ActiveCfg = Release|Any CPU
- {07CC7654-27D6-421D-A64C-0FFA40456FA2}.Release|x64.Build.0 = Release|Any CPU
- {07CC7654-27D6-421D-A64C-0FFA40456FA2}.Release|x86.ActiveCfg = Release|Any CPU
- {07CC7654-27D6-421D-A64C-0FFA40456FA2}.Release|x86.Build.0 = Release|Any CPU
- {07F55155-51A8-4072-9F80-FA473666F086}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {07F55155-51A8-4072-9F80-FA473666F086}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {07F55155-51A8-4072-9F80-FA473666F086}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {07F55155-51A8-4072-9F80-FA473666F086}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {07CC7654-27D6-421D-A64C-0FFA40456FA2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {07CC7654-27D6-421D-A64C-0FFA40456FA2}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {07CC7654-27D6-421D-A64C-0FFA40456FA2}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {07CC7654-27D6-421D-A64C-0FFA40456FA2}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {07CC7654-27D6-421D-A64C-0FFA40456FA2}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {07CC7654-27D6-421D-A64C-0FFA40456FA2}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {07CC7654-27D6-421D-A64C-0FFA40456FA2}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{07F55155-51A8-4072-9F80-FA473666F086}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{07F55155-51A8-4072-9F80-FA473666F086}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {07F55155-51A8-4072-9F80-FA473666F086}.Debug|x64.ActiveCfg = Debug|Any CPU
- {07F55155-51A8-4072-9F80-FA473666F086}.Debug|x64.Build.0 = Debug|Any CPU
- {07F55155-51A8-4072-9F80-FA473666F086}.Debug|x86.ActiveCfg = Debug|Any CPU
- {07F55155-51A8-4072-9F80-FA473666F086}.Debug|x86.Build.0 = Debug|Any CPU
+ {07F55155-51A8-4072-9F80-FA473666F086}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {07F55155-51A8-4072-9F80-FA473666F086}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{07F55155-51A8-4072-9F80-FA473666F086}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{07F55155-51A8-4072-9F80-FA473666F086}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{07F55155-51A8-4072-9F80-FA473666F086}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{07F55155-51A8-4072-9F80-FA473666F086}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{07F55155-51A8-4072-9F80-FA473666F086}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {07F55155-51A8-4072-9F80-FA473666F086}.Release|x64.ActiveCfg = Release|Any CPU
- {07F55155-51A8-4072-9F80-FA473666F086}.Release|x64.Build.0 = Release|Any CPU
- {07F55155-51A8-4072-9F80-FA473666F086}.Release|x86.ActiveCfg = Release|Any CPU
- {07F55155-51A8-4072-9F80-FA473666F086}.Release|x86.Build.0 = Release|Any CPU
- {0AF16AF1-0876-413E-9803-08BD33C19E00}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {0AF16AF1-0876-413E-9803-08BD33C19E00}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {0AF16AF1-0876-413E-9803-08BD33C19E00}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {0AF16AF1-0876-413E-9803-08BD33C19E00}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {07F55155-51A8-4072-9F80-FA473666F086}.Release|Any CPU.Build.0 = Release|Any CPU
+ {07F55155-51A8-4072-9F80-FA473666F086}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {07F55155-51A8-4072-9F80-FA473666F086}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {07F55155-51A8-4072-9F80-FA473666F086}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {07F55155-51A8-4072-9F80-FA473666F086}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {07F55155-51A8-4072-9F80-FA473666F086}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {07F55155-51A8-4072-9F80-FA473666F086}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{0AF16AF1-0876-413E-9803-08BD33C19E00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0AF16AF1-0876-413E-9803-08BD33C19E00}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {0AF16AF1-0876-413E-9803-08BD33C19E00}.Debug|x64.ActiveCfg = Debug|Any CPU
- {0AF16AF1-0876-413E-9803-08BD33C19E00}.Debug|x64.Build.0 = Debug|Any CPU
- {0AF16AF1-0876-413E-9803-08BD33C19E00}.Debug|x86.ActiveCfg = Debug|Any CPU
- {0AF16AF1-0876-413E-9803-08BD33C19E00}.Debug|x86.Build.0 = Debug|Any CPU
+ {0AF16AF1-0876-413E-9803-08BD33C19E00}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {0AF16AF1-0876-413E-9803-08BD33C19E00}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{0AF16AF1-0876-413E-9803-08BD33C19E00}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{0AF16AF1-0876-413E-9803-08BD33C19E00}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{0AF16AF1-0876-413E-9803-08BD33C19E00}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{0AF16AF1-0876-413E-9803-08BD33C19E00}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{0AF16AF1-0876-413E-9803-08BD33C19E00}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {0AF16AF1-0876-413E-9803-08BD33C19E00}.Release|x64.ActiveCfg = Release|Any CPU
- {0AF16AF1-0876-413E-9803-08BD33C19E00}.Release|x64.Build.0 = Release|Any CPU
- {0AF16AF1-0876-413E-9803-08BD33C19E00}.Release|x86.ActiveCfg = Release|Any CPU
- {0AF16AF1-0876-413E-9803-08BD33C19E00}.Release|x86.Build.0 = Release|Any CPU
- {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {0AF16AF1-0876-413E-9803-08BD33C19E00}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0AF16AF1-0876-413E-9803-08BD33C19E00}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {0AF16AF1-0876-413E-9803-08BD33C19E00}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {0AF16AF1-0876-413E-9803-08BD33C19E00}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {0AF16AF1-0876-413E-9803-08BD33C19E00}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {0AF16AF1-0876-413E-9803-08BD33C19E00}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {0AF16AF1-0876-413E-9803-08BD33C19E00}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{0EA3AD14-404A-4D3F-979B-F087E2E70C82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0EA3AD14-404A-4D3F-979B-F087E2E70C82}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.Debug|x64.ActiveCfg = Debug|Any CPU
- {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.Debug|x64.Build.0 = Debug|Any CPU
- {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.Debug|x86.ActiveCfg = Debug|Any CPU
- {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.Debug|x86.Build.0 = Debug|Any CPU
+ {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{0EA3AD14-404A-4D3F-979B-F087E2E70C82}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{0EA3AD14-404A-4D3F-979B-F087E2E70C82}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{0EA3AD14-404A-4D3F-979B-F087E2E70C82}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{0EA3AD14-404A-4D3F-979B-F087E2E70C82}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{0EA3AD14-404A-4D3F-979B-F087E2E70C82}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.Release|x64.ActiveCfg = Release|Any CPU
- {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.Release|x64.Build.0 = Release|Any CPU
- {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.Release|x86.ActiveCfg = Release|Any CPU
- {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.Release|x86.Build.0 = Release|Any CPU
- {100568FC-F4E8-439B-94AD-41D11724E45B}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {100568FC-F4E8-439B-94AD-41D11724E45B}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {100568FC-F4E8-439B-94AD-41D11724E45B}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {100568FC-F4E8-439B-94AD-41D11724E45B}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {0EA3AD14-404A-4D3F-979B-F087E2E70C82}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{100568FC-F4E8-439B-94AD-41D11724E45B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{100568FC-F4E8-439B-94AD-41D11724E45B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {100568FC-F4E8-439B-94AD-41D11724E45B}.Debug|x64.ActiveCfg = Debug|Any CPU
- {100568FC-F4E8-439B-94AD-41D11724E45B}.Debug|x64.Build.0 = Debug|Any CPU
- {100568FC-F4E8-439B-94AD-41D11724E45B}.Debug|x86.ActiveCfg = Debug|Any CPU
- {100568FC-F4E8-439B-94AD-41D11724E45B}.Debug|x86.Build.0 = Debug|Any CPU
+ {100568FC-F4E8-439B-94AD-41D11724E45B}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {100568FC-F4E8-439B-94AD-41D11724E45B}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{100568FC-F4E8-439B-94AD-41D11724E45B}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{100568FC-F4E8-439B-94AD-41D11724E45B}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{100568FC-F4E8-439B-94AD-41D11724E45B}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{100568FC-F4E8-439B-94AD-41D11724E45B}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{100568FC-F4E8-439B-94AD-41D11724E45B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {100568FC-F4E8-439B-94AD-41D11724E45B}.Release|x64.ActiveCfg = Release|Any CPU
- {100568FC-F4E8-439B-94AD-41D11724E45B}.Release|x64.Build.0 = Release|Any CPU
- {100568FC-F4E8-439B-94AD-41D11724E45B}.Release|x86.ActiveCfg = Release|Any CPU
- {100568FC-F4E8-439B-94AD-41D11724E45B}.Release|x86.Build.0 = Release|Any CPU
- {1038FBD8-750E-4081-BC65-D89FFED3C881}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {1038FBD8-750E-4081-BC65-D89FFED3C881}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {1038FBD8-750E-4081-BC65-D89FFED3C881}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {1038FBD8-750E-4081-BC65-D89FFED3C881}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {100568FC-F4E8-439B-94AD-41D11724E45B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {100568FC-F4E8-439B-94AD-41D11724E45B}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {100568FC-F4E8-439B-94AD-41D11724E45B}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {100568FC-F4E8-439B-94AD-41D11724E45B}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {100568FC-F4E8-439B-94AD-41D11724E45B}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {100568FC-F4E8-439B-94AD-41D11724E45B}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {100568FC-F4E8-439B-94AD-41D11724E45B}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{1038FBD8-750E-4081-BC65-D89FFED3C881}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {1038FBD8-750E-4081-BC65-D89FFED3C881}.Debug|x64.ActiveCfg = Debug|Any CPU
- {1038FBD8-750E-4081-BC65-D89FFED3C881}.Debug|x64.Build.0 = Debug|Any CPU
- {1038FBD8-750E-4081-BC65-D89FFED3C881}.Debug|x86.ActiveCfg = Debug|Any CPU
- {1038FBD8-750E-4081-BC65-D89FFED3C881}.Debug|x86.Build.0 = Debug|Any CPU
+ {1038FBD8-750E-4081-BC65-D89FFED3C881}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
{1038FBD8-750E-4081-BC65-D89FFED3C881}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{1038FBD8-750E-4081-BC65-D89FFED3C881}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{1038FBD8-750E-4081-BC65-D89FFED3C881}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{1038FBD8-750E-4081-BC65-D89FFED3C881}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {1038FBD8-750E-4081-BC65-D89FFED3C881}.Release|Any CPU.Build.0 = Release|Any CPU
- {1038FBD8-750E-4081-BC65-D89FFED3C881}.Release|x64.ActiveCfg = Release|Any CPU
- {1038FBD8-750E-4081-BC65-D89FFED3C881}.Release|x64.Build.0 = Release|Any CPU
- {1038FBD8-750E-4081-BC65-D89FFED3C881}.Release|x86.ActiveCfg = Release|Any CPU
- {1038FBD8-750E-4081-BC65-D89FFED3C881}.Release|x86.Build.0 = Release|Any CPU
- {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {1038FBD8-750E-4081-BC65-D89FFED3C881}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {1038FBD8-750E-4081-BC65-D89FFED3C881}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {1038FBD8-750E-4081-BC65-D89FFED3C881}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {1038FBD8-750E-4081-BC65-D89FFED3C881}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.Debug|x64.ActiveCfg = Debug|Any CPU
- {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.Debug|x64.Build.0 = Debug|Any CPU
- {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.Debug|x86.ActiveCfg = Debug|Any CPU
- {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.Debug|x86.Build.0 = Debug|Any CPU
+ {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.Release|x64.ActiveCfg = Release|Any CPU
- {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.Release|x64.Build.0 = Release|Any CPU
- {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.Release|x86.ActiveCfg = Release|Any CPU
- {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.Release|x86.Build.0 = Release|Any CPU
- {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {1497D0A8-AFF1-4938-BC22-BE79B358BA5B}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.Debug|x64.ActiveCfg = Debug|Any CPU
- {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.Debug|x64.Build.0 = Debug|Any CPU
- {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.Debug|x86.ActiveCfg = Debug|Any CPU
- {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.Debug|x86.Build.0 = Debug|Any CPU
+ {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.Release|x64.ActiveCfg = Release|Any CPU
- {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.Release|x64.Build.0 = Release|Any CPU
- {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.Release|x86.ActiveCfg = Release|Any CPU
- {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.Release|x86.Build.0 = Release|Any CPU
- {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {174E6044-DD3A-49AB-9A5C-2A1F341B7B4F}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.Debug|x64.ActiveCfg = Debug|Any CPU
- {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.Debug|x64.Build.0 = Debug|Any CPU
- {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.Debug|x86.ActiveCfg = Debug|Any CPU
- {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.Debug|x86.Build.0 = Debug|Any CPU
+ {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.Release|x64.ActiveCfg = Release|Any CPU
- {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.Release|x64.Build.0 = Release|Any CPU
- {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.Release|x86.ActiveCfg = Release|Any CPU
- {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.Release|x86.Build.0 = Release|Any CPU
- {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{19DE0F35-D204-4FD8-A553-A19ECE05E24D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{19DE0F35-D204-4FD8-A553-A19ECE05E24D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.Debug|x64.ActiveCfg = Debug|Any CPU
- {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.Debug|x64.Build.0 = Debug|Any CPU
- {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.Debug|x86.ActiveCfg = Debug|Any CPU
- {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.Debug|x86.Build.0 = Debug|Any CPU
+ {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{19DE0F35-D204-4FD8-A553-A19ECE05E24D}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{19DE0F35-D204-4FD8-A553-A19ECE05E24D}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{19DE0F35-D204-4FD8-A553-A19ECE05E24D}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{19DE0F35-D204-4FD8-A553-A19ECE05E24D}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{19DE0F35-D204-4FD8-A553-A19ECE05E24D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.Release|x64.ActiveCfg = Release|Any CPU
- {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.Release|x64.Build.0 = Release|Any CPU
- {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.Release|x86.ActiveCfg = Release|Any CPU
- {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.Release|x86.Build.0 = Release|Any CPU
- {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {19DE0F35-D204-4FD8-A553-A19ECE05E24D}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.Debug|x64.ActiveCfg = Debug|Any CPU
- {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.Debug|x64.Build.0 = Debug|Any CPU
- {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.Debug|x86.ActiveCfg = Debug|Any CPU
- {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.Debug|x86.Build.0 = Debug|Any CPU
+ {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.Release|x64.ActiveCfg = Release|Any CPU
- {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.Release|x64.Build.0 = Release|Any CPU
- {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.Release|x86.ActiveCfg = Release|Any CPU
- {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.Release|x86.Build.0 = Release|Any CPU
- {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {1CF94D07-5480-4D10-A3CD-2EBD5E87B02E}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.Debug|x64.ActiveCfg = Debug|Any CPU
- {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.Debug|x64.Build.0 = Debug|Any CPU
- {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.Debug|x86.ActiveCfg = Debug|Any CPU
- {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.Debug|x86.Build.0 = Debug|Any CPU
+ {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.Release|x64.ActiveCfg = Release|Any CPU
- {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.Release|x64.Build.0 = Release|Any CPU
- {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.Release|x86.ActiveCfg = Release|Any CPU
- {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.Release|x86.Build.0 = Release|Any CPU
- {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {1F29B0A7-458F-4093-85DE-52E36EA2FC0E}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.Debug|x64.ActiveCfg = Debug|Any CPU
- {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.Debug|x64.Build.0 = Debug|Any CPU
- {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.Debug|x86.ActiveCfg = Debug|Any CPU
- {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.Debug|x86.Build.0 = Debug|Any CPU
+ {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.Release|x64.ActiveCfg = Release|Any CPU
- {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.Release|x64.Build.0 = Release|Any CPU
- {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.Release|x86.ActiveCfg = Release|Any CPU
- {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.Release|x86.Build.0 = Release|Any CPU
- {252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {2357AABD-08C7-4808-A495-8FF2D3CDFDB0}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.Debug|x64.ActiveCfg = Debug|Any CPU
- {252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.Debug|x64.Build.0 = Debug|Any CPU
- {252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.Debug|x86.ActiveCfg = Debug|Any CPU
- {252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.Debug|x86.Build.0 = Debug|Any CPU
+ {252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
{252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.Release|Any CPU.Build.0 = Release|Any CPU
- {252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.Release|x64.ActiveCfg = Release|Any CPU
- {252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.Release|x64.Build.0 = Release|Any CPU
- {252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.Release|x86.ActiveCfg = Release|Any CPU
- {252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.Release|x86.Build.0 = Release|Any CPU
- {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {252117CA-0ABB-4F36-BFC8-DE23A8089BB9}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.Debug|x64.ActiveCfg = Debug|Any CPU
- {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.Debug|x64.Build.0 = Debug|Any CPU
- {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.Debug|x86.ActiveCfg = Debug|Any CPU
- {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.Debug|x86.Build.0 = Debug|Any CPU
+ {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.Release|Any CPU.Build.0 = Release|Any CPU
- {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.Release|x64.ActiveCfg = Release|Any CPU
- {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.Release|x64.Build.0 = Release|Any CPU
- {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.Release|x86.ActiveCfg = Release|Any CPU
- {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.Release|x86.Build.0 = Release|Any CPU
- {27096E7F-C91C-4AC6-B289-6897A701DF21}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {27096E7F-C91C-4AC6-B289-6897A701DF21}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {27096E7F-C91C-4AC6-B289-6897A701DF21}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {27096E7F-C91C-4AC6-B289-6897A701DF21}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{27096E7F-C91C-4AC6-B289-6897A701DF21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{27096E7F-C91C-4AC6-B289-6897A701DF21}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {27096E7F-C91C-4AC6-B289-6897A701DF21}.Debug|x64.ActiveCfg = Debug|Any CPU
- {27096E7F-C91C-4AC6-B289-6897A701DF21}.Debug|x64.Build.0 = Debug|Any CPU
- {27096E7F-C91C-4AC6-B289-6897A701DF21}.Debug|x86.ActiveCfg = Debug|Any CPU
- {27096E7F-C91C-4AC6-B289-6897A701DF21}.Debug|x86.Build.0 = Debug|Any CPU
+ {27096E7F-C91C-4AC6-B289-6897A701DF21}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {27096E7F-C91C-4AC6-B289-6897A701DF21}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{27096E7F-C91C-4AC6-B289-6897A701DF21}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{27096E7F-C91C-4AC6-B289-6897A701DF21}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{27096E7F-C91C-4AC6-B289-6897A701DF21}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{27096E7F-C91C-4AC6-B289-6897A701DF21}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{27096E7F-C91C-4AC6-B289-6897A701DF21}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {27096E7F-C91C-4AC6-B289-6897A701DF21}.Release|x64.ActiveCfg = Release|Any CPU
- {27096E7F-C91C-4AC6-B289-6897A701DF21}.Release|x64.Build.0 = Release|Any CPU
- {27096E7F-C91C-4AC6-B289-6897A701DF21}.Release|x86.ActiveCfg = Release|Any CPU
- {27096E7F-C91C-4AC6-B289-6897A701DF21}.Release|x86.Build.0 = Release|Any CPU
- {2A00A871-C641-4116-ADFD-29B7799952B4}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {2A00A871-C641-4116-ADFD-29B7799952B4}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {2A00A871-C641-4116-ADFD-29B7799952B4}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {2A00A871-C641-4116-ADFD-29B7799952B4}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {27096E7F-C91C-4AC6-B289-6897A701DF21}.Release|Any CPU.Build.0 = Release|Any CPU
+ {27096E7F-C91C-4AC6-B289-6897A701DF21}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {27096E7F-C91C-4AC6-B289-6897A701DF21}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {27096E7F-C91C-4AC6-B289-6897A701DF21}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {27096E7F-C91C-4AC6-B289-6897A701DF21}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {27096E7F-C91C-4AC6-B289-6897A701DF21}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {27096E7F-C91C-4AC6-B289-6897A701DF21}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{2A00A871-C641-4116-ADFD-29B7799952B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2A00A871-C641-4116-ADFD-29B7799952B4}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2A00A871-C641-4116-ADFD-29B7799952B4}.Debug|x64.ActiveCfg = Debug|Any CPU
- {2A00A871-C641-4116-ADFD-29B7799952B4}.Debug|x64.Build.0 = Debug|Any CPU
- {2A00A871-C641-4116-ADFD-29B7799952B4}.Debug|x86.ActiveCfg = Debug|Any CPU
- {2A00A871-C641-4116-ADFD-29B7799952B4}.Debug|x86.Build.0 = Debug|Any CPU
+ {2A00A871-C641-4116-ADFD-29B7799952B4}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {2A00A871-C641-4116-ADFD-29B7799952B4}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{2A00A871-C641-4116-ADFD-29B7799952B4}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{2A00A871-C641-4116-ADFD-29B7799952B4}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{2A00A871-C641-4116-ADFD-29B7799952B4}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{2A00A871-C641-4116-ADFD-29B7799952B4}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{2A00A871-C641-4116-ADFD-29B7799952B4}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2A00A871-C641-4116-ADFD-29B7799952B4}.Release|x64.ActiveCfg = Release|Any CPU
- {2A00A871-C641-4116-ADFD-29B7799952B4}.Release|x64.Build.0 = Release|Any CPU
- {2A00A871-C641-4116-ADFD-29B7799952B4}.Release|x86.ActiveCfg = Release|Any CPU
- {2A00A871-C641-4116-ADFD-29B7799952B4}.Release|x86.Build.0 = Release|Any CPU
- {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.CodeAnalysisDebug|Any CPU.ActiveCfg = Release|Any CPU
- {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.CodeAnalysisDebug|Any CPU.Build.0 = Release|Any CPU
- {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.CodeAnalysisDebug|x64.ActiveCfg = Release|Any CPU
- {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.CodeAnalysisDebug|x64.Build.0 = Release|Any CPU
+ {2A00A871-C641-4116-ADFD-29B7799952B4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2A00A871-C641-4116-ADFD-29B7799952B4}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {2A00A871-C641-4116-ADFD-29B7799952B4}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {2A00A871-C641-4116-ADFD-29B7799952B4}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {2A00A871-C641-4116-ADFD-29B7799952B4}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {2A00A871-C641-4116-ADFD-29B7799952B4}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {2A00A871-C641-4116-ADFD-29B7799952B4}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.Debug|x64.ActiveCfg = Debug|Any CPU
- {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.Debug|x64.Build.0 = Debug|Any CPU
- {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.Debug|x86.ActiveCfg = Debug|Any CPU
- {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.Debug|x86.Build.0 = Debug|Any CPU
+ {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.Release|Any CPU.Build.0 = Release|Any CPU
- {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.Release|x64.ActiveCfg = Release|Any CPU
- {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.Release|x64.Build.0 = Release|Any CPU
- {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.Release|x86.ActiveCfg = Release|Any CPU
- {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.Release|x86.Build.0 = Release|Any CPU
- {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {2A705FC6-1A9E-4941-9E47-254D79F2D9D5}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.Debug|x64.ActiveCfg = Debug|Any CPU
- {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.Debug|x64.Build.0 = Debug|Any CPU
- {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.Debug|x86.ActiveCfg = Debug|Any CPU
- {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.Debug|x86.Build.0 = Debug|Any CPU
+ {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.Release|Any CPU.Build.0 = Release|Any CPU
- {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.Release|x64.ActiveCfg = Release|Any CPU
- {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.Release|x64.Build.0 = Release|Any CPU
- {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.Release|x86.ActiveCfg = Release|Any CPU
- {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.Release|x86.Build.0 = Release|Any CPU
- {2C24D515-4A2C-445C-8419-C09231913CFA}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {2C24D515-4A2C-445C-8419-C09231913CFA}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {2C24D515-4A2C-445C-8419-C09231913CFA}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {2C24D515-4A2C-445C-8419-C09231913CFA}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {2B8F4F83-C2B3-4E84-A27B-8DEE1BE0E006}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{2C24D515-4A2C-445C-8419-C09231913CFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2C24D515-4A2C-445C-8419-C09231913CFA}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2C24D515-4A2C-445C-8419-C09231913CFA}.Debug|x64.ActiveCfg = Debug|Any CPU
- {2C24D515-4A2C-445C-8419-C09231913CFA}.Debug|x64.Build.0 = Debug|Any CPU
- {2C24D515-4A2C-445C-8419-C09231913CFA}.Debug|x86.ActiveCfg = Debug|Any CPU
- {2C24D515-4A2C-445C-8419-C09231913CFA}.Debug|x86.Build.0 = Debug|Any CPU
+ {2C24D515-4A2C-445C-8419-C09231913CFA}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {2C24D515-4A2C-445C-8419-C09231913CFA}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{2C24D515-4A2C-445C-8419-C09231913CFA}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{2C24D515-4A2C-445C-8419-C09231913CFA}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{2C24D515-4A2C-445C-8419-C09231913CFA}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{2C24D515-4A2C-445C-8419-C09231913CFA}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{2C24D515-4A2C-445C-8419-C09231913CFA}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2C24D515-4A2C-445C-8419-C09231913CFA}.Release|x64.ActiveCfg = Release|Any CPU
- {2C24D515-4A2C-445C-8419-C09231913CFA}.Release|x64.Build.0 = Release|Any CPU
- {2C24D515-4A2C-445C-8419-C09231913CFA}.Release|x86.ActiveCfg = Release|Any CPU
- {2C24D515-4A2C-445C-8419-C09231913CFA}.Release|x86.Build.0 = Release|Any CPU
- {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.CodeAnalysisDebug|x64.ActiveCfg = Debug|x64
- {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.CodeAnalysisDebug|x64.Build.0 = Debug|x64
+ {2C24D515-4A2C-445C-8419-C09231913CFA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2C24D515-4A2C-445C-8419-C09231913CFA}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {2C24D515-4A2C-445C-8419-C09231913CFA}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {2C24D515-4A2C-445C-8419-C09231913CFA}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {2C24D515-4A2C-445C-8419-C09231913CFA}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {2C24D515-4A2C-445C-8419-C09231913CFA}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {2C24D515-4A2C-445C-8419-C09231913CFA}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Debug|x64.ActiveCfg = Debug|x64
- {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Debug|x64.Build.0 = Debug|x64
- {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Debug|x86.ActiveCfg = Debug|Any CPU
- {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Debug|x86.Build.0 = Debug|Any CPU
+ {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
{2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Release|Any CPU.Build.0 = Release|Any CPU
- {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Release|x64.ActiveCfg = Release|x64
- {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Release|x64.Build.0 = Release|x64
- {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Release|x86.ActiveCfg = Release|Any CPU
- {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Release|x86.Build.0 = Release|Any CPU
- {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Debug|x64.ActiveCfg = Debug|Any CPU
- {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Debug|x64.Build.0 = Debug|Any CPU
- {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Debug|x86.ActiveCfg = Debug|Any CPU
- {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Debug|x86.Build.0 = Debug|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Release|x64.ActiveCfg = Release|Any CPU
- {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Release|x64.Build.0 = Release|Any CPU
- {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Release|x86.ActiveCfg = Release|Any CPU
- {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Release|x86.Build.0 = Release|Any CPU
- {376889B5-6504-46A1-9D18-A9E4B4A50F49}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {376889B5-6504-46A1-9D18-A9E4B4A50F49}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {376889B5-6504-46A1-9D18-A9E4B4A50F49}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {376889B5-6504-46A1-9D18-A9E4B4A50F49}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{376889B5-6504-46A1-9D18-A9E4B4A50F49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{376889B5-6504-46A1-9D18-A9E4B4A50F49}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {376889B5-6504-46A1-9D18-A9E4B4A50F49}.Debug|x64.ActiveCfg = Debug|Any CPU
- {376889B5-6504-46A1-9D18-A9E4B4A50F49}.Debug|x64.Build.0 = Debug|Any CPU
- {376889B5-6504-46A1-9D18-A9E4B4A50F49}.Debug|x86.ActiveCfg = Debug|Any CPU
- {376889B5-6504-46A1-9D18-A9E4B4A50F49}.Debug|x86.Build.0 = Debug|Any CPU
+ {376889B5-6504-46A1-9D18-A9E4B4A50F49}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {376889B5-6504-46A1-9D18-A9E4B4A50F49}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{376889B5-6504-46A1-9D18-A9E4B4A50F49}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{376889B5-6504-46A1-9D18-A9E4B4A50F49}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{376889B5-6504-46A1-9D18-A9E4B4A50F49}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{376889B5-6504-46A1-9D18-A9E4B4A50F49}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {376889B5-6504-46A1-9D18-A9E4B4A50F49}.Release|x64.ActiveCfg = Release|Any CPU
- {376889B5-6504-46A1-9D18-A9E4B4A50F49}.Release|x64.Build.0 = Release|Any CPU
- {376889B5-6504-46A1-9D18-A9E4B4A50F49}.Release|x86.ActiveCfg = Release|Any CPU
- {376889B5-6504-46A1-9D18-A9E4B4A50F49}.Release|x86.Build.0 = Release|Any CPU
- {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {376889B5-6504-46A1-9D18-A9E4B4A50F49}.Release|Any CPU.Build.0 = Release|Any CPU
+ {376889B5-6504-46A1-9D18-A9E4B4A50F49}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {376889B5-6504-46A1-9D18-A9E4B4A50F49}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {376889B5-6504-46A1-9D18-A9E4B4A50F49}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {376889B5-6504-46A1-9D18-A9E4B4A50F49}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {376889B5-6504-46A1-9D18-A9E4B4A50F49}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Debug|x64.ActiveCfg = Debug|Any CPU
- {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Debug|x64.Build.0 = Debug|Any CPU
- {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Debug|x86.ActiveCfg = Debug|Any CPU
- {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Debug|x86.Build.0 = Debug|Any CPU
+ {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Release|x64.ActiveCfg = Release|Any CPU
- {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Release|x64.Build.0 = Release|Any CPU
- {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Release|x86.ActiveCfg = Release|Any CPU
- {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Release|x86.Build.0 = Release|Any CPU
- {3D363F0C-5731-42AA-9022-B7F4657F298A}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {3D363F0C-5731-42AA-9022-B7F4657F298A}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {3D363F0C-5731-42AA-9022-B7F4657F298A}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {3D363F0C-5731-42AA-9022-B7F4657F298A}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{3D363F0C-5731-42AA-9022-B7F4657F298A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3D363F0C-5731-42AA-9022-B7F4657F298A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {3D363F0C-5731-42AA-9022-B7F4657F298A}.Debug|x64.ActiveCfg = Debug|Any CPU
- {3D363F0C-5731-42AA-9022-B7F4657F298A}.Debug|x64.Build.0 = Debug|Any CPU
- {3D363F0C-5731-42AA-9022-B7F4657F298A}.Debug|x86.ActiveCfg = Debug|Any CPU
- {3D363F0C-5731-42AA-9022-B7F4657F298A}.Debug|x86.Build.0 = Debug|Any CPU
+ {3D363F0C-5731-42AA-9022-B7F4657F298A}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {3D363F0C-5731-42AA-9022-B7F4657F298A}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{3D363F0C-5731-42AA-9022-B7F4657F298A}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{3D363F0C-5731-42AA-9022-B7F4657F298A}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{3D363F0C-5731-42AA-9022-B7F4657F298A}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{3D363F0C-5731-42AA-9022-B7F4657F298A}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{3D363F0C-5731-42AA-9022-B7F4657F298A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {3D363F0C-5731-42AA-9022-B7F4657F298A}.Release|x64.ActiveCfg = Release|Any CPU
- {3D363F0C-5731-42AA-9022-B7F4657F298A}.Release|x64.Build.0 = Release|Any CPU
- {3D363F0C-5731-42AA-9022-B7F4657F298A}.Release|x86.ActiveCfg = Release|Any CPU
- {3D363F0C-5731-42AA-9022-B7F4657F298A}.Release|x86.Build.0 = Release|Any CPU
- {42D1CE65-A14B-4218-B787-58AD7AA68513}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {42D1CE65-A14B-4218-B787-58AD7AA68513}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {42D1CE65-A14B-4218-B787-58AD7AA68513}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {42D1CE65-A14B-4218-B787-58AD7AA68513}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {3D363F0C-5731-42AA-9022-B7F4657F298A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3D363F0C-5731-42AA-9022-B7F4657F298A}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {3D363F0C-5731-42AA-9022-B7F4657F298A}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {3D363F0C-5731-42AA-9022-B7F4657F298A}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {3D363F0C-5731-42AA-9022-B7F4657F298A}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {3D363F0C-5731-42AA-9022-B7F4657F298A}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {3D363F0C-5731-42AA-9022-B7F4657F298A}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{42D1CE65-A14B-4218-B787-58AD7AA68513}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{42D1CE65-A14B-4218-B787-58AD7AA68513}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {42D1CE65-A14B-4218-B787-58AD7AA68513}.Debug|x64.ActiveCfg = Debug|Any CPU
- {42D1CE65-A14B-4218-B787-58AD7AA68513}.Debug|x64.Build.0 = Debug|Any CPU
- {42D1CE65-A14B-4218-B787-58AD7AA68513}.Debug|x86.ActiveCfg = Debug|Any CPU
- {42D1CE65-A14B-4218-B787-58AD7AA68513}.Debug|x86.Build.0 = Debug|Any CPU
+ {42D1CE65-A14B-4218-B787-58AD7AA68513}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {42D1CE65-A14B-4218-B787-58AD7AA68513}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{42D1CE65-A14B-4218-B787-58AD7AA68513}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{42D1CE65-A14B-4218-B787-58AD7AA68513}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{42D1CE65-A14B-4218-B787-58AD7AA68513}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{42D1CE65-A14B-4218-B787-58AD7AA68513}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{42D1CE65-A14B-4218-B787-58AD7AA68513}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {42D1CE65-A14B-4218-B787-58AD7AA68513}.Release|x64.ActiveCfg = Release|Any CPU
- {42D1CE65-A14B-4218-B787-58AD7AA68513}.Release|x64.Build.0 = Release|Any CPU
- {42D1CE65-A14B-4218-B787-58AD7AA68513}.Release|x86.ActiveCfg = Release|Any CPU
- {42D1CE65-A14B-4218-B787-58AD7AA68513}.Release|x86.Build.0 = Release|Any CPU
- {459868D2-54DC-415B-B1AB-BE39BDBD352F}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {459868D2-54DC-415B-B1AB-BE39BDBD352F}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {459868D2-54DC-415B-B1AB-BE39BDBD352F}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {459868D2-54DC-415B-B1AB-BE39BDBD352F}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {42D1CE65-A14B-4218-B787-58AD7AA68513}.Release|Any CPU.Build.0 = Release|Any CPU
+ {42D1CE65-A14B-4218-B787-58AD7AA68513}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {42D1CE65-A14B-4218-B787-58AD7AA68513}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {42D1CE65-A14B-4218-B787-58AD7AA68513}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {42D1CE65-A14B-4218-B787-58AD7AA68513}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {42D1CE65-A14B-4218-B787-58AD7AA68513}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {42D1CE65-A14B-4218-B787-58AD7AA68513}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{459868D2-54DC-415B-B1AB-BE39BDBD352F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {459868D2-54DC-415B-B1AB-BE39BDBD352F}.Debug|x64.ActiveCfg = Debug|Any CPU
- {459868D2-54DC-415B-B1AB-BE39BDBD352F}.Debug|x64.Build.0 = Debug|Any CPU
- {459868D2-54DC-415B-B1AB-BE39BDBD352F}.Debug|x86.ActiveCfg = Debug|Any CPU
- {459868D2-54DC-415B-B1AB-BE39BDBD352F}.Debug|x86.Build.0 = Debug|Any CPU
+ {459868D2-54DC-415B-B1AB-BE39BDBD352F}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
{459868D2-54DC-415B-B1AB-BE39BDBD352F}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{459868D2-54DC-415B-B1AB-BE39BDBD352F}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{459868D2-54DC-415B-B1AB-BE39BDBD352F}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{459868D2-54DC-415B-B1AB-BE39BDBD352F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {459868D2-54DC-415B-B1AB-BE39BDBD352F}.Release|Any CPU.Build.0 = Release|Any CPU
- {459868D2-54DC-415B-B1AB-BE39BDBD352F}.Release|x64.ActiveCfg = Release|Any CPU
- {459868D2-54DC-415B-B1AB-BE39BDBD352F}.Release|x64.Build.0 = Release|Any CPU
- {459868D2-54DC-415B-B1AB-BE39BDBD352F}.Release|x86.ActiveCfg = Release|Any CPU
- {459868D2-54DC-415B-B1AB-BE39BDBD352F}.Release|x86.Build.0 = Release|Any CPU
- {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {459868D2-54DC-415B-B1AB-BE39BDBD352F}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {459868D2-54DC-415B-B1AB-BE39BDBD352F}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {459868D2-54DC-415B-B1AB-BE39BDBD352F}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {459868D2-54DC-415B-B1AB-BE39BDBD352F}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.Debug|x64.ActiveCfg = Debug|Any CPU
- {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.Debug|x64.Build.0 = Debug|Any CPU
- {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.Debug|x86.ActiveCfg = Debug|Any CPU
- {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.Debug|x86.Build.0 = Debug|Any CPU
+ {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.Release|Any CPU.Build.0 = Release|Any CPU
- {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.Release|x64.ActiveCfg = Release|Any CPU
- {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.Release|x64.Build.0 = Release|Any CPU
- {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.Release|x86.ActiveCfg = Release|Any CPU
- {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.Release|x86.Build.0 = Release|Any CPU
- {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {495E53B3-F3AF-4C4F-BAAF-865EFAA2F4A9}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.Debug|x64.ActiveCfg = Debug|Any CPU
- {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.Debug|x64.Build.0 = Debug|Any CPU
- {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.Debug|x86.ActiveCfg = Debug|Any CPU
- {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.Debug|x86.Build.0 = Debug|Any CPU
+ {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.Release|x64.ActiveCfg = Release|Any CPU
- {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.Release|x64.Build.0 = Release|Any CPU
- {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.Release|x86.ActiveCfg = Release|Any CPU
- {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.Release|x86.Build.0 = Release|Any CPU
- {50D6768C-C072-4E79-AFC5-C1C40767EF45}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {50D6768C-C072-4E79-AFC5-C1C40767EF45}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {50D6768C-C072-4E79-AFC5-C1C40767EF45}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {50D6768C-C072-4E79-AFC5-C1C40767EF45}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {4CB170EF-DFE6-4A56-9E1B-A85449E827A7}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{50D6768C-C072-4E79-AFC5-C1C40767EF45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {50D6768C-C072-4E79-AFC5-C1C40767EF45}.Debug|x64.ActiveCfg = Debug|Any CPU
- {50D6768C-C072-4E79-AFC5-C1C40767EF45}.Debug|x64.Build.0 = Debug|Any CPU
- {50D6768C-C072-4E79-AFC5-C1C40767EF45}.Debug|x86.ActiveCfg = Debug|Any CPU
- {50D6768C-C072-4E79-AFC5-C1C40767EF45}.Debug|x86.Build.0 = Debug|Any CPU
+ {50D6768C-C072-4E79-AFC5-C1C40767EF45}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
{50D6768C-C072-4E79-AFC5-C1C40767EF45}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{50D6768C-C072-4E79-AFC5-C1C40767EF45}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{50D6768C-C072-4E79-AFC5-C1C40767EF45}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{50D6768C-C072-4E79-AFC5-C1C40767EF45}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {50D6768C-C072-4E79-AFC5-C1C40767EF45}.Release|x64.ActiveCfg = Release|Any CPU
- {50D6768C-C072-4E79-AFC5-C1C40767EF45}.Release|x64.Build.0 = Release|Any CPU
- {50D6768C-C072-4E79-AFC5-C1C40767EF45}.Release|x86.ActiveCfg = Release|Any CPU
- {50D6768C-C072-4E79-AFC5-C1C40767EF45}.Release|x86.Build.0 = Release|Any CPU
- {53DCA265-3C3C-42F9-B647-F72BA678122B}.CodeAnalysisDebug|Any CPU.ActiveCfg = Release|Any CPU
- {53DCA265-3C3C-42F9-B647-F72BA678122B}.CodeAnalysisDebug|Any CPU.Build.0 = Release|Any CPU
- {53DCA265-3C3C-42F9-B647-F72BA678122B}.CodeAnalysisDebug|x64.ActiveCfg = Release|Any CPU
- {53DCA265-3C3C-42F9-B647-F72BA678122B}.CodeAnalysisDebug|x64.Build.0 = Release|Any CPU
+ {50D6768C-C072-4E79-AFC5-C1C40767EF45}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {50D6768C-C072-4E79-AFC5-C1C40767EF45}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {50D6768C-C072-4E79-AFC5-C1C40767EF45}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {50D6768C-C072-4E79-AFC5-C1C40767EF45}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
{53DCA265-3C3C-42F9-B647-F72BA678122B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{53DCA265-3C3C-42F9-B647-F72BA678122B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {53DCA265-3C3C-42F9-B647-F72BA678122B}.Debug|x64.ActiveCfg = Debug|Any CPU
- {53DCA265-3C3C-42F9-B647-F72BA678122B}.Debug|x64.Build.0 = Debug|Any CPU
- {53DCA265-3C3C-42F9-B647-F72BA678122B}.Debug|x86.ActiveCfg = Debug|Any CPU
- {53DCA265-3C3C-42F9-B647-F72BA678122B}.Debug|x86.Build.0 = Debug|Any CPU
+ {53DCA265-3C3C-42F9-B647-F72BA678122B}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {53DCA265-3C3C-42F9-B647-F72BA678122B}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{53DCA265-3C3C-42F9-B647-F72BA678122B}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{53DCA265-3C3C-42F9-B647-F72BA678122B}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{53DCA265-3C3C-42F9-B647-F72BA678122B}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{53DCA265-3C3C-42F9-B647-F72BA678122B}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{53DCA265-3C3C-42F9-B647-F72BA678122B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {53DCA265-3C3C-42F9-B647-F72BA678122B}.Release|x64.ActiveCfg = Release|Any CPU
- {53DCA265-3C3C-42F9-B647-F72BA678122B}.Release|x64.Build.0 = Release|Any CPU
- {53DCA265-3C3C-42F9-B647-F72BA678122B}.Release|x86.ActiveCfg = Release|Any CPU
- {53DCA265-3C3C-42F9-B647-F72BA678122B}.Release|x86.Build.0 = Release|Any CPU
- {63D3B27A-D966-4902-90B3-30290E1692F1}.CodeAnalysisDebug|Any CPU.ActiveCfg = Release|Any CPU
- {63D3B27A-D966-4902-90B3-30290E1692F1}.CodeAnalysisDebug|Any CPU.Build.0 = Release|Any CPU
- {63D3B27A-D966-4902-90B3-30290E1692F1}.CodeAnalysisDebug|x64.ActiveCfg = Release|Any CPU
- {63D3B27A-D966-4902-90B3-30290E1692F1}.CodeAnalysisDebug|x64.Build.0 = Release|Any CPU
+ {53DCA265-3C3C-42F9-B647-F72BA678122B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {53DCA265-3C3C-42F9-B647-F72BA678122B}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {53DCA265-3C3C-42F9-B647-F72BA678122B}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {53DCA265-3C3C-42F9-B647-F72BA678122B}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {53DCA265-3C3C-42F9-B647-F72BA678122B}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {53DCA265-3C3C-42F9-B647-F72BA678122B}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {53DCA265-3C3C-42F9-B647-F72BA678122B}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{63D3B27A-D966-4902-90B3-30290E1692F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{63D3B27A-D966-4902-90B3-30290E1692F1}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {63D3B27A-D966-4902-90B3-30290E1692F1}.Debug|x64.ActiveCfg = Debug|Any CPU
- {63D3B27A-D966-4902-90B3-30290E1692F1}.Debug|x64.Build.0 = Debug|Any CPU
- {63D3B27A-D966-4902-90B3-30290E1692F1}.Debug|x86.ActiveCfg = Debug|x86
- {63D3B27A-D966-4902-90B3-30290E1692F1}.Debug|x86.Build.0 = Debug|x86
+ {63D3B27A-D966-4902-90B3-30290E1692F1}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {63D3B27A-D966-4902-90B3-30290E1692F1}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{63D3B27A-D966-4902-90B3-30290E1692F1}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{63D3B27A-D966-4902-90B3-30290E1692F1}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{63D3B27A-D966-4902-90B3-30290E1692F1}.DebugWin32|Any CPU.ActiveCfg = Debug|x86
{63D3B27A-D966-4902-90B3-30290E1692F1}.DebugWin32|Any CPU.Build.0 = Debug|x86
{63D3B27A-D966-4902-90B3-30290E1692F1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{63D3B27A-D966-4902-90B3-30290E1692F1}.Release|Any CPU.Build.0 = Release|Any CPU
- {63D3B27A-D966-4902-90B3-30290E1692F1}.Release|x64.ActiveCfg = Release|Any CPU
- {63D3B27A-D966-4902-90B3-30290E1692F1}.Release|x64.Build.0 = Release|Any CPU
- {63D3B27A-D966-4902-90B3-30290E1692F1}.Release|x86.ActiveCfg = Release|x86
- {63D3B27A-D966-4902-90B3-30290E1692F1}.Release|x86.Build.0 = Release|x86
- {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.CodeAnalysisDebug|Any CPU.ActiveCfg = net_2_0_Debug|Any CPU
- {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.CodeAnalysisDebug|Any CPU.Build.0 = net_2_0_Debug|Any CPU
- {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.CodeAnalysisDebug|x64.ActiveCfg = net_2_0_Debug|Any CPU
- {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.CodeAnalysisDebug|x64.Build.0 = net_2_0_Debug|Any CPU
+ {63D3B27A-D966-4902-90B3-30290E1692F1}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {63D3B27A-D966-4902-90B3-30290E1692F1}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {63D3B27A-D966-4902-90B3-30290E1692F1}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {63D3B27A-D966-4902-90B3-30290E1692F1}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {63D3B27A-D966-4902-90B3-30290E1692F1}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {63D3B27A-D966-4902-90B3-30290E1692F1}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU
- {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.Debug|x64.ActiveCfg = net_2_0_Debug|Any CPU
- {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.Debug|x64.Build.0 = net_2_0_Debug|Any CPU
- {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.Debug|x86.ActiveCfg = net_2_0_Debug|Any CPU
- {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.Debug|x86.Build.0 = net_2_0_Debug|Any CPU
+ {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.DebugGnome|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU
+ {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.DebugGnome|Any CPU.Build.0 = net_4_0_Debug|Any CPU
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.DebugMac|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.DebugMac|Any CPU.Build.0 = net_4_0_Debug|Any CPU
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.DebugWin32|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.DebugWin32|Any CPU.Build.0 = net_4_0_Debug|Any CPU
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU
- {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.Release|x64.ActiveCfg = net_2_0_Debug|Any CPU
- {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.Release|x64.Build.0 = net_2_0_Debug|Any CPU
- {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.Release|x86.ActiveCfg = net_2_0_Debug|Any CPU
- {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.Release|x86.Build.0 = net_2_0_Debug|Any CPU
- {69136056-BFD3-4CEC-BB41-D9991C79593C}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {69136056-BFD3-4CEC-BB41-D9991C79593C}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {69136056-BFD3-4CEC-BB41-D9991C79593C}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {69136056-BFD3-4CEC-BB41-D9991C79593C}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.Release|Any CPU.Build.0 = net_4_0_Release|Any CPU
+ {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.ReleaseGnome|Any CPU.ActiveCfg = net_4_0_Release|Any CPU
+ {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.ReleaseGnome|Any CPU.Build.0 = net_4_0_Release|Any CPU
+ {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.ReleaseMac|Any CPU.ActiveCfg = net_4_0_Release|Any CPU
+ {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.ReleaseMac|Any CPU.Build.0 = net_4_0_Release|Any CPU
+ {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.ReleaseWin32|Any CPU.ActiveCfg = net_4_0_Release|Any CPU
+ {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.ReleaseWin32|Any CPU.Build.0 = net_4_0_Release|Any CPU
{69136056-BFD3-4CEC-BB41-D9991C79593C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {69136056-BFD3-4CEC-BB41-D9991C79593C}.Debug|x64.ActiveCfg = Debug|Any CPU
- {69136056-BFD3-4CEC-BB41-D9991C79593C}.Debug|x64.Build.0 = Debug|Any CPU
- {69136056-BFD3-4CEC-BB41-D9991C79593C}.Debug|x86.ActiveCfg = Debug|Any CPU
- {69136056-BFD3-4CEC-BB41-D9991C79593C}.Debug|x86.Build.0 = Debug|Any CPU
+ {69136056-BFD3-4CEC-BB41-D9991C79593C}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
{69136056-BFD3-4CEC-BB41-D9991C79593C}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{69136056-BFD3-4CEC-BB41-D9991C79593C}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{69136056-BFD3-4CEC-BB41-D9991C79593C}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{69136056-BFD3-4CEC-BB41-D9991C79593C}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {69136056-BFD3-4CEC-BB41-D9991C79593C}.Release|x64.ActiveCfg = Release|Any CPU
- {69136056-BFD3-4CEC-BB41-D9991C79593C}.Release|x64.Build.0 = Release|Any CPU
- {69136056-BFD3-4CEC-BB41-D9991C79593C}.Release|x86.ActiveCfg = Release|Any CPU
- {69136056-BFD3-4CEC-BB41-D9991C79593C}.Release|x86.Build.0 = Release|Any CPU
- {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {69136056-BFD3-4CEC-BB41-D9991C79593C}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {69136056-BFD3-4CEC-BB41-D9991C79593C}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {69136056-BFD3-4CEC-BB41-D9991C79593C}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {69136056-BFD3-4CEC-BB41-D9991C79593C}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{72944A6C-45FF-4EF8-B349-8C9CABF519D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{72944A6C-45FF-4EF8-B349-8C9CABF519D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.Debug|x64.ActiveCfg = Debug|Any CPU
- {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.Debug|x64.Build.0 = Debug|Any CPU
- {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.Debug|x86.ActiveCfg = Debug|Any CPU
- {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.Debug|x86.Build.0 = Debug|Any CPU
+ {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{72944A6C-45FF-4EF8-B349-8C9CABF519D4}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{72944A6C-45FF-4EF8-B349-8C9CABF519D4}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{72944A6C-45FF-4EF8-B349-8C9CABF519D4}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{72944A6C-45FF-4EF8-B349-8C9CABF519D4}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{72944A6C-45FF-4EF8-B349-8C9CABF519D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.Release|x64.ActiveCfg = Release|Any CPU
- {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.Release|x64.Build.0 = Release|Any CPU
- {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.Release|x86.ActiveCfg = Release|Any CPU
- {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.Release|x86.Build.0 = Release|Any CPU
- {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {72944A6C-45FF-4EF8-B349-8C9CABF519D4}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{73D4CC8B-BAB9-4A29-841B-F25C6311F067}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{73D4CC8B-BAB9-4A29-841B-F25C6311F067}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.Debug|x64.ActiveCfg = Debug|Any CPU
- {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.Debug|x64.Build.0 = Debug|Any CPU
- {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.Debug|x86.ActiveCfg = Debug|Any CPU
- {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.Debug|x86.Build.0 = Debug|Any CPU
+ {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{73D4CC8B-BAB9-4A29-841B-F25C6311F067}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{73D4CC8B-BAB9-4A29-841B-F25C6311F067}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{73D4CC8B-BAB9-4A29-841B-F25C6311F067}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{73D4CC8B-BAB9-4A29-841B-F25C6311F067}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{73D4CC8B-BAB9-4A29-841B-F25C6311F067}.Release|Any CPU.ActiveCfg = Release|Any CPU
{73D4CC8B-BAB9-4A29-841B-F25C6311F067}.Release|Any CPU.Build.0 = Release|Any CPU
- {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.Release|x64.ActiveCfg = Release|Any CPU
- {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.Release|x64.Build.0 = Release|Any CPU
- {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.Release|x86.ActiveCfg = Release|Any CPU
- {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.Release|x86.Build.0 = Release|Any CPU
- {7525BB88-6142-4A26-93B9-A30C6983390A}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {7525BB88-6142-4A26-93B9-A30C6983390A}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {7525BB88-6142-4A26-93B9-A30C6983390A}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {7525BB88-6142-4A26-93B9-A30C6983390A}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {73D4CC8B-BAB9-4A29-841B-F25C6311F067}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{7525BB88-6142-4A26-93B9-A30C6983390A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7525BB88-6142-4A26-93B9-A30C6983390A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7525BB88-6142-4A26-93B9-A30C6983390A}.Debug|x64.ActiveCfg = Debug|Any CPU
- {7525BB88-6142-4A26-93B9-A30C6983390A}.Debug|x64.Build.0 = Debug|Any CPU
- {7525BB88-6142-4A26-93B9-A30C6983390A}.Debug|x86.ActiveCfg = Debug|Any CPU
- {7525BB88-6142-4A26-93B9-A30C6983390A}.Debug|x86.Build.0 = Debug|Any CPU
+ {7525BB88-6142-4A26-93B9-A30C6983390A}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {7525BB88-6142-4A26-93B9-A30C6983390A}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{7525BB88-6142-4A26-93B9-A30C6983390A}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{7525BB88-6142-4A26-93B9-A30C6983390A}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{7525BB88-6142-4A26-93B9-A30C6983390A}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{7525BB88-6142-4A26-93B9-A30C6983390A}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{7525BB88-6142-4A26-93B9-A30C6983390A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7525BB88-6142-4A26-93B9-A30C6983390A}.Release|x64.ActiveCfg = Release|Any CPU
- {7525BB88-6142-4A26-93B9-A30C6983390A}.Release|x64.Build.0 = Release|Any CPU
- {7525BB88-6142-4A26-93B9-A30C6983390A}.Release|x86.ActiveCfg = Release|Any CPU
- {7525BB88-6142-4A26-93B9-A30C6983390A}.Release|x86.Build.0 = Release|Any CPU
- {75B9F2DF-4DEA-4007-965D-339563735EBE}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {75B9F2DF-4DEA-4007-965D-339563735EBE}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {75B9F2DF-4DEA-4007-965D-339563735EBE}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {75B9F2DF-4DEA-4007-965D-339563735EBE}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {7525BB88-6142-4A26-93B9-A30C6983390A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7525BB88-6142-4A26-93B9-A30C6983390A}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {7525BB88-6142-4A26-93B9-A30C6983390A}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {7525BB88-6142-4A26-93B9-A30C6983390A}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {7525BB88-6142-4A26-93B9-A30C6983390A}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {7525BB88-6142-4A26-93B9-A30C6983390A}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {7525BB88-6142-4A26-93B9-A30C6983390A}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{75B9F2DF-4DEA-4007-965D-339563735EBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{75B9F2DF-4DEA-4007-965D-339563735EBE}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {75B9F2DF-4DEA-4007-965D-339563735EBE}.Debug|x64.ActiveCfg = Debug|Any CPU
- {75B9F2DF-4DEA-4007-965D-339563735EBE}.Debug|x64.Build.0 = Debug|Any CPU
- {75B9F2DF-4DEA-4007-965D-339563735EBE}.Debug|x86.ActiveCfg = Debug|Any CPU
- {75B9F2DF-4DEA-4007-965D-339563735EBE}.Debug|x86.Build.0 = Debug|Any CPU
+ {75B9F2DF-4DEA-4007-965D-339563735EBE}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {75B9F2DF-4DEA-4007-965D-339563735EBE}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{75B9F2DF-4DEA-4007-965D-339563735EBE}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{75B9F2DF-4DEA-4007-965D-339563735EBE}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{75B9F2DF-4DEA-4007-965D-339563735EBE}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{75B9F2DF-4DEA-4007-965D-339563735EBE}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{75B9F2DF-4DEA-4007-965D-339563735EBE}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {75B9F2DF-4DEA-4007-965D-339563735EBE}.Release|x64.ActiveCfg = Release|Any CPU
- {75B9F2DF-4DEA-4007-965D-339563735EBE}.Release|x64.Build.0 = Release|Any CPU
- {75B9F2DF-4DEA-4007-965D-339563735EBE}.Release|x86.ActiveCfg = Release|Any CPU
- {75B9F2DF-4DEA-4007-965D-339563735EBE}.Release|x86.Build.0 = Release|Any CPU
- {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {75B9F2DF-4DEA-4007-965D-339563735EBE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {75B9F2DF-4DEA-4007-965D-339563735EBE}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {75B9F2DF-4DEA-4007-965D-339563735EBE}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {75B9F2DF-4DEA-4007-965D-339563735EBE}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {75B9F2DF-4DEA-4007-965D-339563735EBE}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {75B9F2DF-4DEA-4007-965D-339563735EBE}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {75B9F2DF-4DEA-4007-965D-339563735EBE}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{7926DB5B-96A7-47A7-9870-DB42FA5C3548}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7926DB5B-96A7-47A7-9870-DB42FA5C3548}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.Debug|x64.ActiveCfg = Debug|Any CPU
- {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.Debug|x64.Build.0 = Debug|Any CPU
- {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.Debug|x86.ActiveCfg = Debug|Any CPU
- {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.Debug|x86.Build.0 = Debug|Any CPU
+ {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{7926DB5B-96A7-47A7-9870-DB42FA5C3548}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{7926DB5B-96A7-47A7-9870-DB42FA5C3548}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{7926DB5B-96A7-47A7-9870-DB42FA5C3548}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{7926DB5B-96A7-47A7-9870-DB42FA5C3548}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{7926DB5B-96A7-47A7-9870-DB42FA5C3548}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.Release|x64.ActiveCfg = Release|Any CPU
- {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.Release|x64.Build.0 = Release|Any CPU
- {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.Release|x86.ActiveCfg = Release|Any CPU
- {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.Release|x86.Build.0 = Release|Any CPU
- {7B57882B-AD46-469B-84E7-06DF98D11468}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {7B57882B-AD46-469B-84E7-06DF98D11468}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {7B57882B-AD46-469B-84E7-06DF98D11468}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {7B57882B-AD46-469B-84E7-06DF98D11468}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {7926DB5B-96A7-47A7-9870-DB42FA5C3548}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{7B57882B-AD46-469B-84E7-06DF98D11468}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7B57882B-AD46-469B-84E7-06DF98D11468}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7B57882B-AD46-469B-84E7-06DF98D11468}.Debug|x64.ActiveCfg = Debug|Any CPU
- {7B57882B-AD46-469B-84E7-06DF98D11468}.Debug|x64.Build.0 = Debug|Any CPU
- {7B57882B-AD46-469B-84E7-06DF98D11468}.Debug|x86.ActiveCfg = Debug|Any CPU
- {7B57882B-AD46-469B-84E7-06DF98D11468}.Debug|x86.Build.0 = Debug|Any CPU
+ {7B57882B-AD46-469B-84E7-06DF98D11468}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {7B57882B-AD46-469B-84E7-06DF98D11468}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{7B57882B-AD46-469B-84E7-06DF98D11468}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{7B57882B-AD46-469B-84E7-06DF98D11468}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{7B57882B-AD46-469B-84E7-06DF98D11468}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{7B57882B-AD46-469B-84E7-06DF98D11468}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7B57882B-AD46-469B-84E7-06DF98D11468}.Release|x64.ActiveCfg = Release|Any CPU
- {7B57882B-AD46-469B-84E7-06DF98D11468}.Release|x64.Build.0 = Release|Any CPU
- {7B57882B-AD46-469B-84E7-06DF98D11468}.Release|x86.ActiveCfg = Release|Any CPU
- {7B57882B-AD46-469B-84E7-06DF98D11468}.Release|x86.Build.0 = Release|Any CPU
- {7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {7B57882B-AD46-469B-84E7-06DF98D11468}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7B57882B-AD46-469B-84E7-06DF98D11468}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {7B57882B-AD46-469B-84E7-06DF98D11468}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {7B57882B-AD46-469B-84E7-06DF98D11468}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {7B57882B-AD46-469B-84E7-06DF98D11468}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {7B57882B-AD46-469B-84E7-06DF98D11468}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
{7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.Debug|x64.ActiveCfg = Debug|Any CPU
- {7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.Debug|x64.Build.0 = Debug|Any CPU
- {7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.Debug|x86.ActiveCfg = Debug|Any CPU
- {7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.Debug|x86.Build.0 = Debug|Any CPU
+ {7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
{7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.Release|x64.ActiveCfg = Release|Any CPU
- {7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.Release|x64.Build.0 = Release|Any CPU
- {7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.Release|x86.ActiveCfg = Release|Any CPU
- {7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.Release|x86.Build.0 = Release|Any CPU
- {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {7E4B15FB-E8C4-419A-A31C-9310FD9062BD}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{7FCDB0D9-AA7D-44E4-BE74-55312B432389}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7FCDB0D9-AA7D-44E4-BE74-55312B432389}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.Debug|x64.ActiveCfg = Debug|Any CPU
- {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.Debug|x64.Build.0 = Debug|Any CPU
- {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.Debug|x86.ActiveCfg = Debug|Any CPU
- {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.Debug|x86.Build.0 = Debug|Any CPU
+ {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{7FCDB0D9-AA7D-44E4-BE74-55312B432389}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{7FCDB0D9-AA7D-44E4-BE74-55312B432389}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{7FCDB0D9-AA7D-44E4-BE74-55312B432389}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{7FCDB0D9-AA7D-44E4-BE74-55312B432389}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{7FCDB0D9-AA7D-44E4-BE74-55312B432389}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.Release|x64.ActiveCfg = Release|Any CPU
- {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.Release|x64.Build.0 = Release|Any CPU
- {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.Release|x86.ActiveCfg = Release|Any CPU
- {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.Release|x86.Build.0 = Release|Any CPU
- {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {7FCDB0D9-AA7D-44E4-BE74-55312B432389}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.Debug|x64.ActiveCfg = Debug|Any CPU
- {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.Debug|x64.Build.0 = Debug|Any CPU
- {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.Debug|x86.ActiveCfg = Debug|Any CPU
- {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.Debug|x86.Build.0 = Debug|Any CPU
+ {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.Release|x64.ActiveCfg = Release|Any CPU
- {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.Release|x64.Build.0 = Release|Any CPU
- {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.Release|x86.ActiveCfg = Release|Any CPU
- {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.Release|x86.Build.0 = Release|Any CPU
- {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.CodeAnalysisDebug|Any CPU.ActiveCfg = net_2_0_Debug|Any CPU
- {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.CodeAnalysisDebug|Any CPU.Build.0 = net_2_0_Debug|Any CPU
- {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.CodeAnalysisDebug|x64.ActiveCfg = net_2_0_Debug|Any CPU
- {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.CodeAnalysisDebug|x64.Build.0 = net_2_0_Debug|Any CPU
+ {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.Release|Any CPU.Build.0 = Release|Any CPU
+ {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {849AE05D-0058-4A8C-A0E8-77DC6BB12E52}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU
- {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.Debug|x64.ActiveCfg = net_2_0_Debug|Any CPU
- {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.Debug|x64.Build.0 = net_2_0_Debug|Any CPU
- {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.Debug|x86.ActiveCfg = net_2_0_Debug|Any CPU
- {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.Debug|x86.Build.0 = net_2_0_Debug|Any CPU
+ {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.DebugGnome|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU
+ {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.DebugGnome|Any CPU.Build.0 = net_4_0_Debug|Any CPU
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.DebugMac|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.DebugMac|Any CPU.Build.0 = net_4_0_Debug|Any CPU
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.DebugWin32|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.DebugWin32|Any CPU.Build.0 = net_4_0_Debug|Any CPU
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU
- {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.Release|x64.ActiveCfg = net_2_0_Debug|Any CPU
- {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.Release|x64.Build.0 = net_2_0_Debug|Any CPU
- {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.Release|x86.ActiveCfg = net_2_0_Debug|Any CPU
- {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.Release|x86.Build.0 = net_2_0_Debug|Any CPU
- {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.Release|Any CPU.Build.0 = net_4_0_Release|Any CPU
+ {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.ReleaseGnome|Any CPU.ActiveCfg = net_4_0_Release|Any CPU
+ {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.ReleaseGnome|Any CPU.Build.0 = net_4_0_Release|Any CPU
+ {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.ReleaseMac|Any CPU.ActiveCfg = net_4_0_Release|Any CPU
+ {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.ReleaseMac|Any CPU.Build.0 = net_4_0_Release|Any CPU
+ {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.ReleaseWin32|Any CPU.ActiveCfg = net_4_0_Release|Any CPU
+ {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.ReleaseWin32|Any CPU.Build.0 = net_4_0_Release|Any CPU
{86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.Debug|x64.ActiveCfg = Debug|Any CPU
- {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.Debug|x64.Build.0 = Debug|Any CPU
- {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.Debug|x86.ActiveCfg = Debug|Any CPU
- {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.Debug|x86.Build.0 = Debug|Any CPU
+ {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.Release|x64.ActiveCfg = Release|Any CPU
- {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.Release|x64.Build.0 = Release|Any CPU
- {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.Release|x86.ActiveCfg = Release|Any CPU
- {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.Release|x86.Build.0 = Release|Any CPU
- {875D389F-48D1-4D46-BFC6-998837DD6AE0}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {875D389F-48D1-4D46-BFC6-998837DD6AE0}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {875D389F-48D1-4D46-BFC6-998837DD6AE0}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {875D389F-48D1-4D46-BFC6-998837DD6AE0}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {86DFC74A-B0B6-4C73-9E05-9098DA8FA5F1}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{875D389F-48D1-4D46-BFC6-998837DD6AE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{875D389F-48D1-4D46-BFC6-998837DD6AE0}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {875D389F-48D1-4D46-BFC6-998837DD6AE0}.Debug|x64.ActiveCfg = Debug|Any CPU
- {875D389F-48D1-4D46-BFC6-998837DD6AE0}.Debug|x64.Build.0 = Debug|Any CPU
- {875D389F-48D1-4D46-BFC6-998837DD6AE0}.Debug|x86.ActiveCfg = Debug|Any CPU
- {875D389F-48D1-4D46-BFC6-998837DD6AE0}.Debug|x86.Build.0 = Debug|Any CPU
+ {875D389F-48D1-4D46-BFC6-998837DD6AE0}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {875D389F-48D1-4D46-BFC6-998837DD6AE0}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{875D389F-48D1-4D46-BFC6-998837DD6AE0}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{875D389F-48D1-4D46-BFC6-998837DD6AE0}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{875D389F-48D1-4D46-BFC6-998837DD6AE0}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{875D389F-48D1-4D46-BFC6-998837DD6AE0}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{875D389F-48D1-4D46-BFC6-998837DD6AE0}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {875D389F-48D1-4D46-BFC6-998837DD6AE0}.Release|x64.ActiveCfg = Release|Any CPU
- {875D389F-48D1-4D46-BFC6-998837DD6AE0}.Release|x64.Build.0 = Release|Any CPU
- {875D389F-48D1-4D46-BFC6-998837DD6AE0}.Release|x86.ActiveCfg = Release|Any CPU
- {875D389F-48D1-4D46-BFC6-998837DD6AE0}.Release|x86.Build.0 = Release|Any CPU
- {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|x86
- {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|x86
- {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.CodeAnalysisDebug|x64.ActiveCfg = Debug|x86
- {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.CodeAnalysisDebug|x64.Build.0 = Debug|x86
+ {875D389F-48D1-4D46-BFC6-998837DD6AE0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {875D389F-48D1-4D46-BFC6-998837DD6AE0}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {875D389F-48D1-4D46-BFC6-998837DD6AE0}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {875D389F-48D1-4D46-BFC6-998837DD6AE0}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {875D389F-48D1-4D46-BFC6-998837DD6AE0}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {875D389F-48D1-4D46-BFC6-998837DD6AE0}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {875D389F-48D1-4D46-BFC6-998837DD6AE0}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.Debug|Any CPU.ActiveCfg = Debug|x86
{8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.Debug|Any CPU.Build.0 = Debug|x86
- {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.Debug|x64.ActiveCfg = Debug|x86
- {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.Debug|x64.Build.0 = Debug|x86
- {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.Debug|x86.ActiveCfg = Debug|x86
- {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.Debug|x86.Build.0 = Debug|x86
+ {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.DebugGnome|Any CPU.ActiveCfg = Debug|x86
+ {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.DebugGnome|Any CPU.Build.0 = Debug|x86
{8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.DebugMac|Any CPU.ActiveCfg = Debug|x86
{8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.DebugMac|Any CPU.Build.0 = Debug|x86
{8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.DebugWin32|Any CPU.ActiveCfg = Debug|x86
{8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.DebugWin32|Any CPU.Build.0 = Debug|x86
{8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.Release|Any CPU.ActiveCfg = Release|x86
- {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.Release|x64.ActiveCfg = Release|x86
- {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.Release|x64.Build.0 = Release|x86
- {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.Release|x86.ActiveCfg = Release|x86
- {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.Release|x86.Build.0 = Release|x86
- {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.Release|Any CPU.Build.0 = Release|x86
+ {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.ReleaseGnome|Any CPU.ActiveCfg = Release|x86
+ {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.ReleaseGnome|Any CPU.Build.0 = Release|x86
+ {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.ReleaseMac|Any CPU.ActiveCfg = Release|x86
+ {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.ReleaseMac|Any CPU.Build.0 = Release|x86
+ {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.ReleaseWin32|Any CPU.ActiveCfg = Release|x86
+ {8A04FF99-5DFE-4E3D-A24F-72A621C8DDC6}.ReleaseWin32|Any CPU.Build.0 = Release|x86
{8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.Debug|x64.ActiveCfg = Debug|Any CPU
- {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.Debug|x64.Build.0 = Debug|Any CPU
- {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.Debug|x86.ActiveCfg = Debug|Any CPU
- {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.Debug|x86.Build.0 = Debug|Any CPU
+ {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.Release|x64.ActiveCfg = Release|Any CPU
- {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.Release|x64.Build.0 = Release|Any CPU
- {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.Release|x86.ActiveCfg = Release|Any CPU
- {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.Release|x86.Build.0 = Release|Any CPU
- {8E47B77A-A649-494C-9BF2-B845E39CADE9}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {8E47B77A-A649-494C-9BF2-B845E39CADE9}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {8E47B77A-A649-494C-9BF2-B845E39CADE9}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {8E47B77A-A649-494C-9BF2-B845E39CADE9}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {8CCA39DD-8412-4547-BE7F-0C3D3ACC6FAC}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{8E47B77A-A649-494C-9BF2-B845E39CADE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {8E47B77A-A649-494C-9BF2-B845E39CADE9}.Debug|x64.ActiveCfg = Debug|Any CPU
- {8E47B77A-A649-494C-9BF2-B845E39CADE9}.Debug|x64.Build.0 = Debug|Any CPU
- {8E47B77A-A649-494C-9BF2-B845E39CADE9}.Debug|x86.ActiveCfg = Debug|Any CPU
- {8E47B77A-A649-494C-9BF2-B845E39CADE9}.Debug|x86.Build.0 = Debug|Any CPU
+ {8E47B77A-A649-494C-9BF2-B845E39CADE9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8E47B77A-A649-494C-9BF2-B845E39CADE9}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {8E47B77A-A649-494C-9BF2-B845E39CADE9}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{8E47B77A-A649-494C-9BF2-B845E39CADE9}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{8E47B77A-A649-494C-9BF2-B845E39CADE9}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{8E47B77A-A649-494C-9BF2-B845E39CADE9}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{8E47B77A-A649-494C-9BF2-B845E39CADE9}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{8E47B77A-A649-494C-9BF2-B845E39CADE9}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {8E47B77A-A649-494C-9BF2-B845E39CADE9}.Release|x64.ActiveCfg = Release|Any CPU
- {8E47B77A-A649-494C-9BF2-B845E39CADE9}.Release|x64.Build.0 = Release|Any CPU
- {8E47B77A-A649-494C-9BF2-B845E39CADE9}.Release|x86.ActiveCfg = Release|Any CPU
- {8E47B77A-A649-494C-9BF2-B845E39CADE9}.Release|x86.Build.0 = Release|Any CPU
- {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {8E47B77A-A649-494C-9BF2-B845E39CADE9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8E47B77A-A649-494C-9BF2-B845E39CADE9}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {8E47B77A-A649-494C-9BF2-B845E39CADE9}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {8E47B77A-A649-494C-9BF2-B845E39CADE9}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {8E47B77A-A649-494C-9BF2-B845E39CADE9}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {8E47B77A-A649-494C-9BF2-B845E39CADE9}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {8E47B77A-A649-494C-9BF2-B845E39CADE9}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.Debug|x64.ActiveCfg = Debug|Any CPU
- {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.Debug|x64.Build.0 = Debug|Any CPU
- {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.Debug|x86.ActiveCfg = Debug|Any CPU
- {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.Debug|x86.Build.0 = Debug|Any CPU
+ {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.Release|x64.ActiveCfg = Release|Any CPU
- {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.Release|x64.Build.0 = Release|Any CPU
- {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.Release|x86.ActiveCfg = Release|Any CPU
- {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.Release|x86.Build.0 = Release|Any CPU
- {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {8EE34CBC-5D7C-4BB3-8B19-26D5522770F6}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Debug|x64.ActiveCfg = Debug|Any CPU
- {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Debug|x64.Build.0 = Debug|Any CPU
- {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Debug|x86.ActiveCfg = Debug|Any CPU
- {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Debug|x86.Build.0 = Debug|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Release|x64.ActiveCfg = Release|Any CPU
- {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Release|x64.Build.0 = Release|Any CPU
- {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Release|x86.ActiveCfg = Release|Any CPU
- {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Release|x86.Build.0 = Release|Any CPU
- {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{91DD5A2D-9FE3-4C3C-9253-876141874DAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{91DD5A2D-9FE3-4C3C-9253-876141874DAD}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.Debug|x64.ActiveCfg = Debug|Any CPU
- {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.Debug|x64.Build.0 = Debug|Any CPU
- {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.Debug|x86.ActiveCfg = Debug|Any CPU
- {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.Debug|x86.Build.0 = Debug|Any CPU
+ {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{91DD5A2D-9FE3-4C3C-9253-876141874DAD}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{91DD5A2D-9FE3-4C3C-9253-876141874DAD}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{91DD5A2D-9FE3-4C3C-9253-876141874DAD}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{91DD5A2D-9FE3-4C3C-9253-876141874DAD}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{91DD5A2D-9FE3-4C3C-9253-876141874DAD}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.Release|x64.ActiveCfg = Release|Any CPU
- {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.Release|x64.Build.0 = Release|Any CPU
- {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.Release|x86.ActiveCfg = Release|Any CPU
- {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.Release|x86.Build.0 = Release|Any CPU
- {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {91DD5A2D-9FE3-4C3C-9253-876141874DAD}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.Debug|x64.ActiveCfg = Debug|Any CPU
- {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.Debug|x64.Build.0 = Debug|Any CPU
- {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.Debug|x86.ActiveCfg = Debug|Any CPU
- {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.Debug|x86.Build.0 = Debug|Any CPU
+ {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.Release|x64.ActiveCfg = Release|Any CPU
- {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.Release|x64.Build.0 = Release|Any CPU
- {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.Release|x86.ActiveCfg = Release|Any CPU
- {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.Release|x86.Build.0 = Release|Any CPU
- {961B9266-C44A-42B6-BA3D-3FB229C9C417}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {961B9266-C44A-42B6-BA3D-3FB229C9C417}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {961B9266-C44A-42B6-BA3D-3FB229C9C417}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {961B9266-C44A-42B6-BA3D-3FB229C9C417}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {92494904-35FA-4DC9-BDE9-3A3E87AC49D3}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{961B9266-C44A-42B6-BA3D-3FB229C9C417}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{961B9266-C44A-42B6-BA3D-3FB229C9C417}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {961B9266-C44A-42B6-BA3D-3FB229C9C417}.Debug|x64.ActiveCfg = Debug|Any CPU
- {961B9266-C44A-42B6-BA3D-3FB229C9C417}.Debug|x64.Build.0 = Debug|Any CPU
- {961B9266-C44A-42B6-BA3D-3FB229C9C417}.Debug|x86.ActiveCfg = Debug|Any CPU
- {961B9266-C44A-42B6-BA3D-3FB229C9C417}.Debug|x86.Build.0 = Debug|Any CPU
+ {961B9266-C44A-42B6-BA3D-3FB229C9C417}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {961B9266-C44A-42B6-BA3D-3FB229C9C417}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{961B9266-C44A-42B6-BA3D-3FB229C9C417}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{961B9266-C44A-42B6-BA3D-3FB229C9C417}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{961B9266-C44A-42B6-BA3D-3FB229C9C417}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{961B9266-C44A-42B6-BA3D-3FB229C9C417}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{961B9266-C44A-42B6-BA3D-3FB229C9C417}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {961B9266-C44A-42B6-BA3D-3FB229C9C417}.Release|x64.ActiveCfg = Release|Any CPU
- {961B9266-C44A-42B6-BA3D-3FB229C9C417}.Release|x64.Build.0 = Release|Any CPU
- {961B9266-C44A-42B6-BA3D-3FB229C9C417}.Release|x86.ActiveCfg = Release|Any CPU
- {961B9266-C44A-42B6-BA3D-3FB229C9C417}.Release|x86.Build.0 = Release|Any CPU
- {984CC812-9470-4A13-AFF9-CC44068D666C}.CodeAnalysisDebug|Any CPU.ActiveCfg = Release|Any CPU
- {984CC812-9470-4A13-AFF9-CC44068D666C}.CodeAnalysisDebug|Any CPU.Build.0 = Release|Any CPU
- {984CC812-9470-4A13-AFF9-CC44068D666C}.CodeAnalysisDebug|x64.ActiveCfg = Release|Any CPU
- {984CC812-9470-4A13-AFF9-CC44068D666C}.CodeAnalysisDebug|x64.Build.0 = Release|Any CPU
+ {961B9266-C44A-42B6-BA3D-3FB229C9C417}.Release|Any CPU.Build.0 = Release|Any CPU
+ {961B9266-C44A-42B6-BA3D-3FB229C9C417}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {961B9266-C44A-42B6-BA3D-3FB229C9C417}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {961B9266-C44A-42B6-BA3D-3FB229C9C417}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {961B9266-C44A-42B6-BA3D-3FB229C9C417}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {961B9266-C44A-42B6-BA3D-3FB229C9C417}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {961B9266-C44A-42B6-BA3D-3FB229C9C417}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|x64.ActiveCfg = Debug|Any CPU
- {984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|x64.Build.0 = Debug|Any CPU
- {984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|x86.ActiveCfg = Debug|Any CPU
- {984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|x86.Build.0 = Debug|Any CPU
+ {984CC812-9470-4A13-AFF9-CC44068D666C}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {984CC812-9470-4A13-AFF9-CC44068D666C}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {984CC812-9470-4A13-AFF9-CC44068D666C}.Release|x64.ActiveCfg = Release|Any CPU
- {984CC812-9470-4A13-AFF9-CC44068D666C}.Release|x64.Build.0 = Release|Any CPU
- {984CC812-9470-4A13-AFF9-CC44068D666C}.Release|x86.ActiveCfg = Release|Any CPU
- {984CC812-9470-4A13-AFF9-CC44068D666C}.Release|x86.Build.0 = Release|Any CPU
- {9A415695-CF80-4845-AA80-0DA26CF1E256}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {9A415695-CF80-4845-AA80-0DA26CF1E256}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {9A415695-CF80-4845-AA80-0DA26CF1E256}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {9A415695-CF80-4845-AA80-0DA26CF1E256}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {984CC812-9470-4A13-AFF9-CC44068D666C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {984CC812-9470-4A13-AFF9-CC44068D666C}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {984CC812-9470-4A13-AFF9-CC44068D666C}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {984CC812-9470-4A13-AFF9-CC44068D666C}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {984CC812-9470-4A13-AFF9-CC44068D666C}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {984CC812-9470-4A13-AFF9-CC44068D666C}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {984CC812-9470-4A13-AFF9-CC44068D666C}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{9A415695-CF80-4845-AA80-0DA26CF1E256}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9A415695-CF80-4845-AA80-0DA26CF1E256}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {9A415695-CF80-4845-AA80-0DA26CF1E256}.Debug|x64.ActiveCfg = Debug|Any CPU
- {9A415695-CF80-4845-AA80-0DA26CF1E256}.Debug|x64.Build.0 = Debug|Any CPU
- {9A415695-CF80-4845-AA80-0DA26CF1E256}.Debug|x86.ActiveCfg = Debug|Any CPU
- {9A415695-CF80-4845-AA80-0DA26CF1E256}.Debug|x86.Build.0 = Debug|Any CPU
+ {9A415695-CF80-4845-AA80-0DA26CF1E256}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {9A415695-CF80-4845-AA80-0DA26CF1E256}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{9A415695-CF80-4845-AA80-0DA26CF1E256}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{9A415695-CF80-4845-AA80-0DA26CF1E256}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{9A415695-CF80-4845-AA80-0DA26CF1E256}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{9A415695-CF80-4845-AA80-0DA26CF1E256}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {9A415695-CF80-4845-AA80-0DA26CF1E256}.Release|x64.ActiveCfg = Release|Any CPU
- {9A415695-CF80-4845-AA80-0DA26CF1E256}.Release|x64.Build.0 = Release|Any CPU
- {9A415695-CF80-4845-AA80-0DA26CF1E256}.Release|x86.ActiveCfg = Release|Any CPU
- {9A415695-CF80-4845-AA80-0DA26CF1E256}.Release|x86.Build.0 = Release|Any CPU
- {9BC670A8-1851-40EC-9685-279F4C98433D}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {9BC670A8-1851-40EC-9685-279F4C98433D}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {9BC670A8-1851-40EC-9685-279F4C98433D}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {9BC670A8-1851-40EC-9685-279F4C98433D}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {9A415695-CF80-4845-AA80-0DA26CF1E256}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {9A415695-CF80-4845-AA80-0DA26CF1E256}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {9A415695-CF80-4845-AA80-0DA26CF1E256}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {9A415695-CF80-4845-AA80-0DA26CF1E256}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {9A415695-CF80-4845-AA80-0DA26CF1E256}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
{9BC670A8-1851-40EC-9685-279F4C98433D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9BC670A8-1851-40EC-9685-279F4C98433D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {9BC670A8-1851-40EC-9685-279F4C98433D}.Debug|x64.ActiveCfg = Debug|Any CPU
- {9BC670A8-1851-40EC-9685-279F4C98433D}.Debug|x64.Build.0 = Debug|Any CPU
- {9BC670A8-1851-40EC-9685-279F4C98433D}.Debug|x86.ActiveCfg = Debug|Any CPU
- {9BC670A8-1851-40EC-9685-279F4C98433D}.Debug|x86.Build.0 = Debug|Any CPU
+ {9BC670A8-1851-40EC-9685-279F4C98433D}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {9BC670A8-1851-40EC-9685-279F4C98433D}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{9BC670A8-1851-40EC-9685-279F4C98433D}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{9BC670A8-1851-40EC-9685-279F4C98433D}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{9BC670A8-1851-40EC-9685-279F4C98433D}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{9BC670A8-1851-40EC-9685-279F4C98433D}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{9BC670A8-1851-40EC-9685-279F4C98433D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {9BC670A8-1851-40EC-9685-279F4C98433D}.Release|x64.ActiveCfg = Release|Any CPU
- {9BC670A8-1851-40EC-9685-279F4C98433D}.Release|x64.Build.0 = Release|Any CPU
- {9BC670A8-1851-40EC-9685-279F4C98433D}.Release|x86.ActiveCfg = Release|Any CPU
- {9BC670A8-1851-40EC-9685-279F4C98433D}.Release|x86.Build.0 = Release|Any CPU
- {9E4BA410-8338-42EC-AF9C-422C35ECED81}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {9E4BA410-8338-42EC-AF9C-422C35ECED81}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {9E4BA410-8338-42EC-AF9C-422C35ECED81}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {9E4BA410-8338-42EC-AF9C-422C35ECED81}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {9BC670A8-1851-40EC-9685-279F4C98433D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9BC670A8-1851-40EC-9685-279F4C98433D}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {9BC670A8-1851-40EC-9685-279F4C98433D}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {9BC670A8-1851-40EC-9685-279F4C98433D}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {9BC670A8-1851-40EC-9685-279F4C98433D}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {9BC670A8-1851-40EC-9685-279F4C98433D}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {9BC670A8-1851-40EC-9685-279F4C98433D}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{9E4BA410-8338-42EC-AF9C-422C35ECED81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9E4BA410-8338-42EC-AF9C-422C35ECED81}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {9E4BA410-8338-42EC-AF9C-422C35ECED81}.Debug|x64.ActiveCfg = Debug|Any CPU
- {9E4BA410-8338-42EC-AF9C-422C35ECED81}.Debug|x64.Build.0 = Debug|Any CPU
- {9E4BA410-8338-42EC-AF9C-422C35ECED81}.Debug|x86.ActiveCfg = Debug|Any CPU
- {9E4BA410-8338-42EC-AF9C-422C35ECED81}.Debug|x86.Build.0 = Debug|Any CPU
+ {9E4BA410-8338-42EC-AF9C-422C35ECED81}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {9E4BA410-8338-42EC-AF9C-422C35ECED81}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{9E4BA410-8338-42EC-AF9C-422C35ECED81}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{9E4BA410-8338-42EC-AF9C-422C35ECED81}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{9E4BA410-8338-42EC-AF9C-422C35ECED81}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{9E4BA410-8338-42EC-AF9C-422C35ECED81}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{9E4BA410-8338-42EC-AF9C-422C35ECED81}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {9E4BA410-8338-42EC-AF9C-422C35ECED81}.Release|x64.ActiveCfg = Release|Any CPU
- {9E4BA410-8338-42EC-AF9C-422C35ECED81}.Release|x64.Build.0 = Release|Any CPU
- {9E4BA410-8338-42EC-AF9C-422C35ECED81}.Release|x86.ActiveCfg = Release|Any CPU
- {9E4BA410-8338-42EC-AF9C-422C35ECED81}.Release|x86.Build.0 = Release|Any CPU
- {9FBCC262-10DC-4E84-A5C4-17230BBF8862}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {9FBCC262-10DC-4E84-A5C4-17230BBF8862}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {9FBCC262-10DC-4E84-A5C4-17230BBF8862}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {9FBCC262-10DC-4E84-A5C4-17230BBF8862}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {9E4BA410-8338-42EC-AF9C-422C35ECED81}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9E4BA410-8338-42EC-AF9C-422C35ECED81}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {9E4BA410-8338-42EC-AF9C-422C35ECED81}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {9E4BA410-8338-42EC-AF9C-422C35ECED81}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {9E4BA410-8338-42EC-AF9C-422C35ECED81}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {9E4BA410-8338-42EC-AF9C-422C35ECED81}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {9E4BA410-8338-42EC-AF9C-422C35ECED81}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{9FBCC262-10DC-4E84-A5C4-17230BBF8862}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {9FBCC262-10DC-4E84-A5C4-17230BBF8862}.Debug|x64.ActiveCfg = Debug|Any CPU
- {9FBCC262-10DC-4E84-A5C4-17230BBF8862}.Debug|x64.Build.0 = Debug|Any CPU
- {9FBCC262-10DC-4E84-A5C4-17230BBF8862}.Debug|x86.ActiveCfg = Debug|Any CPU
- {9FBCC262-10DC-4E84-A5C4-17230BBF8862}.Debug|x86.Build.0 = Debug|Any CPU
+ {9FBCC262-10DC-4E84-A5C4-17230BBF8862}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
{9FBCC262-10DC-4E84-A5C4-17230BBF8862}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{9FBCC262-10DC-4E84-A5C4-17230BBF8862}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{9FBCC262-10DC-4E84-A5C4-17230BBF8862}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{9FBCC262-10DC-4E84-A5C4-17230BBF8862}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {9FBCC262-10DC-4E84-A5C4-17230BBF8862}.Release|x64.ActiveCfg = Release|Any CPU
- {9FBCC262-10DC-4E84-A5C4-17230BBF8862}.Release|x64.Build.0 = Release|Any CPU
- {9FBCC262-10DC-4E84-A5C4-17230BBF8862}.Release|x86.ActiveCfg = Release|Any CPU
- {9FBCC262-10DC-4E84-A5C4-17230BBF8862}.Release|x86.Build.0 = Release|Any CPU
- {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {9FBCC262-10DC-4E84-A5C4-17230BBF8862}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {9FBCC262-10DC-4E84-A5C4-17230BBF8862}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {9FBCC262-10DC-4E84-A5C4-17230BBF8862}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {9FBCC262-10DC-4E84-A5C4-17230BBF8862}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.Debug|x64.ActiveCfg = Debug|Any CPU
- {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.Debug|x64.Build.0 = Debug|Any CPU
- {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.Debug|x86.ActiveCfg = Debug|Any CPU
- {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.Debug|x86.Build.0 = Debug|Any CPU
+ {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.Release|x64.ActiveCfg = Release|Any CPU
- {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.Release|x64.Build.0 = Release|Any CPU
- {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.Release|x86.ActiveCfg = Release|Any CPU
- {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.Release|x86.Build.0 = Release|Any CPU
- {A2329308-3751-4DBD-9A75-5F7B8B024625}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {A2329308-3751-4DBD-9A75-5F7B8B024625}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {A2329308-3751-4DBD-9A75-5F7B8B024625}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {A2329308-3751-4DBD-9A75-5F7B8B024625}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {A19E6F3F-A25B-4B01-8922-CF0CC35C781D}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{A2329308-3751-4DBD-9A75-5F7B8B024625}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A2329308-3751-4DBD-9A75-5F7B8B024625}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A2329308-3751-4DBD-9A75-5F7B8B024625}.Debug|x64.ActiveCfg = Debug|Any CPU
- {A2329308-3751-4DBD-9A75-5F7B8B024625}.Debug|x64.Build.0 = Debug|Any CPU
- {A2329308-3751-4DBD-9A75-5F7B8B024625}.Debug|x86.ActiveCfg = Debug|Any CPU
- {A2329308-3751-4DBD-9A75-5F7B8B024625}.Debug|x86.Build.0 = Debug|Any CPU
+ {A2329308-3751-4DBD-9A75-5F7B8B024625}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {A2329308-3751-4DBD-9A75-5F7B8B024625}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{A2329308-3751-4DBD-9A75-5F7B8B024625}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{A2329308-3751-4DBD-9A75-5F7B8B024625}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{A2329308-3751-4DBD-9A75-5F7B8B024625}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{A2329308-3751-4DBD-9A75-5F7B8B024625}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{A2329308-3751-4DBD-9A75-5F7B8B024625}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A2329308-3751-4DBD-9A75-5F7B8B024625}.Release|x64.ActiveCfg = Release|Any CPU
- {A2329308-3751-4DBD-9A75-5F7B8B024625}.Release|x64.Build.0 = Release|Any CPU
- {A2329308-3751-4DBD-9A75-5F7B8B024625}.Release|x86.ActiveCfg = Release|Any CPU
- {A2329308-3751-4DBD-9A75-5F7B8B024625}.Release|x86.Build.0 = Release|Any CPU
- {A2364D6A-00EF-417C-80A6-815726C70032}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {A2364D6A-00EF-417C-80A6-815726C70032}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {A2364D6A-00EF-417C-80A6-815726C70032}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {A2364D6A-00EF-417C-80A6-815726C70032}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {A2329308-3751-4DBD-9A75-5F7B8B024625}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A2329308-3751-4DBD-9A75-5F7B8B024625}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {A2329308-3751-4DBD-9A75-5F7B8B024625}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {A2329308-3751-4DBD-9A75-5F7B8B024625}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {A2329308-3751-4DBD-9A75-5F7B8B024625}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {A2329308-3751-4DBD-9A75-5F7B8B024625}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {A2329308-3751-4DBD-9A75-5F7B8B024625}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{A2364D6A-00EF-417C-80A6-815726C70032}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A2364D6A-00EF-417C-80A6-815726C70032}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A2364D6A-00EF-417C-80A6-815726C70032}.Debug|x64.ActiveCfg = Debug|Any CPU
- {A2364D6A-00EF-417C-80A6-815726C70032}.Debug|x64.Build.0 = Debug|Any CPU
- {A2364D6A-00EF-417C-80A6-815726C70032}.Debug|x86.ActiveCfg = Debug|Any CPU
- {A2364D6A-00EF-417C-80A6-815726C70032}.Debug|x86.Build.0 = Debug|Any CPU
+ {A2364D6A-00EF-417C-80A6-815726C70032}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {A2364D6A-00EF-417C-80A6-815726C70032}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{A2364D6A-00EF-417C-80A6-815726C70032}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{A2364D6A-00EF-417C-80A6-815726C70032}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{A2364D6A-00EF-417C-80A6-815726C70032}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{A2364D6A-00EF-417C-80A6-815726C70032}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{A2364D6A-00EF-417C-80A6-815726C70032}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A2364D6A-00EF-417C-80A6-815726C70032}.Release|x64.ActiveCfg = Release|Any CPU
- {A2364D6A-00EF-417C-80A6-815726C70032}.Release|x64.Build.0 = Release|Any CPU
- {A2364D6A-00EF-417C-80A6-815726C70032}.Release|x86.ActiveCfg = Release|Any CPU
- {A2364D6A-00EF-417C-80A6-815726C70032}.Release|x86.Build.0 = Release|Any CPU
- {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {A2364D6A-00EF-417C-80A6-815726C70032}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A2364D6A-00EF-417C-80A6-815726C70032}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {A2364D6A-00EF-417C-80A6-815726C70032}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {A2364D6A-00EF-417C-80A6-815726C70032}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {A2364D6A-00EF-417C-80A6-815726C70032}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {A2364D6A-00EF-417C-80A6-815726C70032}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {A2364D6A-00EF-417C-80A6-815726C70032}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{A437F1A3-78DF-4F00-8053-D32A8B1EB679}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A437F1A3-78DF-4F00-8053-D32A8B1EB679}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.Debug|x64.ActiveCfg = Debug|Any CPU
- {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.Debug|x64.Build.0 = Debug|Any CPU
- {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.Debug|x86.ActiveCfg = Debug|Any CPU
- {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.Debug|x86.Build.0 = Debug|Any CPU
+ {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{A437F1A3-78DF-4F00-8053-D32A8B1EB679}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{A437F1A3-78DF-4F00-8053-D32A8B1EB679}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{A437F1A3-78DF-4F00-8053-D32A8B1EB679}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{A437F1A3-78DF-4F00-8053-D32A8B1EB679}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{A437F1A3-78DF-4F00-8053-D32A8B1EB679}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.Release|x64.ActiveCfg = Release|Any CPU
- {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.Release|x64.Build.0 = Release|Any CPU
- {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.Release|x86.ActiveCfg = Release|Any CPU
- {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.Release|x86.Build.0 = Release|Any CPU
- {A727169F-D94F-443F-B305-B057D7F3B420}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {A727169F-D94F-443F-B305-B057D7F3B420}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {A727169F-D94F-443F-B305-B057D7F3B420}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {A727169F-D94F-443F-B305-B057D7F3B420}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {A437F1A3-78DF-4F00-8053-D32A8B1EB679}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{A727169F-D94F-443F-B305-B057D7F3B420}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A727169F-D94F-443F-B305-B057D7F3B420}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A727169F-D94F-443F-B305-B057D7F3B420}.Debug|x64.ActiveCfg = Debug|Any CPU
- {A727169F-D94F-443F-B305-B057D7F3B420}.Debug|x64.Build.0 = Debug|Any CPU
- {A727169F-D94F-443F-B305-B057D7F3B420}.Debug|x86.ActiveCfg = Debug|Any CPU
- {A727169F-D94F-443F-B305-B057D7F3B420}.Debug|x86.Build.0 = Debug|Any CPU
+ {A727169F-D94F-443F-B305-B057D7F3B420}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {A727169F-D94F-443F-B305-B057D7F3B420}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{A727169F-D94F-443F-B305-B057D7F3B420}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{A727169F-D94F-443F-B305-B057D7F3B420}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{A727169F-D94F-443F-B305-B057D7F3B420}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{A727169F-D94F-443F-B305-B057D7F3B420}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{A727169F-D94F-443F-B305-B057D7F3B420}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A727169F-D94F-443F-B305-B057D7F3B420}.Release|Any CPU.Build.0 = Release|Any CPU
- {A727169F-D94F-443F-B305-B057D7F3B420}.Release|x64.ActiveCfg = Release|Any CPU
- {A727169F-D94F-443F-B305-B057D7F3B420}.Release|x64.Build.0 = Release|Any CPU
- {A727169F-D94F-443F-B305-B057D7F3B420}.Release|x86.ActiveCfg = Release|Any CPU
- {A727169F-D94F-443F-B305-B057D7F3B420}.Release|x86.Build.0 = Release|Any CPU
- {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {A727169F-D94F-443F-B305-B057D7F3B420}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {A727169F-D94F-443F-B305-B057D7F3B420}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {A727169F-D94F-443F-B305-B057D7F3B420}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {A727169F-D94F-443F-B305-B057D7F3B420}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {A727169F-D94F-443F-B305-B057D7F3B420}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {A727169F-D94F-443F-B305-B057D7F3B420}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.Debug|x64.ActiveCfg = Debug|Any CPU
- {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.Debug|x64.Build.0 = Debug|Any CPU
- {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.Debug|x86.ActiveCfg = Debug|Any CPU
- {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.Debug|x86.Build.0 = Debug|Any CPU
+ {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.Release|x64.ActiveCfg = Release|Any CPU
- {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.Release|x64.Build.0 = Release|Any CPU
- {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.Release|x86.ActiveCfg = Release|Any CPU
- {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.Release|x86.Build.0 = Release|Any CPU
- {A85C9721-C054-4BD8-A1F3-0227615F0A36}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {A85C9721-C054-4BD8-A1F3-0227615F0A36}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {A85C9721-C054-4BD8-A1F3-0227615F0A36}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {A85C9721-C054-4BD8-A1F3-0227615F0A36}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {A7A4246D-CEC4-42DF-A3C1-C31B9F51C4EC}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{A85C9721-C054-4BD8-A1F3-0227615F0A36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A85C9721-C054-4BD8-A1F3-0227615F0A36}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A85C9721-C054-4BD8-A1F3-0227615F0A36}.Debug|x64.ActiveCfg = Debug|Any CPU
- {A85C9721-C054-4BD8-A1F3-0227615F0A36}.Debug|x64.Build.0 = Debug|Any CPU
- {A85C9721-C054-4BD8-A1F3-0227615F0A36}.Debug|x86.ActiveCfg = Debug|Any CPU
- {A85C9721-C054-4BD8-A1F3-0227615F0A36}.Debug|x86.Build.0 = Debug|Any CPU
+ {A85C9721-C054-4BD8-A1F3-0227615F0A36}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {A85C9721-C054-4BD8-A1F3-0227615F0A36}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{A85C9721-C054-4BD8-A1F3-0227615F0A36}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{A85C9721-C054-4BD8-A1F3-0227615F0A36}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{A85C9721-C054-4BD8-A1F3-0227615F0A36}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{A85C9721-C054-4BD8-A1F3-0227615F0A36}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{A85C9721-C054-4BD8-A1F3-0227615F0A36}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A85C9721-C054-4BD8-A1F3-0227615F0A36}.Release|x64.ActiveCfg = Release|Any CPU
- {A85C9721-C054-4BD8-A1F3-0227615F0A36}.Release|x64.Build.0 = Release|Any CPU
- {A85C9721-C054-4BD8-A1F3-0227615F0A36}.Release|x86.ActiveCfg = Release|Any CPU
- {A85C9721-C054-4BD8-A1F3-0227615F0A36}.Release|x86.Build.0 = Release|Any CPU
- {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {A85C9721-C054-4BD8-A1F3-0227615F0A36}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A85C9721-C054-4BD8-A1F3-0227615F0A36}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {A85C9721-C054-4BD8-A1F3-0227615F0A36}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {A85C9721-C054-4BD8-A1F3-0227615F0A36}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {A85C9721-C054-4BD8-A1F3-0227615F0A36}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {A85C9721-C054-4BD8-A1F3-0227615F0A36}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {A85C9721-C054-4BD8-A1F3-0227615F0A36}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.Debug|x64.ActiveCfg = Debug|Any CPU
- {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.Debug|x64.Build.0 = Debug|Any CPU
- {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.Debug|x86.ActiveCfg = Debug|Any CPU
- {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.Debug|x86.Build.0 = Debug|Any CPU
+ {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.Release|x64.ActiveCfg = Release|Any CPU
- {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.Release|x64.Build.0 = Release|Any CPU
- {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.Release|x86.ActiveCfg = Release|Any CPU
- {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.Release|x86.Build.0 = Release|Any CPU
- {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.CodeAnalysisDebug|Any CPU.ActiveCfg = CodeAnalysisDebug|Any CPU
- {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.CodeAnalysisDebug|Any CPU.Build.0 = CodeAnalysisDebug|Any CPU
- {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.CodeAnalysisDebug|x64.ActiveCfg = CodeAnalysisDebug|x64
- {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.CodeAnalysisDebug|x64.Build.0 = CodeAnalysisDebug|x64
+ {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Debug|x64.ActiveCfg = Debug|x64
- {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Debug|x64.Build.0 = Debug|x64
- {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Debug|x86.ActiveCfg = Debug|Any CPU
- {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Debug|x86.Build.0 = Debug|Any CPU
+ {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
{AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Release|Any CPU.Build.0 = Release|Any CPU
- {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Release|x64.ActiveCfg = Release|x64
- {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Release|x64.Build.0 = Release|x64
- {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Release|x86.ActiveCfg = Release|Any CPU
- {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Release|x86.Build.0 = Release|Any CPU
- {ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.Debug|x64.ActiveCfg = Debug|Any CPU
- {ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.Debug|x64.Build.0 = Debug|Any CPU
- {ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.Debug|x86.ActiveCfg = Debug|Any CPU
- {ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.Debug|x86.Build.0 = Debug|Any CPU
+ {ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.Release|Any CPU.Build.0 = Release|Any CPU
- {ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.Release|x64.ActiveCfg = Release|Any CPU
- {ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.Release|x64.Build.0 = Release|Any CPU
- {ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.Release|x86.ActiveCfg = Release|Any CPU
- {ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.Release|x86.Build.0 = Release|Any CPU
- {AC7D119C-980B-4712-8811-5368C14412D7}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {AC7D119C-980B-4712-8811-5368C14412D7}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {AC7D119C-980B-4712-8811-5368C14412D7}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {AC7D119C-980B-4712-8811-5368C14412D7}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {ABB21D58-6EFA-49EA-9555-EDDEC8123DD6}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
{AC7D119C-980B-4712-8811-5368C14412D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {AC7D119C-980B-4712-8811-5368C14412D7}.Debug|x64.ActiveCfg = Debug|Any CPU
- {AC7D119C-980B-4712-8811-5368C14412D7}.Debug|x64.Build.0 = Debug|Any CPU
- {AC7D119C-980B-4712-8811-5368C14412D7}.Debug|x86.ActiveCfg = Debug|Any CPU
- {AC7D119C-980B-4712-8811-5368C14412D7}.Debug|x86.Build.0 = Debug|Any CPU
+ {AC7D119C-980B-4712-8811-5368C14412D7}.DebugGnome|Any CPU.ActiveCfg = DebugGnome|Any CPU
{AC7D119C-980B-4712-8811-5368C14412D7}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{AC7D119C-980B-4712-8811-5368C14412D7}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{AC7D119C-980B-4712-8811-5368C14412D7}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{AC7D119C-980B-4712-8811-5368C14412D7}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {AC7D119C-980B-4712-8811-5368C14412D7}.Release|x64.ActiveCfg = Release|Any CPU
- {AC7D119C-980B-4712-8811-5368C14412D7}.Release|x64.Build.0 = Release|Any CPU
- {AC7D119C-980B-4712-8811-5368C14412D7}.Release|x86.ActiveCfg = Release|Any CPU
- {AC7D119C-980B-4712-8811-5368C14412D7}.Release|x86.Build.0 = Release|Any CPU
- {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {AC7D119C-980B-4712-8811-5368C14412D7}.ReleaseGnome|Any CPU.ActiveCfg = ReleaseGnome|Any CPU
+ {AC7D119C-980B-4712-8811-5368C14412D7}.ReleaseMac|Any CPU.ActiveCfg = ReleaseMac|Any CPU
+ {AC7D119C-980B-4712-8811-5368C14412D7}.ReleaseWin32|Any CPU.ActiveCfg = ReleaseWin32|Any CPU
{ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.Debug|x64.ActiveCfg = Debug|Any CPU
- {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.Debug|x64.Build.0 = Debug|Any CPU
- {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.Debug|x86.ActiveCfg = Debug|Any CPU
- {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.Debug|x86.Build.0 = Debug|Any CPU
+ {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.Release|x64.ActiveCfg = Release|Any CPU
- {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.Release|x64.Build.0 = Release|Any CPU
- {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.Release|x86.ActiveCfg = Release|Any CPU
- {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.Release|x86.Build.0 = Release|Any CPU
- {AE84B4A7-E6B1-4565-8904-16284DCE41B6}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {AE84B4A7-E6B1-4565-8904-16284DCE41B6}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {AE84B4A7-E6B1-4565-8904-16284DCE41B6}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {AE84B4A7-E6B1-4565-8904-16284DCE41B6}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {ADDC9D20-83C5-4245-9B46-2C5F6642CFBC}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{AE84B4A7-E6B1-4565-8904-16284DCE41B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {AE84B4A7-E6B1-4565-8904-16284DCE41B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {AE84B4A7-E6B1-4565-8904-16284DCE41B6}.Debug|x64.ActiveCfg = Debug|Any CPU
- {AE84B4A7-E6B1-4565-8904-16284DCE41B6}.Debug|x64.Build.0 = Debug|Any CPU
- {AE84B4A7-E6B1-4565-8904-16284DCE41B6}.Debug|x86.ActiveCfg = Debug|Any CPU
- {AE84B4A7-E6B1-4565-8904-16284DCE41B6}.Debug|x86.Build.0 = Debug|Any CPU
+ {AE84B4A7-E6B1-4565-8904-16284DCE41B6}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {AE84B4A7-E6B1-4565-8904-16284DCE41B6}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{AE84B4A7-E6B1-4565-8904-16284DCE41B6}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{AE84B4A7-E6B1-4565-8904-16284DCE41B6}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{AE84B4A7-E6B1-4565-8904-16284DCE41B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {AE84B4A7-E6B1-4565-8904-16284DCE41B6}.Release|x64.ActiveCfg = Release|Any CPU
- {AE84B4A7-E6B1-4565-8904-16284DCE41B6}.Release|x64.Build.0 = Release|Any CPU
- {AE84B4A7-E6B1-4565-8904-16284DCE41B6}.Release|x86.ActiveCfg = Release|Any CPU
- {AE84B4A7-E6B1-4565-8904-16284DCE41B6}.Release|x86.Build.0 = Release|Any CPU
- {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|x86
- {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|x86
- {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.CodeAnalysisDebug|x64.ActiveCfg = Debug|x86
- {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.CodeAnalysisDebug|x64.Build.0 = Debug|x86
+ {AE84B4A7-E6B1-4565-8904-16284DCE41B6}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {AE84B4A7-E6B1-4565-8904-16284DCE41B6}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {AE84B4A7-E6B1-4565-8904-16284DCE41B6}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {AE84B4A7-E6B1-4565-8904-16284DCE41B6}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
{B257A1A3-78DF-4F00-8053-D32A8B1EB679}.Debug|Any CPU.ActiveCfg = Debug|x86
{B257A1A3-78DF-4F00-8053-D32A8B1EB679}.Debug|Any CPU.Build.0 = Debug|x86
- {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.Debug|x64.ActiveCfg = Debug|x86
- {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.Debug|x64.Build.0 = Debug|x86
- {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.Debug|x86.ActiveCfg = Debug|x86
- {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.Debug|x86.Build.0 = Debug|x86
+ {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.DebugGnome|Any CPU.ActiveCfg = Debug|x86
+ {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.DebugGnome|Any CPU.Build.0 = Debug|x86
{B257A1A3-78DF-4F00-8053-D32A8B1EB679}.DebugMac|Any CPU.ActiveCfg = Debug|x86
{B257A1A3-78DF-4F00-8053-D32A8B1EB679}.DebugMac|Any CPU.Build.0 = Debug|x86
{B257A1A3-78DF-4F00-8053-D32A8B1EB679}.DebugWin32|Any CPU.ActiveCfg = Debug|x86
{B257A1A3-78DF-4F00-8053-D32A8B1EB679}.DebugWin32|Any CPU.Build.0 = Debug|x86
{B257A1A3-78DF-4F00-8053-D32A8B1EB679}.Release|Any CPU.ActiveCfg = Release|x86
- {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.Release|x64.ActiveCfg = Release|x86
- {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.Release|x64.Build.0 = Release|x86
- {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.Release|x86.ActiveCfg = Release|x86
- {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.Release|x86.Build.0 = Release|x86
- {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.Release|Any CPU.Build.0 = Release|x86
+ {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.ReleaseGnome|Any CPU.ActiveCfg = Release|x86
+ {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.ReleaseGnome|Any CPU.Build.0 = Release|x86
+ {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.ReleaseMac|Any CPU.ActiveCfg = Release|x86
+ {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.ReleaseMac|Any CPU.Build.0 = Release|x86
+ {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.ReleaseWin32|Any CPU.ActiveCfg = Release|x86
+ {B257A1A3-78DF-4F00-8053-D32A8B1EB679}.ReleaseWin32|Any CPU.Build.0 = Release|x86
{B32AD0DD-5247-437B-A2EF-1A4676C1B072}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B32AD0DD-5247-437B-A2EF-1A4676C1B072}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.Debug|x64.ActiveCfg = Debug|Any CPU
- {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.Debug|x64.Build.0 = Debug|Any CPU
- {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.Debug|x86.ActiveCfg = Debug|Any CPU
- {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.Debug|x86.Build.0 = Debug|Any CPU
+ {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{B32AD0DD-5247-437B-A2EF-1A4676C1B072}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{B32AD0DD-5247-437B-A2EF-1A4676C1B072}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{B32AD0DD-5247-437B-A2EF-1A4676C1B072}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{B32AD0DD-5247-437B-A2EF-1A4676C1B072}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{B32AD0DD-5247-437B-A2EF-1A4676C1B072}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.Release|x64.ActiveCfg = Release|Any CPU
- {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.Release|x64.Build.0 = Release|Any CPU
- {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.Release|x86.ActiveCfg = Release|Any CPU
- {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.Release|x86.Build.0 = Release|Any CPU
- {B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {B32AD0DD-5247-437B-A2EF-1A4676C1B072}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.Debug|x64.ActiveCfg = Debug|Any CPU
- {B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.Debug|x64.Build.0 = Debug|Any CPU
- {B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.Debug|x86.ActiveCfg = Debug|Any CPU
- {B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.Debug|x86.Build.0 = Debug|Any CPU
+ {B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
{B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.Release|x64.ActiveCfg = Release|Any CPU
- {B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.Release|x64.Build.0 = Release|Any CPU
- {B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.Release|x86.ActiveCfg = Release|Any CPU
- {B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.Release|x86.Build.0 = Release|Any CPU
- {B841F25D-4F6D-4E0D-885F-212B54381F28}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {B841F25D-4F6D-4E0D-885F-212B54381F28}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {B841F25D-4F6D-4E0D-885F-212B54381F28}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {B841F25D-4F6D-4E0D-885F-212B54381F28}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {B7C1673E-5124-4BE5-8D21-EC8B12F85B6B}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
{B841F25D-4F6D-4E0D-885F-212B54381F28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B841F25D-4F6D-4E0D-885F-212B54381F28}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B841F25D-4F6D-4E0D-885F-212B54381F28}.Debug|x64.ActiveCfg = Debug|Any CPU
- {B841F25D-4F6D-4E0D-885F-212B54381F28}.Debug|x64.Build.0 = Debug|Any CPU
- {B841F25D-4F6D-4E0D-885F-212B54381F28}.Debug|x86.ActiveCfg = Debug|Any CPU
- {B841F25D-4F6D-4E0D-885F-212B54381F28}.Debug|x86.Build.0 = Debug|Any CPU
+ {B841F25D-4F6D-4E0D-885F-212B54381F28}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {B841F25D-4F6D-4E0D-885F-212B54381F28}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{B841F25D-4F6D-4E0D-885F-212B54381F28}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{B841F25D-4F6D-4E0D-885F-212B54381F28}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{B841F25D-4F6D-4E0D-885F-212B54381F28}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{B841F25D-4F6D-4E0D-885F-212B54381F28}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B841F25D-4F6D-4E0D-885F-212B54381F28}.Release|x64.ActiveCfg = Release|Any CPU
- {B841F25D-4F6D-4E0D-885F-212B54381F28}.Release|x64.Build.0 = Release|Any CPU
- {B841F25D-4F6D-4E0D-885F-212B54381F28}.Release|x86.ActiveCfg = Release|Any CPU
- {B841F25D-4F6D-4E0D-885F-212B54381F28}.Release|x86.Build.0 = Release|Any CPU
- {BA9020AD-A2D1-47C8-9A7C-756162C38296}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {BA9020AD-A2D1-47C8-9A7C-756162C38296}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {BA9020AD-A2D1-47C8-9A7C-756162C38296}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {BA9020AD-A2D1-47C8-9A7C-756162C38296}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {B841F25D-4F6D-4E0D-885F-212B54381F28}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B841F25D-4F6D-4E0D-885F-212B54381F28}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {B841F25D-4F6D-4E0D-885F-212B54381F28}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {B841F25D-4F6D-4E0D-885F-212B54381F28}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {B841F25D-4F6D-4E0D-885F-212B54381F28}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {B841F25D-4F6D-4E0D-885F-212B54381F28}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
{BA9020AD-A2D1-47C8-9A7C-756162C38296}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BA9020AD-A2D1-47C8-9A7C-756162C38296}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {BA9020AD-A2D1-47C8-9A7C-756162C38296}.Debug|x64.ActiveCfg = Debug|Any CPU
- {BA9020AD-A2D1-47C8-9A7C-756162C38296}.Debug|x64.Build.0 = Debug|Any CPU
- {BA9020AD-A2D1-47C8-9A7C-756162C38296}.Debug|x86.ActiveCfg = Debug|Any CPU
- {BA9020AD-A2D1-47C8-9A7C-756162C38296}.Debug|x86.Build.0 = Debug|Any CPU
+ {BA9020AD-A2D1-47C8-9A7C-756162C38296}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {BA9020AD-A2D1-47C8-9A7C-756162C38296}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{BA9020AD-A2D1-47C8-9A7C-756162C38296}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{BA9020AD-A2D1-47C8-9A7C-756162C38296}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{BA9020AD-A2D1-47C8-9A7C-756162C38296}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{BA9020AD-A2D1-47C8-9A7C-756162C38296}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{BA9020AD-A2D1-47C8-9A7C-756162C38296}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {BA9020AD-A2D1-47C8-9A7C-756162C38296}.Release|x64.ActiveCfg = Release|Any CPU
- {BA9020AD-A2D1-47C8-9A7C-756162C38296}.Release|x64.Build.0 = Release|Any CPU
- {BA9020AD-A2D1-47C8-9A7C-756162C38296}.Release|x86.ActiveCfg = Release|Any CPU
- {BA9020AD-A2D1-47C8-9A7C-756162C38296}.Release|x86.Build.0 = Release|Any CPU
- {BFE8691A-D323-4622-9021-7B8B27F81599}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|x86
- {BFE8691A-D323-4622-9021-7B8B27F81599}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|x86
- {BFE8691A-D323-4622-9021-7B8B27F81599}.CodeAnalysisDebug|x64.ActiveCfg = Debug|x86
- {BFE8691A-D323-4622-9021-7B8B27F81599}.CodeAnalysisDebug|x64.Build.0 = Debug|x86
+ {BA9020AD-A2D1-47C8-9A7C-756162C38296}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BA9020AD-A2D1-47C8-9A7C-756162C38296}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {BA9020AD-A2D1-47C8-9A7C-756162C38296}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {BA9020AD-A2D1-47C8-9A7C-756162C38296}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {BA9020AD-A2D1-47C8-9A7C-756162C38296}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {BA9020AD-A2D1-47C8-9A7C-756162C38296}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {BA9020AD-A2D1-47C8-9A7C-756162C38296}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{BFE8691A-D323-4622-9021-7B8B27F81599}.Debug|Any CPU.ActiveCfg = Debug|x86
{BFE8691A-D323-4622-9021-7B8B27F81599}.Debug|Any CPU.Build.0 = Debug|x86
- {BFE8691A-D323-4622-9021-7B8B27F81599}.Debug|x64.ActiveCfg = Debug|x86
- {BFE8691A-D323-4622-9021-7B8B27F81599}.Debug|x64.Build.0 = Debug|x86
- {BFE8691A-D323-4622-9021-7B8B27F81599}.Debug|x86.ActiveCfg = Debug|x86
- {BFE8691A-D323-4622-9021-7B8B27F81599}.Debug|x86.Build.0 = Debug|x86
+ {BFE8691A-D323-4622-9021-7B8B27F81599}.DebugGnome|Any CPU.ActiveCfg = Debug|x86
+ {BFE8691A-D323-4622-9021-7B8B27F81599}.DebugGnome|Any CPU.Build.0 = Debug|x86
{BFE8691A-D323-4622-9021-7B8B27F81599}.DebugMac|Any CPU.ActiveCfg = Debug|x86
{BFE8691A-D323-4622-9021-7B8B27F81599}.DebugMac|Any CPU.Build.0 = Debug|x86
{BFE8691A-D323-4622-9021-7B8B27F81599}.DebugWin32|Any CPU.ActiveCfg = Debug|x86
{BFE8691A-D323-4622-9021-7B8B27F81599}.DebugWin32|Any CPU.Build.0 = Debug|x86
{BFE8691A-D323-4622-9021-7B8B27F81599}.Release|Any CPU.ActiveCfg = Release|x86
- {BFE8691A-D323-4622-9021-7B8B27F81599}.Release|x64.ActiveCfg = Release|x86
- {BFE8691A-D323-4622-9021-7B8B27F81599}.Release|x64.Build.0 = Release|x86
- {BFE8691A-D323-4622-9021-7B8B27F81599}.Release|x86.ActiveCfg = Release|x86
- {BFE8691A-D323-4622-9021-7B8B27F81599}.Release|x86.Build.0 = Release|x86
- {C05AAB7A-523F-4109-966B-6675BE0975BA}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {C05AAB7A-523F-4109-966B-6675BE0975BA}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {C05AAB7A-523F-4109-966B-6675BE0975BA}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {C05AAB7A-523F-4109-966B-6675BE0975BA}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {BFE8691A-D323-4622-9021-7B8B27F81599}.Release|Any CPU.Build.0 = Release|x86
+ {BFE8691A-D323-4622-9021-7B8B27F81599}.ReleaseGnome|Any CPU.ActiveCfg = Release|x86
+ {BFE8691A-D323-4622-9021-7B8B27F81599}.ReleaseGnome|Any CPU.Build.0 = Release|x86
+ {BFE8691A-D323-4622-9021-7B8B27F81599}.ReleaseMac|Any CPU.ActiveCfg = Release|x86
+ {BFE8691A-D323-4622-9021-7B8B27F81599}.ReleaseMac|Any CPU.Build.0 = Release|x86
+ {BFE8691A-D323-4622-9021-7B8B27F81599}.ReleaseWin32|Any CPU.ActiveCfg = Release|x86
+ {BFE8691A-D323-4622-9021-7B8B27F81599}.ReleaseWin32|Any CPU.Build.0 = Release|x86
{C05AAB7A-523F-4109-966B-6675BE0975BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C05AAB7A-523F-4109-966B-6675BE0975BA}.Debug|x64.ActiveCfg = Debug|Any CPU
- {C05AAB7A-523F-4109-966B-6675BE0975BA}.Debug|x64.Build.0 = Debug|Any CPU
- {C05AAB7A-523F-4109-966B-6675BE0975BA}.Debug|x86.ActiveCfg = Debug|Any CPU
- {C05AAB7A-523F-4109-966B-6675BE0975BA}.Debug|x86.Build.0 = Debug|Any CPU
+ {C05AAB7A-523F-4109-966B-6675BE0975BA}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
{C05AAB7A-523F-4109-966B-6675BE0975BA}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{C05AAB7A-523F-4109-966B-6675BE0975BA}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{C05AAB7A-523F-4109-966B-6675BE0975BA}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{C05AAB7A-523F-4109-966B-6675BE0975BA}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C05AAB7A-523F-4109-966B-6675BE0975BA}.Release|x64.ActiveCfg = Release|Any CPU
- {C05AAB7A-523F-4109-966B-6675BE0975BA}.Release|x64.Build.0 = Release|Any CPU
- {C05AAB7A-523F-4109-966B-6675BE0975BA}.Release|x86.ActiveCfg = Release|Any CPU
- {C05AAB7A-523F-4109-966B-6675BE0975BA}.Release|x86.Build.0 = Release|Any CPU
- {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {C05AAB7A-523F-4109-966B-6675BE0975BA}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {C05AAB7A-523F-4109-966B-6675BE0975BA}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {C05AAB7A-523F-4109-966B-6675BE0975BA}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {C05AAB7A-523F-4109-966B-6675BE0975BA}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
{C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.Debug|x64.ActiveCfg = Debug|Any CPU
- {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.Debug|x64.Build.0 = Debug|Any CPU
- {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.Debug|x86.ActiveCfg = Debug|Any CPU
- {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.Debug|x86.Build.0 = Debug|Any CPU
+ {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.Release|x64.ActiveCfg = Release|Any CPU
- {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.Release|x64.Build.0 = Release|Any CPU
- {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.Release|x86.ActiveCfg = Release|Any CPU
- {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.Release|x86.Build.0 = Release|Any CPU
- {C4B0275C-37D3-43F2-927D-ABF556600804}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|x86
- {C4B0275C-37D3-43F2-927D-ABF556600804}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|x86
- {C4B0275C-37D3-43F2-927D-ABF556600804}.CodeAnalysisDebug|x64.ActiveCfg = Debug|x86
- {C4B0275C-37D3-43F2-927D-ABF556600804}.CodeAnalysisDebug|x64.Build.0 = Debug|x86
+ {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {C3887A93-B2BD-4097-8E2F-3A063EFF32FD}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{C4B0275C-37D3-43F2-927D-ABF556600804}.Debug|Any CPU.ActiveCfg = Debug|x86
- {C4B0275C-37D3-43F2-927D-ABF556600804}.Debug|x64.ActiveCfg = Debug|x86
- {C4B0275C-37D3-43F2-927D-ABF556600804}.Debug|x64.Build.0 = Debug|x86
- {C4B0275C-37D3-43F2-927D-ABF556600804}.Debug|x86.ActiveCfg = Debug|x86
- {C4B0275C-37D3-43F2-927D-ABF556600804}.Debug|x86.Build.0 = Debug|x86
+ {C4B0275C-37D3-43F2-927D-ABF556600804}.DebugGnome|Any CPU.ActiveCfg = Debug|x86
{C4B0275C-37D3-43F2-927D-ABF556600804}.DebugMac|Any CPU.ActiveCfg = Debug|x86
{C4B0275C-37D3-43F2-927D-ABF556600804}.DebugWin32|Any CPU.ActiveCfg = Debug|x86
{C4B0275C-37D3-43F2-927D-ABF556600804}.DebugWin32|Any CPU.Build.0 = Debug|x86
{C4B0275C-37D3-43F2-927D-ABF556600804}.Release|Any CPU.ActiveCfg = Release|x86
- {C4B0275C-37D3-43F2-927D-ABF556600804}.Release|x64.ActiveCfg = Release|x86
- {C4B0275C-37D3-43F2-927D-ABF556600804}.Release|x64.Build.0 = Release|x86
- {C4B0275C-37D3-43F2-927D-ABF556600804}.Release|x86.ActiveCfg = Release|x86
- {C4B0275C-37D3-43F2-927D-ABF556600804}.Release|x86.Build.0 = Release|x86
- {C93D746E-1586-4D4F-B411-BF5A966E6A08}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {C93D746E-1586-4D4F-B411-BF5A966E6A08}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {C93D746E-1586-4D4F-B411-BF5A966E6A08}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {C93D746E-1586-4D4F-B411-BF5A966E6A08}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {C4B0275C-37D3-43F2-927D-ABF556600804}.ReleaseGnome|Any CPU.ActiveCfg = Release|x86
+ {C4B0275C-37D3-43F2-927D-ABF556600804}.ReleaseMac|Any CPU.ActiveCfg = Release|x86
+ {C4B0275C-37D3-43F2-927D-ABF556600804}.ReleaseWin32|Any CPU.ActiveCfg = Release|x86
+ {C4B0275C-37D3-43F2-927D-ABF556600804}.ReleaseWin32|Any CPU.Build.0 = Release|x86
{C93D746E-1586-4D4F-B411-BF5A966E6A08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C93D746E-1586-4D4F-B411-BF5A966E6A08}.Debug|x64.ActiveCfg = Debug|Any CPU
- {C93D746E-1586-4D4F-B411-BF5A966E6A08}.Debug|x64.Build.0 = Debug|Any CPU
- {C93D746E-1586-4D4F-B411-BF5A966E6A08}.Debug|x86.ActiveCfg = Debug|Any CPU
- {C93D746E-1586-4D4F-B411-BF5A966E6A08}.Debug|x86.Build.0 = Debug|Any CPU
+ {C93D746E-1586-4D4F-B411-BF5A966E6A08}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
{C93D746E-1586-4D4F-B411-BF5A966E6A08}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{C93D746E-1586-4D4F-B411-BF5A966E6A08}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{C93D746E-1586-4D4F-B411-BF5A966E6A08}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{C93D746E-1586-4D4F-B411-BF5A966E6A08}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C93D746E-1586-4D4F-B411-BF5A966E6A08}.Release|x64.ActiveCfg = Release|Any CPU
- {C93D746E-1586-4D4F-B411-BF5A966E6A08}.Release|x64.Build.0 = Release|Any CPU
- {C93D746E-1586-4D4F-B411-BF5A966E6A08}.Release|x86.ActiveCfg = Release|Any CPU
- {C93D746E-1586-4D4F-B411-BF5A966E6A08}.Release|x86.Build.0 = Release|Any CPU
- {CB590106-8331-4CBE-8131-B154E7BF79E1}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {CB590106-8331-4CBE-8131-B154E7BF79E1}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {CB590106-8331-4CBE-8131-B154E7BF79E1}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {CB590106-8331-4CBE-8131-B154E7BF79E1}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {C93D746E-1586-4D4F-B411-BF5A966E6A08}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {C93D746E-1586-4D4F-B411-BF5A966E6A08}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {C93D746E-1586-4D4F-B411-BF5A966E6A08}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {C93D746E-1586-4D4F-B411-BF5A966E6A08}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{CB590106-8331-4CBE-8131-B154E7BF79E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CB590106-8331-4CBE-8131-B154E7BF79E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {CB590106-8331-4CBE-8131-B154E7BF79E1}.Debug|x64.ActiveCfg = Debug|Any CPU
- {CB590106-8331-4CBE-8131-B154E7BF79E1}.Debug|x64.Build.0 = Debug|Any CPU
- {CB590106-8331-4CBE-8131-B154E7BF79E1}.Debug|x86.ActiveCfg = Debug|Any CPU
- {CB590106-8331-4CBE-8131-B154E7BF79E1}.Debug|x86.Build.0 = Debug|Any CPU
+ {CB590106-8331-4CBE-8131-B154E7BF79E1}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {CB590106-8331-4CBE-8131-B154E7BF79E1}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{CB590106-8331-4CBE-8131-B154E7BF79E1}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{CB590106-8331-4CBE-8131-B154E7BF79E1}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{CB590106-8331-4CBE-8131-B154E7BF79E1}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{CB590106-8331-4CBE-8131-B154E7BF79E1}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{CB590106-8331-4CBE-8131-B154E7BF79E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {CB590106-8331-4CBE-8131-B154E7BF79E1}.Release|x64.ActiveCfg = Release|Any CPU
- {CB590106-8331-4CBE-8131-B154E7BF79E1}.Release|x64.Build.0 = Release|Any CPU
- {CB590106-8331-4CBE-8131-B154E7BF79E1}.Release|x86.ActiveCfg = Release|Any CPU
- {CB590106-8331-4CBE-8131-B154E7BF79E1}.Release|x86.Build.0 = Release|Any CPU
- {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {CB590106-8331-4CBE-8131-B154E7BF79E1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CB590106-8331-4CBE-8131-B154E7BF79E1}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {CB590106-8331-4CBE-8131-B154E7BF79E1}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {CB590106-8331-4CBE-8131-B154E7BF79E1}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {CB590106-8331-4CBE-8131-B154E7BF79E1}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {CB590106-8331-4CBE-8131-B154E7BF79E1}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {CB590106-8331-4CBE-8131-B154E7BF79E1}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.Debug|x64.ActiveCfg = Debug|Any CPU
- {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.Debug|x64.Build.0 = Debug|Any CPU
- {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.Debug|x86.ActiveCfg = Debug|Any CPU
- {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.Debug|x86.Build.0 = Debug|Any CPU
+ {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.Release|x64.ActiveCfg = Release|Any CPU
- {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.Release|x64.Build.0 = Release|Any CPU
- {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.Release|x86.ActiveCfg = Release|Any CPU
- {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.Release|x86.Build.0 = Release|Any CPU
- {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {CFC02FEC-BDF4-40B9-94D6-35E73F76A92E}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.Debug|x64.ActiveCfg = Debug|Any CPU
- {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.Debug|x64.Build.0 = Debug|Any CPU
- {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.Debug|x86.ActiveCfg = Debug|Any CPU
- {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.Debug|x86.Build.0 = Debug|Any CPU
+ {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.Release|x64.ActiveCfg = Release|Any CPU
- {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.Release|x64.Build.0 = Release|Any CPU
- {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.Release|x86.ActiveCfg = Release|Any CPU
- {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.Release|x86.Build.0 = Release|Any CPU
- {D1D35409-C814-47F6-B038-B9B5BF0FE490}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {D1D35409-C814-47F6-B038-B9B5BF0FE490}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {D1D35409-C814-47F6-B038-B9B5BF0FE490}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {D1D35409-C814-47F6-B038-B9B5BF0FE490}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {D0B5AF2B-4BC1-4EB4-81D3-E5B85DDCE925}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{D1D35409-C814-47F6-B038-B9B5BF0FE490}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D1D35409-C814-47F6-B038-B9B5BF0FE490}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {D1D35409-C814-47F6-B038-B9B5BF0FE490}.Debug|x64.ActiveCfg = Debug|Any CPU
- {D1D35409-C814-47F6-B038-B9B5BF0FE490}.Debug|x64.Build.0 = Debug|Any CPU
- {D1D35409-C814-47F6-B038-B9B5BF0FE490}.Debug|x86.ActiveCfg = Debug|Any CPU
- {D1D35409-C814-47F6-B038-B9B5BF0FE490}.Debug|x86.Build.0 = Debug|Any CPU
+ {D1D35409-C814-47F6-B038-B9B5BF0FE490}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {D1D35409-C814-47F6-B038-B9B5BF0FE490}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{D1D35409-C814-47F6-B038-B9B5BF0FE490}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{D1D35409-C814-47F6-B038-B9B5BF0FE490}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{D1D35409-C814-47F6-B038-B9B5BF0FE490}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{D1D35409-C814-47F6-B038-B9B5BF0FE490}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{D1D35409-C814-47F6-B038-B9B5BF0FE490}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {D1D35409-C814-47F6-B038-B9B5BF0FE490}.Release|x64.ActiveCfg = Release|Any CPU
- {D1D35409-C814-47F6-B038-B9B5BF0FE490}.Release|x64.Build.0 = Release|Any CPU
- {D1D35409-C814-47F6-B038-B9B5BF0FE490}.Release|x86.ActiveCfg = Release|Any CPU
- {D1D35409-C814-47F6-B038-B9B5BF0FE490}.Release|x86.Build.0 = Release|Any CPU
- {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.CodeAnalysisDebug|Any CPU.ActiveCfg = net_2_0_Debug|Any CPU
- {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.CodeAnalysisDebug|Any CPU.Build.0 = net_2_0_Debug|Any CPU
- {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.CodeAnalysisDebug|x64.ActiveCfg = net_2_0_Debug|Any CPU
- {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.CodeAnalysisDebug|x64.Build.0 = net_2_0_Debug|Any CPU
+ {D1D35409-C814-47F6-B038-B9B5BF0FE490}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D1D35409-C814-47F6-B038-B9B5BF0FE490}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {D1D35409-C814-47F6-B038-B9B5BF0FE490}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {D1D35409-C814-47F6-B038-B9B5BF0FE490}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {D1D35409-C814-47F6-B038-B9B5BF0FE490}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {D1D35409-C814-47F6-B038-B9B5BF0FE490}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {D1D35409-C814-47F6-B038-B9B5BF0FE490}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU
- {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.Debug|x64.ActiveCfg = net_2_0_Debug|Any CPU
- {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.Debug|x64.Build.0 = net_2_0_Debug|Any CPU
- {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.Debug|x86.ActiveCfg = net_2_0_Debug|Any CPU
- {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.Debug|x86.Build.0 = net_2_0_Debug|Any CPU
+ {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.DebugGnome|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU
+ {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.DebugGnome|Any CPU.Build.0 = net_4_0_Debug|Any CPU
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.DebugMac|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.DebugMac|Any CPU.Build.0 = net_4_0_Debug|Any CPU
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.DebugWin32|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.DebugWin32|Any CPU.Build.0 = net_4_0_Debug|Any CPU
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU
- {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.Release|x64.ActiveCfg = net_2_0_Debug|Any CPU
- {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.Release|x64.Build.0 = net_2_0_Debug|Any CPU
- {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.Release|x86.ActiveCfg = net_2_0_Debug|Any CPU
- {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.Release|x86.Build.0 = net_2_0_Debug|Any CPU
- {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|x86
- {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|x86
- {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.CodeAnalysisDebug|x64.ActiveCfg = Debug|x86
- {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.CodeAnalysisDebug|x64.Build.0 = Debug|x86
+ {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.Release|Any CPU.Build.0 = net_4_0_Release|Any CPU
+ {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.ReleaseGnome|Any CPU.ActiveCfg = net_4_0_Release|Any CPU
+ {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.ReleaseGnome|Any CPU.Build.0 = net_4_0_Release|Any CPU
+ {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.ReleaseMac|Any CPU.ActiveCfg = net_4_0_Release|Any CPU
+ {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.ReleaseMac|Any CPU.Build.0 = net_4_0_Release|Any CPU
+ {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.ReleaseWin32|Any CPU.ActiveCfg = net_4_0_Release|Any CPU
+ {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.ReleaseWin32|Any CPU.Build.0 = net_4_0_Release|Any CPU
{DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.Debug|x64.ActiveCfg = Debug|Any CPU
- {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.Debug|x64.Build.0 = Debug|Any CPU
- {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.Debug|x86.ActiveCfg = Debug|x86
- {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.Debug|x86.Build.0 = Debug|x86
+ {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.DebugGnome|Any CPU.ActiveCfg = Debug|x86
+ {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.DebugGnome|Any CPU.Build.0 = Debug|x86
{DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.DebugWin32|Any CPU.ActiveCfg = Debug|x86
{DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.DebugWin32|Any CPU.Build.0 = Debug|x86
{DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.Release|x64.ActiveCfg = Release|Any CPU
- {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.Release|x64.Build.0 = Release|Any CPU
- {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.Release|x86.ActiveCfg = Release|x86
- {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.Release|x86.Build.0 = Release|x86
- {DB96F55E-41C5-4330-A427-15A4EC028BBE}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|x86
- {DB96F55E-41C5-4330-A427-15A4EC028BBE}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|x86
- {DB96F55E-41C5-4330-A427-15A4EC028BBE}.CodeAnalysisDebug|x64.ActiveCfg = Debug|x86
- {DB96F55E-41C5-4330-A427-15A4EC028BBE}.CodeAnalysisDebug|x64.Build.0 = Debug|x86
+ {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.Release|Any CPU.Build.0 = Release|Any CPU
+ {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.ReleaseGnome|Any CPU.ActiveCfg = Release|x86
+ {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.ReleaseGnome|Any CPU.Build.0 = Release|x86
+ {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.ReleaseMac|Any CPU.ActiveCfg = Release|x86
+ {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.ReleaseMac|Any CPU.Build.0 = Release|x86
+ {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.ReleaseWin32|Any CPU.ActiveCfg = Release|x86
+ {DA8EDEA6-7DA8-435D-B1A0-F3A0CA07F424}.ReleaseWin32|Any CPU.Build.0 = Release|x86
{DB96F55E-41C5-4330-A427-15A4EC028BBE}.Debug|Any CPU.ActiveCfg = Debug|x86
- {DB96F55E-41C5-4330-A427-15A4EC028BBE}.Debug|x64.ActiveCfg = Debug|x86
- {DB96F55E-41C5-4330-A427-15A4EC028BBE}.Debug|x64.Build.0 = Debug|x86
- {DB96F55E-41C5-4330-A427-15A4EC028BBE}.Debug|x86.ActiveCfg = Debug|x86
- {DB96F55E-41C5-4330-A427-15A4EC028BBE}.Debug|x86.Build.0 = Debug|x86
+ {DB96F55E-41C5-4330-A427-15A4EC028BBE}.DebugGnome|Any CPU.ActiveCfg = Debug|x86
{DB96F55E-41C5-4330-A427-15A4EC028BBE}.DebugMac|Any CPU.ActiveCfg = Debug|x86
{DB96F55E-41C5-4330-A427-15A4EC028BBE}.DebugWin32|Any CPU.ActiveCfg = Debug|x86
{DB96F55E-41C5-4330-A427-15A4EC028BBE}.DebugWin32|Any CPU.Build.0 = Debug|x86
{DB96F55E-41C5-4330-A427-15A4EC028BBE}.Release|Any CPU.ActiveCfg = Release|x86
- {DB96F55E-41C5-4330-A427-15A4EC028BBE}.Release|x64.ActiveCfg = Release|x86
- {DB96F55E-41C5-4330-A427-15A4EC028BBE}.Release|x64.Build.0 = Release|x86
- {DB96F55E-41C5-4330-A427-15A4EC028BBE}.Release|x86.ActiveCfg = Release|x86
- {DB96F55E-41C5-4330-A427-15A4EC028BBE}.Release|x86.Build.0 = Release|x86
- {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.CodeAnalysisDebug|Any CPU.ActiveCfg = Release|Any CPU
- {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.CodeAnalysisDebug|Any CPU.Build.0 = Release|Any CPU
- {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.CodeAnalysisDebug|x64.ActiveCfg = Release|Any CPU
- {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.CodeAnalysisDebug|x64.Build.0 = Release|Any CPU
+ {DB96F55E-41C5-4330-A427-15A4EC028BBE}.ReleaseGnome|Any CPU.ActiveCfg = Release|x86
+ {DB96F55E-41C5-4330-A427-15A4EC028BBE}.ReleaseMac|Any CPU.ActiveCfg = Release|x86
+ {DB96F55E-41C5-4330-A427-15A4EC028BBE}.ReleaseWin32|Any CPU.ActiveCfg = Release|x86
+ {DB96F55E-41C5-4330-A427-15A4EC028BBE}.ReleaseWin32|Any CPU.Build.0 = Release|x86
{DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.Debug|x64.ActiveCfg = Debug|Any CPU
- {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.Debug|x64.Build.0 = Debug|Any CPU
- {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.Debug|x86.ActiveCfg = Debug|Any CPU
- {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.Debug|x86.Build.0 = Debug|Any CPU
+ {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.Release|Any CPU.Build.0 = Release|Any CPU
- {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.Release|x64.ActiveCfg = Release|Any CPU
- {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.Release|x64.Build.0 = Release|Any CPU
- {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.Release|x86.ActiveCfg = Release|Any CPU
- {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.Release|x86.Build.0 = Release|Any CPU
- {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Debug|x64.ActiveCfg = Debug|Any CPU
- {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Debug|x64.Build.0 = Debug|Any CPU
- {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Debug|x86.ActiveCfg = Debug|Any CPU
- {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Debug|x86.Build.0 = Debug|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{DE40756E-57F6-4AF2-B155-55E3A88CCED8}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{DE40756E-57F6-4AF2-B155-55E3A88CCED8}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{DE40756E-57F6-4AF2-B155-55E3A88CCED8}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{DE40756E-57F6-4AF2-B155-55E3A88CCED8}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Release|x64.ActiveCfg = Release|Any CPU
- {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Release|x64.Build.0 = Release|Any CPU
- {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Release|x86.ActiveCfg = Release|Any CPU
- {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Release|x86.Build.0 = Release|Any CPU
- {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{E13A0A7B-4DE6-43ED-A139-41052D065A9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E13A0A7B-4DE6-43ED-A139-41052D065A9B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.Debug|x64.ActiveCfg = Debug|Any CPU
- {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.Debug|x64.Build.0 = Debug|Any CPU
- {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.Debug|x86.ActiveCfg = Debug|Any CPU
- {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.Debug|x86.Build.0 = Debug|Any CPU
+ {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{E13A0A7B-4DE6-43ED-A139-41052D065A9B}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{E13A0A7B-4DE6-43ED-A139-41052D065A9B}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{E13A0A7B-4DE6-43ED-A139-41052D065A9B}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{E13A0A7B-4DE6-43ED-A139-41052D065A9B}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{E13A0A7B-4DE6-43ED-A139-41052D065A9B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E13A0A7B-4DE6-43ED-A139-41052D065A9B}.Release|Any CPU.Build.0 = Release|Any CPU
- {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.Release|x64.ActiveCfg = Release|Any CPU
- {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.Release|x64.Build.0 = Release|Any CPU
- {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.Release|x86.ActiveCfg = Release|Any CPU
- {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.Release|x86.Build.0 = Release|Any CPU
- {E17829B5-8EAC-4714-8798-EB8ED3540191}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {E17829B5-8EAC-4714-8798-EB8ED3540191}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {E17829B5-8EAC-4714-8798-EB8ED3540191}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {E17829B5-8EAC-4714-8798-EB8ED3540191}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {E13A0A7B-4DE6-43ED-A139-41052D065A9B}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{E17829B5-8EAC-4714-8798-EB8ED3540191}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E17829B5-8EAC-4714-8798-EB8ED3540191}.Debug|x64.ActiveCfg = Debug|Any CPU
- {E17829B5-8EAC-4714-8798-EB8ED3540191}.Debug|x64.Build.0 = Debug|Any CPU
- {E17829B5-8EAC-4714-8798-EB8ED3540191}.Debug|x86.ActiveCfg = Debug|Any CPU
- {E17829B5-8EAC-4714-8798-EB8ED3540191}.Debug|x86.Build.0 = Debug|Any CPU
+ {E17829B5-8EAC-4714-8798-EB8ED3540191}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
{E17829B5-8EAC-4714-8798-EB8ED3540191}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{E17829B5-8EAC-4714-8798-EB8ED3540191}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{E17829B5-8EAC-4714-8798-EB8ED3540191}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{E17829B5-8EAC-4714-8798-EB8ED3540191}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E17829B5-8EAC-4714-8798-EB8ED3540191}.Release|Any CPU.Build.0 = Release|Any CPU
- {E17829B5-8EAC-4714-8798-EB8ED3540191}.Release|x64.ActiveCfg = Release|Any CPU
- {E17829B5-8EAC-4714-8798-EB8ED3540191}.Release|x64.Build.0 = Release|Any CPU
- {E17829B5-8EAC-4714-8798-EB8ED3540191}.Release|x86.ActiveCfg = Release|Any CPU
- {E17829B5-8EAC-4714-8798-EB8ED3540191}.Release|x86.Build.0 = Release|Any CPU
- {E2CAB397-D00C-4D11-8F5F-E3A052092969}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {E2CAB397-D00C-4D11-8F5F-E3A052092969}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {E2CAB397-D00C-4D11-8F5F-E3A052092969}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {E2CAB397-D00C-4D11-8F5F-E3A052092969}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {E17829B5-8EAC-4714-8798-EB8ED3540191}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {E17829B5-8EAC-4714-8798-EB8ED3540191}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {E17829B5-8EAC-4714-8798-EB8ED3540191}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {E17829B5-8EAC-4714-8798-EB8ED3540191}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{E2CAB397-D00C-4D11-8F5F-E3A052092969}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E2CAB397-D00C-4D11-8F5F-E3A052092969}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E2CAB397-D00C-4D11-8F5F-E3A052092969}.Debug|x64.ActiveCfg = Debug|Any CPU
- {E2CAB397-D00C-4D11-8F5F-E3A052092969}.Debug|x64.Build.0 = Debug|Any CPU
- {E2CAB397-D00C-4D11-8F5F-E3A052092969}.Debug|x86.ActiveCfg = Debug|Any CPU
- {E2CAB397-D00C-4D11-8F5F-E3A052092969}.Debug|x86.Build.0 = Debug|Any CPU
+ {E2CAB397-D00C-4D11-8F5F-E3A052092969}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {E2CAB397-D00C-4D11-8F5F-E3A052092969}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{E2CAB397-D00C-4D11-8F5F-E3A052092969}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{E2CAB397-D00C-4D11-8F5F-E3A052092969}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{E2CAB397-D00C-4D11-8F5F-E3A052092969}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{E2CAB397-D00C-4D11-8F5F-E3A052092969}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E2CAB397-D00C-4D11-8F5F-E3A052092969}.Release|x64.ActiveCfg = Release|Any CPU
- {E2CAB397-D00C-4D11-8F5F-E3A052092969}.Release|x64.Build.0 = Release|Any CPU
- {E2CAB397-D00C-4D11-8F5F-E3A052092969}.Release|x86.ActiveCfg = Release|Any CPU
- {E2CAB397-D00C-4D11-8F5F-E3A052092969}.Release|x86.Build.0 = Release|Any CPU
- {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {E2CAB397-D00C-4D11-8F5F-E3A052092969}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E2CAB397-D00C-4D11-8F5F-E3A052092969}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {E2CAB397-D00C-4D11-8F5F-E3A052092969}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {E2CAB397-D00C-4D11-8F5F-E3A052092969}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {E2CAB397-D00C-4D11-8F5F-E3A052092969}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {E2CAB397-D00C-4D11-8F5F-E3A052092969}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
{E3BFF8B4-189C-496A-A817-7E8B31E22B91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E3BFF8B4-189C-496A-A817-7E8B31E22B91}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.Debug|x64.ActiveCfg = Debug|Any CPU
- {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.Debug|x64.Build.0 = Debug|Any CPU
- {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.Debug|x86.ActiveCfg = Debug|Any CPU
- {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.Debug|x86.Build.0 = Debug|Any CPU
+ {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{E3BFF8B4-189C-496A-A817-7E8B31E22B91}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{E3BFF8B4-189C-496A-A817-7E8B31E22B91}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{E3BFF8B4-189C-496A-A817-7E8B31E22B91}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{E3BFF8B4-189C-496A-A817-7E8B31E22B91}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{E3BFF8B4-189C-496A-A817-7E8B31E22B91}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.Release|x64.ActiveCfg = Release|Any CPU
- {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.Release|x64.Build.0 = Release|Any CPU
- {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.Release|x86.ActiveCfg = Release|Any CPU
- {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.Release|x86.Build.0 = Release|Any CPU
- {E95833C9-90AA-4366-9262-0A1BED148249}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {E95833C9-90AA-4366-9262-0A1BED148249}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {E95833C9-90AA-4366-9262-0A1BED148249}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {E95833C9-90AA-4366-9262-0A1BED148249}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {E3BFF8B4-189C-496A-A817-7E8B31E22B91}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{E95833C9-90AA-4366-9262-0A1BED148249}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E95833C9-90AA-4366-9262-0A1BED148249}.Debug|x64.ActiveCfg = Debug|Any CPU
- {E95833C9-90AA-4366-9262-0A1BED148249}.Debug|x64.Build.0 = Debug|Any CPU
- {E95833C9-90AA-4366-9262-0A1BED148249}.Debug|x86.ActiveCfg = Debug|Any CPU
- {E95833C9-90AA-4366-9262-0A1BED148249}.Debug|x86.Build.0 = Debug|Any CPU
+ {E95833C9-90AA-4366-9262-0A1BED148249}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
{E95833C9-90AA-4366-9262-0A1BED148249}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{E95833C9-90AA-4366-9262-0A1BED148249}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{E95833C9-90AA-4366-9262-0A1BED148249}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{E95833C9-90AA-4366-9262-0A1BED148249}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E95833C9-90AA-4366-9262-0A1BED148249}.Release|Any CPU.Build.0 = Release|Any CPU
- {E95833C9-90AA-4366-9262-0A1BED148249}.Release|x64.ActiveCfg = Release|Any CPU
- {E95833C9-90AA-4366-9262-0A1BED148249}.Release|x64.Build.0 = Release|Any CPU
- {E95833C9-90AA-4366-9262-0A1BED148249}.Release|x86.ActiveCfg = Release|Any CPU
- {E95833C9-90AA-4366-9262-0A1BED148249}.Release|x86.Build.0 = Release|Any CPU
- {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {E95833C9-90AA-4366-9262-0A1BED148249}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {E95833C9-90AA-4366-9262-0A1BED148249}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {E95833C9-90AA-4366-9262-0A1BED148249}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {E95833C9-90AA-4366-9262-0A1BED148249}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
{EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.Debug|x64.ActiveCfg = Debug|Any CPU
- {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.Debug|x64.Build.0 = Debug|Any CPU
- {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.Debug|x86.ActiveCfg = Debug|Any CPU
- {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.Debug|x86.Build.0 = Debug|Any CPU
+ {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.Release|x64.ActiveCfg = Release|Any CPU
- {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.Release|x64.Build.0 = Release|Any CPU
- {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.Release|x86.ActiveCfg = Release|Any CPU
- {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.Release|x86.Build.0 = Release|Any CPU
- {EF91D0B8-53F6-4622-9F26-3ED27815878A}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {EF91D0B8-53F6-4622-9F26-3ED27815878A}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {EF91D0B8-53F6-4622-9F26-3ED27815878A}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {EF91D0B8-53F6-4622-9F26-3ED27815878A}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {EBFC7F90-C2E5-4A4C-A327-E35021BEC181}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{EF91D0B8-53F6-4622-9F26-3ED27815878A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EF91D0B8-53F6-4622-9F26-3ED27815878A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {EF91D0B8-53F6-4622-9F26-3ED27815878A}.Debug|x64.ActiveCfg = Debug|Any CPU
- {EF91D0B8-53F6-4622-9F26-3ED27815878A}.Debug|x64.Build.0 = Debug|Any CPU
- {EF91D0B8-53F6-4622-9F26-3ED27815878A}.Debug|x86.ActiveCfg = Debug|Any CPU
- {EF91D0B8-53F6-4622-9F26-3ED27815878A}.Debug|x86.Build.0 = Debug|Any CPU
+ {EF91D0B8-53F6-4622-9F26-3ED27815878A}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {EF91D0B8-53F6-4622-9F26-3ED27815878A}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{EF91D0B8-53F6-4622-9F26-3ED27815878A}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{EF91D0B8-53F6-4622-9F26-3ED27815878A}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{EF91D0B8-53F6-4622-9F26-3ED27815878A}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{EF91D0B8-53F6-4622-9F26-3ED27815878A}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{EF91D0B8-53F6-4622-9F26-3ED27815878A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {EF91D0B8-53F6-4622-9F26-3ED27815878A}.Release|x64.ActiveCfg = Release|Any CPU
- {EF91D0B8-53F6-4622-9F26-3ED27815878A}.Release|x64.Build.0 = Release|Any CPU
- {EF91D0B8-53F6-4622-9F26-3ED27815878A}.Release|x86.ActiveCfg = Release|Any CPU
- {EF91D0B8-53F6-4622-9F26-3ED27815878A}.Release|x86.Build.0 = Release|Any CPU
- {F218643D-2E74-4309-820E-206A54B7133F}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {F218643D-2E74-4309-820E-206A54B7133F}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {F218643D-2E74-4309-820E-206A54B7133F}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {F218643D-2E74-4309-820E-206A54B7133F}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {EF91D0B8-53F6-4622-9F26-3ED27815878A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EF91D0B8-53F6-4622-9F26-3ED27815878A}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {EF91D0B8-53F6-4622-9F26-3ED27815878A}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {EF91D0B8-53F6-4622-9F26-3ED27815878A}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {EF91D0B8-53F6-4622-9F26-3ED27815878A}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {EF91D0B8-53F6-4622-9F26-3ED27815878A}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {EF91D0B8-53F6-4622-9F26-3ED27815878A}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{F218643D-2E74-4309-820E-206A54B7133F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F218643D-2E74-4309-820E-206A54B7133F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F218643D-2E74-4309-820E-206A54B7133F}.Debug|x64.ActiveCfg = Debug|Any CPU
- {F218643D-2E74-4309-820E-206A54B7133F}.Debug|x64.Build.0 = Debug|Any CPU
- {F218643D-2E74-4309-820E-206A54B7133F}.Debug|x86.ActiveCfg = Debug|Any CPU
- {F218643D-2E74-4309-820E-206A54B7133F}.Debug|x86.Build.0 = Debug|Any CPU
+ {F218643D-2E74-4309-820E-206A54B7133F}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {F218643D-2E74-4309-820E-206A54B7133F}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{F218643D-2E74-4309-820E-206A54B7133F}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{F218643D-2E74-4309-820E-206A54B7133F}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{F218643D-2E74-4309-820E-206A54B7133F}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{F218643D-2E74-4309-820E-206A54B7133F}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{F218643D-2E74-4309-820E-206A54B7133F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F218643D-2E74-4309-820E-206A54B7133F}.Release|Any CPU.Build.0 = Release|Any CPU
- {F218643D-2E74-4309-820E-206A54B7133F}.Release|x64.ActiveCfg = Release|Any CPU
- {F218643D-2E74-4309-820E-206A54B7133F}.Release|x64.Build.0 = Release|Any CPU
- {F218643D-2E74-4309-820E-206A54B7133F}.Release|x86.ActiveCfg = Release|Any CPU
- {F218643D-2E74-4309-820E-206A54B7133F}.Release|x86.Build.0 = Release|Any CPU
- {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {F218643D-2E74-4309-820E-206A54B7133F}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {F218643D-2E74-4309-820E-206A54B7133F}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {F218643D-2E74-4309-820E-206A54B7133F}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {F218643D-2E74-4309-820E-206A54B7133F}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {F218643D-2E74-4309-820E-206A54B7133F}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {F218643D-2E74-4309-820E-206A54B7133F}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{F3AC14B0-3D1F-4B9B-95E8-384056060F33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F3AC14B0-3D1F-4B9B-95E8-384056060F33}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.Debug|x64.ActiveCfg = Debug|Any CPU
- {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.Debug|x64.Build.0 = Debug|Any CPU
- {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.Debug|x86.ActiveCfg = Debug|Any CPU
- {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.Debug|x86.Build.0 = Debug|Any CPU
+ {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{F3AC14B0-3D1F-4B9B-95E8-384056060F33}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{F3AC14B0-3D1F-4B9B-95E8-384056060F33}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{F3AC14B0-3D1F-4B9B-95E8-384056060F33}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{F3AC14B0-3D1F-4B9B-95E8-384056060F33}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{F3AC14B0-3D1F-4B9B-95E8-384056060F33}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F3AC14B0-3D1F-4B9B-95E8-384056060F33}.Release|Any CPU.Build.0 = Release|Any CPU
- {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.Release|x64.ActiveCfg = Release|Any CPU
- {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.Release|x64.Build.0 = Release|Any CPU
- {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.Release|x86.ActiveCfg = Release|Any CPU
- {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.Release|x86.Build.0 = Release|Any CPU
- {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {F3AC14B0-3D1F-4B9B-95E8-384056060F33}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{F426CBB2-77FC-4E14-9E28-E667C2D1299A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F426CBB2-77FC-4E14-9E28-E667C2D1299A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.Debug|x64.ActiveCfg = Debug|Any CPU
- {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.Debug|x64.Build.0 = Debug|Any CPU
- {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.Debug|x86.ActiveCfg = Debug|Any CPU
- {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.Debug|x86.Build.0 = Debug|Any CPU
+ {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{F426CBB2-77FC-4E14-9E28-E667C2D1299A}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{F426CBB2-77FC-4E14-9E28-E667C2D1299A}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{F426CBB2-77FC-4E14-9E28-E667C2D1299A}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{F426CBB2-77FC-4E14-9E28-E667C2D1299A}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{F426CBB2-77FC-4E14-9E28-E667C2D1299A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.Release|x64.ActiveCfg = Release|Any CPU
- {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.Release|x64.Build.0 = Release|Any CPU
- {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.Release|x86.ActiveCfg = Release|Any CPU
- {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.Release|x86.Build.0 = Release|Any CPU
- {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {F426CBB2-77FC-4E14-9E28-E667C2D1299A}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{F5390DA4-08B7-47E3-B6F3-D50683316AB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F5390DA4-08B7-47E3-B6F3-D50683316AB4}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.Debug|x64.ActiveCfg = Debug|Any CPU
- {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.Debug|x64.Build.0 = Debug|Any CPU
- {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.Debug|x86.ActiveCfg = Debug|Any CPU
- {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.Debug|x86.Build.0 = Debug|Any CPU
+ {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{F5390DA4-08B7-47E3-B6F3-D50683316AB4}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{F5390DA4-08B7-47E3-B6F3-D50683316AB4}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{F5390DA4-08B7-47E3-B6F3-D50683316AB4}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{F5390DA4-08B7-47E3-B6F3-D50683316AB4}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{F5390DA4-08B7-47E3-B6F3-D50683316AB4}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.Release|x64.ActiveCfg = Release|Any CPU
- {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.Release|x64.Build.0 = Release|Any CPU
- {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.Release|x86.ActiveCfg = Release|Any CPU
- {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.Release|x86.Build.0 = Release|Any CPU
- {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {F5390DA4-08B7-47E3-B6F3-D50683316AB4}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.Debug|x64.ActiveCfg = Debug|Any CPU
- {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.Debug|x64.Build.0 = Debug|Any CPU
- {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.Debug|x86.ActiveCfg = Debug|Any CPU
- {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.Debug|x86.Build.0 = Debug|Any CPU
+ {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.Release|x64.ActiveCfg = Release|Any CPU
- {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.Release|x64.Build.0 = Release|Any CPU
- {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.Release|x86.ActiveCfg = Release|Any CPU
- {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.Release|x86.Build.0 = Release|Any CPU
- {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {F79A67A1-4BA2-48F8-A7DD-A72E316EF6CD}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.Debug|x64.ActiveCfg = Debug|Any CPU
- {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.Debug|x64.Build.0 = Debug|Any CPU
- {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.Debug|x86.ActiveCfg = Debug|Any CPU
- {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.Debug|x86.Build.0 = Debug|Any CPU
+ {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.Release|x64.ActiveCfg = Release|Any CPU
- {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.Release|x64.Build.0 = Release|Any CPU
- {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.Release|x86.ActiveCfg = Release|Any CPU
- {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.Release|x86.Build.0 = Release|Any CPU
- {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {F870E2E7-FA64-4B2F-968A-90B36AB7AAA9}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.Debug|x64.ActiveCfg = Debug|Any CPU
- {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.Debug|x64.Build.0 = Debug|Any CPU
- {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.Debug|x86.ActiveCfg = Debug|Any CPU
- {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.Debug|x86.Build.0 = Debug|Any CPU
+ {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.Release|x64.ActiveCfg = Release|Any CPU
- {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.Release|x64.Build.0 = Release|Any CPU
- {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.Release|x86.ActiveCfg = Release|Any CPU
- {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.Release|x86.Build.0 = Release|Any CPU
- {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU
- {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU
- {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.CodeAnalysisDebug|x64.ActiveCfg = Debug|Any CPU
- {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.CodeAnalysisDebug|x64.Build.0 = Debug|Any CPU
+ {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {F8F92AA4-A376-4679-A9D4-60E7B7FBF477}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.Debug|x64.ActiveCfg = Debug|Any CPU
- {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.Debug|x64.Build.0 = Debug|Any CPU
- {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.Debug|x86.ActiveCfg = Debug|Any CPU
- {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.Debug|x86.Build.0 = Debug|Any CPU
+ {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
{FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
{FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
{FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.Release|x64.ActiveCfg = Release|Any CPU
- {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.Release|x64.Build.0 = Release|Any CPU
- {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.Release|x86.ActiveCfg = Release|Any CPU
- {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.Release|x86.Build.0 = Release|Any CPU
+ {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {FEC19BDA-4904-4005-8C09-68E82E8BEF6A}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{7525BB88-6142-4A26-93B9-A30C6983390A} = {9D360D43-0C05-49D6-84DB-4E7AB2F38F82}
@@ -2362,7 +1956,7 @@ Global
{776872D9-76FA-407B-BA69-08E25A24E5CE} = {D417E929-2B3A-46AC-BBE8-027ADB63A790}
{8F47F5EC-2F57-4030-B658-7B1002DA90C2} = {D417E929-2B3A-46AC-BBE8-027ADB63A790}
{98F4461F-84D0-4C57-A11F-47E871BD04A0} = {D417E929-2B3A-46AC-BBE8-027ADB63A790}
- {EA393253-E9C8-422A-8CFD-4FDB529B3F8D} = {D417E929-2B3A-46AC-BBE8-027ADB63A790}
+ {4AE0B284-72F2-49C7-9B42-812EBE379FFB} = {D417E929-2B3A-46AC-BBE8-027ADB63A790}
{19DE0F35-D204-4FD8-A553-A19ECE05E24D} = {DEEB9163-3966-4E5E-9AB5-FBB3E01AC82A}
{183E084F-2C3B-4A6D-A8CE-6CDF3DC499AC} = {DEEB9163-3966-4E5E-9AB5-FBB3E01AC82A}
{0413DB7D-8B35-423F-9752-D75C9225E7DE} = {DEEB9163-3966-4E5E-9AB5-FBB3E01AC82A}
@@ -2406,10 +2000,10 @@ Global
{7E4B15FB-E8C4-419A-A31C-9310FD9062BD} = {8F47F5EC-2F57-4030-B658-7B1002DA90C2}
{2645C9F3-9ED5-4806-AB09-DAD9BE90C67B} = {98F4461F-84D0-4C57-A11F-47E871BD04A0}
{F218643D-2E74-4309-820E-206A54B7133F} = {98F4461F-84D0-4C57-A11F-47E871BD04A0}
- {459868D2-54DC-415B-B1AB-BE39BDBD352F} = {EA393253-E9C8-422A-8CFD-4FDB529B3F8D}
- {6DD5F9E5-09D3-4763-A91B-E824812285CB} = {EA393253-E9C8-422A-8CFD-4FDB529B3F8D}
- {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57} = {6DD5F9E5-09D3-4763-A91B-E824812285CB}
- {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D} = {6DD5F9E5-09D3-4763-A91B-E824812285CB}
+ {DA5A3BAC-74C9-4EF9-B2FF-BFA4BF38F80F} = {4AE0B284-72F2-49C7-9B42-812EBE379FFB}
+ {459868D2-54DC-415B-B1AB-BE39BDBD352F} = {4AE0B284-72F2-49C7-9B42-812EBE379FFB}
+ {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57} = {DA5A3BAC-74C9-4EF9-B2FF-BFA4BF38F80F}
+ {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D} = {DA5A3BAC-74C9-4EF9-B2FF-BFA4BF38F80F}
{372E8E3E-29D5-4B4D-88A2-4711CD628C4E} = {F12939F1-D55A-4CE9-9F33-8D959BFC7D6C}
{984CC812-9470-4A13-AFF9-CC44068D666C} = {F12939F1-D55A-4CE9-9F33-8D959BFC7D6C}
{A9AE40FF-1A21-414A-9FE7-3BE13644CC6D} = {F12939F1-D55A-4CE9-9F33-8D959BFC7D6C}
diff --git a/main/configure.in b/main/configure.in
index 65c111d125..91dc196c5a 100644
--- a/main/configure.in
+++ b/main/configure.in
@@ -235,7 +235,7 @@ fi
AM_CONDITIONAL(ENABLE_WINDOWSPLATFORM, [test x$enable_windowsplatform = xyes])
dnl Intl
-ALL_LINGUAS="cs da de es fr ja pt_BR tr pl it zh_TW zh_CN ru sl ca gl pt sv nl id hu nb"
+ALL_LINGUAS="cs da de es fr ja pt_BR tr pl it zh_TW zh_CN ru sl ca gl pt sv nl id hu nb ko"
AC_SUBST(ALL_LINGUAS)
GETTEXT_PACKAGE=monodevelop
AC_SUBST(GETTEXT_PACKAGE)
@@ -279,6 +279,7 @@ src/core/MonoDevelop.Core/Makefile
src/core/MonoDevelop.Projects.Formats.MSBuild/Makefile
src/core/MonoDevelop.Ide/Makefile
src/core/MonoDevelop.Startup/Makefile
+src/core/MonoDevelop.TextEditor.Tests/Makefile
src/tools/Makefile
src/tools/mdhost/Makefile
src/tools/mdtool/Makefile
@@ -347,6 +348,8 @@ src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/Mak
tests/Makefile
tests/UnitTests/Makefile
tests/UserInterfaceTests/Makefile
+tests/TestRunner/Makefile
+tests/Ide.Tests/Makefile
tests/MacPlatform.Tests/Makefile
Makefile
monodevelop
diff --git a/main/external/cecil b/main/external/cecil
-Subproject fc76b93e3e0064b2d751796878f9cbe88df1d5f
+Subproject 7944f512c91572ec6af9d2b0c9aff2d06051cef
diff --git a/main/external/debugger-libs b/main/external/debugger-libs
-Subproject 3a55b486ef764fdff55b180ffc638a73a46cf8b
+Subproject 6c961c3aa0648785cb4d82128e42149e863b0dc
diff --git a/main/external/fsharpbinding b/main/external/fsharpbinding
-Subproject 00bbc7b19f4828c4af4a8c77f4dd0416096dacf
+Subproject c1ff483ce0b3aaf22e613ddc6a7f365f6c0f34c
diff --git a/main/external/guiunit b/main/external/guiunit
-Subproject 903eebb644527360cb34195e1106dc94fe91c5e
+Subproject e6ce4d81067b8b9085947f16bd0236636ad9181
diff --git a/main/external/mono-addins b/main/external/mono-addins
-Subproject 1ad343b57e2653941032f98d7d4b1e0df150b83
+Subproject d1f96e1db0f8b18de2a35cd7a4a3fbdede403d0
diff --git a/main/external/nrefactory b/main/external/nrefactory
-Subproject 13b09287144b0c53e58399d735dd770d5dad653
+Subproject c47e3d159e314c4f19a1bbbb7f7b4744935d0de
diff --git a/main/external/nuget-binary b/main/external/nuget-binary
-Subproject 5b2cae8778d733df8685718650af0df52c232c7
+Subproject baab2c4fe82ecc5563a331a677e26d884c598ef
diff --git a/main/external/xwt b/main/external/xwt
-Subproject a53e439800de4f6503f52c0b07fc71756a41ccb
+Subproject 36791207842a996d1deb1c859c60b2bc51af066
diff --git a/main/po/es.po b/main/po/es.po
index 1fa3744863..17c278eb43 100644
--- a/main/po/es.po
+++ b/main/po/es.po
@@ -11,7 +11,7 @@ msgstr ""
"Project-Id-Version: MonoDevelop rev2237\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-02-12 11:17:35-0500\n"
-"PO-Revision-Date: 2009-12-11 05:24:32+0100\n"
+"PO-Revision-Date: 2014-05-24 02:01:43-0300\n"
"Last-Translator: Andrés G. Aragoneses <knocte@gmail.com>\n"
"Language-Team: Spanish <es@li.org>\n"
"Language: es\n"
@@ -143,8 +143,7 @@ msgstr "Extensión del objetivo"
msgid "Cannot create directory {0}, as a file with that name exists."
msgstr ""
"No se pudo crear el directorio {0} debido a que ya existe un archivo con ese "
-"nombre.No se pudo crear el directorio {0} porque ya existe un archivo con el "
-"mismo nombre."
+"nombre."
#: ../src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs:31
#: ../src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs:49
@@ -271,7 +270,7 @@ msgstr "Directorio de trabajo"
#: ../src/core/MonoDevelop.Core/MonoDevelop.Projects/Solution.cs:21
msgid "Startup item not set"
-msgstr "No se estableción un elemento de arranque"
+msgstr "No se estableció un elemento de arranque"
#: ../src/core/MonoDevelop.Core/MonoDevelop.Projects/Solution.cs:29
#, fuzzy
@@ -344,8 +343,8 @@ msgstr "Ejecutando {0} ..."
#: ../src/core/MonoDevelop.Core/MonoDevelop.Projects/DotNetProject.cs:121
#: ../src/core/MonoDevelop.Core/MonoDevelop.Projects/CompiledAssemblyProject.cs:6
msgid ""
-"Can not execute \"{0}\". The selected execution mode is not supported for ."
-"NET projects."
+"Can not execute \"{0}\". The selected execution mode is not supported for "
+".NET projects."
msgstr ""
#: ../src/core/MonoDevelop.Core/MonoDevelop.Projects/DotNetProject.cs:123
@@ -391,8 +390,8 @@ msgid ""
"reference is required to build the project you may get compilation errors."
msgstr ""
"El ensamblado '{0}' no ha sido encontrado. Asegúrese de que existe en el "
-"disco. Si la referencia es requerida para construir el proyecto es posible "
-"que obtenga errores de compilación."
+"disco. Si la referencia es requerida para construir el proyecto es posible que "
+"obtenga errores de compilación."
#: ../src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MD1/MD1DotNetProjectHandler.cs:5
msgid ""
@@ -483,8 +482,8 @@ msgid ""
"targetting ({2})"
msgstr ""
"El proyecto '{0}' está siendo guardado usando el formato de archivo '{1}', "
-"pero esta versión de Visual Studio no soporta el framework especificado para "
-"el proyecto ({2})"
+"pero esta versión de Visual Studio no soporta el framework especificado para el "
+"proyecto ({2})"
#: ../src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectHandler.cs:60
msgid "Invalid file path"
@@ -519,8 +518,8 @@ msgstr "No se pudo cargar la solución: {0}"
#: ../src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/SlnFileFormat.cs:58
msgid "Invalid Project definition on line number #{0} in file '{1}'. Ignoring."
msgstr ""
-"Definición de proyecto inválida en número de línea #{0} del archivo '{1}'. "
-"Se ignorará."
+"Definición de proyecto inválida en número de línea #{0} del archivo '{1}'. Se "
+"ignorará."
#: ../src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/SlnFileFormat.cs:60
msgid "Invalid Project type guid '{0}' on line #{1}. Ignoring."
@@ -530,8 +529,8 @@ msgstr "Tipo de proyecto guid '{0}' inválido en línea #{1}. Se ignorará."
msgid ""
"{0}({1}): Projects with non-local source (http://...) not supported. '{2}'."
msgstr ""
-"{0}({1}): Los proyectos con origen no local (http://...) no están "
-"soportados. '{2}'."
+"{0}({1}): Los proyectos con origen no local (http://...) no están soportados. "
+"'{2}'."
#: ../src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/SlnFileFormat.cs:66
msgid "Invalid project path found in {0} : {1}"
@@ -561,8 +560,8 @@ msgstr "Error al intentar cargar el proyecto '{0}': {1}"
#: ../src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/SlnFileFormat.cs:73
msgid ""
-"Invalid solution file. There are two projects with the same GUID. The "
-"project {0} will be ignored."
+"Invalid solution file. There are two projects with the same GUID. The project "
+"{0} will be ignored."
msgstr ""
#: ../src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/SlnFileFormat.cs:94
@@ -766,8 +765,8 @@ msgstr ""
#: ../src/core/MonoDevelop.Core/MonoDevelop.Core.addin.xml:15
msgid ""
-"Xamarin.iOS projects are not supported in MonoDevelop on Windows. You need "
-"to use Visual Studio, or Xamarin Studio on Mac."
+"Xamarin.iOS projects are not supported in MonoDevelop on Windows. You need to "
+"use Visual Studio, or Xamarin Studio on Mac."
msgstr ""
#: ../src/core/MonoDevelop.Core/frameworks/framework_NET_1_1.xml:0
@@ -1290,19 +1289,19 @@ msgstr "bloque de comentario"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/MonoDevelop-templates.xml:11
msgid "heading 1 block"
-msgstr ""
+msgstr "bloque de cabecera 1"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/MonoDevelop-templates.xml:11
msgid "heading 2 block"
-msgstr ""
+msgstr "bloque de cabecera 2"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/MonoDevelop-templates.xml:11
msgid "heading 3 block"
-msgstr ""
+msgstr "bloque de cabecera 3"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/MonoDevelop-templates.xml:11
msgid "heading 4 block"
-msgstr ""
+msgstr "bloque de cabecera 4"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/MonoDevelop-templates.xml:11
msgid "italic block"
@@ -1310,7 +1309,7 @@ msgstr "bloque en cursiva"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/MonoDevelop-templates.xml:11
msgid "paragraph block"
-msgstr ""
+msgstr "bloque de párrafo"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/MonoDevelop-templates.xml:11
msgid "Xml"
@@ -1919,7 +1918,7 @@ msgstr "Disposición activa"
#: ../src/core/MonoDevelop.Ide/ExtensionModel/Commands.addin.xml:6
msgid "Apply Policy..."
-msgstr ""
+msgstr "Aplicar Pólitica"
#: ../src/core/MonoDevelop.Ide/ExtensionModel/Commands.addin.xml:6
#, fuzzy
@@ -2154,11 +2153,11 @@ msgstr "Conmutar entre vista normal/ma_ximizada"
#: ../src/core/MonoDevelop.Ide/ExtensionModel/Commands.addin.xml:8
msgid "Reopen Closed Tab"
-msgstr ""
+msgstr "Volver a abrir la pestaña cerrada"
#: ../src/core/MonoDevelop.Ide/ExtensionModel/Commands.addin.xml:8
msgid "Opens the last tab that has been closed"
-msgstr ""
+msgstr "Abrir la última pestaña que se ha cerrado"
#: ../src/core/MonoDevelop.Ide/ExtensionModel/Commands.addin.xml:8
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/DefaultWorkbench.cs:26
@@ -2456,11 +2455,11 @@ msgstr ""
#: ../src/core/MonoDevelop.Ide/ExtensionModel/Commands.addin.xml:10
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/FeedbackDialog.cs:2
msgid "Send Feedback"
-msgstr ""
+msgstr "Envíe sus comentarios"
#: ../src/core/MonoDevelop.Ide/ExtensionModel/Commands.addin.xml:10
msgid "Send feedback to the MonoDevelop development team"
-msgstr ""
+msgstr "Envíe sus comentarios al equipo de desarrollo MonoDevelop"
#: ../src/core/MonoDevelop.Ide/ExtensionModel/Commands.addin.xml:10
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/SearchInSolutionSearchCategory.cs:2
@@ -2969,7 +2968,7 @@ msgstr "Atajos de teclado"
#: ../src/core/MonoDevelop.Ide/ExtensionModel/GlobalOptionsDialog.addin.xml:1
msgid "Fonts"
-msgstr ""
+msgstr "Fuentes"
#: ../src/core/MonoDevelop.Ide/ExtensionModel/GlobalOptionsDialog.addin.xml:1
#: ../external/mono-addins/Mono.Addins.Gui/Mono.Addins.Gui/AddinManagerDialog.cs:2
@@ -3774,8 +3773,8 @@ msgstr "MonoDevelop no puede iniciarse porque se ha detectado un error fatal."
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/AddinLoadErrorDialog.cs:4
#, fuzzy
msgid ""
-"{0} can run without these add-ins, but the functionality they provide will "
-"be missing."
+"{0} can run without these add-ins, but the functionality they provide will be "
+"missing."
msgstr ""
"MonoDevelop puede ejecutarse sin estos complementos, pero la funcionalidad "
"que proporcionan no estará disponible."
@@ -3923,7 +3922,7 @@ msgstr "Añadir archivos"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/FolderNodeBuilder.cs:34
msgid "Import From Folder"
-msgstr ""
+msgstr "Importar desde carpeta"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/FolderNodeBuilder.cs:35
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/FolderNodeBuilder.cs:43
@@ -4036,15 +4035,15 @@ msgstr "Ocurrió un error al renombar el directorio."
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFolderNodeBuilder.cs:7
msgid ""
-"The Delete option permanently removes the directory and any files it "
-"contains from your hard disk. Click Remove from Project if you only want to "
-"remove it from your current solution."
+"The Delete option permanently removes the directory and any files it contains "
+"from your hard disk. Click Remove from Project if you only want to remove it "
+"from your current solution."
msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFolderNodeBuilder.cs:8
msgid ""
-"The directory and any files it contains will be permanintly removed from "
-"your hard disk. "
+"The directory and any files it contains will be permanintly removed from your "
+"hard disk. "
msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFolderNodeBuilder.cs:11
@@ -5000,8 +4999,8 @@ msgid ""
"Whether the variable is an identifier, and should only accept valid "
"identifiers as input."
msgstr ""
-"Acaso la variable es un identificador, y debería aceptar sólo "
-"identificadores válidos como entrada."
+"Acaso la variable es un identificador, y debería aceptar sólo identificadores "
+"válidos como entrada."
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplateVariable.cs:3
msgid "A list of values for the user to choose from."
@@ -5023,8 +5022,8 @@ msgstr "Runtime de Mono no encontrado"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.OptionPanels/MonoRuntimePanel.cs:8
msgid ""
-"Please provide a valid directory prefix where mono is installed (for "
-"example, /usr)"
+"Please provide a valid directory prefix where mono is installed (for example, "
+"/usr)"
msgstr ""
"Por favor proporcione un directorio válido donde mono esté instalado (por "
"ejemplo, /usr)"
@@ -5033,8 +5032,8 @@ msgstr ""
msgid ""
"If you have a parallel installation of Mono you can register it here, so you "
"can use it for building and running projects. The <b>default runtime</b> is "
-"the .NET runtime to be used for building and running applications when none "
-"is specifically selected."
+"the .NET runtime to be used for building and running applications when none is "
+"specifically selected."
msgstr ""
#: ../src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Gui.OptionPanels.MonoRuntimePanelWidget.cs:2
@@ -5483,8 +5482,8 @@ msgstr "Activar mensajes InvalidCastException más detallados."
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
msgid ""
"Disable some JIT optimizations which are normally disabled when running "
-"inside the debugger. This is useful if you plan to attach to the running "
-"process with the debugger."
+"inside the debugger. This is useful if you plan to attach to the running process "
+"with the debugger."
msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
@@ -5520,47 +5519,47 @@ msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
msgid ""
"Comma separated list of expressions to trace. 'all' all assemlies, 'none' no "
-"assemblies, 'program' entry point assembly, 'assembly' specifies an "
-"assembly, 'T:Type' specifies a type, 'M:Type:Method' a method, 'N:"
-"Namespace' a namespace. 'disabled' don't print any output until toggled via "
-"SIGUSR2. Prefix with '-' to exclude and expression."
+"assemblies, 'program' entry point assembly, 'assembly' specifies an assembly, "
+"'T:Type' specifies a type, 'M:Type:Method' a method, 'N:Namespace' a "
+"namespace. 'disabled' don't print any output until toggled via SIGUSR2. Prefix with "
+"'-' to exclude and expression."
msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
msgid ""
"Possible values are 'error', 'critical', 'warning', 'message', 'info', "
-"'debug'. The default value is 'error'. Messages with a logging level "
-"greater then or equal to the log level will be printed to stdout/stderr."
+"'debug'. The default value is 'error'. Messages with a logging level greater "
+"then or equal to the log level will be printed to stdout/stderr."
msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
msgid ""
"Possible values are 'asm' (assembly loader), 'type', 'dll' (native "
-"library loader), 'gc' (garbage collector), 'cfg' (config file loader), "
-"'aot' (precompiler) and 'all'. The default value is 'all'. Changing the mask "
-"value allows you to display only messages for a certain component. You can "
-"use multiple masks by comma separating them. For example to see config file "
-"messages and assembly loader messages set you mask to 'asm,cfg'."
+"library loader), 'gc' (garbage collector), 'cfg' (config file loader), 'aot' "
+"(precompiler) and 'all'. The default value is 'all'. Changing the mask value "
+"allows you to display only messages for a certain component. You can use multiple "
+"masks by comma separating them. For example to see config file messages and "
+"assembly loader messages set you mask to 'asm,cfg'."
msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
msgid ""
"The possible values are `no' to disable the use of a C# customized "
-"serializer, or an integer that is the minimum number of uses before the "
-"runtime will produce a custom serializer (0 will produce a custom serializer "
-"on the first access, 50 will produce a serializer on the 50th use). Mono "
-"will fallback to an interpreted serializer if the serializer generation "
-"somehow fails. This behavior can be disabled by setting the option "
-"`nofallback' (for example: '0,nofallback')."
+"serializer, or an integer that is the minimum number of uses before the runtime will "
+"produce a custom serializer (0 will produce a custom serializer on the first "
+"access, 50 will produce a serializer on the 50th use). Mono will fallback to "
+"an interpreted serializer if the serializer generation somehow fails. This "
+"behavior can be disabled by setting the option `nofallback' (for example: "
+"'0,nofallback')."
msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
msgid ""
-"Overrides the default system configuration directory ($PREFIX/etc). It's "
-"used to locate machine.config file."
+"Overrides the default system configuration directory ($PREFIX/etc). It's used "
+"to locate machine.config file."
msgstr ""
-"Redefine el directorio predeterminado de configuración del sistema ($PREFIX/"
-"etc). Es usado para localizar el archivo machine.config."
+"Redefine el directorio predeterminado de configuración del sistema "
+"($PREFIX/etc). Es usado para localizar el archivo machine.config."
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
msgid ""
@@ -5571,32 +5570,31 @@ msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
msgid ""
-"If set, tells mono NOT to attempt using native asynchronous I/O services. "
-"In that case, a default select/poll implementation is used. Currently only "
+"If set, tells mono NOT to attempt using native asynchronous I/O services. In "
+"that case, a default select/poll implementation is used. Currently only "
"epoll() is supported."
msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
msgid ""
"If set, the runtime uses unmanaged collation (which actually means no "
-"culture-sensitive collation). It internally disables managed collation "
-"functionality invoked via the members of System.Globalization.CompareInfo "
-"class."
+"culture-sensitive collation). It internally disables managed collation functionality "
+"invoked via the members of System.Globalization.CompareInfo class."
msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
msgid ""
-"A colon-separated list of text encodings to try when turning externally-"
-"generated text (e.g. command-line arguments or filenames) into Unicode."
+"A colon-separated list of text encodings to try when turning "
+"externally-generated text (e.g. command-line arguments or filenames) into Unicode."
msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
msgid ""
"Provides a prefix the runtime uses to look for Global Assembly Caches. "
"Directories are separated by the platform path separator (colons on unix). "
-"MONO_GAC_PREFIX should point to the top directory of a prefixed install. Or "
-"to the directory provided in the gacutil /gacdir command. Example: /home/"
-"username/.mono:/usr/local/mono/"
+"MONO_GAC_PREFIX should point to the top directory of a prefixed install. Or to the "
+"directory provided in the gacutil /gacdir command. Example: "
+"/home/username/.mono:/usr/local/mono/"
msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
@@ -5631,15 +5629,15 @@ msgid ""
"Provides a search path to the runtime where to look for library files. This "
"is a tool convenient for debugging applications, but should not be used by "
"deployed applications as it breaks the assembly loader in subtle ways. "
-"Directories are separated by the platform path separator (colons on unix). "
-"Example: /home/username/lib:/usr/local/mono/lib"
+"Directories are separated by the platform path separator (colons on unix). Example: "
+"/home/username/lib:/usr/local/mono/lib"
msgstr ""
"Proporciona una ruta de búsqueda al runtime donde encontrar archivos de "
-"librerías. Esto es una conveniente utilidad para depurar aplicaciones, pero "
-"no debería usarse en aplicaciones desplegadas porque truca el cargador de "
-"ensamblados de varias formas. Los directorios se separan mediante el "
-"caracter de separación de rutas de la plataforma (en Unix son los dos puntos "
-"':'). Ejemplo: /home/username/lib:/usr/local/mono/lib"
+"librerías. Esto es una conveniente utilidad para depurar aplicaciones, pero no "
+"debería usarse en aplicaciones desplegadas porque truca el cargador de "
+"ensamblados de varias formas. Los directorios se separan mediante el caracter de "
+"separación de rutas de la plataforma (en Unix son los dos puntos ':'). Ejemplo: "
+"/home/username/lib:/usr/local/mono/lib"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
msgid ""
@@ -5661,12 +5659,12 @@ msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
msgid ""
-"If set, enables the System.Diagnostics.DefaultTraceListener, which will "
-"print the output of the System.Diagnostics Trace and Debug classes. It can "
-"be set to a filename, and to Console.Out or Console.Error to display output "
-"to standard output or standard error, respectively. If it's set to Console."
-"Out or Console.Error you can append an optional prefix that will be used "
-"when writing messages like this: Console.Error:MyProgramName."
+"If set, enables the System.Diagnostics.DefaultTraceListener, which will print "
+"the output of the System.Diagnostics Trace and Debug classes. It can be set "
+"to a filename, and to Console.Out or Console.Error to display output to "
+"standard output or standard error, respectively. If it's set to Console.Out or "
+"Console.Error you can append an optional prefix that will be used when writing "
+"messages like this: Console.Error:MyProgramName."
msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
@@ -5678,8 +5676,8 @@ msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
msgid ""
"When the the MONO_XDEBUG env var is set, debugging info for JITted code is "
-"emitted into a shared library, loadable into gdb. This enables, for example, "
-"to see managed frame names on gdb backtraces."
+"emitted into a shared library, loadable into gdb. This enables, for example, to "
+"see managed frame names on gdb backtraces."
msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
@@ -5696,8 +5694,8 @@ msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
msgid ""
-"When using a Mono that has been compiled with LLVM support, it forces Mono "
-"to fallback to its JIT engine and not use the LLVM backend"
+"When using a Mono that has been compiled with LLVM support, it forces Mono to "
+"fallback to its JIT engine and not use the LLVM backend"
msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Execution/MonoExecutionParameters.cs:3
@@ -5877,8 +5875,8 @@ msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/LogView.cs:26
msgid ""
"Console input is not supported when using the {0} output console. If your "
-"application needs to read data from the standard input, please set the 'Run "
-"in External Console' option in the project options."
+"application needs to read data from the standard input, please set the 'Run in "
+"External Console' option in the project options."
msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.CustomTools/CustomToolService.cs:2
@@ -6125,8 +6123,8 @@ msgstr "Se encontraron nuevos archivos en {0}"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide/RootWorkspace.cs:46
msgid ""
-"WARNING: Some documents may need to be closed, and unsaved data will be "
-"lost. You will be asked to save the unsaved documents."
+"WARNING: Some documents may need to be closed, and unsaved data will be lost. "
+"You will be asked to save the unsaved documents."
msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide/RootWorkspace.cs:46
@@ -6135,8 +6133,8 @@ msgid ""
"will be lost. You will be asked to save the unsaved documents."
msgstr ""
"ADVERTENCIA: Algunos documentos puede que necesiten ser recargados o "
-"cerrados, y los datos no guardados se perderán. Se le preguntará acerca de "
-"los documentos sin guardar."
+"cerrados, y los datos no guardados se perderán. Se le preguntará acerca de los "
+"documentos sin guardar."
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide/RootWorkspace.cs:46
msgid ""
@@ -6149,8 +6147,8 @@ msgid ""
"Some files may need to be reloaded, and editing status for those files (such "
"as the undo queue) will be lost."
msgstr ""
-"Algunos archivos puede que necesiten ser re-cargados, con lo que su estado "
-"de edición se perderá (por ejemplo la lista de cambios a deshacer)."
+"Algunos archivos puede que necesiten ser re-cargados, con lo que su estado de "
+"edición se perderá (por ejemplo la lista de cambios a deshacer)."
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide/RootWorkspace.cs:46
#: ../src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/GuiBuilderProject.cs:7
@@ -6207,7 +6205,7 @@ msgstr "S_obreescribir archivo"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide/MessageService.cs:7
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide/LogReportingStartup.cs:4
msgid "An error has occurred"
-msgstr ""
+msgstr "Se ha producido un error"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/MimeTypePolicyOptionsPanel.cs:10
msgid "Use default settings from '{0}'"
@@ -6502,8 +6500,8 @@ msgid ""
"Some project files have been changed from outside {0}. Do you want to "
"overwrite them?"
msgstr ""
-"Este archivo {0} ha sido modificado fuera de MonoDevelop. ¿Está seguro de "
-"que desea sobreescribir el archivo?"
+"Este archivo {0} ha sido modificado fuera de MonoDevelop. ¿Está seguro de que "
+"desea sobreescribir el archivo?"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide/ProjectOperations.cs:14
#, fuzzy
@@ -6543,8 +6541,8 @@ msgstr "El archivo o directorio '{0}' no pudo ser borrado."
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide/ProjectOperations.cs:26
#, fuzzy
msgid ""
-"An application is already running and will have to be stopped. Do you want "
-"to continue?"
+"An application is already running and will have to be stopped. Do you want to "
+"continue?"
msgstr ""
"El proyecto '{0}' está ejecutándose actualmente y tendría que ser detenido. "
"¿Desea continuar?"
@@ -6627,8 +6625,8 @@ msgid ""
"An error occurred while attempt to move/copy that file. Please check your "
"permissions."
msgstr ""
-"Ocurrió un error al intentar mover/copiar este archivo. Por favor, revise "
-"sus permisos."
+"Ocurrió un error al intentar mover/copiar este archivo. Por favor, revise sus "
+"permisos."
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide/ProjectOperations.cs:39
msgid "The link '{0}' in the project already includes the file '{1}'"
@@ -7136,8 +7134,8 @@ msgid ""
msgstr ""
"Actualizar todos los identificadores de recurso para coincidir con la nueva "
"política. Esto requerirá cambios en el código fuente que haga referencias a "
-"recursos con la antigua política. Los identificadores definidos "
-"explícitamente en el panel de propiedades de archivo no se cambiarán.\n"
+"recursos con la antigua política. Los identificadores definidos explícitamente "
+"en el panel de propiedades de archivo no se cambiarán.\n"
"\n"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects.OptionPanels/NamespaceSynchronisationPanel.cs:3
@@ -7294,14 +7292,14 @@ msgid ""
"After creating the project those features can be enabled or disabled in the "
"Project Options dialog, or by adding new projects to the solution.</small>"
msgstr ""
-"<small>Esta lista muestra una serie de funcionalidades que puede habilitar "
-"en el nuevo proyecto. Después de crear el proyecto, las funcionalidades "
-"pueden ser desactivadas o activadas en el diálogo de Opciones de proyecto, o "
+"<small>Esta lista muestra una serie de funcionalidades que puede habilitar en "
+"el nuevo proyecto. Después de crear el proyecto, las funcionalidades pueden "
+"ser desactivadas o activadas en el diálogo de Opciones de proyecto, o "
"mediante el añadido de nuevos proyectos a la solución.</small>"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/PolicyOptionsPanel.cs:6
msgid "Parent Policy"
-msgstr ""
+msgstr "Pólitica Padre"
#: ../src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ProjectFileSelectorDialog.cs:2
msgid "Select Project File..."
@@ -7410,8 +7408,8 @@ msgid ""
"You need a newer monodoc to use it externally from MonoDevelop. Using the "
"integrated help viewer now."
msgstr ""
-"Necesita un programa monodoc más reciente parapoder usarlo externamente "
-"desde MonoDevelop. Se usará de momento el visor de ayuda integrado."
+"Necesita un programa monodoc más reciente parapoder usarlo externamente desde "
+"MonoDevelop. Se usará de momento el visor de ayuda integrado."
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide/IdeStartup.cs:19
#, fuzzy
@@ -7431,8 +7429,7 @@ msgstr "Más..."
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderFileNodeBuilder.cs:2
msgid ""
"The Delete option permanently removes the file from your hard disk. Click "
-"Remove from Solution if you only want to remove it from your current "
-"solution."
+"Remove from Solution if you only want to remove it from your current solution."
msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderFileNodeBuilder.cs:2
@@ -7467,7 +7464,7 @@ msgstr "Edición"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Fonts/FontChooserPanelWidget.cs:2
msgid "Font"
-msgstr ""
+msgstr "Fuente"
#: ../src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Fonts.FontChooserPanelWidget.cs:2
#, fuzzy
@@ -7477,7 +7474,7 @@ msgstr "_Comentarios:"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/GtkAlertDialog.cs:3
#: ../src/addins/MacPlatform/Dialogs/MacAlertDialogHandler.cs:5
msgid "Apply to all"
-msgstr ""
+msgstr "Aplicar a todo"
#: ../src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.NewPolicySetDialog.cs:2
#, fuzzy
@@ -7492,11 +7489,11 @@ msgstr "Nombre del proyecto:"
#: ../src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.NewPolicySetDialog.cs:2
msgid "Copy Settings From:"
-msgstr ""
+msgstr "Copiar configuraciones desde:"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/ReferencesFinder.cs:7
msgid "Searching for references in solution..."
-msgstr ""
+msgstr "Buscando referencias en la solución..."
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/ReferencesFinder.cs:16
#, fuzzy
@@ -7546,7 +7543,7 @@ msgstr "El proyecto será guardado en"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/ExportProjectPolicyDialog.cs:1
msgid "No policies"
-msgstr ""
+msgstr "No hay póliticas"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/ExportProjectPolicyDialog.cs:3
#, fuzzy
@@ -7574,7 +7571,7 @@ msgstr ""
#: ../src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ExportProjectPolicyDialog.cs:2
msgid "Export policies to a file"
-msgstr ""
+msgstr "Exportar póliticas a un archivo"
#: ../src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ExportProjectPolicyDialog.cs:2
#: ../src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ApplyPolicyDialog.cs:2
@@ -7588,7 +7585,7 @@ msgstr "Archivo:"
#: ../src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ExportProjectPolicyDialog.cs:2
msgid "Policies to export:"
-msgstr ""
+msgstr "Póliticas a exportar:"
#: ../src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ExportProjectPolicyDialog.cs:2
#, fuzzy
@@ -7641,7 +7638,7 @@ msgstr "_Política:"
#: ../src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ApplyPolicyDialog.cs:2
msgid "Apply policies from file"
-msgstr ""
+msgstr "Aplicar póliticas desde un archivo"
#: ../src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ApplyPolicyDialog.cs:2
msgid "Policies to set or replace:"
@@ -7649,7 +7646,7 @@ msgstr ""
#: ../src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ApplyPolicyDialog.cs:2
msgid "_Apply policies"
-msgstr ""
+msgstr "_Aplicar póliticas"
#: ../src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ProjectSelectorDialog.cs:2
#, fuzzy
@@ -7737,7 +7734,7 @@ msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/FeedbackDialog.cs:2
msgid "Please enter some feedback"
-msgstr ""
+msgstr "Por favor, introduzca sus comentarios"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/FeedbackDialog.cs:2
#, fuzzy
@@ -7746,15 +7743,15 @@ msgstr "Formulario {0}"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/FeedbackDialog.cs:2
msgid "Your feedbacks: {0}"
-msgstr ""
+msgstr "Sus evaluaciones: {0}"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/FeedbackDialog.cs:4
msgid "Thank you for your feedback!"
-msgstr ""
+msgstr "Gracias por sus comentarios!"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/FeedbackDialog.cs:4
msgid "Feedbacks sent: {0}"
-msgstr ""
+msgstr "Evaluaciones enviadas: {0}"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Updater/AddinsUpdateHandler.cs:1
msgid "New add-in updates are available:"
@@ -7862,7 +7859,7 @@ msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ProjectLoadProgressMonitor.cs:4
msgid "Migrate"
-msgstr ""
+msgstr "Migrar"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ProjectLoadProgressMonitor.cs:4
#, fuzzy
@@ -7907,7 +7904,7 @@ msgstr "Detener siempre"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide/LogReportingStartup.cs:4
msgid "A fatal error has occurred"
-msgstr ""
+msgstr "Se ha producido un error grave"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide/LogReportingStartup.cs:5
msgid ""
@@ -7920,8 +7917,8 @@ msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide/LogReportingStartup.cs:6
msgid ""
-"Details of errors, along with anonymous installation information, can be "
-"sent to Xamarin to help improve {0}. Do you wish to send this information?"
+"Details of errors, along with anonymous installation information, can be sent "
+"to Xamarin to help improve {0}. Do you wish to send this information?"
msgstr ""
#: ../src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ExportSolutionDialog.cs:2
@@ -7958,7 +7955,7 @@ msgstr ""
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/AmbienceService.cs:7
msgid "Returns:"
-msgstr ""
+msgstr "Retorna:"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/AmbienceService.cs:7
#, fuzzy
@@ -7967,7 +7964,7 @@ msgstr "Valor"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/AmbienceService.cs:7
msgid "See also:"
-msgstr ""
+msgstr "Vea también:"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/CodeGenerationService.cs:2
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/CodeGenerationService.cs:3
@@ -8020,7 +8017,7 @@ msgstr "Comando"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/WelcomePageFeedItem.cs:191
#: ../src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/LogWidget.cs:25
msgid "Today"
-msgstr ""
+msgstr "Hoy"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/WelcomePageFeedItem.cs:194
#: ../src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/LogWidget.cs:25
@@ -8154,7 +8151,7 @@ msgstr "Solución"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/DefaultWelcomePage.cs:5
msgid "Xamarin News"
-msgstr ""
+msgstr "Noticias de Xamarin"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/WelcomePageFrame.cs:15
#, fuzzy
@@ -8582,8 +8579,8 @@ msgstr "Mensaje de resumen (selección múltiple):"
#: ../src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/StatusView.cs:34
msgid "Some of the files in this commit do not have ChangeLog messages."
msgstr ""
-"Algunos de los archivos en este conjunto de cambios no están referenciados "
-"en el mensaje del ChangeLog."
+"Algunos de los archivos en este conjunto de cambios no están referenciados en "
+"el mensaje del ChangeLog."
#: ../src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/StatusView.cs:34
msgid "You may have forgotten to unselect items."
@@ -8923,16 +8920,16 @@ msgid ""
"Are you sure you want to revert the changes from the revision selected on "
"these resources?"
msgstr ""
-"¿Está seguro de que desea revertir los cambios de la revisión seleccionada "
-"en estos recursos?"
+"¿Está seguro de que desea revertir los cambios de la revisión seleccionada en "
+"estos recursos?"
#: ../src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/RevertRevisionsCommands.cs:3
msgid ""
"Note: The reversion will occur in your working copy, so you will still need "
"to perform a commit to complete it."
msgstr ""
-"Atención: la reversión ocurrirá en su copia de trabajo, de manera que "
-"todavía tendrá que efectuar una protección para completarla."
+"Atención: la reversión ocurrirá en su copia de trabajo, de manera que todavía "
+"tendrá que efectuar una protección para completarla."
#: ../src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/RevertRevisionsCommands.cs:5
msgid "Reverting to revision {0}..."
@@ -9063,7 +9060,7 @@ msgstr "Lista de cambios"
#: ../src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/DiffWidget.cs:2
msgid "Both files are equal"
-msgstr ""
+msgstr "Ambos archivos son iguales"
#: ../src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/DiffWidget.cs:2
#, fuzzy
@@ -9413,7 +9410,7 @@ msgstr ""
#: ../src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs:58
#: ../src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs:72
msgid "What do you want to do?"
-msgstr ""
+msgstr "¿Qué quieres hacer?"
#: ../src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs:60
#: ../src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs:74
@@ -10013,17 +10010,17 @@ msgstr "Resuelto estado de conflicto de '{0}'"
#: ../src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs:141
#: ../src/addins/VersionControl/Subversion.Win32/SvnSharpClient.cs:721
msgid "Add (bin) '{0}'"
-msgstr ""
+msgstr "Agregar (bin) '{0}'"
#: ../src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs:141
#: ../src/addins/VersionControl/Subversion.Win32/SvnSharpClient.cs:723
msgid "Add '{0}'"
-msgstr ""
+msgstr "Agregar '{0}'"
#: ../src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs:141
#: ../src/addins/VersionControl/Subversion.Win32/SvnSharpClient.cs:727
msgid "Delete '{0}'"
-msgstr ""
+msgstr "Eliminar '{0}'"
#: ../src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs:141
#: ../src/addins/VersionControl/Subversion.Win32/SvnSharpClient.cs:731
@@ -10284,10 +10281,9 @@ msgstr "_Usar como fuente"
#: ../src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/GuiBuilderService.cs:17
msgid ""
-"You are requesting the file '{0}' to be used as source for an image. "
-"However, this file is already added to the project as a resource. Are you "
-"sure you want to continue (the file will have to be removed from the "
-"resource list)?"
+"You are requesting the file '{0}' to be used as source for an image. However, "
+"this file is already added to the project as a resource. Are you sure you "
+"want to continue (the file will have to be removed from the resource list)?"
msgstr ""
"Ha solicitado la utilización del archivo '{0}' como fuente para una imagen. "
"Sin embargo, este archivo ya se ha añadido al proyecto como recurso. ¿Está "
@@ -10362,8 +10358,8 @@ msgstr "Fuente"
#: ../src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/CodeBinder.cs:16
msgid ""
-"The class bound to the component '{0}' could not be found. This may be due "
-"to syntax errors in the source code file."
+"The class bound to the component '{0}' could not be found. This may be due to "
+"syntax errors in the source code file."
msgstr ""
"No ha podido encontrarse la clase asociada al componente '{0}'. Esto puede "
"ser causado por errores de sintaxis en el archivo de código fuente."
@@ -10371,8 +10367,8 @@ msgstr ""
#: ../src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/GtkProjectServiceExtension.cs:5
msgid ""
"ERROR: MonoDevelop could not find the Gtk# 2.0 development package. "
-"Compilation of projects depending on Gtk# libraries will fail. You may need "
-"to install development packages for gtk-sharp-2.0."
+"Compilation of projects depending on Gtk# libraries will fail. You may need to install "
+"development packages for gtk-sharp-2.0."
msgstr ""
"ERROR: MonoDevelop no ha podido encontrar el paquete de desarrollo de Gtk# "
"2.0. Por tanto, la compilación de proyectos dependientes de librerías Gtk# "
@@ -10495,8 +10491,8 @@ msgstr "Haga clic para crear una acción"
#: ../src/addins/MonoDevelop.GtkCore/libstetic/editor/ActionGroupEditor.cs:5
msgid ""
-"Are you sure you want to delete the action '{0}'? It will be removed from "
-"all menus and toolbars."
+"Are you sure you want to delete the action '{0}'? It will be removed from all "
+"menus and toolbars."
msgstr ""
"¿Está seguro de que desea eliminar la acción '{0}'? Al hacerlo, sería "
"eliminada de todos los menús y barras de herramientas."
@@ -10764,10 +10760,10 @@ msgstr "Diseñador de componentes"
#: ../src/addins/MonoDevelop.GtkCore/libstetic/stetic.glade:133
msgid ""
"You are trying to add a non-container widget into the main window. In "
-"<b>GTK#</b>, widget positioning is controlled by a special type of widgets "
-"called <b>Container</b> widgets. If you don't place the widget into a "
-"container, it will fill the all the available space in the window. Are you "
-"sure you want to continue?"
+"<b>GTK#</b>, widget positioning is controlled by a special type of widgets called "
+"<b>Container</b> widgets. If you don't place the widget into a container, it "
+"will fill the all the available space in the window. Are you sure you want to "
+"continue?"
msgstr ""
"Está tratando de añadir un componente no contenedor en la ventana principal. "
"En <b>Gtk#</b>, el posicionamiento de componentes es controlado por un tipo "
@@ -11067,8 +11063,8 @@ msgid ""
"Some of the projects require that files have comments when they are "
"committed."
msgstr ""
-"Algunos de los proyectos requieren que los archivos tengan comentarios "
-"cuando se protejen."
+"Algunos de los proyectos requieren que los archivos tengan comentarios cuando "
+"se protejen."
#: ../src/addins/ChangeLogAddIn/CommitDialogExtensionWidget.cs:2
msgid "Click on the 'Details' button for more info."
@@ -11115,8 +11111,8 @@ msgstr ""
#: ../src/addins/ChangeLogAddIn/gtk-gui/MonoDevelop.ChangeLogAddIn.AddLogEntryDialog.cs:1
msgid ""
-"To change the ChangeLog creation and update policies, open the options "
-"dialog of the project or solution and click on the 'ChangeLog Integration\" "
+"To change the ChangeLog creation and update policies, open the options dialog "
+"of the project or solution and click on the 'ChangeLog Integration\" "
"section."
msgstr ""
"Para cambiar las políticas de creación y actualización de ChangeLogs (listas "
@@ -11148,9 +11144,9 @@ msgid ""
msgstr ""
"<b>Actualizar el ChangeLog más cercano</b>\n"
"El archivo de ChangeLog más cercano en la jerarquía de directorios se "
-"actualizará (bajo el directorio en el que se haga la subida de código). Si "
-"no se encuentra ninguno, se mostrará un mensaje de advertencia. Nunca se "
-"crearán archivos de ChangeLog automáticamente."
+"actualizará (bajo el directorio en el que se haga la subida de código). Si no se "
+"encuentra ninguno, se mostrará un mensaje de advertencia. Nunca se crearán "
+"archivos de ChangeLog automáticamente."
#: ../src/addins/ChangeLogAddIn/gtk-gui/MonoDevelop.ChangeLogAddIn.ProjectOptionPanelWidget.cs:1
msgid "One ChangeLog in the project root directory"
@@ -11165,8 +11161,8 @@ msgid ""
msgstr ""
"<b>ChangeLog por proyecto individual</b>\n"
"Todos los cambios hechos en los archivos del proyecto se guardarán en un "
-"archivo de ChangeLog individual, situado en el directorio raíz del proyecto. "
-"El archivo de ChangeLog se creará si no existe."
+"archivo de ChangeLog individual, situado en el directorio raíz del proyecto. El "
+"archivo de ChangeLog se creará si no existe."
#: ../src/addins/ChangeLogAddIn/gtk-gui/MonoDevelop.ChangeLogAddIn.ProjectOptionPanelWidget.cs:1
msgid "One ChangeLog in each directory"
@@ -11257,19 +11253,19 @@ msgstr "Buscando componentes..."
#: ../src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport/MemberExistsException.cs:2
msgid ""
-"Cannot add {0} '{1}' to class '{2}', because there is already a {3} with "
-"that name with an incompatible return type."
+"Cannot add {0} '{1}' to class '{2}', because there is already a {3} with that "
+"name with an incompatible return type."
msgstr ""
-"No se pudo añadir {0} '{1}' a la clase '{2}', porque ya existe un {3} con "
-"ese nombre, con un tipo de retorno incompatible."
+"No se pudo añadir {0} '{1}' a la clase '{2}', porque ya existe un {3} con ese "
+"nombre, con un tipo de retorno incompatible."
#: ../src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport/MemberExistsException.cs:2
msgid ""
-"Cannot add {0} '{1}' to class '{2}', because there is already a {3} with "
-"that name."
+"Cannot add {0} '{1}' to class '{2}', because there is already a {3} with that "
+"name."
msgstr ""
-"No se pudo añadir {0} '{1}' a la clase '{2}', porque ya existe un {3} con "
-"ese nombre."
+"No se pudo añadir {0} '{1}' a la clase '{2}', porque ya existe un {3} con ese "
+"nombre."
#: ../src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/TypeReference.cs:3
#: ../src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Projects/ProjectReferenceDescriptor.cs:3
@@ -11456,8 +11452,8 @@ msgid ""
"Require a specific version of the assembly. A warning will be issued if the "
"specific version is not found in the system."
msgstr ""
-"Requerir una versión específica del ensamblado. Se lanzará una advertencia "
-"si la versión específica no se encuentra en el sistema."
+"Requerir una versión específica del ensamblado. Se lanzará una advertencia si "
+"la versión específica no se encuentra en el sistema."
#: ../src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Projects/ProjectReferenceDescriptor.cs:3
msgid "Package that provides this reference."
@@ -11487,8 +11483,8 @@ msgid ""
"Root directory of source files and projects. File paths will be shown "
"relative to this directory."
msgstr ""
-"El directorio raíz de los proyectos y archivos de código fuente. Las rutas "
-"de los archivos se mostrarán como relativas con respecto a este directorio."
+"El directorio raíz de los proyectos y archivos de código fuente. Las rutas de "
+"los archivos se mostrarán como relativas con respecto a este directorio."
#: ../src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Projects/WorkspaceItemDescriptor.cs:2
msgid "File Format"
@@ -11746,7 +11742,8 @@ msgid "Loading solution file {0}"
msgstr "Cargando archivo de solución {0}"
#: ../src/addins/MonoDevelop.Autotools/MakefileGeneratorTool.cs:7
-msgid "Error: Makefile generation supported only for solutions.\n"
+msgid ""
+"Error: Makefile generation supported only for solutions.\n"
msgstr ""
"Error: La generación de Makefile sólo está soportada para soluciones.\n"
@@ -11771,9 +11768,9 @@ msgstr "Ya existen {0} en esta solución. ¿Desea sobreescribirlos? (S/N)"
msgid ""
" --simple-makefiles -s\n"
"\tGenerates set of Makefiles with the most common targets, and a "
-"configuration script that does a basic check of package dependencies. "
-"Default is to generate Makefile structure based on Autotools with the "
-"standard targets and configuration scripts."
+"configuration script that does a basic check of package dependencies. Default is to "
+"generate Makefile structure based on Autotools with the standard targets and "
+"configuration scripts."
msgstr ""
" --simple-makefiles -s\n"
"\tGenera un conjunto de Makefiles con los objetivos más comunes, y un script "
@@ -11785,13 +11782,13 @@ msgstr ""
msgid ""
" -d:default-config\n"
"\tConfiguration that the Makefile will build by default. Other "
-"configurations can be selected via the '--config' or '--enable-*' option of "
-"the generated configure script."
+"configurations can be selected via the '--config' or '--enable-*' option of the generated "
+"configure script."
msgstr ""
" -d:default-config\n"
"\tLa configuración que el Makefile construirá de forma predeterminada. "
-"Otrasconfiguraciones se pueden seleccionar gracias a las opciones '--config' "
-"o '--enable-*' del script de configuración."
+"Otrasconfiguraciones se pueden seleccionar gracias a las opciones '--config' o "
+"'--enable-*' del script de configuración."
#: ../src/addins/MonoDevelop.Autotools/MakefileOptionPanelWidget.cs:29
msgid "Specified makefile is invalid: {0}"
@@ -11806,8 +11803,8 @@ msgid ""
"'Sync References' is enabled, but one of Reference variables is not set. "
"Please correct this."
msgstr ""
-"La sincronización de referencias está activada, pero al menos una variable "
-"de referencias no se ha establecido. Corrija esto, por favor."
+"La sincronización de referencias está activada, pero al menos una variable de "
+"referencias no se ha establecido. Corrija esto, por favor."
#: ../src/addins/MonoDevelop.Autotools/MakefileOptionPanelWidget.cs:36
msgid "Invalid regex for Error messages: {0}"
@@ -11844,8 +11841,8 @@ msgid ""
"set of makefiles will have to be generated for the whole solution."
msgstr ""
"Tenga en cuenta que la generación de makefiles no está soportada para "
-"proyectos individuales. Se debe generar un conjunto de makefiles para la "
-"solución completa."
+"proyectos individuales. Se debe generar un conjunto de makefiles para la solución "
+"completa."
#: ../src/addins/MonoDevelop.Autotools/MakefileOptionPanelWidget.cs:52
msgid "Generate Makefile..."
@@ -11865,8 +11862,8 @@ msgid ""
"existing Makefile for use with the 'Makefile Integration' feature."
msgstr ""
"Imposible encontrar el Makefile especificado. Necesita especificar la ruta "
-"hacia un Makefile existente para su uso con la funcionalidad de 'Integración "
-"de Makefiles'."
+"hacia un Makefile existente para su uso con la funcionalidad de 'Integración de "
+"Makefiles'."
#: ../src/addins/MonoDevelop.Autotools/MakefileProjectServiceExtension.cs:3
msgid "Error resolving Makefile based project references for solution {0}"
@@ -11926,12 +11923,12 @@ msgstr "Makefile inválido '{0}'. Desactivando integración con Makefiles."
#: ../src/addins/MonoDevelop.Autotools/MakefileData.cs:74
msgid ""
"Enabling Makefile integration. You can choose to have either the Project or "
-"the Makefile be used as the master copy. This is done only when enabling "
-"this feature. After this, the Makefile will be taken as the master copy."
+"the Makefile be used as the master copy. This is done only when enabling this "
+"feature. After this, the Makefile will be taken as the master copy."
msgstr ""
-"Activando integración con Makefiles. Puede elegir entre usar el proyecto o "
-"el Makefile como copia maestra. Esta opción solamente se establece al "
-"activar esta característica."
+"Activando integración con Makefiles. Puede elegir entre usar el proyecto o el "
+"Makefile como copia maestra. Esta opción solamente se establece al activar "
+"esta característica."
#: ../src/addins/MonoDevelop.Autotools/MakefileData.cs:78
msgid ""
@@ -11961,8 +11958,8 @@ msgstr ""
#: ../src/addins/MonoDevelop.Autotools/MakefileData.cs:103
msgid ""
-"Files in variable '{0}' contains variables which cannot be parsed without "
-"the path to configure.in being set. Ignoring such files."
+"Files in variable '{0}' contains variables which cannot be parsed without the "
+"path to configure.in being set. Ignoring such files."
msgstr ""
"Los archivos en la variable '{0}' contienen variables que no pueden ser "
"parseadas sin que se haya establecido la ruta al archivo configure.in. Se "
@@ -12003,16 +12000,16 @@ msgstr ""
#: ../src/addins/MonoDevelop.Autotools/MakefileData.cs:204
msgid ""
-"A reference to the pkg-config package '{0}' is being emitted to the "
-"Makefile, because at least one assembly from the package is used in the "
-"project '{1}'. However, this dependency is not specified in the configure.in "
-"file, so you might need to add it to ensure that the project builds "
-"successfully on other systems."
+"A reference to the pkg-config package '{0}' is being emitted to the Makefile, "
+"because at least one assembly from the package is used in the project '{1}'. "
+"However, this dependency is not specified in the configure.in file, so you "
+"might need to add it to ensure that the project builds successfully on other "
+"systems."
msgstr ""
-"Se está emitiendo una referencia al paquete '{0}' porque al menos se "
-"necesita un ensamblado de éste en el proyecto '{1}'. Sin embargo, esta "
-"dependencia no se ha incluido en el configure.in, y es posible que necesite "
-"añadirla para poder compilar con éxito en otro sistemas."
+"Se está emitiendo una referencia al paquete '{0}' porque al menos se necesita "
+"un ensamblado de éste en el proyecto '{1}'. Sin embargo, esta dependencia no "
+"se ha incluido en el configure.in, y es posible que necesite añadirla para "
+"poder compilar con éxito en otro sistemas."
#: ../src/addins/MonoDevelop.Autotools/MakefileData.cs:244
msgid "Unable to find configure.in at '{0}'."
@@ -12109,8 +12106,8 @@ msgid ""
"optionally a prefix to be prepended to each file name."
msgstr ""
"Seleccione el tipo de archivos que desea sincronizar con el makefile. Para "
-"cada tipo especifique por favor la variable de makefile que contiene la "
-"lista y opcionalmente un prefijo a insertar en cada nombre de archivo."
+"cada tipo especifique por favor la variable de makefile que contiene la lista y "
+"opcionalmente un prefijo a insertar en cada nombre de archivo."
#: ../src/addins/MonoDevelop.Autotools/gtk-gui/MonoDevelop.Autotools.MakefileOptionPanelWidget.cs:1
msgid "Makefile variable name:"
@@ -12132,15 +12129,14 @@ msgstr "Buscar paquetes en el configure.in"
#: ../src/addins/MonoDevelop.Autotools/gtk-gui/MonoDevelop.Autotools.MakefileOptionPanelWidget.cs:1
msgid ""
"Select the kind of references you want to synchronize with the makefile. For "
-"each reference type please specify the makefile variable that holds the "
-"list, and optionally a prefix to be prepended to each reference name. You "
-"can specify the same variable name for several types of references."
+"each reference type please specify the makefile variable that holds the list, "
+"and optionally a prefix to be prepended to each reference name. You can "
+"specify the same variable name for several types of references."
msgstr ""
"Seleccione los tipos de referencias que desea sincronizar con el makefile. "
-"Para cada tipo, por favor, especifique una variable del makefile que "
-"contendrá la lista, y opcionalmente un prefijo para agregar a cada nombre de "
-"referencia. Puede usar el mismo nombre de variable para varios tipos de "
-"referencias."
+"Para cada tipo, por favor, especifique una variable del makefile que contendrá "
+"la lista, y opcionalmente un prefijo para agregar a cada nombre de "
+"referencia. Puede usar el mismo nombre de variable para varios tipos de referencias."
#: ../src/addins/MonoDevelop.Autotools/gtk-gui/MonoDevelop.Autotools.MakefileOptionPanelWidget.cs:1
msgid "Assembly References"
@@ -12161,16 +12157,16 @@ msgstr "Referencias a proyectos"
#: ../src/addins/MonoDevelop.Autotools/gtk-gui/MonoDevelop.Autotools.MakefileOptionPanelWidget.cs:1
msgid ""
"Select the Compiler message format for parsing the compiler errors and "
-"warnings. You can either select one of the built-in options, or specify "
-"custom regular expressions for errors and warnings. The regex must be the ."
-"net style regex. The following named groups are relevant : file, line, "
-"column, number (error number) and message."
+"warnings. You can either select one of the built-in options, or specify custom "
+"regular expressions for errors and warnings. The regex must be the .net style "
+"regex. The following named groups are relevant : file, line, column, number "
+"(error number) and message."
msgstr ""
"Seleccione el formato de mensaje del compilador para parsear los errores y "
-"las advertencias. Puede elegir una de las opciones ya incluidas o "
-"especificar expresiones regulares personalizadas. La expresión regular ha de "
-"ser compatible con el formato de .NET. Los siguientes nombres de grupos son "
-"relevantes: archivo, línea, columna, número (número de error) y mensaje."
+"las advertencias. Puede elegir una de las opciones ya incluidas o especificar "
+"expresiones regulares personalizadas. La expresión regular ha de ser "
+"compatible con el formato de .NET. Los siguientes nombres de grupos son relevantes: "
+"archivo, línea, columna, número (número de error) y mensaje."
#: ../src/addins/MonoDevelop.Autotools/gtk-gui/MonoDevelop.Autotools.MakefileOptionPanelWidget.cs:1
msgid "Error regex :"
@@ -12268,8 +12264,8 @@ msgid ""
"configure script."
msgstr ""
"Seleccione la configuración que el Makefile construirá de manera "
-"predeterminada. Otras configuraciones pueden ser seleccionadas gracias a la "
-"opción '--config' del script de configuración generado."
+"predeterminada. Otras configuraciones pueden ser seleccionadas gracias a la opción "
+"'--config' del script de configuración generado."
#: ../src/addins/MonoDevelop.Autotools/gtk-gui/MonoDevelop.Autotools.MakefileSwitchEditorWidget.cs:1
#, fuzzy
@@ -12278,14 +12274,14 @@ msgstr "<b>Esquemas</b>"
#: ../src/addins/MonoDevelop.Autotools/gtk-gui/MonoDevelop.Autotools.MakefileSwitchEditorWidget.cs:1
msgid ""
-"Use the following list to define new switches usable with autotools "
-"configure script. Each switch is mapped to a define that you can use to do "
-"conditional compilation in your source files."
+"Use the following list to define new switches usable with autotools configure "
+"script. Each switch is mapped to a define that you can use to do conditional "
+"compilation in your source files."
msgstr ""
"Use la lista a continuación para definir nuevas opciones utilizables con el "
-"script de configuración de autotools. Cada opción es mapeada a una "
-"definición que puede usar para llevar a cabo compilación condicional en su "
-"código fuente."
+"script de configuración de autotools. Cada opción es mapeada a una definición "
+"que puede usar para llevar a cabo compilación condicional en su código "
+"fuente."
#: ../src/addins/MonoDevelop.Autotools/gtk-gui/MonoDevelop.Autotools.MakefileSwitchEditor.cs:1
#, fuzzy
@@ -12573,8 +12569,8 @@ msgstr ""
#: ../src/addins/CSharpBinding/templates/PortableLibrary.xpt.xml:0
msgid ""
-"Creates a C# library that can be used in Windows, Silverlight, Windows "
-"Phone, MonoTouch and Mono for Android."
+"Creates a C# library that can be used in Windows, Silverlight, Windows Phone, "
+"MonoTouch and Mono for Android."
msgstr ""
#: ../src/addins/CSharpBinding/MonoDevelop.CSharp.Project/CompilerOptionsPanelWidget.cs:19
@@ -14312,11 +14308,11 @@ msgstr "Traducción Gettext"
#: ../src/addins/MonoDevelop.Gettext/MonoDevelop.Gettext/GettextFeature.cs:4
msgid ""
-"Add a Translation Project to the solution that will use gettext to generate "
-"a set of PO files for the new project."
+"Add a Translation Project to the solution that will use gettext to generate a "
+"set of PO files for the new project."
msgstr ""
-"Añadir un proyecto de traducción a la solución que usará gettext para "
-"generar un conjunto de archivos PO para el proyecto nuevo."
+"Añadir un proyecto de traducción a la solución que usará gettext para generar "
+"un conjunto de archivos PO para el proyecto nuevo."
#: ../src/addins/MonoDevelop.Gettext/gtk-gui/MonoDevelop.Gettext.GettextFeatureWidget.cs:2
msgid ""
@@ -14531,8 +14527,10 @@ msgid "Matches a form feed \\u000C."
msgstr "Casa con un formulario \\u000C."
#: ../src/addins/MonoDevelop.RegexToolkit/RegexElements.xml:1
-msgid "\\n"
-msgstr "\\n"
+msgid ""
+"\\n"
+msgstr ""
+"\\n"
#: ../src/addins/MonoDevelop.RegexToolkit/RegexElements.xml:1
msgid "Matches a new line \\u000A."
@@ -14610,8 +14608,8 @@ msgstr "$número"
msgid ""
"Substitutes the last substring matched by group number 'number' (decimal)."
msgstr ""
-"Sustituye la última subcadena coincidente por el grupo numérico "
-"'número' (decimal)."
+"Sustituye la última subcadena coincidente por el grupo numérico 'número' "
+"(decimal)."
#: ../src/addins/MonoDevelop.RegexToolkit/RegexElements.xml:1
msgid "${name}"
@@ -14684,7 +14682,8 @@ msgid ""
"Matches any character in the specified character group."
msgstr ""
"Grupo de caracteres positivo.\n"
-"Casa con cualquier caracter contenido en el grupo de caracteres especificado."
+"Casa con cualquier caracter contenido en el grupo de caracteres "
+"especificado."
#: ../src/addins/MonoDevelop.RegexToolkit/RegexElements.xml:1
msgid "[^character_group]"
@@ -15203,8 +15202,10 @@ msgid "Backreference Constructs"
msgstr "Construcciones de referencia de retroceso"
#: ../src/addins/MonoDevelop.RegexToolkit/RegexElements.xml:1
-msgid "\\number"
-msgstr "\\número"
+msgid ""
+"\\number"
+msgstr ""
+"\\número"
#: ../src/addins/MonoDevelop.RegexToolkit/RegexElements.xml:1
msgid ""
@@ -15717,8 +15718,8 @@ msgid ""
"This file {0} has been changed outside of {1}. Are you sure you want to "
"overwrite the file?"
msgstr ""
-"Este archivo {0} ha sido modificado fuera de MonoDevelop. ¿Está seguro de "
-"que desea sobreescribir el archivo?"
+"Este archivo {0} ha sido modificado fuera de MonoDevelop. ¿Está seguro de que "
+"desea sobreescribir el archivo?"
#: ../src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/SourceEditorView.cs:51
#, fuzzy
@@ -15775,8 +15776,8 @@ msgid ""
"<b>The file \"{0}\" has been changed outside of {1}.</b>\n"
"Do you want to keep your changes, or reload the file from disk?"
msgstr ""
-"Este archivo {0} ha sido modificado fuera de MonoDevelop. ¿Está seguro de "
-"que desea sobreescribir el archivo?"
+"Este archivo {0} ha sido modificado fuera de MonoDevelop. ¿Está seguro de que "
+"desea sobreescribir el archivo?"
#: ../src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/SourceEditorWidget.cs:39
#, fuzzy
@@ -16116,7 +16117,7 @@ msgstr "<b>Esquema de color</b>"
#: ../src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/SourceEditorPrintOperation.cs:4
msgid "Page %N of %Q"
-msgstr ""
+msgstr "Página %N de %Q"
#: ../src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/MessageBubbleCommands.cs:0
#, fuzzy
@@ -16604,8 +16605,8 @@ msgstr ""
#: ../src/addins/Deployment/MonoDevelop.Deployment/MonoDevelop.Deployment.Gui/PropertyProvider.cs:3
msgid ""
-"Use the relative path of the file in the project when deploying to the "
-"target directory."
+"Use the relative path of the file in the project when deploying to the target "
+"directory."
msgstr ""
"Usar la ruta relativa del archivo en el proyecto cuando se efectúe un "
"despliegue al directorio destino."
@@ -16755,8 +16756,8 @@ msgid ""
"Add a Packaging Project to the solution for generating different kinds of "
"packages for the new project."
msgstr ""
-"Añadir un proyecto de empaquetado a la solución para generar diferentes "
-"tipos de paquetes para el nuevo proyecto."
+"Añadir un proyecto de empaquetado a la solución para generar diferentes tipos "
+"de paquetes para el nuevo proyecto."
#: ../src/addins/Deployment/MonoDevelop.Deployment/gtk-gui/MonoDevelop.Deployment.Gui.CommandDeployEditorWidget.cs:1
msgid "Run in external console"
@@ -16897,9 +16898,9 @@ msgstr ""
#: ../src/addins/Deployment/MonoDevelop.Deployment/gtk-gui/MonoDevelop.Deployment.FileReplaceDialog.cs:1
msgid ""
-"There is already a file in the target directory that has the same name as "
-"the source file. You can keep the existing target file, or overwrite it with "
-"the source file."
+"There is already a file in the target directory that has the same name as the "
+"source file. You can keep the existing target file, or overwrite it with the "
+"source file."
msgstr ""
"Ya existe un archivo en el directorio objetivo que tiene el mismo nombre que "
"el archivo origen. Puede mantener el archivo objetivo existente o "
@@ -16911,8 +16912,8 @@ msgstr "Modificado:"
#: ../src/addins/Deployment/MonoDevelop.Deployment/gtk-gui/MonoDevelop.Deployment.FileReplaceDialog.cs:1
msgid ""
-"The source file will replace the existing target file if it has been "
-"modified more recently."
+"The source file will replace the existing target file if it has been modified "
+"more recently."
msgstr ""
"El archivo origen reemplazará el archivo de destino si éste se ha modificado "
"más recientemente."
@@ -16957,8 +16958,7 @@ msgid ""
msgstr ""
"Atención: la clave SSH para este host debe ser instalada en su sistema. Si "
"está protegida con contraseña, ésta debe ser cargada en un servidor de "
-"autenticación SSH en funcionamiento, como <i>ssh-agent</i> o <i>seahorse-"
-"agent</i>."
+"autenticación SSH en funcionamiento, como <i>ssh-agent</i> o <i>seahorse-agent</i>."
#: ../src/addins/Deployment/MonoDevelop.Deployment/templates/PackagingProject.xpt.xml:0
msgid "Packaging project"
@@ -17631,8 +17631,8 @@ msgid ""
"Set options for generating files to better integrate the application or "
"library in a Unix system."
msgstr ""
-"Establecer opciones para generar archivos para integrar mejor la aplicación "
-"o librería en un sistema Unix."
+"Establecer opciones para generar archivos para integrar mejor la aplicación o "
+"librería en un sistema Unix."
#: ../src/addins/Deployment/MonoDevelop.Deployment.Linux/gtk-gui/MonoDevelop.Deployment.Linux.BasicOptionPanelWidget.cs:1
msgid "Generate launch script"
@@ -18252,8 +18252,8 @@ msgstr "Ejecutar prueba"
#: ../src/addins/NUnit/Gui/TestResultsPad.cs:10
msgid ""
"<b>Passed</b>: {0} <b>Failed</b>: {1} <b>Errors</b>: {2} "
-"<b>Inconclusive</b>: {3} <b>Invalid</b>: {4} <b>Ignored</b>: {5} "
-"<b>Skipped</b>: {6} <b>Time</b>: {7}"
+"<b>Inconclusive</b>: {3} <b>Invalid</b>: {4} <b>Ignored</b>: {5} <b>Skipped</b>: {6} "
+" <b>Time</b>: {7}"
msgstr ""
#: ../src/addins/NUnit/Gui/TestResultsPad.cs:12
@@ -18391,8 +18391,8 @@ msgstr "El uso de dependencias cíclicas no está soportado."
#: ../src/addins/MacPlatform/MacPlatform.cs:13
msgid ""
"{0} requires a newer version of GTK+, which is included with the Mono "
-"Framework. Please download and install the latest stable Mono Framework "
-"package and restart {0}."
+"Framework. Please download and install the latest stable Mono Framework package and "
+"restart {0}."
msgstr ""
#: ../src/addins/MacPlatform/MacPlatform.cs:27
@@ -18556,7 +18556,7 @@ msgstr "Refactorizar"
#: ../src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.addin.xml:0
#, fuzzy
msgid "_Go to Declaration"
-msgstr "_Ir a declaración"
+msgstr "_Ir a la declaración"
#: ../src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoryCommands.cs:18
msgid "{0}, Line {1}"
@@ -19468,8 +19468,10 @@ msgid "Updating ASP.NET Designer File..."
msgstr ""
#: ../src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Gui/AspNetEditorExtension.cs:19
-msgid "Required for ASP.NET controls.\n"
-msgstr "Requerido para los controles ASP.NET\n"
+msgid ""
+"Required for ASP.NET controls.\n"
+msgstr ""
+"Requerido para los controles ASP.NET\n"
#: ../src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Gui/AspNetEditorExtension.cs:19
msgid ""
@@ -19480,8 +19482,10 @@ msgstr ""
"programáticamente en el servidor web."
#: ../src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Gui/AspNetEditorExtension.cs:19
-msgid "Unique identifier.\n"
-msgstr "Identificador único.\n"
+msgid ""
+"Unique identifier.\n"
+msgstr ""
+"Identificador único.\n"
#: ../src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Gui/AspNetEditorExtension.cs:19
msgid ""
@@ -19531,8 +19535,10 @@ msgid "Error launching web browser"
msgstr "Error al lanzar el navegador web"
#: ../src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Parser/SuggestedHandlerCompletionData.cs:6
-msgid "A suggested event handler method name.\n"
-msgstr "Un nombre sugerido para el método manejador de evento.\n"
+msgid ""
+"A suggested event handler method name.\n"
+msgstr ""
+"Un nombre sugerido para el método manejador de evento.\n"
#: ../src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Parser/SuggestedHandlerCompletionData.cs:6
msgid ""
@@ -20907,8 +20913,8 @@ msgstr "Condición"
#: ../src/addins/MonoDevelop.Debugger/gtk-gui/MonoDevelop.Debugger.AddTracePointDialog.cs:1
msgid ""
"<small>Expressions to be evaluated by the debugger can be included in the "
-"text by surrounding them with curly braces, for example: \"Value is {n}\".</"
-"small>"
+"text by surrounding them with curly braces, for example: \"Value is "
+"{n}\".</small>"
msgstr ""
#: ../src/addins/MonoDevelop.Debugger/gtk-gui/MonoDevelop.Debugger.AddTracePointDialog.cs:1
@@ -21283,9 +21289,7 @@ msgstr "D_esinstalar..."
#: ../external/mono-addins/Mono.Addins.Gui/Mono.Addins.Gui/InstallDialog.cs:1
#, fuzzy
msgid "The following packages will be uninstalled:"
-msgstr ""
-"<b>Los siguientes paquetes se desinstalarán:</b>\n"
-"\n"
+msgstr "<b>Los siguientes paquetes se desinstalarán:</b>"
#: ../external/mono-addins/Mono.Addins.Gui/Mono.Addins.Gui/InstallDialog.cs:1
#, fuzzy
@@ -21294,8 +21298,7 @@ msgid ""
"uninstalled:"
msgstr ""
"<b>Hay otros complementos que dependen de los anteriores, los cuales también "
-"serán desinstalados:</b>\n"
-"\n"
+"serán desinstalados:</b>"
#: ../external/mono-addins/Mono.Addins.Gui/Mono.Addins.Gui/InstallDialog.cs:1
#, fuzzy
@@ -21304,14 +21307,12 @@ msgid ""
"conflicts."
msgstr ""
"<b><span foreground=\"red\">Los complementos seleccionados no pueden "
-"instalarse porque existen conflictos de dependencias.</span></b>\n"
+"instalarse porque existen conflictos de dependencias.</span></b>"
#: ../external/mono-addins/Mono.Addins.Gui/Mono.Addins.Gui/InstallDialog.cs:1
#, fuzzy
msgid "The following packages will be installed:"
-msgstr ""
-"<b>Se instalarán los siguientes paquetes:</b>\n"
-"\n"
+msgstr "<b>Se instalarán los siguientes paquetes:</b>"
#: ../external/mono-addins/Mono.Addins.Gui/Mono.Addins.Gui/InstallDialog.cs:1
msgid " (in user directory)"
@@ -21320,16 +21321,12 @@ msgstr " (en directorio de usuario)"
#: ../external/mono-addins/Mono.Addins.Gui/Mono.Addins.Gui/InstallDialog.cs:1
#, fuzzy
msgid "The following packages need to be uninstalled:"
-msgstr ""
-"<b>Los paquetes siguientes necesitan desinstalarse:</b>\n"
-"\n"
+msgstr "<b>Los paquetes siguientes necesitan desinstalarse:</b>"
#: ../external/mono-addins/Mono.Addins.Gui/Mono.Addins.Gui/InstallDialog.cs:1
#, fuzzy
msgid "The following dependencies could not be resolved:"
-msgstr ""
-"<b>Las siguientes dependencias no pudieron resolverse:</b>\n"
-"\n"
+msgstr "<b>Las siguientes dependencias no pudieron resolverse:</b>"
#: ../external/mono-addins/Mono.Addins.Gui/Mono.Addins.Gui/InstallDialog.cs:1
msgid "Are you sure you want to cancel the installation?"
@@ -21369,7 +21366,9 @@ msgstr "La operación se completó con advertencias."
msgid ""
"Multiple selection:\n"
"\n"
-msgstr "Cortar la selección"
+msgstr ""
+"Cortar la selección\n"
+"\n"
#: ../external/mono-addins/Mono.Addins.Gui/Mono.Addins.Gui/AddinInfoView.cs:2
msgid "Enable"
@@ -21422,9 +21421,7 @@ msgstr "Descargar"
#: ../external/mono-addins/Mono.Addins.Gui/Mono.Addins.Gui/AddinInfoView.cs:2
#, fuzzy
msgid "The following depedencies required by this add-in are not available:"
-msgstr ""
-"<b>Las siguientes dependencias no pudieron resolverse:</b>\n"
-"\n"
+msgstr "<b>Las siguientes dependencias no pudieron resolverse:</b>"
#: ../external/mono-addins/Mono.Addins.Gui/gtk-gui/Mono.Addins.Gui.AddinInfoView.cs:2
#, fuzzy
@@ -21439,8 +21436,8 @@ msgstr "Versión"
#: ../external/mono-addins/Mono.Addins.Gui/gtk-gui/Mono.Addins.Gui.AddinInfoView.cs:2
msgid ""
"Long description of the add-in. Long description of the add-in. Long "
-"description of the add-in. Long description of the add-in. Long description "
-"of the add-in. Long description of the add-in. "
+"description of the add-in. Long description of the add-in. Long description of the "
+"add-in. Long description of the add-in. "
msgstr ""
#: ../external/mono-addins/Mono.Addins.Gui/gtk-gui/Mono.Addins.Gui.AddinInfoView.cs:2
@@ -24865,8 +24862,8 @@ msgstr ""
#: ../external/nrefactory/ICSharpCode.NRefactory.CSharp.Refactoring/CodeIssues/Uncategorized/RedundantBlockInDifferentBranchesIssue.cs:4
msgid ""
-"Blocks in if/else or switch branches can be simplified to any of the "
-"branches if they have the same block."
+"Blocks in if/else or switch branches can be simplified to any of the branches "
+"if they have the same block."
msgstr ""
#: ../external/nrefactory/ICSharpCode.NRefactory.CSharp.Refactoring/CodeIssues/Synced/CodeQuality/NonReadonlyReferencedInGetHashCodeIssue.cs:2
@@ -28318,3 +28315,4 @@ msgstr "Categorías:"
#~ msgid "The file '{0}' already exists. Do you want to replace it?."
#~ msgstr "El archivo '{0}' ya existe. ¿Desea reemplazarlo?"
+
diff --git a/main/po/sl.po b/main/po/sl.po
index fab646e7e7..8d4b243276 100644
--- a/main/po/sl.po
+++ b/main/po/sl.po
@@ -8070,7 +8070,7 @@ msgstr "Izberi imenik"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ClassPad/SolutionNodeBuilder.cs:4
msgid "Solution {0}"
-msgstr "Režitev {0}"
+msgstr "Rešitev {0}"
#: ../src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ClassPad/SolutionNodeBuilder.cs:4
msgid "Solution {0} (1 entry)"
diff --git a/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Deployment/WebDeployService.cs b/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Deployment/WebDeployService.cs
index 5c98cb2245..352048d0b1 100644
--- a/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Deployment/WebDeployService.cs
+++ b/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Deployment/WebDeployService.cs
@@ -123,15 +123,16 @@ namespace MonoDevelop.AspNet.Deployment
ICollection<WebDeployTarget> targets = null;
var response = ResponseType.None;
- do {
- response = (ResponseType) MessageService.RunCustomDialog (dialog, MessageService.RootWindow);
- } while (response != ResponseType.Ok && response != ResponseType.Cancel && response != ResponseType.DeleteEvent);
-
- if (response == Gtk.ResponseType.Ok)
- targets = dialog.GetSelectedTargets ();
-
- dialog.Destroy ();
-
+ try {
+ do {
+ response = (ResponseType) MessageService.RunCustomDialog (dialog, MessageService.RootWindow);
+ } while (response != ResponseType.Ok && response != ResponseType.Cancel && response != ResponseType.DeleteEvent);
+
+ if (response == Gtk.ResponseType.Ok)
+ targets = dialog.GetSelectedTargets ();
+ } finally {
+ dialog.Destroy ();
+ }
if (targets != null && targets.Count > 0)
Deploy (project, targets, IdeApp.Workspace.ActiveConfiguration);
}
diff --git a/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet/AspNetAppProject.cs b/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet/AspNetAppProject.cs
index a40bf72160..53de5999e2 100644
--- a/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet/AspNetAppProject.cs
+++ b/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet/AspNetAppProject.cs
@@ -328,6 +328,20 @@ namespace MonoDevelop.AspNet
return WebSubtype.Html;
case "JS":
return WebSubtype.JavaScript;
+ case "LESS":
+ return WebSubtype.Less;
+ case "SASS":
+ case "SCSS":
+ return WebSubtype.Sass;
+ case "EOT":
+ case "TTF":
+ case "OTF":
+ case "WOFF":
+ return WebSubtype.Font;
+ case "SVG":
+ return WebSubtype.Svg;
+ case "STYL":
+ return WebSubtype.Stylus;
default:
return WebSubtype.None;
}
@@ -754,6 +768,11 @@ namespace MonoDevelop.AspNet
Css,
Html,
JavaScript,
+ Less,
+ Font,
+ Svg,
+ Sass,
+ Stylus
}
diff --git a/main/src/addins/CBinding/Compiler/GNUCompiler.cs b/main/src/addins/CBinding/Compiler/GNUCompiler.cs
index ffd90e2d16..b75471a9ff 100644
--- a/main/src/addins/CBinding/Compiler/GNUCompiler.cs
+++ b/main/src/addins/CBinding/Compiler/GNUCompiler.cs
@@ -484,34 +484,33 @@ namespace CBinding
errorOutput = string.Empty;
int exitCode = -1;
- StringWriter swError = new StringWriter ();
- LogTextWriter chainedError = new LogTextWriter ();
- chainedError.ChainWriter (monitor.Log);
- chainedError.ChainWriter (swError);
+ using (var swError = new StringWriter ()) {
+ using (var chainedError = new LogTextWriter ()) {
+ chainedError.ChainWriter (monitor.Log);
+ chainedError.ChainWriter (swError);
- monitor.Log.WriteLine ("{0} {1}", command, args);
+ monitor.Log.WriteLine ("{0} {1}", command, args);
- AggregatedOperationMonitor operationMonitor = new AggregatedOperationMonitor (monitor);
-
- try {
- ProcessWrapper p = Runtime.ProcessService.StartProcess (command, args, baseDirectory, monitor.Log, chainedError, null);
- operationMonitor.AddOperation (p); //handles cancellation
+ using (var operationMonitor = new AggregatedOperationMonitor (monitor)) {
+ using (ProcessWrapper p = Runtime.ProcessService.StartProcess (command, args, baseDirectory, monitor.Log, chainedError, null)) {
+ operationMonitor.AddOperation (p); //handles cancellation
- p.WaitForOutput ();
- errorOutput = swError.ToString ();
- exitCode = p.ExitCode;
- p.Dispose ();
+ p.WaitForOutput ();
+ chainedError.UnchainWriter (monitor.Log);
+ chainedError.UnchainWriter (swError);
+
+ errorOutput = swError.ToString ();
+ exitCode = p.ExitCode;
- if (monitor.IsCancelRequested) {
- monitor.Log.WriteLine (GettextCatalog.GetString ("Build cancelled"));
- monitor.ReportError (GettextCatalog.GetString ("Build cancelled"), null);
- if (exitCode == 0)
- exitCode = -1;
+ if (monitor.IsCancelRequested) {
+ monitor.Log.WriteLine (GettextCatalog.GetString ("Build cancelled"));
+ monitor.ReportError (GettextCatalog.GetString ("Build cancelled"), null);
+ if (exitCode == 0)
+ exitCode = -1;
+ }
+ }
+ }
}
- } finally {
- chainedError.Close ();
- swError.Close ();
- operationMonitor.Dispose ();
}
return exitCode;
@@ -748,21 +747,22 @@ namespace CBinding
// expands backticked portions of the parameter-list using "sh" and "echo"
// TODO: Do this ourselves, relying on sh/echo - and launching an entire process just for this is ... excessive.
- public string ExpandBacktickedParameters(string tmp)
+ public string ExpandBacktickedParameters (string tmp)
{
// 1) Quadruple \ required, to escape both echo's and sh's escape character filtering
// 2) \\\" required inside of echo, to translate into \" in sh, so it translates back as a " to MD...
- string parameters = "-c \"echo -n " + tmp.Replace("\\", "\\\\\\\\").Replace("\"", "\\\\\\\"") + "\"";
- Process p = new Process();
-
- p.StartInfo.FileName = "sh";
- p.StartInfo.Arguments = parameters;
- p.StartInfo.UseShellExecute = false;
- p.StartInfo.RedirectStandardOutput = true;
- p.Start();
- p.WaitForExit();
+ string parameters = "-c \"echo " + tmp.Replace("\\", "\\\\\\\\").Replace("\"", "\\\\\\\"") + "\"";
+
+ var p = Process.Start (new ProcessStartInfo ("sh", parameters) {
+ UseShellExecute = false,
+ RedirectStandardOutput = true
+ });
+ p.Start ();
+ p.WaitForExit ();
- return p.StandardOutput.ReadToEnd();
+ //TODO: use async reads so we don't deadlock if stdout fills up
+ //TODO: check return code
+ return p.StandardOutput.ReadToEnd ().Trim ();
}
bool CheckApp (string app)
diff --git a/main/src/addins/CSharpBinding/CSharpBinding.addin.xml b/main/src/addins/CSharpBinding/CSharpBinding.addin.xml
index 0597d21a09..8ac2fe8f96 100644
--- a/main/src/addins/CSharpBinding/CSharpBinding.addin.xml
+++ b/main/src/addins/CSharpBinding/CSharpBinding.addin.xml
@@ -247,13 +247,13 @@
</Extension>
<Extension path = "/MonoDevelop/ProjectModel/Gui/DefaultPolicyPanels/SourceCode">
- <Section id="NameConventions" _label="Name Conventions" fill = "true" class="MonoDevelop.CSharp.Refactoring.CodeIssues.NameConventionPanel" />
+ <Section id="NameConventions" _label="Name Conventions" fill = "true" class="MonoDevelop.CSharp.Refactoring.CodeIssues.NameConventionPanel" icon="md-prefs-name-conventions" />
</Extension>
<Extension path = "/MonoDevelop/ProjectModel/Gui/ItemOptionPanels/SourceCode">
- <Section id="NameConventions" _label="Name Conventions" fill = "true" class="MonoDevelop.CSharp.Refactoring.CodeIssues.NameConventionPanel" />
+ <Section id="NameConventions" _label="Name Conventions" fill = "true" class="MonoDevelop.CSharp.Refactoring.CodeIssues.NameConventionPanel" icon="md-prefs-name-conventions" />
</Extension>
<Extension path = "/MonoDevelop/Ide/GlobalOptionsDialog/SourceCode">
- <Section id="NameConventions" _label="Name Conventions" fill = "true" class="MonoDevelop.CSharp.Refactoring.CodeIssues.NameConventionPanel" />
+ <Section id="NameConventions" _label="Name Conventions" fill = "true" class="MonoDevelop.CSharp.Refactoring.CodeIssues.NameConventionPanel" icon="md-prefs-name-conventions" />
</Extension>
<Extension path = "/MonoDevelop/SourceEditor2/TooltipProviders">
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.CodeGeneration/ExportCodeGenerator.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.CodeGeneration/ExportCodeGenerator.cs
index 0b1307aeb0..17471406fa 100644
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.CodeGeneration/ExportCodeGenerator.cs
+++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.CodeGeneration/ExportCodeGenerator.cs
@@ -201,7 +201,7 @@ namespace MonoDevelop.CodeGeneration
{
var generator = Options.CreateCodeGenerator ();
generator.AutoIndent = false;
- var ctx = MDRefactoringContext.Create (Options.Document, Options.Document.Editor.Caret.Location);
+ var ctx = MDRefactoringContext.Create (Options.Document, Options.Document.Editor.Caret.Location).Result;
if (ctx == null)
yield break;
var builder = ctx.CreateTypeSystemAstBuilder ();
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/CSharpCompletionTextEditorExtension.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/CSharpCompletionTextEditorExtension.cs
index b59ce42739..8219d2a098 100644
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/CSharpCompletionTextEditorExtension.cs
+++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/CSharpCompletionTextEditorExtension.cs
@@ -57,6 +57,7 @@ using ICSharpCode.NRefactory.CSharp.Refactoring;
using MonoDevelop.CSharp.Project;
using MonoDevelop.CSharp.Formatting;
using MonoDevelop.CSharp.Refactoring.CodeActions;
+using MonoDevelop.Refactoring;
namespace MonoDevelop.CSharp.Completion
{
@@ -181,14 +182,12 @@ namespace MonoDevelop.CSharp.Completion
void HandlePositionChanged (object sender, DocumentLocationEventArgs e)
{
StopPositionChangedTask ();
- Task.Factory.StartNew (delegate {
- var doc = Document;
- if (doc == null || doc.Editor == null)
- return;
- var ctx = MDRefactoringContext.Create (doc, doc.Editor.Caret.Location, src.Token);
- if (ctx != null)
- MDRefactoringCtx = ctx;
- });
+ var doc = Document;
+ if (doc == null || doc.Editor == null)
+ return;
+ MDRefactoringContext.Create (doc, doc.Editor.Caret.Location, src.Token).ContinueWith (t => {
+ MDRefactoringCtx = t.Result;
+ }, TaskContinuationOptions.ExecuteSynchronously);
}
[CommandUpdateHandler (CodeGenerationCommands.ShowCodeGenerationWindow)]
@@ -364,7 +363,7 @@ namespace MonoDevelop.CSharp.Completion
var completionDataFactory = new CompletionDataFactory (this, new CSharpResolver (ctx));
if (MDRefactoringCtx == null) {
src.Cancel ();
- MDRefactoringCtx = MDRefactoringContext.Create (Document, Document.Editor.Caret.Location);
+ MDRefactoringCtx = MDRefactoringContext.Create (Document, Document.Editor.Caret.Location).Result;
}
var engine = new MonoCSharpCompletionEngine (
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Formatting/CSharpTextEditorIndentation.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Formatting/CSharpTextEditorIndentation.cs
index b3ab2f49b5..04bb7e66a9 100644
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Formatting/CSharpTextEditorIndentation.cs
+++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Formatting/CSharpTextEditorIndentation.cs
@@ -409,7 +409,7 @@ namespace MonoDevelop.CSharp.Formatting
if (keyChar == ';' && !(textEditorData.CurrentMode is TextLinkEditMode) && !DoInsertTemplate () && !isSomethingSelected && PropertyService.Get (
"SmartSemicolonPlacement",
false
- )) {
+ ) && !(stateTracker.IsInsideComment || stateTracker.IsInsideString)) {
bool retval = base.KeyPress (key, keyChar, modifier);
DocumentLine curLine = textEditorData.Document.GetLine (textEditorData.Caret.Line);
string text = textEditorData.Document.GetTextAt (curLine);
@@ -506,7 +506,8 @@ namespace MonoDevelop.CSharp.Formatting
//inserted rather than just updating the stack due to moving around
SafeUpdateIndentEngine (textEditorData.Caret.Offset);
- automaticReindent = (stateTracker.NeedsReindent && lastCharInserted != '\0');
+ // Automatically reindent in text link mode will cause the mode exiting, therefore we need to prevent that.
+ automaticReindent = (stateTracker.NeedsReindent && lastCharInserted != '\0') && !(textEditorData.CurrentMode is TextLinkEditMode);
if (key == Gdk.Key.Return && (reIndent || automaticReindent)) {
if (textEditorData.Options.IndentStyle == IndentStyle.Virtual) {
if (textEditorData.GetLine (textEditorData.Caret.Line).Length == 0)
@@ -522,7 +523,7 @@ namespace MonoDevelop.CSharp.Formatting
DoReSmartIndent ();
}
}
- if (!skipFormatting) {
+ if (!skipFormatting && !(stateTracker.IsInsideComment || stateTracker.IsInsideString)) {
if (keyChar == ';' || keyChar == '}') {
using (var undo = textEditorData.OpenUndoGroup ()) {
if (OnTheFlyFormatting && textEditorData != null && !(textEditorData.CurrentMode is TextLinkEditMode) && !(textEditorData.CurrentMode is InsertionCursorEditMode)) {
@@ -549,7 +550,7 @@ namespace MonoDevelop.CSharp.Formatting
//and calls HandleCodeCompletion etc to handles completion
var result = base.KeyPress (key, keyChar, modifier);
- if (key == Gdk.Key.Return || key == Gdk.Key.KP_Enter) {
+ if (!indentationDisabled && (key == Gdk.Key.Return || key == Gdk.Key.KP_Enter)) {
DoReSmartIndent ();
}
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Parser/TypeSystemProvider.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Parser/TypeSystemProvider.cs
index cb35c1db68..475fac0ee1 100644
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Parser/TypeSystemProvider.cs
+++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Parser/TypeSystemProvider.cs
@@ -50,7 +50,7 @@ namespace MonoDevelop.CSharp.Parser
if (project != null) {
var projectFile = project.Files.GetFile (fileName);
- if (projectFile != null && projectFile.BuildAction != BuildAction.Compile)
+ if (projectFile != null && !TypeSystemParserNode.IsCompileBuildAction (projectFile.BuildAction))
result.Flags |= ParsedDocumentFlags.NonSerializable;
}
@@ -84,7 +84,7 @@ namespace MonoDevelop.CSharp.Parser
result.ParsedFile = pf;
result.Add (GetSemanticTags (unit));
- result.CreateRefactoringContext = (doc, token) => MDRefactoringContext.Create (doc, doc.Editor.Caret.Location, token);
+ result.CreateRefactoringContext = (doc, token) => MDRefactoringContext.Create (doc, doc.Editor.Caret.Location, token).Result;
result.CreateRefactoringContextWithEditor = (data, resolver, token) => new MDRefactoringContext ((DotNetProject)project, data, result, (CSharpAstResolver)resolver, TextLocation.Empty, token);
if (storeAst) {
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/Actions/MoveTypeToFile.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/Actions/MoveTypeToFile.cs
index b6a270bb85..bf1523421d 100644
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/Actions/MoveTypeToFile.cs
+++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/Actions/MoveTypeToFile.cs
@@ -71,8 +71,8 @@ namespace MonoDevelop.CSharp.Refactoring.CodeActions
string correctFileName = GetCorrectFileName (ctx, type);
if (IsSingleType (ctx)) {
FileService.RenameFile (ctx.TextEditor.FileName, correctFileName);
- if (ctx.Project != null)
- ctx.Project.Save (new NullProgressMonitor ());
+ if (ctx.FileContainerProject != null)
+ ctx.FileContainerProject.Save (new NullProgressMonitor ());
return;
}
@@ -94,16 +94,16 @@ namespace MonoDevelop.CSharp.Refactoring.CodeActions
content = content.Remove (start, end - start);
}
- if (context.Project != null) {
- string header = StandardHeaderService.GetHeader (context.Project, correctFileName, true);
+ if (context.FileContainerProject != null) {
+ string header = StandardHeaderService.GetHeader (context.FileContainerProject, correctFileName, true);
if (!string.IsNullOrEmpty (header))
content = header + context.TextEditor.EolMarker + StripHeader (content);
}
content = StripDoubleBlankLines (content);
File.WriteAllText (correctFileName, content);
- context.Project.AddFile (correctFileName);
- MonoDevelop.Ide.IdeApp.ProjectOperations.Save (context.Project);
+ context.FileContainerProject.AddFile (correctFileName);
+ MonoDevelop.Ide.IdeApp.ProjectOperations.Save (context.FileContainerProject);
}
static bool IsBlankLine (TextDocument doc, int i)
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/MDRefactoringContext.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/MDRefactoringContext.cs
index 8383529901..f4e7c2bab4 100644
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/MDRefactoringContext.cs
+++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/MDRefactoringContext.cs
@@ -25,6 +25,7 @@
// THE SOFTWARE.
using System;
+using System.Linq;
using ICSharpCode.NRefactory.CSharp;
using MonoDevelop.Projects;
using MonoDevelop.Core;
@@ -39,11 +40,14 @@ using MonoDevelop.CSharp.Refactoring.CodeIssues;
using Mono.TextEditor;
using ICSharpCode.NRefactory.CSharp.Resolver;
using MonoDevelop.CSharp.Formatting;
+using System.Threading.Tasks;
namespace MonoDevelop.CSharp.Refactoring.CodeActions
{
public class MDRefactoringContext : RefactoringContext, IRefactoringContext
{
+ MonoDevelop.Projects.Project fileContainerProject;
+
public TextEditorData TextEditor {
get;
private set;
@@ -54,6 +58,33 @@ namespace MonoDevelop.CSharp.Refactoring.CodeActions
private set;
}
+ public MonoDevelop.Projects.Project FileContainerProject {
+ get {
+ if (fileContainerProject == null)
+ fileContainerProject = FindProjectContainingFile () ?? Project;
+ return fileContainerProject;
+ }
+ }
+
+ MonoDevelop.Projects.Project FindProjectContainingFile ()
+ {
+ var file = TextEditor.FileName;
+ if (string.IsNullOrEmpty (file) || Project == null)
+ return null;
+
+ var pf = Project.GetProjectFile (file);
+ if (pf != null && (pf.Flags & ProjectItemFlags.Hidden) != 0) {
+ // The file is hidden in this project, so it may also be part of another project.
+ // Try to find a project in which this file is not hidden
+ foreach (var p in Project.ParentSolution.GetAllProjects ()) {
+ pf = p.GetProjectFile (file);
+ if (pf != null && (pf.Flags & ProjectItemFlags.Hidden) == 0)
+ return p;
+ }
+ }
+ return null;
+ }
+
public bool IsInvalid {
get {
if (Resolver == null || TextEditor == null)
@@ -189,15 +220,21 @@ namespace MonoDevelop.CSharp.Refactoring.CodeActions
return StartScript ();
}
- internal static MDRefactoringContext Create (Document document, TextLocation loc, CancellationToken cancellationToken = default (CancellationToken))
+ internal static Task<MDRefactoringContext> Create (Document document, TextLocation loc, CancellationToken cancellationToken = default (CancellationToken))
{
var shared = document.GetSharedResolver ();
- if (shared == null)
- return null;
- var sharedResolver = shared.Result;
- if (sharedResolver == null)
- return null;
- return new MDRefactoringContext (document, sharedResolver, loc, cancellationToken);
+ if (shared == null) {
+ var tcs = new TaskCompletionSource<MDRefactoringContext> ();
+ tcs.SetResult (null);
+ return tcs.Task;
+ }
+
+ return shared.ContinueWith (t => {
+ var sharedResolver = t.Result;
+ if (sharedResolver == null)
+ return null;
+ return new MDRefactoringContext (document, sharedResolver, loc, cancellationToken);
+ }, TaskContinuationOptions.ExecuteSynchronously);
}
internal MDRefactoringContext (Document document, CSharpAstResolver resolver, TextLocation loc, CancellationToken cancellationToken = default (CancellationToken)) : base (resolver, cancellationToken)
@@ -210,7 +247,7 @@ namespace MonoDevelop.CSharp.Refactoring.CodeActions
this.Project = document.Project as DotNetProject;
this.formattingOptions = document.GetFormattingOptions ();
this.location = loc;
- var policy = document.HasProject ? Project.Policies.Get<NameConventionPolicy> () : MonoDevelop.Projects.Policies.PolicyService.GetDefaultPolicy<NameConventionPolicy> ();
+ var policy = document.HasProject ? document.Project.Policies.Get<NameConventionPolicy> () : MonoDevelop.Projects.Policies.PolicyService.GetDefaultPolicy<NameConventionPolicy> ();
Services.AddService (typeof(NamingConventionService), policy.CreateNRefactoryService ());
Services.AddService (typeof(ICSharpCode.NRefactory.CSharp.CodeGenerationService), new CSharpCodeGenerationService());
}
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/MDRefactoringScript.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/MDRefactoringScript.cs
index 439ad8f26b..80db3eb8a1 100644
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/MDRefactoringScript.cs
+++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/MDRefactoringScript.cs
@@ -175,7 +175,7 @@ namespace MonoDevelop.CSharp.Refactoring.CodeActions
MDRefactoringScript script;
if (loadedDocument.Editor != context.TextEditor) {
- script = new MDRefactoringScript (MDRefactoringContext.Create (loadedDocument, loc, context.CancellationToken), FormattingOptions);
+ script = new MDRefactoringScript (MDRefactoringContext.Create (loadedDocument, loc, context.CancellationToken).Result, FormattingOptions);
startedScripts.Add (script);
} else {
script = this;
@@ -352,7 +352,7 @@ namespace MonoDevelop.CSharp.Refactoring.CodeActions
insertLocation = content.Length;
content = content.Substring (0, insertLocation) + newType.ToString (FormattingOptions) + content.Substring (insertLocation);
- var project = context.Project;
+ var project = context.FileContainerProject;
if (project != null) {
var policy = project.Policies.Get<CSharpFormattingPolicy> ();
var textPolicy = project.Policies.Get<TextStylePolicy> ();
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/NRefactoryCodeAction.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/NRefactoryCodeAction.cs
index 7b48e839ac..adec92c9d5 100644
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/NRefactoryCodeAction.cs
+++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeActions/NRefactoryCodeAction.cs
@@ -67,7 +67,7 @@ namespace MonoDevelop.CSharp.Refactoring.CodeActions
public override void BatchRun (Document document, TextLocation loc)
{
base.BatchRun (document, loc);
- var context = MDRefactoringContext.Create (document, loc);
+ var context = MDRefactoringContext.Create (document, loc).Result;
if (context == null)
return;
using (var script = context.StartScript ()) {
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeIssues/NamingInspection/NameConventionEditRuleDialog.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeIssues/NamingInspection/NameConventionEditRuleDialog.cs
index 6fd7df8189..574f10de7b 100644
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeIssues/NamingInspection/NameConventionEditRuleDialog.cs
+++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeIssues/NamingInspection/NameConventionEditRuleDialog.cs
@@ -129,14 +129,13 @@ namespace MonoDevelop.CSharp.Refactoring.CodeIssues
entrySuffix.Text = rule.RequiredSuffixes.FirstOrDefault ();
styleComboBox.AppendText ("PascalCase");
styleComboBox.AppendText ("CamelCase");
- styleComboBox.AppendText ("all_lower");
- styleComboBox.AppendText ("ALL_UPPER");
- styleComboBox.AppendText ("ALL_UPPER");
- styleComboBox.AppendText ("First_upper");
- styleComboBox.AppendText ("PascalCase_UnderscoreTolerant");
+ styleComboBox.AppendText ("ALLUPPER");
+ styleComboBox.AppendText ("alllower");
+ styleComboBox.AppendText ("Firstupper");
styleComboBox.AppendText ("PascalCase_underscoreTolerant");
- styleComboBox.AppendText ("CamelCase_UnderscoreTolerant");
+ styleComboBox.AppendText ("PascalCase_UnderscoreTolerant");
styleComboBox.AppendText ("CamelCase_underscoreTolerant");
+ styleComboBox.AppendText ("CamelCase_UnderscoreTolerant");
styleComboBox.Active = (int)rule.NamingStyle - 1;
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpCodeGenerator.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpCodeGenerator.cs
index a079e33406..57a309e0bc 100644
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpCodeGenerator.cs
+++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpCodeGenerator.cs
@@ -944,7 +944,7 @@ namespace MonoDevelop.CSharp.Refactoring
int offset = 0;
if (node != null) {
var loc = InsertUsingAfter (node) ? node.EndLocation : node.StartLocation;
- offset = doc.Editor.LocationToOffset (loc);
+ offset = Math.Max (0, doc.Editor.LocationToOffset (loc));
}
lines = policy.BlankLinesAfterUsings;
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Resolver/TextEditorResolverProvider.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Resolver/TextEditorResolverProvider.cs
index 1132838a39..c17bb0fd7b 100644
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Resolver/TextEditorResolverProvider.cs
+++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Resolver/TextEditorResolverProvider.cs
@@ -111,7 +111,18 @@ namespace MonoDevelop.CSharp.Resolver
var resolver = new CSharpAstResolver (doc.Compilation, unit, parsedFile);
resolver.ApplyNavigator (new NodeListResolveVisitorNavigator (node), CancellationToken.None);
var state = resolver.GetResolverStateBefore (node, CancellationToken.None);
- return state.LookupSimpleNameOrTypeName (expression, new List<IType> (), NameLookupMode.Expression);
+
+ var list = new List<IType> ();
+ int indexOf = expression.IndexOf ('`');
+ if (indexOf != -1) {
+ var intType = new PrimitiveType ("int").ToTypeReference ().Resolve (doc.Compilation);
+ var num = expression.Substring (indexOf + 1);
+ int number = int.Parse (num);
+ for (int i = 0; i < number; i++)
+ list.Add (intType);
+ expression = expression.Remove (indexOf);
+ }
+ return state.LookupSimpleNameOrTypeName (expression, list, NameLookupMode.Expression);
}
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Tooltips/LanguageItemTooltipProvider.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Tooltips/LanguageItemTooltipProvider.cs
index e166b5d963..619cb802d0 100644
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Tooltips/LanguageItemTooltipProvider.cs
+++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Tooltips/LanguageItemTooltipProvider.cs
@@ -205,6 +205,14 @@ namespace MonoDevelop.SourceEditor
return sig.GetAliasedTypeTooltip ((AliasTypeResolveResult)result);
}
+ if (data.Node is ThisReferenceExpression && result is ThisResolveResult) {
+ var resolver = file.GetResolver (doc.Compilation, doc.Editor.Caret.Location);
+ var sig = new SignatureMarkupCreator (resolver, doc.GetFormattingPolicy ().CreateOptions ());
+ sig.BreakLineAfterReturnType = false;
+
+ return sig.GetKeywordTooltip ("this", data.Node);
+ }
+
if (data.Node is TypeOfExpression) {
var resolver = file.GetResolver (doc.Compilation, doc.Editor.Caret.Location);
var sig = new SignatureMarkupCreator (resolver, doc.GetFormattingPolicy ().CreateOptions ());
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp/AstStockIcons.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp/AstStockIcons.cs
index da7488281a..aec03f9f17 100644
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp/AstStockIcons.cs
+++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp/AstStockIcons.cs
@@ -154,26 +154,24 @@ namespace MonoDevelop.CSharp
return result;
}
- public static string GetStockIcon (this EntityDeclaration element, bool showAccessibility = true)
+
+ public static string GetStockIcon (this EntityDeclaration element)
{
Accessibility acc = Accessibility.Public;
if (element is Accessor) {
- if (showAccessibility) {
- if (!GetAccessibility (element, out acc))
- GetAccessibility (element.Parent as EntityDeclaration, out acc);
- }
+ if (!GetAccessibility (element, out acc))
+ GetAccessibility (element.Parent as EntityDeclaration, out acc);
return methodIconTable [(int) (acc)];
}
- if (showAccessibility) {
- GetAccessibility (element, out acc);
- }
+ GetAccessibility (element, out acc);
if (element is TypeDeclaration) {
var type = element as TypeDeclaration;
+
switch (type.ClassType) {
case ClassType.Class:
return typeIconTable [0, (int) (acc)];
@@ -202,7 +200,7 @@ namespace MonoDevelop.CSharp
if (element is OperatorDeclaration || element is ConstructorDeclaration || element is DestructorDeclaration || element is Accessor)
return methodIconTable [(int) (acc)];
- if (element is PropertyDeclaration)
+ if (element is PropertyDeclaration || element is IndexerDeclaration)
return propertyIconTable [(int) (acc)];
if (element is EventDeclaration || element is CustomEventDeclaration)
return eventIconTable [(int) (acc)];
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp/PathedDocumentTextEditorExtension.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp/PathedDocumentTextEditorExtension.cs
index fc1c5f78d8..0cf7d02f18 100644
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp/PathedDocumentTextEditorExtension.cs
+++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp/PathedDocumentTextEditorExtension.cs
@@ -273,9 +273,9 @@ namespace MonoDevelop.CSharp
} else {
var node = memberList [n];
if (node is EntityDeclaration) {
- icon = ((EntityDeclaration)node).GetStockIcon (false);
+ icon = ((EntityDeclaration)node).GetStockIcon ();
} else {
- icon = ((EntityDeclaration)node.Parent).GetStockIcon (false);
+ icon = ((EntityDeclaration)node.Parent).GetStockIcon ();
}
}
return ImageService.GetIcon (icon, Gtk.IconSize.Menu);
@@ -301,6 +301,9 @@ namespace MonoDevelop.CSharp
if (node is OperatorDeclaration) {
line = Math.Max (1, ((OperatorDeclaration)node).OperatorToken.StartLocation.Line);
col = Math.Max (1, ((OperatorDeclaration)node).OperatorToken.StartLocation.Column);
+ } else if (node is IndexerDeclaration) {
+ line = Math.Max (1, ((IndexerDeclaration)node).ThisToken.StartLocation.Line);
+ col = Math.Max (1, ((IndexerDeclaration)node).ThisToken.StartLocation.Column);
} else if (node is EntityDeclaration && !(node is Accessor)) {
line = Math.Max (1, ((EntityDeclaration)node).NameToken.StartLocation.Line);
col = Math.Max (1, ((EntityDeclaration)node).NameToken.StartLocation.Column);
@@ -477,7 +480,7 @@ namespace MonoDevelop.CSharp
}
var curMember = unit.GetNodeAt<EntityDeclaration> (loc);
- if (curType == curMember)
+ if (curType == curMember || curType is DelegateDeclaration)
curMember = null;
if (isPathSet && curType == lastType && curMember == lastMember && curProject == lastProject)
return;
@@ -500,7 +503,7 @@ namespace MonoDevelop.CSharp
if (ownerProjects.Count > 1) {
// Current project if there is more than one
- result.Add (new PathEntry (ImageService.GetIcon (Document.Project.StockIcon), GLib.Markup.EscapeText (Document.Project.Name)) { Tag = Document.Project });
+ result.Add (new PathEntry (ImageService.GetIcon (Document.Project.StockIcon, Gtk.IconSize.Menu), GLib.Markup.EscapeText (Document.Project.Name)) { Tag = Document.Project });
}
if (curType == null) {
@@ -520,17 +523,17 @@ namespace MonoDevelop.CSharp
var pos = result.Count;
while (type != null) {
var declaringType = type.Parent as TypeDeclaration;
- result.Insert (pos, new PathEntry (ImageService.GetIcon (type.GetStockIcon (false), Gtk.IconSize.Menu), GetEntityMarkup (type)) { Tag = (AstNode)declaringType ?? unit });
+ result.Insert (pos, new PathEntry (ImageService.GetIcon (type.GetStockIcon (), Gtk.IconSize.Menu), GetEntityMarkup (type)) { Tag = (AstNode)declaringType ?? unit });
type = declaringType;
}
}
if (curMember != null) {
- result.Add (new PathEntry (ImageService.GetIcon (curMember.GetStockIcon (true), Gtk.IconSize.Menu), curMemberMarkup) { Tag = curMember });
+ result.Add (new PathEntry (ImageService.GetIcon (curMember.GetStockIcon (), Gtk.IconSize.Menu), curMemberMarkup) { Tag = curMember });
if (curMember is Accessor) {
var parent = curMember.Parent as EntityDeclaration;
if (parent != null)
- result.Insert (result.Count - 1, new PathEntry (ImageService.GetIcon (parent.GetStockIcon (true), Gtk.IconSize.Menu), GetEntityMarkup (parent)) { Tag = parent });
+ result.Insert (result.Count - 1, new PathEntry (ImageService.GetIcon (parent.GetStockIcon (), Gtk.IconSize.Menu), GetEntityMarkup (parent)) { Tag = parent });
}
}
diff --git a/main/src/addins/CSharpBinding/templates/SharedAssetsProject.xpt.xml b/main/src/addins/CSharpBinding/templates/SharedAssetsProject.xpt.xml
index 8b7b5398b1..3081121b31 100644
--- a/main/src/addins/CSharpBinding/templates/SharedAssetsProject.xpt.xml
+++ b/main/src/addins/CSharpBinding/templates/SharedAssetsProject.xpt.xml
@@ -5,10 +5,10 @@
<!-- Template Header -->
<TemplateConfiguration>
- <_Name>Shared Assets Project</_Name>
+ <_Name>Shared Project</_Name>
<_Category>C#</_Category>
<Icon>md-project-shared-assets</Icon>
- <_Description>Creates an empty shared assets project</_Description>
+ <_Description>Creates a project that allows sharing files between projects</_Description>
<DefaultFilename>Shared</DefaultFilename>
<LanguageName>C#</LanguageName>
</TemplateConfiguration>
@@ -20,10 +20,6 @@
<!-- Template Content -->
<Combine name = "${ProjectName}" directory = ".">
- <Options>
- <StartupProject>${ProjectName}</StartupProject>
- </Options>
-
<Project name = "${ProjectName}" directory = "." type = "SharedAssetsProject">
<Files>
<FileTemplateReference TemplateID="EmptyClass" name="MyClass.cs" />
diff --git a/main/src/addins/Deployment/MonoDevelop.Deployment.Linux/MonoDevelop.Deployment.Linux/DotDesktopViewWidget.cs b/main/src/addins/Deployment/MonoDevelop.Deployment.Linux/MonoDevelop.Deployment.Linux/DotDesktopViewWidget.cs
index 725b7adc10..bda4d65e6c 100644
--- a/main/src/addins/Deployment/MonoDevelop.Deployment.Linux/MonoDevelop.Deployment.Linux/DotDesktopViewWidget.cs
+++ b/main/src/addins/Deployment/MonoDevelop.Deployment.Linux/MonoDevelop.Deployment.Linux/DotDesktopViewWidget.cs
@@ -226,13 +226,16 @@ namespace MonoDevelop.Deployment.Linux
protected virtual void OnButtonAddCategoriesClicked(object sender, System.EventArgs e)
{
MenuCategorySelectorDialog dlg = new MenuCategorySelectorDialog ();
- if (MessageService.RunCustomDialog (dlg) == (int) Gtk.ResponseType.Ok) {
- foreach (string s in dlg.Selection)
- entry.Categories.Add (s);
- FillCategs ();
- NotifyChanged ();
+ try {
+ if (MessageService.RunCustomDialog (dlg) == (int) Gtk.ResponseType.Ok) {
+ foreach (string s in dlg.Selection)
+ entry.Categories.Add (s);
+ FillCategs ();
+ NotifyChanged ();
+ }
+ } finally {
+ dlg.Destroy ();
}
- dlg.Destroy ();
}
protected virtual void OnButtonRemoveCategoryClicked(object sender, System.EventArgs e)
diff --git a/main/src/addins/MacPlatform/MacInterop/Keychain.cs b/main/src/addins/MacPlatform/MacInterop/Keychain.cs
index 8f42a6024c..47ba3b4d49 100644
--- a/main/src/addins/MacPlatform/MacInterop/Keychain.cs
+++ b/main/src/addins/MacPlatform/MacInterop/Keychain.cs
@@ -510,18 +510,24 @@ namespace MonoDevelop.MacInterop
public static unsafe Tuple<string, string> FindInternetUserNameAndPassword (Uri uri)
{
+ var protocol = GetSecProtocolType (uri.Scheme);
+ return FindInternetUserNameAndPassword (uri, protocol);
+ }
+
+ public static unsafe Tuple<string, string> FindInternetUserNameAndPassword (Uri uri, SecProtocolType protocol)
+ {
var pathStr = string.Join (string.Empty, uri.Segments);
byte[] path = pathStr.Length > 0 ? Encoding.UTF8.GetBytes (pathStr.Substring (1)) : new byte[0]; // don't include the leading '/'
byte[] host = Encoding.UTF8.GetBytes (uri.Host);
var auth = GetSecAuthenticationType (uri.Query);
- var protocol = GetSecProtocolType (uri.Scheme);
- IntPtr passwordData = IntPtr.Zero;
+ IntPtr passwordData;
IntPtr item = IntPtr.Zero;
uint passwordLength = 0;
- var result = SecKeychainFindInternetPassword (CurrentKeychain, (uint) host.Length, host, 0, null,
- 0, null, (uint) path.Length, path, (ushort) uri.Port,
- protocol, auth, out passwordLength, out passwordData, ref item);
+ var result = SecKeychainFindInternetPassword (
+ CurrentKeychain, (uint) host.Length, host, 0, null,
+ 0, null, (uint) path.Length, path, (ushort) uri.Port,
+ protocol, auth, out passwordLength, out passwordData, ref item);
if (result != OSStatus.Ok)
return null;
@@ -631,7 +637,7 @@ namespace MonoDevelop.MacInterop
Any = 0
}
- enum SecProtocolType : int
+ public enum SecProtocolType : int
{
FTP = 1718906912,
FTPAccount = 1718906977,
diff --git a/main/src/addins/MacPlatform/MacProxyCredentialProvider.cs b/main/src/addins/MacPlatform/MacProxyCredentialProvider.cs
index be10e53fc0..1413de25e6 100644
--- a/main/src/addins/MacPlatform/MacProxyCredentialProvider.cs
+++ b/main/src/addins/MacPlatform/MacProxyCredentialProvider.cs
@@ -25,6 +25,7 @@
// THE SOFTWARE.
using System;
using System.Drawing;
+using System.Net;
using MonoDevelop.Core;
using MonoDevelop.Core.Web;
@@ -32,29 +33,97 @@ using MonoDevelop.Ide;
using MonoMac.AppKit;
using MonoMac.Foundation;
-using MonoDevelop.Components.MainToolbar;
-using System.Net;
+using MonoDevelop.MacInterop;
namespace MonoDevelop.MacIntegration
{
- public class MacProxyCredentialProvider : ICredentialProvider
+ class MacProxyCredentialProvider : ICredentialProvider
{
- string username, password;
+ object guiLock = new object();
+
+ public ICredentials GetCredentials (Uri uri, IWebProxy proxy, CredentialType credentialType, bool retrying)
+ {
+ // if looking for proxy credentials, we care about the proxy's URL, not the request URL
+ if (credentialType == CredentialType.ProxyCredentials) {
+ var proxyUri = proxy.GetProxy (uri);
+ if (proxyUri != null)
+ uri = proxyUri;
+ }
+
+ lock (guiLock) {
+ // If this is the first attempt, return any stored credentials. If they fail, we'll be called again.
+ if (!retrying) {
+ var creds = GetExistingCredentials (uri, credentialType);
+ if (creds != null)
+ return creds;
+ }
+
+ return GetCredentialsFromUser (uri, proxy, credentialType);
+ }
+ }
+
+ static ICredentials GetSystemProxyCredentials (Uri uri)
+ {
+ var kind = SecProtocolType.Any;
+ if (uri.Scheme == "http")
+ kind = SecProtocolType.HTTPProxy;
+ else if (uri.Scheme == "https")
+ kind = SecProtocolType.HTTPSProxy;
+
+ //TODO: get username from SystemConfiguration APIs so we don't trigger a double auth prompt
+ var existing = Keychain.FindInternetUserNameAndPassword (uri, kind);
+ if (existing != null && existing.Item1 != null && existing.Item2 != null)
+ return new NetworkCredential (existing.Item1, existing.Item2);
+
+ return null;
+ }
+
+ static ICredentials GetExistingCredentials (Uri uri, CredentialType credentialType)
+ {
+ if (credentialType == CredentialType.ProxyCredentials) {
+ var proxyCreds = GetSystemProxyCredentials (uri);
+ if (proxyCreds != null)
+ return proxyCreds;
+ }
+
+ var rootUri = new Uri (uri.GetComponents (UriComponents.SchemeAndServer, UriFormat.SafeUnescaped));
+ var existing =
+ Keychain.FindInternetUserNameAndPassword (uri) ??
+ Keychain.FindInternetUserNameAndPassword (rootUri);
+
+ return existing != null ? new NetworkCredential (existing.Item1, existing.Item2) : null;
+ }
- public ICredentials GetCredentials (Uri uri, IWebProxy proxy, CredentialType credentialType, ICredentials existingCredentials, bool retrying)
+ static ICredentials GetCredentialsFromUser (Uri uri, IWebProxy proxy, CredentialType credentialType)
{
- bool result = false;
+ NetworkCredential result = null;
+
DispatchService.GuiSyncDispatch (() => {
+
using (var ns = new NSAutoreleasePool ()) {
- var message = string.Format ("{0} needs {1} credentials to access {2}.", BrandingService.ApplicationName,
- credentialType == CredentialType.ProxyCredentials ? "proxy" : "request", uri.Host);
+ var message = credentialType == CredentialType.ProxyCredentials
+ ? GettextCatalog.GetString (
+ "{0} needs credentials to access the proxy server {1}.",
+ BrandingService.ApplicationName,
+ uri.Host
+ )
+ : GettextCatalog.GetString (
+ "{0} needs credentials to access {1}.",
+ BrandingService.ApplicationName,
+ uri.Host
+ );
- NSAlert alert = NSAlert.WithMessage ("Credentials Required", "OK", "Cancel", null, message);
- alert.Icon = NSApplication.SharedApplication.ApplicationIconImage;
+ var alert = NSAlert.WithMessage (
+ GettextCatalog.GetString ("Credentials Required"),
+ GettextCatalog.GetString ("OK"),
+ GettextCatalog.GetString ("Cancel"),
+ null,
+ message
+ );
- NSView view = new NSView (new RectangleF (0, 0, 313, 91));
+ alert.Icon = NSApplication.SharedApplication.ApplicationIconImage;
- var creds = CredentialsUtility.GetCredentialsForUriFromICredentials (uri, existingCredentials);
+ var view = new NSView (new RectangleF (0, 0, 313, 91));
var usernameLabel = new NSTextField (new RectangleF (17, 55, 71, 17)) {
Identifier = "usernameLabel",
@@ -69,7 +138,6 @@ namespace MonoDevelop.MacIntegration
view.AddSubview (usernameLabel);
var usernameInput = new NSTextField (new RectangleF (93, 52, 200, 22));
- usernameInput.StringValue = creds != null ? creds.UserName : string.Empty;
view.AddSubview (usernameInput);
var passwordLabel = new NSTextField (new RectangleF (22, 23, 66, 17)) {
@@ -84,18 +152,25 @@ namespace MonoDevelop.MacIntegration
view.AddSubview (passwordLabel);
var passwordInput = new NSSecureTextField (new RectangleF (93, 20, 200, 22));
- passwordInput.StringValue = creds != null ? creds.Password : string.Empty;
view.AddSubview (passwordInput);
alert.AccessoryView = view;
- result = alert.RunModal () == 1;
- username = usernameInput.StringValue;
- password = passwordInput.StringValue;
+ if (alert.RunModal () != 1)
+ return;
+
+ var username = usernameInput.StringValue;
+ var password = passwordInput.StringValue;
+ result = new NetworkCredential (username, password);
}
});
- return result ? new NetworkCredential (username, password) : null;
+ // store the obtained credentials in the keychain
+ // but don't store for the root url since it may have other credentials
+ if (result != null)
+ Keychain.AddInternetPassword (uri, result.UserName, result.Password);
+
+ return result;
}
}
}
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserViewContent.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserViewContent.cs
index 27cda8d5b5..258d72c063 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserViewContent.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserViewContent.cs
@@ -35,6 +35,7 @@ using MonoDevelop.Ide.Gui.Content;
using MonoDevelop.Ide.Navigation;
using MonoDevelop.Projects;
using System.Linq;
+using MonoDevelop.Ide;
namespace MonoDevelop.AssemblyBrowser
{
@@ -123,8 +124,13 @@ namespace MonoDevelop.AssemblyBrowser
}
if (member == null)
return;
- var url = AssemblyBrowserWidget.GetIdString (member);
- widget.Open (url);
+ var url = AssemblyBrowserWidget.GetIdString (member);
+ try {
+ widget.Open (url);
+ } catch (Exception e) {
+ LoggingService.LogError ("Error while navigating to " + url, e);
+ MessageService.ShowException (e, GettextCatalog.GetString ("{0} could not be opened", url), GettextCatalog.GetString ("Error while opening assembly"));
+ }
}
#endregion
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserWidget.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserWidget.cs
index 471365a097..553a92d73f 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserWidget.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserWidget.cs
@@ -380,8 +380,10 @@ namespace MonoDevelop.AssemblyBrowser
if (nav != null)
return nav;
// Constructor may be a generated default without implementation.
- if (helpUrl.StartsWith ("M:", StringComparison.Ordinal) && helpUrl.EndsWith (".#ctor", StringComparison.Ordinal))
- return SearchMember ("T" + helpUrl.Substring (1, helpUrl.Length - 1 - ".#ctor".Length));
+ var ctorIdx = helpUrl.IndexOf (".#ctor", StringComparison.Ordinal);
+ if (helpUrl.StartsWith ("M:", StringComparison.Ordinal) && ctorIdx > 0) {
+ return SearchMember ("T" + helpUrl.Substring (1, ctorIdx - 1));
+ }
return null;
}
@@ -1419,7 +1421,11 @@ namespace MonoDevelop.AssemblyBrowser
// Select the result.
if (selectReference) {
ITreeNavigator navigator = TreeView.GetNodeAtObject (result);
- navigator.Selected = true;
+ if (navigator != null) {
+ navigator.Selected = true;
+ } else {
+ LoggingService.LogWarning (result + " could not be found.");
+ }
}
return result;
diff --git a/main/src/addins/MonoDevelop.Autotools/MakefileProjectServiceExtension.cs b/main/src/addins/MonoDevelop.Autotools/MakefileProjectServiceExtension.cs
index 8bbfc36f51..5c71be9a49 100644
--- a/main/src/addins/MonoDevelop.Autotools/MakefileProjectServiceExtension.cs
+++ b/main/src/addins/MonoDevelop.Autotools/MakefileProjectServiceExtension.cs
@@ -163,24 +163,28 @@ namespace MonoDevelop.Autotools
string baseDir = project.BaseDirectory;
string args = string.Format ("-j {0} {1}", data.ParallelProcesses, data.BuildTargetName);
- StringWriter swOutput = new StringWriter ();
- LogTextWriter chainedOutput = new LogTextWriter ();
- chainedOutput.ChainWriter (monitor.Log);
- chainedOutput.ChainWriter (swOutput);
-
- ProcessWrapper process = Runtime.ProcessService.StartProcess ("make",
- args,
- baseDir,
- chainedOutput,
- chainedOutput,
- null);
- process.WaitForOutput ();
-
- exitCode = process.ExitCode;
- output = swOutput.ToString ();
- chainedOutput.Close ();
- swOutput.Close ();
- monitor.Step ( 1 );
+ using (var swOutput = new StringWriter ()) {
+ using (var chainedOutput = new LogTextWriter ()) {
+ chainedOutput.ChainWriter (monitor.Log);
+ chainedOutput.ChainWriter (swOutput);
+
+ using (ProcessWrapper process = Runtime.ProcessService.StartProcess ("make",
+ args,
+ baseDir,
+ chainedOutput,
+ chainedOutput,
+ null)) {
+ process.WaitForOutput ();
+
+ chainedOutput.UnchainWriter (monitor.Log);
+ chainedOutput.UnchainWriter (swOutput);
+
+ exitCode = process.ExitCode;
+ output = swOutput.ToString ();
+ monitor.Step ( 1 );
+ }
+ }
+ }
}
catch ( Exception e )
{
diff --git a/main/src/addins/MonoDevelop.Autotools/SolutionDeployer.cs b/main/src/addins/MonoDevelop.Autotools/SolutionDeployer.cs
index 9d95424cdd..3bb43a271b 100644
--- a/main/src/addins/MonoDevelop.Autotools/SolutionDeployer.cs
+++ b/main/src/addins/MonoDevelop.Autotools/SolutionDeployer.cs
@@ -178,33 +178,39 @@ namespace MonoDevelop.Autotools
monitor.Step ( 1 );
- StringWriter sw = new StringWriter ();
- LogTextWriter chainedOutput = new LogTextWriter ();
- chainedOutput.ChainWriter (monitor.Log);
- chainedOutput.ChainWriter (sw);
-
- ProcessWrapper process = Runtime.ProcessService.StartProcess ( "make",
- "dist",
- baseDir,
- chainedOutput,
- monitor.Log,
- null );
- process.WaitForOutput ();
-
- if ( process.ExitCode > 0 )
- throw new Exception ( GettextCatalog.GetString ("An unspecified error occurred while running '{0}'", "make dist") );
-
- monitor.Step ( 1 );
-
- // FIXME: hackish way to get the created tarball's filename
- string output = sw.ToString();
- int targz = output.LastIndexOf ( "tar.gz" );
- int begin = output.LastIndexOf ( '>', targz );
-
- string filename = output.Substring ( begin + 1, (targz - begin) + 5 ).Trim ();
-
- FileService.CopyFile (Path.Combine (baseDir, filename), Path.Combine (targetDir, filename));
- monitor.Step ( 1 );
+ using (var sw = new StringWriter ()) {
+ using (var chainedOutput = new LogTextWriter ()) {
+ chainedOutput.ChainWriter (monitor.Log);
+ chainedOutput.ChainWriter (sw);
+
+ using (ProcessWrapper process = Runtime.ProcessService.StartProcess ("make",
+ "dist",
+ baseDir,
+ chainedOutput,
+ monitor.Log,
+ null)) {
+ process.WaitForOutput ();
+
+ chainedOutput.UnchainWriter (monitor.Log);
+ chainedOutput.UnchainWriter (sw);
+
+ if ( process.ExitCode > 0 )
+ throw new Exception ( GettextCatalog.GetString ("An unspecified error occurred while running '{0}'", "make dist") );
+ }
+
+ monitor.Step ( 1 );
+
+ // FIXME: hackish way to get the created tarball's filename
+ string output = sw.ToString();
+ int targz = output.LastIndexOf ( "tar.gz" );
+ int begin = output.LastIndexOf ( '>', targz );
+
+ string filename = output.Substring ( begin + 1, (targz - begin) + 5 ).Trim ();
+
+ FileService.CopyFile (Path.Combine (baseDir, filename), Path.Combine (targetDir, filename));
+ monitor.Step ( 1 );
+ }
+ }
}
catch ( Exception e )
{
diff --git a/main/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft.AspNet/AspNetSoftDebuggerEngine.cs b/main/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft.AspNet/AspNetSoftDebuggerEngine.cs
index cafdf34ba8..1006bca8cc 100644
--- a/main/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft.AspNet/AspNetSoftDebuggerEngine.cs
+++ b/main/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft.AspNet/AspNetSoftDebuggerEngine.cs
@@ -39,9 +39,9 @@ using Mono.Debugging.Soft;
namespace MonoDevelop.Debugger.Soft.AspNet
{
- public class AspNetSoftDebuggerEngine: IDebuggerEngine
+ public class AspNetSoftDebuggerEngine: DebuggerEngineBackend
{
- public bool CanDebugCommand (ExecutionCommand command)
+ public override bool CanDebugCommand (ExecutionCommand command)
{
var cmd = command as AspNetExecutionCommand;
return cmd != null && SoftDebuggerEngine.CanDebugRuntime (cmd.TargetRuntime);
@@ -65,7 +65,7 @@ namespace MonoDevelop.Debugger.Soft.AspNet
throw new InvalidOperationException (string.Format ("Unknown runtime version '{0}'", version));
}
- public DebuggerStartInfo CreateDebuggerStartInfo (ExecutionCommand command)
+ public override DebuggerStartInfo CreateDebuggerStartInfo (ExecutionCommand command)
{
var cmd = (AspNetExecutionCommand) command;
var evars = new Dictionary<string, string>(cmd.EnvironmentVariables);
@@ -104,14 +104,9 @@ namespace MonoDevelop.Debugger.Soft.AspNet
return startInfo;
}
- public DebuggerSession CreateSession ()
+ public override DebuggerSession CreateSession ()
{
return new SoftDebuggerSession ();
}
-
- public ProcessInfo[] GetAttachableProcesses ()
- {
- return new ProcessInfo[0];
- }
}
}
diff --git a/main/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/CustomSoftDebuggerEngine.cs b/main/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/CustomSoftDebuggerEngine.cs
index 1c5aab67af..6deba2bf9b 100644
--- a/main/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/CustomSoftDebuggerEngine.cs
+++ b/main/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/CustomSoftDebuggerEngine.cs
@@ -35,11 +35,11 @@ using Mono.Debugging.Soft;
namespace MonoDevelop.Debugger.Soft
{
- class CustomSoftDebuggerEngine: IDebuggerEngine
+ class CustomSoftDebuggerEngine: DebuggerEngineBackend
{
bool? available;
- public bool CanDebugCommand (ExecutionCommand cmd)
+ public override bool CanDebugCommand (ExecutionCommand cmd)
{
// This isn't polished enough to show it by default. GUI needs work, and it should be exposed
// via "run with->custom parameters", not a toplevel command and dialog.
@@ -50,17 +50,12 @@ namespace MonoDevelop.Debugger.Soft
return available.Value;
}
- public DebuggerSession CreateSession ()
+ public override DebuggerSession CreateSession ()
{
return new CustomSoftDebuggerSession ();
}
- public ProcessInfo[] GetAttachableProcesses ()
- {
- return new ProcessInfo[0];
- }
-
- public DebuggerStartInfo CreateDebuggerStartInfo (ExecutionCommand c)
+ public override DebuggerStartInfo CreateDebuggerStartInfo (ExecutionCommand c)
{
//WORKAROUND: explicit generic type argument works around a gmcs 2.6.x type inference bug
return InvokeSynch<SoftDebuggerStartInfo> (GetDebuggerInfo) ??
@@ -148,12 +143,12 @@ namespace MonoDevelop.Debugger.Soft
void ProcessOutput (object sender, string message)
{
- OnTargetOutput (true, message);
+ OnTargetOutput (false, message);
}
void ProcessError (object sender, string message)
{
- OnTargetOutput (false, message);
+ OnTargetOutput (true, message);
}
protected override void EndSession ()
diff --git a/main/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/SoftDebuggerEngine.cs b/main/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/SoftDebuggerEngine.cs
index 4c58df2133..f04bc311f4 100644
--- a/main/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/SoftDebuggerEngine.cs
+++ b/main/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/SoftDebuggerEngine.cs
@@ -38,14 +38,14 @@ using MonoDevelop.Core.Assemblies;
namespace MonoDevelop.Debugger.Soft
{
- public class SoftDebuggerEngine: IDebuggerEngine
+ public class SoftDebuggerEngine: DebuggerEngineBackend
{
static SoftDebuggerEngine ()
{
DebuggerLoggingService.CustomLogger = new MDLogger ();
}
- public bool CanDebugCommand (ExecutionCommand cmd)
+ public override bool CanDebugCommand (ExecutionCommand cmd)
{
var netCmd = cmd as DotNetExecutionCommand;
if (netCmd == null)
@@ -54,6 +54,11 @@ namespace MonoDevelop.Debugger.Soft
return CanDebugRuntime (netCmd.TargetRuntime);
}
+ public override bool IsDefaultDebugger (ExecutionCommand cmd)
+ {
+ return true;
+ }
+
public static bool CanDebugRuntime (TargetRuntime runtime)
{
var mrun = runtime as MonoTargetRuntime;
@@ -63,7 +68,7 @@ namespace MonoDevelop.Debugger.Soft
return mrun.AssemblyContext.GetAssemblyLocation ("Mono.Debugger.Soft", null) != null;
}
- public DebuggerStartInfo CreateDebuggerStartInfo (ExecutionCommand c)
+ public override DebuggerStartInfo CreateDebuggerStartInfo (ExecutionCommand c)
{
var cmd = (DotNetExecutionCommand) c;
var runtime = (MonoTargetRuntime)cmd.TargetRuntime;
@@ -90,12 +95,7 @@ namespace MonoDevelop.Debugger.Soft
return dsi;
}
- public ProcessInfo[] GetAttachableProcesses ()
- {
- return new ProcessInfo [0];
- }
-
- public DebuggerSession CreateSession ()
+ public override DebuggerSession CreateSession ()
{
return new SoftDebuggerSession ();
}
diff --git a/main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/Extensions/DebuggerExtensions.cs b/main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/Extensions/DebuggerExtensions.cs
index c0a1192d65..e6411cc4c7 100644
--- a/main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/Extensions/DebuggerExtensions.cs
+++ b/main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/Extensions/DebuggerExtensions.cs
@@ -122,13 +122,15 @@ namespace Microsoft.Samples.Debugging.Extensions
si.hStdError = errorWritePipe;
}
- internal static void SetupOutputRedirection (STARTUPINFO si, ref int flags, SafeFileHandle outReadPipe, SafeFileHandle errorReadPipe)
+ internal static void SetupOutputRedirection (STARTUPINFO si, ref int flags, out SafeFileHandle outReadPipe, out SafeFileHandle errorReadPipe)
{
if ((flags & CREATE_REDIRECT_STD) != 0) {
CreateHandles (si, out outReadPipe, out errorReadPipe);
flags &= ~CREATE_REDIRECT_STD;
}
else {
+ outReadPipe = null;
+ errorReadPipe = null;
si.hStdInput = new SafeFileHandle (IntPtr.Zero, false);
si.hStdOutput = new SafeFileHandle (IntPtr.Zero, false);
si.hStdError = new SafeFileHandle (IntPtr.Zero, false);
diff --git a/main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/Metadata/MetadataPropertyInfo.cs b/main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/Metadata/MetadataPropertyInfo.cs
index b2caeea90b..f9ce48f076 100644
--- a/main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/Metadata/MetadataPropertyInfo.cs
+++ b/main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/Metadata/MetadataPropertyInfo.cs
@@ -163,7 +163,9 @@ namespace Microsoft.Samples.Debugging.CorMetadata
public override Type DeclaringType
{
- get { throw new NotImplementedException (); }
+ get {
+ return m_declaringType;
+ }
}
public override bool IsDefined (Type attributeType, bool inherit)
diff --git a/main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/Metadata/MetadataType.cs b/main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/Metadata/MetadataType.cs
index 90aa89e00e..0230f65180 100644
--- a/main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/Metadata/MetadataType.cs
+++ b/main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/Metadata/MetadataType.cs
@@ -212,7 +212,7 @@ namespace Microsoft.Samples.Debugging.CorMetadata
{
get
{
- throw new NotImplementedException();
+ return Type.GetType (FullName);
}
}
@@ -444,7 +444,7 @@ namespace Microsoft.Samples.Debugging.CorMetadata
break;
var prop = new MetadataPropertyInfo (m_importer, methodToken, this);
try {
- MethodInfo mi = prop.GetGetMethod () ?? prop.GetSetMethod ();
+ MethodInfo mi = prop.GetGetMethod (true) ?? prop.GetSetMethod (true);
if (mi == null)
continue;
if (MetadataExtensions.TypeFlagsMatch (mi.IsPublic, mi.IsStatic, bindingAttr))
diff --git a/main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/debug/Debugger.cs b/main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/debug/Debugger.cs
index 7f31cd1306..3563897f6d 100644
--- a/main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/debug/Debugger.cs
+++ b/main/src/addins/MonoDevelop.Debugger.Win32/CorApi2/debug/Debugger.cs
@@ -202,7 +202,7 @@ namespace Microsoft.Samples.Debugging.CorDebug
// initialize safe handles
// [Xamarin] ASP.NET Debugging and output redirection.
SafeFileHandle outReadPipe = null, errorReadPipe = null;
- DebuggerExtensions.SetupOutputRedirection (si, ref flags, outReadPipe, errorReadPipe);
+ DebuggerExtensions.SetupOutputRedirection (si, ref flags, out outReadPipe, out errorReadPipe);
IntPtr env = DebuggerExtensions.SetupEnvironment (environment);
CorProcess ret;
diff --git a/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/ArrayAdaptor.cs b/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/ArrayAdaptor.cs
index 2d24b28685..2a2188e8ae 100644
--- a/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/ArrayAdaptor.cs
+++ b/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/ArrayAdaptor.cs
@@ -73,7 +73,7 @@ namespace MonoDevelop.Debugger.Win32
idx[i] = indices[i];
for (int i = 0; i < count; i++) {
- elements.Add (GetElement (idx));
+ elements.Add (GetElement ((int[])idx.Clone ()));
idx[idx.Length - 1]++;
}
@@ -83,6 +83,7 @@ namespace MonoDevelop.Debugger.Win32
public void SetElement (int[] indices, object val)
{
CorValRef it = (CorValRef) GetElement (indices);
+ obj.IsValid = false;
it.SetValue (ctx, (CorValRef) val);
}
diff --git a/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/CorDebuggerBacktrace.cs b/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/CorDebuggerBacktrace.cs
index 9f22eb9eb6..d8ff9db670 100644
--- a/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/CorDebuggerBacktrace.cs
+++ b/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/CorDebuggerBacktrace.cs
@@ -129,8 +129,10 @@ namespace MonoDevelop.Debugger.Win32
return new SequencePoint () {
IsSpecial = true,
Offset = offsets [j],
- Line = lines [j],
- Column = columns [j],
+ StartLine = lines [j],
+ EndLine = endLines [j],
+ StartColumn = columns [j],
+ EndColumn = endColumns [j],
Document = docs [j]
};
}
@@ -143,8 +145,10 @@ namespace MonoDevelop.Debugger.Win32
return new SequencePoint () {
IsSpecial = true,
Offset = offsets [j],
- Line = lines [j],
- Column = columns [j],
+ StartLine = lines [j],
+ EndLine = endLines [j],
+ StartColumn = columns [j],
+ EndColumn = endColumns [j],
Document = docs [j]
};
}
@@ -158,8 +162,10 @@ namespace MonoDevelop.Debugger.Win32
return new SequencePoint () {
IsSpecial = false,
Offset = offsets [i],
- Line = lines [i],
- Column = columns [i],
+ StartLine = lines [i],
+ EndLine = endLines [i],
+ StartColumn = columns [i],
+ EndColumn = endColumns [i],
Document = docs [i]
};
}
@@ -196,8 +202,8 @@ namespace MonoDevelop.Debugger.Win32
var sp = GetSequencePoint (session, frame);
if (sp != null) {
- line = sp.Line;
- column = sp.Column;
+ line = sp.StartLine;
+ column = sp.StartColumn;
file = sp.Document.URL;
address = (uint)sp.Offset;
}
diff --git a/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/CorDebuggerSession.cs b/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/CorDebuggerSession.cs
index d8cd4e50c9..7fd725f501 100644
--- a/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/CorDebuggerSession.cs
+++ b/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/CorDebuggerSession.cs
@@ -110,7 +110,15 @@ namespace MonoDevelop.Debugger.Win32
threads = null;
processes = null;
activeThread = null;
- GC.Collect ();
+
+ ThreadPool.QueueUserWorkItem (delegate {
+ Thread.Sleep (2000);
+ GC.Collect ();
+ GC.WaitForPendingFinalizers ();
+ Thread.Sleep (20000);
+ GC.Collect ();
+ GC.WaitForPendingFinalizers ();
+ });
}
void TerminateDebugger ()
@@ -201,7 +209,7 @@ namespace MonoDevelop.Debugger.Win32
void OnLogMessage (object sender, CorLogMessageEventArgs e)
{
- OnTargetOutput (false, e.Message);
+ OnTargetDebug (e.Level, e.LogSwitchName, e.Message);
e.Continue = true;
}
@@ -430,15 +438,6 @@ namespace MonoDevelop.Debugger.Win32
void OnUpdateModuleSymbols (object sender, CorUpdateModuleSymbolsEventArgs e)
{
- SymbolBinder binder = new SymbolBinder ();
- CorMetadataImport mi = new CorMetadataImport (e.Module);
- ISymbolReader reader = binder.GetReaderFromStream (mi.RawCOMObject, e.Stream);
- foreach (ISymbolDocument doc in reader.GetDocuments ()) {
- Console.WriteLine (doc.URL);
- }
- var disposable = reader as IDisposable;
- if (disposable != null)
- disposable.Dispose ();
e.Continue = true;
}
@@ -635,10 +634,13 @@ namespace MonoDevelop.Debugger.Win32
exceptions.Add(t.GetTypeInfo(this).FullName);
t = t.Base;
}
-
+ if (exceptions.Count == 0)
+ return false;
// See if a catchpoint is set for this exception.
foreach (Catchpoint cp in Breakpoints.GetCatchpoints()) {
- if (cp.Enabled && exceptions.Contains(cp.ExceptionName)) {
+ if (cp.Enabled &&
+ ((cp.IncludeSubclasses && exceptions.Contains (cp.ExceptionName)) ||
+ (exceptions [0] == cp.ExceptionName))) {
return true;
}
}
@@ -778,8 +780,7 @@ namespace MonoDevelop.Debugger.Win32
protected override BreakEventInfo OnInsertBreakEvent (BreakEvent be)
{
- return MtaThread.Run (delegate
- {
+ return MtaThread.Run (delegate {
var binfo = new BreakEventInfo ();
lock (documents) {
@@ -789,8 +790,7 @@ namespace MonoDevelop.Debugger.Win32
// FIXME: implement breaking on function name
binfo.SetStatus (BreakEventStatus.Invalid, null);
return binfo;
- }
- else {
+ } else {
DocInfo doc;
if (!documents.TryGetValue (System.IO.Path.GetFullPath (bp.FileName), out doc)) {
binfo.SetStatus (BreakEventStatus.NotBound, null);
@@ -800,25 +800,52 @@ namespace MonoDevelop.Debugger.Win32
int line;
try {
line = doc.Document.FindClosestLine (bp.Line);
- }
- catch {
+ } catch {
// Invalid line
binfo.SetStatus (BreakEventStatus.Invalid, null);
return binfo;
}
- ISymbolMethod met = doc.Reader.GetMethodFromDocumentPosition (doc.Document, line, 0);
+ ISymbolMethod met = null;
+ if (doc.Reader is ISymbolReader2) {
+ var methods = ((ISymbolReader2)doc.Reader).GetMethodsFromDocumentPosition (doc.Document, line, 0);
+ if (methods != null && methods.Any ()) {
+ if (methods.Count () == 1) {
+ met = methods [0];
+ } else {
+ int deepest = -1;
+ foreach (var method in methods) {
+ var firstSequence = method.GetSequencePoints ().FirstOrDefault ((sp) => sp.StartLine != 0xfeefee);
+ if (firstSequence != null && firstSequence.StartLine >= deepest) {
+ deepest = firstSequence.StartLine;
+ met = method;
+ }
+ }
+ }
+ }
+ }
+ if (met == null) {
+ met = doc.Reader.GetMethodFromDocumentPosition (doc.Document, line, 0);
+ }
if (met == null) {
binfo.SetStatus (BreakEventStatus.Invalid, null);
return binfo;
}
int offset = -1;
+ int firstSpInLine = -1;
foreach (SequencePoint sp in met.GetSequencePoints ()) {
- if (sp.Line == line && sp.Document.URL == doc.Document.URL) {
+ if (sp.IsInside (doc.Document.URL, line, bp.Column)) {
offset = sp.Offset;
break;
+ } else if (firstSpInLine == -1
+ && sp.StartLine == line
+ && sp.Document.URL.Equals (doc.Document.URL, StringComparison.OrdinalIgnoreCase)) {
+ firstSpInLine = sp.Offset;
}
}
+ if (offset == -1) {//No exact match? Use first match in that line
+ offset = firstSpInLine;
+ }
if (offset == -1) {
binfo.SetStatus (BreakEventStatus.Invalid, null);
return binfo;
@@ -827,7 +854,7 @@ namespace MonoDevelop.Debugger.Win32
CorFunction func = doc.Module.GetFunctionFromToken (met.Token.GetToken ());
CorFunctionBreakpoint corBp = func.ILCode.CreateBreakpoint (offset);
corBp.Activate (bp.Enabled);
- breakpoints[corBp] = binfo;
+ breakpoints [corBp] = binfo;
binfo.Handle = corBp;
binfo.SetStatus (BreakEventStatus.Bound, null);
@@ -1352,15 +1379,78 @@ namespace MonoDevelop.Debugger.Win32
return (T)(object)new MtaRawValueString ((IRawValueString)obj);
return obj;
}
+
+ public override bool CanSetNextStatement {
+ get {
+ return true;
+ }
+ }
+
+ protected override void OnSetNextStatement (long threadId, string fileName, int line, int column)
+ {
+ if (!CanSetNextStatement)
+ throw new NotSupportedException ();
+ MtaThread.Run (delegate {
+ var thread = GetThread ((int)threadId);
+ if (thread == null)
+ throw new ArgumentException ("Unknown thread.");
+
+ CorFrame frame = thread.ActiveFrame;
+ if (frame == null)
+ throw new NotSupportedException ();
+
+ ISymbolMethod met = frame.Function.GetSymbolMethod (this);
+ if (met == null) {
+ throw new NotSupportedException ();
+ }
+
+ int offset = -1;
+ int firstSpInLine = -1;
+ foreach (SequencePoint sp in met.GetSequencePoints ()) {
+ if (sp.IsInside (fileName, line, column)) {
+ offset = sp.Offset;
+ break;
+ } else if (firstSpInLine == -1
+ && sp.StartLine == line
+ && sp.Document.URL.Equals (fileName, StringComparison.OrdinalIgnoreCase)) {
+ firstSpInLine = sp.Offset;
+ }
+ }
+ if (offset == -1) {//No exact match? Use first match in that line
+ offset = firstSpInLine;
+ }
+ if (offset == -1) {
+ throw new NotSupportedException ();
+ }
+ try {
+ frame.SetIP (offset);
+ } catch {
+ throw new NotSupportedException ();
+ }
+ });
+ }
}
class SequencePoint
{
- public int Line;
- public int Column;
+ public int StartLine;
+ public int EndLine;
+ public int StartColumn;
+ public int EndColumn;
public int Offset;
public bool IsSpecial;
public ISymbolDocument Document;
+
+ public bool IsInside (string fileUrl, int line, int column)
+ {
+ if (!Document.URL.Equals (fileUrl, StringComparison.OrdinalIgnoreCase))
+ return false;
+ if (line < StartLine || (line == StartLine && column < StartColumn))
+ return false;
+ if (line > EndLine || (line == EndLine && column > EndColumn))
+ return false;
+ return true;
+ }
}
static class SequencePointExt
@@ -1379,8 +1469,10 @@ namespace MonoDevelop.Debugger.Win32
for (int n = 0; n < sc; n++) {
SequencePoint sp = new SequencePoint ();
sp.Document = docs[n];
- sp.Line = lines[n];
- sp.Column = columns[n];
+ sp.StartLine = lines[n];
+ sp.EndLine = endLines[n];
+ sp.StartColumn = columns[n];
+ sp.EndColumn = endColumns[n];
sp.Offset = offsets[n];
yield return sp;
}
diff --git a/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/CorObjectAdaptor.cs b/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/CorObjectAdaptor.cs
index 8b54de2d37..57a37558ea 100644
--- a/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/CorObjectAdaptor.cs
+++ b/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/CorObjectAdaptor.cs
@@ -78,11 +78,6 @@ namespace MonoDevelop.Debugger.Win32
return GetRealObject (ctx, val) is CorStringValue;
}
- public override bool IsClassInstance (EvaluationContext ctx, object val)
- {
- return GetRealObject (ctx, val) is CorObjectValue;
- }
-
public override bool IsNull (EvaluationContext ctx, object gval)
{
CorValRef val = (CorValRef) gval;
@@ -99,6 +94,10 @@ namespace MonoDevelop.Debugger.Win32
var t = (CorType) type;
var cctx = (CorEvaluationContext)ctx;
Type tt;
+ if (t.Type == CorElementType.ELEMENT_TYPE_STRING ||
+ t.Type == CorElementType.ELEMENT_TYPE_ARRAY ||
+ t.Type == CorElementType.ELEMENT_TYPE_SZARRAY)
+ return true;
// Primitive check
if (MetadataHelperFunctionsExtensions.CoreTypes.TryGetValue (t.Type, out tt))
return false;
@@ -185,24 +184,44 @@ namespace MonoDevelop.Debugger.Win32
}
}
- Dictionary<string, CorType> typeCache = new Dictionary<string, CorType> ();
+ Dictionary<string, CorType> nameToTypeCache = new Dictionary<string, CorType> ();
+ Dictionary<CorType, string> typeToNameCache = new Dictionary<CorType, string> ();
+
+ string GetCacheName(string name, CorType[] typeArgs)
+ {
+ if (typeArgs == null || typeArgs.Length == 0)
+ return name;
+ string result = name + "<";
+ for (int i = 0; i < typeArgs.Length; i++) {
+ string currentTypeName;
+ if (!typeToNameCache.TryGetValue (typeArgs [i], out currentTypeName))
+ return null;//Unable to resolve? Don't cache. This should never happen.
+ result += currentTypeName;
+ if (i < typeArgs.Length - 1)
+ result += ",";
+ }
+ return result + ">";
+ }
+
public override object GetType (EvaluationContext gctx, string name, object[] gtypeArgs)
{
+ CorType[] typeArgs = CastArray<CorType> (gtypeArgs);
+ string cacheName = GetCacheName (name, typeArgs);
CorType fastRet;
- if (typeCache.TryGetValue (name, out fastRet))
+ if (!string.IsNullOrEmpty (cacheName) && nameToTypeCache.TryGetValue (cacheName, out fastRet))
return fastRet;
-
- CorType[] typeArgs = CastArray<CorType> (gtypeArgs);
-
- CorEvaluationContext ctx = (CorEvaluationContext) gctx;
+ CorEvaluationContext ctx = (CorEvaluationContext)gctx;
foreach (CorModule mod in ctx.Session.GetModules ()) {
CorMetadataImport mi = ctx.Session.GetMetadataForModule (mod.Name);
if (mi != null) {
foreach (Type t in mi.DefinedTypes) {
- if (t.FullName == name) {
+ if (t.FullName.Replace ('+', '.') == name.Replace ('+', '.')) {
CorClass cls = mod.GetClassFromToken (t.MetadataToken);
fastRet = cls.GetParameterizedType (CorElementType.ELEMENT_TYPE_CLASS, typeArgs);
- typeCache [name] = fastRet;
+ if (!string.IsNullOrEmpty (cacheName)) {
+ nameToTypeCache [cacheName] = fastRet;
+ typeToNameCache [fastRet] = cacheName;
+ }
return fastRet;
}
}
@@ -295,7 +314,7 @@ namespace MonoDevelop.Debugger.Win32
MethodInfo met = OverloadResolve (cctx, "ToString", targetType, new CorType[0], BindingFlags.Public | BindingFlags.Instance, false);
if (met != null && met.DeclaringType.FullName != "System.Object") {
var args = new object[0];
- object ores = RuntimeInvoke (ctx, targetType, objr, "ToString", args, args);
+ object ores = RuntimeInvoke (ctx, targetType, objr, "ToString", new object[0], args, args);
var res = GetRealObject (ctx, ores) as CorStringValue;
if (res != null)
return res.String;
@@ -343,7 +362,7 @@ namespace MonoDevelop.Debugger.Win32
ArrayAdaptor realArr = new ArrayAdaptor (ctx, arr, array);
realArr.SetElement (new [] { 0 }, val);
-
+ arr.IsValid = true;
CorType at = (CorType) GetType (ctx, "System.Array");
object[] argTypes = { GetType (ctx, "System.Int32") };
return (CorValRef)RuntimeInvoke (ctx, at, arr, "GetValue", argTypes, new object[] { CreateValue (ctx, 0) });
@@ -379,18 +398,28 @@ namespace MonoDevelop.Debugger.Win32
ParameterInfo[] parameters = method.GetParameters ();
// TODO: Check this.
for (int n = 0; n < parameters.Length; n++) {
- if (parameters[n].ParameterType == typeof(object) && (IsValueType (ctx, argValues[n])))
+ if (parameters[n].ParameterType == typeof(object) && IsValueType (ctx, argValues[n]) && !IsEnum (ctx, argValues[n]))
argValues[n] = Box (ctx, argValues[n]);
}
try {
if (method != null) {
CorValRef v = new CorValRef (delegate {
- CorFunction func = targetType.Class.Module.GetFunctionFromToken (method.MetadataToken);
+ CorModule mod = null;
+ if (targetType.Type == CorElementType.ELEMENT_TYPE_ARRAY || targetType.Type == CorElementType.ELEMENT_TYPE_SZARRAY) {
+ mod = ((CorType)ctx.Adapter.GetType (ctx, "System.Object")).Class.Module;
+ } else {
+ mod = targetType.Class.Module;
+ }
+ CorFunction func = mod.GetFunctionFromToken (method.MetadataToken);
CorValue[] args = new CorValue[argValues.Length];
for (int n = 0; n < args.Length; n++)
args[n] = argValues[n].Val;
- return ctx.RuntimeInvoke (func, new CorType[0], target != null ? target.Val : null, args);
+ if (targetType.Type == CorElementType.ELEMENT_TYPE_ARRAY || targetType.Type == CorElementType.ELEMENT_TYPE_SZARRAY) {
+ return ctx.RuntimeInvoke (func, new CorType[0], target != null ? target.Val : null, args);
+ } else {
+ return ctx.RuntimeInvoke (func, targetType.TypeParameters, target != null ? target.Val : null, args);
+ }
});
return v.Val == null ? null : v;
}
@@ -423,10 +452,14 @@ namespace MonoDevelop.Debugger.Win32
if (methodName == ".ctor")
break; // Can't create objects using constructor from base classes
- if (rtype.BaseType == null && rtype.FullName != "System.Object")
+ if ((rtype.BaseType == null && rtype.FullName != "System.Object") ||
+ currentType.Type == CorElementType.ELEMENT_TYPE_ARRAY ||
+ currentType.Type == CorElementType.ELEMENT_TYPE_SZARRAY ||
+ currentType.Type == CorElementType.ELEMENT_TYPE_STRING) {
currentType = ctx.Adapter.GetType (ctx, "System.Object") as CorType;
- else
+ } else {
currentType = currentType.Base;
+ }
}
return OverloadResolve (ctx, GetTypeName (ctx, type), methodName, argtypes, candidates, throwIfNotFound);
@@ -697,22 +730,29 @@ namespace MonoDevelop.Debugger.Win32
public CorValue CreateCorValue (EvaluationContext ctx, CorType type, params CorValRef[] args)
{
- CorEvaluationContext cctx = (CorEvaluationContext) ctx;
+ CorEvaluationContext cctx = (CorEvaluationContext)ctx;
CorValue[] vargs = new CorValue [args.Length];
- for (int n=0; n<args.Length; n++)
+ CorType[] targs = new CorType[args.Length];
+ for (int n = 0; n < args.Length; n++) {
vargs [n] = args [n].Val;
+ targs [n] = vargs [n].ExactType;
+ }
- Type t = type.GetTypeInfo (cctx.Session);
- MethodInfo ctor = null;
- foreach (MethodInfo met in t.GetMethods ()) {
- if (met.IsSpecialName && met.Name == ".ctor") {
- ParameterInfo[] pinfos = met.GetParameters ();
- if (pinfos.Length == 1) {
- ctor = met;
- break;
+ var ctor = OverloadResolve (cctx, ".ctor", type, targs, BindingFlags.Instance | BindingFlags.Public, false);
+ if (ctor == null) {
+ //TODO: Remove this if and content when Generic method inovcation is fully implemented
+ Type t = type.GetTypeInfo (cctx.Session);
+ foreach (MethodInfo met in t.GetMethods ()) {
+ if (met.IsSpecialName && met.Name == ".ctor") {
+ ParameterInfo[] pinfos = met.GetParameters ();
+ if (pinfos.Length == 1) {
+ ctor = met;
+ break;
+ }
}
}
}
+
if (ctor == null)
return null;
@@ -876,7 +916,7 @@ namespace MonoDevelop.Debugger.Win32
foreach (PropertyInfo prop in type.GetProperties (BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) {
MethodInfo mi = null;
try {
- mi = prop.CanRead ? prop.GetGetMethod () : null;
+ mi = prop.CanRead ? prop.GetGetMethod (true) : null;
}
catch {
// Ignore
@@ -887,6 +927,8 @@ namespace MonoDevelop.Debugger.Win32
propTypes.Add (t);
}
}
+ if (cctx.Adapter.IsPrimitive (ctx, target))
+ break;
t = t.Base;
}
@@ -975,7 +1017,7 @@ namespace MonoDevelop.Debugger.Win32
foreach (PropertyInfo prop in type.GetProperties (bindingFlags)) {
MethodInfo mi = null;
try {
- mi = prop.CanRead ? prop.GetGetMethod () : null;
+ mi = prop.CanRead ? prop.GetGetMethod (true) : null;
} catch {
// Ignore
}
@@ -1323,7 +1365,10 @@ namespace MonoDevelop.Debugger.Win32
try {
CorValRef vref = new CorValRef (delegate {
- return ctx.Frame.GetArgument (0);
+ var result = ctx.Frame.GetArgument (0);
+ if (result.Type == CorElementType.ELEMENT_TYPE_BYREF)
+ return result.CastToReferenceValue ().Dereference ();
+ return result;
});
return new VariableReference (ctx, vref, "this", ObjectValueFlags.Variable | ObjectValueFlags.ReadOnly);
@@ -1492,7 +1537,7 @@ namespace MonoDevelop.Debugger.Win32
foreach (ISymbolVariable var in scope.GetLocals ()) {
if (var.Name == "$site")
continue;
- if (IsClosureReferenceLocal (var) && IsGeneratedType (var.Name)) {
+ if (IsClosureReferenceLocal (var)) {
int addr = var.AddressField1;
var vref = new CorValRef (delegate {
return ctx.Frame.GetLocalVariable (addr);
@@ -1585,10 +1630,20 @@ namespace MonoDevelop.Debugger.Win32
return null;
}
- // TODO: implement in metadatatype
public override IEnumerable<object> GetNestedTypes (EvaluationContext ctx, object type)
{
- return base.GetNestedTypes (ctx, type);
+ var cType = (CorType)type;
+ var wctx = (CorEvaluationContext)ctx;
+ var mod = cType.Class.Module;
+ int token = cType.Class.Token;
+ var module = wctx.Session.GetMetadataForModule (mod.Name);
+ foreach (var t in module.DefinedTypes) {
+ if (((MetadataType)t).DeclaringType != null && ((MetadataType)t).DeclaringType.MetadataToken == token) {
+ var cls = mod.GetClassFromToken (((MetadataType)t).MetadataToken);
+ var returnType = cls.GetParameterizedType (CorElementType.ELEMENT_TYPE_CLASS, new CorType[0]);
+ yield return returnType;
+ }
+ }
}
// TODO: implement for session
@@ -1604,8 +1659,7 @@ namespace MonoDevelop.Debugger.Win32
public override bool IsTypeLoaded (EvaluationContext ctx, object type)
{
- var t = type as Type;
- return IsTypeLoaded (ctx, t.FullName);
+ return IsTypeLoaded (ctx, GetTypeName (ctx, type));
}
// TODO: Implement GetHoistedLocalVariables
}
diff --git a/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/MtaThread.cs b/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/MtaThread.cs
index 212a1ca0fd..b38101b096 100644
--- a/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/MtaThread.cs
+++ b/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/MtaThread.cs
@@ -12,20 +12,19 @@ namespace MonoDevelop.Debugger.Win32
static Exception workError;
static readonly object threadLock = new object ();
- public static R Run<R> (Func<R> ts)
+ public static R Run<R> (Func<R> ts, int timeout = 15000)
{
if (Thread.CurrentThread.GetApartmentState () == ApartmentState.MTA)
return ts ();
R res = default (R);
- Run (delegate
- {
+ Run (delegate {
res = ts ();
- });
+ }, timeout);
return res;
}
- public static void Run (Action ts)
+ public static void Run (Action ts, int timeout = 15000)
{
if (Thread.CurrentThread.GetApartmentState () == ApartmentState.MTA) {
ts ();
@@ -41,12 +40,14 @@ namespace MonoDevelop.Debugger.Win32
workThread.SetApartmentState (ApartmentState.MTA);
workThread.IsBackground = true;
workThread.Start ();
- }
- else
+ } else
// Awaken the existing thread
Monitor.Pulse (threadLock);
}
- wordDoneEvent.WaitOne ();
+ if (!wordDoneEvent.WaitOne (timeout)) {
+ workThread.Abort ();
+ throw new Exception ("Debugger operation timeout on MTA thread.");
+ }
}
if (workError != null)
throw new Exception ("Debugger operation failed", workError);
@@ -54,21 +55,25 @@ namespace MonoDevelop.Debugger.Win32
static void MtaRunner ()
{
- lock (threadLock) {
- do {
- try {
- workDelegate ();
- }
- catch (Exception ex) {
- workError = ex;
- }
- finally {
- workDelegate = null;
- }
- wordDoneEvent.Set ();
- }
- while (Monitor.Wait (threadLock, 60000));
+ try {
+ lock (threadLock) {
+ do {
+ try {
+ workDelegate ();
+ } catch (ThreadAbortException) {
+ return;
+ } catch (Exception ex) {
+ workError = ex;
+ } finally {
+ workDelegate = null;
+ }
+ wordDoneEvent.Set ();
+ } while (Monitor.Wait (threadLock, 60000));
+ }
+ } catch {
+ //Just in case if we abort just in moment when it leaves workDelegate ();
+ } finally {
workThread = null;
}
}
diff --git a/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/PropertyReference.cs b/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/PropertyReference.cs
index 93fd50c4f5..8ee9ab0dcc 100644
--- a/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/PropertyReference.cs
+++ b/main/src/addins/MonoDevelop.Debugger.Win32/MonoDevelop.Debugger.Win32/PropertyReference.cs
@@ -29,6 +29,7 @@ using System.Reflection;
using Mono.Debugging.Client;
using Mono.Debugging.Evaluation;
using Microsoft.Samples.Debugging.CorDebug;
+using Microsoft.Samples.Debugging.CorDebug.NativeApi;
namespace MonoDevelop.Debugger.Win32
{
@@ -53,7 +54,12 @@ namespace MonoDevelop.Debugger.Win32
{
this.prop = prop;
this.declaringType = declaringType;
- this.module = declaringType.Class.Module;
+ if (declaringType.Type == CorElementType.ELEMENT_TYPE_ARRAY ||
+ declaringType.Type == CorElementType.ELEMENT_TYPE_SZARRAY) {
+ this.module = ((CorType)((CorEvaluationContext)ctx).Adapter.GetType (ctx, "System.Object")).Class.Module;
+ } else {
+ this.module = declaringType.Class.Module;
+ }
this.index = index;
if (!prop.GetGetMethod (true).IsStatic)
this.thisobj = thisobj;
@@ -89,24 +95,30 @@ namespace MonoDevelop.Debugger.Win32
CorValue[] args;
if (index != null) {
args = new CorValue[index.Length];
- ParameterInfo[] metArgs = prop.GetGetMethod ().GetParameters ();
+ ParameterInfo[] metArgs = prop.GetGetMethod (true).GetParameters ();
for (int n = 0; n < index.Length; n++)
args[n] = ctx.Adapter.GetBoxedArg (ctx, index[n], metArgs[n].ParameterType).Val;
}
else
args = new CorValue[0];
- MethodInfo mi = prop.GetGetMethod ();
+ MethodInfo mi = prop.GetGetMethod (true);
CorFunction func = module.GetFunctionFromToken (mi.MetadataToken);
- CorValue val = ctx.RuntimeInvoke (func, declaringType.TypeParameters, thisobj != null ? thisobj.Val : null, args);
+ CorValue val = null;
+ if (declaringType.Type == CorElementType.ELEMENT_TYPE_ARRAY ||
+ declaringType.Type == CorElementType.ELEMENT_TYPE_SZARRAY) {
+ val = ctx.RuntimeInvoke (func, new CorType[0], thisobj != null ? thisobj.Val : null, args);
+ } else {
+ val = ctx.RuntimeInvoke (func, declaringType.TypeParameters, thisobj != null ? thisobj.Val : null, args);
+ }
return cachedValue = new CorValRef (val, loader);
}
set {
CorEvaluationContext ctx = (CorEvaluationContext)Context;
- CorFunction func = module.GetFunctionFromToken (prop.GetSetMethod ().MetadataToken);
+ CorFunction func = module.GetFunctionFromToken (prop.GetSetMethod (true).MetadataToken);
CorValRef val = (CorValRef) value;
CorValue[] args;
- ParameterInfo[] metArgs = prop.GetSetMethod ().GetParameters ();
+ ParameterInfo[] metArgs = prop.GetSetMethod (true).GetParameters ();
if (index == null)
args = new CorValue[1];
@@ -140,7 +152,7 @@ namespace MonoDevelop.Debugger.Win32
internal static ObjectValueFlags GetFlags (PropertyInfo prop)
{
ObjectValueFlags flags = ObjectValueFlags.Property;
- MethodInfo mi = prop.GetGetMethod () ?? prop.GetSetMethod ();
+ MethodInfo mi = prop.GetGetMethod (true) ?? prop.GetSetMethod (true);
if (prop.GetSetMethod (true) == null)
flags |= ObjectValueFlags.ReadOnly;
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests.TestApp/BreakpointsAndStepping.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests.TestApp/BreakpointsAndStepping.cs
index 5b72d6f174..d6c64f8a04 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests.TestApp/BreakpointsAndStepping.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests.TestApp/BreakpointsAndStepping.cs
@@ -28,6 +28,8 @@ using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
+using System.Net.Sockets;
+using System.Diagnostics;
namespace MonoDevelop.Debugger.Tests.TestApp
{
@@ -52,6 +54,17 @@ namespace MonoDevelop.Debugger.Tests.TestApp
}
}
+ public void OutputAndDebugWriter ()
+ {
+ Console.Write ("NormalText");
+ Debug.Write ("DebugText");
+ Debug.Write ("");
+ System.Diagnostics.Debugger.Log (3, "SomeCategory", "DebugText2");
+ Console.Error.Write ("ErrorText");
+ Console.Write ("");
+ Console.Write ("");/*5070ed1c-593d-4cbe-b4fa-b2b0c7b25289*/
+ }
+
public void OneLineProperty ()
{
var testClass = new TestClass ();
@@ -156,6 +169,17 @@ namespace MonoDevelop.Debugger.Tests.TestApp
var obj = new EmptyClassWithoutConstructor ();/*84fc04b2-ede2-4d8b-acc4-28441e1c5f55*/
}
+ static async Task<string> AsyncBug13401 ()
+ {
+ return "Hello from Bar";
+ }
+
+ public static async Task Bug13401 ()
+ {
+ string s = await AsyncBug13401 ();
+ Console.Write ("");/*977ee8ce-ee61-4de0-9fc1-138fa164870b*/
+ }
+
public PListScheme PListSchemeTest ()
{
string value = "<xml></xml>";
@@ -232,6 +256,18 @@ namespace MonoDevelop.Debugger.Tests.TestApp
}
}
+ public void ForLoop10 ()
+ {
+ /*c35046f7-e87d-4b8f-b260-43e181a0a07c*/
+ for (int i = 0; i < 10; i++) {
+ Console.Write ("");/*eef5bea2-aaa6-4718-b26f-b35be6a6a13e*/
+ }
+ var a = 0;/*3e2e4759-f6d9-4839-98e6-4fa96b227458*/
+ var b = 1;
+ var c = a + b;
+ Console.Write (c);
+ }
+
public void CallMethodWithPropertyAsArgument ()
{
var obj = new TestClass ();
@@ -273,6 +309,58 @@ namespace MonoDevelop.Debugger.Tests.TestApp
/*3c27f60f-fdfa-44c0-b58f-552ecaaa77f1*/
}
+ public void ConitionalBreakpointEnum ()
+ {
+ SomeMethod (BooleanEnum.True);
+ SomeMethod (BooleanEnum.False);
+ }
+
+ private void SomeMethod (BooleanEnum en)
+ {
+ int i = 0;/*ecf764bf-9182-48d6-adb0-0ba36e2653a7*/
+ }
+
+ public void ConditionalBreakpointString ()
+ {
+ SomeMethod ("aaa");
+ SomeMethod ("bbb");
+ SomeMethod ("ccc");
+ }
+
+ private void SomeMethod (string str)
+ {
+ int i = 0;/*033dd01d-6cb4-4e1a-b445-de6d7fa0d2a7*/
+ }
+
+ public void Catchpoint1 ()
+ {
+ try {
+ throw new NotImplementedException ();/*526795d3-ee9e-44a7-8423-df0b406e9e8d*/
+ } catch {
+ }
+ var a = 0;/*fcdc2412-c00e-4c95-b2ea-e3cf5d5bf856*/
+ }
+
+ public void Catchpoint2 ()
+ {
+ try {
+ //If you wonder why I didn't use just simple File.Open("unexistingFile.txt") is
+ //that FrameStack inside Mono and .Net are different and same goes for 10+ other calls I tried...
+ new Socket (AddressFamily.InterNetwork, SocketType.Unknown, ProtocolType.Ggp);/*d24b1c9d-3944-4f0d-be31-5556251fbdf5*/
+ } catch {
+
+ }
+ }
+
+ public void SimpleMethod ()
+ {
+ /*f4e3a214-229e-44dd-9da2-db82ddfbec11*/
+ int a = 1;
+ int b = 2;
+ int c = a + b;
+ Console.Write (c);
+ }
+
public void Bug13640 ()
{
var l = new List<int> ();/*b64e6497-e976-4125-9741-801909e5eeb1*/
@@ -478,4 +566,10 @@ namespace MonoDevelop.Debugger.Tests.TestApp
}
}
}
+
+public enum BooleanEnum
+{
+ False,
+ True
+}
/*invalidBreakpointAtEndOfFile*/ \ No newline at end of file
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests.TestApp/MonoDevelop.Debugger.Tests.TestApp.csproj b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests.TestApp/MonoDevelop.Debugger.Tests.TestApp.csproj
index e1be0fd95a..1f2eed89b3 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests.TestApp/MonoDevelop.Debugger.Tests.TestApp.csproj
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests.TestApp/MonoDevelop.Debugger.Tests.TestApp.csproj
@@ -34,6 +34,7 @@
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Xml" />
+ <Reference Include="Microsoft.CSharp" />
</ItemGroup>
<ItemGroup>
<Compile Include="Main.cs" />
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests.TestApp/TestEvaluation.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests.TestApp/TestEvaluation.cs
index 9975663cb4..e9db68c304 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests.TestApp/TestEvaluation.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests.TestApp/TestEvaluation.cs
@@ -1,181 +1,586 @@
-//
-// TestEvaluation.cs
-//
-// Author:
-// Lluis Sanchez Gual <lluis@novell.com>
-// David Karlaš <david.karlas@xamarin.com>
-//
-// Copyright (c) 2009 Novell, Inc (http://www.novell.com)
-// Copyright (c) 2014 Xamarin, Inc (http://www.xamarin.com)
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Diagnostics;
-
-namespace MonoDevelop.Debugger.Tests.TestApp
-{
- public class TestEvaluation
- {
- static string staticString = "some static";
- string someString = "hi";
- string[] numbers = { "one","two","three" };
-
- public static void RunTest ()
- {
- var obj = new TestEvaluation ();
- obj.Test ();
- }
-
- public void Test()
- {
- int n = 32;
- decimal dec = 123.456m;
- var alist = new ArrayList ();
- alist.Add (1);
- alist.Add ("two");
- alist.Add (3);
-
- A c = new C ();
- A b = new B ();
- A a = new A ();
-
- var withDisplayString = new WithDisplayString ();
- var withProxy = new WithProxy ();
- var withToString = new WithToString ();
-
- var numbersArrays = new int [2][];
- var numbersMulti = new int [3,4,5];
-
- var dict = new Dictionary<int, string[]> ();
- var dictArray = new Dictionary<int, string[]> [2,3];
- var thing = new Thing<string> ();
- var done = new Thing<string>.Done<int> ();
-
- Console.WriteLine (n); /*break*/
- }
-
- public int TestMethod ()
- {
- float c = 4;
- return 1;
- }
-
- public int TestMethod (string a)
- {
- return int.Parse (a) + 1;
- }
-
- public int TestMethod (int a)
- {
- return a + 1;
- }
-
- public static int TestMethod (bool b)
- {
- return b ? 1 : 2;
- }
-
- public string BoxingTestMethod (object a)
- {
- return a.ToString ();
- }
-
- public string EscapedStrings {
- get { return " \" \\ \a \b \f \v \n \r \t"; }
- }
- }
-}
-
-
-class A
-{
- public virtual int Prop { get { return 1; } }
- public int PropNoVirt1 { get { return 1; } }
- public virtual int PropNoVirt2 { get { return 1; } }
-}
-
-class B: A
-{
- public override int Prop { get { return 2; } }
- public new int PropNoVirt1 { get { return 2; } }
- public new int PropNoVirt2 { get { return 2; } }
-}
-
-class C: B
-{
-}
-
-[DebuggerDisplay ("Some {Val1} Value {Val2} End")]
-class WithDisplayString
-{
- internal string Val1 = "one";
- public int Val2 { get { return 2; } }
-}
-
-class WithToString
-{
- public override string ToString ()
- {
- return "SomeString";
- }
-}
-
-[DebuggerTypeProxy (typeof(TheProxy))]
-class WithProxy
-{
- public string Val1 {
- get { return "one"; }
- }
-}
-
-class TheProxy
-{
- WithProxy wp;
-
- public TheProxy (WithProxy wp)
- {
- this.wp = wp;
- }
-
- public string Val1 {
- get { return wp.Val1; }
- }
-}
-
-class Thing<T>
-{
- public class Done<U>
- {
- }
-
- public Done<int>[] done = new Done<int> [1];
-}
-
-[Flags]
-enum SomeEnum
-{
- none=0,
- one=1,
- two=2,
- four=4
-}
-
-
+//
+// TestEvaluation.cs
+//
+// Author:
+// Lluis Sanchez Gual <lluis@novell.com>
+// David Karlaš <david.karlas@xamarin.com>
+//
+// Copyright (c) 2009 Novell, Inc (http://www.novell.com)
+// Copyright (c) 2014 Xamarin, Inc (http://www.xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Dynamic;
+
+namespace MonoDevelop.Debugger.Tests.TestApp
+{
+ class TestEvaluationParent
+ {
+ public int TestMethodBase ()
+ {
+ float c = 4;
+ return 1;
+ }
+
+ public virtual int TestMethodBase (string a)
+ {
+ return int.Parse (a) + 1;
+ }
+
+ protected int TestMethodBase (int a)
+ {
+ return a + 1;
+ }
+
+ public int TestMethodBaseNotOverrided ()
+ {
+ float c = 4;
+ return 1;
+ }
+
+ public class ParentNestedClass
+ {
+
+ }
+ }
+
+ class TestEvaluation : TestEvaluationParent
+ {
+ static string staticString = "some static";
+ string someString = "hi";
+ string[] numbers = { "one", "two", "three" };
+
+ public static void RunTest ()
+ {
+ var obj = new TestEvaluation ();
+ obj.Test ("testString", 55);
+ }
+
+ public void Test (string stringParam, int intParam = 22, int intParam2 = 66)
+ {
+ int intZero = 0, intOne = 1;
+ int n = 32;
+ decimal dec = 123.456m;
+ var stringList = new List<string> ();
+ stringList.Add ("aaa");
+ stringList.Add ("bbb");
+ stringList.Add ("ccc");
+
+ var alist = new ArrayList ();
+ alist.Add (1);
+ alist.Add ("two");
+ alist.Add (3);
+ string modifyInLamda = "";
+
+ A c = new C ();
+ A b = new B ();
+ A a = new A ();
+
+ var withDisplayString = new WithDisplayString ();
+ var withProxy = new WithProxy ();
+ var withToString = new WithToString ();
+
+ var numbersArrays = new int [2][];
+ var numbersMulti = new int [3, 4, 5];
+
+ var ops1 = new BinaryOperatorOverrides (1);
+ var ops2 = new BinaryOperatorOverrides (2);
+ var ops3 = new BinaryOperatorOverrides (2);
+
+ var dict = new Dictionary<int, string[]> ();
+ dict.Add (5, new string[]{ "a", "b" });
+ var dictArray = new Dictionary<int, string[]> [2, 3];
+ var thing = new Thing<string> ();
+ var done = new Thing<string>.Done<int> ();
+ done.Property = 54;
+
+ SimpleStruct simpleStruct = new SimpleStruct ();
+ simpleStruct.IntField = 45;
+ simpleStruct.StringField = "str";
+ SimpleStruct? nulledSimpleStruct;
+ var action = new Action (() => {
+ modifyInLamda = "modified";
+ });
+ action ();
+
+ dynamic dynObj = new ExpandoObject ();
+ dynObj.someInt = 53;
+ dynObj.someString = "Hello dynamic objects!";
+
+ var objWithMethodA = new ClassWithMethodA ();
+
+ var richObject = new RichClass ();
+
+ Console.WriteLine (n); /*break*/
+ }
+
+ public int TestMethod ()
+ {
+ float c = 4;
+ return 1;
+ }
+
+ public int TestMethod (string a)
+ {
+ return int.Parse (a) + 1;
+ }
+
+ public int TestMethod (int a)
+ {
+ return a + 1;
+ }
+
+ public int TestMethodBase ()
+ {
+ float c = 4;
+ return 1;
+ }
+
+ public override int TestMethodBase (string a)
+ {
+ return int.Parse (a) + 1;
+ }
+
+ protected new int TestMethodBase (int a)
+ {
+ return a + 1;
+ }
+
+ public static int TestMethod (bool b)
+ {
+ return b ? 1 : 2;
+ }
+
+ public T ReturnSame<T> (T t)
+ {
+ return t;
+ }
+
+ public T ReturnNew<T> () where T:new()
+ {
+ return new T ();
+ }
+
+ public string BoxingTestMethod (object a)
+ {
+ return a.ToString ();
+ }
+
+ public string EscapedStrings {
+ get { return " \" \\ \a \b \f \v \n \r \t"; }
+ }
+
+ public static void Swap<T> (ref T a, ref T b)
+ {
+ T temp = a;
+ a = b;
+ b = temp;
+ }
+
+ public static List<T> GenerateList<T> (T value, int count)
+ {
+ var list = new List<T> ();
+ for (int i = 0; i < count; i++) {
+ list.Add (value);
+ }
+ return list;
+ }
+
+ class NestedClass
+ {
+ public class DoubleNestedClass
+ {
+
+ }
+ }
+
+ class NestedGenericClass<T1,T2>
+ {
+
+ }
+ }
+
+ public class SomeClassInNamespace
+ {
+
+ }
+}
+
+class RichClass
+{
+ public int publicInt1 = 1;
+ public int publicInt2 = 2;
+ public int publicInt3 = 3;
+
+ public string publicStringA = "stringA";
+ public string publicStringB = "stringB";
+ public string publicStringC = "stringC";
+
+ private int privateInt1 = 1;
+ private int privateInt2 = 2;
+ private int privateInt3 = 3;
+
+ private string privateStringA = "stringA";
+ private string privateStringB = "stringB";
+ private string privateStringC = "stringC";
+
+ public int publicPropInt1 { get; set; }
+
+ public int publicPropInt2 { get; set; }
+
+ public int publicPropInt3 { get; set; }
+
+ public string publicPropStringA { get; set; }
+
+ public string publicPropStringB { get; set; }
+
+ public string publicPropStringC { get; set; }
+
+ private int privatePropInt1 { get; set; }
+
+ private int privatePropInt2 { get; set; }
+
+ private int privatePropInt3 { get; set; }
+
+ private string privatePropStringA { get; set; }
+
+ private string privatePropStringB { get; set; }
+
+ private string privatePropStringC { get; set; }
+
+ public RichClass()
+ {
+ publicPropInt1 = 1;
+ publicPropInt2 = 2;
+ publicPropInt3 = 3;
+
+ publicPropStringA = "stringA";
+ publicPropStringB = "stringB";
+ publicPropStringC = "stringC";
+
+ privatePropInt1 = 1;
+ privatePropInt2 = 2;
+ privatePropInt3 = 3;
+
+ privatePropStringA = "stringA";
+ privatePropStringB = "stringB";
+ privatePropStringC = "stringC";
+ }
+}
+
+interface IInterfaceWithMethodA
+{
+ string MethodA ();
+}
+
+abstract class AbstractClassWithMethodA
+{
+ public abstract string MethodA ();
+}
+
+class ClassWithMethodA : AbstractClassWithMethodA, IInterfaceWithMethodA
+{
+ public override string MethodA ()
+ {
+ return "AbstractImplementation";
+ }
+
+ string IInterfaceWithMethodA.MethodA ()
+ {
+ return "InterfaceImplementation";
+ }
+}
+
+class A
+{
+ public string ConstructedBy { get; private set; }
+
+ public A ()
+ {
+ ConstructedBy = "NoArg";
+ }
+
+ public A (int i)
+ {
+ ConstructedBy = "IntArg";
+ }
+
+ public A (string str)
+ {
+ ConstructedBy = "StringArg";
+ }
+
+ public virtual int Prop { get { return 1; } }
+
+ public int PropNoVirt1 { get { return 1; } }
+
+ public virtual int PropNoVirt2 { get { return 1; } }
+
+ public int IntField = 1;
+
+ public int TestMethod ()
+ {
+ float c = 4;
+ return 1;
+ }
+
+ public virtual int TestMethod (string a)
+ {
+ return int.Parse (a) + 1;
+ }
+
+ public int TestMethod (int a)
+ {
+ return a + 1;
+ }
+}
+
+class B: A
+{
+ public override int Prop { get { return 2; } }
+
+ public new int PropNoVirt1 { get { return 2; } }
+
+ public new int PropNoVirt2 { get { return 2; } }
+
+ public new int IntField = 2;
+
+ public int TestMethod ()
+ {
+ float c = 4;
+ return 2;
+ }
+
+ public override int TestMethod (string a)
+ {
+ return int.Parse (a) + 2;
+ }
+
+ public new int TestMethod (int a)
+ {
+ return a + 2;
+ }
+}
+
+class C: B
+{
+
+}
+
+[DebuggerDisplay ("Some {Val1} Value {Val2} End")]
+class WithDisplayString
+{
+ internal string Val1 = "one";
+
+ public int Val2 { get { return 2; } }
+}
+
+class WithToString
+{
+ public override string ToString ()
+ {
+ return "SomeString";
+ }
+}
+
+[DebuggerTypeProxy (typeof(TheProxy))]
+class WithProxy
+{
+ public string Val1 {
+ get { return "one"; }
+ }
+}
+
+class TheProxy
+{
+ WithProxy wp;
+
+ public TheProxy (WithProxy wp)
+ {
+ this.wp = wp;
+ }
+
+ public string Val1 {
+ get { return wp.Val1; }
+ }
+}
+
+class Thing<T>
+{
+ public class Done<U>
+ {
+ private U property;
+
+ public U Property {
+ get {
+ return property;
+ }
+ set {
+ property = value;
+ }
+ }
+
+
+ public int ReturnInt5 ()
+ {
+ return 5;
+ }
+
+ public U ReturnSame (U obj)
+ {
+ return obj;
+ }
+
+ public T ReturnSame (T obj)
+ {
+ return obj;
+ }
+
+ public U GetDefault ()
+ {
+ return default(U);
+ }
+
+ public T GetParentDefault ()
+ {
+ return default(T);
+ }
+ }
+
+ public Done<int>[] done = new Done<int> [1];
+}
+
+[Flags]
+enum SomeEnum
+{
+ none = 0,
+ one = 1,
+ two = 2,
+ four = 4
+}
+
+struct SimpleStruct
+{
+ public int IntField;
+ public string StringField;
+ public int? NulledIntField;
+
+ public override string ToString ()
+ {
+ return StringField + " " + IntField + " " + NulledIntField;
+ }
+}
+
+class BinaryOperatorOverrides
+{
+ int value;
+
+ public BinaryOperatorOverrides (int num)
+ {
+ value = num;
+ }
+
+ public override string ToString ()
+ {
+ return string.Format ("[BinaryOperatorOverrides {0}]", value);
+ }
+
+ public static bool operator== (BinaryOperatorOverrides ops1, BinaryOperatorOverrides ops2)
+ {
+ return ops1.value == ops2.value;
+ }
+
+ public static bool operator!= (BinaryOperatorOverrides ops1, BinaryOperatorOverrides ops2)
+ {
+ return ops1.value != ops2.value;
+ }
+
+ public static bool operator>= (BinaryOperatorOverrides ops1, BinaryOperatorOverrides ops2)
+ {
+ return ops1.value >= ops2.value;
+ }
+
+ public static bool operator> (BinaryOperatorOverrides ops1, BinaryOperatorOverrides ops2)
+ {
+ return ops1.value > ops2.value;
+ }
+
+ public static bool operator<= (BinaryOperatorOverrides ops1, BinaryOperatorOverrides ops2)
+ {
+ return ops1.value <= ops2.value;
+ }
+
+ public static bool operator< (BinaryOperatorOverrides ops1, BinaryOperatorOverrides ops2)
+ {
+ return ops1.value < ops2.value;
+ }
+
+ public static BinaryOperatorOverrides operator+ (BinaryOperatorOverrides ops1, BinaryOperatorOverrides ops2)
+ {
+ return new BinaryOperatorOverrides (ops1.value + ops2.value);
+ }
+
+ public static BinaryOperatorOverrides operator- (BinaryOperatorOverrides ops1, BinaryOperatorOverrides ops2)
+ {
+ return new BinaryOperatorOverrides (ops1.value - ops2.value);
+ }
+
+ public static BinaryOperatorOverrides operator* (BinaryOperatorOverrides ops1, BinaryOperatorOverrides ops2)
+ {
+ return new BinaryOperatorOverrides (ops1.value * ops2.value);
+ }
+
+ public static BinaryOperatorOverrides operator/ (BinaryOperatorOverrides ops1, BinaryOperatorOverrides ops2)
+ {
+ return new BinaryOperatorOverrides (ops1.value / ops2.value);
+ }
+
+ public static BinaryOperatorOverrides operator% (BinaryOperatorOverrides ops1, BinaryOperatorOverrides ops2)
+ {
+ return new BinaryOperatorOverrides (ops1.value % ops2.value);
+ }
+
+ public static BinaryOperatorOverrides operator& (BinaryOperatorOverrides ops1, BinaryOperatorOverrides ops2)
+ {
+ return new BinaryOperatorOverrides (ops1.value & ops2.value);
+ }
+
+ public static BinaryOperatorOverrides operator| (BinaryOperatorOverrides ops1, BinaryOperatorOverrides ops2)
+ {
+ return new BinaryOperatorOverrides (ops1.value | ops2.value);
+ }
+
+ public static BinaryOperatorOverrides operator^ (BinaryOperatorOverrides ops1, BinaryOperatorOverrides ops2)
+ {
+ return new BinaryOperatorOverrides (ops1.value ^ ops2.value);
+ }
+
+ public static BinaryOperatorOverrides operator<< (BinaryOperatorOverrides ops1, int shift)
+ {
+ return new BinaryOperatorOverrides (ops1.value << shift);
+ }
+
+ public static BinaryOperatorOverrides operator>> (BinaryOperatorOverrides ops1, int shift)
+ {
+ return new BinaryOperatorOverrides (ops1.value >> shift);
+ }
+} \ No newline at end of file
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/BreakpointsAndSteppingTests.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/BreakpointsAndSteppingTests.cs
index 5e0aa4b6c7..fcf460afb7 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/BreakpointsAndSteppingTests.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/BreakpointsAndSteppingTests.cs
@@ -26,6 +26,7 @@
using System;
using NUnit.Framework;
using Mono.Debugging.Client;
+using System.Collections.Generic;
namespace MonoDevelop.Debugger.Tests
{
@@ -483,6 +484,7 @@ namespace MonoDevelop.Debugger.Tests
CheckPosition ("f3b6862d-732b-4f68-81f5-f362d5a092e2");
AddBreakpoint ("invalidBreakpointAtEndOfFile");
AddBreakpoint ("ffde3c82-4310-43d3-93d1-4c39e9cf615e");
+ Continue ("ffde3c82-4310-43d3-93d1-4c39e9cf615e");
}
/// <summary>
@@ -516,6 +518,48 @@ namespace MonoDevelop.Debugger.Tests
StepIn ("e01a5428-b067-4ca3-ac8c-a19d5d800228", 1, "}");
}
+ [Test]
+ public void SetBreakpointOnColumn ()
+ {
+ InitializeTest ();
+ AddBreakpoint ("b73bec88-2c43-4157-8574-ad517730bc74", 1, "testClass.Iter_1");
+ AddBreakpoint ("b73bec88-2c43-4157-8574-ad517730bc74", 1, "in");
+ AddBreakpoint ("b73bec88-2c43-4157-8574-ad517730bc74", 1, "var");
+ AddBreakpoint ("e01a5428-b067-4ca3-ac8c-a19d5d800228", 1);//end of method
+ StartTest ("ForeachEnumerable");
+ CheckPosition ("b73bec88-2c43-4157-8574-ad517730bc74", 1, "testClass.Iter_1");
+ Continue ("b73bec88-2c43-4157-8574-ad517730bc74", 1, "in");
+ Continue ("b73bec88-2c43-4157-8574-ad517730bc74", 1, "var");
+ Continue ("b73bec88-2c43-4157-8574-ad517730bc74", 1, "in");
+ Continue ("b73bec88-2c43-4157-8574-ad517730bc74", 1, "var");
+ Continue ("b73bec88-2c43-4157-8574-ad517730bc74", 1, "in");
+ Continue ("e01a5428-b067-4ca3-ac8c-a19d5d800228", 1);//end of method
+ }
+
+ [Test]
+ public void RunToCursorTest ()
+ {
+ InitializeTest ();
+ AddBreakpoint ("b73bec88-2c43-4157-8574-ad517730bc74");
+ StartTest ("ForeachEnumerable");
+ CheckPosition ("b73bec88-2c43-4157-8574-ad517730bc74");
+ RunToCursor ("b73bec88-2c43-4157-8574-ad517730bc74", 1, "testClass.Iter_1");
+ RunToCursor ("b73bec88-2c43-4157-8574-ad517730bc74", 1, "var");
+ RunToCursor ("b73bec88-2c43-4157-8574-ad517730bc74", 1, "in");
+ RunToCursor ("69dba3ab-0941-47e9-99fa-10222a2e894d", 1, "}");
+ RunToCursor ("e01a5428-b067-4ca3-ac8c-a19d5d800228", 1);
+ }
+
+ [Test]
+ public void RunToCursorTest2 ()
+ {
+ InitializeTest ();
+ AddBreakpoint ("f4e3a214-229e-44dd-9da2-db82ddfbec11", 1);
+ StartTest ("SimpleMethod");
+ CheckPosition ("f4e3a214-229e-44dd-9da2-db82ddfbec11", 1);
+ RunToCursor ("f4e3a214-229e-44dd-9da2-db82ddfbec11", 3);
+ }
+
/// <summary>
/// Bug 4032
/// </summary>
@@ -578,8 +622,6 @@ namespace MonoDevelop.Debugger.Tests
StepIn ("1c3e65ca-3201-42ba-9c6e-6f9a45ddac44", 1);
StepIn ("c25be44e-ead3-4891-ab42-0e4cf8450f7a", -1);
}
-/**/
-
/// <summary>
/// Bug 7901
@@ -620,7 +662,7 @@ namespace MonoDevelop.Debugger.Tests
/// Bug 11868
/// </summary>
[Test]
- [Ignore("Todo")]
+ [Ignore ("Todo")]
public void AwaitCall ()
{
InitializeTest ();
@@ -669,6 +711,297 @@ namespace MonoDevelop.Debugger.Tests
StepIn ("a90ba766-0891-4837-9b1d-e5458f6b8e07", "return");
StepIn ("a90ba766-0891-4837-9b1d-e5458f6b8e07", 1, "}");
}
+
+ [Test]
+ public void SetNextStatementTest ()
+ {
+ InitializeTest ();
+ AddBreakpoint ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ StartTest ("ForLoop10");
+ CheckPosition ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ SetNextStatement ("3e2e4759-f6d9-4839-98e6-4fa96b227458");
+ StepIn ("3e2e4759-f6d9-4839-98e6-4fa96b227458", 1);
+ }
+
+
+ [Test]
+ public void SetNextStatementTest2 ()
+ {
+ InitializeTest ();
+ AddBreakpoint ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ StartTest ("ForLoop10");
+ CheckPosition ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ SetNextStatement ("c35046f7-e87d-4b8f-b260-43e181a0a07c", -1, "{");
+ StepIn ("c35046f7-e87d-4b8f-b260-43e181a0a07c", 1, "int");
+ }
+
+ [Test]
+ public void SetNextStatementTest3 ()
+ {
+ InitializeTest ();
+ AddBreakpoint ("f4e3a214-229e-44dd-9da2-db82ddfbec11", 1);
+ StartTest ("SimpleMethod");
+ CheckPosition ("f4e3a214-229e-44dd-9da2-db82ddfbec11", 1);
+ StepOver ("f4e3a214-229e-44dd-9da2-db82ddfbec11", 2);
+ StepOver ("f4e3a214-229e-44dd-9da2-db82ddfbec11", 3);
+ StepOver ("f4e3a214-229e-44dd-9da2-db82ddfbec11", 4);
+ SetNextStatement ("f4e3a214-229e-44dd-9da2-db82ddfbec11", 1);
+ StepOver ("f4e3a214-229e-44dd-9da2-db82ddfbec11", 2);
+ StepOver ("f4e3a214-229e-44dd-9da2-db82ddfbec11", 3);
+ SetNextStatement ("f4e3a214-229e-44dd-9da2-db82ddfbec11", -1);
+ StepOver ("f4e3a214-229e-44dd-9da2-db82ddfbec11", 1);
+ }
+
+ [Test]
+ public void CatchPointTest1 ()
+ {
+ InitializeTest ();
+ AddBreakpoint ("fcdc2412-c00e-4c95-b2ea-e3cf5d5bf856");
+ AddCatchpoint ("System.Exception", true);
+ StartTest ("Catchpoint1");
+ if (!CheckPosition ("526795d3-ee9e-44a7-8423-df0b406e9e8d", 1, null, true))//Workaround for Win32 debugger which stops at +1 line
+ CheckPosition ("526795d3-ee9e-44a7-8423-df0b406e9e8d");
+ var ops = Session.EvaluationOptions.Clone ();
+ ops.MemberEvaluationTimeout = 0;
+ ops.EvaluationTimeout = 0;
+ ops.EllipsizeStrings = false;
+
+ var val = Frame.GetException (ops);
+ Assert.AreEqual ("System.NotImplementedException", val.Type);
+
+ InitializeTest ();
+ AddBreakpoint ("fcdc2412-c00e-4c95-b2ea-e3cf5d5bf856");
+ AddCatchpoint ("System.Exception", false);
+ StartTest ("Catchpoint1");
+ CheckPosition ("fcdc2412-c00e-4c95-b2ea-e3cf5d5bf856");
+ }
+
+ [Test]
+ public void CatchPointTest2 ()
+ {
+ InitializeTest ();
+ AddCatchpoint ("System.Exception", true);
+ StartTest ("Catchpoint2");
+ CheckPosition ("d24b1c9d-3944-4f0d-be31-5556251fbdf5");
+ Assert.IsTrue (Session.ActiveThread.Backtrace.GetFrame (0).IsExternalCode);
+ Assert.IsFalse (Session.ActiveThread.Backtrace.GetFrame (1).IsExternalCode);
+ }
+
+ [Test]
+ public void ConditionalBreakpoints ()
+ {
+ ObjectValue val;
+ Breakpoint bp;
+
+ InitializeTest ();
+ AddBreakpoint ("3e2e4759-f6d9-4839-98e6-4fa96b227458");
+ bp = AddBreakpoint ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ bp.ConditionExpression = "i==2";
+ StartTest ("ForLoop10");
+ CheckPosition ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ val = Eval ("i");
+ Assert.AreEqual ("2", val.Value);
+ Continue ("3e2e4759-f6d9-4839-98e6-4fa96b227458");
+
+ Assert.Ignore ("TODO: Conditional breakpoints with compare against string or enum is not working");
+
+ InitializeTest ();
+ bp = AddBreakpoint ("033dd01d-6cb4-4e1a-b445-de6d7fa0d2a7");
+ bp.ConditionExpression = "str == \"bbb\"";
+ StartTest ("ConditionalBreakpointString");
+ CheckPosition ("033dd01d-6cb4-4e1a-b445-de6d7fa0d2a7");
+ val = Eval ("str");
+ Assert.AreEqual ("\"bbb\"", val.Value);
+
+ InitializeTest ();
+ bp = AddBreakpoint ("ecf764bf-9182-48d6-adb0-0ba36e2653a7");
+ bp.ConditionExpression = "en == BooleanEnum.False";
+ StartTest ("ConitionalBreakpointEnum");
+ CheckPosition ("ecf764bf-9182-48d6-adb0-0ba36e2653a7");
+ val = Eval ("en");
+ Assert.AreEqual ("BooleanEnum.False", val.Value);
+ }
+
+ [Test]
+ public void HitCountBreakpoints ()
+ {
+ ObjectValue val;
+ Breakpoint bp;
+
+ InitializeTest ();
+ AddBreakpoint ("3e2e4759-f6d9-4839-98e6-4fa96b227458");
+ bp = AddBreakpoint ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ bp.HitCount = 3;
+ bp.HitCountMode = HitCountMode.EqualTo;
+ StartTest ("ForLoop10");
+ CheckPosition ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ val = Eval ("i");
+ Assert.AreEqual ("2", val.Value);
+ Continue ("3e2e4759-f6d9-4839-98e6-4fa96b227458");
+
+ InitializeTest ();
+ AddBreakpoint ("3e2e4759-f6d9-4839-98e6-4fa96b227458");
+ bp = AddBreakpoint ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ bp.HitCount = 3;
+ bp.HitCountMode = HitCountMode.GreaterThan;
+ StartTest ("ForLoop10");
+ CheckPosition ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ val = Eval ("i");
+ Assert.AreEqual ("3", val.Value);
+ Continue ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ val = Eval ("i");
+ Assert.AreEqual ("4", val.Value);
+ Continue ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ val = Eval ("i");
+ Assert.AreEqual ("5", val.Value);
+
+ InitializeTest ();
+ AddBreakpoint ("3e2e4759-f6d9-4839-98e6-4fa96b227458");
+ bp = AddBreakpoint ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ bp.HitCount = 3;
+ bp.HitCountMode = HitCountMode.GreaterThanOrEqualTo;
+ StartTest ("ForLoop10");
+ CheckPosition ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ val = Eval ("i");
+ Assert.AreEqual ("2", val.Value);
+ Continue ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ val = Eval ("i");
+ Assert.AreEqual ("3", val.Value);
+ Continue ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ val = Eval ("i");
+ Assert.AreEqual ("4", val.Value);
+
+ InitializeTest ();
+ AddBreakpoint ("3e2e4759-f6d9-4839-98e6-4fa96b227458");
+ bp = AddBreakpoint ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ bp.HitCount = 3;
+ bp.HitCountMode = HitCountMode.LessThan;
+ StartTest ("ForLoop10");
+ CheckPosition ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ val = Eval ("i");
+ Assert.AreEqual ("0", val.Value);
+ Continue ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ val = Eval ("i");
+ Assert.AreEqual ("1", val.Value);
+ Continue ("3e2e4759-f6d9-4839-98e6-4fa96b227458");
+
+ InitializeTest ();
+ AddBreakpoint ("3e2e4759-f6d9-4839-98e6-4fa96b227458");
+ bp = AddBreakpoint ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ bp.HitCount = 3;
+ bp.HitCountMode = HitCountMode.LessThanOrEqualTo;
+ StartTest ("ForLoop10");
+ CheckPosition ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ val = Eval ("i");
+ Assert.AreEqual ("0", val.Value);
+ Continue ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ val = Eval ("i");
+ Assert.AreEqual ("1", val.Value);
+ Continue ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ val = Eval ("i");
+ Assert.AreEqual ("2", val.Value);
+ Continue ("3e2e4759-f6d9-4839-98e6-4fa96b227458");
+
+ InitializeTest ();
+ AddBreakpoint ("3e2e4759-f6d9-4839-98e6-4fa96b227458");
+ bp = AddBreakpoint ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ bp.HitCount = 3;
+ bp.HitCountMode = HitCountMode.MultipleOf;
+ StartTest ("ForLoop10");
+ CheckPosition ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ val = Eval ("i");
+ Assert.AreEqual ("2", val.Value);
+ Continue ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ val = Eval ("i");
+ Assert.AreEqual ("5", val.Value);
+ Continue ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ val = Eval ("i");
+ Assert.AreEqual ("8", val.Value);
+ Continue ("3e2e4759-f6d9-4839-98e6-4fa96b227458");
+
+ InitializeTest ();
+ AddBreakpoint ("3e2e4759-f6d9-4839-98e6-4fa96b227458");
+ bp = AddBreakpoint ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ bp.HitCount = 3;
+ bp.HitCountMode = HitCountMode.None;
+ StartTest ("ForLoop10");
+ CheckPosition ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ val = Eval ("i");
+ Assert.AreEqual ("0", val.Value);
+ Continue ("eef5bea2-aaa6-4718-b26f-b35be6a6a13e");
+ val = Eval ("i");
+ Assert.AreEqual ("1", val.Value);
+ }
+
+ [Test]
+ public void Bug13401 ()
+ {
+ InitializeTest ();
+ AddBreakpoint ("977ee8ce-ee61-4de0-9fc1-138fa164870b");
+ StartTest ("Bug13401");
+ CheckPosition ("977ee8ce-ee61-4de0-9fc1-138fa164870b");
+ var val = Eval ("s");
+ Assert.AreEqual ("string", val.TypeName);
+ Assert.AreEqual ("\"Hello from Bar\"", val.Value);
+ }
+
+ [Test]
+ public void OutputAndDebugWriter ()
+ {
+ //Interesting fact... Debug.Write(""); produces log entry
+ //but Console.Write(""); does not
+
+ InitializeTest ();
+ AddBreakpoint ("5070ed1c-593d-4cbe-b4fa-b2b0c7b25289");
+ var errorsList = new List<string> ();
+ errorsList.Add ("ErrorText");
+ var outputList = new HashSet<string> ();
+ outputList.Add ("NormalText");
+ var debugList = new List<Tuple<int,string,string>> ();
+ debugList.Add (new Tuple<int,string,string> (0, "", "DebugText"));
+ debugList.Add (new Tuple<int, string, string> (3, "SomeCategory", "DebugText2"));
+ debugList.Add (new Tuple<int,string,string> (0, "", ""));
+
+ var unexpectedOutput = new List<string> ();
+ var unexpectedError = new List<string> ();
+ var unexpectedDebug = new List<Tuple<int,string,string>> ();
+
+ Session.DebugWriter = delegate(int level, string category, string message) {
+ var entry = new Tuple<int,string,string> (level, category, message);
+ if (debugList.Contains (entry)) {
+ debugList.Remove (entry);
+ } else {
+ unexpectedDebug.Add (entry);
+ }
+ };
+ Session.OutputWriter = delegate(bool isStderr, string text) {
+ if (isStderr) {
+ if (errorsList.Contains (text))
+ errorsList.Remove (text);
+ else
+ unexpectedError.Add (text);
+ } else {
+ if (outputList.Contains (text))
+ outputList.Remove (text);
+ else
+ unexpectedOutput.Add (text);
+ }
+ };
+ StartTest ("OutputAndDebugWriter");
+ CheckPosition ("5070ed1c-593d-4cbe-b4fa-b2b0c7b25289");
+ if (outputList.Count > 0)
+ Assert.Fail ("Output list still has following items:" + string.Join (",", outputList));
+ if (errorsList.Count > 0)
+ Assert.Fail ("Error list still has following items:" + string.Join (",", errorsList));
+ if (debugList.Count > 0)
+ Assert.Fail ("Debug list still has following items:" + string.Join (",", debugList));
+ if (unexpectedOutput.Count > 0)
+ Assert.Fail ("Unexcpected Output list has following items:" + string.Join (",", unexpectedOutput));
+ if (unexpectedError.Count > 0)
+ Assert.Fail ("Unexcpected Error list has following items:" + string.Join (",", unexpectedError));
+ if (unexpectedDebug.Count > 0)
+ Assert.Fail ("Unexcpected Debug list has following items:" + string.Join (",", unexpectedDebug));
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/CorEvaluationTests.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/CorEvaluationTests.cs
index 953286074c..f6714b4375 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/CorEvaluationTests.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/CorEvaluationTests.cs
@@ -30,7 +30,6 @@ namespace MonoDevelop.Debugger.Tests.Win32
{
[TestFixture]
[Platform (Include = "Win")]
- [Ignore ("Disabled for now")]
public class CorEvaluationAllowTargetInvokesTests: EvaluationTests
{
public CorEvaluationAllowTargetInvokesTests (): base ("MonoDevelop.Debugger.Win32", true)
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/CorStackFrameTests.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/CorStackFrameTests.cs
index d367db3515..41d0b3ae12 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/CorStackFrameTests.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/CorStackFrameTests.cs
@@ -29,7 +29,6 @@ namespace MonoDevelop.Debugger.Tests.Win32
{
[TestFixture]
[Platform (Include = "Win")]
- [Ignore ("Disabled for now")]
public class CorStackFrameAllowTargetInvokesTests : StackFrameTests
{
public CorStackFrameAllowTargetInvokesTests (): base ("MonoDevelop.Debugger.Win32", true)
@@ -39,7 +38,6 @@ namespace MonoDevelop.Debugger.Tests.Win32
[TestFixture]
[Platform (Include = "Win")]
- [Ignore ("Disabled for now")]
public class CorStackFrameNoTargetInvokesTests : StackFrameTests
{
public CorStackFrameNoTargetInvokesTests (): base ("MonoDevelop.Debugger.Win32", false)
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/DebugTests.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/DebugTests.cs
index 3f9671c11c..0b869a8de9 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/DebugTests.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/DebugTests.cs
@@ -54,11 +54,11 @@ namespace MonoDevelop.Debugger.Tests
SourceLocation lastStoppedPosition;
- public bool AllowTargetInvokes{ get; set; }
+ public bool AllowTargetInvokes { get; protected set; }
- public DebuggerSession Session{ get; private set; }
+ public DebuggerSession Session { get; private set; }
- public StackFrame Frame{ get; private set; }
+ public StackFrame Frame { get; private set; }
protected DebugTests (string engineId)
{
@@ -97,24 +97,31 @@ namespace MonoDevelop.Debugger.Tests
runtime = Runtime.SystemAssemblyService.GetTargetRuntime ("MS.NET");
break;
case "Mono.Debugger.Soft":
- runtime = Runtime.SystemAssemblyService.GetTargetRuntimes ().OfType<MonoTargetRuntime> ().FirstOrDefault ();
+ runtime = Runtime.SystemAssemblyService.GetTargetRuntimes ()
+ .OfType<MonoTargetRuntime> ()
+ .OrderByDescending(o => o.Version)
+ .FirstOrDefault ();
break;
default:
runtime = Runtime.SystemAssemblyService.DefaultRuntime;
break;
}
- if (runtime == null)
+ if (runtime == null) {
Assert.Ignore ("Runtime not found for: {0}", EngineId);
+ return;
+ }
+
+ Console.WriteLine ("Target Runtime: " + runtime.DisplayRuntimeName + " " + runtime.Version);
// main/build/tests
FilePath path = Path.GetDirectoryName (GetType ().Assembly.Location);
var exe = Path.Combine (path, "MonoDevelop.Debugger.Tests.TestApp.exe");
var cmd = new DotNetExecutionCommand ();
+ cmd.TargetRuntime = runtime;
cmd.Command = exe;
cmd.Arguments = test;
- cmd.TargetRuntime = runtime;
if (Platform.IsWindows) {
var monoRuntime = runtime as MonoTargetRuntime;
@@ -126,7 +133,7 @@ namespace MonoDevelop.Debugger.Tests
}
}
- DebuggerStartInfo dsi = engine.CreateDebuggerStartInfo (cmd);
+ var dsi = engine.CreateDebuggerStartInfo (cmd);
var soft = dsi as SoftDebuggerStartInfo;
if (soft != null) {
@@ -148,41 +155,91 @@ namespace MonoDevelop.Debugger.Tests
AddBreakpoint ("break");
var done = new ManualResetEvent (false);
-
- Session.OutputWriter = (isStderr, text) => Console.WriteLine ("PROC:" + text);
- Session.TargetHitBreakpoint += (object sender, TargetEventArgs e) => {
+ Session.TargetHitBreakpoint += (sender, e) => {
+ Frame = e.Backtrace.GetFrame (0);
+ lastStoppedPosition = Frame.SourceLocation;
+ targetStoppedEvent.Set ();
done.Set ();
+ };
+
+ Session.TargetExceptionThrown += (sender, e) => {
Frame = e.Backtrace.GetFrame (0);
+ for (int i = 0; i < e.Backtrace.FrameCount; i++) {
+ if (!e.Backtrace.GetFrame (i).IsExternalCode) {
+ Frame = e.Backtrace.GetFrame (i);
+ break;
+ }
+ }
lastStoppedPosition = Frame.SourceLocation;
targetStoppedEvent.Set ();
};
- Session.TargetStopped += (object sender, TargetEventArgs e) => {
+ Session.TargetStopped += (sender, e) => {
Frame = e.Backtrace.GetFrame (0);
lastStoppedPosition = Frame.SourceLocation;
targetStoppedEvent.Set ();
};
+ var targetExited = new ManualResetEvent (false);
+ Session.TargetExited += delegate {
+ targetExited.Set ();
+ };
+
Session.Run (dsi, ops);
- if (!done.WaitOne (3000))
+ switch (WaitHandle.WaitAny (new WaitHandle[]{ done, targetExited }, 30000)) {
+ case 0:
+ //Breakpoint is hit good... run tests now
+ break;
+ case 1:
+ throw new Exception ("Test application exited before hitting breakpoint");
+ default:
throw new Exception ("Timeout while waiting for initial breakpoint");
+ }
}
- public void AddBreakpoint (string breakpointMarker, int offset = 0)
+ void GetLineAndColumn (string breakpointMarker, int offset, string statement, out int line, out int col)
{
int i = SourceFile.Text.IndexOf ("/*" + breakpointMarker + "*/", StringComparison.Ordinal);
if (i == -1)
Assert.Fail ("Break marker not found: " + breakpointMarker + " in " + SourceFile.Name);
- int line, col;
SourceFile.GetLineColumnFromPosition (i, out line, out col);
- Breakpoint bp = Session.Breakpoints.Add (SourceFile.Name, line + offset);
- bp.Enabled = true;
+ line += offset;
+ if (statement != null) {
+ int lineStartPosition = SourceFile.GetPositionFromLineColumn (line, 1);
+ string lineText = SourceFile.GetText (lineStartPosition, lineStartPosition + SourceFile.GetLineLength (line));
+ col = lineText.IndexOf (statement, StringComparison.Ordinal) + 1;
+ if (col == 0)
+ Assert.Fail ("Failed to find statement:" + statement + " at " + SourceFile.Name + "(" + line + ")");
+ } else {
+ col = 1;
+ }
+ }
+
+ public Breakpoint AddBreakpoint (string breakpointMarker, int offset = 0, string statement = null)
+ {
+ int col, line;
+ GetLineAndColumn (breakpointMarker, offset, statement, out line, out col);
+ var bp = new Breakpoint (SourceFile.Name, line, col);
+ Session.Breakpoints.Add (bp);
+ return bp;
+ }
+
+ public void RunToCursor (string breakpointMarker, int offset = 0, string statement = null)
+ {
+ int col, line;
+ GetLineAndColumn (breakpointMarker, offset, statement, out line, out col);
+ targetStoppedEvent.Reset ();
+ Session.Breakpoints.RemoveRunToCursorBreakpoints ();
+ var bp = new RunToCursorBreakpoint (SourceFile.Name, line, col);
+ Session.Breakpoints.Add (bp);
+ Session.Continue ();
+ CheckPosition (breakpointMarker, offset, statement);
}
public void InitializeTest ()
{
- Session.Breakpoints.ClearBreakpoints ();
+ Session.Breakpoints.Clear ();
Session.Options.EvaluationOptions = EvaluationOptions.DefaultOptions;
Session.Options.ProjectAssembliesOnly = true;
Session.Options.StepOverPropertiesAndOperators = false;
@@ -289,10 +346,22 @@ namespace MonoDevelop.Debugger.Tests
if (!targetStoppedEvent.WaitOne (3000)) {
Assert.Fail ("StartTest failure: Target stop timeout");
}
- Assert.AreEqual ('"' + methodName + '"', Eval ("MonoDevelop.Debugger.Tests.TestApp.BreakpointsAndStepping.NextMethodToCall = \"" + methodName + "\";").Value);
+ Assert.AreEqual ('"' + methodName + '"', Eval ("NextMethodToCall = \"" + methodName + "\";").Value);
targetStoppedEvent.Reset ();
Session.Continue ();
}
+
+ public void SetNextStatement (string guid, int offset = 0, string statement = null)
+ {
+ int line, column;
+ GetLineAndColumn (guid, offset, statement, out line, out column);
+ Session.SetNextStatement (SourceFile.Name, line, column);
+ }
+
+ public void AddCatchpoint(string exceptionName, bool includeSubclasses)
+ {
+ Session.Breakpoints.Add (new Catchpoint (exceptionName, includeSubclasses));
+ }
}
static class EvalHelper
@@ -321,5 +390,12 @@ namespace MonoDevelop.Debugger.Tests
val.ValueChanged -= h;
return val;
}
+
+ public static ObjectValue GetChildSync (this ObjectValue val, string name, EvaluationOptions ops)
+ {
+ var result = val.GetChild (name, ops);
+
+ return result != null ? result.Sync () : null;
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/EvaluationTests.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/EvaluationTests.cs
index 26a0d3958b..1347b19619 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/EvaluationTests.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/EvaluationTests.cs
@@ -24,15 +24,18 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
+using System;
+
using Mono.Debugging.Client;
using NUnit.Framework;
+using Mono.Debugging.Soft;
namespace MonoDevelop.Debugger.Tests
{
[TestFixture]
public abstract class EvaluationTests: DebugTests
{
- protected EvaluationTests (string de, bool allowTargetInvokes): base (de)
+ protected EvaluationTests (string de, bool allowTargetInvokes) : base (de)
{
AllowTargetInvokes = allowTargetInvokes;
}
@@ -43,16 +46,54 @@ namespace MonoDevelop.Debugger.Tests
base.SetUp ();
Start ("TestEvaluation");
+ Session.TypeResolverHandler = ResolveType;
+ }
+
+ static string ResolveType (string identifier, SourceLocation location)
+ {
+ switch (identifier) {
+ case "SomeClassInNamespace":
+ return "MonoDevelop.Debugger.Tests.TestApp.SomeClassInNamespace";
+ case "ParentNestedClass":
+ return "MonoDevelop.Debugger.Tests.TestApp.TestEvaluationParent.ParentNestedClass";
+ case "NestedClass":
+ return "MonoDevelop.Debugger.Tests.TestApp.TestEvaluation.NestedClass";
+ case "TestEvaluation":
+ return "MonoDevelop.Debugger.Tests.TestApp.TestEvaluation";
+ case "NestedGenericClass`2":
+ return "MonoDevelop.Debugger.Tests.TestApp.TestEvaluation.NestedGenericClass";
+ case "Dictionary`2":
+ return "System.Collections.Generic.Dictionary";
+ case "Thing`1":
+ return "Thing";
+ case "A":
+ return "A";
+ case "B":
+ return "B";
+ case "C":
+ return "C";
+ case "System":
+ return "System";
+ case "MonoDevelop":
+ return "MonoDevelop";
+ case "SomeEnum":
+ return "SomeEnum";
+ }
+ return null;
}
[Test]
public void This ()
{
+ var soft = Session as SoftDebuggerSession;
+ if (soft != null && soft.ProtocolVersion < new Version (2, 31))
+ Assert.Ignore ("A newer version of the Mono runtime is required.");
+
ObjectValue val = Eval ("this");
Assert.AreEqual ("{MonoDevelop.Debugger.Tests.TestApp.TestEvaluation}", val.Value);
Assert.AreEqual ("MonoDevelop.Debugger.Tests.TestApp.TestEvaluation", val.TypeName);
}
-
+
[Test]
public void UnaryOperators ()
{
@@ -76,11 +117,12 @@ namespace MonoDevelop.Debugger.Tests
Assert.AreEqual ("1234", val.Value);
Assert.AreEqual ("int", val.TypeName);
}
-
+
[Test]
public void TypeReference ()
{
- ObjectValue val = Eval ("System.String");
+ ObjectValue val;
+ val = Eval ("System.String");
Assert.AreEqual ("string", val.Value);
Assert.AreEqual ("<type>", val.TypeName);
Assert.AreEqual (ObjectValueFlags.Type, val.Flags & ObjectValueFlags.OriginMask);
@@ -89,71 +131,302 @@ namespace MonoDevelop.Debugger.Tests
Assert.AreEqual ("MonoDevelop.Debugger.Tests.TestApp.TestEvaluation", val.Value);
Assert.AreEqual ("<type>", val.TypeName);
Assert.AreEqual (ObjectValueFlags.Type, val.Flags & ObjectValueFlags.OriginMask);
-
+
+ val = Eval ("A");
+ Assert.AreEqual ("A", val.Value);
+ Assert.AreEqual ("<type>", val.TypeName);
+ Assert.AreEqual (ObjectValueFlags.Type, val.Flags & ObjectValueFlags.OriginMask);
+
+ val = Eval ("NestedClass");
+ Assert.AreEqual ("MonoDevelop.Debugger.Tests.TestApp.TestEvaluation.NestedClass", val.Value);
+ Assert.AreEqual ("<type>", val.TypeName);
+ Assert.AreEqual (ObjectValueFlags.Type, val.Flags & ObjectValueFlags.OriginMask);
+
val = Eval ("MonoDevelop.Debugger.Tests.TestApp.TestEvaluation");
Assert.AreEqual ("MonoDevelop.Debugger.Tests.TestApp.TestEvaluation", val.Value);
Assert.AreEqual ("<type>", val.TypeName);
Assert.AreEqual (ObjectValueFlags.Type, val.Flags & ObjectValueFlags.OriginMask);
+
+ val = Eval ("NestedClass.DoubleNestedClass");
+ Assert.AreEqual ("MonoDevelop.Debugger.Tests.TestApp.TestEvaluation.NestedClass.DoubleNestedClass", val.Value);
+ Assert.AreEqual ("<type>", val.TypeName);
+ Assert.AreEqual (ObjectValueFlags.Type, val.Flags & ObjectValueFlags.OriginMask);
+
+ val = Eval ("ParentNestedClass");
+ Assert.AreEqual ("MonoDevelop.Debugger.Tests.TestApp.TestEvaluationParent.ParentNestedClass", val.Value);
+ Assert.AreEqual ("<type>", val.TypeName);
+ Assert.AreEqual (ObjectValueFlags.Type, val.Flags & ObjectValueFlags.OriginMask);
+
+ val = Eval ("SomeClassInNamespace");
+ Assert.AreEqual ("MonoDevelop.Debugger.Tests.TestApp.SomeClassInNamespace", val.Value);
+ Assert.AreEqual ("<type>", val.TypeName);
+ Assert.AreEqual (ObjectValueFlags.Type, val.Flags & ObjectValueFlags.OriginMask);
}
-
+
[Test]
public virtual void TypeReferenceGeneric ()
{
- ObjectValue val = Eval ("System.Collections.Generic.Dictionary<string,int>");
+ ObjectValue val;
+ val = Eval ("System.Collections.Generic.Dictionary<string,int>");
Assert.AreEqual ("System.Collections.Generic.Dictionary<string,int>", val.Value);
Assert.AreEqual ("<type>", val.TypeName);
Assert.AreEqual (ObjectValueFlags.Type, val.Flags & ObjectValueFlags.OriginMask);
+
+ val = Eval ("Thing<string>.Done<int>");
+ Assert.AreEqual ("Thing<string>.Done<int>", val.Value);
+ Assert.AreEqual ("<type>", val.TypeName);
+ Assert.AreEqual (ObjectValueFlags.Type, val.Flags & ObjectValueFlags.OriginMask);
}
-
+
[Test]
public virtual void Typeof ()
{
- ObjectValue val = Eval ("typeof(System.Console)");
+ var soft = Session as SoftDebuggerSession;
+ if (soft != null && soft.ProtocolVersion < new Version (2, 31))
+ Assert.Ignore ("A newer version of the Mono runtime is required.");
+
+ var val = Eval ("typeof(System.Console)");
Assert.IsTrue (val.TypeName == "System.MonoType" || val.TypeName == "System.RuntimeType", "Incorrect type name: " + val.TypeName);
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.Value == "{System.MonoType}" || val.Value == "{System.RuntimeType}");
+ val.Refresh (options);
+ val = val.Sync ();
+ }
Assert.AreEqual ("{System.Console}", val.Value);
}
-
+
[Test]
public void MethodInvoke ()
{
ObjectValue val;
+
+ var soft = Session as SoftDebuggerSession;
+ if (soft != null && soft.ProtocolVersion < new Version (2, 31))
+ Assert.Ignore ("A newer version of the Mono runtime is required.");
+
val = Eval ("TestMethod ()");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
Assert.AreEqual ("1", val.Value);
Assert.AreEqual ("int", val.TypeName);
val = Eval ("TestMethod (\"23\")");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
Assert.AreEqual ("24", val.Value);
Assert.AreEqual ("int", val.TypeName);
val = Eval ("TestMethod (42)");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
Assert.AreEqual ("43", val.Value);
Assert.AreEqual ("int", val.TypeName);
-
+
val = Eval ("TestMethod (false)");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
Assert.AreEqual ("2", val.Value);
Assert.AreEqual ("int", val.TypeName);
val = Eval ("this.TestMethod ()");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
Assert.AreEqual ("1", val.Value);
Assert.AreEqual ("int", val.TypeName);
val = Eval ("this.TestMethod (\"23\")");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
Assert.AreEqual ("24", val.Value);
Assert.AreEqual ("int", val.TypeName);
val = Eval ("this.TestMethod (42)");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
Assert.AreEqual ("43", val.Value);
Assert.AreEqual ("int", val.TypeName);
val = Eval ("System.Int32.Parse (\"67\")");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
Assert.AreEqual ("67", val.Value);
Assert.AreEqual ("int", val.TypeName);
val = Eval ("this.BoxingTestMethod (43)");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
Assert.AreEqual ("\"43\"", val.Value);
Assert.AreEqual ("string", val.TypeName);
+
+ val = Eval ("objWithMethodA.MethodA()");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("\"AbstractImplementation\"", val.Value);
+ Assert.AreEqual ("string", val.TypeName);
+
+ // FIXME: failing on CorDebugger
+ if (Session is SoftDebuggerSession) {
+ val = Eval ("true.ToString()");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+
+ Assert.AreEqual ("\"True\"", val.Value);
+ Assert.AreEqual ("string", val.TypeName);
+ }
+ }
+
+ [Test]
+ public void GenericMethodInvoke ()
+ {
+ var soft = Session as SoftDebuggerSession;
+ if (soft != null && soft.ProtocolVersion < new Version (2, 31))
+ Assert.Ignore ("A newer version of the Mono runtime is required.");
+
+ if (Session.GetType ().Name == "CorDebuggerSession")
+ Assert.Ignore ("TODO: Win32 support generic invokes");
+
+ if (!AllowTargetInvokes)
+ return;
+
+ ObjectValue val;
+ val = Eval ("done.ReturnInt5()");
+ Assert.AreEqual ("5", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("done.ReturnSame(3)");
+ Assert.AreEqual ("3", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("ReturnSame(4)");
+ Assert.AreEqual ("4", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("ReturnSame(\"someString\")");
+ Assert.AreEqual ("\"someString\"", val.Value);
+ Assert.AreEqual ("string", val.TypeName);
+
+ val = Eval ("ReturnNew<WithToString>()");
+ Assert.AreEqual ("{SomeString}", val.Value);
+ Assert.AreEqual ("WithToString", val.TypeName);
+
+ val = Eval ("intZero");
+ Assert.AreEqual ("0", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("intOne");
+ Assert.AreEqual ("1", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ // TODO: in, out, and ref params are not currently supported
+ //val = Eval ("Swap (ref intZero, ref intOne)");
+ //Assert.AreEqual ("", val.Value);
+
+ //val = Eval ("intZero");
+ //Assert.AreEqual ("1", val.Value);
+ //Assert.AreEqual ("int", val.TypeName);
+
+ //val = Eval ("intOne");
+ //Assert.AreEqual ("0", val.Value);
+ //Assert.AreEqual ("int", val.TypeName);
+
+ //Lets return in same state as before in case some other test will use
+ //val = Eval ("Swap (ref intZero, ref intOne)");
+ //Assert.AreEqual ("", val.Value);
+
+ val = Eval ("GenerateList(\"someString\", 5)");
+ Assert.AreEqual ("Count=5", val.Value);
+ Assert.AreEqual ("System.Collections.Generic.List<string>", val.TypeName);
+
+ val = Eval ("GenerateList(2.0, 6)");
+ Assert.AreEqual ("Count=6", val.Value);
+ Assert.AreEqual ("System.Collections.Generic.List<double>", val.TypeName);
+
+ val = Eval ("done.GetDefault()");
+ Assert.AreEqual ("0", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("done.GetParentDefault()");
+ Assert.AreEqual ("(null)", val.Value);
+ Assert.AreEqual ("object", val.TypeName);
+
+ val = Eval ("new Dictionary<int,string>()");
+ Assert.AreEqual ("Count=0", val.Value);
+ Assert.AreEqual ("System.Collections.Generic.Dictionary<int,string>", val.TypeName);
+
+ val = Eval ("done.Property");
+ Assert.AreEqual ("54", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
}
-
+
[Test]
public void Indexers ()
{
@@ -170,35 +443,150 @@ namespace MonoDevelop.Debugger.Tests
Assert.AreEqual ("string", val.TypeName);
val = Eval ("staticString[2]");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
Assert.AreEqual ("'m'", val.Value);
Assert.AreEqual ("char", val.TypeName);
val = Eval ("alist[0]");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
Assert.AreEqual ("1", val.Value);
Assert.AreEqual ("int", val.TypeName);
val = Eval ("alist[1]");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
Assert.AreEqual ("\"two\"", val.Value);
Assert.AreEqual ("string", val.TypeName);
val = Eval ("alist[2]");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
Assert.AreEqual ("3", val.Value);
Assert.AreEqual ("int", val.TypeName);
}
-
+
+ void CheckValue (string expected, string actual)
+ {
+ if (AllowTargetInvokes)
+ Assert.AreEqual (expected, actual);
+ else
+ Assert.AreEqual ("Implicit evaluation is disabled", actual);
+ }
+
[Test]
public void MemberReference ()
{
- ObjectValue val = Eval ("alist.Count");
+ ObjectValue val;
+
+ var soft = Session as SoftDebuggerSession;
+ if (soft != null && soft.ProtocolVersion < new Version (2, 31))
+ Assert.Ignore ("A newer version of the Mono runtime is required.");
+
+ val = Eval ("\"someString\".Length");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("10", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("numbers.Length");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("3", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("\"someString\".GetHashCode()");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("numbers.GetHashCode()");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("\"someString\".EndsWith (\"ing\")");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("true", val.Value);
+ Assert.AreEqual ("bool", val.TypeName);
+
+ val = Eval ("alist.Count");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
Assert.AreEqual ("3", val.Value);
Assert.AreEqual ("int", val.TypeName);
Eval ("var tt = this");
-
- val = Eval ("tt.someString");
- Assert.AreEqual ("\"hi\"", val.Value);
- Assert.AreEqual ("string", val.TypeName);
-
+
+ // FIXME: this errors out when target invokes are disabled
+ if (AllowTargetInvokes) {
+ val = Eval ("tt.someString");
+ Assert.AreEqual ("\"hi\"", val.Value);
+ Assert.AreEqual ("string", val.TypeName);
+ }
+
val = Eval ("MonoDevelop.Debugger.Tests");
Assert.AreEqual ("MonoDevelop.Debugger.Tests", val.Value);
Assert.AreEqual ("<namespace>", val.TypeName);
@@ -210,8 +598,108 @@ namespace MonoDevelop.Debugger.Tests
val = Eval ("MonoDevelop.Debugger.Tests.TestApp.TestEvaluation.staticString");
Assert.AreEqual ("\"some static\"", val.Value);
Assert.AreEqual ("string", val.TypeName);
+
+ val = Eval ("richObject");
+ Assert.AreEqual ("{RichClass}", val.Value);
+ Assert.AreEqual ("RichClass", val.TypeName);
+
+ var richChildren = val.GetAllChildren ();
+ Assert.AreEqual (13, richChildren.Length);
+ Assert.AreEqual ("publicInt1", richChildren [0].Name);
+ Assert.AreEqual ("int", richChildren [0].TypeName);
+ Assert.AreEqual ("1", richChildren [0].Value);
+ Assert.AreEqual ("publicInt2", richChildren [1].Name);
+ Assert.AreEqual ("int", richChildren [1].TypeName);
+ Assert.AreEqual ("2", richChildren [1].Value);
+ Assert.AreEqual ("publicInt3", richChildren [2].Name);
+ Assert.AreEqual ("int", richChildren [2].TypeName);
+ Assert.AreEqual ("3", richChildren [2].Value);
+ Assert.AreEqual ("publicPropInt1", richChildren [3].Name);
+ Assert.AreEqual ("int", richChildren [3].TypeName);
+ CheckValue ("1", richChildren [3].Value);
+ Assert.AreEqual ("publicPropInt2", richChildren [4].Name);
+ Assert.AreEqual ("int", richChildren [4].TypeName);
+ CheckValue ("2", richChildren [4].Value);
+ Assert.AreEqual ("publicPropInt3", richChildren [5].Name);
+ Assert.AreEqual ("int", richChildren [5].TypeName);
+ CheckValue ("3", richChildren [5].Value);
+ Assert.AreEqual ("publicPropStringA", richChildren [6].Name);
+ Assert.AreEqual ("string", richChildren [6].TypeName);
+ CheckValue ("\"stringA\"", richChildren [6].Value);
+ Assert.AreEqual ("publicPropStringB", richChildren [7].Name);
+ Assert.AreEqual ("string", richChildren [7].TypeName);
+ CheckValue ("\"stringB\"", richChildren [7].Value);
+ Assert.AreEqual ("publicPropStringC", richChildren [8].Name);
+ Assert.AreEqual ("string", richChildren [8].TypeName);
+ CheckValue ("\"stringC\"", richChildren [8].Value);
+ Assert.AreEqual ("publicStringA", richChildren [9].Name);
+ Assert.AreEqual ("string", richChildren [9].TypeName);
+ Assert.AreEqual ("\"stringA\"", richChildren [9].Value);
+ Assert.AreEqual ("publicStringB", richChildren [10].Name);
+ Assert.AreEqual ("string", richChildren [10].TypeName);
+ Assert.AreEqual ("\"stringB\"", richChildren [10].Value);
+ Assert.AreEqual ("publicStringC", richChildren [11].Name);
+ Assert.AreEqual ("string", richChildren [11].TypeName);
+ Assert.AreEqual ("\"stringC\"", richChildren [11].Value);
+ Assert.AreEqual ("Non-public members", richChildren [12].Name);
+
+ richChildren = richChildren [12].GetAllChildren ();
+ Assert.AreEqual (12, richChildren.Length);
+ Assert.AreEqual ("privateInt1", richChildren [0].Name);
+ Assert.AreEqual ("int", richChildren [0].TypeName);
+ Assert.AreEqual ("1", richChildren [0].Value);
+ Assert.AreEqual ("privateInt2", richChildren [1].Name);
+ Assert.AreEqual ("int", richChildren [1].TypeName);
+ Assert.AreEqual ("2", richChildren [1].Value);
+ Assert.AreEqual ("privateInt3", richChildren [2].Name);
+ Assert.AreEqual ("int", richChildren [2].TypeName);
+ Assert.AreEqual ("3", richChildren [2].Value);
+ Assert.AreEqual ("privatePropInt1", richChildren [3].Name);
+ Assert.AreEqual ("int", richChildren [3].TypeName);
+ CheckValue ("1", richChildren [3].Value);
+ Assert.AreEqual ("privatePropInt2", richChildren [4].Name);
+ Assert.AreEqual ("int", richChildren [4].TypeName);
+ CheckValue ("2", richChildren [4].Value);
+ Assert.AreEqual ("privatePropInt3", richChildren [5].Name);
+ Assert.AreEqual ("int", richChildren [5].TypeName);
+ CheckValue ("3", richChildren [5].Value);
+ Assert.AreEqual ("privatePropStringA", richChildren [6].Name);
+ Assert.AreEqual ("string", richChildren [6].TypeName);
+ CheckValue ("\"stringA\"", richChildren [6].Value);
+ Assert.AreEqual ("privatePropStringB", richChildren [7].Name);
+ Assert.AreEqual ("string", richChildren [7].TypeName);
+ CheckValue ("\"stringB\"", richChildren [7].Value);
+ Assert.AreEqual ("privatePropStringC", richChildren [8].Name);
+ Assert.AreEqual ("string", richChildren [8].TypeName);
+ CheckValue ("\"stringC\"", richChildren [8].Value);
+ Assert.AreEqual ("privateStringA", richChildren [9].Name);
+ Assert.AreEqual ("string", richChildren [9].TypeName);
+ Assert.AreEqual ("\"stringA\"", richChildren [9].Value);
+ Assert.AreEqual ("privateStringB", richChildren [10].Name);
+ Assert.AreEqual ("string", richChildren [10].TypeName);
+ Assert.AreEqual ("\"stringB\"", richChildren [10].Value);
+ Assert.AreEqual ("privateStringC", richChildren [11].Name);
+ Assert.AreEqual ("string", richChildren [11].TypeName);
+ Assert.AreEqual ("\"stringC\"", richChildren [11].Value);
+
+ if (AllowTargetInvokes) {
+ val = Eval ("richObject.publicStringB=\"changedTextB\"");
+ Assert.AreEqual ("string", val.TypeName);
+ Assert.AreEqual ("\"changedTextB\"", val.Value);
+ val = Eval ("richObject.publicStringB");
+ Assert.AreEqual ("string", val.TypeName);
+ Assert.AreEqual ("\"changedTextB\"", val.Value);
+
+ val = Eval ("richObject");
+ Assert.AreEqual ("{RichClass}", val.Value);
+ Assert.AreEqual ("RichClass", val.TypeName);
+ richChildren = val.GetAllChildren ();
+ Assert.AreEqual ("publicPropStringB", richChildren [7].Name);
+ Assert.AreEqual ("string", richChildren [7].TypeName);
+ Assert.AreEqual ("\"stringB\"", richChildren [7].Value);
+ }
}
-
+
[Test]
public void ConditionalExpression ()
{
@@ -223,11 +711,16 @@ namespace MonoDevelop.Debugger.Tests
Assert.AreEqual ("\"no\"", val.Value);
Assert.AreEqual ("string", val.TypeName);
}
-
+
[Test]
public void Cast ()
{
ObjectValue val;
+
+ var soft = Session as SoftDebuggerSession;
+ if (soft != null && soft.ProtocolVersion < new Version (2, 31))
+ Assert.Ignore ("A newer version of the Mono runtime is required.");
+
val = Eval ("(byte)n");
Assert.AreEqual ("32", val.Value);
Assert.AreEqual ("byte", val.TypeName);
@@ -349,11 +842,15 @@ namespace MonoDevelop.Debugger.Tests
Assert.AreEqual ("one|two", val.DisplayValue);
Assert.AreEqual ("SomeEnum", val.TypeName);
}
-
+
[Test]
public void BinaryOperators ()
{
ObjectValue val;
+
+ var soft = Session as SoftDebuggerSession;
+ if (soft != null && soft.ProtocolVersion < new Version (2, 31))
+ Assert.Ignore ("A newer version of the Mono runtime is required.");
// Boolean
@@ -432,6 +929,28 @@ namespace MonoDevelop.Debugger.Tests
val = Eval ("(long)2 == (int)2");
Assert.AreEqual ("true", val.Value);
Assert.AreEqual ("bool", val.TypeName);
+
+ val = Eval ("SomeEnum.two == SomeEnum.one");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("false", val.Value);
+ Assert.AreEqual ("bool", val.TypeName);
+
+ val = Eval ("SomeEnum.one != SomeEnum.one");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("false", val.Value);
+ Assert.AreEqual ("bool", val.TypeName);
// Arithmetic
@@ -443,6 +962,91 @@ namespace MonoDevelop.Debugger.Tests
Assert.AreEqual ("bool", val.TypeName);
}
+ [Test]
+ public void BinaryOperatorOverrides ()
+ {
+ ObjectValue val;
+
+ if (!AllowTargetInvokes)
+ return;
+
+ var soft = Session as SoftDebuggerSession;
+ if (soft != null && soft.ProtocolVersion < new Version (2, 31))
+ Assert.Ignore ("Requires a newer version of the Mono runtime.");
+
+ val = Eval ("ops1 == ops3");
+ Assert.AreEqual ("false", val.Value);
+ Assert.AreEqual ("bool", val.TypeName);
+
+ val = Eval ("ops1 != ops3");
+ Assert.AreEqual ("true", val.Value);
+ Assert.AreEqual ("bool", val.TypeName);
+
+ val = Eval ("ops2 == ops3");
+ Assert.AreEqual ("true", val.Value);
+ Assert.AreEqual ("bool", val.TypeName);
+
+ val = Eval ("ops2 != ops3");
+ Assert.AreEqual ("false", val.Value);
+ Assert.AreEqual ("bool", val.TypeName);
+
+ val = Eval ("ops1 <= ops2");
+ Assert.AreEqual ("true", val.Value);
+ Assert.AreEqual ("bool", val.TypeName);
+
+ val = Eval ("ops1 < ops2");
+ Assert.AreEqual ("true", val.Value);
+ Assert.AreEqual ("bool", val.TypeName);
+
+ val = Eval ("ops1 >= ops2");
+ Assert.AreEqual ("false", val.Value);
+ Assert.AreEqual ("bool", val.TypeName);
+
+ val = Eval ("ops1 > ops2");
+ Assert.AreEqual ("false", val.Value);
+ Assert.AreEqual ("bool", val.TypeName);
+
+ val = Eval ("ops1 + ops2");
+ Assert.AreEqual ("{[BinaryOperatorOverrides 3]}", val.Value);
+ Assert.AreEqual ("BinaryOperatorOverrides", val.TypeName);
+
+ val = Eval ("ops1 - ops2");
+ Assert.AreEqual ("{[BinaryOperatorOverrides -1]}", val.Value);
+ Assert.AreEqual ("BinaryOperatorOverrides", val.TypeName);
+
+ val = Eval ("ops1 * ops2");
+ Assert.AreEqual ("{[BinaryOperatorOverrides 2]}", val.Value);
+ Assert.AreEqual ("BinaryOperatorOverrides", val.TypeName);
+
+ val = Eval ("ops2 / ops1");
+ Assert.AreEqual ("{[BinaryOperatorOverrides 2]}", val.Value);
+ Assert.AreEqual ("BinaryOperatorOverrides", val.TypeName);
+
+ val = Eval ("ops1 % ops2");
+ Assert.AreEqual ("{[BinaryOperatorOverrides 1]}", val.Value);
+ Assert.AreEqual ("BinaryOperatorOverrides", val.TypeName);
+
+ val = Eval ("ops1 & ops2");
+ Assert.AreEqual ("{[BinaryOperatorOverrides 0]}", val.Value);
+ Assert.AreEqual ("BinaryOperatorOverrides", val.TypeName);
+
+ val = Eval ("ops1 | ops2");
+ Assert.AreEqual ("{[BinaryOperatorOverrides 3]}", val.Value);
+ Assert.AreEqual ("BinaryOperatorOverrides", val.TypeName);
+
+ val = Eval ("ops1 ^ ops2");
+ Assert.AreEqual ("{[BinaryOperatorOverrides 3]}", val.Value);
+ Assert.AreEqual ("BinaryOperatorOverrides", val.TypeName);
+
+ val = Eval ("ops1 << 1");
+ Assert.AreEqual ("{[BinaryOperatorOverrides 2]}", val.Value);
+ Assert.AreEqual ("BinaryOperatorOverrides", val.TypeName);
+
+ val = Eval ("ops2 >> 1");
+ Assert.AreEqual ("{[BinaryOperatorOverrides 1]}", val.Value);
+ Assert.AreEqual ("BinaryOperatorOverrides", val.TypeName);
+ }
+
void AssertAssignment (string assignment, string variable, string value, string type)
{
ObjectValue val;
@@ -454,6 +1058,7 @@ namespace MonoDevelop.Debugger.Tests
Assert.IsTrue (val.IsNotSupported);
val.Refresh (options);
+ val = val.Sync ();
}
Assert.AreEqual (value, val.Value);
@@ -465,6 +1070,7 @@ namespace MonoDevelop.Debugger.Tests
options.AllowTargetInvoke = true;
val.Refresh (options);
+ val = val.Sync ();
}
Assert.AreEqual (value, val.Value);
@@ -472,6 +1078,23 @@ namespace MonoDevelop.Debugger.Tests
}
[Test]
+ public void MethodParameters ()
+ {
+ ObjectValue val;
+ val = Eval ("stringParam");
+ Assert.AreEqual ("\"testString\"", val.Value);
+ Assert.AreEqual ("string", val.TypeName);
+
+ val = Eval ("intParam");
+ Assert.AreEqual ("55", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("intParam2");
+ Assert.AreEqual ("66", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+ }
+
+ [Test]
public virtual void Assignment ()
{
AssertAssignment ("n = 6", "n", "6", "int");
@@ -486,14 +1109,14 @@ namespace MonoDevelop.Debugger.Tests
AssertAssignment ("alist[0] = 6", "alist[0]", "6", "int");
AssertAssignment ("alist[0] = 1", "alist[0]", "1", "int");
}
-
+
[Test]
public virtual void AssignmentStatic ()
{
AssertAssignment ("staticString = \"test\"", "staticString", "\"test\"", "string");
AssertAssignment ("staticString = \"some static\"", "staticString", "\"some static\"", "string");
}
-
+
[Test]
public void FormatBool ()
{
@@ -505,7 +1128,7 @@ namespace MonoDevelop.Debugger.Tests
val = Eval ("false");
Assert.AreEqual ("false", val.Value);
}
-
+
[Test]
public void FormatNumber ()
{
@@ -528,11 +1151,15 @@ namespace MonoDevelop.Debugger.Tests
val = Eval ("(ulong)123");
Assert.AreEqual ("123", val.Value);
+
+ var soft = Session as SoftDebuggerSession;
+ if (soft != null && soft.ProtocolVersion < new Version (2, 31))
+ return;
val = Eval ("dec");
Assert.AreEqual ("123.456", val.Value);
}
-
+
[Test]
public void FormatString ()
{
@@ -541,12 +1168,20 @@ namespace MonoDevelop.Debugger.Tests
Assert.AreEqual ("\"hi\"", val.Value);
val = Eval ("EscapedStrings");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
Assert.AreEqual ("\" \\\" \\\\ \\a \\b \\f \\v \\n \\r \\t\"", val.Value);
val = Eval ("\" \\\" \\\\ \\a \\b \\f \\v \\n \\r \\t\"");
Assert.AreEqual ("\" \\\" \\\\ \\a \\b \\f \\v \\n \\r \\t\"", val.Value);
}
-
+
[Test]
public void FormatChar ()
{
@@ -599,17 +1234,29 @@ namespace MonoDevelop.Debugger.Tests
Assert.AreEqual ("'\\t'", val.Value);
Assert.AreEqual ("9 '\\t'", val.DisplayValue);
}
-
+
[Test]
public void FormatObject ()
{
ObjectValue val;
+
+ var soft = Session as SoftDebuggerSession;
+ if (soft != null && soft.ProtocolVersion < new Version (2, 31))
+ Assert.Ignore ("A newer version of the Mono runtime is required.");
val = Eval ("c");
Assert.AreEqual ("{C}", val.Value);
Assert.AreEqual ("C", val.TypeName);
val = Eval ("withDisplayString");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.AreEqual ("{WithDisplayString}", val.Value);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
Assert.AreEqual ("Some one Value 2 End", val.Value);
Assert.AreEqual ("WithDisplayString", val.TypeName);
@@ -621,7 +1268,7 @@ namespace MonoDevelop.Debugger.Tests
Assert.AreEqual ("{SomeString}", val.Value);
Assert.AreEqual ("WithToString", val.TypeName);*/
}
-
+
[Test]
public void FormatArray ()
{
@@ -639,37 +1286,52 @@ namespace MonoDevelop.Debugger.Tests
Assert.AreEqual ("{int[3,4,5]}", val.Value);
Assert.AreEqual ("int[,,]", val.TypeName);
}
-
+
[Test]
public void FormatGeneric ()
{
ObjectValue val;
-
- Session.Options.EvaluationOptions.AllowTargetInvoke = false;
- val = Eval ("dict");
- Session.Options.EvaluationOptions.AllowTargetInvoke = true;
+
+ try {
+ Session.Options.EvaluationOptions.AllowTargetInvoke = false;
+ val = Eval ("dict");
+ } finally {
+ Session.Options.EvaluationOptions.AllowTargetInvoke = AllowTargetInvokes;
+ }
Assert.AreEqual ("{System.Collections.Generic.Dictionary<int,string[]>}", val.Value);
Assert.AreEqual ("System.Collections.Generic.Dictionary<int,string[]>", val.TypeName);
-
- Session.Options.EvaluationOptions.AllowTargetInvoke = false;
- val = Eval ("dictArray");
- Session.Options.EvaluationOptions.AllowTargetInvoke = true;
+
+ try {
+ Session.Options.EvaluationOptions.AllowTargetInvoke = false;
+ val = Eval ("dictArray");
+ } finally {
+ Session.Options.EvaluationOptions.AllowTargetInvoke = AllowTargetInvokes;
+ }
Assert.AreEqual ("{System.Collections.Generic.Dictionary<int,string[]>[2,3]}", val.Value);
Assert.AreEqual ("System.Collections.Generic.Dictionary<int,string[]>[,]", val.TypeName);
-
+
+
+ var soft = Session as SoftDebuggerSession;
+ if (soft != null && soft.ProtocolVersion < new Version (2, 31))
+ return;
+
val = Eval ("thing.done");
Assert.AreEqual ("{Thing<string>.Done<int>[1]}", val.Value);
Assert.AreEqual ("Thing<string>.Done<int>[]", val.TypeName);
-
+
val = Eval ("done");
Assert.AreEqual ("{Thing<string>.Done<int>}", val.Value);
Assert.AreEqual ("Thing<string>.Done<int>", val.TypeName);
}
-
+
[Test]
public void FormatEnum ()
{
ObjectValue val;
+
+ var soft = Session as SoftDebuggerSession;
+ if (soft != null && soft.ProtocolVersion < new Version (2, 31))
+ Assert.Ignore ("A newer version of the Mono runtime is required.");
val = Eval ("SomeEnum.one");
Assert.AreEqual ("SomeEnum.one", val.Value);
@@ -683,5 +1345,517 @@ namespace MonoDevelop.Debugger.Tests
Assert.AreEqual ("SomeEnum.one|SomeEnum.two", val.Value);
Assert.AreEqual ("one|two", val.DisplayValue);
}
+
+ [Test]
+ public void LambdaInvoke ()
+ {
+ ObjectValue val;
+
+ var soft = Session as SoftDebuggerSession;
+ if (soft != null && soft.ProtocolVersion < new Version (2, 31))
+ Assert.Ignore ("A newer version of the Mono runtime is required.");
+
+ val = Eval ("action");
+ Assert.AreEqual ("{System.Action}", val.Value);
+ Assert.AreEqual ("System.Action", val.TypeName);
+
+ val = Eval ("modifyInLamda");
+ Assert.AreEqual ("\"modified\"", val.Value);
+ Assert.AreEqual ("string", val.TypeName);
+
+ }
+
+ [Test]
+ public void Structures ()
+ {
+ ObjectValue val;
+
+ var soft = Session as SoftDebuggerSession;
+ if (soft != null && soft.ProtocolVersion < new Version (2, 31))
+ Assert.Ignore ("A newer version of the Mono runtime is required.");
+
+ val = Eval ("simpleStruct");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.AreEqual ("{SimpleStruct}", val.Value);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("{str 45 }", val.Value);
+ Assert.AreEqual ("SimpleStruct", val.TypeName);
+
+ val = Eval ("nulledSimpleStruct");
+ Assert.AreEqual ("null", val.Value);
+ Assert.AreEqual ("SimpleStruct?", val.TypeName);
+ }
+
+ [Test]
+ [Ignore ("TODO")]
+ public void SdbFailingTests ()
+ {
+ ObjectValue val;
+
+ //When fixed put into Inheriting test
+ val = Eval ("b.TestMethod ()");
+ Assert.AreEqual ("2", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ //When fixed put into Inheriting test
+ val = Eval ("b.TestMethod (\"23\")");
+ Assert.AreEqual ("25", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ //When fixed put into Inheriting test
+ val = Eval ("b.TestMethod (42)");
+ Assert.AreEqual ("44", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ //When fixed put into Inheriting test
+ val = Eval ("base.TestMethodBase ()");
+ Assert.AreEqual ("2", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("base.TestMethodBase (\"23\")");
+ Assert.AreEqual ("25", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("base.TestMethodBase (42)");
+ Assert.AreEqual ("44", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("base.TestMethodBaseNotOverrided ()");
+ Assert.AreEqual ("1", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ //When fixed put into MemberReference
+ val = Eval ("numbers.GetLength(0)");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("3", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ //When fixed put into TypeReferenceGeneric
+ val = Eval ("Dictionary<string,NestedClass>");
+ Assert.AreEqual ("System.Collections.Generic.Dictionary<string,MonoDevelop.Debugger.Tests.TestApp.TestEvaluation.NestedClass>", val.Value);
+ Assert.AreEqual ("<type>", val.TypeName);
+ Assert.AreEqual (ObjectValueFlags.Type, val.Flags & ObjectValueFlags.OriginMask);
+
+ //When fixed put into TypeReferenceGeneric
+ val = Eval ("NestedGenericClass<int,string>");
+ Assert.AreEqual ("MonoDevelop.Debugger.Tests.TestApp.TestEvaluation.NestedGenericClass<int,string>", val.Value);
+ Assert.AreEqual ("<type>", val.TypeName);
+ Assert.AreEqual (ObjectValueFlags.Type, val.Flags & ObjectValueFlags.OriginMask);
+
+ //When fixed put into MethodInvoke(failing also on CorDebugger)
+ val = Eval ("((IInterfaceWithMethodA)objWithMethodA).MethodA()");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("\"InterfaceImplementation\"", val.Value);
+ Assert.AreEqual ("string", val.TypeName);
+ }
+
+ [Test]
+ public void ObjectCreation ()
+ {
+ ObjectValue val;
+
+ var soft = Session as SoftDebuggerSession;
+ if (soft != null && soft.ProtocolVersion < new Version (2, 31))
+ Assert.Ignore ("A newer version of the Mono runtime is required.");
+
+ val = Eval ("new A().ConstructedBy");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("\"NoArg\"", val.Value);
+
+ val = Eval ("new A(7).ConstructedBy");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("\"IntArg\"", val.Value);
+
+ val = Eval ("new A(\"someString\").ConstructedBy");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("\"StringArg\"", val.Value);
+ }
+
+ [Test]
+ public void StructCreation ()
+ {
+ if (!AllowTargetInvokes)
+ return;
+
+ var soft = Session as SoftDebuggerSession;
+
+ if (soft == null)
+ Assert.Ignore ("TODO: Win32 support generic invokes");
+
+ if (soft != null && soft.ProtocolVersion < new Version (2, 31))
+ Assert.Inconclusive ("A newer version of the Mono runtime is required.");
+
+ ObjectValue val;
+
+ val = Eval ("new SimpleStruct()");
+ Assert.AreEqual ("SimpleStruct", val.TypeName);
+ }
+
+ [Test]
+ public void Inheriting ()
+ {
+ ObjectValue val;
+
+ var soft = Session as SoftDebuggerSession;
+ if (soft != null && soft.ProtocolVersion < new Version (2, 31))
+ Assert.Ignore ("A newer version of the Mono runtime is required.");
+
+ val = Eval ("a.Prop");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("1", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("a.PropNoVirt1");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("1", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("a.PropNoVirt2");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("1", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("a.IntField");
+ Assert.AreEqual ("1", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("a.TestMethod ()");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("1", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("a.TestMethod (\"23\")");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("24", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("a.TestMethod (42)");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("43", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("b.Prop");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("2", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("b.PropNoVirt1");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("2", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("b.PropNoVirt2");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("2", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("b.IntField");
+ Assert.AreEqual ("2", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("this.TestMethodBase ()");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("1", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("this.TestMethodBase (\"23\")");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("24", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("this.TestMethodBase (42)");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("43", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("this.TestMethodBaseNotOverrided ()");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("1", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("TestMethodBase ()");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("1", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("TestMethodBase (\"23\")");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("24", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("TestMethodBase (42)");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("43", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+
+ val = Eval ("TestMethodBaseNotOverrided ()");
+ if (!AllowTargetInvokes) {
+ var options = Session.Options.EvaluationOptions.Clone ();
+ options.AllowTargetInvoke = true;
+
+ Assert.IsTrue (val.IsNotSupported);
+ val.Refresh (options);
+ val = val.Sync ();
+ }
+ Assert.AreEqual ("1", val.Value);
+ Assert.AreEqual ("int", val.TypeName);
+ }
+
+ [Test]
+ public void Lists ()
+ {
+ ObjectValue[] children;
+ ObjectValue val;
+
+ var soft = Session as SoftDebuggerSession;
+ if (soft != null && soft.ProtocolVersion < new Version (2, 31))
+ Assert.Ignore ("A newer version of the Mono runtime is required.");
+
+ val = Eval ("dict");
+ children = val.GetAllChildren ();
+
+ if (AllowTargetInvokes) {
+ // AllowTargetInvokes also allows debugger proxies
+ Assert.AreEqual (2, children.Length);
+ Assert.AreEqual ("[0]", children [0].Name);
+ Assert.AreEqual ("{[5, System.String[]]}", children [0].Value);
+ Assert.AreEqual ("Raw View", children [1].Name);
+
+ children = children [0].GetAllChildren ();
+ Assert.AreEqual ("Key", children [0].Name);
+ Assert.AreEqual ("5", children [0].Value);
+ Assert.AreEqual ("int", children [0].TypeName);
+ Assert.AreEqual ("Value", children [1].Name);
+ Assert.AreEqual ("{string[2]}", children [1].Value);
+
+ children = children [1].GetAllChildren ();
+ Assert.AreEqual ("\"a\"", children [0].Value);
+ Assert.AreEqual ("string", children [0].TypeName);
+ Assert.AreEqual ("\"b\"", children [1].Value);
+ } else {
+ // when AllowTargetInvokes is disabled, it also disables debugger proxies
+ Assert.AreEqual (6, children.Length);
+ Assert.AreEqual ("Comparer", children [0].Name);
+ Assert.AreEqual ("Count", children [1].Name);
+ Assert.AreEqual ("Keys", children [2].Name);
+ Assert.AreEqual ("Values", children [3].Name);
+ Assert.AreEqual ("Static members", children [4].Name);
+ Assert.AreEqual ("Non-public members", children [5].Name);
+ }
+
+ val = Eval ("stringList");
+ children = val.GetAllChildren ();
+
+ if (AllowTargetInvokes) {
+ // AllowTargetInvokes also allows debugger proxies
+ Assert.AreEqual (4, children.Length);
+ Assert.AreEqual ("[0]", children [0].Name);
+ Assert.AreEqual ("[1]", children [1].Name);
+ Assert.AreEqual ("[2]", children [2].Name);
+ Assert.AreEqual ("Raw View", children [3].Name);
+ Assert.AreEqual ("\"aaa\"", children [0].Value);
+ Assert.AreEqual ("\"bbb\"", children [1].Value);
+ Assert.AreEqual ("\"ccc\"", children [2].Value);
+ } else {
+ // when AllowTargetInvokes is disabled, it also disables debugger proxies
+ Assert.AreEqual (4, children.Length);
+ Assert.AreEqual ("Capacity", children [0].Name);
+ Assert.AreEqual ("Count", children [1].Name);
+ Assert.AreEqual ("Static members", children [2].Name);
+ Assert.AreEqual ("Non-public members", children [3].Name);
+ }
+
+ val = Eval ("alist");
+ children = val.GetAllChildren ();
+
+ if (AllowTargetInvokes) {
+ // AllowTargetInvokes also allows debugger proxies
+ Assert.AreEqual (4, children.Length);
+ Assert.AreEqual ("[0]", children [0].Name);
+ Assert.AreEqual ("[1]", children [1].Name);
+ Assert.AreEqual ("[2]", children [2].Name);
+ Assert.AreEqual ("Raw View", children [3].Name);
+ Assert.AreEqual ("1", children [0].Value);
+ Assert.AreEqual ("\"two\"", children [1].Value);
+ Assert.AreEqual ("3", children [2].Value);
+ } else {
+ // when AllowTargetInvokes is disabled, it also disables debugger proxies
+ Assert.AreEqual (8, children.Length);
+ Assert.AreEqual ("Capacity", children [0].Name);
+ Assert.AreEqual ("Count", children [1].Name);
+ Assert.AreEqual ("IsFixedSize", children [2].Name);
+ Assert.AreEqual ("IsReadOnly", children [3].Name);
+ Assert.AreEqual ("IsSynchronized", children [4].Name);
+ Assert.AreEqual ("SyncRoot", children [5].Name);
+ Assert.AreEqual ("Static members", children [6].Name);
+ Assert.AreEqual ("Non-public members", children [7].Name);
+ }
+ }
+
+ [Test]
+ [Ignore ("TODO: Evaluating dynamic objects")]
+ public void DynamicObjects ()
+ {
+ ObjectValue val;
+ val = Eval ("dynObj.someInt");
+ Assert.AreEqual ("dynamic {int}", val.TypeName);
+ Assert.AreEqual ("53", val.Value);
+
+ val = Eval ("dynObj.someString");
+ Assert.AreEqual ("dynamic {string}", val.TypeName);
+ Assert.AreEqual ("\"Hello dynamic objects!\"", val.Value);
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/StackFrameTests.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/StackFrameTests.cs
index 8e6a1b48b4..79fa7ca824 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/StackFrameTests.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Tests/StackFrameTests.cs
@@ -24,7 +24,11 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
+using System;
+
+using Mono.Debugging.Soft;
using Mono.Debugging.Client;
+
using NUnit.Framework;
namespace MonoDevelop.Debugger.Tests
@@ -48,27 +52,31 @@ namespace MonoDevelop.Debugger.Tests
[Test]
public void VirtualProperty ()
{
+ var soft = Session as SoftDebuggerSession;
+ if (soft != null && soft.ProtocolVersion < new Version (2, 31))
+ Assert.Ignore ("A newer version of the Mono runtime is required.");
+
var ops = EvaluationOptions.DefaultOptions.Clone ();
ops.FlattenHierarchy = false;
ObjectValue val = Frame.GetExpressionValue ("c", ops);
Assert.IsNotNull (val);
- val.WaitHandle.WaitOne ();
+ val = val.Sync ();
Assert.IsFalse (val.IsError);
Assert.IsFalse (val.IsUnknown);
// The C class does not have a Prop property
- ObjectValue prop = val.GetChild ("Prop", ops);
+ ObjectValue prop = val.GetChildSync ("Prop", ops);
Assert.IsNull (prop);
- prop = val.GetChild ("PropNoVirt1", ops);
+ prop = val.GetChildSync ("PropNoVirt1", ops);
Assert.IsNull (prop);
- prop = val.GetChild ("PropNoVirt2", ops);
+ prop = val.GetChildSync ("PropNoVirt2", ops);
Assert.IsNull (prop);
- val = val.GetChild ("base", ops);
+ val = val.GetChildSync ("base", ops);
Assert.IsNotNull (val);
val.WaitHandle.WaitOne ();
Assert.IsFalse (val.IsError);
@@ -76,19 +84,19 @@ namespace MonoDevelop.Debugger.Tests
// The B class has a Prop property, value is 2
- prop = val.GetChild ("Prop", ops);
+ prop = val.GetChildSync ("Prop", ops);
Assert.IsNotNull (prop);
Assert.AreEqual ("2", prop.Value);
- prop = val.GetChild ("PropNoVirt1", ops);
+ prop = val.GetChildSync ("PropNoVirt1", ops);
Assert.IsNotNull (prop);
Assert.AreEqual ("2", prop.Value);
- prop = val.GetChild ("PropNoVirt2", ops);
+ prop = val.GetChildSync ("PropNoVirt2", ops);
Assert.IsNotNull (prop);
Assert.AreEqual ("2", prop.Value);
- val = val.GetChild ("base", ops);
+ val = val.GetChildSync ("base", ops);
Assert.IsNotNull (val);
val.WaitHandle.WaitOne ();
Assert.IsFalse (val.IsError);
@@ -96,15 +104,15 @@ namespace MonoDevelop.Debugger.Tests
// The A class has a Prop property, value is 1, but must return 2 becasue it is overriden
- prop = val.GetChild ("Prop", ops);
+ prop = val.GetChildSync ("Prop", ops);
Assert.IsNotNull (prop);
Assert.AreEqual ("2", prop.Value);
- prop = val.GetChild ("PropNoVirt1", ops);
+ prop = val.GetChildSync ("PropNoVirt1", ops);
Assert.IsNotNull (prop);
Assert.AreEqual ("1", prop.Value);
- prop = val.GetChild ("PropNoVirt2", ops);
+ prop = val.GetChildSync ("PropNoVirt2", ops);
Assert.IsNotNull (prop);
Assert.AreEqual ("1", prop.Value);
}
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.addin.xml b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.addin.xml
index e5a23f3daa..8825b30565 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.addin.xml
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.addin.xml
@@ -230,7 +230,7 @@
<StockIcon stockid = "md-view-debug-threads" resource = "pad-threads-light-16.png" size="Menu" />
<StockIcon stockid = "md-view-debug-watch" resource = "pad-watch-light-16.png" size="Menu" />
<StockIcon stockid = "md-view-debug-immediate" resource = "pad-immediate-light-16.png" size="Menu" />
- <StockIcon stockid = "md-bug" resource = "bug-light-16.png" size="Menu" />
+ <StockIcon stockid = "md-prefs-debugger" resource = "prefs-debugger-light-16.png" size="Menu" />
<StockIcon stockid = "md-stack-pointer" resource = "stack-pointer-light-16.png" size="Menu" />
</Extension>
@@ -245,7 +245,7 @@
</Extension>
<Extension path = "/MonoDevelop/Ide/GlobalOptionsDialog/Projects">
- <Section id = "Debugger" _label = "Debugger" icon="md-bug" fill="true" class = "MonoDevelop.Debugger.DebuggerOptionsPanel" />
+ <Section id="Debugger" _label="Debugger" fill="true" class="MonoDevelop.Debugger.DebuggerOptionsPanel" icon="md-prefs-debugger" />
</Extension>
<Extension path = "/MonoDevelop/Ide/TextEditorExtensions">
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.csproj b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.csproj
index 006b83ce9f..9a0081bfd1 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.csproj
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.csproj
@@ -150,6 +150,7 @@
<Compile Include="MonoDevelop.Debugger\InfoFrame.cs" />
<Compile Include="AddinInfo.cs" />
<Compile Include="MonoDevelop.Debugger\IDebuggerExpressionResolver.cs" />
+ <Compile Include="MonoDevelop.Debugger\DebuggerEngineBackend.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="MonoDevelop.Debugger.addin.xml">
@@ -242,11 +243,11 @@
<EmbeddedResource Include="icons\light\continue-16%402x.png">
<LogicalName>continue-light-16@2x.png</LogicalName>
</EmbeddedResource>
- <EmbeddedResource Include="icons\light\bug-16.png">
- <LogicalName>bug-light-16.png</LogicalName>
+ <EmbeddedResource Include="icons\light\prefs-debugger-16.png">
+ <LogicalName>prefs-debugger-light-16.png</LogicalName>
</EmbeddedResource>
- <EmbeddedResource Include="icons\light\bug-16%402x.png">
- <LogicalName>bug-light-16@2x.png</LogicalName>
+ <EmbeddedResource Include="icons\light\prefs-debugger-16%402x.png">
+ <LogicalName>prefs-debugger-light-16@2x.png</LogicalName>
</EmbeddedResource>
<EmbeddedResource Include="icons\light\lightning-16.png">
<LogicalName>lightning-light-16.png</LogicalName>
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebugCommands.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebugCommands.cs
index 6f7619c2ef..3f05815b95 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebugCommands.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebugCommands.cs
@@ -765,8 +765,8 @@ namespace MonoDevelop.Debugger
{
protected override void Update (CommandInfo info)
{
- info.Visible = DebuggingService.IsDebuggingSupported;
- info.Enabled = DebuggingService.IsPaused;
+ info.Enabled = DebuggingService.IsPaused && DebuggingService.DebuggerSession.CanSetNextStatement;
+ info.Visible = DebuggingService.IsPaused;
}
protected override void Run ()
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerConsoleView.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerConsoleView.cs
index 09699a0b41..6038296e67 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerConsoleView.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerConsoleView.cs
@@ -151,7 +151,7 @@ namespace MonoDevelop.Debugger
return index < text.Length;
}
- static readonly string[] SyntaxTokens = new string[] {
+ static readonly string[] SyntaxTokens = {
"=", "+=", "-=", "*=", "/=", "%=", "&=", "|=", "~=",
"+", "-", "*", "/", "%", "&", "|", "~",
"==", "!=", ">", ">=", "<", "<=",
@@ -372,7 +372,7 @@ namespace MonoDevelop.Debugger
CodeCompletionContext ICompletionWidget.CreateCodeCompletionContext (int triggerOffset)
{
- CodeCompletionContext c = new CodeCompletionContext ();
+ var c = new CodeCompletionContext ();
c.TriggerLine = 0;
c.TriggerOffset = triggerOffset;
c.TriggerLineOffset = c.TriggerOffset;
@@ -384,7 +384,7 @@ namespace MonoDevelop.Debugger
var rect = GetIterLocation (Cursor);
- c.TriggerYCoord = y + lineY + height;
+ c.TriggerYCoord = y + lineY + height - (int)Vadjustment.Value;
c.TriggerXCoord = x + rect.X;
c.TriggerTextHeight = height;
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerEngine.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerEngine.cs
index 0fc870c018..605a3c3906 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerEngine.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerEngine.cs
@@ -33,7 +33,7 @@ namespace MonoDevelop.Debugger
{
public class DebuggerEngine
{
- IDebuggerEngine engine;
+ DebuggerEngineBackend engine;
DebuggerEngineExtensionNode node;
bool gotEngine;
@@ -66,7 +66,14 @@ namespace MonoDevelop.Debugger
{
if (!gotEngine) {
gotEngine = true;
- engine = (IDebuggerEngine) node.GetInstance ();
+ var ob = node.GetInstance ();
+ #pragma warning disable 618
+ var legacyEngine = ob as IDebuggerEngine;
+ #pragma warning restore 618
+ if (legacyEngine != null)
+ engine = new LegacyDebuggerEngineBackend (legacyEngine);
+ else
+ engine = (DebuggerEngineBackend) node.GetInstance ();
}
}
@@ -76,6 +83,12 @@ namespace MonoDevelop.Debugger
return engine != null && engine.CanDebugCommand (cmd);
}
+ public bool IsDefaultDebugger (ExecutionCommand cmd)
+ {
+ LoadEngine ();
+ return engine != null && engine.IsDefaultDebugger (cmd);
+ }
+
public DebuggerStartInfo CreateDebuggerStartInfo (ExecutionCommand cmd)
{
LoadEngine ();
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerEngineBackend.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerEngineBackend.cs
new file mode 100644
index 0000000000..be5e10e002
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerEngineBackend.cs
@@ -0,0 +1,93 @@
+//
+// DebuggerEngineBackend.cs
+//
+// Author:
+// Lluis Sanchez Gual <lluis@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin, Inc (http://www.xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using MonoDevelop.Core.Execution;
+using Mono.Debugging.Client;
+
+namespace MonoDevelop.Debugger
+{
+ public abstract class DebuggerEngineBackend
+ {
+ public abstract bool CanDebugCommand (ExecutionCommand cmd);
+
+ /// <summary>
+ /// Determines whether this instance is default debugger for the provided command
+ /// </summary>
+ /// <remarks>The default implementation returns false.</remarks>
+ public virtual bool IsDefaultDebugger (ExecutionCommand cmd)
+ {
+ return false;
+ }
+
+ public abstract DebuggerStartInfo CreateDebuggerStartInfo (ExecutionCommand cmd);
+
+ public virtual ProcessInfo[] GetAttachableProcesses ()
+ {
+ return new ProcessInfo[0];
+ }
+
+ public abstract DebuggerSession CreateSession ();
+ }
+
+ #pragma warning disable 618
+ class LegacyDebuggerEngineBackend: DebuggerEngineBackend
+ {
+ IDebuggerEngine engine;
+
+ public LegacyDebuggerEngineBackend (IDebuggerEngine engine)
+ {
+ this.engine = engine;
+ }
+
+ public override bool CanDebugCommand (ExecutionCommand cmd)
+ {
+ return engine.CanDebugCommand (cmd);
+ }
+
+ public override bool IsDefaultDebugger (ExecutionCommand cmd)
+ {
+ return false;
+ }
+
+ public override DebuggerStartInfo CreateDebuggerStartInfo (ExecutionCommand cmd)
+ {
+ return engine.CreateDebuggerStartInfo (cmd);
+ }
+
+ public override ProcessInfo[] GetAttachableProcesses ()
+ {
+ return engine.GetAttachableProcesses ();
+ }
+
+ public override DebuggerSession CreateSession ()
+ {
+ return engine.CreateSession ();
+ }
+ }
+ #pragma warning restore 618
+}
+
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerOptionsPanelWidget.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerOptionsPanelWidget.cs
index 70a40ee81e..f4f86afdd1 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerOptionsPanelWidget.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerOptionsPanelWidget.cs
@@ -24,8 +24,6 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
-using System;
-using System.Collections.Generic;
using Mono.Debugging.Client;
using MonoDevelop.Ide.Gui.Dialogs;
@@ -53,7 +51,8 @@ namespace MonoDevelop.Debugger
public DebuggerOptionsPanelWidget ()
{
- this.Build ();
+ Build ();
+
options = DebuggingService.GetUserOptions ();
checkProjectCodeOnly.Active = options.ProjectAssembliesOnly;
checkStepOverPropertiesAndOperators.Active = options.StepOverPropertiesAndOperators;
@@ -64,19 +63,11 @@ namespace MonoDevelop.Debugger
checkGroupStatic.Active = options.EvaluationOptions.GroupStaticMembers;
checkAllowToString.Sensitive = checkAllowEval.Active;
spinTimeout.Value = options.EvaluationOptions.EvaluationTimeout;
-
- // Debugger priorities
- prioritylist.Model = new Gtk.ListStore (typeof(string), typeof(string));
- prioritylist.AppendColumn ("", new Gtk.CellRendererText (), "text", 1);
-
- foreach (DebuggerEngine engine in DebuggingService.GetDebuggerEngines ()) {
- prioritylist.Model.AppendValues (engine.Id, engine.Name);
- }
}
public void Store ()
{
- EvaluationOptions ops = options.EvaluationOptions;
+ var ops = options.EvaluationOptions;
ops.AllowTargetInvoke = checkAllowEval.Active;
ops.AllowToStringCalls = checkAllowToString.Active;
@@ -90,16 +81,6 @@ namespace MonoDevelop.Debugger
options.EvaluationOptions = ops;
DebuggingService.SetUserOptions (options);
-
- Gtk.TreeIter it;
- List<string> prios = new List<string> ();
- if (prioritylist.Model.GetIterFirst (out it)) {
- do {
- string id = (string) prioritylist.Model.GetValue (it, 0);
- prios.Add (id);
- } while (prioritylist.Model.IterNext (ref it));
- }
- DebuggingService.EnginePriority = prios.ToArray ();
}
protected virtual void OnCheckAllowEvalToggled (object sender, System.EventArgs e)
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggingService.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggingService.cs
index 9322a03d3a..babf283450 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggingService.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggingService.cs
@@ -154,33 +154,13 @@ namespace MonoDevelop.Debugger
if (pinnedWatches.UpdateLiveWatch ((Breakpoint) be, trace))
return; // No need to log the value. It is shown in the watch.
}
- console.Log.Write (trace + "\n");
+ DebugWriter (0, "", trace + Environment.NewLine);
}
-
+
+ [Obsolete]
public static string[] EnginePriority {
- get {
- string s = PropertyService.Get ("MonoDevelop.Debugger.DebuggingService.EnginePriority", "");
- if (s.Length == 0) {
- // Set the initial priorities
- var prios = new List<string> ();
- int i = 0;
-
- foreach (DebuggerEngineExtensionNode de in AddinManager.GetExtensionNodes (FactoriesPath)) {
- if (de.Id.StartsWith ("Mono.Debugger.Soft", StringComparison.Ordinal)) // Give priority to soft debugger by default
- prios.Insert (i++, de.Id);
- else
- prios.Add (de.Id);
- }
- string[] parray = prios.ToArray ();
- EnginePriority = parray;
- return parray;
- }
- return s.Split (new [] {','}, StringSplitOptions.RemoveEmptyEntries);
- }
+ get { return new string[0]; }
set {
- string s = string.Join (",", value);
- PropertyService.Set ("MonoDevelop.Debugger.DebuggingService.EnginePriority", s);
- engines = null;
}
}
@@ -218,15 +198,18 @@ namespace MonoDevelop.Debugger
{
var dlg = new AddTracePointDialog ();
- if (MessageService.RunCustomDialog (dlg) == (int) Gtk.ResponseType.Ok && dlg.Text.Length > 0) {
- var bp = new Breakpoint (file, line);
- bp.HitAction = HitAction.PrintExpression;
- bp.TraceExpression = dlg.Text;
- bp.ConditionExpression = dlg.Condition;
- lock (breakpoints)
- breakpoints.Add (bp);
+ try {
+ if (MessageService.RunCustomDialog (dlg) == (int) Gtk.ResponseType.Ok && dlg.Text.Length > 0) {
+ var bp = new Breakpoint (file, line);
+ bp.HitAction = HitAction.PrintExpression;
+ bp.TraceExpression = dlg.Text;
+ bp.ConditionExpression = dlg.Condition;
+ lock (breakpoints)
+ breakpoints.Add (bp);
+ }
+ } finally {
+ dlg.Destroy ();
}
- dlg.Destroy ();
}
public static void AddWatch (string expression)
@@ -332,6 +315,7 @@ namespace MonoDevelop.Debugger
session.TargetStarted += OnStarted;
session.OutputWriter = OutputWriter;
session.LogWriter = LogWriter;
+ session.DebugWriter = DebugWriter;
session.BusyStateChanged += OnBusyStateChanged;
session.TypeResolverHandler = ResolveType;
session.BreakpointTraceHandler = BreakpointTraceHandler;
@@ -620,7 +604,25 @@ namespace MonoDevelop.Debugger
if (logger != null)
logger.Log.Write (text);
}
-
+
+ static void DebugWriter (int level, string category, string message)
+ {
+ var logger = console;
+ var debugLogger = logger as IDebugConsole;
+
+ if (logger != null) {
+ if (debugLogger != null) {
+ debugLogger.Debug (level, category, message);
+ } else {
+ if (level == 0 && string.IsNullOrEmpty (category)) {
+ logger.Log.Write (message);
+ } else {
+ logger.Log.Write (string.Format ("[{0}:{1}] {2}", level, category, message));
+ }
+ }
+ }
+ }
+
static void OutputWriter (bool iserr, string text)
{
var logger = console;
@@ -905,30 +907,14 @@ namespace MonoDevelop.Debugger
public static DebuggerEngine[] GetDebuggerEngines ()
{
if (engines == null) {
- var engs = new List<DebuggerEngine> ();
+ var list = new List<DebuggerEngine> ();
+
foreach (DebuggerEngineExtensionNode node in AddinManager.GetExtensionNodes (FactoriesPath))
- engs.Add (new DebuggerEngine (node));
-
- string[] priorities = EnginePriority;
- var count = engs.Count;
-
- engs.Sort (delegate (DebuggerEngine d1, DebuggerEngine d2) {
- int i1 = Array.IndexOf (priorities, d1.Id);
- int i2 = Array.IndexOf (priorities, d2.Id);
-
- //ensure that soft debugger is prioritised over newly installed debuggers
- if (i1 < 0)
- i1 = d1.Id.StartsWith ("Mono.Debugger.Soft", StringComparison.Ordinal) ? 0 : count;
- if (i2 < 0)
- i2 = d2.Id.StartsWith ("Mono.Debugger.Soft", StringComparison.Ordinal) ? 0 : count;
-
- if (i1 == i2)
- return string.Compare (d1.Name, d2.Name, StringComparison.InvariantCulture);
-
- return i1.CompareTo (i2);
- });
- engines = engs.ToArray ();
+ list.Add (new DebuggerEngine (node));
+
+ engines = list.ToArray ();
}
+
return engines;
}
@@ -946,11 +932,20 @@ namespace MonoDevelop.Debugger
static DebuggerEngine GetFactoryForCommand (ExecutionCommand cmd)
{
+ DebuggerEngine supportedEngine = null;
+
+ // Get the default engine for the command if available,
+ // or the first engine that supports the command otherwise
+
foreach (DebuggerEngine factory in GetDebuggerEngines ()) {
- if (factory.CanDebugCommand (cmd))
- return factory;
+ if (factory.CanDebugCommand (cmd)) {
+ if (factory.IsDefaultDebugger (cmd))
+ return factory;
+ if (supportedEngine == null)
+ supportedEngine = factory;
+ }
}
- return null;
+ return supportedEngine;
}
static void OnLineCountChanged (object ob, LineCountEventArgs a)
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ExceptionCaughtDialog.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ExceptionCaughtDialog.cs
index 4cbabd4935..9253c32d26 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ExceptionCaughtDialog.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ExceptionCaughtDialog.cs
@@ -276,7 +276,7 @@ namespace MonoDevelop.Debugger
var selectedRows = ExceptionValueTreeView.Selection.GetSelectedRows ();
ExceptionInfo ex;
- if (TryGetExceptionInfo (selectedRows[0], out ex)) {
+ if (selectedRows.Length > 0 && TryGetExceptionInfo (selectedRows[0], out ex)) {
ShowStackTrace (ex);
selected = ex;
} else if (selected != exception) {
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/IDebuggerEngine.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/IDebuggerEngine.cs
index a6ae18e365..789ef65612 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/IDebuggerEngine.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/IDebuggerEngine.cs
@@ -31,6 +31,7 @@ using MonoDevelop.Core.Execution;
namespace MonoDevelop.Debugger
{
+ [Obsolete ("This interface is going to be removed. Please use MonoDevelop.Debugger.DebuggerEngineBackend")]
public interface IDebuggerEngine
{
bool CanDebugCommand (ExecutionCommand cmd);
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/LocalsPad.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/LocalsPad.cs
index d3b132d4f8..dab33bbb60 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/LocalsPad.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/LocalsPad.cs
@@ -32,10 +32,10 @@ using System.Collections.Generic;
namespace MonoDevelop.Debugger
{
- public class LocalsPad: ObjectValuePad
+ public class LocalsPad : ObjectValuePad
{
+ Dictionary<string, ObjectValue> lastLookup = new Dictionary<string, ObjectValue> ();
StackFrame lastFrame;
- HashSet<string> lastExpressions = new HashSet<string> ();
public LocalsPad ()
{
@@ -46,32 +46,53 @@ namespace MonoDevelop.Debugger
public override void OnUpdateList ()
{
base.OnUpdateList ();
- StackFrame frame = DebuggingService.CurrentFrame;
+
+ var frame = DebuggingService.CurrentFrame;
if (frame == null || !FrameEquals (frame, lastFrame)) {
tree.ClearExpressions ();
- lastExpressions = null;
+ lastLookup = null;
}
+
lastFrame = frame;
if (frame == null)
return;
-
- //FIXME: tree should use the local refs rather than expressions. ATM we exclude items without names
- var expr = new HashSet<string> (frame.GetAllLocals ().Select (i => i.Name)
- .Where (n => !string.IsNullOrEmpty (n) && n != "?"));
-
+
//add expressions not in tree already, remove expressions that are longer valid
- if (lastExpressions != null) {
- foreach (string rem in lastExpressions.Except (expr))
- tree.RemoveExpression (rem);
- foreach (string rem in expr.Except (lastExpressions))
- tree.AddExpression (rem);
+ var frameLocals = frame.GetAllLocals ();
+ var lookup = new Dictionary<string, ObjectValue> (frameLocals.Length);
+
+ foreach (var local in frameLocals) {
+ var variableName = local.Name;
+
+ //not sure if there is a use case for duplicate variable names, or blanks
+ if (string.IsNullOrWhiteSpace (variableName) || variableName == "?" || lookup.ContainsKey (variableName))
+ continue;
+
+ lookup.Add (variableName, local);
+
+ if (lastLookup != null) {
+ ObjectValue priorValue;
+ if (lastLookup.TryGetValue (variableName, out priorValue))
+ tree.ReplaceValue (priorValue, local);
+ else
+ tree.AddValue (local);
+ }
+ }
+
+ if (lastLookup != null) {
+ //get rid of the values that didnt survive from the last refresh
+ foreach (var prior in lastLookup) {
+ if (!lookup.ContainsKey (prior.Key))
+ tree.RemoveValue (prior.Value);
+ }
} else {
- tree.AddExpressions (expr);
+ tree.ClearValues ();
+ tree.AddValues (lookup.Values);
}
-
- lastExpressions = expr;
+
+ lastLookup = lookup;
}
static bool FrameEquals (StackFrame a, StackFrame z)
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValuePad.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValuePad.cs
index c8b0b533aa..877bbe355e 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValuePad.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValuePad.cs
@@ -133,6 +133,8 @@ namespace MonoDevelop.Debugger
protected virtual void OnDebuggerStopped (object s, EventArgs a)
{
tree.ResetChangeTracking ();
+ tree.Frame = null;
+ lastFrame = null;
initialResume = true;
}
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValueTreeView.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValueTreeView.cs
index 71bdf76c50..8a2dfdfd13 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValueTreeView.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValueTreeView.cs
@@ -243,6 +243,10 @@ namespace MonoDevelop.Debugger
valueCol.RemoveNotification ("width", OnColumnWidthChanged);
expCol.RemoveNotification ("width", OnColumnWidthChanged);
+ values.Clear ();
+ valueNames.Clear ();
+ Frame = null;
+
disposed = true;
cancellationTokenSource.Cancel ();
@@ -793,13 +797,13 @@ namespace MonoDevelop.Debugger
{
if ((flags & ObjectValueFlags.Field) != 0 && (flags & ObjectValueFlags.ReadOnly) != 0)
return "md-literal";
-
+
+ string global = (flags & ObjectValueFlags.Global) != 0 ? "static-" : string.Empty;
string source;
- string stic = (flags & ObjectValueFlags.Global) != 0 ? "static-" : string.Empty;
-
+
switch (flags & ObjectValueFlags.OriginMask) {
case ObjectValueFlags.Property: source = "property"; break;
- case ObjectValueFlags.Type: source = "class"; stic = string.Empty; break;
+ case ObjectValueFlags.Type: source = "class"; global = string.Empty; break;
case ObjectValueFlags.Method: source = "method"; break;
case ObjectValueFlags.Literal: return "md-literal";
case ObjectValueFlags.Namespace: return "md-name-space";
@@ -818,7 +822,7 @@ namespace MonoDevelop.Debugger
default: access = string.Empty; break;
}
- return "md-" + access + stic + source;
+ return "md-" + access + global + source;
}
protected override bool OnTestExpandRow (TreeIter iter, TreePath path)
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/PinnedWatchStore.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/PinnedWatchStore.cs
index b040e0ffa9..0567e4e352 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/PinnedWatchStore.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/PinnedWatchStore.cs
@@ -30,6 +30,7 @@ using System.Collections.Generic;
using MonoDevelop.Core.Serialization;
using MonoDevelop.Core;
using Mono.Debugging.Client;
+using MonoDevelop.Ide;
namespace MonoDevelop.Debugger
{
@@ -270,8 +271,10 @@ namespace MonoDevelop.Debugger
batchChanged.Add (watch);
return;
}
- if (WatchChanged != null)
- WatchChanged (this, new PinnedWatchEventArgs (watch));
+ DispatchService.GuiDispatch (() => {
+ if (WatchChanged != null)
+ WatchChanged (this, new PinnedWatchEventArgs (watch));
+ });
}
void OnChanged ()
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/StackTracePad.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/StackTracePad.cs
index 200799ee62..43c9a63b8e 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/StackTracePad.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/StackTracePad.cs
@@ -138,9 +138,17 @@ namespace MonoDevelop.Debugger
ShowAll ();
UpdateDisplay ();
- DebuggingService.CallStackChanged += DispatchService.GuiDispatch (new EventHandler (OnClassStackChanged));
- DebuggingService.CurrentFrameChanged += DispatchService.GuiDispatch (new EventHandler (OnFrameChanged));
+ DebuggingService.CallStackChanged += OnClassStackChanged;
+ DebuggingService.CurrentFrameChanged += OnFrameChanged;
+ DebuggingService.StoppedEvent += OnDebuggingServiceStopped;
+
tree.RowActivated += OnRowActivated;
+ }
+
+ void OnDebuggingServiceStopped(object sender, EventArgs e)
+ {
+ if (store != null)
+ store.Clear();
}
static bool Search (TreeModel model, int column, string key, TreeIter iter)
@@ -391,6 +399,14 @@ namespace MonoDevelop.Debugger
clipboard.Text = txt.ToString ();
clipboard = Clipboard.Get (Gdk.Atom.Intern ("PRIMARY", false));
clipboard.Text = txt.ToString ();
- }
+ }
+
+ protected override void OnDestroyed ()
+ {
+ DebuggingService.CallStackChanged -= OnClassStackChanged;
+ DebuggingService.CurrentFrameChanged -= OnFrameChanged;
+ DebuggingService.StoppedEvent -= OnDebuggingServiceStopped;
+ base.OnDestroyed ();
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ThreadsPad.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ThreadsPad.cs
index a04b54b01d..3e49092a39 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ThreadsPad.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ThreadsPad.cs
@@ -46,6 +46,8 @@ namespace MonoDevelop.Debugger
TreeViewState treeViewState;
PadTreeView tree;
TreeStore store;
+ bool needsUpdate;
+ IPadWindow window;
enum Columns
{
@@ -127,10 +129,23 @@ namespace MonoDevelop.Debugger
void IPadContent.Initialize (IPadWindow window)
{
+ this.window = window;
+ window.PadContentShown += delegate {
+ if (needsUpdate)
+ Update ();
+ };
}
public void UpdateDisplay ()
{
+ if (window != null && window.ContentVisible)
+ Update ();
+ else
+ needsUpdate = true;
+ }
+
+ void Update ()
+ {
if (tree.IsRealized)
tree.ScrollToPoint (0, 0);
@@ -140,7 +155,7 @@ namespace MonoDevelop.Debugger
if (!DebuggingService.IsPaused)
return;
-
+
try {
ProcessInfo[] currentProcesses = DebuggingService.DebuggerSession.GetProcesses ();
diff --git a/main/src/addins/MonoDevelop.Debugger/gtk-gui/MonoDevelop.Debugger.DebuggerOptionsPanelWidget.cs b/main/src/addins/MonoDevelop.Debugger/gtk-gui/MonoDevelop.Debugger.DebuggerOptionsPanelWidget.cs
index c74d68d24e..ddefc1bfbf 100644
--- a/main/src/addins/MonoDevelop.Debugger/gtk-gui/MonoDevelop.Debugger.DebuggerOptionsPanelWidget.cs
+++ b/main/src/addins/MonoDevelop.Debugger/gtk-gui/MonoDevelop.Debugger.DebuggerOptionsPanelWidget.cs
@@ -4,25 +4,31 @@ namespace MonoDevelop.Debugger
{
public partial class DebuggerOptionsPanelWidget
{
- private global::Gtk.Notebook notebook1;
private global::Gtk.VBox vbox3;
+
private global::Gtk.CheckButton checkProjectCodeOnly;
+
private global::Gtk.CheckButton checkStepOverPropertiesAndOperators;
+
private global::Gtk.CheckButton checkAllowEval;
+
private global::Gtk.Alignment alignmentAllowToString;
+
private global::Gtk.CheckButton checkAllowToString;
+
private global::Gtk.CheckButton checkShowBaseGroup;
+
private global::Gtk.CheckButton checkGroupPrivate;
+
private global::Gtk.CheckButton checkGroupStatic;
+
private global::Gtk.Table tableEval;
+
private global::Gtk.Label label3;
+
private global::Gtk.Label labelEvalTimeout;
+
private global::Gtk.SpinButton spinTimeout;
- private global::Gtk.Label label4;
- private global::Gtk.VBox vbox2;
- private global::Gtk.Label labelPriorityList;
- private global::MonoDevelop.Ide.Gui.Components.PriorityList prioritylist;
- private global::Gtk.Label labelPreferredDebuggers;
protected virtual void Build ()
{
@@ -31,11 +37,6 @@ namespace MonoDevelop.Debugger
global::Stetic.BinContainer.Attach (this);
this.Name = "MonoDevelop.Debugger.DebuggerOptionsPanelWidget";
// Container child MonoDevelop.Debugger.DebuggerOptionsPanelWidget.Gtk.Container+ContainerChild
- this.notebook1 = new global::Gtk.Notebook ();
- this.notebook1.CanFocus = true;
- this.notebook1.Name = "notebook1";
- this.notebook1.CurrentPage = 0;
- // Container child notebook1.Gtk.Notebook+NotebookChild
this.vbox3 = new global::Gtk.VBox ();
this.vbox3.Name = "vbox3";
this.vbox3.Spacing = 6;
@@ -175,46 +176,7 @@ namespace MonoDevelop.Debugger
w12.Position = 7;
w12.Expand = false;
w12.Fill = false;
- this.notebook1.Add (this.vbox3);
- // Notebook tab
- this.label4 = new global::Gtk.Label ();
- this.label4.Name = "label4";
- this.label4.LabelProp = global::Mono.Unix.Catalog.GetString ("General");
- this.notebook1.SetTabLabel (this.vbox3, this.label4);
- this.label4.ShowAll ();
- // Container child notebook1.Gtk.Notebook+NotebookChild
- this.vbox2 = new global::Gtk.VBox ();
- this.vbox2.Name = "vbox2";
- this.vbox2.Spacing = 6;
- this.vbox2.BorderWidth = ((uint)(6));
- // Container child vbox2.Gtk.Box+BoxChild
- this.labelPriorityList = new global::Gtk.Label ();
- this.labelPriorityList.WidthRequest = 417;
- this.labelPriorityList.Name = "labelPriorityList";
- this.labelPriorityList.Xalign = 0F;
- this.labelPriorityList.LabelProp = global::Mono.Unix.Catalog.GetString ("This priority list will be used when selecting the engine to be used for debugging an application.");
- this.labelPriorityList.Wrap = true;
- this.vbox2.Add (this.labelPriorityList);
- global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.labelPriorityList]));
- w14.Position = 0;
- w14.Expand = false;
- w14.Fill = false;
- // Container child vbox2.Gtk.Box+BoxChild
- this.prioritylist = new global::MonoDevelop.Ide.Gui.Components.PriorityList ();
- this.prioritylist.Name = "prioritylist";
- this.vbox2.Add (this.prioritylist);
- global::Gtk.Box.BoxChild w15 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.prioritylist]));
- w15.Position = 1;
- this.notebook1.Add (this.vbox2);
- global::Gtk.Notebook.NotebookChild w16 = ((global::Gtk.Notebook.NotebookChild)(this.notebook1 [this.vbox2]));
- w16.Position = 1;
- // Notebook tab
- this.labelPreferredDebuggers = new global::Gtk.Label ();
- this.labelPreferredDebuggers.Name = "labelPreferredDebuggers";
- this.labelPreferredDebuggers.LabelProp = global::Mono.Unix.Catalog.GetString ("Preferred Debuggers");
- this.notebook1.SetTabLabel (this.vbox2, this.labelPreferredDebuggers);
- this.labelPreferredDebuggers.ShowAll ();
- this.Add (this.notebook1);
+ this.Add (this.vbox3);
if ((this.Child != null)) {
this.Child.ShowAll ();
}
diff --git a/main/src/addins/MonoDevelop.Debugger/gtk-gui/gui.stetic b/main/src/addins/MonoDevelop.Debugger/gtk-gui/gui.stetic
index 70fbd02db2..18ec72f205 100644
--- a/main/src/addins/MonoDevelop.Debugger/gtk-gui/gui.stetic
+++ b/main/src/addins/MonoDevelop.Debugger/gtk-gui/gui.stetic
@@ -1268,266 +1268,207 @@ Break when the hit count is a multiple of</property>
<property name="MemberName" />
<property name="Visible">False</property>
<child>
- <widget class="Gtk.Notebook" id="notebook1">
+ <widget class="Gtk.VBox" id="vbox3">
<property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="CurrentPage">0</property>
+ <property name="Spacing">6</property>
+ <property name="BorderWidth">9</property>
<child>
- <widget class="Gtk.VBox" id="vbox3">
+ <widget class="Gtk.CheckButton" id="checkProjectCodeOnly">
<property name="MemberName" />
- <property name="Spacing">6</property>
- <property name="BorderWidth">9</property>
- <child>
- <widget class="Gtk.CheckButton" id="checkProjectCodeOnly">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Label" translatable="yes">Debug project code only; do not step into framework code.</property>
- <property name="Active">True</property>
- <property name="DrawIndicator">True</property>
- <property name="HasLabel">True</property>
- <property name="UseUnderline">True</property>
- </widget>
- <packing>
- <property name="Position">0</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.CheckButton" id="checkStepOverPropertiesAndOperators">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Label" translatable="yes">Step over properties and operators</property>
- <property name="Active">True</property>
- <property name="DrawIndicator">True</property>
- <property name="HasLabel">True</property>
- <property name="UseUnderline">True</property>
- </widget>
- <packing>
- <property name="Position">1</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes">Debug project code only; do not step into framework code.</property>
+ <property name="Active">True</property>
+ <property name="DrawIndicator">True</property>
+ <property name="HasLabel">True</property>
+ <property name="UseUnderline">True</property>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.CheckButton" id="checkStepOverPropertiesAndOperators">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes">Step over properties and operators</property>
+ <property name="Active">True</property>
+ <property name="DrawIndicator">True</property>
+ <property name="HasLabel">True</property>
+ <property name="UseUnderline">True</property>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.CheckButton" id="checkAllowEval">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes">Allow implicit property evaluation and method invocation</property>
+ <property name="Active">True</property>
+ <property name="DrawIndicator">True</property>
+ <property name="HasLabel">True</property>
+ <property name="UseUnderline">True</property>
+ <signal name="Toggled" handler="OnCheckAllowEvalToggled" />
+ </widget>
+ <packing>
+ <property name="Position">2</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Alignment" id="alignmentAllowToString">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LeftPadding">18</property>
<child>
- <widget class="Gtk.CheckButton" id="checkAllowEval">
+ <widget class="Gtk.CheckButton" id="checkAllowToString">
<property name="MemberName" />
<property name="CanFocus">True</property>
- <property name="Label" translatable="yes">Allow implicit property evaluation and method invocation</property>
+ <property name="Label" translatable="yes">Call string-conversion function on objects in variables windows</property>
<property name="Active">True</property>
<property name="DrawIndicator">True</property>
<property name="HasLabel">True</property>
<property name="UseUnderline">True</property>
- <signal name="Toggled" handler="OnCheckAllowEvalToggled" />
- </widget>
- <packing>
- <property name="Position">2</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.Alignment" id="alignmentAllowToString">
- <property name="MemberName" />
- <property name="Xalign">0</property>
- <property name="LeftPadding">18</property>
- <child>
- <widget class="Gtk.CheckButton" id="checkAllowToString">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Label" translatable="yes">Call string-conversion function on objects in variables windows</property>
- <property name="Active">True</property>
- <property name="DrawIndicator">True</property>
- <property name="HasLabel">True</property>
- <property name="UseUnderline">True</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="Position">3</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.CheckButton" id="checkShowBaseGroup">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Label" translatable="yes">Show inherited class members in a base class group</property>
- <property name="DrawIndicator">True</property>
- <property name="HasLabel">True</property>
- <property name="UseUnderline">True</property>
- </widget>
- <packing>
- <property name="Position">4</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.CheckButton" id="checkGroupPrivate">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Label" translatable="yes">Group non-public members</property>
- <property name="DrawIndicator">True</property>
- <property name="HasLabel">True</property>
- <property name="UseUnderline">True</property>
- </widget>
- <packing>
- <property name="Position">5</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.CheckButton" id="checkGroupStatic">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Label" translatable="yes">Group static members</property>
- <property name="DrawIndicator">True</property>
- <property name="HasLabel">True</property>
- <property name="UseUnderline">True</property>
</widget>
- <packing>
- <property name="Position">6</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.Table" id="tableEval">
- <property name="MemberName" />
- <property name="NColumns">3</property>
- <property name="RowSpacing">6</property>
- <property name="ColumnSpacing">6</property>
- <child>
- <widget class="Gtk.Label" id="label3">
- <property name="MemberName" />
- <property name="LabelProp" translatable="yes">ms</property>
- </widget>
- <packing>
- <property name="LeftAttach">2</property>
- <property name="RightAttach">3</property>
- <property name="AutoSize">True</property>
- <property name="XOptions">Fill</property>
- <property name="YOptions">Fill</property>
- <property name="XExpand">False</property>
- <property name="XFill">True</property>
- <property name="XShrink">False</property>
- <property name="YExpand">False</property>
- <property name="YFill">True</property>
- <property name="YShrink">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.Label" id="labelEvalTimeout">
- <property name="MemberName" />
- <property name="Xalign">0</property>
- <property name="LabelProp" translatable="yes">Evaluation Timeout:</property>
- </widget>
- <packing>
- <property name="AutoSize">True</property>
- <property name="XOptions">Fill</property>
- <property name="YOptions">Fill</property>
- <property name="XExpand">False</property>
- <property name="XFill">True</property>
- <property name="XShrink">False</property>
- <property name="YExpand">False</property>
- <property name="YFill">True</property>
- <property name="YShrink">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.SpinButton" id="spinTimeout">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Upper">1000000</property>
- <property name="PageIncrement">10</property>
- <property name="StepIncrement">100</property>
- <property name="ClimbRate">100</property>
- <property name="Numeric">True</property>
- </widget>
- <packing>
- <property name="LeftAttach">1</property>
- <property name="RightAttach">2</property>
- <property name="AutoSize">True</property>
- <property name="XOptions">Fill</property>
- <property name="YOptions">Fill</property>
- <property name="XExpand">False</property>
- <property name="XFill">True</property>
- <property name="XShrink">False</property>
- <property name="YExpand">False</property>
- <property name="YFill">True</property>
- <property name="YShrink">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="Position">7</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
</child>
</widget>
+ <packing>
+ <property name="Position">3</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
</child>
<child>
- <widget class="Gtk.Label" id="label4">
+ <widget class="Gtk.CheckButton" id="checkShowBaseGroup">
<property name="MemberName" />
- <property name="LabelProp" translatable="yes">General</property>
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes">Show inherited class members in a base class group</property>
+ <property name="DrawIndicator">True</property>
+ <property name="HasLabel">True</property>
+ <property name="UseUnderline">True</property>
</widget>
<packing>
- <property name="type">tab</property>
+ <property name="Position">4</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
</packing>
</child>
<child>
- <widget class="Gtk.VBox" id="vbox2">
+ <widget class="Gtk.CheckButton" id="checkGroupPrivate">
<property name="MemberName" />
- <property name="Spacing">6</property>
- <property name="BorderWidth">6</property>
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes">Group non-public members</property>
+ <property name="DrawIndicator">True</property>
+ <property name="HasLabel">True</property>
+ <property name="UseUnderline">True</property>
+ </widget>
+ <packing>
+ <property name="Position">5</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.CheckButton" id="checkGroupStatic">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes">Group static members</property>
+ <property name="DrawIndicator">True</property>
+ <property name="HasLabel">True</property>
+ <property name="UseUnderline">True</property>
+ </widget>
+ <packing>
+ <property name="Position">6</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Table" id="tableEval">
+ <property name="MemberName" />
+ <property name="NColumns">3</property>
+ <property name="RowSpacing">6</property>
+ <property name="ColumnSpacing">6</property>
+ <child>
+ <widget class="Gtk.Label" id="label3">
+ <property name="MemberName" />
+ <property name="LabelProp" translatable="yes">ms</property>
+ </widget>
+ <packing>
+ <property name="LeftAttach">2</property>
+ <property name="RightAttach">3</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
<child>
- <widget class="Gtk.Label" id="labelPriorityList">
+ <widget class="Gtk.Label" id="labelEvalTimeout">
<property name="MemberName" />
- <property name="WidthRequest">417</property>
<property name="Xalign">0</property>
- <property name="LabelProp" translatable="yes">This priority list will be used when selecting the engine to be used for debugging an application.</property>
- <property name="Wrap">True</property>
+ <property name="LabelProp" translatable="yes">Evaluation Timeout:</property>
</widget>
<packing>
- <property name="Position">0</property>
<property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
</packing>
</child>
<child>
- <widget class="MonoDevelop.Ide.Gui.Components.PriorityList" id="prioritylist">
+ <widget class="Gtk.SpinButton" id="spinTimeout">
<property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Upper">1000000</property>
+ <property name="PageIncrement">10</property>
+ <property name="StepIncrement">100</property>
+ <property name="ClimbRate">100</property>
+ <property name="Numeric">True</property>
</widget>
<packing>
- <property name="Position">1</property>
- <property name="AutoSize">False</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
</packing>
</child>
</widget>
<packing>
- <property name="Position">1</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.Label" id="labelPreferredDebuggers">
- <property name="MemberName" />
- <property name="LabelProp" translatable="yes">Preferred Debuggers</property>
- </widget>
- <packing>
- <property name="type">tab</property>
+ <property name="Position">7</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
</packing>
</child>
</widget>
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/breakpoint-16.png b/main/src/addins/MonoDevelop.Debugger/icons/light/breakpoint-16.png
index cc19a5ade7..c0c017eb32 100644
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/breakpoint-16.png
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/breakpoint-16.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/breakpoint-16@2x.png b/main/src/addins/MonoDevelop.Debugger/icons/light/breakpoint-16@2x.png
index 53c8edb69a..9f68a52e2f 100644
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/breakpoint-16@2x.png
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/breakpoint-16@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/bug-16.png b/main/src/addins/MonoDevelop.Debugger/icons/light/bug-16.png
deleted file mode 100644
index 4fe8523e47..0000000000
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/bug-16.png
+++ /dev/null
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/bug-16@2x.png b/main/src/addins/MonoDevelop.Debugger/icons/light/bug-16@2x.png
deleted file mode 100644
index 756a593a27..0000000000
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/bug-16@2x.png
+++ /dev/null
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-16.png b/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-16.png
index 3478d1012a..f26e32207e 100644
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-16.png
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-16.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-16@2x.png b/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-16@2x.png
index 17066eb0ff..158308d290 100644
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-16@2x.png
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-16@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-22.png b/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-22.png
index 11ebc922f9..610440161f 100644
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-22.png
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-22.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-22@2x.png b/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-22@2x.png
index 31f70bf5fa..fae72407dd 100644
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-22@2x.png
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-22@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-24.png b/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-24.png
index a8111762a1..80cd6238a2 100644
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-24.png
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-24.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-24@2x.png b/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-24@2x.png
index d7e398c037..ef83576302 100644
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-24@2x.png
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-24@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-32.png b/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-32.png
index 890d9c21d4..e17cb11f60 100644
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-32.png
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-32.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-32@2x.png b/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-32@2x.png
index 52c13afc05..07f213f055 100644
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-32@2x.png
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/debug-overlay-32@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-15.png b/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-15.png
index 369d68f428..20ecca2fc7 100644
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-15.png
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-15.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-15@2x.png b/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-15@2x.png
index ca4455ecc2..872a5ff363 100644
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-15@2x.png
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-15@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-invalid-15.png b/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-invalid-15.png
index 85d1d95856..bfaf88cf34 100644
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-invalid-15.png
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-invalid-15.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-invalid-15@2x.png b/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-invalid-15@2x.png
index 541c1e30f5..cbf06776a2 100644
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-invalid-15@2x.png
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-breakpoint-invalid-15@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-15.png b/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-15.png
index 35b9278db4..e17b374a94 100644
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-15.png
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-15.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-15@2x.png b/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-15@2x.png
index d048195a4d..dc4002600d 100644
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-15@2x.png
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-15@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-invalid-15.png b/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-invalid-15.png
index 260a83bc34..4f126b81b3 100644
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-invalid-15.png
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-invalid-15.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-invalid-15@2x.png b/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-invalid-15@2x.png
index 5d751fcabf..e100e3de2c 100644
--- a/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-invalid-15@2x.png
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/gutter-tracepoint-invalid-15@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/prefs-debugger-16.png b/main/src/addins/MonoDevelop.Debugger/icons/light/prefs-debugger-16.png
new file mode 100644
index 0000000000..f26e32207e
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/prefs-debugger-16.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Debugger/icons/light/prefs-debugger-16@2x.png b/main/src/addins/MonoDevelop.Debugger/icons/light/prefs-debugger-16@2x.png
new file mode 100644
index 0000000000..b8681ba963
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Debugger/icons/light/prefs-debugger-16@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/IToolboxLoader.cs b/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/IToolboxLoader.cs
index bd624d51f5..f7fad29038 100644
--- a/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/IToolboxLoader.cs
+++ b/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/IToolboxLoader.cs
@@ -48,12 +48,12 @@ namespace MonoDevelop.DesignerSupport.Toolbox
get;
}
- System.Collections.Generic.IList<ItemToolboxNode> Load (LoaderContext context, string filename);
+ IList<ItemToolboxNode> Load (LoaderContext context, string filename);
}
public class LoaderContext
{
- Hashtable values = new Hashtable ();
+ readonly Hashtable values = new Hashtable ();
Dictionary<TargetRuntime, ExternalLoader> externalLoaders;
int counter;
diff --git a/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/ItemToolboxNode.cs b/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/ItemToolboxNode.cs
index e218e0b85c..f719a3468b 100644
--- a/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/ItemToolboxNode.cs
+++ b/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/ItemToolboxNode.cs
@@ -112,10 +112,8 @@ namespace MonoDevelop.DesignerSupport.Toolbox
public virtual bool Filter (string keyword)
{
- return ((Name==null)? false :
- (Name.ToLower ().IndexOf (keyword, StringComparison.InvariantCultureIgnoreCase) >= 0))
- || ((Description == null)? false :
- (Description.ToLower ().IndexOf (keyword, StringComparison.InvariantCultureIgnoreCase) >= 0));
+ return ((Name != null) && (Name.IndexOf (keyword, StringComparison.InvariantCultureIgnoreCase) >= 0))
+ || ((Description != null) && (Description.IndexOf (keyword, StringComparison.InvariantCultureIgnoreCase) >= 0));
}
public override bool Equals (object o)
diff --git a/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/TextToolboxNode.cs b/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/TextToolboxNode.cs
index 7b6a2f8857..181160287d 100644
--- a/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/TextToolboxNode.cs
+++ b/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/TextToolboxNode.cs
@@ -38,8 +38,8 @@ namespace MonoDevelop.DesignerSupport.Toolbox
[Serializable]
public class TextToolboxNode : ItemToolboxNode, ITextToolboxNode
{
- private string text = string.Empty;
- string domain = MonoDevelop.Core.GettextCatalog.GetString ("Text Snippets");
+ string text = string.Empty;
+ string domain = GettextCatalog.GetString ("Text Snippets");
public TextToolboxNode (string text)
{
diff --git a/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/ToolboxItemToolboxLoader.cs b/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/ToolboxItemToolboxLoader.cs
index 2130487c19..348d29ee7b 100644
--- a/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/ToolboxItemToolboxLoader.cs
+++ b/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/ToolboxItemToolboxLoader.cs
@@ -46,7 +46,7 @@ namespace MonoDevelop.DesignerSupport.Toolbox
bool initialized;
public string[] FileTypes {
- get { return new string[] {"dll", "exe"}; }
+ get { return new [] {"dll", "exe"}; }
}
public IList<ItemToolboxNode> Load (LoaderContext ctx, string filename)
@@ -70,7 +70,7 @@ namespace MonoDevelop.DesignerSupport.Toolbox
}
if (!found) {
// If the file does not belong to any known package, assume it is a wild assembly and make it
- // avaliable to all frameworks
+ // available to all runtimes
foreach (TargetRuntime runtime in Runtime.SystemAssemblyService.GetTargetRuntimes ())
yield return runtime;
}
@@ -87,7 +87,7 @@ namespace MonoDevelop.DesignerSupport.Toolbox
else
scanAssem = System.Reflection.Assembly.LoadFile (filename);
} catch (Exception ex) {
- MonoDevelop.Core.LoggingService.LogError ("ToolboxItemToolboxLoader: Could not load assembly '"
+ LoggingService.LogError ("ToolboxItemToolboxLoader: Could not load assembly '"
+ filename + "'", ex);
return list;
}
@@ -102,25 +102,29 @@ namespace MonoDevelop.DesignerSupport.Toolbox
}
//detect the runtime version
- MonoDevelop.Core.ClrVersion clrVersion = MonoDevelop.Core.ClrVersion.Default;
- byte[] corlibKey = new byte[] { 0xb7, 0x7a, 0x5c, 0x56, 0x19, 0x34, 0xe0, 0x89 };
- //the other system.{...} key:
- //{ 0xb0, 0x3f, 0x5f, 0x7f, 0x11, 0xd5, 0x0a, 0x3a };
+ var clrVersion = ClrVersion.Default;
+ byte[] corlibKey = { 0xb7, 0x7a, 0x5c, 0x56, 0x19, 0x34, 0xe0, 0x89 };
foreach (System.Reflection.AssemblyName an in scanAssem.GetReferencedAssemblies ()) {
if (an.Name == "mscorlib" && byteArraysEqual (corlibKey, an.GetPublicKeyToken ())) {
+ if (an.Version == new Version (4, 0, 0, 0)) {
+ clrVersion = ClrVersion.Net_4_0;
+ break;
+ }
if (an.Version == new Version (2, 0, 0, 0)) {
- clrVersion = MonoDevelop.Core.ClrVersion.Net_2_0;
+ clrVersion = ClrVersion.Net_2_0;
break;
- } else if (an.Version == new Version (1, 0, 5000, 0)) {
- clrVersion = MonoDevelop.Core.ClrVersion.Net_1_1;
+ }
+ if (an.Version == new Version (1, 0, 5000, 0)) {
+ clrVersion = ClrVersion.Net_1_1;
break;
}
}
}
- if (clrVersion == MonoDevelop.Core.ClrVersion.Default) {
- MonoDevelop.Core.LoggingService.LogError ("ToolboxItemToolboxLoader: assembly '"
- + filename + "' references unknown runtime version.");
+ if (clrVersion == ClrVersion.Default) {
+ LoggingService.LogError (
+ "ToolboxItemToolboxLoader: assembly '{0}' references unknown runtime version.", filename
+ );
return list;
}
@@ -128,7 +132,8 @@ namespace MonoDevelop.DesignerSupport.Toolbox
foreach (Type t in types) {
//skip inaccessible types
- if (t.IsAbstract || !t.IsPublic || !t.IsClass) continue;
+ if (t.IsAbstract || !t.IsPublic || !t.IsClass)
+ continue;
//get the ToolboxItemAttribute if present
object[] atts = t.GetCustomAttributes (typeof (ToolboxItemAttribute), true);
@@ -154,7 +159,7 @@ namespace MonoDevelop.DesignerSupport.Toolbox
list.Add (node);
}
} catch (Exception ex) {
- MonoDevelop.Core.LoggingService.LogError (
+ LoggingService.LogError (
"Unhandled error in toolbox node loader '" + GetType ().FullName
+ "' with type '" + t.FullName
+ "' in assembly '" + scanAssem.FullName + "'",
@@ -165,7 +170,7 @@ namespace MonoDevelop.DesignerSupport.Toolbox
return list;// Load (scanAssem);
}
- bool byteArraysEqual (byte[] a, byte[] b)
+ static bool byteArraysEqual (byte[] a, byte[] b)
{
if (a == null)
return b == null;
@@ -193,7 +198,7 @@ namespace MonoDevelop.DesignerSupport.Toolbox
ToolboxItemAttribute attribute,
string attributeCategory,
string assemblyPath,
- MonoDevelop.Core.ClrVersion referencedRuntime
- );
+ ClrVersion referencedRuntime
+ );
}
}
diff --git a/main/src/addins/MonoDevelop.DocFood/MonoDevelop.DocFood/DocGenerator.cs b/main/src/addins/MonoDevelop.DocFood/MonoDevelop.DocFood/DocGenerator.cs
index 08c8c40578..5f3d13dbbc 100644
--- a/main/src/addins/MonoDevelop.DocFood/MonoDevelop.DocFood/DocGenerator.cs
+++ b/main/src/addins/MonoDevelop.DocFood/MonoDevelop.DocFood/DocGenerator.cs
@@ -876,10 +876,15 @@ namespace MonoDevelop.DocFood
void SplitWords (object obj, string name)
{
StringBuilder result = new StringBuilder ();
+ bool wasUnderscore = false;
for (int i = 0; i < name.Length; i++) {
- char ch = name[i];
-
- if (char.IsUpper (ch)) {
+ char ch = name [i];
+ if (ch == '_') {
+ wasUnderscore = true;
+ continue;
+ }
+ if (char.IsUpper (ch) || wasUnderscore) {
+ wasUnderscore = false;
if (result.Length > 0)
result.Append (" ");
if (i + 1 < name.Length && char.IsUpper (name[i + 1])) {
@@ -894,6 +899,7 @@ namespace MonoDevelop.DocFood
continue;
}
}
+ wasUnderscore = false;
result.Append (char.ToLower (ch));
}
diff --git a/main/src/addins/MonoDevelop.Gettext/MonoDevelop.Gettext.csproj b/main/src/addins/MonoDevelop.Gettext/MonoDevelop.Gettext.csproj
index 2172c497a3..9e7530510c 100644
--- a/main/src/addins/MonoDevelop.Gettext/MonoDevelop.Gettext.csproj
+++ b/main/src/addins/MonoDevelop.Gettext/MonoDevelop.Gettext.csproj
@@ -199,6 +199,12 @@
<EmbeddedResource Include="icons\light\warning-16%402x.png">
<LogicalName>warning-light-16@2x.png</LogicalName>
</EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-language-16.png">
+ <LogicalName>prefs-language-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-language-16%402x.png">
+ <LogicalName>prefs-language-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Include="Makefile.am" />
diff --git a/main/src/addins/MonoDevelop.Gettext/gtk-gui/MonoDevelop.Gettext.Translator.LanguageChooserDialog.cs b/main/src/addins/MonoDevelop.Gettext/gtk-gui/MonoDevelop.Gettext.Translator.LanguageChooserDialog.cs
index baae1624fc..47ee64563e 100644
--- a/main/src/addins/MonoDevelop.Gettext/gtk-gui/MonoDevelop.Gettext.Translator.LanguageChooserDialog.cs
+++ b/main/src/addins/MonoDevelop.Gettext/gtk-gui/MonoDevelop.Gettext.Translator.LanguageChooserDialog.cs
@@ -34,7 +34,7 @@ namespace MonoDevelop.Gettext.Translator
this.Events = ((global::Gdk.EventMask)(256));
this.Name = "MonoDevelop.Gettext.Translator.LanguageChooserDialog";
this.Title = global::Mono.Unix.Catalog.GetString ("Create New Localization");
- this.Icon = global::Gdk.Pixbuf.LoadFromResource ("locale-16.png");
+ this.Icon = global::Gdk.Pixbuf.LoadFromResource ("prefs-language-light-16.png");
this.TypeHint = ((global::Gdk.WindowTypeHint)(1));
this.WindowPosition = ((global::Gtk.WindowPosition)(4));
this.Modal = true;
diff --git a/main/src/addins/MonoDevelop.Gettext/icons/light/done-16.png b/main/src/addins/MonoDevelop.Gettext/icons/light/done-16.png
index 469f60c5e3..7799066c43 100644
--- a/main/src/addins/MonoDevelop.Gettext/icons/light/done-16.png
+++ b/main/src/addins/MonoDevelop.Gettext/icons/light/done-16.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Gettext/icons/light/done-16@2x.png b/main/src/addins/MonoDevelop.Gettext/icons/light/done-16@2x.png
index 7b24c97916..c63d3974d1 100644
--- a/main/src/addins/MonoDevelop.Gettext/icons/light/done-16@2x.png
+++ b/main/src/addins/MonoDevelop.Gettext/icons/light/done-16@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Gettext/icons/light/error-16.png b/main/src/addins/MonoDevelop.Gettext/icons/light/error-16.png
index d9c4c975f2..30b5da6e9b 100644
--- a/main/src/addins/MonoDevelop.Gettext/icons/light/error-16.png
+++ b/main/src/addins/MonoDevelop.Gettext/icons/light/error-16.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Gettext/icons/light/error-16@2x.png b/main/src/addins/MonoDevelop.Gettext/icons/light/error-16@2x.png
index 22dfe0c16c..adfd2b7b19 100644
--- a/main/src/addins/MonoDevelop.Gettext/icons/light/error-16@2x.png
+++ b/main/src/addins/MonoDevelop.Gettext/icons/light/error-16@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Gettext/icons/light/prefs-language-16.png b/main/src/addins/MonoDevelop.Gettext/icons/light/prefs-language-16.png
new file mode 100644
index 0000000000..19f2663360
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Gettext/icons/light/prefs-language-16.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Gettext/icons/light/prefs-language-16@2x.png b/main/src/addins/MonoDevelop.Gettext/icons/light/prefs-language-16@2x.png
new file mode 100644
index 0000000000..1e4d00deb6
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Gettext/icons/light/prefs-language-16@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/PackageSourcesOptionsPanel.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/PackageSourcesOptionsPanel.cs
index 2478003ad5..d89d2bc405 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/PackageSourcesOptionsPanel.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/PackageSourcesOptionsPanel.cs
@@ -28,6 +28,7 @@
using System;
using System.Linq;
+using System.IO;
using System.Security.Cryptography;
using ICSharpCode.PackageManagement;
using MonoDevelop.Core;
@@ -121,14 +122,39 @@ namespace MonoDevelop.PackageManagement.Gui
public override void ApplyChanges()
{
- if (packageSourcesWidget.HasPackageSourcesOrderChanged) {
- viewModels.RegisteredPackageSourcesViewModel.Save (
- packageSourcesWidget.GetOrderedPackageSources ());
- } else {
- viewModels.RegisteredPackageSourcesViewModel.Save ();
+ try {
+ if (packageSourcesWidget.HasPackageSourcesOrderChanged) {
+ viewModels.RegisteredPackageSourcesViewModel.Save (
+ packageSourcesWidget.GetOrderedPackageSources ());
+ } else {
+ viewModels.RegisteredPackageSourcesViewModel.Save ();
+ }
+ } catch (Exception ex) {
+ LoggingService.LogError ("Unable to save NuGet.config changes", ex);
+ MessageService.ShowError (
+ GettextCatalog.GetString ("Unable to save package source changes.{0}{0}{1}",
+ Environment.NewLine,
+ GetSaveNuGetConfigFileErrorMessage ()));
}
}
+ /// <summary>
+ /// Returns a non-Windows specific error message instead of the one NuGet returns.
+ ///
+ /// NuGet returns a Windows specific error:
+ ///
+ /// "DeleteSection" cannot be called on a NullSettings. This may be caused on account of
+ /// insufficient permissions to read or write to "%AppData%\NuGet\NuGet.config".
+ /// </summary>
+ string GetSaveNuGetConfigFileErrorMessage ()
+ {
+ string path = Path.Combine (
+ Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData),
+ "NuGet",
+ "NuGet.config");
+ return GettextCatalog.GetString ("Unable to read or write to \"{0}\".", path);
+ }
+
public override void Dispose ()
{
if (packageSourcesWidget != null) {
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/PackageSourcesWidget.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/PackageSourcesWidget.cs
index a7f0ae2f36..2cc0dbf0b4 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/PackageSourcesWidget.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/PackageSourcesWidget.cs
@@ -224,11 +224,23 @@ namespace MonoDevelop.PackageManagement
{
viewModel.IsEditingSelectedPackageSource = false;
using (var dialog = new AddPackageSourceDialog (viewModel)) {
- dialog.ShowWithParent ();
+ if (dialog.ShowWithParent () == Xwt.Command.Ok) {
+ UpdateSelectedPackageSource ();
+ }
UpdateEnabledButtons ();
}
}
+ void UpdateSelectedPackageSource ()
+ {
+ TreeIter iter = GetTreeIter (viewModel.SelectedPackageSourceViewModel);
+ if (iter.Equals (TreeIter.Zero)) {
+ packageSourcesTreeView.Selection.UnselectAll ();
+ } else {
+ packageSourcesTreeView.Selection.SelectIter (iter);
+ }
+ }
+
void PackageSourcesTreeViewRowActivated (object o, RowActivatedArgs args)
{
viewModel.IsEditingSelectedPackageSource = true;
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/ProjectPackagesProjectNodeBuilderExtension.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/ProjectPackagesProjectNodeBuilderExtension.cs
index 3a3612b732..a5bf79ac55 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/ProjectPackagesProjectNodeBuilderExtension.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/ProjectPackagesProjectNodeBuilderExtension.cs
@@ -68,8 +68,8 @@ namespace MonoDevelop.PackageManagement.NodeBuilders
void RefreshAllChildNodes ()
{
DispatchService.GuiDispatch (() => {
- foreach (DotNetProject project in PackageManagementServices.Solution.GetDotNetProjects ()) {
- RefreshChildNodes (project);
+ foreach (IDotNetProject project in PackageManagementServices.Solution.GetDotNetProjects ()) {
+ RefreshChildNodes (project.DotNetProject);
}
});
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/CollectionAssert.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/CollectionAssert.cs
new file mode 100644
index 0000000000..dde5cd9163
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/CollectionAssert.cs
@@ -0,0 +1,41 @@
+//
+// CollectionAssert.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public static class CollectionAssert
+ {
+ public static void AreEqual (IEnumerable expected, IEnumerable actual)
+ {
+ Assert.That (actual, Is.EqualTo (expected));
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/ExceptionThrowingProcessPackageAction.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/ExceptionThrowingProcessPackageAction.cs
new file mode 100644
index 0000000000..c224dfaabf
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/ExceptionThrowingProcessPackageAction.cs
@@ -0,0 +1,42 @@
+//
+// ExceptionThrowingProcessPackageAction.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class ExceptionThrowingProcessPackageAction : TestableProcessPackageAction
+ {
+ public Exception ExceptionToThrowInExecuteCore =
+ new Exception ("Error");
+
+ protected override void ExecuteCore ()
+ {
+ throw ExceptionToThrowInExecuteCore;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/ExceptionThrowingRegisteredPackageRepositories.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/ExceptionThrowingRegisteredPackageRepositories.cs
new file mode 100644
index 0000000000..19bd75e12a
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/ExceptionThrowingRegisteredPackageRepositories.cs
@@ -0,0 +1,46 @@
+//
+// ExceptionThrowingRegisteredPackageRepositories.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class ExceptionThrowingRegisteredPackageRepositories : FakeRegisteredPackageRepositories
+ {
+ public Exception ExceptionToThrowWhenActiveRepositoryAccessed { get; set; }
+
+ public override IPackageRepository ActiveRepository {
+ get {
+ if (ExceptionToThrowWhenActiveRepositoryAccessed != null) {
+ throw ExceptionToThrowWhenActiveRepositoryAccessed;
+ }
+ return base.ActiveRepository;
+ }
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeDotNetProject.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeDotNetProject.cs
new file mode 100644
index 0000000000..ce19c42424
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeDotNetProject.cs
@@ -0,0 +1,117 @@
+//
+// FakeDotNetProject.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using MonoDevelop.Core;
+using MonoDevelop.Core.Assemblies;
+using MonoDevelop.Projects;
+using System.Linq;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeDotNetProject : FakeProject, IDotNetProject
+ {
+ public FakeDotNetProject ()
+ {
+ References = new ProjectReferenceCollection ();
+ Files = new ProjectFileCollection ();
+ TargetFrameworkMoniker = new TargetFrameworkMoniker ("v4.5");
+ }
+
+ public FakeDotNetProject (string fileName)
+ : base (fileName)
+ {
+ References = new ProjectReferenceCollection ();
+ Files = new ProjectFileCollection ();
+ }
+
+ public DotNetProject DotNetProject { get; set; }
+ public TargetFrameworkMoniker TargetFrameworkMoniker { get; set; }
+ public string DefaultNamespace { get; set; }
+ public ProjectReferenceCollection References { get; set; }
+ public ProjectFileCollection Files { get; set; }
+
+ public List<ProjectFile> FilesAdded = new List<ProjectFile> ();
+
+ public void AddFile (ProjectFile projectFile)
+ {
+ FilesAdded.Add (projectFile);
+ Files.Add (projectFile);
+ }
+
+ public bool IsFileInProject (string fileName)
+ {
+ return Files.Any (file => file.FilePath == new FilePath (fileName));
+ }
+
+ public void AddProjectType (Guid guid)
+ {
+ ExtendedProperties.Add ("ProjectTypeGuids", guid.ToString ());
+ }
+
+ public int ReferencesWhenSavedCount;
+ public int FilesAddedWhenSavedCount;
+ public int FilesInProjectWhenSavedCount { get; set; }
+
+ public override void Save ()
+ {
+ base.Save ();
+ ReferencesWhenSavedCount = References.Count;
+ FilesAddedWhenSavedCount = FilesAdded.Count;
+ FilesInProjectWhenSavedCount = Files.Count;
+ }
+
+ public void AddDefaultBuildAction (string buildAction, string fileName)
+ {
+ DefaultBuildActions.Add (fileName.ToNativePath (), buildAction);
+ }
+
+ public Dictionary<string, string> DefaultBuildActions = new Dictionary<string, string> ();
+
+ public string GetDefaultBuildAction (string fileName)
+ {
+ string buildAction = null;
+ DefaultBuildActions.TryGetValue (fileName, out buildAction);
+ return buildAction;
+ }
+
+ public List<string> ImportsAdded = new List<string> ();
+
+ public void AddImportIfMissing (string name, string condition)
+ {
+ ImportsAdded.Add (name);
+ }
+
+ public List<string> ImportsRemoved = new List <string> ();
+
+ public void RemoveImport (string name)
+ {
+ ImportsRemoved.Add (name);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeFileService.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeFileService.cs
new file mode 100644
index 0000000000..cc98f10229
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeFileService.cs
@@ -0,0 +1,63 @@
+//
+// FakeFileService.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeFileService : IPackageManagementFileService
+ {
+ public string PathPassedToRemoveFile;
+ public string PathPassedToRemoveDirectory;
+
+ IDotNetProject project;
+
+ public FakeFileService (IDotNetProject project)
+ {
+ this.project = project;
+ }
+
+ public void RemoveFile (string path)
+ {
+ PathPassedToRemoveFile = path;
+ }
+
+ public void RemoveDirectory (string path)
+ {
+ PathPassedToRemoveDirectory = path;
+ project.Files.Clear ();
+ }
+
+ public void OnFileChanged (string path)
+ {
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeFileSystem.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeFileSystem.cs
new file mode 100644
index 0000000000..6dbb22784d
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeFileSystem.cs
@@ -0,0 +1,150 @@
+//
+// FakeFileSystem.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.IO;
+using System.Text;
+using NuGet;
+using System.Collections.Generic;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeFileSystem : IFileSystem
+ {
+ public bool FileExistsReturnValue;
+ public string PathPassedToFileExists;
+ public string FileToReturnFromOpenFile;
+ public string PathToReturnFromGetFullPath;
+ public bool DirectoryExistsReturnValue;
+ public string PathPassedToDirectoryExists;
+
+ public ILogger Logger { get; set; }
+
+ public string Root { get; set; }
+
+ public void DeleteDirectory (string path, bool recursive)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public IEnumerable<string> GetFiles (string path)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public IEnumerable<string> GetFiles (string path, string filter)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public IEnumerable<string> GetDirectories (string path)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public string GetFullPath (string path)
+ {
+ return PathToReturnFromGetFullPath;
+ }
+
+ public void DeleteFile (string path)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public bool FileExists (string path)
+ {
+ PathPassedToFileExists = path;
+ return FileExistsReturnValue;
+ }
+
+ public bool DirectoryExists (string path)
+ {
+ PathPassedToDirectoryExists = path;
+ return DirectoryExistsReturnValue;
+ }
+
+ public void AddFile (string path, Stream stream)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public Stream OpenFile (string path)
+ {
+ byte[] bytes = UTF8Encoding.UTF8.GetBytes (FileToReturnFromOpenFile);
+ return new MemoryStream (bytes);
+ }
+
+ public DateTimeOffset GetLastModified (string path)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public DateTimeOffset GetCreated (string path)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public IEnumerable<string> GetFiles (string path, string filter, bool recursive)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public DateTimeOffset GetLastAccessed (string path)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void AddFile (string path, Action<Stream> writeToStream)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void MakeFileWritable (string path)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public Stream CreateFile (string path)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void DeleteFiles (IEnumerable<IPackageFile> files, string rootDir)
+ {
+ }
+
+ public void AddFiles (IEnumerable<IPackageFile> files, string rootDir)
+ {
+ }
+
+ public void MoveFile (string source, string destination)
+ {
+ throw new NotImplementedException ();
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeInstallPackageAction.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeInstallPackageAction.cs
new file mode 100644
index 0000000000..44dd254760
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeInstallPackageAction.cs
@@ -0,0 +1,64 @@
+//
+// FakeInstallPackageAction.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeInstallPackageAction : InstallPackageAction
+ {
+ public FakeInstallPackageAction ()
+ : this (null)
+ {
+ }
+
+ public FakeInstallPackageAction (IPackageManagementProject project)
+ : base (project, null)
+ {
+ }
+
+ public FakeInstallPackageAction (IPackageManagementProject project, IPackageManagementEvents packageManagementEvents)
+ : base (project, packageManagementEvents)
+ {
+ }
+
+ public bool IsExecuteCalled;
+
+ protected override void ExecuteCore ()
+ {
+ IsExecuteCalled = true;
+ ExecuteAction ();
+ }
+
+ protected override void BeforeExecute ()
+ {
+ }
+
+ public Action ExecuteAction = () => { };
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeLogger.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeLogger.cs
new file mode 100644
index 0000000000..39697146e9
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeLogger.cs
@@ -0,0 +1,77 @@
+//
+// FakeLogger.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeLogger : ILogger
+ {
+ public List<string> FormattedMessagesLogged = new List<string> ();
+
+ public string FirstFormattedMessageLogged {
+ get { return FormattedMessagesLogged [0]; }
+ }
+
+ public string LastFormattedMessageLogged {
+ get {
+ int index = FormattedMessagesLogged.Count - 1;
+ return FormattedMessagesLogged [index];
+ }
+ }
+
+ public string NextToLastFormattedMessageLogged {
+ get {
+ int index = FormattedMessagesLogged.Count - 2;
+ return FormattedMessagesLogged [index];
+ }
+ }
+
+ public string SecondFormattedMessageLogged {
+ get { return FormattedMessagesLogged [1]; }
+ }
+
+ public void Log (MessageLevel level, string message, params object[] args)
+ {
+ string formattedMessage = String.Format (message, args);
+ FormattedMessagesLogged.Add (formattedMessage);
+ }
+
+ public bool FormattedMessagesLoggedContainsText (string text)
+ {
+ return FormattedMessagesLogged.Any (message => message.Contains (text));
+ }
+
+ public FileConflictResolution ResolveFileConflict (string message)
+ {
+ throw new NotImplementedException ();
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeMachineCache.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeMachineCache.cs
new file mode 100644
index 0000000000..04a52331d6
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeMachineCache.cs
@@ -0,0 +1,54 @@
+//
+// FakeMachineCache.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeMachinePackageCache : IMachinePackageCache
+ {
+ public List<FakePackage> FakePackages = new List<FakePackage> ();
+
+ public IQueryable<IPackage> GetPackages ()
+ {
+ return FakePackages.AsQueryable ();
+ }
+
+ public bool IsClearCalled;
+
+ public void Clear ()
+ {
+ IsClearCalled = true;
+ }
+
+ public string Source { get; set; }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeOperationAwareRepository.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeOperationAwareRepository.cs
new file mode 100644
index 0000000000..7bbdce5119
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeOperationAwareRepository.cs
@@ -0,0 +1,66 @@
+//
+// FakeOperationAwareRepository.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeOperationAwarePackageRepository : FakePackageRepository, IOperationAwareRepository, IDisposable
+ {
+ public string OperationStarted;
+ public string MainPackageIdForOperationStarted;
+
+ public IDisposable StartOperation (string operationName, string mainPackageId, string mainPackageVersion)
+ {
+ OperationStarted = operationName;
+ MainPackageIdForOperationStarted = mainPackageId;
+ return this;
+ }
+
+ public void AssertOperationWasStartedAndDisposed (string expectedOperationName, string expectedMainPackageId)
+ {
+ Assert.AreEqual (expectedOperationName, OperationStarted);
+ Assert.AreEqual (expectedMainPackageId, MainPackageIdForOperationStarted);
+ AssertOperationIsDisposed ();
+ }
+
+ void AssertOperationIsDisposed ()
+ {
+ Assert.IsTrue (IsDisposed);
+ }
+
+ public bool IsDisposed;
+
+ public void Dispose ()
+ {
+ IsDisposed = true;
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackage.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackage.cs
new file mode 100644
index 0000000000..4601469c9b
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackage.cs
@@ -0,0 +1,233 @@
+//
+// FakePackage.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Runtime.Versioning;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackage : IPackageFromRepository
+ {
+ public Stream Stream = null;
+ public List<string> AuthorsList = new List<string> ();
+ public List<string> OwnersList = new List<string> ();
+ public List<IPackageFile> FilesList = new List<IPackageFile> ();
+
+ public List<PackageDependency> DependenciesList =
+ new List<PackageDependency> ();
+
+ public List<IPackageAssemblyReference> AssemblyReferenceList =
+ new List<IPackageAssemblyReference> ();
+
+ public FakePackage ()
+ : this (String.Empty)
+ {
+ }
+
+ public FakePackage (string id)
+ : this (id, "1.0.0.0")
+ {
+ }
+
+ public FakePackage (string id, string version)
+ {
+ this.Id = id;
+ this.Description = String.Empty;
+ this.Version = new SemanticVersion (version);
+ this.Listed = true;
+ this.IsLatestVersion = true;
+ }
+
+ public static FakePackage CreatePackageWithVersion (string version)
+ {
+ return CreatePackageWithVersion ("Test", version);
+ }
+
+ public static FakePackage CreatePackageWithVersion (string id, string version)
+ {
+ return new FakePackage (id, version);
+ }
+
+ public string Id { get; set; }
+ public SemanticVersion Version { get; set; }
+ public string Title { get; set; }
+ public Uri IconUrl { get; set; }
+ public Uri LicenseUrl { get; set; }
+ public Uri ProjectUrl { get; set; }
+ public bool RequireLicenseAcceptance { get; set; }
+ public string Description { get; set; }
+ public string Summary { get; set; }
+ public string Language { get; set; }
+ public string Tags { get; set; }
+ public Uri ReportAbuseUrl { get; set; }
+ public int DownloadCount { get; set; }
+ public int RatingsCount { get; set; }
+ public double Rating { get; set; }
+
+ public IEnumerable<IPackageAssemblyReference> AssemblyReferences {
+ get { return AssemblyReferenceList; }
+ }
+
+ public IEnumerable<string> Authors {
+ get { return AuthorsList; }
+ }
+
+ public IEnumerable<string> Owners {
+ get { return OwnersList; }
+ }
+
+ public IEnumerable<IPackageFile> GetFiles ()
+ {
+ return FilesList;
+ }
+
+ public Stream GetStream ()
+ {
+ return Stream;
+ }
+
+ public override string ToString ()
+ {
+ return String.Format ("{0} {1}", Id, Version);
+ }
+
+ public override bool Equals (object obj)
+ {
+ IPackage rhs = obj as IPackage;
+ if (rhs != null) {
+ return (Id == rhs.Id) && (Version == rhs.Version);
+ }
+ return false;
+ }
+
+ public override int GetHashCode ()
+ {
+ return base.GetHashCode ();
+ }
+
+ public void AddAuthor (string author)
+ {
+ AuthorsList.Add (author);
+ }
+
+ public void AddDependency (string id, SemanticVersion minVersion, SemanticVersion maxVersion)
+ {
+ var versionSpec = new VersionSpec ();
+ versionSpec.MinVersion = minVersion;
+ versionSpec.MaxVersion = maxVersion;
+ var dependency = new PackageDependency (id, versionSpec);
+ DependenciesList.Add (dependency);
+ }
+
+ public void AddDependency (string id)
+ {
+ DependenciesList.Add (new PackageDependency (id));
+ }
+
+ public List<FrameworkAssemblyReference> FrameworkAssembliesList =
+ new List<FrameworkAssemblyReference> ();
+
+ public IEnumerable<FrameworkAssemblyReference> FrameworkAssemblies {
+ get { return FrameworkAssembliesList; }
+ }
+
+ public FakePackageRepository FakePackageRepository = new FakePackageRepository ();
+
+ public IPackageRepository Repository {
+ get { return FakePackageRepository; }
+ }
+
+ public bool HasDependencies { get; set; }
+
+ public void AddFile (string fileName)
+ {
+ var file = new PhysicalPackageFile ();
+ file.TargetPath = fileName.ToNativePath ();
+ FilesList.Add (file);
+ }
+
+ public DateTime? LastUpdated { get; set; }
+
+ public bool IsLatestVersion { get; set; }
+
+ public Nullable<DateTimeOffset> Published { get; set; }
+
+ public string ReleaseNotes { get; set; }
+
+ public string Copyright { get; set; }
+
+ public bool IsAbsoluteLatestVersion { get; set; }
+
+ public bool Listed { get; set; }
+
+ public IEnumerable<PackageDependencySet> DependencySets {
+ get {
+ return new PackageDependencySet[] {
+ new PackageDependencySet (null, DependenciesList)
+ };
+ }
+ }
+
+ public List<FrameworkName> SupportedFrameworks = new List<FrameworkName> ();
+
+ public FrameworkName AddSupportedFramework (string identifier)
+ {
+ var framework = new FrameworkName (identifier);
+ SupportedFrameworks.Add (framework);
+ return framework;
+ }
+
+ public IEnumerable<FrameworkName> GetSupportedFrameworks ()
+ {
+ return SupportedFrameworks;
+ }
+
+ List<PackageReferenceSet> FakePackageAssemblyReferences =
+ new List<PackageReferenceSet> ();
+
+ public ICollection<PackageReferenceSet> PackageAssemblyReferences {
+ get { return FakePackageAssemblyReferences; }
+ }
+
+ public void AddPackageReferences (params string[] names)
+ {
+ var frameworkName = new FrameworkName (".NET Framework, Version=4.0");
+ var packageReferenceSet = new PackageReferenceSet (frameworkName, names);
+ FakePackageAssemblyReferences.Add (packageReferenceSet);
+ }
+
+ public Version MinClientVersion { get; set; }
+
+ public Uri GalleryUrl { get; set; }
+
+ public bool DevelopmentDependency { get; set; }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageAssemblyReference.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageAssemblyReference.cs
new file mode 100644
index 0000000000..403e352c3f
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageAssemblyReference.cs
@@ -0,0 +1,69 @@
+//
+// FakePackageAssemblyReference.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Runtime.Versioning;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageAssemblyReference : IPackageAssemblyReference
+ {
+ public FrameworkName TargetFramework {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public string Name { get; set; }
+
+ public string Path {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public Stream GetStream ()
+ {
+ throw new NotImplementedException ();
+ }
+
+ public IEnumerable<FrameworkName> SupportedFrameworks {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public string EffectivePath {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProject.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProject.cs
new file mode 100644
index 0000000000..e801d9413c
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProject.cs
@@ -0,0 +1,295 @@
+//
+// FakePackageManagementProject.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.Versioning;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Projects;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageManagementProject : IPackageManagementProject
+ {
+ public FakePackageManagementProject ()
+ : this ("Test")
+ {
+ }
+
+ public FakePackageManagementProject (string name)
+ {
+ FakeUninstallPackageAction = new FakeUninstallPackageAction (this);
+
+ this.Name = name;
+ }
+
+ public FakeUninstallPackageAction FakeUninstallPackageAction;
+
+ public FakeUpdatePackageAction FirstFakeUpdatePackageActionCreated {
+ get { return FakeUpdatePackageActionsCreated [0]; }
+ }
+
+ public FakeUpdatePackageAction SecondFakeUpdatePackageActionCreated {
+ get { return FakeUpdatePackageActionsCreated [1]; }
+ }
+
+ public List<FakeUpdatePackageAction> FakeUpdatePackageActionsCreated =
+ new List<FakeUpdatePackageAction> ();
+
+ public string Name { get; set; }
+
+ public bool IsPackageInstalled (string packageId)
+ {
+ return FakePackages.Any (p => p.Id == packageId);
+ }
+
+ public bool IsPackageInstalled (IPackage package)
+ {
+ return FakePackages.Contains (package);
+ }
+
+ public List<FakePackage> FakePackages = new List<FakePackage> ();
+
+ public IQueryable<IPackage> GetPackages ()
+ {
+ return FakePackages.AsQueryable ();
+ }
+
+ public List<FakePackageOperation> FakeInstallOperations = new List<FakePackageOperation> ();
+ public IPackage PackagePassedToGetInstallPackageOperations;
+ public bool IgnoreDependenciesPassedToGetInstallPackageOperations;
+ public bool AllowPrereleaseVersionsPassedToGetInstallPackageOperations;
+
+ public virtual IEnumerable<PackageOperation> GetInstallPackageOperations (IPackage package, InstallPackageAction installAction)
+ {
+ PackagePassedToGetInstallPackageOperations = package;
+ IgnoreDependenciesPassedToGetInstallPackageOperations = installAction.IgnoreDependencies;
+ AllowPrereleaseVersionsPassedToGetInstallPackageOperations = installAction.AllowPrereleaseVersions;
+
+ return FakeInstallOperations;
+ }
+
+ public ILogger Logger { get; set; }
+
+ public IPackage PackagePassedToInstallPackage;
+ public IEnumerable<PackageOperation> PackageOperationsPassedToInstallPackage;
+ public bool IgnoreDependenciesPassedToInstallPackage;
+ public bool AllowPrereleaseVersionsPassedToInstallPackage;
+
+ public void InstallPackage (IPackage package, InstallPackageAction installAction)
+ {
+ PackagePassedToInstallPackage = package;
+ PackageOperationsPassedToInstallPackage = installAction.Operations;
+ IgnoreDependenciesPassedToInstallPackage = installAction.IgnoreDependencies;
+ AllowPrereleaseVersionsPassedToInstallPackage = installAction.AllowPrereleaseVersions;
+ }
+
+ public FakePackageOperation AddFakeInstallOperation ()
+ {
+ var package = new FakePackage ("MyPackage");
+ var operation = new FakePackageOperation (package, PackageAction.Install);
+ FakeInstallOperations.Add (operation);
+ return operation;
+ }
+
+ public FakePackageOperation AddFakeUninstallOperation ()
+ {
+ var package = new FakePackage ("MyPackage");
+ var operation = new FakePackageOperation (package, PackageAction.Uninstall);
+ FakeInstallOperations.Add (operation);
+ return operation;
+ }
+
+ public FakePackageRepository FakeSourceRepository = new FakePackageRepository ();
+
+ public IPackageRepository SourceRepository {
+ get { return FakeSourceRepository; }
+ }
+
+ public IPackage PackagePassedToUninstallPackage;
+ public bool ForceRemovePassedToUninstallPackage;
+ public bool RemoveDependenciesPassedToUninstallPackage;
+
+ public void UninstallPackage (IPackage package, UninstallPackageAction uninstallAction)
+ {
+ PackagePassedToUninstallPackage = package;
+ ForceRemovePassedToUninstallPackage = uninstallAction.ForceRemove;
+ RemoveDependenciesPassedToUninstallPackage = uninstallAction.RemoveDependencies;
+ }
+
+ public IPackage PackagePassedToUpdatePackage;
+ public IEnumerable<PackageOperation> PackageOperationsPassedToUpdatePackage;
+ public bool UpdateDependenciesPassedToUpdatePackage;
+ public bool AllowPrereleaseVersionsPassedToUpdatePackage;
+ public bool IsUpdatePackageCalled;
+
+ public void UpdatePackage (IPackage package, UpdatePackageAction updateAction)
+ {
+ PackagePassedToUpdatePackage = package;
+ PackageOperationsPassedToUpdatePackage = updateAction.Operations;
+ UpdateDependenciesPassedToUpdatePackage = updateAction.UpdateDependencies;
+ AllowPrereleaseVersionsPassedToUpdatePackage = updateAction.AllowPrereleaseVersions;
+ IsUpdatePackageCalled = true;
+ }
+
+ public FakeInstallPackageAction LastInstallPackageCreated;
+
+ public virtual InstallPackageAction CreateInstallPackageAction ()
+ {
+ LastInstallPackageCreated = new FakeInstallPackageAction (this);
+ return LastInstallPackageCreated;
+ }
+
+ public virtual UninstallPackageAction CreateUninstallPackageAction ()
+ {
+ return FakeUninstallPackageAction;
+ }
+
+ public UpdatePackageAction CreateUpdatePackageAction ()
+ {
+ var action = new FakeUpdatePackageAction (this);
+ FakeUpdatePackageActionsCreated.Add (action);
+ return action;
+ }
+
+ public event EventHandler<PackageOperationEventArgs> PackageInstalled;
+
+ public void FirePackageInstalledEvent (PackageOperationEventArgs e)
+ {
+ if (PackageInstalled != null) {
+ PackageInstalled (this, e);
+ }
+ }
+
+ public event EventHandler<PackageOperationEventArgs> PackageUninstalled;
+
+ public void FirePackageUninstalledEvent (PackageOperationEventArgs e)
+ {
+ if (PackageUninstalled != null) {
+ PackageUninstalled (this, e);
+ }
+ }
+
+ public event EventHandler<PackageOperationEventArgs> PackageReferenceAdded;
+
+ public void FirePackageReferenceAddedEvent (PackageOperationEventArgs e)
+ {
+ if (PackageReferenceAdded != null) {
+ PackageReferenceAdded (this, e);
+ }
+ }
+
+ public event EventHandler<PackageOperationEventArgs> PackageReferenceRemoving;
+
+ public void FirePackageReferenceRemovingEvent (PackageOperationEventArgs e)
+ {
+ if (PackageReferenceRemoving != null) {
+ PackageReferenceRemoving (this, e);
+ }
+ }
+
+ public List<FakePackage> FakePackagesInReverseDependencyOrder =
+ new List<FakePackage> ();
+
+ public IEnumerable<IPackage> GetPackagesInReverseDependencyOrder ()
+ {
+ return FakePackagesInReverseDependencyOrder;
+ }
+
+ public void AddFakePackage (string id)
+ {
+ FakePackages.Add (new FakePackage (id));
+ }
+
+ public void AddFakePackageToSourceRepository (string packageId)
+ {
+ FakeSourceRepository.AddFakePackage (packageId);
+ }
+
+ public void UpdatePackages (UpdatePackagesAction action)
+ {
+ }
+
+ public List<UpdatePackagesAction> UpdatePackagesActionsCreated =
+ new List<UpdatePackagesAction> ();
+
+ public UpdatePackagesAction CreateUpdatePackagesAction ()
+ {
+ var action = new UpdatePackagesAction (this, null);
+ UpdatePackagesActionsCreated.Add (action);
+ return action;
+ }
+
+ public UpdatePackagesAction UpdatePackagesActionPassedToGetUpdatePackagesOperations;
+ public IUpdatePackageSettings SettingsPassedToGetUpdatePackagesOperations;
+ public List<IPackage> PackagesOnUpdatePackagesActionPassedToGetUpdatePackagesOperations;
+ public List<PackageOperation> PackageOperationsToReturnFromGetUpdatePackagesOperations =
+ new List<PackageOperation> ();
+
+ public IEnumerable<PackageOperation> GetUpdatePackagesOperations (
+ IEnumerable<IPackage> packages,
+ IUpdatePackageSettings settings)
+ {
+ SettingsPassedToGetUpdatePackagesOperations = settings;
+ PackagesOnUpdatePackagesActionPassedToGetUpdatePackagesOperations = packages.ToList ();
+ return PackageOperationsToReturnFromGetUpdatePackagesOperations;
+ }
+
+ public void RunPackageOperations (IEnumerable<PackageOperation> expectedOperations)
+ {
+ }
+
+ public bool HasOlderPackageInstalled (IPackage package)
+ {
+ return false;
+ }
+
+ public void UpdatePackageReference (IPackage package, IUpdatePackageSettings settings)
+ {
+ throw new NotImplementedException ();
+ }
+
+ #pragma warning disable 0067
+ public event EventHandler<PackageOperationEventArgs> PackageReferenceRemoved;
+ #pragma warning restore 0067
+
+ public IPackage FindPackage (string packageId)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public FrameworkName TargetFramework { get; set; }
+
+ public DotNetProject DotNetProject {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProjectFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProjectFactory.cs
new file mode 100644
index 0000000000..95d3e04eb0
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProjectFactory.cs
@@ -0,0 +1,81 @@
+//
+// FakePackageManagementProjectFactory.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageManagementProjectFactory : IPackageManagementProjectFactory
+ {
+ public FakePackageManagementProjectFactory ()
+ {
+ CreatePackageManagementProject = (sourceRepository, project) => {
+ RepositoriesPassedToCreateProject.Add (sourceRepository);
+ ProjectsPassedToCreateProject.Add (project);
+
+ var fakeProject = new FakePackageManagementProject ();
+ FakeProjectsCreated.Add (fakeProject);
+ return fakeProject;
+ };
+ }
+
+ public List<FakePackageManagementProject> FakeProjectsCreated =
+ new List<FakePackageManagementProject> ();
+
+ public FakePackageManagementProject FirstFakeProjectCreated {
+ get { return FakeProjectsCreated [0]; }
+ }
+
+ public IPackageRepository FirstRepositoryPassedToCreateProject {
+ get { return RepositoriesPassedToCreateProject [0]; }
+ }
+
+ public List<IPackageRepository> RepositoriesPassedToCreateProject =
+ new List<IPackageRepository> ();
+
+ public IDotNetProject FirstProjectPassedToCreateProject {
+ get { return ProjectsPassedToCreateProject [0]; }
+ }
+
+ public Func<IPackageRepository, IDotNetProject, FakePackageManagementProject>
+ CreatePackageManagementProject = (sourceRepository, project) => {
+ return null;
+ };
+
+ public List<IDotNetProject> ProjectsPassedToCreateProject =
+ new List<IDotNetProject> ();
+
+ public IPackageManagementProject CreateProject (IPackageRepository sourceRepository, IDotNetProject project)
+ {
+ return CreatePackageManagementProject (sourceRepository, project);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProjectService.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProjectService.cs
new file mode 100644
index 0000000000..d0aeb44a32
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProjectService.cs
@@ -0,0 +1,75 @@
+//
+// FakePackageManagementProjectService.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageManagementProjectService : IPackageManagementProjectService
+ {
+ public IProject CurrentProject { get; set; }
+ public ISolution OpenSolution { get; set; }
+
+ public ISolution SavedSolution;
+
+ public void Save (ISolution solution)
+ {
+ SavedSolution = solution;
+ }
+
+ public List<IDotNetProject> OpenProjects = new List<IDotNetProject> ();
+
+ public IEnumerable<IDotNetProject> GetOpenProjects ()
+ {
+ return OpenProjects;
+ }
+
+ public IProjectBrowserUpdater CreateProjectBrowserUpdater ()
+ {
+ throw new NotImplementedException ();
+ }
+
+ Dictionary<string, string> defaultCustomTools = new Dictionary<string, string> ();
+
+ public void AddDefaultCustomToolForFileName (string fileName, string customTool)
+ {
+ defaultCustomTools.Add (fileName, customTool);
+ }
+
+ public string GetDefaultCustomToolForFileName (ProjectFile projectItem)
+ {
+ if (defaultCustomTools.ContainsKey (projectItem.FilePath.ToString ())) {
+ return defaultCustomTools [projectItem.FilePath.ToString ()];
+ }
+ return String.Empty;
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementSolution.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementSolution.cs
new file mode 100644
index 0000000000..7185d1c5d4
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementSolution.cs
@@ -0,0 +1,203 @@
+//
+// FakePackageManagementSolution.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageManagementSolution : IPackageManagementSolution
+ {
+ public void AddPackageToActiveProjectLocalRepository (FakePackage package)
+ {
+ FakeActiveProject.FakePackages.Add (package);
+ }
+
+ public FakePackage AddPackageToActiveProjectLocalRepository (string packageId)
+ {
+ var package = new FakePackage (packageId);
+ AddPackageToActiveProjectLocalRepository (package);
+ return package;
+ }
+
+ public int GetActiveProjectCallCount;
+ public FakePackageManagementProject FakeActiveProject = new FakePackageManagementProject ();
+ public bool IsGetActiveProjectWithNoParametersCalled;
+
+ public virtual IPackageManagementProject GetActiveProject ()
+ {
+ GetActiveProjectCallCount++;
+ IsGetActiveProjectWithNoParametersCalled = true;
+
+ return FakeActiveProject;
+ }
+
+ public IPackageRepository RepositoryPassedToGetActiveProject;
+
+ public virtual IPackageManagementProject GetActiveProject (IPackageRepository sourceRepository)
+ {
+ RepositoryPassedToGetActiveProject = sourceRepository;
+ return FakeActiveProject;
+ }
+
+ public FakePackageManagementProject FakeProjectToReturnFromGetProject =
+ new FakePackageManagementProject ();
+
+ public PackageSource PackageSourcePassedToGetProject;
+ public string ProjectNamePassedToGetProject;
+
+ public IPackageManagementProject GetProject (PackageSource source, string projectName)
+ {
+ PackageSourcePassedToGetProject = source;
+ ProjectNamePassedToGetProject = projectName;
+ return FakeProjectToReturnFromGetProject;
+ }
+
+ public IPackageRepository RepositoryPassedToGetProject;
+
+ public IPackageManagementProject GetProject (IPackageRepository sourceRepository, string projectName)
+ {
+ RepositoryPassedToGetProject = sourceRepository;
+ ProjectNamePassedToGetProject = projectName;
+ return FakeProjectToReturnFromGetProject;
+ }
+
+ public IDotNetProject ProjectPassedToGetProject;
+ public List<IDotNetProject> ProjectsPassedToGetProject = new List<IDotNetProject> ();
+ public Dictionary<string, FakePackageManagementProject> FakeProjectsToReturnFromGetProject
+ = new Dictionary<string, FakePackageManagementProject> ();
+
+ public virtual IPackageManagementProject GetProject (IPackageRepository sourceRepository, IDotNetProject project)
+ {
+ RepositoryPassedToGetProject = sourceRepository;
+ ProjectPassedToGetProject = project;
+ ProjectsPassedToGetProject.Add (project);
+ FakePackageManagementProject fakeProject = null;
+ if (FakeProjectsToReturnFromGetProject.TryGetValue (project.Name, out fakeProject)) {
+ return fakeProject;
+ }
+ return FakeProjectToReturnFromGetProject;
+ }
+
+ public FakeDotNetProject FakeActiveDotNetProject;
+
+ public IDotNetProject GetActiveDotNetProject ()
+ {
+ return FakeActiveDotNetProject;
+ }
+
+ public List<FakeDotNetProject> FakeDotNetProjects = new List<FakeDotNetProject> ();
+
+ public IEnumerable<IDotNetProject> GetDotNetProjects ()
+ {
+ return FakeDotNetProjects;
+ }
+
+ public bool IsOpen { get; set; }
+
+ public bool HasMultipleProjects ()
+ {
+ return FakeDotNetProjects.Count > 1;
+ }
+
+ public string FileName { get; set; }
+
+ public List<FakePackage> FakeInstalledPackages = new List<FakePackage> ();
+
+ public bool IsPackageInstalled (IPackage package)
+ {
+ return FakeInstalledPackages.Contains (package);
+ }
+
+ public IQueryable<IPackage> GetPackages ()
+ {
+ return FakeInstalledPackages.AsQueryable ();
+ }
+
+ public void NoProjectsSelected ()
+ {
+ FakeActiveProject = null;
+ FakeActiveDotNetProject = null;
+ }
+
+ public FakePackageManagementProject AddFakeProjectToReturnFromGetProject (string name)
+ {
+ var project = new FakePackageManagementProject (name);
+ FakeProjectsToReturnFromGetProject.Add (name, project);
+ return project;
+ }
+
+ public List<FakePackage> FakePackagesInReverseDependencyOrder =
+ new List<FakePackage> ();
+
+ public IEnumerable<IPackage> GetPackagesInReverseDependencyOrder ()
+ {
+ return FakePackagesInReverseDependencyOrder;
+ }
+
+ public List<FakePackageManagementProject> FakeProjects =
+ new List<FakePackageManagementProject> ();
+
+ public IPackageRepository SourceRepositoryPassedToGetProjects;
+
+ public IEnumerable<IPackageManagementProject> GetProjects (IPackageRepository sourceRepository)
+ {
+ SourceRepositoryPassedToGetProjects = sourceRepository;
+ return FakeProjects;
+ }
+
+ public FakePackageManagementProject AddFakeProject (string projectName)
+ {
+ var project = new FakePackageManagementProject (projectName);
+ FakeProjects.Add (project);
+ return project;
+ }
+
+ public FakePackage AddPackageToSharedLocalRepository (string packageId, string version)
+ {
+ var package = new FakePackage (packageId, version);
+ FakeInstalledPackages.Add (package);
+ return package;
+ }
+
+ public FakePackage AddPackageToSharedLocalRepository (string packageId)
+ {
+ var package = new FakePackage (packageId);
+ FakeInstalledPackages.Add (package);
+ return package;
+ }
+
+ public string GetInstallPath (IPackage package)
+ {
+ throw new NotImplementedException ();
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManager.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManager.cs
new file mode 100644
index 0000000000..9a46479d10
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManager.cs
@@ -0,0 +1,240 @@
+//
+// FakePackageManager.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageManager : ISharpDevelopPackageManager
+ {
+ public FakeProjectManager FakeProjectManager = new FakeProjectManager ();
+ public FakePackageManagementProjectService FakeProjectService = new FakePackageManagementProjectService ();
+
+ public IPackage PackagePassedToInstallPackage;
+ public bool IgnoreDependenciesPassedToInstallPackage;
+ public bool AllowPrereleaseVersionsPassedToInstallPackage;
+
+ public IPackage PackagePassedToUninstallPackage;
+
+ public UpdatePackagesAction UpdatePackagesActionsPassedToUpdatePackages;
+
+ #pragma warning disable 67
+ public event EventHandler<PackageOperationEventArgs> PackageInstalled;
+ public event EventHandler<PackageOperationEventArgs> PackageInstalling;
+ public event EventHandler<PackageOperationEventArgs> PackageUninstalled;
+ public event EventHandler<PackageOperationEventArgs> PackageUninstalling;
+ #pragma warning restore 67
+
+ public IFileSystem FileSystem {
+ get { return FakeFileSystem; }
+ set { FakeFileSystem = value as FakeFileSystem; }
+ }
+
+ public FakeFileSystem FakeFileSystem = new FakeFileSystem ();
+
+ public IPackageRepository LocalRepository { get; set; }
+
+ public ILogger Logger { get; set; }
+
+ public IPackageRepository SourceRepository { get; set; }
+
+ public ISharpDevelopProjectManager ProjectManager { get; set; }
+
+ public FakePackageRepository FakeSourceRepository = new FakePackageRepository ();
+
+ public FakePackageManager ()
+ {
+ ProjectManager = FakeProjectManager;
+ SourceRepository = FakeSourceRepository;
+ }
+
+ public bool ForceRemovePassedToUninstallPackage;
+ public bool RemoveDependenciesPassedToUninstallPackage;
+
+ public void UninstallPackage (IPackage package, UninstallPackageAction uninstallAction)
+ {
+ PackagePassedToUninstallPackage = package;
+ ForceRemovePassedToUninstallPackage = uninstallAction.ForceRemove;
+ RemoveDependenciesPassedToUninstallPackage = uninstallAction.RemoveDependencies;
+ }
+
+ public void UninstallPackage (IPackage package, bool forceRemove, bool removeDependencies)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public IEnumerable<PackageOperation> PackageOperationsPassedToInstallPackage;
+
+ public void InstallPackage (IPackage package, InstallPackageAction installAction)
+ {
+ PackagePassedToInstallPackage = package;
+
+ IgnoreDependenciesPassedToInstallPackage = installAction.IgnoreDependencies;
+ PackageOperationsPassedToInstallPackage = installAction.Operations;
+ AllowPrereleaseVersionsPassedToInstallPackage = installAction.AllowPrereleaseVersions;
+ }
+
+ public List<PackageOperation> PackageOperationsToReturnFromGetInstallPackageOperations = new List<PackageOperation> ();
+ public IPackage PackagePassedToGetInstallPackageOperations;
+ public bool IgnoreDependenciesPassedToGetInstallPackageOperations;
+ public bool AllowPrereleaseVersionsPassedToGetInstallPackageOperations;
+
+ public IEnumerable<PackageOperation> GetInstallPackageOperations (IPackage package, InstallPackageAction installAction)
+ {
+ PackagePassedToGetInstallPackageOperations = package;
+ IgnoreDependenciesPassedToGetInstallPackageOperations = installAction.IgnoreDependencies;
+ AllowPrereleaseVersionsPassedToGetInstallPackageOperations = installAction.AllowPrereleaseVersions;
+ return PackageOperationsToReturnFromGetInstallPackageOperations;
+ }
+
+ public IPackage PackagePassedToUpdatePackage;
+ public IEnumerable<PackageOperation> PackageOperationsPassedToUpdatePackage;
+ public bool UpdateDependenciesPassedToUpdatePackage;
+
+ public void UpdatePackage (IPackage package, UpdatePackageAction updateAction)
+ {
+ PackagePassedToUpdatePackage = package;
+ PackageOperationsPassedToUpdatePackage = updateAction.Operations;
+ UpdateDependenciesPassedToUpdatePackage = updateAction.UpdateDependencies;
+ AllowPrereleaseVersionsPassedToInstallPackage = updateAction.AllowPrereleaseVersions;
+ }
+
+ public void FirePackageInstalled (PackageOperationEventArgs e)
+ {
+ PackageInstalled (this, e);
+ }
+
+ public void FirePackageUninstalled (PackageOperationEventArgs e)
+ {
+ PackageUninstalled (this, e);
+ }
+
+ public IPackagePathResolver PathResolver {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public void UpdatePackage (IPackage newPackage, bool updateDependencies)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void UpdatePackage (string packageId, IVersionSpec versionSpec, bool updateDependencies)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void InstallPackage (IPackage package, bool ignoreDependencies, bool allowPrereleaseVersions)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void InstallPackage (string packageId, SemanticVersion version, bool ignoreDependencies, bool allowPrereleaseVersions)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void UpdatePackage (IPackage newPackage, bool updateDependencies, bool allowPrereleaseVersions)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void UpdatePackage (string packageId, SemanticVersion version, bool updateDependencies, bool allowPrereleaseVersions)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void UpdatePackage (string packageId, IVersionSpec versionSpec, bool updateDependencies, bool allowPrereleaseVersions)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void UninstallPackage (string packageId, SemanticVersion version, bool forceRemove, bool removeDependencies)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void UpdatePackages (UpdatePackagesAction updateAction)
+ {
+ UpdatePackagesActionsPassedToUpdatePackages = updateAction;
+ }
+
+ public List<PackageOperation> PackageOperationsToReturnFromGetUpdatePackageOperations = new List<PackageOperation> ();
+ public IUpdatePackageSettings SettingsPassedToGetUpdatePackageOperations;
+ public IEnumerable<IPackage> PackagesPassedToGetUpdatePackageOperations;
+
+ public IEnumerable<PackageOperation> GetUpdatePackageOperations (IEnumerable<IPackage> packages, IUpdatePackageSettings settings)
+ {
+ SettingsPassedToGetUpdatePackageOperations = settings;
+ PackagesPassedToGetUpdatePackageOperations = packages;
+ return PackageOperationsToReturnFromGetUpdatePackageOperations;
+ }
+
+ public List<PackageOperation> PackageOperationsPassedToRunPackageOperations;
+
+ public void RunPackageOperations (IEnumerable<PackageOperation> operations)
+ {
+ PackageOperationsPassedToRunPackageOperations = operations.ToList ();
+ }
+
+ public IPackage PackagePassedToUpdatePackageReference;
+ public IUpdatePackageSettings SettingsPassedToUpdatePackageReference;
+
+ public void UpdatePackageReference (IPackage package, IUpdatePackageSettings settings)
+ {
+ PackagePassedToUpdatePackageReference = package;
+ SettingsPassedToUpdatePackageReference = settings;
+ }
+
+ public void InstallPackage (IPackage package, bool ignoreDependencies, bool allowPrereleaseVersions, bool ignoreWalkInfo)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public DependencyVersion DependencyVersion {
+ get {
+ throw new NotImplementedException ();
+ }
+ set {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public bool WhatIf {
+ get {
+ throw new NotImplementedException ();
+ }
+ set {
+ throw new NotImplementedException ();
+ }
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagerFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagerFactory.cs
new file mode 100644
index 0000000000..bb98bc2097
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagerFactory.cs
@@ -0,0 +1,49 @@
+//
+// FakePackageManagerFactory.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageManagerFactory : IPackageManagerFactory
+ {
+ public FakePackageManager FakePackageManager = new FakePackageManager ();
+ public IPackageRepository PackageRepositoryPassedToCreatePackageManager;
+ public IDotNetProject ProjectPassedToCreateRepository;
+
+ public ISharpDevelopPackageManager CreatePackageManager (IPackageRepository sourceRepository, IDotNetProject project)
+ {
+ PackageRepositoryPassedToCreatePackageManager = sourceRepository;
+ ProjectPassedToCreateRepository = project;
+ return FakePackageManager;
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperation.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperation.cs
new file mode 100644
index 0000000000..3d1a6d65af
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperation.cs
@@ -0,0 +1,48 @@
+//
+// FakePackageOperation.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageOperation : PackageOperation
+ {
+ public FakePackageOperation ()
+ : this (new FakePackage ("MyPackage"), PackageAction.Install)
+ {
+ }
+
+ public FakePackageOperation (FakePackage package, PackageAction action)
+ : base (package, action)
+ {
+ this.FakePackage = package;
+ }
+
+ public FakePackage FakePackage { get; set; }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperationResolver.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperationResolver.cs
new file mode 100644
index 0000000000..d9e8eeca15
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperationResolver.cs
@@ -0,0 +1,52 @@
+//
+// FakePackageOperationResolver.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageOperationResolver : IPackageOperationResolver
+ {
+ Dictionary <IPackage, PackageOperation []> packageOperations =
+ new Dictionary<IPackage, PackageOperation[]> ();
+
+ public IPackage PackagePassedToResolveOperations;
+
+ public IEnumerable<PackageOperation> ResolveOperations (IPackage package)
+ {
+ PackagePassedToResolveOperations = package;
+ return packageOperations [package];
+ }
+
+ public void AddOperations (IPackage package, PackageOperation[] operations)
+ {
+ packageOperations.Add (package, operations);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperationResolverFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperationResolverFactory.cs
new file mode 100644
index 0000000000..5c66ad1845
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperationResolverFactory.cs
@@ -0,0 +1,78 @@
+//
+// FakePackageOperationResolverFactory.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageOperationResolverFactory : IPackageOperationResolverFactory
+ {
+ public FakePackageOperationResolver FakeInstallPackageOperationResolver = new FakePackageOperationResolver ();
+ public IPackageRepository LocalRepositoryPassedToCreateInstallPackageOperationsResolver;
+ public IPackageRepository SourceRepositoryPassedToCreateInstallPackageOperationsResolver;
+ public ILogger LoggerPassedToCreateInstallPackageOperationResolver;
+ public bool IgnoreDependenciesPassedToCreateInstallPackageOperationResolver;
+ public bool AllowPrereleaseVersionsPassedToCreateInstallPackageOperationResolver;
+
+ public IPackageOperationResolver CreateInstallPackageOperationResolver (
+ IPackageRepository localRepository,
+ IPackageRepository sourceRepository,
+ ILogger logger,
+ InstallPackageAction installAction)
+ {
+ LocalRepositoryPassedToCreateInstallPackageOperationsResolver = localRepository;
+ SourceRepositoryPassedToCreateInstallPackageOperationsResolver = sourceRepository;
+ LoggerPassedToCreateInstallPackageOperationResolver = logger;
+ IgnoreDependenciesPassedToCreateInstallPackageOperationResolver = installAction.IgnoreDependencies;
+ AllowPrereleaseVersionsPassedToCreateInstallPackageOperationResolver = installAction.AllowPrereleaseVersions;
+
+ return FakeInstallPackageOperationResolver;
+ }
+
+ public IPackageRepository LocalRepositoryPassedToCreateUpdatePackageOperationsResolver;
+ public IPackageRepository SourceRepositoryPassedToCreateUpdatePackageOperationsResolver;
+ public IPackageOperationResolver UpdatePackageOperationsResolver = new FakePackageOperationResolver ();
+ public ILogger LoggerPassedToCreateUpdatePackageOperationResolver;
+ public IUpdatePackageSettings SettingsPassedToCreatePackageOperationResolver;
+
+ public IPackageOperationResolver CreateUpdatePackageOperationResolver (
+ IPackageRepository localRepository,
+ IPackageRepository sourceRepository,
+ ILogger logger,
+ IUpdatePackageSettings settings)
+ {
+ LocalRepositoryPassedToCreateUpdatePackageOperationsResolver = localRepository;
+ SourceRepositoryPassedToCreateUpdatePackageOperationsResolver = sourceRepository;
+ LoggerPassedToCreateUpdatePackageOperationResolver = logger;
+ SettingsPassedToCreatePackageOperationResolver = settings;
+
+ return UpdatePackageOperationsResolver;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackagePathResolver.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackagePathResolver.cs
new file mode 100644
index 0000000000..daaae9cc6e
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackagePathResolver.cs
@@ -0,0 +1,60 @@
+//
+// FakePackagePathResolver.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackagePathResolver : IPackagePathResolver
+ {
+ public string GetInstallPath (IPackage package)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public string GetPackageDirectory (IPackage package)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public string GetPackageDirectory (string packageId, SemanticVersion version)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public string GetPackageFileName (IPackage package)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public string GetPackageFileName (string packageId, SemanticVersion version)
+ {
+ throw new NotImplementedException ();
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepository.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepository.cs
new file mode 100644
index 0000000000..2e7bffe160
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepository.cs
@@ -0,0 +1,96 @@
+//
+// FakePackageRepository.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageRepository : IRecentPackageRepository, IProgressProvider
+ {
+ public List<FakePackage> FakePackages = new List<FakePackage> ();
+ public bool IsRemovePackageCalled;
+ public List<IPackage> PackagesAdded = new List<IPackage> ();
+
+ public IPackage FirstPackageAdded {
+ get { return PackagesAdded [0]; }
+ }
+
+ public IQueryable<IPackage> GetPackages ()
+ {
+ return FakePackages.AsQueryable ();
+ }
+
+ public void AddPackage (IPackage package)
+ {
+ PackagesAdded.Add (package);
+ }
+
+ public void RemovePackage (IPackage package)
+ {
+ IsRemovePackageCalled = true;
+ FakePackages.Remove (package as FakePackage);
+ }
+
+ public string Source { get; set; }
+
+ public FakePackage AddFakePackage (string packageId)
+ {
+ var package = new FakePackage (packageId);
+ FakePackages.Add (package);
+ return package;
+ }
+
+ public FakePackage AddFakePackageWithVersion (string packageId, string version)
+ {
+ var package = FakePackage.CreatePackageWithVersion (packageId, version);
+ package.IsLatestVersion = package.IsReleaseVersion ();
+ FakePackages.Add (package);
+ return package;
+ }
+
+ public void Clear ()
+ {
+ }
+
+ public bool HasRecentPackages { get; set; }
+ public bool SupportsPrereleasePackages { get; set; }
+ public PackageSaveModes PackageSaveMode { get; set; }
+
+ public event EventHandler<ProgressEventArgs> ProgressAvailable;
+
+ public void RaiseProgressAvailableEvent (ProgressEventArgs e)
+ {
+ if (ProgressAvailable != null) {
+ ProgressAvailable (this, e);
+ }
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryFactory.cs
new file mode 100644
index 0000000000..ce13a5d447
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryFactory.cs
@@ -0,0 +1,114 @@
+//
+// FakePackageRepositoryFactory.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageRepositoryFactory : IPackageRepositoryCache
+ {
+ public List<string> PackageSourcesPassedToCreateRepository
+ = new List<string> ();
+
+ public string FirstPackageSourcePassedToCreateRepository {
+ get { return PackageSourcesPassedToCreateRepository [0]; }
+ }
+
+ public FakePackageRepository FakePackageRepository = new FakePackageRepository ();
+
+ public Dictionary<string, FakePackageRepository> FakePackageRepositories =
+ new Dictionary<string, FakePackageRepository> ();
+
+ public IPackageRepository CreateRepository (string packageSource)
+ {
+ PackageSourcesPassedToCreateRepository.Add (packageSource);
+
+ FakePackageRepository repository = null;
+ if (FakePackageRepositories.TryGetValue (packageSource, out repository)) {
+ return repository;
+ }
+
+ return FakePackageRepository;
+ }
+
+ public IPackagePathResolver PathResolverPassedToCreateSharedRepository;
+ public IFileSystem FileSystemPassedToCreateSharedRepository;
+ public IFileSystem ConfigSettingsFileSystemPassedToCreateSharedRepository;
+ public FakeSharedPackageRepository FakeSharedRepository = new FakeSharedPackageRepository ();
+
+ public ISharedPackageRepository CreateSharedRepository (IPackagePathResolver pathResolver, IFileSystem fileSystem, IFileSystem configSettingsFileSystem)
+ {
+ PathResolverPassedToCreateSharedRepository = pathResolver;
+ FileSystemPassedToCreateSharedRepository = fileSystem;
+ ConfigSettingsFileSystemPassedToCreateSharedRepository = configSettingsFileSystem;
+ return FakeSharedRepository;
+ }
+
+ public FakePackageRepository FakeAggregateRepository = new FakePackageRepository ();
+
+ public IPackageRepository CreateAggregateRepository ()
+ {
+ return FakeAggregateRepository;
+ }
+
+ public FakeRecentPackageRepository FakeRecentPackageRepository = new FakeRecentPackageRepository ();
+ public IList<RecentPackageInfo> RecentPackagesPassedToCreateRecentPackageRepository;
+ public IPackageRepository AggregateRepositoryPassedToCreateRecentPackageRepository;
+
+ public IRecentPackageRepository CreateRecentPackageRepository (
+ IList<RecentPackageInfo> recentPackages,
+ IPackageRepository aggregateRepository)
+ {
+ RecentPackagesPassedToCreateRecentPackageRepository = recentPackages;
+ AggregateRepositoryPassedToCreateRecentPackageRepository = aggregateRepository;
+ return FakeRecentPackageRepository;
+ }
+
+ public IEnumerable<IPackageRepository> RepositoriesPassedToCreateAggregateRepository;
+
+ public IPackageRepository CreateAggregateRepository (IEnumerable<IPackageRepository> repositories)
+ {
+ RepositoriesPassedToCreateAggregateRepository = repositories;
+ return FakeAggregateRepository;
+ }
+
+ public FakePackageRepository AddFakePackageRepositoryForPackageSource (string source)
+ {
+ var repository = new FakePackageRepository ();
+ FakePackageRepositories.Add (source, repository);
+ return repository;
+ }
+
+ public IRecentPackageRepository RecentPackageRepository {
+ get { return FakeRecentPackageRepository; }
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryFactoryEvents.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryFactoryEvents.cs
new file mode 100644
index 0000000000..867e7c83de
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryFactoryEvents.cs
@@ -0,0 +1,44 @@
+//
+// FakePackageRepositoryFactoryEvents.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ public class FakePackageRepositoryFactoryEvents : IPackageRepositoryFactoryEvents
+ {
+ public event EventHandler<PackageRepositoryFactoryEventArgs> RepositoryCreated;
+
+ public void RaiseRepositoryCreatedEvent (PackageRepositoryFactoryEventArgs e)
+ {
+ if (RepositoryCreated != null) {
+ RepositoryCreated (this, e);
+ }
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryWithHttpClientEvents.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryWithHttpClientEvents.cs
new file mode 100644
index 0000000000..52b998248d
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryWithHttpClientEvents.cs
@@ -0,0 +1,44 @@
+//
+// FakePackageRepositoryWithHttpClientEvents.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageRepositoryWithHttpClientEvents : FakePackageRepository, IHttpClientEvents
+ {
+ public event EventHandler<WebRequestEventArgs> SendingRequest;
+
+ public void RaiseSendingRequestEvent (WebRequestEventArgs e)
+ {
+ if (SendingRequest != null) {
+ SendingRequest (this, e);
+ }
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageViewModelFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageViewModelFactory.cs
new file mode 100644
index 0000000000..52b88e9c19
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageViewModelFactory.cs
@@ -0,0 +1,72 @@
+//
+// FakePackageViewModelFactory.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageViewModelFactory : IPackageViewModelFactory
+ {
+ public FakePackageManagementSolution FakeSolution = new FakePackageManagementSolution ();
+ PackageManagementEvents packageManagementEvents = new PackageManagementEvents ();
+ public FakeLogger FakeLogger = new FakeLogger ();
+
+ public PackageViewModel CreatePackageViewModel (IPackageViewModelParent parent, IPackageFromRepository package)
+ {
+ SelectedProjects = new PackageManagementSelectedProjects (FakeSolution);
+ return new PackageViewModel (
+ parent,
+ package,
+ SelectedProjects,
+ PackageManagementEvents,
+ null,
+ FakeLogger);
+ }
+
+ public IPackageManagementSolution Solution {
+ get { return FakeSolution; }
+ }
+
+ public PackageManagementSelectedProjects SelectedProjects { get; set; }
+
+ public ILogger Logger {
+ get { return FakeLogger; }
+ }
+
+ public IPackageManagementEvents PackageManagementEvents {
+ get { return packageManagementEvents; }
+ }
+
+ public IPackageActionRunner PackageActionRunner {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProcess.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProcess.cs
new file mode 100644
index 0000000000..376be932ab
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProcess.cs
@@ -0,0 +1,42 @@
+//
+// FakeProcess.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeProcess : IProcess
+ {
+ public string FileNamePassedToStart;
+
+ public void Start (string fileName)
+ {
+ FileNamePassedToStart = fileName;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProgressMonitor.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProgressMonitor.cs
new file mode 100644
index 0000000000..a06a2dc3df
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProgressMonitor.cs
@@ -0,0 +1,126 @@
+//
+// FakeProgressMonitor.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.IO;
+using System.Text;
+using MonoDevelop.Core;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeProgressMonitor : IProgressMonitor
+ {
+ public event MonitorHandler CancelRequested;
+
+ protected virtual void OnCancelRequested (IProgressMonitor monitor)
+ {
+ var handler = CancelRequested;
+ if (handler != null)
+ handler (monitor);
+ }
+
+ public FakeProgressMonitor ()
+ {
+ Log = new StringWriter (LoggedMessages);
+ }
+
+ public void BeginTask (string name, int totalWork)
+ {
+ BeginTaskTotalWork = totalWork;
+ }
+
+ public int BeginTaskTotalWork;
+
+ public void BeginStepTask (string name, int totalWork, int stepSize)
+ {
+ }
+
+ public void EndTask ()
+ {
+ IsTaskEnded = true;
+ }
+
+ public bool IsTaskEnded;
+
+ public void Step (int work)
+ {
+ StepCalledCount++;
+ TotalStepWork += work;
+ }
+
+ public int StepCalledCount;
+ public int TotalStepWork;
+
+ public void ReportWarning (string message)
+ {
+ ReportedWarningMessage = message;
+ }
+
+ public string ReportedWarningMessage;
+
+ public void ReportSuccess (string message)
+ {
+ ReportedSuccessMessage = message;
+ }
+
+ public string ReportedSuccessMessage;
+
+ public void ReportError (string message, Exception exception)
+ {
+ ReportedErrorMessage = message;
+ }
+
+ public string ReportedErrorMessage;
+
+ public StringBuilder LoggedMessages = new StringBuilder ();
+
+ public void AssertMessageIsLogged (string message)
+ {
+ string log = LoggedMessages.ToString ();
+ Assert.IsTrue (log.Contains (message), log);
+ }
+
+ public void AssertMessageIsNotLogged (string message)
+ {
+ string log = LoggedMessages.ToString ();
+ Assert.IsFalse (log.Contains (message), log);
+ }
+
+ public TextWriter Log { get; set; }
+ public bool IsCancelRequested { get; set; }
+ public IAsyncOperation AsyncOperation { get; set; }
+ public object SyncRoot { get; set; }
+
+ public void Dispose ()
+ {
+ IsDisposed = true;
+ }
+
+ public bool IsDisposed;
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProgressMonitorFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProgressMonitorFactory.cs
new file mode 100644
index 0000000000..90e62b3268
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProgressMonitorFactory.cs
@@ -0,0 +1,44 @@
+//
+// FakeProgressMonitorFactory.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using MonoDevelop.Core;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeProgressMonitorFactory : IPackageManagementProgressMonitorFactory
+ {
+ public FakeProgressMonitor ProgressMonitor = new FakeProgressMonitor ();
+ public string StatusText;
+
+ public IProgressMonitor CreateProgressMonitor (string statusText)
+ {
+ StatusText = statusText;
+ return ProgressMonitor;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProject.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProject.cs
new file mode 100644
index 0000000000..8d71ae6e85
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProject.cs
@@ -0,0 +1,61 @@
+//
+// FakeProject.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections;
+using MonoDevelop.Core;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeProject : IProject
+ {
+ public string Name { get; set; }
+ public FilePath FileName { get; set; }
+ public FilePath BaseDirectory { get; set; }
+ public ISolution ParentSolution { get; set; }
+ public IDictionary ExtendedProperties { get; set; }
+
+ public FakeProject ()
+ {
+ ExtendedProperties = new Hashtable ();
+ }
+
+ public FakeProject (string fileName)
+ : this ()
+ {
+ FileName = new FilePath (fileName.ToNativePath ());
+ BaseDirectory = FileName.ParentDirectory;
+ }
+
+ public bool IsSaved;
+
+ public virtual void Save ()
+ {
+ IsSaved = true;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectManager.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectManager.cs
new file mode 100644
index 0000000000..b3d90c6e6f
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectManager.cs
@@ -0,0 +1,209 @@
+//
+// FakeProjectManager.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using System.Collections.Generic;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeProjectManager : ISharpDevelopProjectManager
+ {
+ public FakePackageRepository FakeLocalRepository {
+ get { return LocalRepository as FakePackageRepository; }
+ set { LocalRepository = value; }
+ }
+
+ public FakePackageRepository FakeSourceRepository {
+ get { return SourceRepository as FakePackageRepository; }
+ set { SourceRepository = value; }
+ }
+
+ public bool IsInstalledReturnValue;
+
+ public FakeProjectManager ()
+ {
+ LocalRepository = new FakePackageRepository ();
+ SourceRepository = new FakePackageRepository ();
+ }
+
+ public event EventHandler<PackageOperationEventArgs> PackageReferenceAdded;
+
+ protected virtual void OnPackageReferenceAdded (IPackage package)
+ {
+ if (PackageReferenceAdded != null) {
+ PackageReferenceAdded (this, new PackageOperationEventArgs (package, null, String.Empty));
+ }
+ }
+
+ public event EventHandler<PackageOperationEventArgs> PackageReferenceRemoved;
+
+ protected virtual void OnPackageReferenceRemoved (PackageOperationEventArgs eventArgs)
+ {
+ if (PackageReferenceRemoved != null) {
+ PackageReferenceRemoved (this, eventArgs);
+ }
+ }
+
+ #pragma warning disable 67
+ public event EventHandler<PackageOperationEventArgs> PackageReferenceAdding;
+ public event EventHandler<PackageOperationEventArgs> PackageReferenceRemoving;
+ #pragma warning restore 67
+
+ public IPackageRepository LocalRepository { get; set; }
+
+ public ILogger Logger { get; set; }
+
+ public IPackageRepository SourceRepository { get; set; }
+
+ public IPackagePathResolver PathResolver { get; set; }
+
+ public IProjectSystem Project {
+ get { return FakeProjectSystem; }
+ set { FakeProjectSystem = value as FakeProjectSystem; }
+ }
+
+ public FakeProjectSystem FakeProjectSystem = new FakeProjectSystem ();
+
+ public void RemovePackageReference (string packageId, bool forceRemove, bool removeDependencies)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public IPackage PackagePassedToIsInstalled;
+
+ public bool IsInstalled (IPackage package)
+ {
+ PackagePassedToIsInstalled = package;
+ return IsInstalledReturnValue;
+ }
+
+ public string PackageIdPassedToIsInstalled;
+
+ public bool IsInstalled (string packageId)
+ {
+ PackageIdPassedToIsInstalled = packageId;
+ return IsInstalledReturnValue;
+ }
+
+ public void FirePackageReferenceAdded (IPackage package)
+ {
+ OnPackageReferenceAdded (package);
+ }
+
+ public void FirePackageReferenceRemoved (IPackage package)
+ {
+ FirePackageReferenceRemoved (new PackageOperationEventArgs (package, null, String.Empty));
+ }
+
+ public void FirePackageReferenceRemoved (PackageOperationEventArgs eventArgs)
+ {
+ OnPackageReferenceRemoved (eventArgs);
+ }
+
+ public void AddPackageReference (IPackage package, bool ignoreDependencies, bool allowPrereleaseVersions)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void RemovePackageReference (IPackage package, bool forceRemove, bool removeDependencies)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void AddPackageReference (string packageId, SemanticVersion version, bool ignoreDependencies, bool allowPrereleaseVersions)
+ {
+ string key = packageId + version.ToString ();
+ if (addPackageReferenceCallbacks.ContainsKey (key)) {
+ Action callback = addPackageReferenceCallbacks [key];
+ callback ();
+ }
+ }
+
+ Dictionary<string, Action> addPackageReferenceCallbacks = new Dictionary<string, Action> ();
+
+ public void WhenAddPackageReferenceCalled (string id, SemanticVersion version, Action callback)
+ {
+ string key = id + version.ToString ();
+ addPackageReferenceCallbacks.Add (key, callback);
+ }
+
+ public void UpdatePackageReference (string packageId, SemanticVersion version, bool updateDependencies, bool allowPrereleaseVersions)
+ {
+ string key = packageId + version.ToString ();
+ if (updatePackageReferenceCallbacks.ContainsKey (key)) {
+ Action callback = updatePackageReferenceCallbacks [key];
+ callback ();
+ }
+ }
+
+ Dictionary<string, Action> updatePackageReferenceCallbacks = new Dictionary<string, Action> ();
+
+ public void WhenUpdatePackageReferenceCalled (string id, SemanticVersion version, Action callback)
+ {
+ string key = id + version.ToString ();
+ updatePackageReferenceCallbacks.Add (key, callback);
+ }
+
+ public void UpdatePackageReference (string packageId, IVersionSpec versionSpec, bool updateDependencies, bool allowPrereleaseVersions)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public IPackage PackagePassedToHasOlderPackageInstalled;
+ public bool HasOlderPackageInstalledReturnValue;
+
+ public bool HasOlderPackageInstalled (IPackage package)
+ {
+ PackagePassedToHasOlderPackageInstalled = package;
+ return HasOlderPackageInstalledReturnValue;
+ }
+
+ public DependencyVersion DependencyVersion {
+ get {
+ throw new NotImplementedException ();
+ }
+ set {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public bool WhatIf {
+ get {
+ throw new NotImplementedException ();
+ }
+ set {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public void UpdatePackageReference (IPackage remotePackage, bool updateDependencies, bool allowPrereleaseVersions)
+ {
+ throw new NotImplementedException ();
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectSystem.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectSystem.cs
new file mode 100644
index 0000000000..0b898101fa
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectSystem.cs
@@ -0,0 +1,99 @@
+//
+// FakeProjectSystem.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Runtime.Versioning;
+
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeProjectSystem : FakeFileSystem, IProjectSystem
+ {
+ public FrameworkName TargetFramework {
+ get { return new FrameworkName(".NETFramework, Version=v4.0"); }
+ }
+
+ public string ProjectName {
+ get { return String.Empty; }
+ }
+
+ public dynamic GetPropertyValue(string propertyName)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void AddReference(string referencePath, Stream stream)
+ {
+ throw new NotImplementedException();
+ }
+
+ public bool ReferenceExists(string name)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void RemoveReference(string name)
+ {
+ throw new NotImplementedException();
+ }
+
+ public bool IsSupportedFile(string path)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void AddFrameworkReference(string name)
+ {
+ throw new NotImplementedException();
+ }
+
+ public string ResolvePath(string path)
+ {
+ throw new NotImplementedException();
+ }
+
+ public bool IsBindingRedirectSupported { get; set; }
+
+ public void AddImport(string targetPath, ProjectImportLocation location)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void RemoveImport(string targetPath)
+ {
+ throw new NotImplementedException();
+ }
+
+ public bool FileExistsInProject(string path)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectSystemFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectSystemFactory.cs
new file mode 100644
index 0000000000..fc88fcd103
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectSystemFactory.cs
@@ -0,0 +1,45 @@
+//
+// FakeProjectSystemFactory.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Projects;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeProjectSystemFactory : ISharpDevelopProjectSystemFactory
+ {
+ public FakeProjectSystem FakeProjectSystem = new FakeProjectSystem ();
+
+ public IProjectSystem CreateProjectSystem (DotNetProject project)
+ {
+ return FakeProjectSystem;
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeRecentPackageRepository.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeRecentPackageRepository.cs
new file mode 100644
index 0000000000..40d2fec5df
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeRecentPackageRepository.cs
@@ -0,0 +1,68 @@
+//
+// FakeRecentPackageRepository.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeRecentPackageRepository : IRecentPackageRepository
+ {
+ public string Source { get; set; }
+
+ public List<FakePackage> FakePackages = new List<FakePackage> ();
+
+ public IQueryable<IPackage> GetPackages ()
+ {
+ return FakePackages.AsQueryable ();
+ }
+
+ public void AddPackage (IPackage package)
+ {
+ }
+
+ public void RemovePackage (IPackage package)
+ {
+ }
+
+ public bool IsClearCalled;
+
+ public void Clear ()
+ {
+ IsClearCalled = true;
+ }
+
+ public bool HasRecentPackages { get; set; }
+
+ public bool SupportsPrereleasePackages { get; set; }
+
+ public PackageSaveModes PackageSaveMode { get; set; }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeRegisteredPackageRepositories.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeRegisteredPackageRepositories.cs
new file mode 100644
index 0000000000..a0c313e0e2
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeRegisteredPackageRepositories.cs
@@ -0,0 +1,122 @@
+//
+// FakeRegisteredPackageRepositories.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeRegisteredPackageRepositories : IRegisteredPackageRepositories
+ {
+ public FakeRegisteredPackageRepositories ()
+ {
+ PackageSources = new RegisteredPackageSources (new PackageSource[0]);
+ }
+
+ public FakePackageRepository FakeActiveRepository = new FakePackageRepository ();
+
+ public virtual IPackageRepository ActiveRepository {
+ get { return FakeActiveRepository; }
+ }
+
+ public FakePackageRepository FakeRecentPackageRepository = new FakePackageRepository ();
+
+ public IRecentPackageRepository RecentPackageRepository {
+ get { return FakeRecentPackageRepository; }
+ }
+
+ public bool HasMultiplePackageSources { get; set; }
+
+ public PackageSource ActivePackageSource { get; set; }
+
+ public RegisteredPackageSources PackageSources { get; set; }
+
+ public FakePackageRepository FakePackageRepository = new FakePackageRepository ();
+ public PackageSource PackageSourcePassedToCreateRepository;
+
+ public IPackageRepository CreateRepository (PackageSource source)
+ {
+ PackageSourcePassedToCreateRepository = source;
+ return FakePackageRepository;
+ }
+
+ public FakePackageRepository FakeAggregateRepository = new FakePackageRepository ();
+
+ public IPackageRepository CreateAggregateRepository ()
+ {
+ return FakeAggregateRepository;
+ }
+
+ public void ClearPackageSources ()
+ {
+ PackageSources.Clear ();
+ }
+
+ public PackageSource AddOnePackageSource ()
+ {
+ return AddOnePackageSource ("Test");
+ }
+
+ public PackageSource AddOnePackageSource (string name)
+ {
+ var source = new PackageSource ("http://sharpdevelop.codeplex.com", name);
+ PackageSources.Add (source);
+ return source;
+ }
+
+ public void AddPackageSources (IEnumerable<PackageSource> sources)
+ {
+ PackageSources.AddRange (sources);
+ }
+
+ public FakePackage AddFakePackageWithVersionToActiveRepository (string version)
+ {
+ return AddFakePackageWithVersionToActiveRepository ("Test", version);
+ }
+
+ public FakePackage AddFakePackageWithVersionToActiveRepository (string id, string version)
+ {
+ var package = FakePackage.CreatePackageWithVersion (id, version);
+ FakeActiveRepository.FakePackages.Add (package);
+ return package;
+ }
+
+ public FakePackage AddFakePackageWithVersionToAggregrateRepository (string id, string version)
+ {
+ var package = FakePackage.CreatePackageWithVersion (id, version);
+ FakeAggregateRepository.FakePackages.Add (package);
+ return package;
+ }
+
+ public void UpdatePackageSources (IEnumerable<PackageSource> updatedPackageSources)
+ {
+ throw new NotImplementedException ();
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeServiceBasedRepository.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeServiceBasedRepository.cs
new file mode 100644
index 0000000000..7fdd0270b9
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeServiceBasedRepository.cs
@@ -0,0 +1,65 @@
+//
+// FakeServiceBasedRepository.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.Versioning;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeServiceBasedRepository : FakePackageRepository, IServiceBasedRepository
+ {
+ Dictionary<string, List<IPackage>> repositoryPackages = new Dictionary<string, List<IPackage>> ();
+
+ public IQueryable<IPackage> Search (string searchTerm, IEnumerable<string> targetFrameworks, bool allowPrereleaseVersions)
+ {
+ string key = GetKey (searchTerm, allowPrereleaseVersions);
+ if (repositoryPackages.ContainsKey (key)) {
+ return repositoryPackages [key].AsQueryable ();
+ }
+ return new List<IPackage> ().AsQueryable ();
+ }
+
+ string GetKey (string searchTerm, bool allowPrereleaseVersions)
+ {
+ return searchTerm + allowPrereleaseVersions.ToString ();
+ }
+
+ public void PackagesToReturnForSearch (string search, bool allowPrereleaseVersions, IEnumerable<IPackage> packages)
+ {
+ string key = GetKey (search, allowPrereleaseVersions);
+ repositoryPackages.Add (key, packages.ToList ());
+ }
+
+ public IEnumerable<IPackage> GetUpdates (IEnumerable<IPackageName> packages, bool includePrerelease, bool includeAllVersions, IEnumerable<FrameworkName> targetFrameworks, IEnumerable<IVersionSpec> versionConstraints)
+ {
+ throw new NotImplementedException ();
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSettings.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSettings.cs
new file mode 100644
index 0000000000..a96cc48c92
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSettings.cs
@@ -0,0 +1,238 @@
+//
+// FakeSettings.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using System.Linq;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ /// <summary>
+ /// TODO: Remove this class. Replace it with the actual NuGet.Settings class but
+ /// use a fake IFileSystem instead. There is too much implementation in this test
+ /// helper class and it makes the tests brittle now that we are using the
+ /// NuGet.PackageSourceProvider instead of directly accessing the ISettings.
+ /// </summary>
+ public class FakeSettings : ISettings
+ {
+ public List<KeyValuePair<string, string>> PackageSources
+ = new List<KeyValuePair<string, string>> ();
+
+ public List<KeyValuePair<string, string>> DisabledPackageSources
+ = new List<KeyValuePair<string, string>> ();
+
+ public List<KeyValuePair<string, string>> ActivePackageSourceSettings =
+ new List<KeyValuePair<string, string>> ();
+
+ public Dictionary<string, IList<KeyValuePair<string, string>>> Sections
+ = new Dictionary<string, IList<KeyValuePair<string, string>>> ();
+
+ public const string PackageSourcesSectionName = "packageSources";
+ public const string DisabledPackageSourcesSectionName = "disabledPackageSources";
+
+ public FakeSettings ()
+ {
+ Sections.Add (PackageSourcesSectionName, PackageSources);
+ Sections.Add (RegisteredPackageSourceSettings.ActivePackageSourceSectionName, ActivePackageSourceSettings);
+ Sections.Add (DisabledPackageSourcesSectionName, DisabledPackageSources);
+ }
+
+ public string GetValue (string section, string key)
+ {
+ 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)
+ {
+ return Sections [section];
+ }
+
+ public void AddFakePackageSource (PackageSource packageSource)
+ {
+ var valuePair = new KeyValuePair<string, string> (packageSource.Name, packageSource.Source);
+ PackageSources.Add (valuePair);
+ }
+
+ public Dictionary<string, KeyValuePair<string, string>> SavedSectionValues =
+ new Dictionary<string, KeyValuePair<string, string>> ();
+
+ public void SetValue (string section, string key, string value)
+ {
+ SavedSectionValues.Remove (section);
+ SavedSectionValues.Add (section, new KeyValuePair<string, string> (key, value));
+ }
+
+ public KeyValuePair<string, string> GetValuePassedToSetValueForActivePackageSourceSection ()
+ {
+ return SavedSectionValues [RegisteredPackageSourceSettings.ActivePackageSourceSectionName];
+ }
+
+ public void SetValues (string section, IList<KeyValuePair<string, string>> values)
+ {
+ SavedSectionValueLists.Remove (section);
+ SavedSectionValueLists.Add (section, values);
+ }
+
+ public Dictionary<string, IList<KeyValuePair<string, string>>> SavedSectionValueLists
+ = new Dictionary<string, IList<KeyValuePair<string, string>>> ();
+
+ public IList<KeyValuePair<string, string>> GetValuesPassedToSetValuesForPackageSourcesSection ()
+ {
+ return SavedSectionValueLists [PackageSourcesSectionName];
+ }
+
+ public bool DeleteValue (string section, string key)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public List<string> SectionsDeleted = new List<string> ();
+
+ public bool DeleteSection (string section)
+ {
+ SectionsDeleted.Add (section);
+ return true;
+ }
+
+ public bool IsPackageSourcesSectionDeleted {
+ get {
+ return SectionsDeleted.Contains (PackageSourcesSectionName);
+ }
+ }
+
+ public bool IsDisabledPackageSourcesSectionDeleted {
+ get {
+ return SectionsDeleted.Contains (DisabledPackageSourcesSectionName);
+ }
+ }
+
+ public bool IsActivePackageSourceSectionDeleted {
+ get {
+ return SectionsDeleted.Contains (RegisteredPackageSourceSettings.ActivePackageSourceSectionName);
+ }
+ }
+
+ public void SetFakeActivePackageSource (PackageSource packageSource)
+ {
+ ActivePackageSourceSettings.Clear ();
+ var valuePair = new KeyValuePair<string, string> (packageSource.Name, packageSource.Source);
+ ActivePackageSourceSettings.Add (valuePair);
+ }
+
+ public void MakeActivePackageSourceSectionNull ()
+ {
+ Sections.Remove (RegisteredPackageSourceSettings.ActivePackageSourceSectionName);
+ Sections.Add (RegisteredPackageSourceSettings.ActivePackageSourceSectionName, null);
+ }
+
+ public void MakePackageSourceSectionsNull ()
+ {
+ Sections.Remove (PackageSourcesSectionName);
+ Sections.Add (PackageSourcesSectionName, null);
+ }
+
+ public void AddFakePackageSources (IEnumerable<PackageSource> packageSources)
+ {
+ foreach (PackageSource packageSource in packageSources) {
+ AddFakePackageSource (packageSource);
+ }
+ }
+
+ public IList<KeyValuePair<string, string>> GetNestedValues (string section, string key)
+ {
+ return new List<KeyValuePair<string, string>> ();
+ }
+
+ public void SetNestedValues (string section, string key, IList<KeyValuePair<string, string>> values)
+ {
+ 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 [DisabledPackageSourcesSectionName];
+ }
+
+ public bool AnyValuesPassedToSetValuesForDisabledPackageSourcesSection {
+ get {
+ return SavedSectionValueLists.ContainsKey (DisabledPackageSourcesSectionName);
+ }
+ }
+
+ 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");
+ }
+ }
+
+ public string GetValue (string section, string key, bool isPath)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public IList<KeyValuePair<string, string>> GetValues (string section, bool isPath)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public IList<SettingValue> GetSettingValues (string section, bool isPath)
+ {
+ return Sections [section]
+ .Select (item => new SettingValue (item.Key, item.Value, false))
+ .ToList ();
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSharedPackageRepository.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSharedPackageRepository.cs
new file mode 100644
index 0000000000..f4ecfeec9b
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSharedPackageRepository.cs
@@ -0,0 +1,70 @@
+//
+// FakeSharedPackageRepository.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeSharedPackageRepository : FakePackageRepository, ISharedPackageRepository
+ {
+ public string PathPassedToRegisterRepository;
+
+ public List<string> PackageIdsReferences = new List<string> ();
+ public string PackageIdPassedToIsReferenced;
+ public SemanticVersion VersionPassedToIsReferenced;
+
+ public bool IsReferenced (string packageId, SemanticVersion version)
+ {
+ PackageIdPassedToIsReferenced = packageId;
+ VersionPassedToIsReferenced = version;
+ return PackageIdsReferences.Contains (packageId);
+ }
+
+ public void RegisterRepository (string path)
+ {
+ PathPassedToRegisterRepository = path;
+ }
+
+ public void UnregisterRepository (string path)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void AddPackageReferenceEntry (string packageId, SemanticVersion version)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public bool IsSolutionReferenced (string packageId, SemanticVersion version)
+ {
+ throw new NotImplementedException ();
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolution.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolution.cs
new file mode 100644
index 0000000000..6eaa5f6096
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolution.cs
@@ -0,0 +1,48 @@
+//
+// FakeSolution.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using MonoDevelop.Core;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeSolution : ISolution
+ {
+ public FilePath BaseDirectory { get; set; }
+ public FilePath FileName { get; set; }
+
+ public FakeSolution ()
+ {
+ }
+
+ public FakeSolution (string fileName)
+ {
+ FileName = new FilePath (fileName.ToNativePath ());
+ BaseDirectory = FileName.ParentDirectory;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolutionPackageRepository.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolutionPackageRepository.cs
new file mode 100644
index 0000000000..26be2ad35d
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolutionPackageRepository.cs
@@ -0,0 +1,86 @@
+//
+// FakeSolutionPackageRepository.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeSolutionPackageRepository : ISolutionPackageRepository
+ {
+ public FakeSharedPackageRepository FakeSharedRepository = new FakeSharedPackageRepository ();
+
+ public List<FakePackage> FakePackages;
+
+ public FakeSolutionPackageRepository ()
+ {
+ FakePackages = FakeSharedRepository.FakePackages;
+ }
+
+ public string InstallPathToReturn;
+ public IPackage PackagePassedToGetInstallPath;
+
+ public string GetInstallPath (IPackage package)
+ {
+ PackagePassedToGetInstallPath = package;
+ return InstallPathToReturn;
+ }
+
+ public IEnumerable<IPackage> GetPackagesByDependencyOrder ()
+ {
+ return FakePackages;
+ }
+
+ public List<FakePackage> FakePackagesByReverseDependencyOrder = new List<FakePackage> ();
+
+ public IEnumerable<IPackage> GetPackagesByReverseDependencyOrder ()
+ {
+ return FakePackagesByReverseDependencyOrder;
+ }
+
+ public bool IsInstalled (IPackage package)
+ {
+ return FakeSharedRepository.FakePackages.Exists (p => p == package);
+ }
+
+ public IQueryable<IPackage> GetPackages ()
+ {
+ return FakeSharedRepository.FakePackages.AsQueryable ();
+ }
+
+ public ISharedPackageRepository Repository {
+ get { return FakeSharedRepository; }
+ }
+
+ public IFileSystem FileSystem { get; set; }
+
+ public IPackagePathResolver PackagePathResolver { get; set; }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolutionPackageRepositoryFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolutionPackageRepositoryFactory.cs
new file mode 100644
index 0000000000..4cc0386417
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolutionPackageRepositoryFactory.cs
@@ -0,0 +1,45 @@
+//
+// FakeSolutionPackageRepositoryFactory.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeSolutionPackageRepositoryFactory : ISolutionPackageRepositoryFactory
+ {
+ public FakeSolutionPackageRepository FakeSolutionPackageRepository = new FakeSolutionPackageRepository ();
+ public ISolution SolutionPassedToCreateSolutionPackageRepository;
+
+ public ISolutionPackageRepository CreateSolutionPackageRepository (ISolution solution)
+ {
+ SolutionPassedToCreateSolutionPackageRepository = solution;
+ return FakeSolutionPackageRepository;
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeTask.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeTask.cs
new file mode 100644
index 0000000000..0743a8ba33
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeTask.cs
@@ -0,0 +1,89 @@
+//
+// FakeTask.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeTask<TResult> : ITask<TResult>
+ {
+ public bool IsStartCalled;
+ public bool IsCancelCalled;
+
+ public bool RunTaskSynchronously;
+
+ Func<TResult> function;
+ Action<ITask<TResult>> continueWith;
+
+ public FakeTask (Func<TResult> function, Action<ITask<TResult>> continueWith, bool runTaskSynchronously)
+ {
+ this.function = function;
+ this.continueWith = continueWith;
+ RunTaskSynchronously = runTaskSynchronously;
+ Exception = new AggregateException (new Exception ("FakeTaskAggregateInnerException"));
+ }
+
+ public void Start ()
+ {
+ IsStartCalled = true;
+ if (RunTaskSynchronously) {
+ ExecuteTaskCompletely ();
+ }
+ }
+
+ public TResult Result { get; set; }
+
+ public void ExecuteTaskCompletely ()
+ {
+ ExecuteTaskButNotContinueWith ();
+ ExecuteContinueWith ();
+ }
+
+ public TResult ExecuteTaskButNotContinueWith ()
+ {
+ Result = function ();
+ return Result;
+ }
+
+ public void ExecuteContinueWith ()
+ {
+ continueWith (this);
+ }
+
+ public void Cancel ()
+ {
+ IsCancelCalled = true;
+ }
+
+ public bool IsCancelled { get; set; }
+
+ public bool IsFaulted { get; set; }
+
+ public AggregateException Exception { get; set; }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeTaskFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeTaskFactory.cs
new file mode 100644
index 0000000000..86acede7b5
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeTaskFactory.cs
@@ -0,0 +1,67 @@
+//
+// FakeTaskFactory.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeTaskFactory : ITaskFactory
+ {
+ public bool IsCreateTaskCalled;
+ public bool RunTasksSynchronously;
+
+ public FakeTask<PackagesForSelectedPageResult> FirstFakeTaskCreated {
+ get { return FakeTasksCreated [0] as FakeTask<PackagesForSelectedPageResult>; }
+ }
+
+ public List<object> FakeTasksCreated = new List<object> ();
+
+ public ITask<TResult> CreateTask<TResult> (
+ Func<TResult> function,
+ Action<ITask<TResult>> continueWith)
+ {
+ IsCreateTaskCalled = true;
+ var task = new FakeTask<TResult> (function, continueWith, RunTasksSynchronously);
+ FakeTasksCreated.Add (task);
+ return task;
+ }
+
+ public void ExecuteAllFakeTasks ()
+ {
+ foreach (FakeTask<PackagesForSelectedPageResult> task in FakeTasksCreated) {
+ task.ExecuteTaskCompletely ();
+ }
+ }
+
+ public void ClearAllFakeTasks ()
+ {
+ FakeTasksCreated.Clear ();
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeUninstallPackageAction.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeUninstallPackageAction.cs
new file mode 100644
index 0000000000..16f7ce1c82
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeUninstallPackageAction.cs
@@ -0,0 +1,51 @@
+//
+// FakeUninstallPackageAction.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeUninstallPackageAction : UninstallPackageAction
+ {
+ public bool IsExecuted;
+
+ public FakeUninstallPackageAction (IPackageManagementProject project)
+ : base (project, null)
+ {
+ }
+
+ protected override void ExecuteCore ()
+ {
+ IsExecuted = true;
+ }
+
+ protected override void BeforeExecute ()
+ {
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeUpdatePackageAction.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeUpdatePackageAction.cs
new file mode 100644
index 0000000000..069cc62210
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeUpdatePackageAction.cs
@@ -0,0 +1,59 @@
+//
+// FakeUpdatePackageAction.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeUpdatePackageAction : UpdatePackageAction
+ {
+ public bool IsExecuted;
+
+ public FakePackageManagementProject FakeProject;
+
+ public FakeUpdatePackageAction ()
+ : this (new FakePackageManagementProject ())
+ {
+ }
+
+ public FakeUpdatePackageAction (IPackageManagementProject project)
+ : base (project, null)
+ {
+ FakeProject = project as FakePackageManagementProject;
+ }
+
+ protected override void ExecuteCore ()
+ {
+ IsExecuted = true;
+ }
+
+ protected override void BeforeExecute ()
+ {
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeWebRequest.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeWebRequest.cs
new file mode 100644
index 0000000000..f071e47439
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeWebRequest.cs
@@ -0,0 +1,42 @@
+//
+// FakeWebRequest.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Net;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ public class FakeWebRequest : WebRequest
+ {
+ public FakeWebRequest ()
+ {
+ Headers = new WebHeaderCollection ();
+ }
+
+ public override WebHeaderCollection Headers { get; set; }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FileNameAndDirectory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FileNameAndDirectory.cs
new file mode 100644
index 0000000000..c15389b660
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FileNameAndDirectory.cs
@@ -0,0 +1,67 @@
+//
+// FileNameAndDirectory.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FileNameAndDirectory
+ {
+ public FileNameAndDirectory ()
+ {
+ }
+
+ public FileNameAndDirectory (string fileName, string folder)
+ {
+ this.FileName = fileName;
+ this.Folder = folder;
+ }
+
+ public string FileName;
+ public string Folder;
+
+ public override bool Equals (object obj)
+ {
+ var rhs = obj as FileNameAndDirectory;
+ if (rhs != null) {
+ return (FileName == rhs.FileName) &&
+ (Folder == rhs.Folder);
+ }
+ return false;
+ }
+
+ public override int GetHashCode ()
+ {
+ return base.GetHashCode ();
+ }
+
+ public override string ToString ()
+ {
+ return String.Format ("[FileNameAndDirectory FileName={0}, Folder={1}]", FileName, Folder);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FileNameAndProjectName.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FileNameAndProjectName.cs
new file mode 100644
index 0000000000..1cb23d7eb3
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FileNameAndProjectName.cs
@@ -0,0 +1,66 @@
+//
+// FileNameAndProjectName.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FileNameAndProjectName
+ {
+ public FileNameAndProjectName ()
+ {
+ }
+
+ public FileNameAndProjectName (string fileName, string projectName)
+ {
+ this.FileName = fileName;
+ this.ProjectName = projectName;
+ }
+
+ public string FileName;
+ public string ProjectName;
+
+ public override bool Equals (object obj)
+ {
+ FileNameAndProjectName rhs = obj as FileNameAndProjectName;
+ if (rhs != null) {
+ return (rhs.FileName == FileName) &&
+ (rhs.ProjectName == ProjectName);
+ }
+ return false;
+ }
+
+ public override int GetHashCode ()
+ {
+ return base.GetHashCode ();
+ }
+
+ public override string ToString ()
+ {
+ return String.Format ("[FileNameAndProjectName FileName={0}, ProjectName={1}]", FileName, ProjectName);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/InstallPackageHelper.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/InstallPackageHelper.cs
new file mode 100644
index 0000000000..303cc48702
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/InstallPackageHelper.cs
@@ -0,0 +1,83 @@
+//
+// InstallPackageHelper.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class InstallPackageHelper
+ {
+ InstallPackageAction action;
+
+ public FakePackage TestPackage = new FakePackage () {
+ Id = "Test"
+ };
+
+ public FakePackageRepository PackageRepository = new FakePackageRepository ();
+ public List<PackageOperation> PackageOperations = new List<PackageOperation> ();
+
+ public InstallPackageHelper (InstallPackageAction action)
+ {
+ this.action = action;
+ }
+
+ public void InstallTestPackage ()
+ {
+ action.Package = TestPackage;
+ action.Operations = PackageOperations;
+ action.IgnoreDependencies = IgnoreDependencies;
+ action.AllowPrereleaseVersions = AllowPrereleaseVersions;
+ action.Execute ();
+ }
+
+ public FakePackage AddPackageInstallOperation ()
+ {
+ var package = new FakePackage ("Package to install");
+ var operation = new PackageOperation (package, PackageAction.Install);
+ PackageOperations.Add (operation);
+ return package;
+ }
+
+ public PackageSource PackageSource = new PackageSource ("http://sharpdevelop/packages");
+ public bool IgnoreDependencies;
+ public bool AllowPrereleaseVersions;
+ public SemanticVersion Version;
+
+ public void InstallPackageById (string packageId)
+ {
+ action.PackageId = packageId;
+ action.PackageVersion = Version;
+ action.IgnoreDependencies = IgnoreDependencies;
+ action.AllowPrereleaseVersions = AllowPrereleaseVersions;
+
+ action.Execute ();
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/OneRegisteredPackageSourceHelper.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/OneRegisteredPackageSourceHelper.cs
new file mode 100644
index 0000000000..dabafdc2ed
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/OneRegisteredPackageSourceHelper.cs
@@ -0,0 +1,86 @@
+//
+// OneRegisteredPackageSourceHelper.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class OneRegisteredPackageSourceHelper
+ {
+ public RegisteredPackageSources RegisteredPackageSources;
+ public TestablePackageManagementOptions Options;
+ public FakeSettings FakeSettings;
+ public PackageSource PackageSource = new PackageSource ("http://sharpdevelop.com", "Test Package Source");
+
+ public OneRegisteredPackageSourceHelper ()
+ {
+ CreateOneRegisteredPackageSource ();
+ }
+
+ void CreateOneRegisteredPackageSource ()
+ {
+ Options = new TestablePackageManagementOptions ();
+ FakeSettings = Options.FakeSettings;
+ RegisteredPackageSources = Options.PackageSources;
+ AddOnePackageSource ();
+ }
+
+ public void AddOnePackageSource ()
+ {
+ RegisteredPackageSources.Clear ();
+ RegisteredPackageSources.Add (PackageSource);
+ }
+
+ public void AddOnePackageSource (string source)
+ {
+ RegisteredPackageSources.Clear ();
+ AddPackageSource (source);
+ }
+
+ public void AddTwoPackageSources ()
+ {
+ AddOnePackageSource ();
+ var packageSource = new PackageSource ("http://second.codeplex.com", "second");
+ RegisteredPackageSources.Add (packageSource);
+ }
+
+ public void AddTwoPackageSources (string source1, string source2)
+ {
+ RegisteredPackageSources.Clear ();
+ AddPackageSource (source1);
+ AddPackageSource (source2);
+ }
+
+ void AddPackageSource (string source)
+ {
+ var packageSource = new PackageSource (source);
+ RegisteredPackageSources.Add (packageSource);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageCollectionAssert.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageCollectionAssert.cs
new file mode 100644
index 0000000000..7b2e29d67c
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageCollectionAssert.cs
@@ -0,0 +1,62 @@
+//
+// PackageCollectionAssert.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public static class PackageCollectionAssert
+ {
+ public static void AreEqual (IEnumerable<IPackage> expectedPackages, IEnumerable<PackageViewModel> actualViewModels)
+ {
+ var expectedPackagesAsList = new List<IPackage> (expectedPackages);
+ List<IPackage> actualPackages = ConvertToPackageList (actualViewModels);
+
+ CollectionAssert.AreEqual (expectedPackagesAsList, actualPackages);
+ }
+
+ static List<IPackage> ConvertToPackageList (IEnumerable<PackageViewModel> viewModels)
+ {
+ var packages = new List<IPackage> ();
+ foreach (PackageViewModel viewModel in viewModels) {
+ packages.Add (viewModel.GetPackage ());
+ }
+ return packages;
+ }
+
+ public static void AreEqual (IEnumerable<IPackage> expectedPackages, IEnumerable<IPackage> actualPackages)
+ {
+ var expectedPackagesAsList = new List<IPackage> (expectedPackages);
+ var actualPackagesAsList = new List<IPackage> (actualPackages);
+
+ CollectionAssert.AreEqual (expectedPackagesAsList, actualPackagesAsList);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageOperationHelper.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageOperationHelper.cs
new file mode 100644
index 0000000000..b1f329d802
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageOperationHelper.cs
@@ -0,0 +1,52 @@
+//
+// PackageOperationHelper.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public static class PackageOperationHelper
+ {
+ public static PackageOperation CreateInstallOperationWithFile (string fileName)
+ {
+ var package = new FakePackage ();
+ package.AddFile (fileName);
+
+ return new PackageOperation (package, PackageAction.Install);
+ }
+
+ public static List<PackageOperation> CreateListWithOneInstallOperationWithFile (string fileName)
+ {
+ PackageOperation operation = CreateInstallOperationWithFile (fileName);
+ var operations = new List<PackageOperation> ();
+ operations.Add (operation);
+ return operations;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageReferenceRepositoryHelper.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageReferenceRepositoryHelper.cs
new file mode 100644
index 0000000000..7eed2a283c
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageReferenceRepositoryHelper.cs
@@ -0,0 +1,57 @@
+//
+// PackageReferenceRepositoryHelper.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class PackageReferenceRepositoryHelper
+ {
+ public FakeSharedPackageRepository FakeSharedSourceRepository = new FakeSharedPackageRepository ();
+ public FakeProjectSystem FakeProjectSystem = new FakeProjectSystem ();
+
+ public PackageReferenceRepositoryHelper ()
+ {
+ Init ();
+ }
+
+ void Init ()
+ {
+ string config =
+ "<root>\r\n" +
+ " <package id='Test' version='1.0.0.0'/>\r\n" +
+ "</root>";
+
+ FakeProjectSystem.FileExistsReturnValue = true;
+ FakeProjectSystem.FileToReturnFromOpenFile = config;
+
+ FakePackage package = new FakePackage ("Test", "1.0.0.0");
+
+ FakeSharedSourceRepository.FakePackages.Add (package);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageSourceCollectionAssert.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageSourceCollectionAssert.cs
new file mode 100644
index 0000000000..8d4d19074b
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageSourceCollectionAssert.cs
@@ -0,0 +1,82 @@
+//
+// PackageSourceCollectionAssert.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class PackageSourceCollectionAssert
+ {
+ public static void AreEqual (IEnumerable<PackageSource> expectedSources, IEnumerable<PackageSourceViewModel> actualViewModels)
+ {
+ List<string> expectedSourcesAsList = ConvertToStrings (expectedSources);
+ List<string> actualSources = ConvertToStrings (actualViewModels);
+
+ CollectionAssert.AreEqual (expectedSourcesAsList, actualSources);
+ }
+
+ public static void AreEqual (IEnumerable<PackageSource> expectedSources, IEnumerable<PackageSource> actualSources)
+ {
+ List<string> expectedSourcesAsList = ConvertToStrings (expectedSources);
+ List<string> actualSourcesAsList = ConvertToStrings (actualSources);
+
+ CollectionAssert.AreEqual (expectedSourcesAsList, actualSourcesAsList);
+ }
+
+ static List<string> ConvertToStrings (IEnumerable<PackageSource> sources)
+ {
+ List<string> convertedSources = new List<string> ();
+ foreach (PackageSource source in sources) {
+ convertedSources.Add (ConvertToString (source));
+ }
+ return convertedSources;
+ }
+
+ static string ConvertToString (PackageSource source)
+ {
+ if (source != null) {
+ return String.Format ("[PackageSource] Name='{0}', Source='{1}'",
+ source.Name,
+ source.Source);
+ }
+ return "[PackageSource] == Null";
+ }
+
+ static List<string> ConvertToStrings (IEnumerable<PackageSourceViewModel> viewModels)
+ {
+ List<string> convertedSources = new List<string> ();
+ foreach (PackageSourceViewModel viewModel in viewModels) {
+ PackageSource source = viewModel.GetPackageSource ();
+ convertedSources.Add (ConvertToString (source));
+ }
+ return convertedSources;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/RecentPackageInfoCollectionAssert.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/RecentPackageInfoCollectionAssert.cs
new file mode 100644
index 0000000000..970b49e684
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/RecentPackageInfoCollectionAssert.cs
@@ -0,0 +1,53 @@
+//
+// RecentPackageInfoCollectionAssert.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public static class RecentPackageInfoCollectionAssert
+ {
+ public static void AreEqual (IEnumerable<RecentPackageInfo> expectedPackages, IEnumerable<RecentPackageInfo> actualPackages)
+ {
+ var expectedPackagesAsList = ConvertToStringList (expectedPackages);
+ var actualPackagesAsList = ConvertToStringList (actualPackages);
+
+ CollectionAssert.AreEqual (expectedPackagesAsList, actualPackagesAsList);
+ }
+
+ static List<string> ConvertToStringList (IEnumerable<RecentPackageInfo> expectedPackages)
+ {
+ var items = new List<string> ();
+ foreach (RecentPackageInfo recentPackage in expectedPackages) {
+ items.Add (recentPackage.ToString ());
+ }
+ return items;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/ReferenceAndProjectName.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/ReferenceAndProjectName.cs
new file mode 100644
index 0000000000..c70e0545f3
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/ReferenceAndProjectName.cs
@@ -0,0 +1,67 @@
+//
+// ReferenceAndProjectName.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class ReferenceAndProjectName
+ {
+ public ReferenceAndProjectName ()
+ {
+ }
+
+ public ReferenceAndProjectName (string reference, string project)
+ {
+ this.Reference = reference;
+ this.Project = project;
+ }
+
+ public string Reference;
+ public string Project;
+
+ public override bool Equals (object obj)
+ {
+ ReferenceAndProjectName rhs = obj as ReferenceAndProjectName;
+ if (rhs != null) {
+ return (rhs.Project == Project) &&
+ (rhs.Reference == Reference);
+ }
+ return false;
+ }
+
+ public override int GetHashCode ()
+ {
+ return base.GetHashCode ();
+ }
+
+ public override string ToString ()
+ {
+ return String.Format ("[ReferenceAndProjectName Reference={0}, Project={1}]", Reference, Project);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/SelectedProjectCollectionAssert.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/SelectedProjectCollectionAssert.cs
new file mode 100644
index 0000000000..aa8cb49aac
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/SelectedProjectCollectionAssert.cs
@@ -0,0 +1,61 @@
+//
+// SelectedProjectCollectionAssert.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public static class SelectedProjectCollectionAssert
+ {
+ public static void AreEqual (
+ IEnumerable<IPackageManagementSelectedProject> expected,
+ IEnumerable<IPackageManagementSelectedProject> actual)
+ {
+ List<string> expectedAsStrings = ConvertToStrings (expected);
+ List<string> actualAsStrings = ConvertToStrings (actual);
+ CollectionAssert.AreEqual (expectedAsStrings, actualAsStrings);
+ }
+
+ static List<string> ConvertToStrings (IEnumerable<IPackageManagementSelectedProject> projects)
+ {
+ var projectsAsString = new List<string> ();
+ foreach (IPackageManagementSelectedProject project in projects) {
+ string text = String.Format (
+ "Name: {0}, IsSelected: {1}, IsEnabled: {2}",
+ project.Name,
+ project.IsSelected,
+ project.IsEnabled);
+ projectsAsString.Add (text);
+ }
+ return projectsAsString;
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestPackageHelper.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestPackageHelper.cs
new file mode 100644
index 0000000000..2ad33ebfd1
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestPackageHelper.cs
@@ -0,0 +1,66 @@
+//
+// TestPackageHelper.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class TestPackageHelper
+ {
+ public FakePackage Package;
+
+ public TestPackageHelper ()
+ : this ("Test", "1.0.0.0")
+ {
+ }
+
+ public TestPackageHelper (string id, string version)
+ {
+ Package = new FakePackage (id, version);
+ }
+
+ public void SetId (string id)
+ {
+ Package.Id = id;
+ }
+
+ public void SetVersion (string version)
+ {
+ Package.Version = new SemanticVersion (version);
+ }
+
+ public void IsLatestVersion ()
+ {
+ Package.IsLatestVersion = true;
+ }
+
+ public void Listed ()
+ {
+ Package.Listed = true;
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableBackgroundPackageActionRunner.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableBackgroundPackageActionRunner.cs
new file mode 100644
index 0000000000..66439b08e1
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableBackgroundPackageActionRunner.cs
@@ -0,0 +1,74 @@
+//
+// TestableBackgroundPackageActionRunner.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Core;
+using MonoDevelop.Ide;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class TestableBackgroundPackageActionRunner : BackgroundPackageActionRunner
+ {
+ MessageHandler backgroundDispatcher;
+
+ public TestableBackgroundPackageActionRunner (
+ IPackageManagementProgressMonitorFactory progressMonitorFactory,
+ IPackageManagementEvents packageManagementEvents,
+ IProgressProvider progressProvider)
+ : base (progressMonitorFactory, packageManagementEvents, progressProvider)
+ {
+ }
+
+ public void ExecuteBackgroundDispatch ()
+ {
+ backgroundDispatcher.Invoke ();
+ }
+
+ protected override void BackgroundDispatch (MessageHandler handler)
+ {
+ backgroundDispatcher = handler;
+ }
+
+ protected override void GuiDispatch (MessageHandler handler)
+ {
+ handler.Invoke ();
+ }
+
+ protected override PackageManagementEventsMonitor CreateEventMonitor (
+ IProgressMonitor monitor,
+ IPackageManagementEvents packageManagementEvents,
+ IProgressProvider progressProvider)
+ {
+ EventsMonitor = new TestablePackageManagementEventsMonitor (monitor, packageManagementEvents, progressProvider);
+ return EventsMonitor;
+ }
+
+ public TestablePackageManagementEventsMonitor EventsMonitor;
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableMonoDevelopProjectSystem.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableMonoDevelopProjectSystem.cs
new file mode 100644
index 0000000000..e115f3a57a
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableMonoDevelopProjectSystem.cs
@@ -0,0 +1,119 @@
+//
+// TestableMonoDevelopProjectSystem.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.IO;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Ide;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class TestableMonoDevelopProjectSystem : SharpDevelopProjectSystem
+ {
+ public string PathPassedToPhysicalFileSystemAddFile;
+ public Stream StreamPassedToPhysicalFileSystemAddFile;
+ public Action<Stream> ActionPassedToPhysicalFileSystemAddFile;
+ public FakeFileService FakeFileService;
+ public FakePackageManagementProjectService FakeProjectService;
+ public FakeLogger FakeLogger;
+ public string FileNamePassedToLogDeletedFile;
+ public FileNameAndDirectory FileNameAndDirectoryPassedToLogDeletedFileFromDirectory;
+ public string DirectoryPassedToLogDeletedDirectory;
+ public ReferenceAndProjectName ReferenceAndProjectNamePassedToLogAddedReferenceToProject;
+ public ReferenceAndProjectName ReferenceAndProjectNamePassedToLogRemovedReferenceFromProject;
+ public FileNameAndProjectName FileNameAndProjectNamePassedToLogAddedFileToProject;
+
+ public static Action<MessageHandler> GuiSyncDispatcher = handler => handler.Invoke ();
+
+ public TestableMonoDevelopProjectSystem (IDotNetProject project)
+ : this (
+ project,
+ new FakeFileService (project),
+ new FakePackageManagementProjectService (),
+ new FakeLogger ())
+ {
+ }
+
+ TestableMonoDevelopProjectSystem (
+ IDotNetProject project,
+ IPackageManagementFileService fileService,
+ IPackageManagementProjectService projectService,
+ FakeLogger logger)
+ : base (project, fileService, projectService, GuiSyncDispatcher)
+ {
+ FakeFileService = (FakeFileService)fileService;
+ FakeProjectService = (FakePackageManagementProjectService)projectService;
+ Logger = logger;
+ }
+
+ protected override void PhysicalFileSystemAddFile (string path, Stream stream)
+ {
+ PathPassedToPhysicalFileSystemAddFile = path;
+ StreamPassedToPhysicalFileSystemAddFile = stream;
+ }
+
+ protected override void PhysicalFileSystemAddFile (string path, Action<Stream> writeToStream)
+ {
+ PathPassedToPhysicalFileSystemAddFile = path;
+ ActionPassedToPhysicalFileSystemAddFile = writeToStream;
+ }
+
+ protected override void LogDeletedFile (string fileName)
+ {
+ FileNamePassedToLogDeletedFile = fileName;
+ }
+
+ protected override void LogDeletedFileFromDirectory (string fileName, string directory)
+ {
+ FileNameAndDirectoryPassedToLogDeletedFileFromDirectory = new FileNameAndDirectory (fileName, directory);
+ }
+
+ protected override void LogDeletedDirectory (string directory)
+ {
+ DirectoryPassedToLogDeletedDirectory = directory;
+ }
+
+ protected override void LogAddedReferenceToProject (string referenceName, string projectName)
+ {
+ ReferenceAndProjectNamePassedToLogAddedReferenceToProject =
+ new ReferenceAndProjectName (referenceName, projectName);
+ }
+
+ protected override void LogRemovedReferenceFromProject (string referenceName, string projectName)
+ {
+ ReferenceAndProjectNamePassedToLogRemovedReferenceFromProject =
+ new ReferenceAndProjectName (referenceName, projectName);
+ }
+
+ protected override void LogAddedFileToProject (string fileName, string projectName)
+ {
+ FileNameAndProjectNamePassedToLogAddedFileToProject =
+ new FileNameAndProjectName (fileName, projectName);
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageFromRepository.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageFromRepository.cs
new file mode 100644
index 0000000000..ec2d653666
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageFromRepository.cs
@@ -0,0 +1,57 @@
+//
+// TestablePackageFromRepository.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class TestablePackageFromRepository : PackageFromRepository
+ {
+ public FakePackage FakePackagePassedToConstructor;
+ public FakePackageRepository FakePackageRepositoryPassedToConstructor;
+
+ public TestablePackageFromRepository ()
+ : this (new FakePackage ("Test"), new FakePackageRepository ())
+ {
+ }
+
+ public TestablePackageFromRepository (FakePackage package, FakePackageRepository repository)
+ : base (package, repository)
+ {
+ this.FakePackagePassedToConstructor = package;
+ this.FakePackageRepositoryPassedToConstructor = repository;
+ }
+
+ public DateTimeOffset? DateTimeOffsetToReturnFromGetDataServicePackageLastUpdated;
+
+ protected override DateTimeOffset? GetDataServicePackageLastUpdated ()
+ {
+ return DateTimeOffsetToReturnFromGetDataServicePackageLastUpdated;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageManagementEventsMonitor.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageManagementEventsMonitor.cs
new file mode 100644
index 0000000000..451310dd19
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageManagementEventsMonitor.cs
@@ -0,0 +1,68 @@
+//
+// TestablePackageManagementEventsMonitor.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Ide;
+using MonoDevelop.Core;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class TestablePackageManagementEventsMonitor : PackageManagementEventsMonitor
+ {
+ public TestablePackageManagementEventsMonitor (
+ IProgressMonitor progressMonitor,
+ IPackageManagementEvents packageManagementEvents,
+ IProgressProvider progressProvider)
+ : base (progressMonitor, packageManagementEvents, progressProvider)
+ {
+ }
+
+ public List<FilePath> FilesChanged = new List<FilePath> ();
+
+ protected override void NotifyFilesChanged (FilePath[] files)
+ {
+ FilesChanged.AddRange (files);
+ }
+
+ protected override void GuiSyncDispatch (MessageHandler handler)
+ {
+ handler.Invoke ();
+ }
+
+ protected override void ShowPackageConsole (IProgressMonitor progressMonitor)
+ {
+ IsPackageConsoleShown = true;
+ ProgressMonitorPassedToShowPackageConsole = progressMonitor;
+ }
+
+ public bool IsPackageConsoleShown;
+ public IProgressMonitor ProgressMonitorPassedToShowPackageConsole;
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageManagementOptions.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageManagementOptions.cs
new file mode 100644
index 0000000000..45579c9a4b
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageManagementOptions.cs
@@ -0,0 +1,51 @@
+//
+// TestablePackageManagementOptions.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Core;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class TestablePackageManagementOptions : PackageManagementOptions
+ {
+ public Properties Properties;
+ public FakeSettings FakeSettings;
+
+ public TestablePackageManagementOptions ()
+ : this (new Properties (), new FakeSettings ())
+ {
+ }
+
+ public TestablePackageManagementOptions (Properties properties, FakeSettings fakeSettings)
+ : base (properties, fakeSettings)
+ {
+ this.Properties = properties;
+ this.FakeSettings = fakeSettings;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageViewModel.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageViewModel.cs
new file mode 100644
index 0000000000..94d0a57325
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageViewModel.cs
@@ -0,0 +1,79 @@
+using System;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class TestablePackageViewModel : PackageViewModel
+ {
+ public FakePackageManagementSolution FakeSolution;
+ public PackageManagementEvents PackageManagementEvents;
+ public FakePackage FakePackage;
+ public FakeLogger FakeLogger;
+
+ public TestablePackageViewModel (
+ IPackageViewModelParent parent,
+ FakePackageManagementSolution solution)
+ : this (
+ parent,
+ new FakePackage ("Test"),
+ new PackageManagementSelectedProjects (solution),
+ new PackageManagementEvents (),
+ new FakeLogger ())
+ {
+ this.FakeSolution = solution;
+ }
+
+ public TestablePackageViewModel (
+ IPackageViewModelParent parent,
+ FakePackage package,
+ PackageManagementSelectedProjects selectedProjects,
+ PackageManagementEvents packageManagementEvents,
+ FakeLogger logger)
+ : base (
+ parent,
+ package,
+ selectedProjects,
+ packageManagementEvents,
+ null,
+ logger)
+ {
+ this.FakePackage = package;
+ this.PackageManagementEvents = packageManagementEvents;
+ this.FakeLogger = logger;
+ }
+
+ protected override PackageViewModelOperationLogger CreateLogger (ILogger logger)
+ {
+ PackageViewModelOperationLogger operationLogger = base.CreateLogger (logger);
+ operationLogger.AddingPackageMessageFormat = "Installing...{0}";
+ operationLogger.RemovingPackageMessageFormat = "Uninstalling...{0}";
+ operationLogger.ManagingPackageMessageFormat = "Managing...{0}";
+ OperationLoggerCreated = operationLogger;
+ return operationLogger;
+ }
+
+ public PackageViewModelOperationLogger OperationLoggerCreated;
+
+ public PackageOperation AddOneFakeInstallPackageOperationForViewModelPackage ()
+ {
+ var operation = new FakePackageOperation (FakePackage, PackageAction.Install);
+
+ FakeSolution
+ .FakeProjectToReturnFromGetProject
+ .FakeInstallOperations
+ .Add (operation);
+
+ return operation;
+ }
+
+ public PackageOperation AddOneFakeUninstallPackageOperation ()
+ {
+ var package = new FakePackage ("PackageToUninstall");
+ var operation = new FakePackageOperation (package, PackageAction.Uninstall);
+ FakeSolution.FakeProjectToReturnFromGetProject.FakeInstallOperations.Add (operation);
+ return operation;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableProcessPackageAction.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableProcessPackageAction.cs
new file mode 100644
index 0000000000..b85eb37b2d
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableProcessPackageAction.cs
@@ -0,0 +1,70 @@
+//
+// TestableProcessPackageAction.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using ICSharpCode.PackageManagement;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class TestableProcessPackageAction : ProcessPackageAction
+ {
+ public FakePackageManagementProject FakeProject;
+ public PackageManagementEvents PackageManagementEvents;
+ public FakePackage FakePackage = new FakePackage ("Test");
+
+ public TestableProcessPackageAction ()
+ : this (new FakePackageManagementProject (), new PackageManagementEvents ())
+ {
+ }
+
+ public TestableProcessPackageAction (
+ FakePackageManagementProject project,
+ PackageManagementEvents packageManagementEvents)
+ : base (project, packageManagementEvents)
+ {
+ FakeProject = project;
+ PackageManagementEvents = packageManagementEvents;
+ this.Package = FakePackage;
+ }
+
+ public void CallBeforeExecute ()
+ {
+ base.BeforeExecute ();
+ }
+
+ public bool IsRunPackageScriptsActionCreated;
+ public bool IsExecuteCoreCalled;
+
+ protected override void ExecuteCore ()
+ {
+ IsExecuteCoreCalled = true;
+ }
+
+ protected override string StartingMessageFormat {
+ get { return String.Empty; }
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableProjectManager.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableProjectManager.cs
new file mode 100644
index 0000000000..61522f49ee
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableProjectManager.cs
@@ -0,0 +1,105 @@
+//
+// TestableProjectManager.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class TestableProjectManager : SharpDevelopProjectManager
+ {
+ public IPackage PackagePassedToAddPackageReference;
+ public bool IgnoreDependenciesPassedToAddPackageReference;
+ public bool AllowPrereleaseVersionsPassedToAddPackageReference;
+
+ public IPackage PackagePassedToRemovePackageReference;
+ public bool ForcePassedToRemovePackageReference;
+ public bool RemoveDependenciesPassedToRemovePackageReference;
+
+ public IPackage PackagePassedToUpdatePackageReference;
+ public bool UpdateDependenciesPassedToUpdatePackageReference;
+ public bool AllowPrereleaseVersionsPassedToUpdatePackageReference;
+ public List<IPackage> PackagesPassedToUpdatePackageReference = new List<IPackage> ();
+
+ public FakePackageRepository FakeLocalRepository {
+ get { return LocalRepository as FakePackageRepository; }
+ }
+
+ public TestableProjectManager ()
+ : base (
+ new FakePackageRepository (),
+ new FakePackagePathResolver (),
+ new FakeProjectSystem (),
+ new FakePackageRepository ())
+ {
+ }
+
+ public override void AddPackageReference (string packageId, SemanticVersion version, bool ignoreDependencies, bool allowPrereleaseVersions)
+ {
+ var package = new FakePackage ();
+ package.Id = packageId;
+ package.Version = version;
+ PackagePassedToAddPackageReference = package;
+ IgnoreDependenciesPassedToAddPackageReference = ignoreDependencies;
+ AllowPrereleaseVersionsPassedToAddPackageReference = allowPrereleaseVersions;
+ }
+
+ public override void AddPackageReference (IPackage package, bool ignoreDependencies, bool allowPrereleaseVersions)
+ {
+ PackagePassedToAddPackageReference = package;
+ IgnoreDependenciesPassedToAddPackageReference = ignoreDependencies;
+ AllowPrereleaseVersionsPassedToAddPackageReference = allowPrereleaseVersions;
+ }
+
+ public override void RemovePackageReference (IPackage package, bool force, bool removeDependencies)
+ {
+ PackagePassedToRemovePackageReference = package;
+ ForcePassedToRemovePackageReference = force;
+ RemoveDependenciesPassedToRemovePackageReference = removeDependencies;
+ }
+
+ public override void UpdatePackageReference (string packageId, SemanticVersion version, bool updateDependencies, bool allowPrereleaseVersions)
+ {
+ var package = new FakePackage ();
+ package.Id = packageId;
+ package.Version = version;
+
+ PackagePassedToUpdatePackageReference = package;
+ UpdateDependenciesPassedToUpdatePackageReference = updateDependencies;
+ AllowPrereleaseVersionsPassedToUpdatePackageReference = allowPrereleaseVersions;
+
+ PackagesPassedToUpdatePackageReference.Add (package);
+ }
+
+ public FakePackage AddFakePackageToProjectLocalRepository (string packageId, string version)
+ {
+ return FakeLocalRepository.AddFakePackageWithVersion (packageId, version);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableViewModelBase.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableViewModelBase.cs
new file mode 100644
index 0000000000..37656ef548
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableViewModelBase.cs
@@ -0,0 +1,37 @@
+//
+// TestableViewModelBase.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class TestableViewModelBase : ViewModelBase<TestableViewModelBase>
+ {
+ public string MyProperty { get; set; }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/UninstallPackageHelper.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/UninstallPackageHelper.cs
new file mode 100644
index 0000000000..3139f5a247
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/UninstallPackageHelper.cs
@@ -0,0 +1,68 @@
+//
+// UninstallPackageHelper.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class UninstallPackageHelper
+ {
+ UninstallPackageAction action;
+
+ public UninstallPackageHelper (UninstallPackageAction action)
+ {
+ this.action = action;
+ }
+
+ public FakePackage TestPackage = new FakePackage () {
+ Id = "Test"
+ };
+
+ public void UninstallTestPackage ()
+ {
+ action.Package = TestPackage;
+ action.Execute ();
+ }
+
+ public SemanticVersion Version;
+ public PackageSource PackageSource = new PackageSource ("http://sharpdevelop.net");
+ public bool ForceRemove;
+ public bool RemoveDependencies;
+
+ public void UninstallPackageById (string packageId)
+ {
+ action.PackageId = packageId;
+ action.PackageVersion = Version;
+ action.ForceRemove = ForceRemove;
+ action.RemoveDependencies = RemoveDependencies;
+ action.Execute ();
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/UpdatePackageHelper.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/UpdatePackageHelper.cs
new file mode 100644
index 0000000000..1a61cddd71
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/UpdatePackageHelper.cs
@@ -0,0 +1,82 @@
+//
+// UpdatePackageHelper.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class UpdatePackageHelper
+ {
+ UpdatePackageAction action;
+
+ public FakePackage TestPackage = new FakePackage () {
+ Id = "Test"
+ };
+
+ public List<PackageOperation> PackageOperations = new List<PackageOperation> ();
+
+ public UpdatePackageHelper (UpdatePackageAction action)
+ {
+ this.action = action;
+ }
+
+ public void UpdateTestPackage ()
+ {
+ action.UpdateDependencies = UpdateDependencies;
+ action.AllowPrereleaseVersions = AllowPrereleaseVersions;
+ action.Package = TestPackage;
+ action.Operations = PackageOperations;
+ action.Execute ();
+ }
+
+ public FakePackage AddPackageInstallOperation ()
+ {
+ var package = new FakePackage ("Package to install");
+ var operation = new PackageOperation (package, PackageAction.Install);
+ PackageOperations.Add (operation);
+ return package;
+ }
+
+ public PackageSource PackageSource = new PackageSource ("http://sharpdevelop/packages");
+ public bool UpdateDependencies;
+ public bool AllowPrereleaseVersions;
+ public SemanticVersion Version;
+
+ public void UpdatePackageById (string packageId)
+ {
+ action.PackageId = packageId;
+ action.PackageVersion = Version;
+ action.UpdateDependencies = UpdateDependencies;
+ action.AllowPrereleaseVersions = AllowPrereleaseVersions;
+ action.Execute ();
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/WindowsPath.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/WindowsPath.cs
new file mode 100644
index 0000000000..6072cc410d
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/WindowsPath.cs
@@ -0,0 +1,52 @@
+//
+// NativePath.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.IO;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public static class WindowsPath
+ {
+ /// <summary>
+ /// Converts a Windows path to a native path by converting any
+ /// directory separators.
+ /// </summary>
+ public static string ToNativePath (this string filePath)
+ {
+ if (Path.DirectorySeparatorChar == '\\')
+ return filePath;
+
+ if (filePath.Contains (":")) {
+ filePath = filePath.Replace (":", "_drive");
+ filePath = "/" + filePath;
+ }
+
+ return filePath.Replace ('\\', Path.DirectorySeparatorChar);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.csproj b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.csproj
index 4624fb2317..d09d4f0d72 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.csproj
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.csproj
@@ -49,10 +49,127 @@
<HintPath>..\..\..\..\external\nuget-binary\NuGet.Core.dll</HintPath>
<Private>False</Private>
</Reference>
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="Microsoft.Web.XmlTransform">
+ <HintPath>..\..\..\..\external\nuget-binary\Microsoft.Web.XmlTransform.dll</HintPath>
+ </Reference>
</ItemGroup>
<ItemGroup>
- <Compile Include="MSBuildProjectExtensionsTests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\MSBuildProjectExtensionsTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\DelegateCommandTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\ViewModelBaseTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\TestableViewModelBase.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\PackageFromRepositoryTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackage.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\TestablePackageFromRepository.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageRepository.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageAssemblyReference.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\CollectionAssert.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\PackageOperationMessageTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\PackageFilesTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\IPackageExtensionsTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\RecentPackageInfoTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\PackageRepositoryCacheTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageRepositoryFactory.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeSharedPackageRepository.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\OneRegisteredPackageSourceHelper.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeSettings.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\TestablePackageManagementOptions.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeRecentPackageRepository.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackagePathResolver.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeFileSystem.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\PackageManagementLoggerTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\PackageManagementEventsTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageManagementSolution.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageManagementProject.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeInstallPackageAction.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeUpdatePackageAction.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeUninstallPackageAction.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageOperation.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\PackageManagementOptionsTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\RecentPackageInfoCollectionAssert.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\RegisteredPackageRepositoriesTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\PackageManagementOptionsViewModelTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeMachineCache.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeProcess.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\ThreadSafePackageManagementEventsTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\PackageSourceViewModelTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\RegisteredPackageSourcesViewModelTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\PackageSourceCollectionAssert.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\ProcessPackageActionTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\TestableProcessPackageAction.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\ExceptionThrowingProcessPackageAction.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\InstallPackageActionTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\InstallPackageHelper.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\PackageOperationHelper.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\RecentPackageRepositoryTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\PackageCollectionAssert.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\AvailablePackagesViewModelTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeRegisteredPackageRepositories.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeTaskFactory.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeTask.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\ExceptionThrowingRegisteredPackageRepositories.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageViewModelFactory.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeLogger.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeServiceBasedRepository.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\PackageManagementSelectedProjectTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\UninstallPackageActionTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\UninstallPackageHelper.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\UpdatePackageActionTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\UpdatePackageHelper.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\UpdateAllPackagesInProjectTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\UpdateAllPackagesInSolutionTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\UserAgentGeneratorForRepositoryRequestsTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageRepositoryWithHttpClientEvents.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\NuGetPackageRestoreCommandLineTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\ReducedPackageOperationsTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\TestPackageHelper.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageOperationResolver.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\SolutionPackageRepositoryPathTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeSolution.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeProject.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\SolutionPackageRepositoryTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\PackageManagementProjectTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageManagerFactory.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageManager.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageManagementProjectService.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeProjectManager.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeProjectSystem.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeDotNetProject.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\PackageReferenceRepositoryHelper.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\TestableProjectManager.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageOperationResolverFactory.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\MonoDevelopPackageManagerTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeSolutionPackageRepository.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeWebRequest.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageRepositoryFactoryEvents.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\MonoDevelopProjectSystemTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\TestableMonoDevelopProjectSystem.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeFileService.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FileNameAndDirectory.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FileNameAndProjectName.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\ReferenceAndProjectName.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\ProjectHelper.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\OpenDotNetProjectTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeProjectSystemFactory.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\MonoDevelopPackageManagerFactoryTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\MonoDevelopProjectManagerTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\PackageManagementSelectedProjectsTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\SelectedProjectCollectionAssert.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\PackageViewModelTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\TestablePackageViewModel.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeOperationAwareRepository.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\PackageManagementSolutionTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeSolutionPackageRepositoryFactory.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageManagementProjectFactory.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\WindowsPath.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\XmlDocumentTransformTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\BackgroundPackageActionRunnerTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeProgressMonitorFactory.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeProgressMonitor.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\TestableBackgroundPackageActionRunner.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\TestablePackageManagementEventsMonitor.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\core\MonoDevelop.Core\MonoDevelop.Core.csproj">
@@ -69,6 +186,14 @@
<Project>{E13A0A7B-4DE6-43ED-A139-41052D065A9B}</Project>
<Name>GuiUnit_NET_4_0</Name>
</ProjectReference>
+ <ProjectReference Include="..\..\..\core\MonoDevelop.Ide\MonoDevelop.Ide.csproj">
+ <Project>{27096E7F-C91C-4AC6-B289-6897A701DF21}</Project>
+ <Name>MonoDevelop.Ide</Name>
+ </ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <ItemGroup>
+ <Folder Include="MonoDevelop.PackageManagement.Tests\" />
+ <Folder Include="MonoDevelop.PackageManagement.Tests.Helpers\" />
+ </ItemGroup>
</Project>
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/AvailablePackagesViewModelTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/AvailablePackagesViewModelTests.cs
new file mode 100644
index 0000000000..cb2cc9c0f4
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/AvailablePackagesViewModelTests.cs
@@ -0,0 +1,695 @@
+//
+// AvailablePackagesViewModelTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this
+// software and associated documentation files (the "Software"), to deal in the Software
+// without restriction, including without limitation the rights to use, copy, modify, merge,
+// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
+// to whom the Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or
+// substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class AvailablePackagesViewModelTests
+ {
+ AvailablePackagesViewModel viewModel;
+ FakeRegisteredPackageRepositories registeredPackageRepositories;
+ ExceptionThrowingRegisteredPackageRepositories exceptionThrowingRegisteredPackageRepositories;
+ FakeTaskFactory taskFactory;
+ FakeRecentPackageRepository recentPackageRepository;
+
+ void CreateViewModel ()
+ {
+ CreateRegisteredPackageRepositories ();
+ CreateViewModel (registeredPackageRepositories);
+ }
+
+ void CreateRegisteredPackageRepositories ()
+ {
+ registeredPackageRepositories = new FakeRegisteredPackageRepositories ();
+ }
+
+ void CreateViewModel (FakeRegisteredPackageRepositories registeredPackageRepositories)
+ {
+ taskFactory = new FakeTaskFactory ();
+ var packageViewModelFactory = new FakePackageViewModelFactory ();
+ recentPackageRepository = new FakeRecentPackageRepository ();
+
+ viewModel = new AvailablePackagesViewModel (
+ registeredPackageRepositories,
+ recentPackageRepository,
+ packageViewModelFactory,
+ taskFactory);
+ }
+
+ void CreateExceptionThrowingRegisteredPackageRepositories ()
+ {
+ exceptionThrowingRegisteredPackageRepositories = new ExceptionThrowingRegisteredPackageRepositories ();
+ }
+
+ void CompleteReadPackagesTask ()
+ {
+ taskFactory.ExecuteAllFakeTasks ();
+ }
+
+ void ClearReadPackagesTasks ()
+ {
+ taskFactory.ClearAllFakeTasks ();
+ }
+
+ void AddOnePackageSourceToRegisteredSources ()
+ {
+ registeredPackageRepositories.ClearPackageSources ();
+ registeredPackageRepositories.AddOnePackageSource ();
+ registeredPackageRepositories.HasMultiplePackageSources = false;
+ registeredPackageRepositories.ActivePackageSource = registeredPackageRepositories.PackageSources [0];
+ }
+
+ void AddTwoPackageSourcesToRegisteredSources ()
+ {
+ var expectedPackageSources = new PackageSource[] {
+ new PackageSource ("http://first.com", "First"),
+ new PackageSource ("http://second.com", "Second")
+ };
+ AddPackageSourcesToRegisteredSources (expectedPackageSources);
+ registeredPackageRepositories.HasMultiplePackageSources = true;
+ registeredPackageRepositories.ActivePackageSource = expectedPackageSources [0];
+ }
+
+ void AddPackageSourcesToRegisteredSources (PackageSource[] sources)
+ {
+ registeredPackageRepositories.ClearPackageSources ();
+ registeredPackageRepositories.AddPackageSources (sources);
+ }
+
+ PackageSource AddTwoPackageSourcesToRegisteredSourcesWithFirstOneDisabled ()
+ {
+ var expectedPackageSources = new PackageSource[] {
+ new PackageSource ("http://first.com", "First") { IsEnabled = false },
+ new PackageSource ("http://second.com", "Second") { IsEnabled = true }
+ };
+ AddPackageSourcesToRegisteredSources (expectedPackageSources);
+ registeredPackageRepositories.HasMultiplePackageSources = true;
+ return expectedPackageSources [0];
+ }
+
+ void CreateNewActiveRepositoryWithDifferentPackages ()
+ {
+ var package = new FakePackage ("NewRepositoryPackageId");
+ var newRepository = new FakePackageRepository ();
+ newRepository.FakePackages.Add (package);
+ registeredPackageRepositories.FakeActiveRepository = newRepository;
+ }
+
+ void SetUpTwoPackageSourcesAndViewModelHasReadPackages ()
+ {
+ CreateRegisteredPackageRepositories ();
+ AddTwoPackageSourcesToRegisteredSources ();
+ CreateViewModel (registeredPackageRepositories);
+ registeredPackageRepositories.ActivePackageSource = registeredPackageRepositories.PackageSources [0];
+ viewModel.ReadPackages ();
+ CompleteReadPackagesTask ();
+ CreateNewActiveRepositoryWithDifferentPackages ();
+ }
+
+ void ChangeSelectedPackageSourceToSecondSource ()
+ {
+ var secondPackageSource = registeredPackageRepositories.PackageSources [1];
+ viewModel.SelectedPackageSource = secondPackageSource;
+ }
+
+ void ChangeSelectedPackageSourceToFirstSource ()
+ {
+ var firstPackageSource = registeredPackageRepositories.PackageSources [0];
+ viewModel.SelectedPackageSource = firstPackageSource;
+ }
+
+ [Test]
+ public void ReadPackages_RepositoryHasThreePackagesWithSameIdButDifferentVersions_HasLatestPackageVersionOnly ()
+ {
+ CreateViewModel ();
+ AddOnePackageSourceToRegisteredSources ();
+
+ var package1 = new FakePackage ("Test", "0.1.0.0");
+ var package2 = new FakePackage ("Test", "0.2.0.0");
+ var package3 = new FakePackage ("Test", "0.3.0.0");
+
+ var packages = new FakePackage[] {
+ package1, package2, package3
+ };
+
+ registeredPackageRepositories.FakeActiveRepository.FakePackages.AddRange (packages);
+
+ viewModel.ReadPackages ();
+ CompleteReadPackagesTask ();
+
+ var expectedPackages = new FakePackage[] {
+ package3
+ };
+
+ PackageCollectionAssert.AreEqual (expectedPackages, viewModel.PackageViewModels);
+ }
+
+ [Test]
+ public void IsSearchable_ByDefault_ReturnsTrue ()
+ {
+ CreateViewModel ();
+ Assert.IsTrue (viewModel.IsSearchable);
+ }
+
+ [Test]
+ public void Search_RepositoryHasThreePackagesWithSameIdButSearchTermsMatchNoPackageIds_ReturnsNoPackages ()
+ {
+ CreateViewModel ();
+
+ var package1 = new FakePackage ("Test", "0.1.0.0");
+ var package2 = new FakePackage ("Test", "0.2.0.0");
+ var package3 = new FakePackage ("Test", "0.3.0.0");
+
+ var packages = new FakePackage[] {
+ package1, package2, package3
+ };
+
+ registeredPackageRepositories.FakeActiveRepository.FakePackages.AddRange (packages);
+
+ viewModel.ReadPackages ();
+ CompleteReadPackagesTask ();
+
+ ClearReadPackagesTasks ();
+ viewModel.SearchTerms = "NotAMatch";
+ viewModel.Search ();
+ CompleteReadPackagesTask ();
+
+ Assert.AreEqual (0, viewModel.PackageViewModels.Count);
+ }
+
+ [Test]
+ public void ShowNextPage_TwoObjectsWatchingForPagesCollectionChangedEventAndUserMovesToPageTwoAndFilteredPackagesReturnsLessThanExpectedPackagesDueToMatchingVersions_InvalidOperationExceptionNotThrownWhen ()
+ {
+ CreateViewModel ();
+ AddOnePackageSourceToRegisteredSources ();
+ viewModel.PageSize = 2;
+
+ var package1 = new FakePackage ("First", "0.1.0.0");
+ var package2 = new FakePackage ("Second", "0.2.0.0");
+ var package3 = new FakePackage ("Test", "0.3.0.0");
+ var package4 = new FakePackage ("Test", "0.4.0.0");
+
+ var packages = new FakePackage[] {
+ package1, package2, package3, package4
+ };
+
+ registeredPackageRepositories.FakeActiveRepository.FakePackages.AddRange (packages);
+
+ viewModel.ReadPackages ();
+ CompleteReadPackagesTask ();
+
+ ClearReadPackagesTasks ();
+ bool collectionChangedEventFired = false;
+ viewModel.Pages.CollectionChanged += (sender, e) => collectionChangedEventFired = true;
+ viewModel.ShowNextPage ();
+ CompleteReadPackagesTask ();
+
+ var expectedPackages = new FakePackage[] {
+ package4
+ };
+
+ PackageCollectionAssert.AreEqual (expectedPackages, viewModel.PackageViewModels);
+ Assert.IsTrue (collectionChangedEventFired);
+ }
+
+ [Test]
+ public void ShowSources_TwoPackageSources_ReturnsTrue ()
+ {
+ CreateRegisteredPackageRepositories ();
+ AddTwoPackageSourcesToRegisteredSources ();
+ CreateViewModel (registeredPackageRepositories);
+
+ Assert.IsTrue (viewModel.ShowPackageSources);
+ }
+
+ [Test]
+ public void ShowPackageSources_OnePackageSources_ReturnsTrue ()
+ {
+ CreateRegisteredPackageRepositories ();
+ AddOnePackageSourceToRegisteredSources ();
+ CreateViewModel (registeredPackageRepositories);
+
+ Assert.IsTrue (viewModel.ShowPackageSources);
+ }
+
+ [Test]
+ public void PackageSources_TwoPackageSourcesInOptions_ReturnsTwoPackageSourcesPlusAggregatePackageSource ()
+ {
+ CreateRegisteredPackageRepositories ();
+ AddTwoPackageSourcesToRegisteredSources ();
+ CreateViewModel (registeredPackageRepositories);
+
+ var expectedPackageSources = new List<PackageSource> (registeredPackageRepositories.PackageSources);
+ expectedPackageSources.Insert (0, RegisteredPackageSourceSettings.AggregatePackageSource);
+
+ PackageSourceCollectionAssert.AreEqual (expectedPackageSources, viewModel.PackageSources);
+ }
+
+ [Test]
+ public void PackageSources_OnePackageSourceInOptions_ReturnsOnePackageSource ()
+ {
+ CreateRegisteredPackageRepositories ();
+ AddOnePackageSourceToRegisteredSources ();
+ CreateViewModel (registeredPackageRepositories);
+
+ var expectedPackageSources = new List<PackageSource> (registeredPackageRepositories.PackageSources);
+
+ PackageSourceCollectionAssert.AreEqual (expectedPackageSources, viewModel.PackageSources);
+ }
+
+ [Test]
+ public void SelectedPackageSource_TwoPackageSourcesInOptionsAndActivePackageSourceIsFirstSource_IsFirstPackageSource ()
+ {
+ CreateRegisteredPackageRepositories ();
+ AddTwoPackageSourcesToRegisteredSources ();
+ CreateViewModel (registeredPackageRepositories);
+
+ var expectedPackageSource = registeredPackageRepositories.PackageSources [0];
+ registeredPackageRepositories.ActivePackageSource = expectedPackageSource;
+
+ Assert.AreEqual (expectedPackageSource, viewModel.SelectedPackageSource);
+ }
+
+ [Test]
+ public void SelectedPackageSource_TwoPackageSourcesInOptionsAndActivePackageSourceIsSecondSource_IsSecondPackageSource ()
+ {
+ CreateRegisteredPackageRepositories ();
+ AddTwoPackageSourcesToRegisteredSources ();
+ CreateViewModel (registeredPackageRepositories);
+
+ var expectedPackageSource = registeredPackageRepositories.PackageSources [1];
+ registeredPackageRepositories.ActivePackageSource = expectedPackageSource;
+
+ Assert.AreEqual (expectedPackageSource, viewModel.SelectedPackageSource);
+ }
+
+ [Test]
+ public void SelectedPackageSource_Changed_ActivePackageSourceChanged ()
+ {
+ CreateRegisteredPackageRepositories ();
+ AddTwoPackageSourcesToRegisteredSources ();
+ CreateViewModel (registeredPackageRepositories);
+
+ registeredPackageRepositories.ActivePackageSource = registeredPackageRepositories.PackageSources [0];
+ var expectedPackageSource = registeredPackageRepositories.PackageSources [1];
+ viewModel.SelectedPackageSource = expectedPackageSource;
+
+ Assert.AreEqual (expectedPackageSource, registeredPackageRepositories.ActivePackageSource);
+ }
+
+ [Test]
+ public void SelectedPackageSource_PackageSourceChangedAfterReadingPackages_PackagesReadFromNewPackageSourceAndDisplayed ()
+ {
+ SetUpTwoPackageSourcesAndViewModelHasReadPackages ();
+ ClearReadPackagesTasks ();
+ ChangeSelectedPackageSourceToSecondSource ();
+ CompleteReadPackagesTask ();
+
+ var expectedPackages = registeredPackageRepositories.FakeActiveRepository.FakePackages;
+
+ PackageCollectionAssert.AreEqual (expectedPackages, viewModel.PackageViewModels);
+ }
+
+ [Test]
+ public void SelectedPackageSource_PackageSourceChangedAfterReadingPackages_PropertyChangedEventFiredAfterPackagesAreRead ()
+ {
+ SetUpTwoPackageSourcesAndViewModelHasReadPackages ();
+
+ int packageCountWhenPropertyChangedEventFired = -1;
+ viewModel.PropertyChanged += (sender, e) => packageCountWhenPropertyChangedEventFired = viewModel.PackageViewModels.Count;
+ ClearReadPackagesTasks ();
+ ChangeSelectedPackageSourceToSecondSource ();
+ CompleteReadPackagesTask ();
+
+ Assert.AreEqual (1, packageCountWhenPropertyChangedEventFired);
+ }
+
+ [Test]
+ public void SelectedPackageSource_PackageSourceChangedButToSameSelectedPackageSource_PackagesAreNotRead ()
+ {
+ SetUpTwoPackageSourcesAndViewModelHasReadPackages ();
+ ChangeSelectedPackageSourceToFirstSource ();
+
+ Assert.AreEqual (0, viewModel.PackageViewModels.Count);
+ }
+
+ [Test]
+ public void SelectedPackageSource_PackageSourceChangedButToSameSelectedPackageSource_PropertyChangedEventNotFired ()
+ {
+ SetUpTwoPackageSourcesAndViewModelHasReadPackages ();
+
+ bool fired = false;
+ viewModel.PropertyChanged += (sender, e) => fired = true;
+ ChangeSelectedPackageSourceToFirstSource ();
+
+ Assert.IsFalse (fired);
+ }
+
+ [Test]
+ public void GetAllPackages_OnePackageInRepository_RepositoryNotCreatedByBackgroundThread ()
+ {
+ CreateRegisteredPackageRepositories ();
+ AddOnePackageSourceToRegisteredSources ();
+ registeredPackageRepositories.FakeActiveRepository.FakePackages.Add (new FakePackage ());
+ CreateViewModel (registeredPackageRepositories);
+ viewModel.ReadPackages ();
+
+ registeredPackageRepositories.FakeActiveRepository = null;
+ CompleteReadPackagesTask ();
+
+ Assert.AreEqual (1, viewModel.PackageViewModels.Count);
+ }
+
+ [Test]
+ public void ReadPackages_ExceptionThrownWhenAccessingActiveRepository_ErrorMessageFromExceptionNotOverriddenByReadPackagesCall ()
+ {
+ CreateExceptionThrowingRegisteredPackageRepositories ();
+ exceptionThrowingRegisteredPackageRepositories.ExceptionToThrowWhenActiveRepositoryAccessed =
+ new Exception ("Test");
+ CreateViewModel (exceptionThrowingRegisteredPackageRepositories);
+ exceptionThrowingRegisteredPackageRepositories.ActivePackageSource = new PackageSource ("Test");
+ viewModel.ReadPackages ();
+
+ ApplicationException ex = Assert.Throws<ApplicationException> (CompleteReadPackagesTask);
+ Assert.AreEqual ("Test", ex.Message);
+ }
+
+ [Test]
+ public void ReadPackages_RepositoryHasPrereleaseAndReleasePackage_HasReleasePackageOnly ()
+ {
+ CreateViewModel ();
+ AddOnePackageSourceToRegisteredSources ();
+ var releasePackage = new FakePackage ("Test", "1.1.0.0");
+ var prereleasePackage = new FakePackage ("Test", "1.1.0-alpha");
+
+ var packages = new FakePackage[] {
+ releasePackage, prereleasePackage
+ };
+
+ registeredPackageRepositories.FakeActiveRepository.FakePackages.AddRange (packages);
+
+ viewModel.ReadPackages ();
+ CompleteReadPackagesTask ();
+
+ var expectedPackages = new FakePackage[] {
+ releasePackage
+ };
+
+ PackageCollectionAssert.AreEqual (expectedPackages, viewModel.PackageViewModels);
+ }
+
+ [Test]
+ public void ReadPackages_TwoPackagesWithDifferentDownloadCounts_HighestDownloadCountShownFirst ()
+ {
+ CreateViewModel ();
+ AddOnePackageSourceToRegisteredSources ();
+
+ var package1 = new FakePackage ("A", "0.1.0.0") { DownloadCount = 1 };
+ var package2 = new FakePackage ("Z", "0.1.0.0") { DownloadCount = 1000 };
+
+ var packages = new FakePackage[] {
+ package1, package2
+ };
+
+ registeredPackageRepositories.FakeActiveRepository.FakePackages.AddRange (packages);
+
+ viewModel.ReadPackages ();
+ CompleteReadPackagesTask ();
+
+ var expectedPackages = new FakePackage[] {
+ package2, package1
+ };
+
+ PackageCollectionAssert.AreEqual (expectedPackages, viewModel.PackageViewModels);
+ }
+
+ [Test]
+ public void GetPackagesFromPackageSource_RepositoryHasThreePackagesWithSameIdButDifferentVersions_LatestPackageVersionOnlyRequestedFromPackageSource ()
+ {
+ CreateViewModel ();
+ AddOnePackageSourceToRegisteredSources ();
+ var package1 = new FakePackage ("Test", "0.1.0.0") { IsLatestVersion = false };
+ var package2 = new FakePackage ("Test", "0.2.0.0") { IsLatestVersion = false };
+ var package3 = new FakePackage ("Test", "0.3.0.0") { IsLatestVersion = true };
+ var packages = new FakePackage[] {
+ package1, package2, package3
+ };
+ registeredPackageRepositories.FakeActiveRepository.FakePackages.AddRange (packages);
+ viewModel.ReadPackages ();
+
+ IList<IPackage> allPackages = viewModel.GetPackagesFromPackageSource ().ToList ();
+
+ var expectedPackages = new FakePackage[] {
+ package3
+ };
+ 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);
+ }
+
+ [Test]
+ public void IsInstallAllPackagesEnabled_RepositoryHasTwoPackages_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ var package1 = new FakePackage ("Test", "0.1.0.0");
+ var package2 = new FakePackage ("Test", "0.2.0.0");
+ var packages = new FakePackage[] {
+ package1, package2
+ };
+ registeredPackageRepositories.FakeActiveRepository.FakePackages.AddRange (packages);
+ viewModel.ReadPackages ();
+ CompleteReadPackagesTask ();
+
+ bool enabled = viewModel.IsUpdateAllPackagesEnabled;
+
+ Assert.IsFalse (enabled);
+ }
+
+ [Test]
+ public void ShowPrerelease_ByDefault_ReturnsTrue ()
+ {
+ CreateViewModel ();
+
+ bool show = viewModel.ShowPrerelease;
+
+ Assert.IsTrue (show);
+ }
+
+ [Test]
+ public void ReadPackages_RepositoryHasPrereleasePackageAndIncludePrereleaseIsTrue_HasPrereleasePackageInList ()
+ {
+ CreateViewModel ();
+ AddOnePackageSourceToRegisteredSources ();
+ viewModel.IncludePrerelease = true;
+ var prereleasePackage = new FakePackage ("Test", "1.1.0-alpha") {
+ IsLatestVersion = false,
+ IsAbsoluteLatestVersion = true
+ };
+ var expectedPackages = new FakePackage[] { prereleasePackage };
+ registeredPackageRepositories.FakeActiveRepository.FakePackages.AddRange (expectedPackages);
+
+ viewModel.ReadPackages ();
+ CompleteReadPackagesTask ();
+
+ PackageCollectionAssert.AreEqual (expectedPackages, viewModel.PackageViewModels);
+ }
+
+ [Test]
+ public void ReadPackages_RepositoryHasThreePrereleasePackagesWithSameIdButDifferentVersionsAndIncludePrereleaseIsTrue_HasLatestPreleasePackageVersionOnly ()
+ {
+ CreateViewModel ();
+ AddOnePackageSourceToRegisteredSources ();
+ viewModel.IncludePrerelease = true;
+ var package1 = new FakePackage ("Test", "0.1.0.0-alpha") { IsLatestVersion = false };
+ var package2 = new FakePackage ("Test", "0.2.0.0-alpha") { IsLatestVersion = false };
+ var package3 = new FakePackage ("Test", "0.3.0.0-alpha") { IsLatestVersion = false, IsAbsoluteLatestVersion = true };
+ var packages = new FakePackage[] {
+ package1, package2, package3
+ };
+ registeredPackageRepositories.FakeActiveRepository.FakePackages.AddRange (packages);
+
+ viewModel.ReadPackages ();
+ CompleteReadPackagesTask ();
+
+ var expectedPackages = new FakePackage[] {
+ package3
+ };
+ PackageCollectionAssert.AreEqual (expectedPackages, viewModel.PackageViewModels);
+ }
+
+ [Test]
+ public void PackageViewModels_GetParentOfPackageViewModel_ReturnsAvailablePackagesViewModel ()
+ {
+ CreateViewModel ();
+ AddOnePackageSourceToRegisteredSources ();
+ var package1 = new FakePackage ("Test", "0.1.0.0");
+ var package2 = new FakePackage ("Test", "0.2.0.0");
+ var packages = new FakePackage[] {
+ package1, package2
+ };
+ registeredPackageRepositories.FakeActiveRepository.FakePackages.AddRange (packages);
+ viewModel.ReadPackages ();
+ CompleteReadPackagesTask ();
+ PackageViewModel childViewModel = viewModel.PackageViewModels.First ();
+
+ IPackageViewModelParent parent = childViewModel.GetParent ();
+
+ Assert.AreEqual (viewModel, parent);
+ }
+
+ [Test]
+ public void GetPackagesFromPackageSource_RepositoryIsServiceBasedRepository_ServiceBasedRepositorySearchUsed ()
+ {
+ CreateViewModel ();
+ AddOnePackageSourceToRegisteredSources ();
+ var package = FakePackage.CreatePackageWithVersion ("Test", "0.1.0.0");
+ var packages = new FakePackage[] { package };
+ var repository = new FakeServiceBasedRepository ();
+ repository.PackagesToReturnForSearch ("id:test", false, packages);
+ registeredPackageRepositories.FakeActiveRepository = repository;
+ viewModel.SearchTerms = "id:test";
+ viewModel.IncludePrerelease = false;
+ viewModel.ReadPackages ();
+
+ IList<IPackage> allPackages = viewModel.GetPackagesFromPackageSource ().ToList ();
+
+ var expectedPackages = new FakePackage[] { package };
+ PackageCollectionAssert.AreEqual (expectedPackages, allPackages);
+ }
+
+ [Test]
+ public void GetPackagesFromPackageSource_RepositoryIsServiceBasedRepositoryAndPrereleaseIncluded_ServiceBasedRepositorySearchUsed ()
+ {
+ CreateViewModel ();
+ AddOnePackageSourceToRegisteredSources ();
+ var package = FakePackage.CreatePackageWithVersion ("Test", "0.1.0.0");
+ package.IsAbsoluteLatestVersion = true;
+ var packages = new FakePackage[] { package };
+ var repository = new FakeServiceBasedRepository ();
+ repository.PackagesToReturnForSearch ("id:test", true, packages);
+ registeredPackageRepositories.FakeActiveRepository = repository;
+ viewModel.SearchTerms = "id:test";
+ viewModel.IncludePrerelease = true;
+ viewModel.ReadPackages ();
+
+ IList<IPackage> allPackages = viewModel.GetPackagesFromPackageSource ().ToList ();
+
+ var expectedPackages = new FakePackage[] { package };
+ PackageCollectionAssert.AreEqual (expectedPackages, allPackages);
+ }
+
+ [Test]
+ public void GetPackagesFromPackageSource_RepositoryHasThreePackagesWithSameIdButDifferentVersionsAndSearchIncludesPrerelease_AbsoluteLatestPackageVersionOnlyRequestedFromPackageSource ()
+ {
+ CreateViewModel ();
+ AddOnePackageSourceToRegisteredSources ();
+ var package1 = new FakePackage ("Test", "0.1.0.0") { IsAbsoluteLatestVersion = false };
+ var package2 = new FakePackage ("Test", "0.2.0.0") { IsAbsoluteLatestVersion = false };
+ var package3 = new FakePackage ("Test", "0.3.0.0") { IsAbsoluteLatestVersion = true };
+ var packages = new FakePackage[] {
+ package1, package2, package3
+ };
+ registeredPackageRepositories.FakeActiveRepository.FakePackages.AddRange (packages);
+ viewModel.IncludePrerelease = true;
+ viewModel.ReadPackages ();
+
+ IList<IPackage> allPackages = viewModel.GetPackagesFromPackageSource ().ToList ();
+
+ var expectedPackages = new FakePackage[] {
+ package3
+ };
+ PackageCollectionAssert.AreEqual (expectedPackages, allPackages);
+ }
+
+ [Test]
+ public void ReadPackages_ActiveRepositoryChangedWhichUsesInvalidUrl_InvalidUrlExceptionIsShownAsErrorMessage ()
+ {
+ CreateExceptionThrowingRegisteredPackageRepositories ();
+ CreateViewModel (exceptionThrowingRegisteredPackageRepositories);
+ exceptionThrowingRegisteredPackageRepositories.ActivePackageSource = new PackageSource ("test");
+ var package = new FakePackage ("Test", "0.1.0.0");
+ exceptionThrowingRegisteredPackageRepositories
+ .FakeActiveRepository
+ .FakePackages
+ .Add (package);
+ viewModel.ReadPackages ();
+ CompleteReadPackagesTask ();
+ taskFactory.ClearAllFakeTasks ();
+ exceptionThrowingRegisteredPackageRepositories.ExceptionToThrowWhenActiveRepositoryAccessed =
+ new Exception ("Invalid url");
+
+ viewModel.ReadPackages ();
+ FakeTask<PackagesForSelectedPageResult> task = taskFactory.FirstFakeTaskCreated;
+ ApplicationException ex = Assert.Throws<ApplicationException> (() => task.ExecuteTaskButNotContinueWith ());
+ task.Exception = new AggregateException (ex);
+ task.IsFaulted = true;
+ task.ExecuteContinueWith ();
+
+ Assert.AreEqual ("Invalid url", ex.Message);
+ Assert.IsTrue (viewModel.HasError);
+ Assert.AreEqual ("Invalid url", viewModel.ErrorMessage);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/BackgroundPackageActionRunnerTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/BackgroundPackageActionRunnerTests.cs
new file mode 100644
index 0000000000..b4e42e263d
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/BackgroundPackageActionRunnerTests.cs
@@ -0,0 +1,438 @@
+//
+// BackgroundPackageActionRunnerTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NUnit.Framework;
+using NuGet;
+using MonoDevelop.Core;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class BackgroundPackageActionRunnerTests
+ {
+ TestableBackgroundPackageActionRunner runner;
+ FakeProgressMonitorFactory progressMonitorFactory;
+ PackageManagementEvents packageManagementEvents;
+ PackageManagementProgressProvider progressProvider;
+ List<IPackageAction> actions;
+ ProgressMonitorStatusMessage progressMessage;
+ FakeProgressMonitor progressMonitor;
+ FakePackageRepositoryFactoryEvents repositoryFactoryEvents;
+
+ void CreateRunner ()
+ {
+ actions = new List<IPackageAction> ();
+ progressMessage = new ProgressMonitorStatusMessage ("Status", "Success", "Error", "Warning");
+ packageManagementEvents = new PackageManagementEvents ();
+ progressMonitorFactory = new FakeProgressMonitorFactory ();
+ progressMonitor = progressMonitorFactory.ProgressMonitor;
+ repositoryFactoryEvents = new FakePackageRepositoryFactoryEvents ();
+ progressProvider = new PackageManagementProgressProvider (repositoryFactoryEvents, handler => {
+ handler.Invoke ();
+ });
+
+ runner = new TestableBackgroundPackageActionRunner (
+ progressMonitorFactory,
+ packageManagementEvents,
+ progressProvider);
+ }
+
+ void Run ()
+ {
+ RunWithoutBackgroundDispatch ();
+ runner.ExecuteBackgroundDispatch ();
+ }
+
+ void RunWithoutBackgroundDispatch ()
+ {
+ runner.Run (progressMessage, actions);
+ }
+
+ FakeInstallPackageAction AddInstallAction ()
+ {
+ var action = new FakeInstallPackageAction (new FakePackageManagementProject (), packageManagementEvents);
+ action.Operations = new List <PackageOperation> ();
+ action.Logger = new FakeLogger ();
+ actions.Add (action);
+ return action;
+ }
+
+ void AddInstallActionWithPowerShellScript (string packageId = "Test")
+ {
+ FakeInstallPackageAction action = AddInstallAction ();
+ var package = new FakePackage (packageId);
+ package.AddFile (@"tools\install.ps1");
+ var operations = new List<PackageOperation> ();
+ operations.Add (new PackageOperation (package, PackageAction.Install));
+ action.Operations = operations;
+ action.Package = package;
+ }
+
+ void AddInstallActionWithLicenseToAccept (string packageId = "Test")
+ {
+ FakeInstallPackageAction action = AddInstallAction ();
+ var package = new FakePackage (packageId) {
+ RequireLicenseAcceptance = true
+ };
+ var operations = new List<PackageOperation> ();
+ operations.Add (new PackageOperation (package, PackageAction.Install));
+ action.Operations = operations;
+ action.Package = package;
+ }
+
+ void AddInstallActionWithMissingPackageId (string packageId = "Unknown")
+ {
+ var action = new InstallPackageAction (new FakePackageManagementProject (), packageManagementEvents);
+ action.PackageId = packageId;
+ actions.Add (action);
+ }
+
+ void AddInstallActionWithCustomExecuteAction (Action executeAction)
+ {
+ FakeInstallPackageAction action = AddInstallAction ();
+ action.ExecuteAction = executeAction;
+ }
+
+ FakeUninstallPackageAction AddUninstallAction ()
+ {
+ var action = new FakeUninstallPackageAction (new FakePackageManagementProject ());
+ action.Package = new FakePackage ();
+ action.Logger = new FakeLogger ();
+ actions.Add (action);
+ return action;
+ }
+
+ [Test]
+ public void Run_OneInstallActionAndOneUninstallActionAndRunNotCompleted_InstallActionMarkedAsPending ()
+ {
+ CreateRunner ();
+ InstallPackageAction expectedAction = AddInstallAction ();
+ AddUninstallAction ();
+
+ RunWithoutBackgroundDispatch ();
+
+ Assert.AreEqual (expectedAction, runner.PendingInstallActions.Single ());
+ }
+
+ [Test]
+ public void Run_OneInstallActionAndRunNotCompleted_PackageOperationsStartedEventRaisedAfterInstallActionMarkedAsPending ()
+ {
+ CreateRunner ();
+ InstallPackageAction expectedAction = AddInstallAction ();
+ List<InstallPackageAction> actions = null;
+ packageManagementEvents.PackageOperationsStarting += (sender, e) => {
+ actions = runner.PendingInstallActions.ToList ();
+ };
+
+ RunWithoutBackgroundDispatch ();
+
+ Assert.AreEqual (expectedAction, actions.Single ());
+ }
+
+ [Test]
+ public void Run_OneInstallAction_ProgressMonitorCreatedWithInitialProgressStatus ()
+ {
+ CreateRunner ();
+ AddInstallAction ();
+
+ Run ();
+
+ Assert.AreEqual ("Status", progressMonitorFactory.StatusText);
+ }
+
+ [Test]
+ public void Run_OneInstallAction_PackageOperationsFinishedEventRaisedAfterPendingInstallActionsRemoved ()
+ {
+ CreateRunner ();
+ AddInstallAction ();
+ List<InstallPackageAction> actions = null;
+ packageManagementEvents.PackageOperationsFinished += (sender, e) => {
+ actions = runner.PendingInstallActions.ToList ();
+ };
+
+ Run ();
+
+ Assert.AreEqual (0, actions.Count);
+ }
+
+ [Test]
+ public void Run_OneInstallAction_ProgressMonitorDisposed ()
+ {
+ CreateRunner ();
+ AddInstallAction ();
+
+ Run ();
+
+ Assert.IsTrue (progressMonitor.IsDisposed);
+ }
+
+ [Test]
+ public void Run_TwoActions_BeginsProgressMonitorTaskWithTwoItems ()
+ {
+ CreateRunner ();
+ AddInstallAction ();
+ AddUninstallAction ();
+
+ Run ();
+
+ Assert.AreEqual (2, progressMonitor.BeginTaskTotalWork);
+ }
+
+ [Test]
+ public void Run_OneAction_ProgressMonitorEndTaskCalled ()
+ {
+ CreateRunner ();
+ AddInstallAction ();
+
+ Run ();
+
+ Assert.IsTrue (progressMonitor.IsTaskEnded);
+ }
+
+ [Test]
+ public void Run_TwoActions_BothActionsExecuted ()
+ {
+ CreateRunner ();
+ FakeInstallPackageAction action1 = AddInstallAction ();
+ FakeUninstallPackageAction action2 = AddUninstallAction ();
+
+ Run ();
+
+ Assert.IsTrue (action1.IsExecuteCalled);
+ Assert.IsTrue (action2.IsExecuted);
+ }
+
+ [Test]
+ public void Run_TwoActions_ProgressStepCalledTwice ()
+ {
+ CreateRunner ();
+ AddInstallAction ();
+ AddUninstallAction ();
+
+ Run ();
+
+ Assert.AreEqual (2, progressMonitor.StepCalledCount);
+ Assert.AreEqual (2, progressMonitor.TotalStepWork);
+ }
+
+ [Test]
+ public void Run_OneActionSuccessfully_SuccessReportedToProgressMonitor ()
+ {
+ CreateRunner ();
+ AddInstallAction ();
+
+ Run ();
+
+ Assert.AreEqual ("Success", progressMonitor.ReportedSuccessMessage);
+ }
+
+ [Test]
+ public void Run_OneInstallActionWithPowerShellScripts_WarningReportedToProgressMonitor ()
+ {
+ CreateRunner ();
+ AddInstallActionWithPowerShellScript ();
+
+ Run ();
+
+ Assert.AreEqual ("Warning", progressMonitor.ReportedWarningMessage);
+ }
+
+ [Test]
+ public void Run_OneInstallActionWithPowerShellScripts_WarningMessageLoggedInPackageConsole ()
+ {
+ CreateRunner ();
+ AddInstallActionWithPowerShellScript ("Test");
+
+ Run ();
+
+ progressMonitor.AssertMessageIsLogged ("Test Package contains PowerShell scripts which will not be run.");
+ }
+
+ [Test]
+ public void Run_OneInstallActionWithLicenseToAccept_WarningReportedToProgressMonitor ()
+ {
+ CreateRunner ();
+ AddInstallActionWithLicenseToAccept ();
+
+ Run ();
+
+ Assert.AreEqual ("Warning", progressMonitor.ReportedWarningMessage);
+ }
+
+ [Test]
+ public void Run_OneInstallActionWithLicenseToAccept_WarningMessageLoggedInPackageConsole ()
+ {
+ CreateRunner ();
+ AddInstallActionWithLicenseToAccept ("Test");
+
+ Run ();
+
+ progressMonitor.AssertMessageIsLogged ("The Test package has a license agreement");
+ }
+
+ [Test]
+ public void Run_OneInstallActionWithMissingPackageId_ErrorReportedToProgressMonitor ()
+ {
+ CreateRunner ();
+ AddInstallActionWithMissingPackageId ("Unknown");
+
+ Run ();
+
+ Assert.AreEqual ("Error", progressMonitor.ReportedErrorMessage);
+ }
+
+ [Test]
+ public void Run_OneInstallActionWithMissingPackageId_ErrorLoggedInPackageConsole ()
+ {
+ CreateRunner ();
+ AddInstallActionWithMissingPackageId ("Unknown");
+
+ Run ();
+
+ progressMonitor.AssertMessageIsLogged ("Unable to find package 'Unknown'.");
+ }
+
+ [Test]
+ public void Run_OneInstallActionWithMissingPackageId_PackageOperationsFinishedEventFired ()
+ {
+ CreateRunner ();
+ AddInstallActionWithMissingPackageId ("Unknown");
+ bool eventFired = false;
+ packageManagementEvents.PackageOperationsFinished += (sender, e) => {
+ eventFired = true;
+ };
+
+ Run ();
+
+ Assert.IsTrue (eventFired);
+ }
+
+ [Test]
+ public void Run_OneInstallActionWithMissingPackageId_PackageOperationErrorEventFired ()
+ {
+ CreateRunner ();
+ AddInstallActionWithMissingPackageId ("Unknown");
+ string exceptionMessage = null;
+ packageManagementEvents.PackageOperationError += (sender, e) => {
+ exceptionMessage = e.Exception.Message;
+ };
+
+ Run ();
+
+ Assert.AreEqual ("Unable to find package 'Unknown'.", exceptionMessage);
+ }
+
+ [Test]
+ public void Run_OneInstallActionWithMissingPackageId_PackageConsoleDisplayedDueToError ()
+ {
+ CreateRunner ();
+ AddInstallActionWithMissingPackageId ("Unknown");
+
+ Run ();
+
+ Assert.IsTrue (runner.EventsMonitor.IsPackageConsoleShown);
+ Assert.AreEqual (progressMonitor, runner.EventsMonitor.ProgressMonitorPassedToShowPackageConsole);
+ }
+
+ [Test]
+ public void Run_OneInstallActionWithMissingPackageId_InstallPackageOperationsRemovedFromPendingListWhenPackageOperationErrorEventFired ()
+ {
+ CreateRunner ();
+ AddInstallActionWithMissingPackageId ("Unknown");
+ int pendingInstallActionsCount = -1;
+ packageManagementEvents.PackageOperationError += (sender, e) => {
+ pendingInstallActionsCount = runner.PendingInstallActions.Count ();
+ };
+
+ Run ();
+
+ Assert.AreEqual (0, pendingInstallActionsCount);
+ }
+
+ [Test]
+ public void Run_ActionLogsPackageOperationMessage_ProgressMonitorLogsMessage ()
+ {
+ CreateRunner ();
+ AddInstallActionWithCustomExecuteAction (() => {
+ packageManagementEvents.OnPackageOperationMessageLogged (MessageLevel.Info, "Message");
+ });
+
+ Run ();
+
+ progressMonitor.AssertMessageIsLogged ("Message");
+ }
+
+ [Test]
+ public void Run_ActionChangesTwoFiles_FileServiceNotifiedOfFileChanges ()
+ {
+ CreateRunner ();
+ string file1 = @"d:\projects\MyProject\packages.config".ToNativePath ();
+ string file2 = @"d:\projects\MyProject\Scripts\jquery.js".ToNativePath ();
+ AddInstallActionWithCustomExecuteAction (() => {
+ packageManagementEvents.OnFileChanged (file1);
+ packageManagementEvents.OnFileChanged (file2);
+ });
+
+ Run ();
+
+ List<FilePath> filesChanged = runner.EventsMonitor.FilesChanged;
+ Assert.AreEqual (2, filesChanged.Count);
+ Assert.That (filesChanged, Contains.Item (new FilePath (file1)));
+ Assert.That (filesChanged, Contains.Item (new FilePath (file2)));
+ }
+
+ [Test]
+ public void Run_ActionDownloadsTwoPackages_DownloadingMessageLoggedOnceForEachDownloadOperationByProgressMonitor ()
+ {
+ CreateRunner ();
+ AddInstallActionWithCustomExecuteAction (() => {
+ var repository = new FakePackageRepository ();
+ repositoryFactoryEvents.RaiseRepositoryCreatedEvent (new PackageRepositoryFactoryEventArgs (repository));
+
+ var progress = new ProgressEventArgs ("Download1", 100);
+ repository.RaiseProgressAvailableEvent (progress);
+
+ progress = new ProgressEventArgs ("Download2", 50);
+ repository.RaiseProgressAvailableEvent (progress);
+
+ progress = new ProgressEventArgs ("Download2", 100);
+ repository.RaiseProgressAvailableEvent (progress);
+ });
+
+ Run ();
+
+ progressMonitor.AssertMessageIsLogged ("Download1");
+ progressMonitor.AssertMessageIsLogged ("Download2");
+ progressMonitor.AssertMessageIsNotLogged ("Download2" + Environment.NewLine + "Download2");
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/DelegateCommandTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/DelegateCommandTests.cs
new file mode 100644
index 0000000000..eee4b6f1da
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/DelegateCommandTests.cs
@@ -0,0 +1,94 @@
+//
+// DelegateCommandTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class DelegateCommandTests
+ {
+ [Test]
+ public void CanExecute_NoCanExecuteDelegateDefined_ReturnsTrue ()
+ {
+ Action<object> execute = delegate { };
+ var command = new DelegateCommand (execute);
+
+ bool result = command.CanExecute (null);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void CanExecute_CanExecuteDelegateDefinedToReturnFalse_ReturnsFalse ()
+ {
+ Action<object> execute = delegate { };
+ Predicate<object> canExecute = delegate {
+ return false;
+ };
+ var command = new DelegateCommand (execute, canExecute);
+
+ bool result = command.CanExecute (null);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void CanExecute_CanExecuteDelegateDefined_ParameterPassedToCanExecuteDelegate ()
+ {
+ Action<object> execute = delegate { };
+
+ object parameterPassed = null;
+ Predicate<object> canExecute = param => {
+ parameterPassed = param;
+ return true;
+ };
+ var command = new DelegateCommand (execute, canExecute);
+
+ object expectedParameter = new object ();
+ bool result = command.CanExecute (expectedParameter);
+
+ Assert.AreEqual (expectedParameter, parameterPassed);
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void Execute_ObjectPassedAsParameter_ParameterPassedToExecuteDelegate ()
+ {
+ object parameterPassed = null;
+ Action<object> execute = param => parameterPassed = param;
+ var command = new DelegateCommand (execute);
+
+ object expectedParameter = new object ();
+ command.Execute (expectedParameter);
+
+ Assert.AreEqual (expectedParameter, parameterPassed);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/IPackageExtensionsTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/IPackageExtensionsTests.cs
new file mode 100644
index 0000000000..5113b3f35d
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/IPackageExtensionsTests.cs
@@ -0,0 +1,114 @@
+//
+// IPackageExtensionsTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class IPackageExtensionsTests
+ {
+ FakePackage package;
+
+ void CreatePackageWithSummary (string summary)
+ {
+ package = new FakePackage { Summary = summary };
+ }
+
+ void CreatePackageWithTitle (string title)
+ {
+ package = new FakePackage { Title = title };
+ }
+
+ [Test]
+ public void SummaryOrDescription_PackageHasSummary_ReturnsSummary ()
+ {
+ CreatePackageWithSummary ("summary");
+
+ string result = package.SummaryOrDescription ();
+
+ Assert.AreEqual ("summary", result);
+ }
+
+ [Test]
+ public void SummaryOrDescription_PackageHasDescriptionButNullSummary_ReturnsDescription ()
+ {
+ CreatePackageWithSummary (null);
+ package.Description = "description";
+
+ string result = package.SummaryOrDescription ();
+
+ Assert.AreEqual ("description", result);
+ }
+
+ [Test]
+ public void SummaryOrDescription_PackageHasDescriptionButEmptySummary_ReturnsDescription ()
+ {
+ CreatePackageWithSummary (String.Empty);
+ package.Description = "description";
+
+ string result = package.SummaryOrDescription ();
+
+ Assert.AreEqual ("description", result);
+ }
+
+ [Test]
+ public void GetName_PackageHasTitle_ReturnsTitle ()
+ {
+ CreatePackageWithTitle ("title");
+
+ string result = package.GetName ();
+
+ Assert.AreEqual ("title", result);
+ }
+
+ [Test]
+ public void GetName_PackageHasNullTitle_ReturnsPackageId ()
+ {
+ CreatePackageWithTitle (null);
+ package.Id = "Id";
+
+ string result = package.GetName ();
+
+ Assert.AreEqual ("Id", result);
+ }
+
+ [Test]
+ public void GetName_PackageHasEmptyStringTitle_ReturnsPackageId ()
+ {
+ CreatePackageWithTitle (String.Empty);
+ package.Id = "Id";
+
+ string result = package.GetName ();
+
+ Assert.AreEqual ("Id", result);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/InstallPackageActionTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/InstallPackageActionTests.cs
new file mode 100644
index 0000000000..da59bdb7c8
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/InstallPackageActionTests.cs
@@ -0,0 +1,499 @@
+//
+// InstallPackageActionTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class InstallPackageActionTests
+ {
+ PackageManagementEvents packageManagementEvents;
+ FakePackageManagementProject fakeProject;
+ InstallPackageAction action;
+ InstallPackageHelper installPackageHelper;
+
+ void CreateAction ()
+ {
+ packageManagementEvents = new PackageManagementEvents ();
+ fakeProject = new FakePackageManagementProject ();
+ action = new InstallPackageAction (fakeProject, packageManagementEvents);
+ installPackageHelper = new InstallPackageHelper (action);
+ }
+
+ FakePackage AddOnePackageToProjectSourceRepository (string packageId)
+ {
+ return fakeProject.FakeSourceRepository.AddFakePackage (packageId);
+ }
+
+ void AddInstallOperationWithFile (string fileName)
+ {
+ action.Operations =
+ PackageOperationHelper.CreateListWithOneInstallOperationWithFile (fileName);
+ }
+
+ [Test]
+ public void Execute_PackageIsSet_InstallsPackageIntoProject ()
+ {
+ CreateAction ();
+ installPackageHelper.InstallTestPackage ();
+
+ var actualPackage = fakeProject.PackagePassedToInstallPackage;
+ var expectedPackage = installPackageHelper.TestPackage;
+
+ Assert.AreEqual (expectedPackage, actualPackage);
+ }
+
+ [Test]
+ public void Execute_PackageIsSet_InstallsPackageUsingPackageOperations ()
+ {
+ CreateAction ();
+ var expectedOperations = new List<PackageOperation> ();
+ installPackageHelper.PackageOperations = expectedOperations;
+ installPackageHelper.InstallTestPackage ();
+
+ var actualOperations = fakeProject.PackageOperationsPassedToInstallPackage;
+
+ Assert.AreEqual (expectedOperations, actualOperations);
+ }
+
+ [Test]
+ public void Execute_PackageIsSet_InstallsPackageNotIgnoringDependencies ()
+ {
+ CreateAction ();
+ installPackageHelper.IgnoreDependencies = false;
+ installPackageHelper.InstallTestPackage ();
+
+ bool ignored = fakeProject.IgnoreDependenciesPassedToInstallPackage;
+
+ Assert.IsFalse (ignored);
+ }
+
+ [Test]
+ public void Execute_PackageIsSetAndIgnoreDependenciesIsTrue_InstallsPackageIgnoringDependencies ()
+ {
+ CreateAction ();
+ installPackageHelper.IgnoreDependencies = true;
+ installPackageHelper.InstallTestPackage ();
+
+ bool ignored = fakeProject.IgnoreDependenciesPassedToInstallPackage;
+
+ Assert.IsTrue (ignored);
+ }
+
+ [Test]
+ public void Execute_PackageIsSetAndAllowPrereleaseVersionsIsTrue_InstallsPackageAllowingPrereleaseVersions ()
+ {
+ CreateAction ();
+ installPackageHelper.AllowPrereleaseVersions = true;
+ installPackageHelper.InstallTestPackage ();
+
+ bool allowed = fakeProject.AllowPrereleaseVersionsPassedToInstallPackage;
+
+ Assert.IsTrue (allowed);
+ }
+
+ [Test]
+ public void Execute_PackageIsSetAndAllowPrereleaseVersionsIsFalse_InstallsPackageWithoutAllowingPrereleaseVersions ()
+ {
+ CreateAction ();
+ installPackageHelper.AllowPrereleaseVersions = false;
+ installPackageHelper.InstallTestPackage ();
+
+ bool allowed = fakeProject.AllowPrereleaseVersionsPassedToInstallPackage;
+
+ Assert.IsFalse (allowed);
+ }
+
+ [Test]
+ public void IgnoreDependencies_DefaultValue_IsFalse ()
+ {
+ CreateAction ();
+ Assert.IsFalse (action.IgnoreDependencies);
+ }
+
+ [Test]
+ public void AllowPrereleaseVersion_DefaultValue_IsFalse ()
+ {
+ CreateAction ();
+ Assert.IsFalse (action.AllowPrereleaseVersions);
+ }
+
+ [Test]
+ public void Execute_PackageAndPackageRepositoryPassed_PackageInstallNotificationRaisedWithInstalledPackage ()
+ {
+ CreateAction ();
+ IPackage actualPackage = null;
+ packageManagementEvents.ParentPackageInstalled += (sender, e) => actualPackage = e.Package;
+ installPackageHelper.InstallTestPackage ();
+
+ IPackage expectedPackage = installPackageHelper.TestPackage;
+
+ Assert.AreEqual (expectedPackage, actualPackage);
+ }
+
+ [Test]
+ public void Execute_PackageIdAndSourceAndProjectPassed_PackageOperationsRetrievedFromProject ()
+ {
+ CreateAction ();
+ fakeProject.AddFakeInstallOperation ();
+ fakeProject.AddFakePackageToSourceRepository ("PackageId");
+ installPackageHelper.InstallPackageById ("PackageId");
+
+ var actualOperations = action.Operations;
+ var expectedOperations = fakeProject.FakeInstallOperations;
+
+ Assert.AreEqual (expectedOperations, actualOperations);
+ }
+
+ [Test]
+ public void Execute_PackageSpecifiedButNoPackageOperations_PackageUsedWhenPackageOperationsRetrievedForProject ()
+ {
+ CreateAction ();
+ installPackageHelper.PackageOperations = null;
+ installPackageHelper.InstallTestPackage ();
+
+ var expectedPackage = installPackageHelper.TestPackage;
+
+ var actualPackage = fakeProject.PackagePassedToGetInstallPackageOperations;
+
+ Assert.AreEqual (expectedPackage, actualPackage);
+ }
+
+ [Test]
+ public void Execute_PackageIdAndSourceAndProjectPassedAndIgnoreDependenciesIsTrue_DependenciesIgnoredWhenGettingPackageOperations ()
+ {
+ CreateAction ();
+ fakeProject.AddFakePackageToSourceRepository ("PackageId");
+ installPackageHelper.IgnoreDependencies = true;
+ installPackageHelper.InstallPackageById ("PackageId");
+
+ bool result = fakeProject.IgnoreDependenciesPassedToGetInstallPackageOperations;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void Execute_PackageIdAndSourceAndProjectPassedAndAllowPrereleaseVersionsIsTrue_PrereleaseVersionsAllowedWhenGettingPackageOperations ()
+ {
+ CreateAction ();
+ fakeProject.AddFakePackageToSourceRepository ("PackageId");
+ installPackageHelper.AllowPrereleaseVersions = true;
+ installPackageHelper.InstallPackageById ("PackageId");
+
+ bool result = fakeProject.AllowPrereleaseVersionsPassedToGetInstallPackageOperations;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void InstallPackage_PackageIdAndSourceAndProjectPassedAndIgnoreDependenciesIsFalse_DependenciesNotIgnoredWhenGettingPackageOperations ()
+ {
+ CreateAction ();
+ fakeProject.AddFakePackageToSourceRepository ("PackageId");
+ installPackageHelper.IgnoreDependencies = false;
+ installPackageHelper.InstallPackageById ("PackageId");
+
+ bool result = fakeProject.IgnoreDependenciesPassedToGetInstallPackageOperations;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void Execute_PackageIdAndSourceAndProjectPassedAndAllowPrereleaseVersionsIsFalse_PrereleaseVersionsNotAllowedWhenGettingPackageOperations ()
+ {
+ CreateAction ();
+ fakeProject.AddFakePackageToSourceRepository ("PackageId");
+ installPackageHelper.AllowPrereleaseVersions = false;
+ installPackageHelper.InstallPackageById ("PackageId");
+
+ bool result = fakeProject.AllowPrereleaseVersionsPassedToGetInstallPackageOperations;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void Execute_VersionSpecified_VersionUsedWhenSearchingForPackage ()
+ {
+ CreateAction ();
+
+ var recentPackage = AddOnePackageToProjectSourceRepository ("PackageId");
+ recentPackage.Version = new SemanticVersion ("1.2.0");
+
+ var oldPackage = AddOnePackageToProjectSourceRepository ("PackageId");
+ oldPackage.Version = new SemanticVersion ("1.0.0");
+
+ var package = AddOnePackageToProjectSourceRepository ("PackageId");
+ var version = new SemanticVersion ("1.1.0");
+ package.Version = version;
+
+ installPackageHelper.Version = version;
+ installPackageHelper.InstallPackageById ("PackageId");
+
+ var actualPackage = fakeProject.PackagePassedToInstallPackage;
+
+ Assert.AreEqual (package, actualPackage);
+ }
+
+ [Test]
+ public void HasPackageScriptsToRun_OnePackageInOperationsHasInitPowerShellScript_ReturnsTrue ()
+ {
+ CreateAction ();
+ fakeProject.AddFakePackageToSourceRepository ("Test");
+ action.PackageId = "Test";
+ AddInstallOperationWithFile (@"tools\init.ps1".ToNativePath ());
+
+ bool hasPackageScripts = action.HasPackageScriptsToRun ();
+
+ Assert.IsTrue (hasPackageScripts);
+ }
+
+ [Test]
+ public void HasPackageScriptsToRun_OnePackageInOperationsHasNoFiles_ReturnsFalse ()
+ {
+ CreateAction ();
+ fakeProject.AddFakePackageToSourceRepository ("Test");
+ action.PackageId = "Test";
+ action.Operations = new List<PackageOperation> ();
+
+ bool hasPackageScripts = action.HasPackageScriptsToRun ();
+
+ Assert.IsFalse (hasPackageScripts);
+ }
+
+ [Test]
+ public void HasPackageScriptsToRun_OnePackageInOperationsHasInitPowerShellScriptInUpperCase_ReturnsTrue ()
+ {
+ CreateAction ();
+ fakeProject.AddFakePackageToSourceRepository ("Test");
+ action.PackageId = "Test";
+ AddInstallOperationWithFile (@"tools\INIT.PS1".ToNativePath ());
+
+ bool hasPackageScripts = action.HasPackageScriptsToRun ();
+
+ Assert.IsTrue (hasPackageScripts);
+ }
+
+ [Test]
+ public void HasPackageScriptsToRun_OnePackageInOperationsHasInstallPowerShellScriptInUpperCase_ReturnsTrue ()
+ {
+ CreateAction ();
+ fakeProject.AddFakePackageToSourceRepository ("Test");
+ action.PackageId = "Test";
+ AddInstallOperationWithFile (@"tools\INSTALL.PS1".ToNativePath ());
+
+ bool hasPackageScripts = action.HasPackageScriptsToRun ();
+
+ Assert.IsTrue (hasPackageScripts);
+ }
+
+ [Test]
+ public void HasPackageScriptsToRun_OnePackageInOperationsHasUninstallPowerShellScriptInUpperCase_ReturnsTrue ()
+ {
+ CreateAction ();
+ fakeProject.AddFakePackageToSourceRepository ("Test");
+ action.PackageId = "Test";
+ AddInstallOperationWithFile (@"tools\UNINSTALL.PS1".ToNativePath ());
+
+ bool hasPackageScripts = action.HasPackageScriptsToRun ();
+
+ Assert.IsTrue (hasPackageScripts);
+ }
+
+ [Test]
+ public void HasPackageScriptsToRun_ProjectHasOnePackageOperation_DoesNotThrowNullReferenceException ()
+ {
+ CreateAction ();
+ FakePackage package = fakeProject.FakeSourceRepository.AddFakePackageWithVersion ("Test", "1.0");
+ var operation = new FakePackageOperation (package, PackageAction.Install);
+ action.PackageId = package.Id;
+ action.PackageVersion = package.Version;
+ fakeProject.FakeInstallOperations.Add (operation);
+
+ Assert.DoesNotThrow (() => action.HasPackageScriptsToRun ());
+ }
+
+ [Test]
+ public void HasPackageScriptsToRun_ProjectHasOnePackageOperation_PackageLocated ()
+ {
+ CreateAction ();
+ FakePackage expectedPackage = fakeProject.FakeSourceRepository.AddFakePackageWithVersion ("Test", "1.0");
+ var operation = new FakePackageOperation (expectedPackage, PackageAction.Install);
+ action.PackageId = expectedPackage.Id;
+ action.PackageVersion = expectedPackage.Version;
+ fakeProject.FakeInstallOperations.Add (operation);
+
+ action.HasPackageScriptsToRun ();
+
+ IPackage actualPackage = action.Package;
+
+ Assert.AreEqual (expectedPackage, actualPackage);
+ }
+
+ [Test]
+ public void Execute_InstallPrereleasePackageAndAllowPreleasePackagesIsFalse_DoesNotFindPreleasePackage ()
+ {
+ CreateAction ();
+ fakeProject.FakeSourceRepository.AddFakePackageWithVersion ("Prerelease", "1.0-beta");
+ action.PackageId = "Prerelease";
+ action.AllowPrereleaseVersions = false;
+
+ Exception ex = Assert.Throws (typeof(ApplicationException), () => action.Execute ());
+
+ Assert.AreEqual ("Unable to find package 'Prerelease'.", ex.Message);
+ }
+
+ [Test]
+ public void Execute_InstallPrereleasePackageAndAllowPreleasePackagesIsTrue_InstallsPackageIntoProject ()
+ {
+ CreateAction ();
+ FakePackage expectedPackage = fakeProject.FakeSourceRepository.AddFakePackageWithVersion ("Prerelease", "1.0-beta");
+ action.PackageId = "Prerelease";
+ action.AllowPrereleaseVersions = true;
+
+ action.Execute ();
+
+ IPackage actualPackage = fakeProject.PackagePassedToInstallPackage;
+ Assert.AreEqual (expectedPackage, actualPackage);
+ }
+
+ [Test]
+ public void Execute_InstallUnlistedPackageWithoutVersion_DoesNotInstallPackageIntoProject ()
+ {
+ CreateAction ();
+ FakePackage expectedPackage = fakeProject.FakeSourceRepository.AddFakePackageWithVersion ("test", "1.0");
+ expectedPackage.Listed = false;
+ action.PackageId = "test";
+
+ Exception ex = Assert.Throws (typeof(ApplicationException), () => action.Execute ());
+
+ Assert.AreEqual ("Unable to find package 'test'.", ex.Message);
+ }
+
+ [Test]
+ public void Execute_PackageIdSpecifiedButDoesNotExistInRepository_ExceptionThrown ()
+ {
+ CreateAction ();
+ action.PackageId = "UnknownId";
+
+ Exception ex = Assert.Throws (typeof(ApplicationException), () => action.Execute ());
+
+ Assert.AreEqual ("Unable to find package 'UnknownId'.", ex.Message);
+ }
+
+ [Test]
+ public void Execute_ProjectHasOnePackageInstallOperationThatHasALicenseToBeAccepted_AcceptLicensesEventRaised ()
+ {
+ CreateAction ();
+ FakePackage expectedPackage = fakeProject.FakeSourceRepository.AddFakePackageWithVersion ("Test", "1.0");
+ expectedPackage.RequireLicenseAcceptance = true;
+ var expectedPackages = new IPackage [] { expectedPackage };
+ var operation = new FakePackageOperation (expectedPackage, PackageAction.Install);
+ action.PackageId = expectedPackage.Id;
+ action.PackageVersion = expectedPackage.Version;
+ fakeProject.FakeInstallOperations.Add (operation);
+ List<IPackage> actualPackages = null;
+ packageManagementEvents.AcceptLicenses += (sender, e) => {
+ e.IsAccepted = true;
+ actualPackages = e.Packages.ToList ();
+ };
+
+ action.Execute ();
+
+ PackageCollectionAssert.AreEqual (expectedPackages, actualPackages);
+ }
+
+ [Test]
+ public void Execute_ProjectHasOnePackageInstallOperationThatHasALicenseToBeAcceptedButPackageInstalledAlready_NoAcceptLicensesEventIsRaised ()
+ {
+ CreateAction ();
+ FakePackage expectedPackage = fakeProject.FakeSourceRepository.AddFakePackageWithVersion ("Test", "1.0");
+ expectedPackage.RequireLicenseAcceptance = true;
+ var expectedPackages = new IPackage [] { expectedPackage };
+ var operation = new FakePackageOperation (expectedPackage, PackageAction.Install);
+ action.PackageId = expectedPackage.Id;
+ action.PackageVersion = expectedPackage.Version;
+ fakeProject.FakeInstallOperations.Add (operation);
+ fakeProject.FakePackages.Add (expectedPackage);
+ bool acceptLicensesEventRaised = false;
+ packageManagementEvents.AcceptLicenses += (sender, e) => {
+ acceptLicensesEventRaised = true;
+ };
+
+ action.Execute ();
+
+ Assert.IsFalse (acceptLicensesEventRaised);
+ }
+
+ [Test]
+ public void Execute_ProjectHasOnePackageInstallOperationThatHasALicenseToBeAcceptedAndLicensesNotAccepted_ExceptionThrown ()
+ {
+ CreateAction ();
+ FakePackage expectedPackage = fakeProject.FakeSourceRepository.AddFakePackageWithVersion ("Test", "1.0");
+ expectedPackage.RequireLicenseAcceptance = true;
+ var expectedPackages = new IPackage [] { expectedPackage };
+ var operation = new FakePackageOperation (expectedPackage, PackageAction.Install);
+ action.PackageId = expectedPackage.Id;
+ action.PackageVersion = expectedPackage.Version;
+ fakeProject.FakeInstallOperations.Add (operation);
+ packageManagementEvents.AcceptLicenses += (sender, e) => {
+ e.IsAccepted = false;
+ };
+
+ Exception ex = Assert.Throws (typeof(ApplicationException), () => action.Execute ());
+
+ Assert.AreEqual ("Licenses not accepted.", ex.Message);
+ }
+
+ [Test]
+ public void Execute_PackageBeingInstalledHasPowerShellScripts_WarningAboutPowerShellScriptsIsLogged ()
+ {
+ CreateAction ();
+ FakePackage expectedPackage = fakeProject.FakeSourceRepository.AddFakePackageWithVersion ("Test", "1.0");
+ expectedPackage.AddFile (@"tools\init.ps1");
+ var operation = new FakePackageOperation (expectedPackage, PackageAction.Install);
+ action.PackageId = expectedPackage.Id;
+ action.PackageVersion = expectedPackage.Version;
+ fakeProject.FakeInstallOperations.Add (operation);
+ string messageLogged = null;
+ packageManagementEvents.PackageOperationMessageLogged += (sender, e) => {
+ if (e.Message.Level == MessageLevel.Warning) {
+ messageLogged = e.Message.ToString ();
+ }
+ };
+
+ action.Execute ();
+
+ Assert.AreEqual ("Test Package contains PowerShell scripts which will not be run.", messageLogged);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MSBuildProjectExtensionsTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MSBuildProjectExtensionsTests.cs
index e5625cd037..78593251e5 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MSBuildProjectExtensionsTests.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MSBuildProjectExtensionsTests.cs
@@ -12,64 +12,64 @@ namespace MonoDevelop.PackageManagement.Tests
public class MSBuildProjectExtensionsTests
{
MSBuildProject project;
-
+
void CreateProject ()
{
project = new MSBuildProject ();
}
-
+
void AddImportIfMissingAtBottom (string importFile, string condition = "")
{
project.AddImportIfMissing (importFile, ProjectImportLocation.Bottom, condition);
}
-
+
void AddImportIfMissingAtTop (string importFile, string condition = "")
{
project.AddImportIfMissing (importFile, ProjectImportLocation.Top, condition);
}
-
+
void AssertLastMSBuildImportElementHasProjectAttributeValue (string expectedAttributeValue)
{
XmlElement import = GetLastMSBuildImportElement ();
string actualAttributeValue = import.GetAttribute ("Project");
Assert.AreEqual (expectedAttributeValue, actualAttributeValue);
}
-
+
void AssertLastMSBuildImportElementHasCondition (string expectedCondition)
{
XmlElement import = GetLastMSBuildImportElement ();
string actualCondition = import.GetAttribute ("Condition");
Assert.AreEqual (expectedCondition, actualCondition);
}
-
- XmlElement GetLastMSBuildImportElement()
+
+ XmlElement GetLastMSBuildImportElement ()
{
var import = project.Document.DocumentElement.LastChild as XmlElement;
Assert.AreEqual (import.LocalName, "Import");
return import;
}
-
+
void AssertFirstMSBuildImportElementHasProjectAttributeValue (string expectedAttributeValue)
{
XmlElement import = GetFirstMSBuildImportElement ();
string actualAttributeValue = import.GetAttribute ("Project");
Assert.AreEqual (expectedAttributeValue, actualAttributeValue);
}
-
- XmlElement GetFirstMSBuildImportElement()
+
+ XmlElement GetFirstMSBuildImportElement ()
{
var import = project.Document.DocumentElement.FirstChild as XmlElement;
Assert.AreEqual (import.LocalName, "Import");
return import;
}
-
+
void AssertFirstMSBuildImportElementHasCondition (string expectedCondition)
{
XmlElement import = GetFirstMSBuildImportElement ();
string actualCondition = import.GetAttribute ("Condition");
Assert.AreEqual (expectedCondition, actualCondition);
}
-
+
[Test]
public void AddImportIfMissing_RelativeImportFilePathAndBottomOfProject_ImportAddedAsLastImportInProject ()
{
@@ -80,7 +80,7 @@ namespace MonoDevelop.PackageManagement.Tests
AssertLastMSBuildImportElementHasProjectAttributeValue (@"..\packages\Foo.0.1\build\Foo.targets");
}
-
+
[Test]
public void AddImportIfMissing_AddImportToBottomOfProjectWithCondition_ImportAddedWithCondition ()
{
@@ -92,7 +92,7 @@ namespace MonoDevelop.PackageManagement.Tests
AssertLastMSBuildImportElementHasCondition (condition);
}
-
+
[Test]
public void ImportExists_ImportAlreadyExists_ReturnsTrue ()
{
@@ -103,7 +103,7 @@ namespace MonoDevelop.PackageManagement.Tests
Assert.IsTrue (exists);
}
-
+
[Test]
public void ImportExists_ImportDoesNotExist_ReturnsFalse ()
{
@@ -114,7 +114,7 @@ namespace MonoDevelop.PackageManagement.Tests
Assert.IsFalse (exists);
}
-
+
[Test]
public void ImportExists_DifferentImportExists_ReturnsFalse ()
{
@@ -125,9 +125,9 @@ namespace MonoDevelop.PackageManagement.Tests
Assert.IsFalse (exists);
}
-
+
[Test]
- public void AddImportIfMissing_AddSameImportTwice_ImportOnlyAddedOnceToProject()
+ public void AddImportIfMissing_AddSameImportTwice_ImportOnlyAddedOnceToProject ()
{
CreateProject ();
string import = @"packages\Foo.0.1\build\Foo.targets";
@@ -137,7 +137,7 @@ namespace MonoDevelop.PackageManagement.Tests
Assert.AreEqual (1, project.Document.DocumentElement.ChildNodes.Count);
}
-
+
[Test]
public void ImportExists_ImportExistsButtWithDifferentCase_ReturnsTrue ()
{
@@ -150,7 +150,7 @@ namespace MonoDevelop.PackageManagement.Tests
Assert.IsTrue (exists);
}
-
+
[Test]
public void RemoveImportIfExists_ImportAlreadyAddedToBottomOfProject_ImportRemoved ()
{
@@ -162,7 +162,7 @@ namespace MonoDevelop.PackageManagement.Tests
Assert.AreEqual (0, project.Document.DocumentElement.ChildNodes.Count);
}
-
+
[Test]
public void RemoveImportIfExists_ImportAlreadyWithDifferentCaseAddedToBottomOfProject_ImportRemoved ()
{
@@ -175,7 +175,7 @@ namespace MonoDevelop.PackageManagement.Tests
Assert.AreEqual (0, project.Document.DocumentElement.ChildNodes.Count);
}
-
+
[Test]
public void AddImportIfMissing_AddToTopOfProject_ImportAddedAsFirstChildElement ()
{
@@ -187,7 +187,7 @@ namespace MonoDevelop.PackageManagement.Tests
AssertFirstMSBuildImportElementHasProjectAttributeValue (@"..\packages\Foo.0.1\build\Foo.targets");
}
-
+
[Test]
public void AddImportIfMissing_AddImportToTopOfProject_ImportAddedWithConditionThatChecksForExistenceOfTargetsFile ()
{
@@ -200,7 +200,7 @@ namespace MonoDevelop.PackageManagement.Tests
AssertFirstMSBuildImportElementHasCondition (condition);
}
-
+
[Test]
public void AddImportIfMissing_AddToTopOfProjectTwice_ImportAddedOnlyOnce ()
{
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopPackageManagerFactoryTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopPackageManagerFactoryTests.cs
new file mode 100644
index 0000000000..921e216264
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopPackageManagerFactoryTests.cs
@@ -0,0 +1,141 @@
+//
+// SharpDevelopPackageManagerFactoryTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class MonoDevelopPackageManagerFactoryTests
+ {
+ SharpDevelopPackageManagerFactory factory;
+ IPackageManager packageManager;
+ FakePackageRepository fakePackageRepository;
+ FakeDotNetProject testProject;
+ PackageManagementOptions options;
+ FakePackageRepositoryFactory fakePackageRepositoryFactory;
+ FakeProjectSystemFactory fakeProjectSystemFactory;
+
+ void CreateFactory ()
+ {
+ options = new TestablePackageManagementOptions ();
+ fakePackageRepositoryFactory = new FakePackageRepositoryFactory ();
+ fakeProjectSystemFactory = new FakeProjectSystemFactory ();
+ factory = new SharpDevelopPackageManagerFactory (fakePackageRepositoryFactory, fakeProjectSystemFactory, options);
+ }
+
+ void CreateTestProject ()
+ {
+ testProject = ProjectHelper.CreateTestProject ();
+ var solution = new FakeSolution {
+ BaseDirectory = @"c:\projects\MyProject\".ToNativePath ()
+ };
+ testProject.ParentSolution = solution;
+ }
+
+ void CreatePackageManager ()
+ {
+ fakePackageRepository = new FakePackageRepository ();
+ packageManager = factory.CreatePackageManager (fakePackageRepository, testProject);
+ }
+
+ [Test]
+ public void CreatePackageManager_ProjectAndSolutionHaveDifferentFolders_PackageManagerLocalRepositoryIsSharedRepository ()
+ {
+ CreateFactory ();
+ CreateTestProject ();
+ CreatePackageManager ();
+ ISharedPackageRepository sharedRepository = packageManager.LocalRepository as ISharedPackageRepository;
+
+ Assert.IsNotNull (sharedRepository);
+ }
+
+ [Test]
+ public void CreatePackageManager_PackagesSolutionFolderDefinedInOptions_SharedLocalRepositoryFileSystemRootIsSolutionFolder ()
+ {
+ CreateFactory ();
+ CreateTestProject ();
+ options.PackagesDirectory = "MyPackages";
+ CreatePackageManager ();
+
+ string expectedRoot = @"c:\projects\MyProject\MyPackages".ToNativePath ();
+ string actualRoot = fakePackageRepositoryFactory.FileSystemPassedToCreateSharedRepository.Root;
+ Assert.AreEqual (expectedRoot, actualRoot);
+ }
+
+ [Test]
+ public void CreatePackageManager_PackagesSolutionFolderDefinedInOptions_SharedLocalRepositoryPackagePathResolverCreatedWithPackagesFolderInsideSolutionFolder ()
+ {
+ CreateFactory ();
+ CreateTestProject ();
+ options.PackagesDirectory = "MyPackages";
+ CreatePackageManager ();
+
+ FakePackage package = new FakePackage ("Test.Package");
+ package.Version = new SemanticVersion (1, 0, 0, 0);
+ string expectedDirectory = @"c:\projects\MyProject\MyPackages\Test.Package.1.0.0.0".ToNativePath ();
+ string actualDirectory =
+ fakePackageRepositoryFactory
+ .PathResolverPassedToCreateSharedRepository
+ .GetInstallPath (package);
+
+ Assert.AreEqual (expectedDirectory, actualDirectory);
+ }
+
+ [Test]
+ public void CreatePackageManager_PackagesSolutionFolderDefinedInOptions_LocalRepositoryFileSystemIsPackageManagerFileSystem ()
+ {
+ CreateFactory ();
+ CreateTestProject ();
+ CreatePackageManager ();
+
+ Assert.AreEqual (packageManager.FileSystem, fakePackageRepositoryFactory.FileSystemPassedToCreateSharedRepository);
+ }
+
+ [Test]
+ public void CreatePackageManager_PackagesSolutionFolderDefinedInOptions_PackageManagerPathResolverUsesPackagesFolderInsideSolutionFolder ()
+ {
+ CreateFactory ();
+ CreateTestProject ();
+ options.PackagesDirectory = "packages";
+ CreatePackageManager ();
+
+ var package = new FakePackage ("TestPackage", "1.0.0.0");
+
+ string expectedDirectory = @"c:\projects\MyProject\packages\TestPackage.1.0.0.0".ToNativePath ();
+
+ SharpDevelopPackageManager sharpDevelopPackageManager = packageManager as SharpDevelopPackageManager;
+ string actualDirectory = sharpDevelopPackageManager.PathResolver.GetInstallPath (package);
+
+ Assert.AreEqual (expectedDirectory, actualDirectory);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopPackageManagerTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopPackageManagerTests.cs
new file mode 100644
index 0000000000..beb98f08ff
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopPackageManagerTests.cs
@@ -0,0 +1,1139 @@
+//
+// SharpDevelopPackageManagerTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Linq;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class MonoDevelopPackageManagerTests
+ {
+ SharpDevelopPackageManager packageManager;
+ FakePackageRepository fakeFeedSourceRepository;
+ FakeSharedPackageRepository fakeSolutionSharedRepository;
+ FakeProject project;
+ PackageManagementOptions options;
+ SolutionPackageRepositoryPath repositoryPaths;
+ PackageReferenceRepositoryHelper packageRefRepositoryHelper;
+ TestableProjectManager testableProjectManager;
+ FakeFileSystem fakeFileSystem;
+ FakePackageOperationResolverFactory fakePackageOperationResolverFactory;
+ FakePackageOperationResolver fakePackageOperationResolver;
+
+ void CreatePackageManager (IProject project, PackageReferenceRepositoryHelper packageRefRepositoryHelper)
+ {
+ options = new TestablePackageManagementOptions ();
+ options.PackagesDirectory = "packages";
+
+ repositoryPaths = new SolutionPackageRepositoryPath (project, options);
+ var pathResolver = new DefaultPackagePathResolver (repositoryPaths.PackageRepositoryPath);
+
+ fakeFileSystem = new FakeFileSystem ();
+
+ fakeFeedSourceRepository = new FakePackageRepository ();
+ fakeSolutionSharedRepository = packageRefRepositoryHelper.FakeSharedSourceRepository;
+
+ fakePackageOperationResolverFactory = new FakePackageOperationResolverFactory ();
+ fakePackageOperationResolver = fakePackageOperationResolverFactory.FakeInstallPackageOperationResolver;
+
+ var fakeSolutionPackageRepository = new FakeSolutionPackageRepository ();
+ fakeSolutionPackageRepository.FileSystem = fakeFileSystem;
+ fakeSolutionPackageRepository.PackagePathResolver = pathResolver;
+ fakeSolutionPackageRepository.FakeSharedRepository = fakeSolutionSharedRepository;
+
+ packageManager = new SharpDevelopPackageManager (fakeFeedSourceRepository,
+ packageRefRepositoryHelper.FakeProjectSystem,
+ fakeSolutionPackageRepository,
+ fakePackageOperationResolverFactory);
+ }
+
+ void CreatePackageManager ()
+ {
+ CreateTestProject ();
+ CreatePackageReferenceRepositoryHelper ();
+ CreatePackageManager (project, packageRefRepositoryHelper);
+ }
+
+ void CreatePackageReferenceRepositoryHelper ()
+ {
+ packageRefRepositoryHelper = new PackageReferenceRepositoryHelper ();
+ }
+
+ void CreateTestProject ()
+ {
+ var solution = new FakeSolution (@"c:\projects\Test\MyProject\MySolution.sln");
+ solution.BaseDirectory = @"c:\projects\Test\MyProject";
+ project = new FakeProject ();
+ project.ParentSolution = solution;
+ }
+
+ void CreateTestableProjectManager ()
+ {
+ testableProjectManager = new TestableProjectManager ();
+ packageManager.ProjectManager = testableProjectManager;
+ }
+
+ FakePackage CreateFakePackage (string id = "Test", string version = "1.0.0.0")
+ {
+ return new FakePackage (id, version);
+ }
+
+ FakePackage InstallPackage ()
+ {
+ FakePackage package = CreateFakePackage ();
+ packageManager.InstallPackage (package);
+ return package;
+ }
+
+ FakePackage InstallPackageWithNoPackageOperations ()
+ {
+ return InstallPackageWithNoPackageOperations (ignoreDependencies: false);
+ }
+
+ FakePackage InstallPackageWithNoPackageOperationsAndIgnoreDependencies ()
+ {
+ return InstallPackageWithNoPackageOperations (ignoreDependencies: true);
+ }
+
+ FakePackage InstallPackageWithNoPackageOperationsAndAllowPrereleaseVersions ()
+ {
+ return InstallPackageWithNoPackageOperations (ignoreDependencies: false, allowPrereleaseVersions: true);
+ }
+
+ FakePackage InstallPackageWithNoPackageOperations (bool ignoreDependencies)
+ {
+ return InstallPackageWithNoPackageOperations (ignoreDependencies, allowPrereleaseVersions: false);
+ }
+
+ FakePackage InstallPackageWithNoPackageOperations (bool ignoreDependencies, bool allowPrereleaseVersions)
+ {
+ FakePackage package = CreateFakePackage ();
+ var operations = new List<PackageOperation> ();
+ var installAction = new FakeInstallPackageAction ();
+ installAction.IgnoreDependencies = ignoreDependencies;
+ installAction.AllowPrereleaseVersions = allowPrereleaseVersions;
+ installAction.Operations = operations;
+ packageManager.InstallPackage (package, installAction);
+ return package;
+ }
+
+ FakePackage InstallPackageWithPackageOperations (PackageOperation operation)
+ {
+ var operations = new PackageOperation[] {
+ operation
+ };
+ FakePackage package = CreateFakePackage ();
+ var installAction = new FakeInstallPackageAction ();
+ installAction.Operations = operations;
+ packageManager.InstallPackage (package, installAction);
+ return package;
+ }
+
+ FakePackage InstallPackageAndIgnoreDependencies ()
+ {
+ return InstallPackageWithParameters (true, false);
+ }
+
+ FakePackage InstallPackageWithParameters (bool ignoreDependencies, bool allowPrereleaseVersions)
+ {
+ FakePackage package = CreateFakePackage ();
+ packageManager.InstallPackage (package, ignoreDependencies, allowPrereleaseVersions);
+ return package;
+ }
+
+ FakePackage InstallPackageAndAllowPrereleaseVersions ()
+ {
+ return InstallPackageWithParameters (false, true);
+ }
+
+ FakePackage InstallPackageAndDoNotAllowPrereleaseVersions ()
+ {
+ return InstallPackageWithParameters (false, false);
+ }
+
+ FakePackage InstallPackageAndDoNotIgnoreDependencies ()
+ {
+ return InstallPackageWithParameters (false, false);
+ }
+
+ FakePackage UninstallPackage ()
+ {
+ FakePackage package = CreateFakePackage ();
+ testableProjectManager.FakeLocalRepository.FakePackages.Add (package);
+
+ packageManager.UninstallPackage (package);
+ return package;
+ }
+
+ FakePackage UninstallPackageAndForceRemove ()
+ {
+ FakePackage package = CreateFakePackage ();
+ testableProjectManager.FakeLocalRepository.FakePackages.Add (package);
+
+ bool removeDependencies = false;
+ bool forceRemove = true;
+ packageManager.UninstallPackage (package, forceRemove, removeDependencies);
+
+ return package;
+ }
+
+ FakePackage UninstallPackageAndRemoveDependencies ()
+ {
+ FakePackage package = CreateFakePackage ();
+ testableProjectManager.FakeLocalRepository.FakePackages.Add (package);
+
+ bool removeDependencies = true;
+ bool forceRemove = false;
+ packageManager.UninstallPackage (package, forceRemove, removeDependencies);
+
+ return package;
+ }
+
+ PackageOperation CreateOneInstallPackageOperation (string id = "PackageToInstall", string version = "1.0")
+ {
+ FakePackage package = CreateFakePackage (id, version);
+ return new PackageOperation (package, PackageAction.Install);
+ }
+
+ IEnumerable<PackageOperation> GetInstallPackageOperations (FakePackage package)
+ {
+ return GetInstallPackageOperations (package, false, false);
+ }
+
+ IEnumerable<PackageOperation> GetInstallPackageOperationsAndIgnoreDependencies (FakePackage package)
+ {
+ return GetInstallPackageOperations (package, true, false);
+ }
+
+ IEnumerable<PackageOperation> GetInstallPackageOperationsAndAllowPrereleaseVersions (FakePackage package)
+ {
+ return GetInstallPackageOperations (package, false, true);
+ }
+
+ IEnumerable<PackageOperation> GetInstallPackageOperations (
+ FakePackage package,
+ bool ignoreDependencies,
+ bool allowPrereleaseVersions)
+ {
+ var fakeInstallAction = new FakeInstallPackageAction ();
+ fakeInstallAction.IgnoreDependencies = ignoreDependencies;
+ fakeInstallAction.AllowPrereleaseVersions = allowPrereleaseVersions;
+ return packageManager.GetInstallPackageOperations (package, fakeInstallAction);
+ }
+
+ FakePackage UpdatePackageWithNoPackageOperations ()
+ {
+ FakePackage package = CreateFakePackage ();
+ var updateAction = new FakeUpdatePackageAction ();
+ updateAction.Operations = new List<PackageOperation> ();
+ updateAction.UpdateDependencies = true;
+ packageManager.UpdatePackage (package, updateAction);
+ return package;
+ }
+
+ FakePackage UpdatePackageWithPackageOperations (PackageOperation operation)
+ {
+ var operations = new PackageOperation[] {
+ operation
+ };
+ FakePackage package = CreateFakePackage ();
+ var updateAction = new FakeUpdatePackageAction ();
+ updateAction.Operations = operations;
+ updateAction.UpdateDependencies = true;
+ packageManager.UpdatePackage (package, updateAction);
+ return package;
+ }
+
+ FakePackage UpdatePackageWithNoPackageOperationsAndDoNotUpdateDependencies ()
+ {
+ return UpdatePackageWithNoPackageOperations (false, false);
+ }
+
+ FakePackage UpdatePackageWithNoPackageOperationsAndAllowPrereleaseVersions ()
+ {
+ return UpdatePackageWithNoPackageOperations (false, true);
+ }
+
+ FakePackage UpdatePackageWithNoPackageOperations (bool updateDependencies, bool allowPrereleaseVersions)
+ {
+ FakePackage package = CreateFakePackage ();
+ var updateAction = new FakeUpdatePackageAction ();
+ updateAction.Operations = new List<PackageOperation> ();
+ updateAction.UpdateDependencies = updateDependencies;
+ updateAction.AllowPrereleaseVersions = allowPrereleaseVersions;
+ packageManager.UpdatePackage (package, updateAction);
+ return package;
+ }
+
+ UpdatePackagesAction CreateUpdatePackagesAction ()
+ {
+ return new UpdatePackagesAction (new FakePackageManagementProject (), null);
+ }
+
+ UpdatePackagesAction CreateUpdatePackagesActionWithPackages (params IPackageFromRepository[] packages)
+ {
+ UpdatePackagesAction action = CreateUpdatePackagesAction ();
+ action.AddPackages (packages);
+ return action;
+ }
+
+ UpdatePackagesAction CreateUpdatePackagesActionWithOperations (params PackageOperation[] operations)
+ {
+ UpdatePackagesAction action = CreateUpdatePackagesAction ();
+ action.AddOperations (operations);
+ return action;
+ }
+
+ PackageOperation AddInstallOperationForPackage (IPackage package)
+ {
+ var operation = new PackageOperation (package, PackageAction.Install);
+ AddInstallOperationsForPackage (package, operation);
+ return operation;
+ }
+
+ void AddInstallOperationsForPackage (IPackage package, params PackageOperation[] operations)
+ {
+ fakePackageOperationResolver.AddOperations (package, operations);
+ }
+
+ void CreateFakePackageResolverForUpdatePackageOperations ()
+ {
+ fakePackageOperationResolver = new FakePackageOperationResolver ();
+ fakePackageOperationResolverFactory.UpdatePackageOperationsResolver = fakePackageOperationResolver;
+ }
+
+ void RaisePackageRemovedEventWhenPackageReferenceUpdated (
+ FakeProjectManager projectManager,
+ FakePackage updatedPackage,
+ params PackageOperationEventArgs[] eventArgs)
+ {
+ projectManager.WhenUpdatePackageReferenceCalled (
+ updatedPackage.Id,
+ updatedPackage.Version,
+ () => eventArgs.ToList ().ForEach (eventArg => projectManager.FirePackageReferenceRemoved (eventArg)));
+ }
+
+ void RaisePackageRemovedEventWhenPackageReferenceAdded (
+ FakeProjectManager projectManager,
+ FakePackage newPackage,
+ params PackageOperationEventArgs[] eventArgs)
+ {
+ projectManager.WhenAddPackageReferenceCalled (
+ newPackage.Id,
+ newPackage.Version,
+ () => eventArgs.ToList ().ForEach (eventArg => projectManager.FirePackageReferenceRemoved (eventArg)));
+ }
+
+ [Test]
+ public void ProjectManager_InstanceCreated_SourceRepositoryIsSharedRepositoryPassedToPackageManager ()
+ {
+ CreatePackageManager ();
+ Assert.AreEqual (fakeSolutionSharedRepository, packageManager.ProjectManager.SourceRepository);
+ }
+
+ [Test]
+ public void ProjectManager_InstanceCreated_LocalRepositoryIsPackageReferenceRepository ()
+ {
+ CreatePackageManager ();
+ PackageReferenceRepository packageRefRepository = packageManager.ProjectManager.LocalRepository as PackageReferenceRepository;
+ Assert.IsNotNull (packageRefRepository);
+ }
+
+ [Test]
+ public void ProjectManager_InstanceCreated_LocalRepositoryIsRegisteredWithSharedRepository ()
+ {
+ CreateTestProject ();
+ CreatePackageReferenceRepositoryHelper ();
+
+ string expectedPath = @"c:\projects\Test\MyProject";
+ packageRefRepositoryHelper.FakeProjectSystem.PathToReturnFromGetFullPath = expectedPath;
+
+ CreatePackageManager (project, packageRefRepositoryHelper);
+
+ string actualPath = fakeSolutionSharedRepository.PathPassedToRegisterRepository;
+
+ Assert.AreEqual (expectedPath, actualPath);
+ }
+
+ [Test]
+ public void ProjectManager_InstanceCreated_PathResolverIsPackageManagerPathResolver ()
+ {
+ CreatePackageManager ();
+
+ Assert.AreEqual (packageManager.PathResolver, packageManager.ProjectManager.PathResolver);
+ }
+
+ [Test]
+ public void InstallPackage_PackageInstancePassed_AddsReferenceToProject ()
+ {
+ CreatePackageManager ();
+ FakePackage package = InstallPackage ();
+
+ Assert.AreEqual (package, testableProjectManager.PackagePassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageInstancePassed_DependenciesNotIgnoredWhenAddingReferenceToProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ InstallPackage ();
+
+ Assert.IsFalse (testableProjectManager.IgnoreDependenciesPassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageInstancePassed_PrereleaseVersionsNotAllowedWhenAddingReferenceToProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ InstallPackage ();
+
+ Assert.IsFalse (testableProjectManager.AllowPrereleaseVersionsPassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageInstanceAndPackageOperationsPassed_AddsReferenceToProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = InstallPackageWithNoPackageOperations ();
+
+ Assert.AreEqual (package, testableProjectManager.PackagePassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageInstanceAndPackageOperationsPassed_DoNotIgnoreDependenciesWhenAddingReferenceToProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ InstallPackageWithNoPackageOperations ();
+
+ Assert.IsFalse (testableProjectManager.IgnoreDependenciesPassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageInstanceAndPackageOperationsPassed_DoNotAllowPrereleaseVersionsWhenAddingReferenceToProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ InstallPackageWithNoPackageOperations ();
+
+ Assert.IsFalse (testableProjectManager.AllowPrereleaseVersionsPassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageInstanceAndPackageOperationsPassedAndIgnoreDependenciesIsTrue_IgnoreDependenciesWhenAddingReferenceToProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ InstallPackageWithNoPackageOperationsAndIgnoreDependencies ();
+
+ Assert.IsTrue (testableProjectManager.IgnoreDependenciesPassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageInstanceAndPackageOperationsPassedAndAllowPrereleaseVersionsIsTrue_PrereleaseVersionsallowedWhenAddingReferenceToProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ InstallPackageWithNoPackageOperationsAndAllowPrereleaseVersions ();
+
+ Assert.IsTrue (testableProjectManager.AllowPrereleaseVersionsPassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageInstanceAndOneInstallPackageOperationPassed_PackageDefinedInOperationIsInstalledInLocalRepository ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+
+ PackageOperation operation = CreateOneInstallPackageOperation ();
+ InstallPackageWithPackageOperations (operation);
+
+ Assert.AreEqual (operation.Package, fakeSolutionSharedRepository.FirstPackageAdded);
+ }
+
+ [Test]
+ public void InstallPackage_PackageDependenciesIgnored_IgnoreDependenciesPassedToProjectManager ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ InstallPackageAndIgnoreDependencies ();
+
+ Assert.IsTrue (testableProjectManager.IgnoreDependenciesPassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_AllowPrereleaseVersions_AllowPrereleaseVersionsPassedToProjectManager ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ InstallPackageAndAllowPrereleaseVersions ();
+
+ Assert.IsTrue (testableProjectManager.AllowPrereleaseVersionsPassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageDependenciesIgnored_AddsReferenceToPackage ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = InstallPackageAndIgnoreDependencies ();
+
+ Assert.AreEqual (package, testableProjectManager.PackagePassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageDependenciesNotIgnored_IgnoreDependenciesPassedToProjectManager ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ InstallPackageAndDoNotIgnoreDependencies ();
+
+ Assert.IsFalse (testableProjectManager.IgnoreDependenciesPassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageDependenciesNotIgnored_AddsReferenceToPackage ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = InstallPackageAndDoNotIgnoreDependencies ();
+
+ Assert.AreEqual (package, testableProjectManager.PackagePassedToAddPackageReference);
+ }
+
+ [Test]
+ public void UninstallPackage_PackageInProjectLocalRepository_RemovesReferenceFromProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = UninstallPackage ();
+
+ Assert.AreEqual (package.Id, testableProjectManager.PackagePassedToRemovePackageReference.Id);
+ }
+
+ [Test]
+ public void UninstallPackage_PackageInProjectLocalRepository_DoesNotRemoveReferenceForcefullyFromProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ UninstallPackage ();
+
+ Assert.IsFalse (testableProjectManager.ForcePassedToRemovePackageReference);
+ }
+
+ [Test]
+ public void UninstallPackage_PackageInProjectLocalRepository_DependenciesNotRemovedWhenPackageReferenceRemovedFromProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ UninstallPackage ();
+
+ Assert.IsFalse (testableProjectManager.RemoveDependenciesPassedToRemovePackageReference);
+ }
+
+ [Test]
+ public void UninstallPackage_PassingForceRemove_ReferenceForcefullyRemovedFromProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+
+ UninstallPackageAndForceRemove ();
+
+ Assert.IsTrue (testableProjectManager.ForcePassedToRemovePackageReference);
+ }
+
+ [Test]
+ public void UninstallPackage_PassingRemoveDependencies_DependenciesRemovedWhenPackageReferenceRemovedFromProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+
+ UninstallPackageAndRemoveDependencies ();
+
+ Assert.IsTrue (testableProjectManager.RemoveDependenciesPassedToRemovePackageReference);
+ }
+
+ [Test]
+ public void UninstallPackage_ProjectLocalRepositoryHasPackage_PackageRemovedFromProjectRepositoryBeforeSolutionRepository ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+
+ FakePackage package = CreateFakePackage ();
+ package.Id = "Test";
+
+ testableProjectManager.FakeLocalRepository.FakePackages.Add (package);
+
+ IPackage packageRemovedFromProject = null;
+ packageManager.PackageUninstalled += (sender, e) => {
+ packageRemovedFromProject = testableProjectManager.PackagePassedToRemovePackageReference;
+ };
+ packageManager.UninstallPackage (package);
+
+ Assert.AreEqual ("Test", packageRemovedFromProject.Id);
+ }
+
+ [Test]
+ public void UninstallPackage_PackageReferencedByNoProjects_PackageIsRemovedFromSharedSolutionRepository ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+
+ FakePackage package = CreateFakePackage ();
+ package.Id = "MyPackageId";
+
+ testableProjectManager.FakeLocalRepository.FakePackages.Add (package);
+ fakeSolutionSharedRepository.FakePackages.Add (package);
+
+ packageManager.UninstallPackage (package);
+
+ bool containsPackage = fakeSolutionSharedRepository.FakePackages.Contains (package);
+
+ Assert.IsFalse (containsPackage);
+ }
+
+ [Test]
+ public void UninstallPackage_PackageReferencedByTwoProjects_PackageIsNotRemovedFromSharedSolutionRepository ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+
+ var package = new FakePackage ("MyPackageId", "1.4.5.2");
+
+ testableProjectManager.FakeLocalRepository.FakePackages.Add (package);
+ fakeSolutionSharedRepository.FakePackages.Add (package);
+ fakeSolutionSharedRepository.PackageIdsReferences.Add ("MyPackageId");
+
+ packageManager.UninstallPackage (package);
+
+ bool containsPackage = fakeSolutionSharedRepository.FakePackages.Contains (package);
+
+ Assert.IsTrue (containsPackage);
+ Assert.AreEqual ("MyPackageId", fakeSolutionSharedRepository.PackageIdPassedToIsReferenced);
+ Assert.AreEqual (package.Version, fakeSolutionSharedRepository.VersionPassedToIsReferenced);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageOperationsReturnedFromPackageOperationsResolverCreated ()
+ {
+ CreatePackageManager ();
+ var package = new FakePackage ();
+ var expectedOperations = new PackageOperation [] {
+ new PackageOperation (package, PackageAction.Install)
+ };
+ fakePackageOperationResolver.AddOperations (package, expectedOperations);
+
+ IEnumerable<PackageOperation> operations = GetInstallPackageOperations (package);
+
+ Assert.AreEqual (expectedOperations, operations);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesLocalRepositoryWhenGettingPackageOperations ()
+ {
+ CreatePackageManager ();
+ var package = new FakePackage ();
+ AddInstallOperationForPackage (package);
+ GetInstallPackageOperations (package);
+
+ IPackageRepository expectedRepository = packageManager.LocalRepository;
+ IPackageRepository actualRepository = fakePackageOperationResolverFactory.LocalRepositoryPassedToCreateInstallPackageOperationsResolver;
+
+ Assert.AreEqual (expectedRepository, actualRepository);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesSourceRepositoryWhenGettingPackageOperations ()
+ {
+ CreatePackageManager ();
+ var package = new FakePackage ();
+ AddInstallOperationForPackage (package);
+ GetInstallPackageOperations (package);
+
+ IPackageRepository expectedRepository = packageManager.SourceRepository;
+ IPackageRepository actualRepository = fakePackageOperationResolverFactory.SourceRepositoryPassedToCreateInstallPackageOperationsResolver;
+
+ Assert.AreEqual (expectedRepository, actualRepository);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_DependenciesNotIgnored ()
+ {
+ CreatePackageManager ();
+ var package = new FakePackage ();
+ AddInstallOperationForPackage (package);
+ GetInstallPackageOperations (package);
+
+ bool result = fakePackageOperationResolverFactory.IgnoreDependenciesPassedToCreateInstallPackageOperationResolver;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesLoggerWhenGettingPackageOperations ()
+ {
+ CreatePackageManager ();
+ var package = new FakePackage ();
+ AddInstallOperationForPackage (package);
+ GetInstallPackageOperations (package);
+
+ ILogger expectedLogger = packageManager.Logger;
+ ILogger actualLogger = fakePackageOperationResolverFactory.LoggerPassedToCreateInstallPackageOperationResolver;
+
+ Assert.AreEqual (expectedLogger, actualLogger);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageUsedWhenGettingPackageOperations ()
+ {
+ CreatePackageManager ();
+ var package = new FakePackage ();
+ AddInstallOperationForPackage (package);
+ GetInstallPackageOperations (package);
+
+ IPackage actualPackage = fakePackageOperationResolverFactory
+ .FakeInstallPackageOperationResolver
+ .PackagePassedToResolveOperations;
+
+ Assert.AreEqual (package, actualPackage);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_IgnoreDependenciesIsTrue_PackageOperationResolverIgnoresDependencies ()
+ {
+ CreatePackageManager ();
+ var package = new FakePackage ();
+ AddInstallOperationForPackage (package);
+ GetInstallPackageOperationsAndIgnoreDependencies (package);
+
+ bool result = fakePackageOperationResolverFactory.IgnoreDependenciesPassedToCreateInstallPackageOperationResolver;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_AllowPrereleaseVersionsIsTrue_PackageOperationResolverAllowsPrereleaseVersions ()
+ {
+ CreatePackageManager ();
+ var package = new FakePackage ();
+ AddInstallOperationForPackage (package);
+ GetInstallPackageOperationsAndAllowPrereleaseVersions (package);
+
+ bool result = fakePackageOperationResolverFactory.AllowPrereleaseVersionsPassedToCreateInstallPackageOperationResolver;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_AllowPrereleaseVersionsIsFalse_PackageOperationResolverDoesNotAllowPrereleaseVersions ()
+ {
+ CreatePackageManager ();
+ var package = new FakePackage ("Test", "1.0");
+ AddInstallOperationForPackage (package);
+ GetInstallPackageOperations (package);
+
+ bool result = fakePackageOperationResolverFactory.AllowPrereleaseVersionsPassedToCreateInstallPackageOperationResolver;
+
+ Assert.IsFalse (result);
+ }
+
+ public void UpdatePackage_PackageInstanceAndNoPackageOperationsPassed_UpdatesReferenceInProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = UpdatePackageWithNoPackageOperations ();
+
+ Assert.AreEqual (package, testableProjectManager.PackagePassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackage_PackageInstanceAndNoPackageOperationsPassed_UpdatesDependenciesInProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ UpdatePackageWithNoPackageOperations ();
+
+ Assert.IsTrue (testableProjectManager.UpdateDependenciesPassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackage_PackageInstanceAndAllowPrereleaseVersionsIsTrue_PrereleaseVersionsAllowedToUpdateProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ UpdatePackageWithNoPackageOperationsAndAllowPrereleaseVersions ();
+
+ Assert.IsTrue (testableProjectManager.AllowPrereleaseVersionsPassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackage_PackageInstanceAndAllowPrereleaseVersionsIsFalse_PrereleaseVersionsNotAllowedToUpdateProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ UpdatePackageWithNoPackageOperations ();
+
+ Assert.IsFalse (testableProjectManager.AllowPrereleaseVersionsPassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackage_PackageInstanceAndOneInstallPackageOperationPassed_PackageDefinedInOperationIsInstalledInLocalRepository ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+
+ PackageOperation operation = CreateOneInstallPackageOperation ();
+ UpdatePackageWithPackageOperations (operation);
+
+ Assert.AreEqual (operation.Package, fakeSolutionSharedRepository.FirstPackageAdded);
+ }
+
+ [Test]
+ public void UpdatePackage_UpdateDependenciesSetToFalse_DependenciesInProjectNotUpdated ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ UpdatePackageWithNoPackageOperationsAndDoNotUpdateDependencies ();
+
+ Assert.IsFalse (testableProjectManager.UpdateDependenciesPassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackages_OnePackage_PackageReferencedIsAddedToProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = CreateFakePackage ("Test", "1.1");
+ UpdatePackagesAction action = CreateUpdatePackagesActionWithPackages (package);
+
+ packageManager.UpdatePackages (action);
+
+ Assert.AreEqual (package, testableProjectManager.PackagePassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackages_TwoPackages_PackageReferencedIsAddedToProjectForBothPackages ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package1 = CreateFakePackage ("First", "1.1");
+ FakePackage package2 = CreateFakePackage ("Second", "2.0");
+ var expectedPackages = new FakePackage[] { package1, package2 };
+ UpdatePackagesAction action = CreateUpdatePackagesActionWithPackages (expectedPackages);
+
+ packageManager.UpdatePackages (action);
+
+ PackageCollectionAssert.AreEqual (expectedPackages, testableProjectManager.PackagesPassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackages_UpdateDependenciesIsTrue_UpdateDependenciesPassedToProjectManager ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = CreateFakePackage ("Test", "1.1");
+ UpdatePackagesAction action = CreateUpdatePackagesActionWithPackages (package);
+ action.UpdateDependencies = true;
+
+ packageManager.UpdatePackages (action);
+
+ Assert.IsTrue (testableProjectManager.UpdateDependenciesPassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackages_UpdateDependenciesIsFalse_UpdateDependenciesPassedToProjectManager ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = CreateFakePackage ("Test", "1.1");
+ UpdatePackagesAction action = CreateUpdatePackagesActionWithPackages (package);
+ action.UpdateDependencies = false;
+
+ packageManager.UpdatePackages (action);
+
+ Assert.IsFalse (testableProjectManager.UpdateDependenciesPassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackages_AllowPrereleaseVersionsIsTrue_AllowPrereleaseVersionsPassedToProjectManager ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = CreateFakePackage ("Test", "1.1");
+ UpdatePackagesAction action = CreateUpdatePackagesActionWithPackages (package);
+ action.AllowPrereleaseVersions = true;
+
+ packageManager.UpdatePackages (action);
+
+ Assert.IsTrue (testableProjectManager.AllowPrereleaseVersionsPassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackages_AllowPrereleaseVersionsIsFalse_AllowPrereleaseVersionsPassedToProjectManager ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = CreateFakePackage ("Test", "1.1");
+ UpdatePackagesAction action = CreateUpdatePackagesActionWithPackages (package);
+ action.AllowPrereleaseVersions = false;
+
+ packageManager.UpdatePackages (action);
+
+ Assert.IsFalse (testableProjectManager.AllowPrereleaseVersionsPassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackages_TwoPackageOperations_BothPackagesInOperationsAddedToSharedRepository ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ PackageOperation operation1 = CreateOneInstallPackageOperation ("First", "1.0");
+ PackageOperation operation2 = CreateOneInstallPackageOperation ("Second", "1.0");
+ UpdatePackagesAction action = CreateUpdatePackagesActionWithOperations (operation1, operation2);
+ var expectedPackages = new FakePackage[] {
+ operation1.Package as FakePackage,
+ operation2.Package as FakePackage
+ };
+
+ packageManager.UpdatePackages (action);
+
+ PackageCollectionAssert.AreEqual (expectedPackages, fakeSolutionSharedRepository.PackagesAdded);
+ }
+
+ [Test]
+ public void GetUpdatePackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesLoggerWhenGettingPackageOperations ()
+ {
+ CreatePackageManager ();
+ FakePackage package = CreateFakePackage ("Test", "1.1");
+ UpdatePackagesAction updateAction = CreateUpdatePackagesActionWithPackages (package);
+ CreateFakePackageResolverForUpdatePackageOperations ();
+ AddInstallOperationForPackage (package);
+
+ packageManager.GetUpdatePackageOperations (updateAction.Packages, updateAction);
+
+ ILogger expectedLogger = packageManager.Logger;
+ ILogger actualLogger = fakePackageOperationResolverFactory.LoggerPassedToCreateUpdatePackageOperationResolver;
+ Assert.AreEqual (expectedLogger, actualLogger);
+ }
+
+ [Test]
+ public void GetUpdatePackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesLocalRepositoryWhenGettingPackageOperations ()
+ {
+ CreatePackageManager ();
+ FakePackage package = CreateFakePackage ("Test", "1.1");
+ UpdatePackagesAction updateAction = CreateUpdatePackagesActionWithPackages (package);
+ CreateFakePackageResolverForUpdatePackageOperations ();
+ AddInstallOperationForPackage (package);
+
+ packageManager.GetUpdatePackageOperations (updateAction.Packages, updateAction);
+
+ IPackageRepository expectedRepository = packageManager.LocalRepository;
+ IPackageRepository actualRepository = fakePackageOperationResolverFactory.LocalRepositoryPassedToCreateUpdatePackageOperationsResolver;
+ Assert.AreEqual (expectedRepository, actualRepository);
+ }
+
+ [Test]
+ public void GetUpdatePackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesSourceRepositoryWhenGettingPackageOperations ()
+ {
+ CreatePackageManager ();
+ FakePackage package = CreateFakePackage ("Test", "1.1");
+ UpdatePackagesAction updateAction = CreateUpdatePackagesActionWithPackages (package);
+ CreateFakePackageResolverForUpdatePackageOperations ();
+ AddInstallOperationForPackage (package);
+
+ packageManager.GetUpdatePackageOperations (updateAction.Packages, updateAction);
+
+ IPackageRepository expectedRepository = packageManager.SourceRepository;
+ IPackageRepository actualRepository = fakePackageOperationResolverFactory.SourceRepositoryPassedToCreateUpdatePackageOperationsResolver;
+ Assert.AreEqual (expectedRepository, actualRepository);
+ }
+
+ [Test]
+ public void GetUpdatePackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesUpdatePackageSettingsWhenGettingPackageOperations ()
+ {
+ CreatePackageManager ();
+ FakePackage package = CreateFakePackage ("Test", "1.1");
+ UpdatePackagesAction updateAction = CreateUpdatePackagesActionWithPackages (package);
+ CreateFakePackageResolverForUpdatePackageOperations ();
+ AddInstallOperationForPackage (package);
+
+ packageManager.GetUpdatePackageOperations (updateAction.Packages, updateAction);
+
+ IUpdatePackageSettings settings = fakePackageOperationResolverFactory.SettingsPassedToCreatePackageOperationResolver;
+ Assert.AreEqual (updateAction, settings);
+ }
+
+ [Test]
+ public void GetUpdatePackageOperations_TwoPackages_ReturnsPackageOperationsForBothPackages ()
+ {
+ CreatePackageManager ();
+ CreateFakePackageResolverForUpdatePackageOperations ();
+ IPackageFromRepository package1 = CreateFakePackage ("Test", "1.0");
+ IPackageFromRepository package2 = CreateFakePackage ("Test2", "1.0");
+ PackageOperation operation1 = AddInstallOperationForPackage (package1);
+ PackageOperation operation2 = AddInstallOperationForPackage (package2);
+ UpdatePackagesAction updateAction = CreateUpdatePackagesActionWithPackages (package1, package2);
+
+ List<PackageOperation> operations = packageManager.GetUpdatePackageOperations (updateAction.Packages, updateAction).ToList ();
+
+ Assert.AreEqual (2, operations.Count ());
+ Assert.IsTrue (operations.Contains (operation1));
+ Assert.IsTrue (operations.Contains (operation2));
+ }
+
+ [Test]
+ public void RunPackageOperations_TwoPackageOperations_BothPackagesInOperationsAddedToSharedRepository ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ PackageOperation operation1 = CreateOneInstallPackageOperation ("First", "1.0");
+ PackageOperation operation2 = CreateOneInstallPackageOperation ("Second", "1.0");
+ var operations = new PackageOperation[] { operation1, operation2 };
+ var expectedPackages = new FakePackage[] {
+ operation1.Package as FakePackage,
+ operation2.Package as FakePackage
+ };
+
+ packageManager.RunPackageOperations (operations);
+
+ PackageCollectionAssert.AreEqual (expectedPackages, fakeSolutionSharedRepository.PackagesAdded);
+ }
+
+ [Test]
+ public void UpdatePackage_OldPackageReferenceIsRemovedOnUpdating_OldPackageIsUninstalled ()
+ {
+ CreatePackageManager ();
+ var fakeProjectManager = new FakeProjectManager ();
+ packageManager.ProjectManager = fakeProjectManager;
+ FakePackage installedPackage = fakeSolutionSharedRepository.AddFakePackageWithVersion ("MyPackage", "1.0");
+ FakePackage updatedPackage = fakeFeedSourceRepository.AddFakePackageWithVersion ("MyPackage", "1.1");
+ var eventArgs = new PackageOperationEventArgs (installedPackage, null, null);
+ RaisePackageRemovedEventWhenPackageReferenceUpdated (fakeProjectManager, updatedPackage, eventArgs);
+ var updateAction = new FakeUpdatePackageAction {
+ Operations = new List<PackageOperation> (),
+ UpdateDependencies = false
+ };
+
+ packageManager.UpdatePackage (updatedPackage, updateAction);
+
+ Assert.IsFalse (fakeSolutionSharedRepository.FakePackages.Contains (installedPackage));
+ }
+
+ [Test]
+ public void UpdatePackage_TwoOldPackageReferencesAreRemovedOnUpdating_BothOldPackagesAreUninstalled ()
+ {
+ CreatePackageManager ();
+ var fakeProjectManager = new FakeProjectManager ();
+ packageManager.ProjectManager = fakeProjectManager;
+ FakePackage installedPackage1 = fakeSolutionSharedRepository.AddFakePackageWithVersion ("MyPackage-Core", "1.0");
+ FakePackage installedPackage2 = fakeSolutionSharedRepository.AddFakePackageWithVersion ("MyPackage", "1.0");
+ FakePackage updatedPackage = fakeFeedSourceRepository.AddFakePackageWithVersion ("MyPackage", "1.1");
+ var eventArgs1 = new PackageOperationEventArgs (installedPackage1, null, null);
+ var eventArgs2 = new PackageOperationEventArgs (installedPackage2, null, null);
+ RaisePackageRemovedEventWhenPackageReferenceUpdated (fakeProjectManager, updatedPackage, eventArgs1, eventArgs2);
+ var updateAction = new FakeUpdatePackageAction {
+ Operations = new List<PackageOperation> (),
+ UpdateDependencies = false
+ };
+
+ packageManager.UpdatePackage (updatedPackage, updateAction);
+
+ Assert.IsFalse (fakeSolutionSharedRepository.FakePackages.Contains (installedPackage2));
+ Assert.IsFalse (fakeSolutionSharedRepository.FakePackages.Contains (installedPackage1));
+ }
+
+ [Test]
+ public void UpdatePackage_OldPackageReferenceIsRemovedOnUpdatingButAnotherProjectStillReferencesThePackage_OldPackageIsNotUninstalled ()
+ {
+ CreatePackageManager ();
+ var fakeProjectManager = new FakeProjectManager ();
+ packageManager.ProjectManager = fakeProjectManager;
+ FakePackage installedPackage = fakeSolutionSharedRepository.AddFakePackageWithVersion ("MyPackage-Core", "1.0");
+ FakePackage updatedPackage = fakeFeedSourceRepository.AddFakePackageWithVersion ("MyPackage", "1.1");
+ var eventArgs = new PackageOperationEventArgs (installedPackage, null, null);
+ RaisePackageRemovedEventWhenPackageReferenceUpdated (fakeProjectManager, updatedPackage, eventArgs);
+ var updateAction = new FakeUpdatePackageAction {
+ Operations = new List<PackageOperation> (),
+ UpdateDependencies = false
+ };
+ fakeSolutionSharedRepository.PackageIdsReferences.Add ("MyPackage-Core");
+
+ packageManager.UpdatePackage (updatedPackage, updateAction);
+
+ Assert.IsTrue (fakeSolutionSharedRepository.FakePackages.Contains (installedPackage));
+ }
+
+ [Test]
+ public void InstallPackage_OldPackageReferenceIsRemovedOnInstalling_OldPackageIsUninstalled ()
+ {
+ CreatePackageManager ();
+ var fakeProjectManager = new FakeProjectManager ();
+ packageManager.ProjectManager = fakeProjectManager;
+ FakePackage installedPackage = fakeSolutionSharedRepository.AddFakePackageWithVersion ("MyPackage", "1.0");
+ FakePackage newPackage = fakeFeedSourceRepository.AddFakePackageWithVersion ("MyPackage", "1.1");
+ var eventArgs = new PackageOperationEventArgs (installedPackage, null, null);
+ RaisePackageRemovedEventWhenPackageReferenceAdded (fakeProjectManager, newPackage, eventArgs);
+ var installAction = new FakeInstallPackageAction {
+ Operations = new List<PackageOperation> ()
+ };
+
+ packageManager.InstallPackage (newPackage, installAction);
+
+ Assert.IsFalse (fakeSolutionSharedRepository.FakePackages.Contains (installedPackage));
+ }
+
+ [Test]
+ public void InstallPackage_OldPackageReferenceIsRemovedOnInstallingButOtherProjectsReferencesOldPackage_OldPackageIsNotUninstalled ()
+ {
+ CreatePackageManager ();
+ var fakeProjectManager = new FakeProjectManager ();
+ packageManager.ProjectManager = fakeProjectManager;
+ FakePackage installedPackage = fakeSolutionSharedRepository.AddFakePackageWithVersion ("MyPackage.Core", "1.0");
+ FakePackage newPackage = fakeFeedSourceRepository.AddFakePackageWithVersion ("MyPackage", "1.1");
+ fakeSolutionSharedRepository.PackageIdsReferences.Add ("MyPackage.Core");
+ var eventArgs = new PackageOperationEventArgs (installedPackage, null, null);
+ RaisePackageRemovedEventWhenPackageReferenceAdded (fakeProjectManager, newPackage, eventArgs);
+ var installAction = new FakeInstallPackageAction {
+ Operations = new List<PackageOperation> ()
+ };
+
+ packageManager.InstallPackage (newPackage, installAction);
+
+ Assert.IsTrue (fakeSolutionSharedRepository.FakePackages.Contains (installedPackage));
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectManagerTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectManagerTests.cs
new file mode 100644
index 0000000000..88d01e1555
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectManagerTests.cs
@@ -0,0 +1,110 @@
+//
+// MonoDevelopProjectManagerTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class MonoDevelopProjectManagerTests
+ {
+ TestableProjectManager projectManager;
+
+ void CreateProjectManager ()
+ {
+ projectManager = new TestableProjectManager ();
+ }
+
+ void AddFakePackageToProjectLocalRepository (string packageId, string version)
+ {
+ projectManager.AddFakePackageToProjectLocalRepository (packageId, version);
+ }
+
+ FakePackage CreatePackage (string packageId, string version)
+ {
+ return FakePackage.CreatePackageWithVersion (packageId, version);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIdPassedThatDoesNotExistInProjectLocalRepository_ReturnsFalse ()
+ {
+ CreateProjectManager ();
+
+ bool installed = projectManager.IsInstalled ("Test");
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIdPassedExistsInProjectLocalRepository_ReturnsTrue ()
+ {
+ CreateProjectManager ();
+ projectManager.AddFakePackageToProjectLocalRepository ("Test", "1.0.2");
+
+ bool installed = projectManager.IsInstalled ("Test");
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void HasOlderPackageInstalled_ProjectLocalRepositoryDoesNotHavePackage_ReturnsFalse ()
+ {
+ CreateProjectManager ();
+ FakePackage package = CreatePackage ("Test", "1.0");
+
+ bool installed = projectManager.HasOlderPackageInstalled (package);
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void HasOlderPackageInstalled_ProjectLocalRepositoryHasOlderPackage_ReturnsTrue ()
+ {
+ CreateProjectManager ();
+ projectManager.AddFakePackageToProjectLocalRepository ("Test", "1.0");
+ FakePackage package = CreatePackage ("Test", "1.1");
+
+ bool installed = projectManager.HasOlderPackageInstalled (package);
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void HasOlderPackageInstalled_ProjectLocalRepositoryHasSamePackageVersion_ReturnsFalse ()
+ {
+ CreateProjectManager ();
+ projectManager.AddFakePackageToProjectLocalRepository ("Test", "1.1");
+ FakePackage package = CreatePackage ("Test", "1.1");
+
+ bool installed = projectManager.HasOlderPackageInstalled (package);
+
+ Assert.IsFalse (installed);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectSystemTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectSystemTests.cs
new file mode 100644
index 0000000000..de425e7581
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectSystemTests.cs
@@ -0,0 +1,1091 @@
+//
+// SharpDevelopProjectSystemTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.IO;
+using System.Linq;
+using System.Runtime.Versioning;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Core;
+using MonoDevelop.Core.Assemblies;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using MonoDevelop.Projects;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class MonoDevelopProjectSystemTests
+ {
+ TestableMonoDevelopProjectSystem projectSystem;
+ FakeDotNetProject project;
+
+ void CreateProjectSystem (IDotNetProject project)
+ {
+ projectSystem = new TestableMonoDevelopProjectSystem (project);
+ }
+
+ void CreateTestProject ()
+ {
+ project = new FakeDotNetProject ();
+ }
+
+ void CreateTestWebApplicationProject ()
+ {
+ project = ProjectHelper.CreateTestWebApplicationProject ();
+ }
+
+ void CreateTestWebSiteProject ()
+ {
+ project = ProjectHelper.CreateTestWebSiteProject ();
+ }
+
+ void CreateTestProject (string fileName)
+ {
+ project = new FakeDotNetProject (fileName);
+ }
+
+ void AddFileToProject (string fileName)
+ {
+ ProjectHelper.AddFile (project, fileName);
+ }
+
+ void AddDefaultCustomToolForFileName (string fileName, string customTool)
+ {
+ projectSystem.FakeProjectService.AddDefaultCustomToolForFileName (fileName, customTool);
+ }
+
+ void AddFile (string fileName)
+ {
+ projectSystem.AddFile (fileName.ToNativePath (), (Stream)null);
+ }
+
+ void AssertLastMSBuildChildElementHasProjectAttributeValue (string expectedAttributeValue)
+ {
+ throw new NotImplementedException ();
+// ProjectImportElement import = project.GetLastMSBuildChildElement ();
+// Assert.AreEqual (expectedAttributeValue, import.Project);
+ }
+
+ void AssertLastMSBuildChildHasCondition (string expectedCondition)
+ {
+ throw new NotImplementedException ();
+// ProjectImportElement import = project.GetLastMSBuildChildElement ();
+// Assert.AreEqual (expectedCondition, import.Condition);
+ }
+
+ void AssertFirstMSBuildChildElementHasProjectAttributeValue (string expectedAttributeValue)
+ {
+ throw new NotImplementedException ();
+// ProjectImportElement import = project.GetFirstMSBuildChildElement ();
+// Assert.AreEqual (expectedAttributeValue, import.Project);
+ }
+
+ void AssertFirstMSBuildChildHasCondition (string expectedCondition)
+ {
+ throw new NotImplementedException ();
+// ProjectImportElement import = project.GetFirstMSBuildChildElement ();
+// Assert.AreEqual (expectedCondition, import.Condition);
+ }
+
+ [Test]
+ public void Root_NewInstanceCreated_ReturnsProjectDirectory ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+
+ string expectedRoot = @"d:\projects\MyProject\".ToNativePath ();
+ Assert.AreEqual (expectedRoot, projectSystem.Root);
+ }
+
+ [Test]
+ public void ProjectName_NewInstanceCreated_ReturnsProjectName ()
+ {
+ CreateTestProject ();
+ project.Name = "MyProjectName";
+ CreateProjectSystem (project);
+
+ Assert.AreEqual ("MyProjectName", projectSystem.ProjectName);
+ }
+
+ [Test]
+ [Ignore ("Arbitrary properties are not implemented")]
+ public void GetPropertyValue_PassedDefinedPropertyName_ReturnsExpectedPropertyValue ()
+ {
+ CreateTestProject ();
+ string expectedPropertyValue = "Test";
+ string propertyName = "TestProperty";
+ //project.SetEvaluatedProperty (propertyName, expectedPropertyValue);
+ CreateProjectSystem (project);
+
+ string propertyValue = projectSystem.GetPropertyValue (propertyName);
+
+ Assert.AreEqual (expectedPropertyValue, propertyValue);
+ }
+
+ [Test]
+ public void GetPropertyValue_PassedRootNamespacePropertyName_ReturnsRootNamespace ()
+ {
+ CreateTestProject ();
+ project.DefaultNamespace = "Test";
+ CreateProjectSystem (project);
+
+ string propertyValue = projectSystem.GetPropertyValue ("RootNamespace");
+
+ Assert.AreEqual ("Test", propertyValue);
+ }
+
+ [Test]
+ public void TargetFramework_TargetFrameworkVersion40DefinedInProject_ReturnsFullDotNetFramework40 ()
+ {
+ CreateTestProject ();
+ project.TargetFrameworkMoniker = new TargetFrameworkMoniker ("v4.0");
+ CreateProjectSystem (project);
+
+ FrameworkName expectedName = new FrameworkName (".NETFramework, Version=v4.0");
+
+ Assert.AreEqual (expectedName, projectSystem.TargetFramework);
+ }
+
+ [Test]
+ public void TargetFramework_TargetFrameworkVersion35ClientProfileDefinedInProject_ReturnsClientProfileDotNetFramework35 ()
+ {
+ CreateTestProject ();
+ project.TargetFrameworkMoniker = new TargetFrameworkMoniker (".NETFramework", "v3.5", "Client");
+ CreateProjectSystem (project);
+
+ FrameworkName expectedName = new FrameworkName (".NETFramework, Profile=Client, Version=v3.5");
+
+ Assert.AreEqual (expectedName, projectSystem.TargetFramework);
+ }
+
+ [Test]
+ public void TargetFramework_TargetFrameworkVersionIsSilverlight20DefinedInProject_ReturnsSilverlight ()
+ {
+ CreateTestProject ();
+ project.TargetFrameworkMoniker = new TargetFrameworkMoniker ("Silverlight", "v2.0");
+ CreateProjectSystem (project);
+
+ FrameworkName expectedName = new FrameworkName ("Silverlight, Version=v2.0");
+
+ Assert.AreEqual (expectedName, projectSystem.TargetFramework);
+ }
+
+ [Test]
+ public void IsSupportedFile_PassedCSharpFileName_ReturnsTrue ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\temp\abc.cs".ToNativePath ();
+ bool result = projectSystem.IsSupportedFile (fileName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void IsSupportedFile_ProjectIsWebProjectAndPassedAppConfigFileName_ReturnsFalse ()
+ {
+ CreateTestWebApplicationProject ();
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\temp\app.config".ToNativePath ();
+ bool result = projectSystem.IsSupportedFile (fileName);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void IsSupportedFile_ProjectIsWebProjectAndPassedAppConfigFileNameInUpperCase_ReturnsFalse ()
+ {
+ CreateTestWebApplicationProject ();
+ CreateProjectSystem (project);
+
+ string fileName = @"c:\projects\APP.CONFIG".ToNativePath ();
+ bool result = projectSystem.IsSupportedFile (fileName);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void IsSupportedFile_ProjectIsWebApplicationProjectAndPassedWebConfigFileName_ReturnsTrue ()
+ {
+ CreateTestWebApplicationProject ();
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\temp\web.config".ToNativePath ();
+ bool result = projectSystem.IsSupportedFile (fileName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void IsSupportedFile_ProjectIsWebSiteProjectAndPassedWebConfigFileName_ReturnsTrue ()
+ {
+ CreateTestWebSiteProject ();
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\temp\web.config".ToNativePath ();
+ bool result = projectSystem.IsSupportedFile (fileName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void IsSupportedFile_ProjectIsCSharpProjectAndPassedWebConfigFileName_ReturnsFalse ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\temp\web.config".ToNativePath ();
+ bool result = projectSystem.IsSupportedFile (fileName);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void IsSupportedFile_ProjectIsCSharpProjectAndPassedWebConfigFileNameInUpperCase_ReturnsFalse ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\temp\WEB.CONFIG".ToNativePath ();
+ bool result = projectSystem.IsSupportedFile (fileName);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void IsSupportedFile_ProjectIsCSharpProjectAndPassedAppConfigFileName_ReturnsTrue ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\temp\app.config".ToNativePath ();
+ bool result = projectSystem.IsSupportedFile (fileName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void ReferenceExists_ProjectHasReferenceAndFullPathToAssemblyPassedToMethod_ReturnsTrue ()
+ {
+ CreateTestProject (@"D:\Projects\Test\MyProject.csproj");
+ ProjectHelper.AddReference (project, "MyAssembly", @"d:\Projects\Test\MyAssembly.dll".ToNativePath ());
+ CreateProjectSystem (project);
+ string fileName = @"D:\Projects\Test\MyAssembly.dll".ToNativePath ();
+
+ bool result = projectSystem.ReferenceExists (fileName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void ReferenceExists_ProjectHasNoReferences_ReturnsFalse ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+ string fileName = @"D:\Projects\Test\MyAssembly.dll".ToNativePath ();
+
+ bool result = projectSystem.ReferenceExists (fileName);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void ReferenceExists_ProjectReferenceNameHasDifferentCase_ReturnsTrue ()
+ {
+ CreateTestProject (@"D:\Projects\Test\MyProject.csproj");
+ ProjectHelper.AddReference (project, "myassembly", @"d:\Projects\Test\myassembly.dll".ToNativePath ());
+ CreateProjectSystem (project);
+ string fileName = @"D:\Projects\Test\MYASSEMBLY.dll".ToNativePath ();
+
+ bool result = projectSystem.ReferenceExists (fileName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void ReferenceExists_ReferenceNamePassedIsInProjectAndIsReferenceNameWithNoFileExtension_ReturnsTrue ()
+ {
+ CreateTestProject ();
+ ProjectHelper.AddGacReference (project, "System.ComponentModel.Composition");
+ CreateProjectSystem (project);
+ string referenceName = "System.ComponentModel.Composition";
+
+ bool result = projectSystem.ReferenceExists (referenceName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void ReferenceExists_ReferenceIsInProjectAndProjectReferenceSearchedForHasExeFileExtension_ReturnsTrue ()
+ {
+ CreateTestProject (@"D:\Projects\Test\MyProject.csproj");
+ ProjectHelper.AddReference (project, "myassembly", @"d:\Projects\Test\myassembly.exe".ToNativePath ());
+ CreateProjectSystem (project);
+ string fileName = @"D:\Projects\Test\myassembly.exe".ToNativePath ();
+
+ bool result = projectSystem.ReferenceExists (fileName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void ReferenceExists_ReferenceIsInProjectAndProjectReferenceSearchedForHasExeFileExtensionInUpperCase_ReturnsTrue ()
+ {
+ CreateTestProject (@"D:\Projects\Test\MyProject.csproj");
+ ProjectHelper.AddReference (project, "myassembly", @"d:\Projects\Test\myassembly.exe".ToNativePath ());
+ CreateProjectSystem (project);
+ string fileName = @"D:\Projects\Test\MYASSEMBLY.EXE".ToNativePath ();
+
+ bool result = projectSystem.ReferenceExists (fileName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void AddReference_AddReferenceToNUnitFramework_ProjectIsSavedAfterAddingReference ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+ project.IsSaved = false;
+
+ string fileName = @"d:\projects\packages\nunit\nunit.framework.dll".ToNativePath ();
+ projectSystem.AddReference (fileName, null);
+
+ Assert.AreEqual (1, project.ReferencesWhenSavedCount);
+ }
+
+ [Test]
+ public void AddReference_AddReferenceToNUnitFramework_ReferenceAddedToProject ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+ project.IsSaved = false;
+
+ string fileName = @"d:\projects\packages\nunit\nunit.framework.dll".ToNativePath ();
+ projectSystem.AddReference (fileName, null);
+
+ ProjectReference actualReference = project.References [0];
+ Assert.AreEqual ("nunit.framework", actualReference.Reference);
+ Assert.AreEqual (fileName, actualReference.HintPath);
+ }
+
+ [Test]
+ public void AddReference_ReferenceFileNameIsRelativePath_ReferenceAddedToProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ project.IsSaved = false;
+ string relativeFileName = @"packages\nunit\nunit.framework.dll".ToNativePath ();
+ string fullFileName = @"d:\projects\MyProject\packages\nunit\nunit.framework.dll".ToNativePath ();
+ projectSystem.AddReference (relativeFileName, null);
+
+ ProjectReference actualReference = project.References [0];
+ Assert.AreEqual ("nunit.framework", actualReference.Reference);
+ Assert.AreEqual (fullFileName, actualReference.HintPath);
+ }
+
+ [Test]
+ public void AddReference_AddReferenceToNUnitFramework_AddingReferenceIsLogged ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+ project.Name = "MyTestProject";
+
+ string fileName = @"d:\projects\packages\nunit\nunit.framework.dll".ToNativePath ();
+ projectSystem.AddReference (fileName, null);
+
+ var expectedReferenceAndProjectName = new ReferenceAndProjectName () {
+ Reference = "nunit.framework",
+ Project = "MyTestProject"
+ };
+
+ Assert.AreEqual (expectedReferenceAndProjectName, projectSystem.ReferenceAndProjectNamePassedToLogAddedReferenceToProject);
+ }
+
+ [Test]
+ public void RemoveReference_ReferenceBeingRemovedHasFileExtension_ReferenceRemovedFromProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ string fileName = @"d:\projects\MyProject\packages\nunit\nunit.framework.dll".ToNativePath ();
+ ProjectHelper.AddReference (project, fileName);
+ CreateProjectSystem (project);
+
+ projectSystem.RemoveReference (fileName);
+
+ ProjectReference referenceItem = ProjectHelper.GetReference (project, "nunit.framework");
+
+ Assert.IsNull (referenceItem);
+ }
+
+ [Test]
+ public void RemoveReference_ReferenceCaseAddedToProjectDifferentToReferenceNameBeingRemoved_ReferenceRemovedFromProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ ProjectHelper.AddReference (project, @"d:\projects\MyProject\packages\nunit\nunit.framework.dll".ToNativePath ());
+ CreateProjectSystem (project);
+
+ string fileName = @"NUNIT.FRAMEWORK.DLL";
+ projectSystem.RemoveReference (fileName);
+
+ ProjectReference referenceItem = ProjectHelper.GetReference (project, "nunit.framework");
+
+ Assert.IsNull (referenceItem);
+ }
+
+ [Test]
+ public void RemoveReference_ProjectHasNoReference_ArgumentNullExceptionNotThrown ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ string fileName = @"NUNIT.FRAMEWORK.DLL";
+ Assert.DoesNotThrow (() => projectSystem.RemoveReference (fileName));
+ }
+
+ [Test]
+ public void RemoveReference_ReferenceExistsInProject_ProjectIsSavedAfterReferenceRemoved ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ string fileName = @"d:\projects\packages\nunit\nunit.framework.dll".ToNativePath ();
+ ProjectHelper.AddReference (project, fileName);
+ CreateProjectSystem (project);
+
+ projectSystem.RemoveReference (fileName);
+
+ Assert.AreEqual (0, project.ReferencesWhenSavedCount);
+ }
+
+ [Test]
+ public void RemoveReference_ReferenceBeingRemovedHasFileExtension_ReferenceRemovalIsLogged ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ project.Name = "MyTestProject";
+ string fileName = @"d:\projects\MyProject\packages\nunit\nunit.framework.dll".ToNativePath ();
+ ProjectHelper.AddReference (project, fileName);
+ CreateProjectSystem (project);
+
+ projectSystem.RemoveReference (fileName);
+
+ var expectedReferenceAndProjectName = new ReferenceAndProjectName {
+ Reference = "nunit.framework",
+ Project = "MyTestProject"
+ };
+
+ Assert.AreEqual (expectedReferenceAndProjectName, projectSystem.ReferenceAndProjectNamePassedToLogRemovedReferenceFromProject);
+ }
+
+ [Test]
+ public void AddFile_NewFile_AddsFileToFileSystem ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ string expectedPath = @"d:\temp\abc.cs".ToNativePath ();
+ Stream expectedStream = new MemoryStream ();
+ projectSystem.AddFile (expectedPath, expectedStream);
+
+ Assert.AreEqual (expectedPath, projectSystem.PathPassedToPhysicalFileSystemAddFile);
+ Assert.AreEqual (expectedStream, projectSystem.StreamPassedToPhysicalFileSystemAddFile);
+ }
+
+ [Test]
+ public void AddFile_NewFile_AddsFileToProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ string fileName = @"d:\projects\MyProject\src\NewFile.cs".ToNativePath ();
+ project.AddDefaultBuildAction (BuildAction.Compile, fileName);
+ CreateProjectSystem (project);
+ AddFile (fileName);
+
+ ProjectFile fileItem = ProjectHelper.GetFile (project, fileName);
+ FilePath expectedFileName = new FilePath (fileName);
+ Assert.AreEqual (expectedFileName, fileItem.FilePath);
+ Assert.AreEqual (BuildAction.Compile, fileItem.BuildAction);
+ }
+
+ [Test]
+ public void AddFile_NewResxFile_AddsFileToProjectWithCorrectItemType ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ string fileName = @"d:\projects\MyProject\src\NewFile.resx".ToNativePath ();
+ project.AddDefaultBuildAction (BuildAction.EmbeddedResource, fileName);
+ CreateProjectSystem (project);
+
+ AddFile (fileName);
+ ProjectFile fileItem = ProjectHelper.GetFile (project, fileName);
+
+ FilePath expectedFileName = new FilePath (fileName);
+
+ Assert.AreEqual (expectedFileName, fileItem.FilePath);
+ Assert.AreEqual (BuildAction.EmbeddedResource, fileItem.BuildAction);
+ }
+
+ [Test]
+ public void AddFile_RelativeFileNameUsed_AddsFileToProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ string fileName = @"d:\projects\MyProject\src\NewFile.cs".ToNativePath ();
+ project.AddDefaultBuildAction (BuildAction.Compile, fileName);
+ CreateProjectSystem (project);
+
+ string relativeFileName = @"src\NewFile.cs".ToNativePath ();
+ AddFile (relativeFileName);
+ ProjectFile fileItem = ProjectHelper.GetFile (project, fileName);
+
+ FilePath expectedFileName = new FilePath (fileName);
+
+ Assert.AreEqual (expectedFileName, fileItem.FilePath);
+ Assert.AreEqual (BuildAction.Compile, fileItem.BuildAction);
+ }
+
+ [Test]
+ public void AddFile_RelativeFileNameWithNoPathUsed_AddsFileToProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ string fileName = @"d:\projects\MyProject\NewFile.cs".ToNativePath ();
+ project.AddDefaultBuildAction (BuildAction.Compile, fileName);
+ CreateProjectSystem (project);
+
+ string relativeFileName = @"NewFile.cs";
+ AddFile (relativeFileName);
+ ProjectFile fileItem = ProjectHelper.GetFile (project, fileName);
+
+ FilePath expectedFileName = new FilePath (fileName);
+
+ Assert.AreEqual (expectedFileName, fileItem.FilePath);
+ Assert.AreEqual (BuildAction.Compile, fileItem.BuildAction);
+ }
+
+ [Test]
+ public void AddFile_NewFile_ProjectIsSavedAfterFileAddedToProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ project.IsSaved = false;
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\projects\MyProject\src\NewFile.cs";
+ AddFile (fileName);
+
+ Assert.AreEqual (1, project.FilesAddedWhenSavedCount);
+ }
+
+ [Test]
+ public void AddFile_NewFileToBeAddedInBinFolder_FileIsNotAddedToProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+
+ string fileName = @"bin\NewFile.dll";
+ AddFile (fileName);
+
+ Assert.AreEqual (0, project.FilesAdded.Count);
+ }
+
+ [Test]
+ public void AddFile_NewFileToBeAddedInBinFolderWithBinFolderNameInUpperCase_FileIsNotAddedToProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+
+ string fileName = @"BIN\NewFile.dll";
+ AddFile (fileName);
+
+ Assert.AreEqual (0, project.FilesAdded.Count);
+ }
+
+ [Test]
+ public void AddFile_FileAlreadyExistsInProject_FileIsNotAddedToProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ project.AddDefaultBuildAction (BuildAction.Compile, @"d:\projects\MyProject\src\NewFile.cs");
+ CreateProjectSystem (project);
+ AddFileToProject (@"d:\projects\MyProject\src\NewFile.cs");
+
+ AddFile (@"src\NewFile.cs");
+
+ int projectItemsCount = project.FilesAdded.Count;
+ Assert.AreEqual (0, projectItemsCount);
+ }
+
+ [Test]
+ public void AddFile_NewFile_FileAddedToProjectIsLogged ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ project.Name = "MyTestProject";
+ CreateProjectSystem (project);
+
+ AddFile (@"src\files\abc.cs");
+
+ var expectedFileNameAndProjectName = new FileNameAndProjectName {
+ FileName = @"src\files\abc.cs".ToNativePath (),
+ ProjectName = "MyTestProject"
+ };
+
+ Assert.AreEqual (expectedFileNameAndProjectName, projectSystem.FileNameAndProjectNamePassedToLogAddedFileToProject);
+ }
+
+ [Test]
+ public void AddFile_NewFileAlreadyExistsInProject_FileIsStillLogged ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ project.Name = "MyTestProject";
+ AddFileToProject (@"src\files\abc.cs");
+ CreateProjectSystem (project);
+
+ AddFile (@"src\files\abc.cs");
+
+ var expectedFileNameAndProjectName = new FileNameAndProjectName {
+ FileName = @"src\files\abc.cs".ToNativePath (),
+ ProjectName = "MyTestProject"
+ };
+
+ Assert.AreEqual (expectedFileNameAndProjectName, projectSystem.FileNameAndProjectNamePassedToLogAddedFileToProject);
+ }
+
+ [Test]
+ public void DeleteFile_DeletesFileFromFileSystem_CallsFileServiceRemoveFile ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ AddFileToProject (@"d:\temp\test.cs");
+ CreateProjectSystem (project);
+
+ projectSystem.DeleteFile ("test.cs");
+
+ Assert.AreEqual (@"d:\temp\test.cs".ToNativePath (), projectSystem.FakeFileService.PathPassedToRemoveFile);
+ }
+
+ [Test]
+ public void DeleteFile_DeletesFileFromFileSystem_ProjectIsSavedAfterFileRemoved ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ project.IsSaved = false;
+ AddFileToProject (@"d:\temp\test.cs");
+ CreateProjectSystem (project);
+
+ projectSystem.DeleteFile ("test.cs");
+
+ Assert.AreEqual (0, project.FilesInProjectWhenSavedCount);
+ }
+
+ [Test]
+ public void DeleteFile_DeletesFileFromFileSystem_FileDeletionLogged ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ AddFileToProject (@"d:\temp\test.cs");
+ CreateProjectSystem (project);
+
+ projectSystem.DeleteFile ("test.cs");
+
+ Assert.AreEqual ("test.cs", projectSystem.FileNamePassedToLogDeletedFile);
+ }
+
+ [Test]
+ public void DeleteFile_DeletesFileFromFileSystem_FolderInformationNotLogged ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ AddFileToProject (@"d:\temp\test.cs");
+ CreateProjectSystem (project);
+
+ projectSystem.DeleteFile ("test.cs");
+
+ Assert.IsNull (projectSystem.FileNameAndDirectoryPassedToLogDeletedFileFromDirectory);
+ }
+
+ [Test]
+ public void DeleteFile_DeletesFileFromSubFolder_FileDeletionLogged ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ AddFileToProject (@"d:\temp\src\Files\test.cs");
+ CreateProjectSystem (project);
+
+ projectSystem.DeleteFile (@"src\Files\test.cs".ToNativePath ());
+
+ var expectedFileNameAndFolder = new FileNameAndDirectory () {
+ FileName = "test.cs",
+ Folder = @"src\Files".ToNativePath ()
+ };
+
+ var actualFileNameAndFolder = projectSystem.FileNameAndDirectoryPassedToLogDeletedFileFromDirectory;
+
+ Assert.AreEqual (expectedFileNameAndFolder, actualFileNameAndFolder);
+ }
+
+ [Test]
+ public void DeleteFile_DeletesFileFromSubFolder_FileDeletionWithoutFolderInformationIsNotLogged ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ AddFileToProject (@"d:\temp\src\Files\test.cs");
+ CreateProjectSystem (project);
+
+ projectSystem.DeleteFile (@"src\Files\test.cs".ToNativePath ());
+
+ Assert.IsNull (projectSystem.FileNamePassedToLogDeletedFile);
+ }
+
+ [Test]
+ public void DeleteDirectory_DeletesDirectoryFromFileSystem_CallsFileServiceRemoveDirectory ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ AddFileToProject (@"d:\temp\test\test.cs");
+ CreateProjectSystem (project);
+
+ projectSystem.DeleteDirectory ("test");
+
+ string path = @"d:\temp\test".ToNativePath ();
+ Assert.AreEqual (path, projectSystem.FakeFileService.PathPassedToRemoveDirectory);
+ }
+
+ [Test]
+ public void DeleteDirectory_DeletesDirectoryFromFileSystem_ProjectIsSavedAfterDirectoryDeleted ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ project.IsSaved = false;
+ AddFileToProject (@"d:\temp\test\test.cs");
+ CreateProjectSystem (project);
+
+ projectSystem.DeleteDirectory ("test");
+
+ Assert.AreEqual (0, project.FilesInProjectWhenSavedCount);
+ Assert.IsTrue (project.IsSaved);
+ }
+
+ [Test]
+ public void DeleteDirectory_DeletesDirectoryFromFileSystem_DirectoryIsLogged ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ project.IsSaved = false;
+ AddFileToProject (@"d:\temp\test\test.cs");
+ CreateProjectSystem (project);
+
+ projectSystem.DeleteDirectory ("test");
+
+ Assert.AreEqual ("test", projectSystem.DirectoryPassedToLogDeletedDirectory);
+ }
+
+ [Test]
+ public void AddFrameworkReference_SystemXmlToBeAdded_ReferenceAddedToProject ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ projectSystem.AddFrameworkReference ("System.Xml");
+
+ ProjectReference referenceItem = ProjectHelper.GetReference (project, "System.Xml");
+
+ Assert.AreEqual ("System.Xml", referenceItem.Reference);
+ Assert.AreEqual (ReferenceType.Package, referenceItem.ReferenceType);
+ }
+
+ [Test]
+ public void AddFrameworkReference_SystemXmlToBeAdded_ProjectIsSaved ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ projectSystem.AddFrameworkReference ("System.Xml");
+
+ bool saved = project.IsSaved;
+
+ Assert.IsTrue (saved);
+ }
+
+ [Test]
+ public void AddFrameworkReference_SystemXmlToBeAdded_AddedReferenceIsLogged ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+ project.Name = "MyTestProject";
+
+ projectSystem.AddFrameworkReference ("System.Xml");
+
+ var expectedReferenceAndProjectName = new ReferenceAndProjectName () {
+ Reference = "System.Xml",
+ Project = "MyTestProject"
+ };
+
+ Assert.AreEqual (expectedReferenceAndProjectName, projectSystem.ReferenceAndProjectNamePassedToLogAddedReferenceToProject);
+ }
+
+ [Test]
+ public void ResolvePath_PathPassed_ReturnsPathUnchanged ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ string expectedPath = @"d:\temp".ToNativePath ();
+
+ string path = projectSystem.ResolvePath (expectedPath);
+
+ Assert.AreEqual (expectedPath, path);
+ }
+
+ [Test]
+ [Ignore ("Custom tool not implemented")]
+ public void AddFile_NewTextTemplateFileWithAssociatedDefaultCustomTool_AddsFileToProjectWithDefaultCustomTool ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+ string path = @"d:\temp\abc.tt";
+ AddDefaultCustomToolForFileName (path, "TextTemplatingFileGenerator");
+ Stream stream = new MemoryStream ();
+
+ projectSystem.AddFile (path, stream);
+
+ //ProjectFile fileItem = ProjectHelper.GetFile (project, path);
+ //string customTool = fileItem.CustomTool;
+ //Assert.AreEqual ("TextTemplatingFileGenerator", customTool);
+ }
+
+ [Test]
+ [Ignore ("Custom tool not implemented")]
+ public void AddFile_NewFileWithNoAssociatedDefaultCustomTool_AddsFileToProjectWithNoDefaultCustomTool ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+ string path = @"d:\temp\abc.tt".ToNativePath ();
+ AddDefaultCustomToolForFileName (path, null);
+ Stream stream = new MemoryStream ();
+
+ projectSystem.AddFile (path, stream);
+
+ //ProjectFile fileItem = ProjectHelper.GetFile (project, path);
+ //string customTool = fileItem.CustomTool;
+ //Assert.AreEqual (String.Empty, customTool);
+ }
+
+ [Test]
+ [Ignore ("Not implemented in NuGet addin - MSBuild imports added elsewhere")]
+ public void AddImport_FullImportFilePathAndBottomOfProject_PathRelativeToProjectAddedAsLastImportInProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Bottom);
+
+ AssertLastMSBuildChildElementHasProjectAttributeValue (@"..\packages\Foo.0.1\build\Foo.targets");
+ }
+
+ [Test]
+ [Ignore ("Not implemented in NuGet addin - MSBuild imports added elsewhere")]
+ public void AddImport_AddImportToBottomOfProject_ImportAddedWithConditionThatChecksForExistenceOfTargetsFile ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Bottom);
+
+ AssertLastMSBuildChildHasCondition ("Exists('..\\packages\\Foo.0.1\\build\\Foo.targets')");
+ }
+
+ [Test]
+ public void AddImport_AddSameImportTwice_ImportOnlyAddedTwiceToProjectSinceProjectRemovesDuplicates ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Bottom);
+
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Bottom);
+
+ Assert.AreEqual (2, project.ImportsAdded.Count);
+ }
+
+ [Test]
+ public void AddImport_AddSameImportTwiceButWithDifferentCase_ImportOnlyAddedTwiceToProjectSinceProjectRemovesDuplicates ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath1 = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+ string targetPath2 = @"d:\projects\MyProject\packages\Foo.0.1\BUILD\FOO.TARGETS";
+ projectSystem.AddImport (targetPath1, ProjectImportLocation.Bottom);
+
+ projectSystem.AddImport (targetPath2, ProjectImportLocation.Bottom);
+
+ Assert.AreEqual (2, project.ImportsAdded.Count);
+ }
+
+ [Test]
+ public void AddImport_FullImportFilePathAndBottomOfProject_ProjectIsSaved ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Bottom);
+
+ Assert.IsTrue (project.IsSaved);
+ }
+
+ [Test]
+ public void RemoveImport_ImportAlreadyAddedToBottomOfProject_ImportRemoved ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Bottom);
+
+ projectSystem.RemoveImport (targetPath);
+
+ Assert.AreEqual (1, project.ImportsRemoved.Count);
+ }
+
+ [Test]
+ public void RemoveImport_ImportAlreadyWithDifferentCaseAddedToBottomOfProject_ImportRemoved ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath1 = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+ projectSystem.AddImport (targetPath1, ProjectImportLocation.Bottom);
+ string targetPath2 = @"d:\projects\MyProject\packages\Foo.0.1\BUILD\FOO.TARGETS";
+
+ projectSystem.RemoveImport (targetPath2);
+
+ Assert.AreEqual (1, project.ImportsAdded.Count);
+ Assert.AreEqual (1, project.ImportsRemoved.Count);
+ }
+
+ [Test]
+ public void RemoveImport_NoImportsAdded_ProjectIsSaved ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+
+ projectSystem.RemoveImport ("Unknown.targets");
+
+ Assert.IsTrue (project.IsSaved);
+ }
+
+ [Test]
+ [Ignore ("Not implemented in NuGet addin - MSBuild imports added elsewhere")]
+ public void AddImport_AddToTopOfProject_ImportAddedAsFirstChildElement ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Top);
+
+ AssertFirstMSBuildChildElementHasProjectAttributeValue (@"..\packages\Foo.0.1\build\Foo.targets");
+ }
+
+ [Test]
+ [Ignore ("MSBuild conditions not implemented")]
+ public void AddImport_AddImportToTopOfProject_ImportAddedWithConditionThatChecksForExistenceOfTargetsFile ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Top);
+
+ AssertFirstMSBuildChildHasCondition ("Exists('..\\packages\\Foo.0.1\\build\\Foo.targets')");
+ }
+
+ [Test]
+ public void AddImport_AddToTopOfProjectTwice_ImportAddedTwiceSinceProjectRemovesDuplicates ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Top);
+
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Top);
+
+ Assert.AreEqual (2, project.ImportsAdded.Count);
+ }
+
+ [Test]
+ public void AddFile_NewFileAddedWithAction_AddsFileToFileSystem ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ string expectedPath = @"d:\temp\abc.cs".ToNativePath ();
+ Action<Stream> expectedAction = stream => {
+ };
+ projectSystem.AddFile (expectedPath, expectedAction);
+
+ Assert.AreEqual (expectedPath, projectSystem.PathPassedToPhysicalFileSystemAddFile);
+ Assert.AreEqual (expectedAction, projectSystem.ActionPassedToPhysicalFileSystemAddFile);
+ }
+
+ [Test]
+ public void AddFile_NewFileAddedWithAction_AddsFileToProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ string fileName = @"d:\projects\MyProject\src\NewFile.cs".ToNativePath ();
+ project.AddDefaultBuildAction (BuildAction.Compile, fileName);
+ CreateProjectSystem (project);
+
+ Action<Stream> action = stream => {
+ };
+ projectSystem.AddFile (fileName, action);
+
+ ProjectFile fileItem = ProjectHelper.GetFile (project, fileName);
+ var expectedFileName = new FilePath (fileName);
+
+ Assert.AreEqual (expectedFileName, fileItem.FilePath);
+ Assert.AreEqual (BuildAction.Compile, fileItem.BuildAction);
+ }
+
+ [Test]
+ public void ReferenceExists_ReferenceIsInProjectButIncludesAssemblyVersion_ReturnsTrue ()
+ {
+ CreateTestProject ();
+ string include = "MyAssembly, Version=0.1.0.0, Culture=neutral, PublicKeyToken=8cc8392e8503e009";
+ ProjectHelper.AddGacReference (project, include);
+ CreateProjectSystem (project);
+ string fileName = @"D:\Projects\Test\myassembly.dll".ToNativePath ();
+
+ bool result = projectSystem.ReferenceExists (fileName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void RemoveReference_ReferenceBeingRemovedHasFileExtensionAndProjectHasReferenceIncludingAssemblyVersion_ReferenceRemovedFromProject ()
+ {
+ CreateTestProject ();
+ string include = "nunit.framework, Version=2.6.2.0, Culture=neutral, PublicKeyToken=8cc8392e8503e009";
+ ProjectHelper.AddGacReference (project, include);
+ CreateProjectSystem (project);
+ string fileName = @"d:\projects\packages\nunit\nunit.framework.dll".ToNativePath ();
+
+ projectSystem.RemoveReference (fileName);
+
+ ProjectReference referenceItem = ProjectHelper.GetReference (project, "nunit.framework");
+ Assert.IsNull (referenceItem);
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/NuGetPackageRestoreCommandLineTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/NuGetPackageRestoreCommandLineTests.cs
new file mode 100644
index 0000000000..92dae73c23
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/NuGetPackageRestoreCommandLineTests.cs
@@ -0,0 +1,86 @@
+//
+// NuGetPackageRestoreCommandLineTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+using NUnit.Framework;
+using MonoDevelop.Core.Assemblies;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using System.IO;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class NuGetPackageRestoreCommandLineTests
+ {
+ NuGetPackageRestoreCommandLine commandLine;
+
+ void CreateCommandLineWithSolution (string fileName)
+ {
+ CreateCommandLineWithSolution (fileName, null, false);
+ }
+
+ void CreateCommandLineWithSolution (string fileName, MonoRuntimeInfo monoRuntimeInfo)
+ {
+ CreateCommandLineWithSolution (fileName, monoRuntimeInfo, true);
+ }
+
+ void CreateCommandLineWithSolution (string fileName, MonoRuntimeInfo monoRuntimeInfo, bool isMonoRuntime)
+ {
+ var solution = new FakePackageManagementSolution ();
+ solution.FileName = fileName;
+ commandLine = new NuGetPackageRestoreCommandLine (
+ solution,
+ monoRuntimeInfo,
+ isMonoRuntime);
+ }
+
+ [Test]
+ public void Arguments_RestoreSolution_SolutionFullFileNameUsed ()
+ {
+ CreateCommandLineWithSolution (@"d:\projects\MySolution\MySolution.sln");
+
+ string arguments = commandLine.Arguments;
+
+ string expectedArguments = "restore \"d:\\projects\\MySolution\\MySolution.sln\"";
+ Assert.AreEqual (expectedArguments, arguments);
+ }
+
+ [Test]
+ public void CommandLine_RestoreSolutionOnMono_MonoUsedFromCurrentPrefix ()
+ {
+ var monoRuntime = new MonoRuntimeInfo (@"c:\Users\Prefix");
+ CreateCommandLineWithSolution (@"d:\projects\MySolution\MySolution.sln", monoRuntime);
+
+ string arguments = commandLine.Arguments;
+
+ string expectedCommandLine = Path.Combine (@"c:\Users\Prefix", "bin", "mono");
+ Assert.IsTrue (arguments.StartsWith ("--runtime=v4.0 "), arguments);
+ Assert.IsTrue (arguments.EndsWith ("restore \"d:\\projects\\MySolution\\MySolution.sln\""), arguments);
+ Assert.AreEqual (expectedCommandLine, commandLine.Command);
+ }
+ }
+} \ No newline at end of file
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/OpenDotNetProjectTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/OpenDotNetProjectTests.cs
new file mode 100644
index 0000000000..84d7b1a2ae
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/OpenDotNetProjectTests.cs
@@ -0,0 +1,90 @@
+//
+// OpenDotNetProjectTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Core;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class OpenDotNetProjectsTests
+ {
+ OpenDotNetProjects projects;
+ FakePackageManagementProjectService fakeProjectService;
+ List<IDotNetProject> openProjects;
+
+ void CreateOpenMSBuildProjects ()
+ {
+ fakeProjectService = new FakePackageManagementProjectService ();
+ openProjects = fakeProjectService.OpenProjects;
+
+ projects = new OpenDotNetProjects (fakeProjectService);
+ }
+
+ FakeDotNetProject AddProjectWithShortName (string projectName)
+ {
+ var project = ProjectHelper.CreateTestProject (projectName);
+ openProjects.Add (project);
+ return project;
+ }
+
+ FakeDotNetProject AddProjectWithFileName (string fileName)
+ {
+ FakeDotNetProject project = AddProjectWithShortName ("Test");
+ project.FileName = new FilePath (fileName);
+ return project;
+ }
+
+ [Test]
+ public void FindProject_ProjectShortNameUsedAndProjectIsOpen_ReturnsProject ()
+ {
+ CreateOpenMSBuildProjects ();
+ IDotNetProject expectedProject = AddProjectWithShortName ("MyProject");
+
+ IDotNetProject project = projects.FindProject ("MyProject");
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void FindProject_ProjectFileNameUsedAndProjectIsOpen_ReturnsProject ()
+ {
+ CreateOpenMSBuildProjects ();
+ string fileName = @"d:\projects\MyProject\MyProject.csproj";
+ IDotNetProject expectedProject = AddProjectWithFileName (fileName);
+
+ IDotNetProject project = projects.FindProject (fileName);
+
+ Assert.AreEqual (expectedProject, project);
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageFilesTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageFilesTests.cs
new file mode 100644
index 0000000000..30d245fe04
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageFilesTests.cs
@@ -0,0 +1,170 @@
+//
+// PackageFilesTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using NUnit.Framework;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class PackageFilesTests
+ {
+ PackageFiles packageFiles;
+
+ void CreatePackageFiles (FakePackage package)
+ {
+ packageFiles = new PackageFiles (package);
+ }
+
+ void CreatePackageFilesWithOneFile (string fileName)
+ {
+ var package = new FakePackage ();
+ package.AddFile (fileName);
+ CreatePackageFiles (package);
+ }
+
+ void CreatePackageFilesWithTwoFiles (string fileName1, string fileName2)
+ {
+ var package = new FakePackage ();
+ package.AddFile (fileName1);
+ package.AddFile (fileName2);
+ CreatePackageFiles (package);
+ }
+
+ [Test]
+ public void HasAnyPackageScripts_HasOnePowerShellInitScript_ReturnsTrue ()
+ {
+ CreatePackageFilesWithOneFile (@"tools\init.ps1");
+
+ bool hasScripts = packageFiles.HasAnyPackageScripts ();
+
+ Assert.IsTrue (hasScripts);
+ }
+
+ [Test]
+ public void HasAnyPackageScripts_HasOneCSharpFile_ReturnsFalse ()
+ {
+ CreatePackageFilesWithOneFile (@"src\test.cs");
+
+ bool hasScripts = packageFiles.HasAnyPackageScripts ();
+
+ Assert.IsFalse (hasScripts);
+ }
+
+ [Test]
+ public void HasAnyPackageScripts_HasOnePowerShellInitScriptWithDifferentParentFolder_ReturnsTrue ()
+ {
+ CreatePackageFilesWithOneFile (@"parentfolder\init.ps1");
+
+ bool hasScripts = packageFiles.HasAnyPackageScripts ();
+
+ Assert.IsTrue (hasScripts);
+ }
+
+ [Test]
+ public void HasAnyPackageScripts_HasOnePowerShellInitScriptInUpperCase_ReturnsTrue ()
+ {
+ CreatePackageFilesWithOneFile (@"tools\INIT.PS1");
+
+ bool hasScripts = packageFiles.HasAnyPackageScripts ();
+
+ Assert.IsTrue (hasScripts);
+ }
+
+ [Test]
+ public void HasAnyPackageScripts_HasOnePowerShellInstallScript_ReturnsTrue ()
+ {
+ CreatePackageFilesWithOneFile (@"tools\install.ps1");
+
+ bool hasScripts = packageFiles.HasAnyPackageScripts ();
+
+ Assert.IsTrue (hasScripts);
+ }
+
+ [Test]
+ public void HasAnyPackageScripts_HasOnePowerShellInstallScriptInUpperCase_ReturnsTrue ()
+ {
+ CreatePackageFilesWithOneFile (@"tools\INSTALL.PS1");
+
+ bool hasScripts = packageFiles.HasAnyPackageScripts ();
+
+ Assert.IsTrue (hasScripts);
+ }
+
+ [Test]
+ public void HasAnyPackageScripts_HasOnePowerShellUninstallScript_ReturnsTrue ()
+ {
+ CreatePackageFilesWithOneFile (@"tools\uninstall.ps1");
+
+ bool hasScripts = packageFiles.HasAnyPackageScripts ();
+
+ Assert.IsTrue (hasScripts);
+ }
+
+ [Test]
+ public void HasAnyPackageScripts_HasOnePowerShellUninstallScriptInUpperCase_ReturnsTrue ()
+ {
+ CreatePackageFilesWithOneFile (@"tools\UNINSTALL.PS1");
+
+ bool hasScripts = packageFiles.HasAnyPackageScripts ();
+
+ Assert.IsTrue (hasScripts);
+ }
+
+ [Test]
+ public void HasAnyPackageScripts_SecondFileIsPowerShellInitScript_ReturnsTrue ()
+ {
+ CreatePackageFilesWithTwoFiles (@"src\test.cs", @"tools\init.ps1");
+
+ bool hasScripts = packageFiles.HasAnyPackageScripts ();
+
+ Assert.IsTrue (hasScripts);
+ }
+
+ [Test]
+ public void HasUninstallPackageScript_HasOnePowerShellUninstallScript_ReturnsTrue ()
+ {
+ CreatePackageFilesWithOneFile (@"tools\uninstall.ps1");
+
+ bool hasScript = packageFiles.HasUninstallPackageScript ();
+
+ Assert.IsTrue (hasScript);
+ }
+
+ [Test]
+ public void HasUninstallPackageScript_HasOneCSharpFile_ReturnsFalse ()
+ {
+ CreatePackageFilesWithOneFile (@"tools\test.cs");
+
+ bool hasScript = packageFiles.HasUninstallPackageScript ();
+
+ Assert.IsFalse (hasScript);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageFromRepositoryTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageFromRepositoryTests.cs
new file mode 100644
index 0000000000..b3ad384a74
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageFromRepositoryTests.cs
@@ -0,0 +1,467 @@
+//
+// PackageFromRepositoryTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Runtime.Versioning;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class PackageFromRepositoryTests
+ {
+ FakePackage fakePackage;
+ TestablePackageFromRepository package;
+ FakePackageRepository fakeRepository;
+
+ void CreatePackage ()
+ {
+ package = new TestablePackageFromRepository ();
+ fakePackage = package.FakePackagePassedToConstructor;
+ fakeRepository = package.FakePackageRepositoryPassedToConstructor;
+ }
+
+ [Test]
+ public void Repository_PackageCreatedWithSourceRepository_ReturnsSourceRepository ()
+ {
+ CreatePackage ();
+ IPackageRepository repository = package.Repository;
+
+ Assert.AreEqual (fakeRepository, repository);
+ }
+
+ [Test]
+ public void AssemblyReferences_WrappedPackageHasOneAssemblyReference_ReturnsOneAssemblyReference ()
+ {
+ CreatePackage ();
+ fakePackage.AssemblyReferenceList.Add (new FakePackageAssemblyReference ());
+
+ IEnumerable<IPackageAssemblyReference> assemblyReferences = package.AssemblyReferences;
+ List<IPackageAssemblyReference> expectedAssemblyReferences = fakePackage.AssemblyReferenceList;
+
+ CollectionAssert.AreEqual (expectedAssemblyReferences, assemblyReferences);
+ }
+
+ [Test]
+ public void Id_WrappedPackageIdIsTest_ReturnsTest ()
+ {
+ CreatePackage ();
+ fakePackage.Id = "Test";
+ string id = package.Id;
+
+ Assert.AreEqual ("Test", id);
+ }
+
+ [Test]
+ public void Version_WrappedPackageVersionIsOnePointOne_ReturnsOnePointOne ()
+ {
+ CreatePackage ();
+ var expectedVersion = new SemanticVersion ("1.1");
+ fakePackage.Version = expectedVersion;
+ SemanticVersion version = package.Version;
+
+ Assert.AreEqual (expectedVersion, version);
+ }
+
+ [Test]
+ public void Title_WrappedPackageTitleIsTest_ReturnsTest ()
+ {
+ CreatePackage ();
+ fakePackage.Title = "Test";
+ string title = package.Title;
+
+ Assert.AreEqual ("Test", title);
+ }
+
+ [Test]
+ public void Authors_WrappedPackageHasOneAuthor_ReturnsOneAuthor ()
+ {
+ CreatePackage ();
+ fakePackage.AuthorsList.Add ("Author1");
+
+ IEnumerable<string> authors = package.Authors;
+ List<string> expectedAuthors = fakePackage.AuthorsList;
+
+ CollectionAssert.AreEqual (expectedAuthors, authors);
+ }
+
+ [Test]
+ public void Owners_WrappedPackageHasOneOwner_ReturnsOneOwner ()
+ {
+ CreatePackage ();
+ fakePackage.OwnersList.Add ("Owner1");
+
+ IEnumerable<string> owners = package.Owners;
+ List<string> expectedOwners = fakePackage.OwnersList;
+
+ CollectionAssert.AreEqual (expectedOwners, owners);
+ }
+
+ [Test]
+ public void IconUrl_WrappedPackageIconUrlIsHttpSharpDevelopNet_ReturnsHttpSharpDevelopNet ()
+ {
+ CreatePackage ();
+ var expectedUrl = new Uri ("http://sharpdevelop.net");
+ fakePackage.IconUrl = expectedUrl;
+ Uri url = package.IconUrl;
+
+ Assert.AreEqual (expectedUrl, url);
+ }
+
+ [Test]
+ public void LicenseUrl_WrappedPackageLicenseUrlIsHttpSharpDevelopNet_ReturnsHttpSharpDevelopNet ()
+ {
+ CreatePackage ();
+ var expectedUrl = new Uri ("http://sharpdevelop.net");
+ fakePackage.LicenseUrl = expectedUrl;
+ Uri url = package.LicenseUrl;
+
+ Assert.AreEqual (expectedUrl, url);
+ }
+
+ [Test]
+ public void ProjectUrl_WrappedPackageProjectUrlIsHttpSharpDevelopNet_ReturnsHttpSharpDevelopNet ()
+ {
+ CreatePackage ();
+ var expectedUrl = new Uri ("http://sharpdevelop.net");
+ fakePackage.ProjectUrl = expectedUrl;
+ Uri url = package.ProjectUrl;
+
+ Assert.AreEqual (expectedUrl, url);
+ }
+
+ [Test]
+ public void ReportAbuseUrl_WrappedPackageReportAbuseUrlIsHttpSharpDevelopNet_ReturnsHttpSharpDevelopNet ()
+ {
+ CreatePackage ();
+ var expectedUrl = new Uri ("http://sharpdevelop.net");
+ fakePackage.ReportAbuseUrl = expectedUrl;
+ Uri url = package.ReportAbuseUrl;
+
+ Assert.AreEqual (expectedUrl, url);
+ }
+
+ [Test]
+ public void RequiresLicenseAcceptance_WrappedPackageRequiresLicenseAcceptanceIsTrue_ReturnsTrue ()
+ {
+ CreatePackage ();
+ fakePackage.RequireLicenseAcceptance = true;
+
+ Assert.IsTrue (package.RequireLicenseAcceptance);
+ }
+
+ [Test]
+ public void Description_WrappedPackageDescriptionIsTest_ReturnsTest ()
+ {
+ CreatePackage ();
+ fakePackage.Description = "Test";
+ string description = package.Description;
+
+ Assert.AreEqual ("Test", description);
+ }
+
+ [Test]
+ public void Summary_WrappedPackageSummaryIsTest_ReturnsTest ()
+ {
+ CreatePackage ();
+ fakePackage.Summary = "Test";
+ string summary = package.Summary;
+
+ Assert.AreEqual ("Test", summary);
+ }
+
+ [Test]
+ public void Language_WrappedPackageLanguageIsTest_ReturnsTest ()
+ {
+ CreatePackage ();
+ fakePackage.Language = "Test";
+ string language = package.Language;
+
+ Assert.AreEqual ("Test", language);
+ }
+
+ [Test]
+ public void Tags_WrappedPackageTagsIsTest_ReturnsTest ()
+ {
+ CreatePackage ();
+ fakePackage.Tags = "Test";
+ string tags = package.Tags;
+
+ Assert.AreEqual ("Test", tags);
+ }
+
+ [Test]
+ public void FrameworkAssemblies_WrappedPackageHasOneFrameworkAssembly_ReturnsOneFrameworkAssembly ()
+ {
+ CreatePackage ();
+ fakePackage.FrameworkAssembliesList.Add (new FrameworkAssemblyReference ("System.Xml"));
+
+ IEnumerable<FrameworkAssemblyReference> assemblies = package.FrameworkAssemblies;
+ IEnumerable<FrameworkAssemblyReference> expectedAssemblies = fakePackage.FrameworkAssemblies;
+
+ CollectionAssert.AreEqual (expectedAssemblies, assemblies);
+ }
+
+ [Test]
+ public void Dependencies_WrappedPackageHasOneDependency_ReturnsOneDependency ()
+ {
+ CreatePackage ();
+ fakePackage.AddDependency ("Test");
+
+ IEnumerable<PackageDependency> dependencies = package.Dependencies;
+
+ CollectionAssert.AreEqual (fakePackage.DependenciesList, dependencies);
+ }
+
+ [Test]
+ public void GetFiles_WrappedPackageHasOneFile_ReturnsOneFile ()
+ {
+ CreatePackage ();
+ fakePackage.FilesList.Add (new PhysicalPackageFile ());
+
+ IEnumerable<IPackageFile> files = package.GetFiles ();
+ IEnumerable<IPackageFile> expectedFiles = fakePackage.FilesList;
+
+ CollectionAssert.AreEqual (expectedFiles, files);
+ }
+
+ [Test]
+ public void DownloadCount_WrappedPackageDownloadCountIsTen_ReturnsTen ()
+ {
+ CreatePackage ();
+ fakePackage.DownloadCount = 10;
+ int count = package.DownloadCount;
+
+ Assert.AreEqual (10, count);
+ }
+
+ [Test]
+ public void GetStream_WrappedPackageHasStream_ReturnsWrappedPackageStream ()
+ {
+ CreatePackage ();
+ var expectedStream = new MemoryStream ();
+ fakePackage.Stream = expectedStream;
+
+ Stream stream = package.GetStream ();
+
+ Assert.AreEqual (expectedStream, stream);
+ }
+
+ [Test]
+ public void HasDependencies_WrappedPackageHasNoDependencies_ReturnsFalse ()
+ {
+ CreatePackage ();
+ fakePackage.DependenciesList.Clear ();
+ bool result = package.HasDependencies;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void HasDependencies_WrappedPackageHasOneDependency_ReturnsTrue ()
+ {
+ CreatePackage ();
+ fakePackage.AddDependency ("Test");
+ bool result = package.HasDependencies;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void LastUpdated_PackageWrapsDataServicePackageThatHasLastUpdatedDateOffset_ReturnsDateFromDataServicePackage ()
+ {
+ CreatePackage ();
+ var expectedDateTime = new DateTime (2011, 1, 2);
+ package.DateTimeOffsetToReturnFromGetDataServicePackageLastUpdated = new DateTimeOffset (expectedDateTime);
+
+ DateTime? lastUpdated = package.LastUpdated;
+
+ Assert.AreEqual (expectedDateTime, lastUpdated.Value);
+ }
+
+ [Test]
+ public void LastUpdated_PackageWrapsPackageThatDoesNotHaveLastUpdatedDateOffset_ReturnsNullDate ()
+ {
+ CreatePackage ();
+ package.DateTimeOffsetToReturnFromGetDataServicePackageLastUpdated = null;
+
+ DateTime? lastUpdated = package.LastUpdated;
+
+ Assert.IsFalse (lastUpdated.HasValue);
+ }
+
+ [Test]
+ public void IsLatestVersion_WrappedPackageIsNotLatestVersion_ReturnsFalse ()
+ {
+ CreatePackage ();
+ fakePackage.IsLatestVersion = false;
+ bool result = package.IsLatestVersion;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void IsLatestVersion_WrappedPackageHasOneDependency_ReturnsTrue ()
+ {
+ CreatePackage ();
+ fakePackage.IsLatestVersion = true;
+ bool result = package.IsLatestVersion;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void Published_PackageWrapsPackageThatHasPublishedDateOffset_ReturnsDateTimeOffsetFromWrappedPackage ()
+ {
+ CreatePackage ();
+ var dateTime = new DateTime (2011, 1, 2);
+ var expectedDateTimeOffset = new DateTimeOffset (dateTime);
+ fakePackage.Published = expectedDateTimeOffset;
+
+ DateTimeOffset? published = package.Published;
+
+ Assert.AreEqual (expectedDateTimeOffset, published.Value);
+ }
+
+ [Test]
+ public void Copyright_WrappedPackageCopyrightIsTest_ReturnsTest ()
+ {
+ CreatePackage ();
+ fakePackage.Copyright = "Test";
+ string copyright = package.Copyright;
+
+ Assert.AreEqual ("Test", copyright);
+ }
+
+ [Test]
+ public void ReleaseNotes_WrappedPackageReleaseNotesIsTest_ReturnsTest ()
+ {
+ CreatePackage ();
+ fakePackage.ReleaseNotes = "Test";
+ string releaseNotes = package.ReleaseNotes;
+
+ Assert.AreEqual ("Test", releaseNotes);
+ }
+
+ [Test]
+ public void IsAbsoluteLatestVersion_WrappedPackageIsAbsoluteLatestVersion_ReturnsTrue ()
+ {
+ CreatePackage ();
+ fakePackage.IsAbsoluteLatestVersion = true;
+ bool result = package.IsAbsoluteLatestVersion;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void Listed_WrappedPackageIsListed_ReturnsTrue ()
+ {
+ CreatePackage ();
+ fakePackage.Listed = true;
+ bool result = package.Listed;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void DependencySets_WrappedPackageIsListed_ReturnsTrue ()
+ {
+ CreatePackage ();
+ fakePackage.AddDependency ("Test");
+ List<PackageDependencySet> expectedDependencies = fakePackage.DependencySets.ToList ();
+
+ List<PackageDependencySet> dependencies = package.DependencySets.ToList ();
+
+ Assert.AreEqual (1, dependencies.Count);
+ Assert.AreEqual (expectedDependencies [0].Dependencies, dependencies [0].Dependencies);
+ }
+
+ [Test]
+ public void GetSupportedFrameworks_OneFramework_ReturnsOneFramework ()
+ {
+ CreatePackage ();
+ FrameworkName expectedFramework = fakePackage.AddSupportedFramework (".NET Framework, Version=4.0");
+
+ List<FrameworkName> supportedFrameworks = package.GetSupportedFrameworks ().ToList ();
+
+ Assert.AreEqual (1, supportedFrameworks.Count);
+ Assert.AreEqual (expectedFramework, supportedFrameworks [0]);
+ }
+
+ [Test]
+ public void ToString_PackageHasIdAndVersion_ReturnsWrappedPackageToString ()
+ {
+ CreatePackage ();
+ fakePackage.Id = "MyPackage";
+ fakePackage.Version = new SemanticVersion ("1.1");
+
+ string result = package.ToString ();
+
+ Assert.AreEqual ("MyPackage 1.1", result);
+ }
+
+ [Test]
+ public void MinClientVersion_PackageHasMinClientVersion_ReturnsWrappedPackageMinClientVersion ()
+ {
+ CreatePackage ();
+ var expectedVersion = new Version ("1.1");
+ fakePackage.MinClientVersion = expectedVersion;
+
+ Version version = package.MinClientVersion;
+
+ Assert.AreEqual (expectedVersion, version);
+ }
+
+ [Test]
+ public void PackageAssemblyReferences_PackageHasOnePackageAssemblyReference_ReturnsWrappedPackagePackageAssemblyReferences ()
+ {
+ CreatePackage ();
+ fakePackage.AddPackageReferences ("Test");
+ List<PackageReferenceSet> expectedReferences = fakePackage.PackageAssemblyReferences.ToList ();
+
+ List<PackageReferenceSet> result = package.PackageAssemblyReferences.ToList ();
+
+ Assert.AreEqual (expectedReferences, result);
+ }
+
+ [Test]
+ public void DevelopmentDependency_PackageHasDevelopmentDependencySetToTrue_ReturnsWrappedPackageDevelopmentDependency ()
+ {
+ CreatePackage ();
+ fakePackage.DevelopmentDependency = true;
+
+ bool dependency = package.DevelopmentDependency;
+
+ Assert.IsTrue (dependency);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementEventsTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementEventsTests.cs
new file mode 100644
index 0000000000..5e7f7074e9
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementEventsTests.cs
@@ -0,0 +1,463 @@
+//
+// PackageManagementEventsTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class PackageManagementEventsTests
+ {
+ PackageManagementEvents events;
+ List<FakePackage> packages;
+
+ void CreateEvents ()
+ {
+ packages = new List<FakePackage> ();
+ events = new PackageManagementEvents ();
+ }
+
+ PackageManagementSelectedProjects CreateSelectedProjects ()
+ {
+ var solution = new FakePackageManagementSolution ();
+ return new PackageManagementSelectedProjects (solution);
+ }
+
+ [Test]
+ public void OnPackageOperationsStarting_OneEventSubscriber_PackageOperationsStartingFired ()
+ {
+ CreateEvents ();
+ EventArgs eventArgs = null;
+ events.PackageOperationsStarting += (sender, e) => eventArgs = e;
+ events.OnPackageOperationsStarting ();
+
+ Assert.IsNotNull (eventArgs);
+ }
+
+ [Test]
+ public void OnPackageOperationsStarting_OneEventSubscriber_SenderIsPackageManagementEvents ()
+ {
+ CreateEvents ();
+ object eventSender = null;
+ events.PackageOperationsStarting += (sender, e) => eventSender = sender;
+ events.OnPackageOperationsStarting ();
+
+ Assert.AreEqual (events, eventSender);
+ }
+
+ [Test]
+ public void OnPackageOperationsStarting_NoEventSubscribers_NullReferenceExceptionNotThrown ()
+ {
+ CreateEvents ();
+ Assert.DoesNotThrow (() => events.OnPackageOperationsStarting ());
+ }
+
+ [Test]
+ public void OnPackageOperationError_OneEventSubscriber_PackageOperationErrorEventArgsHasException ()
+ {
+ CreateEvents ();
+ Exception exception = null;
+ events.PackageOperationError += (sender, e) => exception = e.Exception;
+
+ Exception expectedException = new Exception ("Test");
+ events.OnPackageOperationError (expectedException);
+
+ Assert.AreEqual (expectedException, exception);
+ }
+
+ [Test]
+ public void OnPackageOperationError_OneEventSubscriber_SenderIsPackageManagementEvents ()
+ {
+ CreateEvents ();
+ object eventSender = null;
+ events.PackageOperationError += (sender, e) => eventSender = sender;
+
+ Exception expectedException = new Exception ("Test");
+ events.OnPackageOperationError (expectedException);
+
+ Assert.AreEqual (events, eventSender);
+ }
+
+ [Test]
+ public void OnPackageOperationError_NoEventSubscribers_NullReferenceExceptionNotThrown ()
+ {
+ CreateEvents ();
+ Exception expectedException = new Exception ("Test");
+
+ Assert.DoesNotThrow (() => events.OnPackageOperationError (expectedException));
+ }
+
+ [Test]
+ public void OnAcceptLicenses_OneEventSubscriber_EventArgsHasPackages ()
+ {
+ CreateEvents ();
+ IEnumerable<IPackage> packages = null;
+ events.AcceptLicenses += (sender, e) => packages = e.Packages;
+
+ var expectedPackages = new FakePackage[] {
+ new FakePackage ("A"),
+ new FakePackage ("B")
+ };
+ events.OnAcceptLicenses (expectedPackages);
+
+ Assert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void OnAcceptLicenses_OneEventSubscriber_SenderIsPackageEvents ()
+ {
+ CreateEvents ();
+ object eventSender = null;
+ events.AcceptLicenses += (sender, e) => eventSender = sender;
+ events.OnAcceptLicenses (packages);
+
+ Assert.AreEqual (events, eventSender);
+ }
+
+ [Test]
+ public void OnAcceptLicenses_NoEventSubscribers_NullReferenceExceptionIsNotThrown ()
+ {
+ CreateEvents ();
+ Assert.DoesNotThrow (() => events.OnAcceptLicenses (packages));
+ }
+
+ [Test]
+ public void OnAcceptLicenses_NoEventSubscribers_ReturnsTrue ()
+ {
+ CreateEvents ();
+ bool result = events.OnAcceptLicenses (packages);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void OnAcceptLicenses_EventArgIsAcceptedIsSetToFalse_ReturnsFalse ()
+ {
+ CreateEvents ();
+ events.AcceptLicenses += (sender, e) => e.IsAccepted = false;
+ bool result = events.OnAcceptLicenses (packages);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void OnAcceptLicenses_EventArgIsAcceptedIsSetToTrue_ReturnsTrue ()
+ {
+ CreateEvents ();
+ events.AcceptLicenses += (sender, e) => e.IsAccepted = true;
+ bool result = events.OnAcceptLicenses (packages);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void OnParentPackageInstalled_OneEventSubscriber_EventArgsHasPackage ()
+ {
+ CreateEvents ();
+ IPackage package = null;
+ IPackageManagementProject project = null;
+ events.ParentPackageInstalled += (sender, e) => {
+ package = e.Package;
+ project = e.Project;
+ };
+
+ var expectedPackage = new FakePackage ("Test");
+ var expectedProject = new FakePackageManagementProject ();
+ events.OnParentPackageInstalled (expectedPackage, expectedProject);
+
+ Assert.AreEqual (expectedPackage, package);
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void OnParentPackageInstalled_OneEventSubscriber_SenderIsPackageManagementEvents ()
+ {
+ CreateEvents ();
+ object eventSender = null;
+ events.ParentPackageInstalled += (sender, e) => eventSender = sender;
+
+ var package = new FakePackage ("Test");
+ events.OnParentPackageInstalled (package, null);
+
+ Assert.AreEqual (events, eventSender);
+ }
+
+ [Test]
+ public void OnParentPackageInstalled_NoEventSubscribers_NullReferenceExceptionIsNotThrown ()
+ {
+ CreateEvents ();
+ var package = new FakePackage ("Test");
+ Assert.DoesNotThrow (() => events.OnParentPackageInstalled (package, null));
+ }
+
+ [Test]
+ public void OnParentPackageUninstalled_OneEventSubscriber_EventArgsHasPackage ()
+ {
+ CreateEvents ();
+ IPackage package = null;
+ IPackageManagementProject project = null;
+ events.ParentPackageUninstalled += (sender, e) => {
+ package = e.Package;
+ project = e.Project;
+ };
+
+ var expectedPackage = new FakePackage ("Test");
+ var expectedProject = new FakePackageManagementProject ();
+ events.OnParentPackageUninstalled (expectedPackage, expectedProject);
+
+ Assert.AreEqual (expectedPackage, package);
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void OnParentPackageUninstalled_OneEventSubscriber_SenderIsPackageManagementEvents ()
+ {
+ CreateEvents ();
+ object eventSender = null;
+ events.ParentPackageUninstalled += (sender, e) => eventSender = sender;
+
+ var package = new FakePackage ("Test");
+ events.OnParentPackageUninstalled (package, null);
+
+ Assert.AreEqual (events, eventSender);
+ }
+
+ [Test]
+ public void OnParentPackageUninstalled_NoEventSubscribers_NullReferenceExceptionIsNotThrown ()
+ {
+ CreateEvents ();
+ var package = new FakePackage ("Test");
+ Assert.DoesNotThrow (() => events.OnParentPackageUninstalled (package, null));
+ }
+
+ [Test]
+ public void OnPackageOperationMessageLogged_OneEventSubscriber_SenderIsPackageManagementEvents ()
+ {
+ CreateEvents ();
+ object eventSender = null;
+ events.PackageOperationMessageLogged += (sender, e) => eventSender = sender;
+
+ events.OnPackageOperationMessageLogged (MessageLevel.Info, "Test");
+
+ Assert.AreEqual (events, eventSender);
+ }
+
+ [Test]
+ public void OnPackageOperationMessageLogged_NoEventSubscribers_NullReferenceExceptionIsNotThrown ()
+ {
+ CreateEvents ();
+ Assert.DoesNotThrow (() => events.OnPackageOperationMessageLogged (MessageLevel.Info, "Test"));
+ }
+
+ [Test]
+ public void OnPackageOperationMessageLogged_InfoMessageLoggedWithOneEventSubscriber_EventArgsHasInfoMessageLevel ()
+ {
+ CreateEvents ();
+ PackageOperationMessageLoggedEventArgs eventArgs = null;
+ events.PackageOperationMessageLogged += (sender, e) => eventArgs = e;
+
+ events.OnPackageOperationMessageLogged (MessageLevel.Info, "Test");
+
+ Assert.AreEqual (MessageLevel.Info, eventArgs.Message.Level);
+ }
+
+ [Test]
+ public void OnPackageOperationMessageLogged_FormattedInfoMessageLoggedWithOneEventSubscriber_EventArgsHasFormattedMessage ()
+ {
+ CreateEvents ();
+ PackageOperationMessageLoggedEventArgs eventArgs = null;
+ events.PackageOperationMessageLogged += (sender, e) => eventArgs = e;
+
+ string format = "Test {0}";
+ events.OnPackageOperationMessageLogged (MessageLevel.Info, format, "B");
+
+ string message = eventArgs.Message.ToString ();
+
+ string expectedMessage = "Test B";
+ Assert.AreEqual (expectedMessage, message);
+ }
+
+ [Test]
+ public void OnSelectProjects_OneEventSubscriber_EventArgsHasSelectedProjects ()
+ {
+ CreateEvents ();
+ IEnumerable<IPackageManagementSelectedProject> selectedProjects = null;
+ events.SelectProjects += (sender, e) => selectedProjects = e.SelectedProjects;
+
+ var expectedSelectedProjects = new List<IPackageManagementSelectedProject> ();
+ events.OnSelectProjects (expectedSelectedProjects);
+
+ Assert.AreEqual (expectedSelectedProjects, selectedProjects);
+ }
+
+ [Test]
+ public void OnSelectProjects_OneEventSubscriber_SenderIsPackageEvents ()
+ {
+ CreateEvents ();
+ object eventSender = null;
+ events.SelectProjects += (sender, e) => eventSender = sender;
+ var selectedProjects = new List<IPackageManagementSelectedProject> ();
+ events.OnSelectProjects (selectedProjects);
+
+ Assert.AreEqual (events, eventSender);
+ }
+
+ [Test]
+ public void OnSelectProjects_NoEventSubscribers_NullReferenceExceptionIsNotThrown ()
+ {
+ CreateEvents ();
+ var selectedProjects = new List<IPackageManagementSelectedProject> ();
+
+ Assert.DoesNotThrow (() => events.OnSelectProjects (selectedProjects));
+ }
+
+ [Test]
+ public void OnSelectProjects_NoEventSubscribers_ReturnsTrue ()
+ {
+ CreateEvents ();
+ var selectedProjects = new List<IPackageManagementSelectedProject> ();
+ bool result = events.OnSelectProjects (selectedProjects);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void OnSelectProjects_EventArgIsAcceptedIsSetToFalse_ReturnsFalse ()
+ {
+ CreateEvents ();
+ events.SelectProjects += (sender, e) => e.IsAccepted = false;
+ var selectedProjects = new List<IPackageManagementSelectedProject> ();
+ bool result = events.OnSelectProjects (selectedProjects);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void OnSelectProjects_EventArgIsAcceptedIsSetToTrue_ReturnsTrue ()
+ {
+ CreateEvents ();
+ events.SelectProjects += (sender, e) => e.IsAccepted = true;
+ var selectedProjects = new List<IPackageManagementSelectedProject> ();
+ bool result = events.OnSelectProjects (selectedProjects);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void OnResolveFileConflict_OneEventSubscriber_SenderIsPackageEvents ()
+ {
+ CreateEvents ();
+ object eventSender = null;
+ events.ResolveFileConflict += (sender, e) => eventSender = sender;
+ events.OnResolveFileConflict ("message");
+
+ Assert.AreEqual (events, eventSender);
+ }
+
+ [Test]
+ public void OnResolveFileConflict_OneEventSubscriber_MessageAddedToEventArgs ()
+ {
+ CreateEvents ();
+ ResolveFileConflictEventArgs eventArgs = null;
+ events.ResolveFileConflict += (sender, e) => eventArgs = e;
+ events.OnResolveFileConflict ("message");
+
+ Assert.AreEqual ("message", eventArgs.Message);
+ }
+
+ [Test]
+ public void OnResolveFileConflict_OneEventSubscriberWhichDoesNotChangeEventArgs_EventArgsHasFileConflictResolutionOfIgnore ()
+ {
+ CreateEvents ();
+ ResolveFileConflictEventArgs eventArgs = null;
+ events.ResolveFileConflict += (sender, e) => eventArgs = e;
+ events.OnResolveFileConflict ("message");
+
+ Assert.AreEqual (FileConflictResolution.Ignore, eventArgs.Resolution);
+ }
+
+ [Test]
+ public void OnResolveFileConflict_OneEventSubscriberWhichChangesResolutionToOverwrite_ReturnsOverwrite ()
+ {
+ CreateEvents ();
+ events.ResolveFileConflict += (sender, e) => e.Resolution = FileConflictResolution.Overwrite;
+ FileConflictResolution resolution = events.OnResolveFileConflict ("message");
+
+ Assert.AreEqual (FileConflictResolution.Overwrite, resolution);
+ }
+
+ [Test]
+ public void OnResolveFileConflict_NoEventSubscribers_ReturnsIgnoreAll ()
+ {
+ CreateEvents ();
+ FileConflictResolution resolution = events.OnResolveFileConflict ("message");
+
+ Assert.AreEqual (FileConflictResolution.IgnoreAll, resolution);
+ }
+
+ [Test]
+ public void OnParentPackagesUpdated_OneEventSubscriber_PackagesUpdatedEventFired ()
+ {
+ CreateEvents ();
+ ParentPackagesOperationEventArgs eventArgs = null;
+ events.ParentPackagesUpdated += (sender, e) => eventArgs = e;
+ var packages = new FakePackage[] { new FakePackage ("Test") };
+
+ events.OnParentPackagesUpdated (packages);
+
+ Assert.AreEqual (packages, eventArgs.Packages);
+ }
+
+ [Test]
+ public void OnParentPackagesUpdated_OneEventSubscriber_SenderIsPackageManagementEvents ()
+ {
+ CreateEvents ();
+ object eventSender = null;
+ events.ParentPackagesUpdated += (sender, e) => eventSender = sender;
+ var packages = new FakePackage[] { new FakePackage ("Test") };
+
+ events.OnParentPackagesUpdated (packages);
+
+ Assert.AreEqual (events, eventSender);
+ }
+
+ [Test]
+ public void OnParentPackagesUpdated_NoEventSubscribers_NullReferenceExceptionNotThrown ()
+ {
+ CreateEvents ();
+ var packages = new FakePackage[] { new FakePackage ("Test") };
+
+ Assert.DoesNotThrow (() => events.OnParentPackagesUpdated (packages));
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementLoggerTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementLoggerTests.cs
new file mode 100644
index 0000000000..cce2a5c9e9
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementLoggerTests.cs
@@ -0,0 +1,109 @@
+//
+// PackageManagementLoggerTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class PackageManagementLoggerTests
+ {
+ PackageManagementEvents packageManagementEvents;
+ PackageManagementLogger logger;
+ List<PackageOperationMessageLoggedEventArgs> messagesLoggedEventArgs;
+
+ void CreateLogger ()
+ {
+ messagesLoggedEventArgs = new List<PackageOperationMessageLoggedEventArgs> ();
+ packageManagementEvents = new PackageManagementEvents ();
+ packageManagementEvents.PackageOperationMessageLogged += (sender, e) => {
+ messagesLoggedEventArgs.Add (e);
+ };
+
+ logger = new PackageManagementLogger (packageManagementEvents);
+ }
+
+ void AssertOnPackageOperationMessageLoggedCalled (MessageLevel level, string message)
+ {
+ PackageOperationMessageLoggedEventArgs eventArgs = messagesLoggedEventArgs [0];
+ Assert.AreEqual (message, eventArgs.Message.ToString ());
+ Assert.AreEqual (level, eventArgs.Message.Level);
+ }
+
+ [Test]
+ public void Log_WarningMessageLogged_RaisesMessageLoggedEventWithWarningMessageLevel ()
+ {
+ CreateLogger ();
+
+ logger.Log (MessageLevel.Warning, "test");
+
+ AssertOnPackageOperationMessageLoggedCalled (MessageLevel.Warning, "test");
+ }
+
+ [Test]
+ public void Log_FormattedInfoMessageLogged_RaisesMessageLoggedEventWithFormattedMessage ()
+ {
+ CreateLogger ();
+
+ string format = "Test {0}";
+ logger.Log (MessageLevel.Info, format, "C");
+
+ AssertOnPackageOperationMessageLoggedCalled (MessageLevel.Info, "Test C");
+ }
+
+ [Test]
+ public void ResolveFileConflict_MessagePassed_RaisesOnResolveFileConflictEvent ()
+ {
+ CreateLogger ();
+ string message = null;
+ packageManagementEvents.ResolveFileConflict += (sender, e) => {
+ message = e.Message;
+ };
+
+ logger.ResolveFileConflict ("message");
+
+ Assert.AreEqual ("message", message);
+ }
+
+ [Test]
+ public void ResolveFileConflict_PackageManagementEventsResolveFileConflictReturnsIgnoreAll_ReturnsIgnoreAll ()
+ {
+ CreateLogger ();
+ packageManagementEvents.ResolveFileConflict += (sender, e) => {
+ e.Resolution = FileConflictResolution.IgnoreAll;
+ };
+
+ FileConflictResolution resolution = logger.ResolveFileConflict ("message");
+
+ Assert.AreEqual (FileConflictResolution.IgnoreAll, resolution);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementOptionsTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementOptionsTests.cs
new file mode 100644
index 0000000000..ed9a9850bc
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementOptionsTests.cs
@@ -0,0 +1,473 @@
+//
+// PackageManagementOptionsTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Xml;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Core;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class PackageManagementOptionsTests
+ {
+ Properties properties;
+ PackageManagementOptions options;
+ FakeSettings fakeSettings;
+
+ void CreateOptions ()
+ {
+ CreateProperties ();
+ CreateSettings ();
+ CreateOptions (properties, fakeSettings);
+ }
+
+ void CreateProperties ()
+ {
+ properties = new Properties ();
+ }
+
+ void CreateSettings ()
+ {
+ fakeSettings = new FakeSettings ();
+ }
+
+ void CreateOptions (Properties properties)
+ {
+ CreateSettings ();
+ CreateOptions (properties, fakeSettings);
+ }
+
+ void CreateOptions (FakeSettings fakeSettings)
+ {
+ CreateProperties ();
+ options = new PackageManagementOptions (properties, fakeSettings);
+ }
+
+ void CreateOptions (Properties properties, FakeSettings fakeSettings)
+ {
+ options = new PackageManagementOptions (properties, fakeSettings);
+ }
+
+ void SaveOptions ()
+ {
+ var builder = new StringBuilder ();
+ var writer = new XmlTextWriter (new StringWriter (builder));
+ properties.Write (writer);
+ }
+
+ RecentPackageInfo AddRecentPackageToOptions (string id, string version)
+ {
+ var recentPackage = new RecentPackageInfo (id, new SemanticVersion (version));
+ options.RecentPackages.Add (recentPackage);
+ return recentPackage;
+ }
+
+ void EnablePackageRestoreInSettings ()
+ {
+ fakeSettings.SetPackageRestoreSetting (true);
+ }
+
+ [Test]
+ public void PackageSources_OnePackageSourceInSettings_ContainsPackageSourceFromSettingsAndDefaultNuGetOrgFeed ()
+ {
+ CreateSettings ();
+ var packageSource = new PackageSource ("http://codeplex.com", "Test");
+ fakeSettings.AddFakePackageSource (packageSource);
+ CreateOptions (fakeSettings);
+
+ RegisteredPackageSources actualSources = options.PackageSources;
+
+ List<PackageSource> expectedSources = new List<PackageSource> ();
+ expectedSources.Add (packageSource);
+ expectedSources.Add (RegisteredPackageSources.DefaultPackageSource);
+
+ Assert.AreEqual (expectedSources, actualSources);
+ }
+
+ [Test]
+ public void PackageSources_NoPackageSourceInSavedSettings_ContainsDefaultPackageSource ()
+ {
+ CreateSettings ();
+ CreateOptions (fakeSettings);
+
+ List<PackageSource> expectedSources = new List<PackageSource> ();
+ expectedSources.Add (RegisteredPackageSources.DefaultPackageSource);
+
+ RegisteredPackageSources actualPackageSources = options.PackageSources;
+
+ CollectionAssert.AreEqual (expectedSources, actualPackageSources);
+ }
+
+ [Test]
+ public void PackageSources_NoPackageSourceInSavedSettings_DefaultPackageSourceIsNotAddedToSettings ()
+ {
+ CreateSettings ();
+ CreateOptions (fakeSettings);
+ RegisteredPackageSources packageSources = options.PackageSources;
+
+ PackageSource packageSource = RegisteredPackageSources.DefaultPackageSource;
+
+ bool result = fakeSettings.SavedSectionValueLists.ContainsKey (FakeSettings.PackageSourcesSectionName);
+ Assert.IsFalse (result);
+ Assert.IsNotNull (packageSource);
+ }
+
+ [Test]
+ public void PackageSources_OnePackageSourceAdded_PackageSourceSavedInSettings ()
+ {
+ CreateSettings ();
+ CreateOptions (fakeSettings);
+ RegisteredPackageSources registeredPackageSources = options.PackageSources;
+
+ var packageSource = new PackageSource ("http://codeplex.com", "Test");
+ registeredPackageSources.Clear ();
+ registeredPackageSources.Add (packageSource);
+
+ var expectedSavedPackageSourceSettings = new List<KeyValuePair<string, string>> ();
+ expectedSavedPackageSourceSettings.Add (new KeyValuePair<string, string> ("Test", "http://codeplex.com"));
+
+ IList<KeyValuePair<string, string>> actualSavedPackageSourceSettings = fakeSettings.GetValuesPassedToSetValuesForPackageSourcesSection ();
+
+ Assert.AreEqual (expectedSavedPackageSourceSettings, actualSavedPackageSourceSettings);
+ }
+
+ [Test]
+ public void PackageSources_OnePackageSourceAdded_PackageSourcesSectionDeletedFromSettings ()
+ {
+ CreateSettings ();
+ CreateOptions (fakeSettings);
+ RegisteredPackageSources registeredPackageSources = options.PackageSources;
+
+ var packageSource = new PackageSource ("http://codeplex.com", "Test");
+ registeredPackageSources.Clear ();
+ registeredPackageSources.Add (packageSource);
+
+ bool sectionDeleted = fakeSettings.IsPackageSourcesSectionDeleted;
+
+ Assert.IsTrue (sectionDeleted);
+ }
+
+ [Test]
+ public void PackageSources_SettingsFilesDoesNotExistSoSettingsReturnsNullForPackageSourcesSection_DoesNotThrowException ()
+ {
+ CreateSettings ();
+ fakeSettings.MakePackageSourceSectionsNull ();
+ CreateOptions (fakeSettings);
+
+ RegisteredPackageSources packageSources = null;
+ Assert.DoesNotThrow (() => packageSources = options.PackageSources);
+ }
+
+ [Test]
+ public void ActivePackageSource_NoInitialPropertiesSet_ReturnsNull ()
+ {
+ CreateOptions ();
+ PackageSource actualSource = options.ActivePackageSource;
+ Assert.IsNull (options.ActivePackageSource);
+ }
+
+ [Test]
+ public void ActivePackageSource_SourceChanged_ActivePackageSourceUpdatedInSettings ()
+ {
+ CreateOptions ();
+ var packageSource = new PackageSource ("http://sharpdevelop.com", "Test");
+
+ options.ActivePackageSource = packageSource;
+
+ var expectedKeyValuePair = new KeyValuePair<string, string> ("Test", "http://sharpdevelop.com");
+ KeyValuePair<string, string> actualKeyValuePair = fakeSettings.GetValuePassedToSetValueForActivePackageSourceSection ();
+
+ Assert.AreEqual (expectedKeyValuePair, actualKeyValuePair);
+ }
+
+ [Test]
+ public void ActivePackageSource_ActivePackageSourceNonNullInSettings_ReturnsActivatePackageSourceInSavedSettings ()
+ {
+ CreateSettings ();
+ var expectedSource = new PackageSource ("http://source-url", "Test");
+ fakeSettings.SetFakeActivePackageSource (expectedSource);
+ fakeSettings.AddFakePackageSource (expectedSource);
+ CreateOptions (fakeSettings);
+
+ PackageSource actualSource = options.ActivePackageSource;
+
+ Assert.AreEqual (expectedSource, actualSource);
+ }
+
+ [Test]
+ public void ActivePackageSource_SetToNullAfterHavingNonNullValue_ReturnsNull ()
+ {
+ CreateOptions ();
+ var source = new PackageSource ("http://source-url", "Test");
+ options.ActivePackageSource = source;
+
+ options.ActivePackageSource = null;
+
+ PackageSource actualSource = options.ActivePackageSource;
+ Assert.IsNull (actualSource);
+ }
+
+ [Test]
+ public void ActivePackageSource_ActivePackageSourceRemovedFromPackageSources_ActivePackageSourceSetToNull ()
+ {
+ CreateOptions ();
+ var source = new PackageSource ("http://source-url", "Test");
+ options.PackageSources.Add (source);
+
+ var differentSource = new PackageSource ("http://different-url", "Test2");
+ options.ActivePackageSource = differentSource;
+
+ PackageSource activeSource = options.ActivePackageSource;
+
+ Assert.IsNull (activeSource);
+ }
+
+ [Test]
+ public void ActivePackageSource_ActivePackageSourceChanged_ActivePackageSourceSectionRemovedFromSettings ()
+ {
+ CreateOptions ();
+
+ options.ActivePackageSource = new PackageSource ("http://sharpdevelop.com", "Test");
+
+ bool sectionDeleted = fakeSettings.IsActivePackageSourceSectionDeleted;
+
+ Assert.IsTrue (sectionDeleted);
+ }
+
+ [Test]
+ public void ActivePackageSource_OneActivePackageSourceInSettingsAndActivePackageSourceSetToNull_ActivePackageSourceSectionRemoved ()
+ {
+ CreateSettings ();
+ var expectedSource = new PackageSource ("http://source-url", "Test");
+ fakeSettings.SetFakeActivePackageSource (expectedSource);
+ fakeSettings.AddFakePackageSource (expectedSource);
+ CreateOptions (fakeSettings);
+
+ options.ActivePackageSource = null;
+
+ bool sectionRemoved = fakeSettings.IsActivePackageSourceSectionDeleted;
+
+ Assert.IsTrue (sectionRemoved);
+ }
+
+ [Test]
+ public void ActivePackageSource_SettingsFilesDoesNotExistSoSettingsReturnsNullForActivePackageSourceSection_DoesNotThrowException ()
+ {
+ CreateSettings ();
+ fakeSettings.MakeActivePackageSourceSectionNull ();
+ CreateOptions (fakeSettings);
+
+ PackageSource activePackageSource = null;
+ Assert.DoesNotThrow (() => activePackageSource = options.ActivePackageSource);
+ }
+
+ [Test]
+ public void RecentPackages_OneRecentPackageAddedAndOptionsReloadedFromSavedProperties_ContainsOneRecentPackageThatWasSavedPreviously ()
+ {
+ CreateOptions ();
+ var package = new FakePackage ("Test");
+ var recentPackage = new RecentPackageInfo (package);
+ options.RecentPackages.Add (recentPackage);
+ CreateOptions (properties);
+
+ IList<RecentPackageInfo> recentPackages = options.RecentPackages;
+
+ var expectedRecentPackages = new RecentPackageInfo[] {
+ new RecentPackageInfo (package)
+ };
+
+ RecentPackageInfoCollectionAssert.AreEqual (expectedRecentPackages, recentPackages);
+ }
+
+ [Test]
+ public void RecentPackages_SaveRecentPackages_DoesNotThrowInvalidOperationException ()
+ {
+ CreateOptions ();
+ AddRecentPackageToOptions ("id", "1.0");
+
+ Assert.DoesNotThrow (() => SaveOptions ());
+ }
+
+ [Test]
+ public void ActivePackageSource_AggregatePackageSourceIsActivePackageSourceInSettings_ReturnsAggregatePackageSource ()
+ {
+ CreateSettings ();
+ PackageSource expectedPackageSource = RegisteredPackageSourceSettings.AggregatePackageSource;
+ fakeSettings.SetFakeActivePackageSource (expectedPackageSource);
+ CreateOptions (fakeSettings);
+
+ PackageSource activePackageSource = options.ActivePackageSource;
+
+ Assert.AreEqual (expectedPackageSource, activePackageSource);
+ }
+
+ [Test]
+ public void PackageSources_OneEnabledPackageSourceInSettings_ContainsSingleEnabledPackageSourceFromSettings ()
+ {
+ CreateSettings ();
+ var packageSource = new PackageSource ("http://codeplex.com", "Test") { IsEnabled = true };
+ fakeSettings.AddFakePackageSource (packageSource);
+ CreateOptions (fakeSettings);
+
+ RegisteredPackageSources actualSources = options.PackageSources;
+
+ Assert.IsTrue (actualSources [0].IsEnabled);
+ }
+
+ [Test]
+ public void PackageSources_OneDisabledPackageSourceInSettings_ContainsSingleDisabledPackageSourceFromSettings ()
+ {
+ CreateSettings ();
+ var packageSource = new PackageSource ("http://codeplex.com", "Test") { IsEnabled = false };
+ fakeSettings.AddFakePackageSource (packageSource);
+ fakeSettings.AddDisabledPackageSource (packageSource);
+ CreateOptions (fakeSettings);
+
+ RegisteredPackageSources actualSources = options.PackageSources;
+
+ Assert.IsFalse (actualSources [0].IsEnabled);
+ }
+
+ [Test]
+ public void PackageSources_OnePackageSourceAdded_DisabledPackageSourcesSectionDeletedFromSettings ()
+ {
+ CreateSettings ();
+ CreateOptions (fakeSettings);
+ RegisteredPackageSources registeredPackageSources = options.PackageSources;
+
+ var packageSource = new PackageSource ("http://codeplex.com", "Test");
+ registeredPackageSources.Clear ();
+ registeredPackageSources.Add (packageSource);
+
+ bool sectionDeleted = fakeSettings.IsDisabledPackageSourcesSectionDeleted;
+
+ Assert.IsTrue (sectionDeleted);
+ }
+
+ [Test]
+ public void PackageSources_OneDisabledPackageSourceAdded_DisabledPackageSourcesSectionSaved ()
+ {
+ CreateSettings ();
+ CreateOptions (fakeSettings);
+ RegisteredPackageSources registeredPackageSources = options.PackageSources;
+
+ var packageSource = new PackageSource ("http://codeplex.com", "Test") { IsEnabled = false };
+ registeredPackageSources.Clear ();
+ registeredPackageSources.Add (packageSource);
+
+ var expectedSavedPackageSourceSettings = new List<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);
+
+ IList<KeyValuePair<string, string>> actualSavedPackageSourceSettings =
+ fakeSettings.GetValuesPassedToSetValuesForDisabledPackageSourcesSection ();
+ Assert.AreEqual (0, actualSavedPackageSourceSettings.Count);
+ }
+
+ [Test]
+ public void IsPackageRestoreEnabled_EnabledInSettings_ReturnsTrue ()
+ {
+ CreateSettings ();
+ EnablePackageRestoreInSettings ();
+ CreateOptions (fakeSettings);
+
+ bool enabled = options.IsPackageRestoreEnabled;
+
+ Assert.IsTrue (enabled);
+ }
+
+ [Test]
+ public void IsPackageRestoreEnabled_PackageRestoreNotInSettings_ReturnsTrue ()
+ {
+ CreateOptions ();
+
+ bool enabled = options.IsPackageRestoreEnabled;
+
+ Assert.IsTrue (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_PackageRestoreSectionIsNotDeletedFromSettings ()
+ {
+ CreateSettings ();
+ EnablePackageRestoreInSettings ();
+ CreateOptions (fakeSettings);
+
+ options.IsPackageRestoreEnabled = false;
+
+ bool deleted = fakeSettings.IsPackageRestoreSectionDeleted;
+ Assert.IsFalse (deleted);
+ }
+
+ [Test]
+ public void IsPackageRestoreEnabled_OriginallyEnabledInSettingsButSetToTrue_PackageRestoreIsFalseInSettings ()
+ {
+ CreateSettings ();
+ EnablePackageRestoreInSettings ();
+ CreateOptions (fakeSettings);
+
+ options.IsPackageRestoreEnabled = false;
+
+ KeyValuePair<string, string> keyValuePair = fakeSettings.GetValuePassedToSetValueForPackageRestoreSection ();
+ Assert.AreEqual ("False", keyValuePair.Value);
+ }
+ }
+} \ No newline at end of file
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementOptionsViewModelTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementOptionsViewModelTests.cs
new file mode 100644
index 0000000000..431d901212
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementOptionsViewModelTests.cs
@@ -0,0 +1,330 @@
+//
+// PackageManagementOptionsViewModelTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NUnit.Framework;
+using MonoDevelop.Core;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class PackageManagementOptionsViewModelTests
+ {
+ PackageManagementOptionsViewModel viewModel;
+ FakeRecentPackageRepository fakeRecentRepository;
+ FakeMachinePackageCache fakeMachineCache;
+ FakeProcess fakeProcess;
+ List<string> propertiesChanged;
+ PackageManagementOptions options;
+ FakeSettings fakeSettings;
+
+ void CreateRecentRepository ()
+ {
+ fakeRecentRepository = new FakeRecentPackageRepository ();
+ }
+
+ void CreateMachineCache ()
+ {
+ fakeMachineCache = new FakeMachinePackageCache ();
+ }
+
+ void CreateOptions ()
+ {
+ var properties = new Properties ();
+ fakeSettings = new FakeSettings ();
+ options = new PackageManagementOptions (properties, fakeSettings);
+ }
+
+ void EnablePackageRestoreInOptions ()
+ {
+ fakeSettings.SetPackageRestoreSetting (true);
+ }
+
+ void DisablePackageRestoreInOptions ()
+ {
+ fakeSettings.SetPackageRestoreSetting (false);
+ }
+
+ void CreateViewModelUsingCreatedMachineCache ()
+ {
+ CreateRecentRepository ();
+ CreateOptions ();
+ fakeProcess = new FakeProcess ();
+ CreateViewModel (options);
+ }
+
+ void CreateViewModelUsingCreatedRecentRepository ()
+ {
+ CreateMachineCache ();
+ CreateOptions ();
+ fakeProcess = new FakeProcess ();
+ CreateViewModel (options);
+ }
+
+ void CreateViewModel (PackageManagementOptions options)
+ {
+ viewModel = new PackageManagementOptionsViewModel (options, fakeRecentRepository, fakeMachineCache, fakeProcess);
+ }
+
+ void AddPackageToRecentRepository ()
+ {
+ fakeRecentRepository.FakePackages.Add (new FakePackage ());
+ fakeRecentRepository.HasRecentPackages = true;
+ }
+
+ void AddPackageToMachineCache ()
+ {
+ fakeMachineCache.FakePackages.Add (new FakePackage ());
+ }
+
+ void RecordPropertyChanges ()
+ {
+ propertiesChanged = new List<string> ();
+ viewModel.PropertyChanged += (sender, e) => propertiesChanged.Add (e.PropertyName);
+ }
+
+ [Test]
+ public void HasNoRecentPackages_RecentPackageRepositoryHasNoPackages_ReturnsTrue ()
+ {
+ CreateRecentRepository ();
+ CreateViewModelUsingCreatedRecentRepository ();
+ fakeRecentRepository.HasRecentPackages = false;
+
+ bool hasPackages = viewModel.HasNoRecentPackages;
+
+ Assert.IsTrue (hasPackages);
+ }
+
+ [Test]
+ public void HasNoRecentPackages_RecentPackageRepositoryHasOnePackage_ReturnsFalse ()
+ {
+ CreateRecentRepository ();
+ fakeRecentRepository.HasRecentPackages = true;
+ AddPackageToRecentRepository ();
+ CreateViewModelUsingCreatedRecentRepository ();
+
+ bool hasPackages = viewModel.HasNoRecentPackages;
+
+ Assert.IsFalse (hasPackages);
+ }
+
+ [Test]
+ public void HasNoCachedPackages_MachinePackageCacheHasNoPackages_ReturnsTrue ()
+ {
+ CreateMachineCache ();
+ CreateViewModelUsingCreatedMachineCache ();
+
+ bool hasPackages = viewModel.HasNoCachedPackages;
+
+ Assert.IsTrue (hasPackages);
+ }
+
+ [Test]
+ public void HasNoCachedPackages_MachinePackageCacheHasOnePackage_ReturnsFalse ()
+ {
+ CreateMachineCache ();
+ AddPackageToMachineCache ();
+ CreateViewModelUsingCreatedMachineCache ();
+
+ bool hasPackages = viewModel.HasNoCachedPackages;
+
+ Assert.IsFalse (hasPackages);
+ }
+
+ [Test]
+ public void ClearRecentPackagesCommandCanExecute_OneRecentPackage_CanExecuteReturnsTrue ()
+ {
+ CreateRecentRepository ();
+ AddPackageToRecentRepository ();
+ CreateViewModelUsingCreatedRecentRepository ();
+
+ bool canExecute = viewModel.ClearRecentPackagesCommand.CanExecute (null);
+
+ Assert.IsTrue (canExecute);
+ }
+
+ [Test]
+ public void ClearRecentPackagesCommandCanExecute_NoRecentPackages_CanExecuteReturnsFalse ()
+ {
+ CreateRecentRepository ();
+ CreateViewModelUsingCreatedRecentRepository ();
+
+ bool canExecute = viewModel.ClearRecentPackagesCommand.CanExecute (null);
+
+ Assert.IsFalse (canExecute);
+ }
+
+ [Test]
+ public void ClearCachedPackagesCommandCanExecute_OneCachedPackage_CanExecuteReturnsTrue ()
+ {
+ CreateMachineCache ();
+ AddPackageToMachineCache ();
+ CreateViewModelUsingCreatedMachineCache ();
+
+ bool canExecute = viewModel.ClearCachedPackagesCommand.CanExecute (null);
+
+ Assert.IsTrue (canExecute);
+ }
+
+ [Test]
+ public void ClearCachedPackagesCommandCanExecute_NoCachedPackages_CanExecuteReturnsFalse ()
+ {
+ CreateMachineCache ();
+ CreateViewModelUsingCreatedMachineCache ();
+
+ bool canExecute = viewModel.ClearCachedPackagesCommand.CanExecute (null);
+
+ Assert.IsFalse (canExecute);
+ }
+
+ [Test]
+ public void ClearCachedPackagesCommandExecute_OneCachedPackage_ClearsPackagesFromCache ()
+ {
+ CreateMachineCache ();
+ AddPackageToMachineCache ();
+ CreateViewModelUsingCreatedMachineCache ();
+
+ viewModel.ClearCachedPackagesCommand.Execute (null);
+
+ Assert.IsTrue (fakeMachineCache.IsClearCalled);
+ }
+
+ [Test]
+ public void ClearRecentPackagesCommandExecute_OneRecentPackage_ClearsPackages ()
+ {
+ CreateMachineCache ();
+ AddPackageToRecentRepository ();
+ CreateViewModelUsingCreatedRecentRepository ();
+
+ viewModel.ClearRecentPackagesCommand.Execute (null);
+
+ Assert.IsTrue (fakeRecentRepository.IsClearCalled);
+ }
+
+ [Test]
+ public void ClearRecentPackages_OneRecentPackage_HasNoRecentPackagesIsTrue ()
+ {
+ CreateRecentRepository ();
+ AddPackageToRecentRepository ();
+ CreateViewModelUsingCreatedRecentRepository ();
+
+ RecordPropertyChanges ();
+ viewModel.ClearRecentPackages ();
+ fakeRecentRepository.HasRecentPackages = false;
+
+ bool hasPackages = viewModel.HasNoRecentPackages;
+
+ Assert.IsTrue (hasPackages);
+ }
+
+ [Test]
+ public void ClearCachedPackages_OneCachedPackage_HasNoCachedPackagesReturnsTrue ()
+ {
+ CreateMachineCache ();
+ AddPackageToMachineCache ();
+ CreateViewModelUsingCreatedMachineCache ();
+
+ RecordPropertyChanges ();
+ viewModel.ClearCachedPackages ();
+
+ bool hasPackages = viewModel.HasNoCachedPackages;
+
+ Assert.IsTrue (hasPackages);
+ }
+
+ [Test]
+ public void ClearRecentPackages_OneRecentPackage_HasNoRecentPackagesPropertyChangedEventFired ()
+ {
+ CreateRecentRepository ();
+ AddPackageToRecentRepository ();
+ CreateViewModelUsingCreatedMachineCache ();
+
+ RecordPropertyChanges ();
+ viewModel.ClearRecentPackages ();
+
+ bool fired = propertiesChanged.Contains ("HasNoRecentPackages");
+
+ Assert.IsTrue (fired);
+ }
+
+ [Test]
+ public void ClearCachedPackages_OneCachedPackage_HasNoCachedPackagesPropertyChangedEventFired ()
+ {
+ CreateMachineCache ();
+ AddPackageToMachineCache ();
+ CreateViewModelUsingCreatedMachineCache ();
+
+ RecordPropertyChanges ();
+ viewModel.ClearCachedPackages ();
+
+ bool fired = propertiesChanged.Contains ("HasNoCachedPackages");
+
+ Assert.IsTrue (fired);
+ }
+
+ [Test]
+ public void BrowseCachedPackagesCommandCanExecute_OneCachedPackage_ReturnsTrue ()
+ {
+ CreateMachineCache ();
+ AddPackageToMachineCache ();
+ CreateViewModelUsingCreatedMachineCache ();
+
+ bool canExecute = viewModel.BrowseCachedPackagesCommand.CanExecute (null);
+
+ Assert.IsTrue (canExecute);
+ }
+
+ [Test]
+ public void BrowseCachedPackagesCommandCanExecute_NoCachedPackages_ReturnsFalse ()
+ {
+ CreateMachineCache ();
+ CreateViewModelUsingCreatedMachineCache ();
+
+ bool canExecute = viewModel.BrowseCachedPackagesCommand.CanExecute (null);
+
+ Assert.IsFalse (canExecute);
+ }
+
+ [Test]
+ public void BrowseCachedPackagesCommandExecute_OneCachedPackage_StartsProcessToOpenMachineCacheFolder ()
+ {
+ CreateMachineCache ();
+ CreateViewModelUsingCreatedMachineCache ();
+
+ string expectedFileName = @"d:\projects\nugetpackages";
+ fakeMachineCache.Source = expectedFileName;
+
+ viewModel.BrowseCachedPackagesCommand.Execute (null);
+
+ string fileName = fakeProcess.FileNamePassedToStart;
+
+ Assert.AreEqual (expectedFileName, fileName);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementProjectTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementProjectTests.cs
new file mode 100644
index 0000000000..44144891f6
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementProjectTests.cs
@@ -0,0 +1,758 @@
+//
+// PackageManagementProjectTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class PackageManagementProjectTests
+ {
+ FakePackageManagerFactory fakePackageManagerFactory;
+ FakePackageRepository fakeSourceRepository;
+ FakeDotNetProject fakeProject;
+ PackageManagementProject project;
+ FakeProjectManager fakeProjectManager;
+ FakePackageManager fakePackageManager;
+ PackageManagementEvents packageManagementEvents;
+ FakeInstallPackageAction fakeInstallAction;
+ FakeUninstallPackageAction fakeUninstallAction;
+ FakeUpdatePackageAction fakeUpdateAction;
+ UpdatePackagesAction updatePackagesAction;
+
+ void CreateProject ()
+ {
+ fakePackageManagerFactory = new FakePackageManagerFactory ();
+ fakePackageManager = fakePackageManagerFactory.FakePackageManager;
+ fakeProjectManager = fakePackageManager.FakeProjectManager;
+ fakeSourceRepository = new FakePackageRepository ();
+ fakeProject = new FakeDotNetProject ();
+ packageManagementEvents = new PackageManagementEvents ();
+
+ project = new PackageManagementProject (
+ fakeSourceRepository,
+ fakeProject,
+ packageManagementEvents,
+ fakePackageManagerFactory);
+ }
+
+ FakeInstallPackageAction CreateFakeInstallAction ()
+ {
+ fakeInstallAction = new FakeInstallPackageAction ();
+ return fakeInstallAction;
+ }
+
+ FakeUninstallPackageAction CreateFakeUninstallAction ()
+ {
+ fakeUninstallAction = new FakeUninstallPackageAction (project);
+ return fakeUninstallAction;
+ }
+
+ FakeUpdatePackageAction CreateFakeUpdateAction ()
+ {
+ fakeUpdateAction = new FakeUpdatePackageAction (project);
+ return fakeUpdateAction;
+ }
+
+ void CreateUpdatePackagesAction ()
+ {
+ updatePackagesAction = new UpdatePackagesAction (project, null);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIsInstalled_ReturnsTrue ()
+ {
+ CreateProject ();
+ fakeProjectManager.IsInstalledReturnValue = true;
+ var package = new FakePackage ("Test");
+
+ bool installed = project.IsPackageInstalled (package);
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIsNotInstalled_ReturnsFalse ()
+ {
+ CreateProject ();
+ fakeProjectManager.IsInstalledReturnValue = false;
+ var package = new FakePackage ("Test");
+
+ bool installed = project.IsPackageInstalled (package);
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIsInstalled_PackagePassedToProjectManager ()
+ {
+ CreateProject ();
+ fakeProjectManager.IsInstalledReturnValue = false;
+ var expectedPackage = new FakePackage ("Test");
+
+ project.IsPackageInstalled (expectedPackage);
+ IPackage actualPackage = fakeProjectManager.PackagePassedToIsInstalled;
+
+ Assert.AreEqual (expectedPackage, actualPackage);
+ }
+
+ [Test]
+ public void Constructor_RepositoryAndProjectPassed_RepositoryUsedToCreatePackageManager ()
+ {
+ CreateProject ();
+ IPackageRepository actualrepository = fakePackageManagerFactory.PackageRepositoryPassedToCreatePackageManager;
+
+ Assert.AreEqual (fakeSourceRepository, actualrepository);
+ }
+
+ [Test]
+ public void Constructor_RepositoryAndProjectPassed_ProjectUsedToCreatePackageManager ()
+ {
+ CreateProject ();
+ var actualProject = fakePackageManagerFactory.ProjectPassedToCreateRepository;
+
+ Assert.AreEqual (fakeProject, actualProject);
+ }
+
+ [Test]
+ public void GetPackages_ProjectManagerLocalRepositoryHasTwoPackages_ReturnsTwoPackages ()
+ {
+ CreateProject ();
+ FakePackageRepository repository = fakeProjectManager.FakeLocalRepository;
+ FakePackage packageA = repository.AddFakePackage ("A");
+ FakePackage packageB = repository.AddFakePackage ("B");
+
+ IQueryable<IPackage> actualPackages = project.GetPackages ();
+
+ var expectedPackages = new FakePackage[] {
+ packageA,
+ packageB
+ };
+
+ PackageCollectionAssert.AreEqual (expectedPackages, actualPackages);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_IgnoreDependenciesIsTrue_DependenciesIgnoredWhenRetrievingPackageOperations ()
+ {
+ CreateProject ();
+ var package = new FakePackage ();
+ CreateFakeInstallAction ()
+ .IgnoreDependencies = true;
+
+ project.GetInstallPackageOperations (package, fakeInstallAction);
+
+ Assert.IsTrue (fakePackageManager.IgnoreDependenciesPassedToGetInstallPackageOperations);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_IgnoreDependenciesIsFalse_DependenciesNotIgnoredWhenRetrievingPackageOperations ()
+ {
+ CreateProject ();
+ var package = new FakePackage ();
+ CreateFakeInstallAction ()
+ .IgnoreDependencies = false;
+
+ project.GetInstallPackageOperations (package, fakeInstallAction);
+
+ Assert.IsFalse (fakePackageManager.IgnoreDependenciesPassedToGetInstallPackageOperations);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_PackagePassed_PackageUsedToRetrievePackageOperations ()
+ {
+ CreateProject ();
+ var expectedPackage = new FakePackage ();
+ CreateFakeInstallAction ()
+ .IgnoreDependencies = true;
+
+ project.GetInstallPackageOperations (expectedPackage, fakeInstallAction);
+
+ IPackage actualPackage = fakePackageManager.PackagePassedToGetInstallPackageOperations;
+
+ Assert.AreEqual (expectedPackage, actualPackage);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_PackagePassed_ReturnsPackageOperations ()
+ {
+ CreateProject ();
+ var package = new FakePackage ();
+ CreateFakeInstallAction ()
+ .IgnoreDependencies = true;
+
+ IEnumerable<PackageOperation> operations = project.GetInstallPackageOperations (package, fakeInstallAction);
+
+ IEnumerable<PackageOperation> expectedOperations = fakePackageManager.PackageOperationsToReturnFromGetInstallPackageOperations;
+
+ Assert.AreEqual (expectedOperations, operations);
+ }
+
+ [Test]
+ public void Logger_SetLogger_LoggerOnPackageManagerIsSet ()
+ {
+ CreateProject ();
+ var expectedLogger = new FakeLogger ();
+
+ project.Logger = expectedLogger;
+
+ Assert.AreEqual (expectedLogger, fakePackageManager.Logger);
+ }
+
+ [Test]
+ public void Logger_GetLogger_LoggerOnPackageManagerIsReturned ()
+ {
+ CreateProject ();
+
+ ILogger logger = project.Logger;
+ ILogger expectedLogger = fakePackageManager.Logger;
+
+ Assert.AreEqual (expectedLogger, logger);
+ }
+
+ [Test]
+ public void InstallPackage_PackagePassed_PackageInstalled ()
+ {
+ CreateProject ();
+ var package = new FakePackage ();
+ CreateFakeInstallAction ()
+ .Package = package;
+
+ project.InstallPackage (package, fakeInstallAction);
+
+ IPackage expectedPackage = fakePackageManager.PackagePassedToInstallPackage;
+
+ Assert.AreEqual (expectedPackage, package);
+ }
+
+ [Test]
+ public void InstallPackage_IgnoreDependenciesIsTrue_DependenciesAreIgnoredWhenPackageIsInstalled ()
+ {
+ CreateProject ();
+ CreateFakeInstallAction ()
+ .IgnoreDependencies = true;
+ project.InstallPackage (null, fakeInstallAction);
+
+ Assert.IsTrue (fakePackageManager.IgnoreDependenciesPassedToInstallPackage);
+ }
+
+ [Test]
+ public void InstallPackage_IgnoreDependenciesIsFalse_DependenciesAreNotIgnoredWhenPackageIsInstalled ()
+ {
+ CreateProject ();
+ CreateFakeInstallAction ()
+ .IgnoreDependencies = false;
+ project.InstallPackage (null, fakeInstallAction);
+
+ Assert.IsFalse (fakePackageManager.IgnoreDependenciesPassedToInstallPackage);
+ }
+
+ [Test]
+ public void InstallPackage_PackageOperationsPassed_PackageOperationsUsedToInstallPackage ()
+ {
+ CreateProject ();
+ var expectedOperations = new List<PackageOperation> ();
+ CreateFakeInstallAction ()
+ .Operations = expectedOperations;
+ project.InstallPackage (null, fakeInstallAction);
+
+ IEnumerable<PackageOperation> actualOperations = fakePackageManager.PackageOperationsPassedToInstallPackage;
+
+ Assert.AreEqual (expectedOperations, actualOperations);
+ }
+
+ [Test]
+ public void SourceRepository_NewInstance_ReturnsRepositoryUsedToCreateInstance ()
+ {
+ CreateProject ();
+ IPackageRepository repository = project.SourceRepository;
+
+ Assert.AreEqual (fakeSourceRepository, repository);
+ }
+
+ [Test]
+ public void UninstallPackage_PackagePassed_PackageUninstalled ()
+ {
+ CreateProject ();
+ CreateFakeUninstallAction ();
+ fakeUninstallAction.ForceRemove = true;
+ fakeUninstallAction.RemoveDependencies = true;
+ var package = new FakePackage ();
+
+ project.UninstallPackage (package, fakeUninstallAction);
+
+ IPackage expectedPackage = fakePackageManager.PackagePassedToUninstallPackage;
+
+ Assert.AreEqual (expectedPackage, package);
+ }
+
+ [Test]
+ public void UninstallPackage_ForceRemoveIsTrue_PackageUninstallIsForced ()
+ {
+ CreateProject ();
+ CreateFakeUninstallAction ();
+ fakeUninstallAction.ForceRemove = true;
+ fakeUninstallAction.RemoveDependencies = false;
+
+ project.UninstallPackage (null, fakeUninstallAction);
+
+ Assert.IsTrue (fakePackageManager.ForceRemovePassedToUninstallPackage);
+ }
+
+ [Test]
+ public void UninstallPackage_ForceRemoveIsFalse_PackageUninstallIsNotForced ()
+ {
+ CreateProject ();
+ CreateFakeUninstallAction ();
+ fakeUninstallAction.ForceRemove = false;
+ fakeUninstallAction.RemoveDependencies = true;
+
+ project.UninstallPackage (null, fakeUninstallAction);
+
+ Assert.IsFalse (fakePackageManager.ForceRemovePassedToUninstallPackage);
+ }
+
+ [Test]
+ public void UninstallPackage_RemoveDependenciesIsTrue_PackageDependenciesIsRemoved ()
+ {
+ CreateProject ();
+ CreateFakeUninstallAction ();
+ fakeUninstallAction.ForceRemove = false;
+ fakeUninstallAction.RemoveDependencies = true;
+
+ project.UninstallPackage (null, fakeUninstallAction);
+
+ Assert.IsTrue (fakePackageManager.RemoveDependenciesPassedToUninstallPackage);
+ }
+
+ [Test]
+ public void UninstallPackage_RemoveDependenciesIsFalse_PackageDependenciesNotRemoved ()
+ {
+ CreateProject ();
+ CreateFakeUninstallAction ();
+ fakeUninstallAction.ForceRemove = true;
+ fakeUninstallAction.RemoveDependencies = false;
+
+ project.UninstallPackage (null, fakeUninstallAction);
+
+ Assert.IsFalse (fakePackageManager.RemoveDependenciesPassedToUninstallPackage);
+ }
+
+ [Test]
+ public void UpdatePackage_PackagePassed_PackageUpdated ()
+ {
+ CreateProject ();
+ var package = new FakePackage ();
+ CreateFakeUpdateAction ()
+ .UpdateDependencies = true;
+
+ project.UpdatePackage (package, fakeUpdateAction);
+
+ IPackage expectedPackage = fakePackageManager.PackagePassedToUpdatePackage;
+
+ Assert.AreEqual (expectedPackage, package);
+ }
+
+ [Test]
+ public void UpdatePackage_UpdateDependenciesIsTrue_DependenciesUpdatedWhenPackageIsUpdated ()
+ {
+ CreateProject ();
+ CreateFakeUpdateAction ()
+ .UpdateDependencies = true;
+
+ project.UpdatePackage (null, fakeUpdateAction);
+
+ Assert.IsTrue (fakePackageManager.UpdateDependenciesPassedToUpdatePackage);
+ }
+
+ [Test]
+ public void UpdatePackage_UpdateDependenciesIsFalse_DependenciesAreNotUpdatedWhenPackageIsUpdated ()
+ {
+ CreateProject ();
+ CreateFakeUpdateAction ()
+ .UpdateDependencies = false;
+
+ project.UpdatePackage (null, fakeUpdateAction);
+
+ Assert.IsFalse (fakePackageManager.UpdateDependenciesPassedToUpdatePackage);
+ }
+
+ [Test]
+ public void UpdatePackage_PackageOperationsPassed_PackageOperationsUsedToUpdatePackage ()
+ {
+ CreateProject ();
+ var expectedOperations = new List<PackageOperation> ();
+ CreateFakeUpdateAction ()
+ .Operations = expectedOperations;
+
+ project.UpdatePackage (null, fakeUpdateAction);
+
+ IEnumerable<PackageOperation> actualOperations = fakePackageManager.PackageOperationsPassedToUpdatePackage;
+
+ Assert.AreEqual (expectedOperations, actualOperations);
+ }
+
+ [Test]
+ public void Logger_SetLogger_ProjectManagerUsesLogger ()
+ {
+ CreateProject ();
+ ILogger expectedLogger = new NullLogger ();
+ project.Logger = expectedLogger;
+ ILogger actualLogger = fakePackageManager.ProjectManager.Logger;
+
+ Assert.AreEqual (expectedLogger, actualLogger);
+ }
+
+ [Test]
+ public void Logger_SetLogger_ProjectManagerProjectSystemUsesLogger ()
+ {
+ CreateProject ();
+ ILogger expectedLogger = new NullLogger ();
+ project.Logger = expectedLogger;
+ ILogger actualLogger = fakePackageManager.ProjectManager.Project.Logger;
+
+ Assert.AreEqual (expectedLogger, actualLogger);
+ }
+
+ [Test]
+ public void Logger_SetLogger_PackageManagerFileSystemUsesLogger ()
+ {
+ CreateProject ();
+ ILogger expectedLogger = new NullLogger ();
+ project.Logger = expectedLogger;
+ ILogger actualLogger = fakePackageManager.FileSystem.Logger;
+
+ Assert.AreEqual (expectedLogger, actualLogger);
+ }
+
+ [Test]
+ public void Logger_GetLogger_ReturnsLogger ()
+ {
+ CreateProject ();
+ ILogger expectedLogger = new NullLogger ();
+ project.Logger = expectedLogger;
+ ILogger actualLogger = project.Logger;
+
+ Assert.AreEqual (expectedLogger, actualLogger);
+ }
+
+ [Test]
+ public void PackageInstalled_PackagerManagerPackageInstalledEventFired_EventFiresWithPackage ()
+ {
+ CreateProject ();
+ PackageOperationEventArgs eventArgs = null;
+ project.PackageInstalled += (sender, e) => eventArgs = e;
+
+ var expectedEventArgs = new PackageOperationEventArgs (new FakePackage (), null, String.Empty);
+ fakePackageManager.FirePackageInstalled (expectedEventArgs);
+
+ Assert.AreEqual (expectedEventArgs, eventArgs);
+ }
+
+ [Test]
+ public void PackageUninstalled_PackagerManagerPackageUninstalledEventFired_EventFiresWithPackage ()
+ {
+ CreateProject ();
+ PackageOperationEventArgs eventArgs = null;
+ project.PackageUninstalled += (sender, e) => eventArgs = e;
+
+ var expectedEventArgs = new PackageOperationEventArgs (new FakePackage (), null, String.Empty);
+ fakePackageManager.FirePackageUninstalled (expectedEventArgs);
+
+ Assert.AreEqual (expectedEventArgs, eventArgs);
+ }
+
+ [Test]
+ public void PackageReferenceAdded_ProjectManagerPackageReferenceAddedEventFired_EventFiresWithPackage ()
+ {
+ CreateProject ();
+ PackageOperationEventArgs eventArgs = null;
+ project.PackageReferenceAdded += (sender, e) => eventArgs = e;
+
+ var expectedPackage = new FakePackage ();
+ fakeProjectManager.FirePackageReferenceAdded (expectedPackage);
+
+ Assert.AreEqual (expectedPackage, eventArgs.Package);
+ }
+
+ [Test]
+ public void PackageReferenceRemoved_ProjectManagerPackageReferenceRemovedEventFired_EventFiresWithPackage ()
+ {
+ CreateProject ();
+ PackageOperationEventArgs eventArgs = null;
+ project.PackageReferenceRemoved += (sender, e) => eventArgs = e;
+
+ var expectedPackage = new FakePackage ();
+ fakeProjectManager.FirePackageReferenceRemoved (expectedPackage);
+
+ Assert.AreEqual (expectedPackage, eventArgs.Package);
+ }
+
+ [Test]
+ public void Name_MSBuildProjectNameIsSet_ReturnsMSBuildProjectName ()
+ {
+ CreateProject ();
+ fakeProject.Name = "MyProject";
+
+ string name = project.Name;
+
+ Assert.AreEqual ("MyProject", name);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIdPassedAndPackageIsInstalled_ReturnsTrue ()
+ {
+ CreateProject ();
+ fakeProjectManager.IsInstalledReturnValue = true;
+
+ bool installed = project.IsPackageInstalled ("Test");
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIdPassedAndPackageIsNotInstalled_ReturnsFalse ()
+ {
+ CreateProject ();
+ fakeProjectManager.IsInstalledReturnValue = false;
+
+ bool installed = project.IsPackageInstalled ("Test");
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIdPassedPackageIsInstalled_PackageIdPassedToProjectManager ()
+ {
+ CreateProject ();
+ fakeProjectManager.IsInstalledReturnValue = false;
+
+ project.IsPackageInstalled ("Test");
+ string id = fakeProjectManager.PackageIdPassedToIsInstalled;
+
+ Assert.AreEqual ("Test", id);
+ }
+
+ [Test]
+ public void GetPackagesInReverseDependencyOrder_TwoPackages_ReturnsPackagesFromProjectLocalRepositoryInCorrectOrder ()
+ {
+ CreateProject ();
+ FakePackage packageA = fakeProjectManager.FakeLocalRepository.AddFakePackageWithVersion ("A", "1.0");
+ FakePackage packageB = fakeProjectManager.FakeLocalRepository.AddFakePackageWithVersion ("B", "1.0");
+
+ packageB.DependenciesList.Add (new PackageDependency ("A"));
+
+ var expectedPackages = new FakePackage[] {
+ packageB,
+ packageA
+ };
+
+ IEnumerable<IPackage> packages = project.GetPackagesInReverseDependencyOrder ();
+
+ PackageCollectionAssert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void InstallPackage_AllowPrereleaseVersionsIsTrue_PrereleaseVersionsAreNotAllowedWhenPackageIsInstalled ()
+ {
+ CreateProject ();
+ CreateFakeInstallAction ()
+ .AllowPrereleaseVersions = false;
+ project.InstallPackage (null, fakeInstallAction);
+
+ Assert.IsFalse (fakePackageManager.AllowPrereleaseVersionsPassedToInstallPackage);
+ }
+
+ [Test]
+ public void InstallPackage_AllowPrereleaseVersionsIsFalse_PrereleaseVersionsAreAllowedWhenPackageIsInstalled ()
+ {
+ CreateProject ();
+ CreateFakeInstallAction ()
+ .AllowPrereleaseVersions = true;
+ project.InstallPackage (null, fakeInstallAction);
+
+ Assert.IsTrue (fakePackageManager.AllowPrereleaseVersionsPassedToInstallPackage);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_AllowPrereleaseVersionsIsTrue_PrereleaseVersionsAllowedWhenRetrievingPackageOperations ()
+ {
+ CreateProject ();
+ var package = new FakePackage ();
+ CreateFakeInstallAction ()
+ .AllowPrereleaseVersions = true;
+
+ project.GetInstallPackageOperations (package, fakeInstallAction);
+
+ Assert.IsTrue (fakePackageManager.AllowPrereleaseVersionsPassedToGetInstallPackageOperations);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_AllowPrereleaseVersionsIsFalse_PrereleaseVersionsNotAllowedWhenRetrievingPackageOperations ()
+ {
+ CreateProject ();
+ var package = new FakePackage ();
+ CreateFakeInstallAction ()
+ .AllowPrereleaseVersions = false;
+
+ project.GetInstallPackageOperations (package, fakeInstallAction);
+
+ Assert.IsFalse (fakePackageManager.AllowPrereleaseVersionsPassedToGetInstallPackageOperations);
+ }
+
+ [Test]
+ public void UpdatePackage_AllowPrereleaseVersionsIsTrue_PrereleaseVersionsNotAllowedWhenPackageIsUpdated ()
+ {
+ CreateProject ();
+ CreateFakeUpdateAction ()
+ .AllowPrereleaseVersions = true;
+
+ project.UpdatePackage (null, fakeUpdateAction);
+
+ Assert.IsTrue (fakePackageManager.AllowPrereleaseVersionsPassedToInstallPackage);
+ }
+
+ [Test]
+ public void UpdatePackage_AllowPrereleaseVersionsIsFalse_PrereleaseVersionsNotAllowedWhenPackageIsUpdated ()
+ {
+ CreateProject ();
+ CreateFakeUpdateAction ()
+ .AllowPrereleaseVersions = false;
+
+ project.UpdatePackage (null, fakeUpdateAction);
+
+ Assert.IsFalse (fakePackageManager.AllowPrereleaseVersionsPassedToInstallPackage);
+ }
+
+ [Test]
+ public void UpdatePackages_ActionHasOperationsAndPackages_ActionPassedToPackageManager ()
+ {
+ CreateProject ();
+ CreateUpdatePackagesAction ();
+
+ project.UpdatePackages (updatePackagesAction);
+
+ Assert.AreEqual (updatePackagesAction, fakePackageManager.UpdatePackagesActionsPassedToUpdatePackages);
+ }
+
+ [Test]
+ public void GetUpdatePackagesOperations_ActionPassed_ActionPassedToPackageManager ()
+ {
+ CreateProject ();
+ CreateUpdatePackagesAction ();
+ var expectedPackages = new FakePackage[] { new FakePackage ("Test") };
+ updatePackagesAction.AddPackages (expectedPackages);
+
+ project.GetUpdatePackagesOperations (updatePackagesAction.Packages, updatePackagesAction);
+
+ Assert.AreEqual (updatePackagesAction, fakePackageManager.SettingsPassedToGetUpdatePackageOperations);
+ Assert.AreEqual (expectedPackages, fakePackageManager.PackagesPassedToGetUpdatePackageOperations);
+ }
+
+ [Test]
+ public void GetUpdatePackagesOperations_ActionPassed_PackageOperationsReturned ()
+ {
+ CreateProject ();
+ CreateUpdatePackagesAction ();
+ List<PackageOperation> expectedOperations = PackageOperationHelper.CreateListWithOneInstallOperationWithFile ("readme.txt");
+ fakePackageManager.PackageOperationsToReturnFromGetUpdatePackageOperations = expectedOperations;
+
+ IEnumerable<PackageOperation> operations = project.GetUpdatePackagesOperations (updatePackagesAction.Packages, updatePackagesAction);
+
+ CollectionAssert.AreEqual (expectedOperations, operations);
+ }
+
+ [Test]
+ public void RunPackageOperations_OneOperation_PackageOperationsRunByPackageManager ()
+ {
+ CreateProject ();
+ CreateUpdatePackagesAction ();
+ List<PackageOperation> expectedOperations = PackageOperationHelper.CreateListWithOneInstallOperationWithFile ("readme.txt");
+
+ project.RunPackageOperations (expectedOperations);
+
+ CollectionAssert.AreEqual (expectedOperations, fakePackageManager.PackageOperationsPassedToRunPackageOperations);
+ }
+
+ [Test]
+ public void HasOlderPackageInstalled_TestPackage_PackagePassedToProjectManager ()
+ {
+ CreateProject ();
+ CreateUpdatePackagesAction ();
+ var expectedPackage = new FakePackage ("Test");
+
+ project.HasOlderPackageInstalled (expectedPackage);
+
+ Assert.AreEqual (expectedPackage, fakeProjectManager.PackagePassedToHasOlderPackageInstalled);
+ }
+
+ [Test]
+ public void HasOlderPackageInstalled_PackageIsInstalled_ReturnsTrue ()
+ {
+ CreateProject ();
+ fakeProjectManager.HasOlderPackageInstalledReturnValue = true;
+ var package = new FakePackage ("Test");
+
+ bool installed = project.HasOlderPackageInstalled (package);
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void HasOlderPackageInstalled_PackageIsNotInstalled_ReturnsFalse ()
+ {
+ CreateProject ();
+ fakeProjectManager.HasOlderPackageInstalledReturnValue = false;
+ var package = new FakePackage ("Test");
+
+ bool installed = project.HasOlderPackageInstalled (package);
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void UpdatePackageReference_PackageAndUpdateActionPassed_BothPassedToPackageManager ()
+ {
+ CreateProject ();
+ CreateUpdatePackagesAction ();
+ var package = new FakePackage ("Test");
+
+ project.UpdatePackageReference (package, updatePackagesAction);
+
+ Assert.AreEqual (package, fakePackageManager.PackagePassedToUpdatePackageReference);
+ Assert.AreEqual (updatePackagesAction, fakePackageManager.SettingsPassedToUpdatePackageReference);
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSelectedProjectTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSelectedProjectTests.cs
new file mode 100644
index 0000000000..ab4f35a0aa
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSelectedProjectTests.cs
@@ -0,0 +1,85 @@
+//
+// PackageManagementSelectedProjectTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class PackageManagementSelectedProjectTests
+ {
+ PackageManagementSelectedProject selectedProject;
+ FakePackageManagementProject fakeProject;
+
+ void CreateFakePackageManagementProject ()
+ {
+ fakeProject = new FakePackageManagementProject ();
+ }
+
+ void CreateSelectedProject (FakePackageManagementProject fakeProject)
+ {
+ selectedProject = new PackageManagementSelectedProject (fakeProject);
+ }
+
+ [Test]
+ public void Name_PackageManagementProjectNameIsTest_ReturnsTest ()
+ {
+ CreateFakePackageManagementProject ();
+ CreateSelectedProject (fakeProject);
+ fakeProject.Name = "Test";
+
+ string name = selectedProject.Name;
+
+ Assert.AreEqual ("Test", name);
+ }
+
+ [Test]
+ public void IsSelected_SelectedNotSpecifiedInConstructor_ReturnsFalse ()
+ {
+ CreateFakePackageManagementProject ();
+ CreateSelectedProject (fakeProject);
+
+ bool selected = selectedProject.IsSelected;
+
+ Assert.IsFalse (selected);
+ }
+
+ [Test]
+ public void IsEnabled_EnabledNotSpecifiedInConstructor_ReturnsTrue ()
+ {
+ CreateFakePackageManagementProject ();
+ CreateSelectedProject (fakeProject);
+
+ bool enabled = selectedProject.IsEnabled;
+
+ Assert.IsTrue (enabled);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSelectedProjectsTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSelectedProjectsTests.cs
new file mode 100644
index 0000000000..97c363af45
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSelectedProjectsTests.cs
@@ -0,0 +1,536 @@
+//
+// PackageManagementSelectedProjectsTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using ICSharpCode.PackageManagement;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class PackageManagementSelectedProjectsTests
+ {
+ PackageManagementSelectedProjects selectedProjects;
+ FakePackageManagementSolution fakeSolution;
+
+ void CreateSelectedProjects ()
+ {
+ selectedProjects = new PackageManagementSelectedProjects (fakeSolution);
+ }
+
+ void CreateFakeSolution ()
+ {
+ fakeSolution = new FakePackageManagementSolution ();
+ }
+
+ List<FakeDotNetProject> AddSolutionWithOneProjectToProjectService ()
+ {
+ FakeDotNetProject project = ProjectHelper.CreateTestProject ("Test1");
+ fakeSolution.FakeDotNetProjects.Add (project);
+
+ return fakeSolution.FakeDotNetProjects;
+ }
+
+ List<FakeDotNetProject> AddSolutionWithTwoProjectsToProjectService ()
+ {
+ ISolution solution = ProjectHelper.CreateSolution ();
+ FakeDotNetProject project1 = ProjectHelper.CreateTestProject (solution, "Test1");
+ FakeDotNetProject project2 = ProjectHelper.CreateTestProject ("Test2");
+
+ fakeSolution.FakeDotNetProjects.Add (project1);
+ fakeSolution.FakeDotNetProjects.Add (project2);
+
+ return fakeSolution.FakeDotNetProjects;
+ }
+
+ void NoProjectsSelected ()
+ {
+ fakeSolution.NoProjectsSelected ();
+ }
+
+ [Test]
+ public void GetProjects_SolutionHasTwoProjectsAndOneProjectSelectedInProjectsBrowser_ReturnsProjectSelectedInProjects ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ FakeDotNetProject project = projectsAddedToSolution [1];
+ project.Name = "MyProject";
+ fakeSolution.FakeActiveDotNetProject = project;
+
+ fakeSolution.AddFakeProjectToReturnFromGetProject ("MyProject");
+ CreateSelectedProjects ();
+
+ var fakePackage = new FakePackage ();
+ var projects = new List<IPackageManagementSelectedProject> ();
+ projects.AddRange (selectedProjects.GetProjects (fakePackage));
+
+ var expectedProject = new PackageManagementSelectedProject ("MyProject", selected: false, enabled: true);
+ var expectedProjects = new List<IPackageManagementSelectedProject> ();
+ expectedProjects.Add (expectedProject);
+
+ SelectedProjectCollectionAssert.AreEqual (expectedProjects, projects);
+ }
+
+ [Test]
+ public void GetProjects_SolutionHasTwoProjectsAndOneProjectSelectedInitiallyAndGetProjectsCalledAgainAfterNoProjectsAreSelected_ReturnsProjectSelectedInProjects ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ FakeDotNetProject project = projectsAddedToSolution [1];
+ project.Name = "MyProject";
+ fakeSolution.FakeActiveDotNetProject = project;
+
+ fakeSolution.AddFakeProjectToReturnFromGetProject ("MyProject");
+ CreateSelectedProjects ();
+
+ var fakePackage = new FakePackage ();
+ var projects = new List<IPackageManagementSelectedProject> ();
+ projects.AddRange (selectedProjects.GetProjects (fakePackage));
+
+ projects.Clear ();
+
+ NoProjectsSelected ();
+ projects.AddRange (selectedProjects.GetProjects (fakePackage));
+
+ var expectedProject = new PackageManagementSelectedProject ("MyProject", selected: false, enabled: true);
+ var expectedProjects = new List<IPackageManagementSelectedProject> ();
+ expectedProjects.Add (expectedProject);
+
+ SelectedProjectCollectionAssert.AreEqual (expectedProjects, projects);
+ }
+
+ [Test]
+ public void HasMultipleProjects_SolutionHasTwoProjectsAndOneProjectSelectedInProjectsBrowser_ReturnsFalse ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ FakeDotNetProject expectedProject = projectsAddedToSolution [1];
+ fakeSolution.FakeActiveDotNetProject = expectedProject;
+ CreateSelectedProjects ();
+
+ bool hasMultipleProjects = selectedProjects.HasMultipleProjects ();
+
+ Assert.IsFalse (hasMultipleProjects);
+ }
+
+ [Test]
+ public void GetProjects_SolutionHasTwoProjectsAndNoProjectSelectedInProjectsBrowser_ReturnsAllProjectsInSolutionForPackage ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ projectsAddedToSolution [0].Name = "Project A";
+ projectsAddedToSolution [1].Name = "Project B";
+ fakeSolution.FakeActiveProject = null;
+
+ fakeSolution.AddFakeProjectToReturnFromGetProject ("Project A");
+ fakeSolution.AddFakeProjectToReturnFromGetProject ("Project B");
+ CreateSelectedProjects ();
+
+ var fakePackage = new FakePackage ();
+ var projects = new List<IPackageManagementSelectedProject> ();
+ projects.AddRange (selectedProjects.GetProjects (fakePackage));
+
+ var expectedProjects = new List<IPackageManagementSelectedProject> ();
+ expectedProjects.Add (new PackageManagementSelectedProject ("Project A", selected: false, enabled: true));
+ expectedProjects.Add (new PackageManagementSelectedProject ("Project B", selected: false, enabled: true));
+
+ SelectedProjectCollectionAssert.AreEqual (expectedProjects, projects);
+ }
+
+ [Test]
+ public void HasMultipleProjects_SolutionHasTwoProjectsAndNoProjectSelectedInProjectsBrowser_ReturnsTrue ()
+ {
+ CreateFakeSolution ();
+ AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveProject = null;
+ CreateSelectedProjects ();
+
+ bool hasMultipleProjects = selectedProjects.HasMultipleProjects ();
+
+ Assert.IsTrue (hasMultipleProjects);
+ }
+
+ [Test]
+ public void HasMultipleProjects_SolutionHasOneProjectAndNoProjectSelectedInProjectsBrowser_ReturnsFalse ()
+ {
+ CreateFakeSolution ();
+ AddSolutionWithOneProjectToProjectService ();
+ fakeSolution.FakeActiveProject = null;
+ CreateSelectedProjects ();
+
+ bool hasMultipleProjects = selectedProjects.HasMultipleProjects ();
+
+ Assert.IsFalse (hasMultipleProjects);
+ }
+
+ [Test]
+ public void SelectionName_SolutionHasOneProject_ReturnsProjectNameWithoutFileExtension ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithOneProjectToProjectService ();
+ projectsAddedToSolution [0].Name = "MyProject";
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+ CreateSelectedProjects ();
+
+ string name = selectedProjects.SelectionName;
+
+ Assert.AreEqual ("MyProject", name);
+ }
+
+ [Test]
+ public void SelectionName_SolutionHasTwoProjectsAndNoProjectSelected_ReturnsSolutionFileNameWithoutFullPath ()
+ {
+ CreateFakeSolution ();
+ AddSolutionWithTwoProjectsToProjectService ();
+ NoProjectsSelected ();
+ fakeSolution.FileName = @"d:\projects\MyProject\MySolution.sln".ToNativePath ();
+ CreateSelectedProjects ();
+
+ string name = selectedProjects.SelectionName;
+
+ Assert.AreEqual ("MySolution.sln", name);
+ }
+
+ [Test]
+ public void IsPackageInstalled_PackageInstalledInSolutionWithTwoProjectsAndNoProjectSelected_ReturnsTrue ()
+ {
+ CreateFakeSolution ();
+ AddSolutionWithTwoProjectsToProjectService ();
+ NoProjectsSelected ();
+
+ var package = new FakePackage ("Test");
+ fakeSolution.FakeInstalledPackages.Add (package);
+ CreateSelectedProjects ();
+
+ bool installed = selectedProjects.IsPackageInstalled (package);
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void IsPackageInstalled_PackageIsInstalledInSolutionWithTwoProjectsAndNoProjectSelected_ReturnsFalse ()
+ {
+ CreateFakeSolution ();
+ AddSolutionWithTwoProjectsToProjectService ();
+ NoProjectsSelected ();
+ CreateSelectedProjects ();
+
+ var package = new FakePackage ("Test");
+ bool installed = selectedProjects.IsPackageInstalled (package);
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void IsPackageInstalled_PackageIsInstalledInProjectAndProjectSelected_ReturnsTrue ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+
+ var package = new FakePackage ("Test");
+ fakeSolution.FakeProjectToReturnFromGetProject.FakePackages.Add (package);
+ CreateSelectedProjects ();
+
+ bool installed = selectedProjects.IsPackageInstalled (package);
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void IsPackageInstalled_PackageIsNotInstalledInProjectAndProjectSelected_ReturnsFalse ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+ CreateSelectedProjects ();
+
+ var package = new FakePackage ("Test");
+ bool installed = selectedProjects.IsPackageInstalled (package);
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void IsPackageInstalled_PackagePackageIsNotInstalledInProjectAndProjectSelected_ProjectCreatedUsingPackageRepository ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+ CreateSelectedProjects ();
+
+ var package = new FakePackage ("Test");
+ selectedProjects.IsPackageInstalled (package);
+
+ IPackageRepository repository = fakeSolution.RepositoryPassedToGetProject;
+ IPackageRepository expectedRepository = package.FakePackageRepository;
+
+ Assert.AreEqual (expectedRepository, repository);
+ }
+
+ [Test]
+ public void IsPackageInstalledInSolution_PackageInstalledInSolutionWithTwoProjectsAndOneProjectSelected_ReturnsTrue ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+
+ var package = new FakePackage ("Test");
+ fakeSolution.FakeInstalledPackages.Add (package);
+ CreateSelectedProjects ();
+
+ bool installed = selectedProjects.Solution.IsPackageInstalled (package);
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void IsPackageInstalledInSolution_PackageNotInstalledInSolutionWithTwoProjectsAndOneProjectSelected_ReturnsFalse ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+ CreateSelectedProjects ();
+
+ var package = new FakePackage ("Test");
+
+ bool installed = selectedProjects.Solution.IsPackageInstalled (package);
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void GetPackagesInstalledInSolution_PackageInstalledInSolutionAndProjectNotSelected_ReturnsPackageInstalledInSolution ()
+ {
+ CreateFakeSolution ();
+ AddSolutionWithTwoProjectsToProjectService ();
+ NoProjectsSelected ();
+
+ var package = new FakePackage ("Test");
+ fakeSolution.FakeInstalledPackages.Add (package);
+ CreateSelectedProjects ();
+
+ IQueryable<IPackage> packages = selectedProjects.Solution.GetPackages ();
+
+ var expectedPackages = new FakePackage[] {
+ package
+ };
+
+ PackageCollectionAssert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void GetSingleProjectSelected_ProjectSelected_ReturnsProject ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+ CreateSelectedProjects ();
+
+ var repository = new FakePackageRepository ();
+ IPackageManagementProject project = selectedProjects.GetSingleProjectSelected (repository);
+
+ FakePackageManagementProject expectedProject = fakeSolution.FakeProjectToReturnFromGetProject;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetSingleProjectSelected_ProjectSelectedAndRepositoryPassed_ReturnsProjectCreatedWithRepository ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+ CreateSelectedProjects ();
+
+ var repository = new FakePackageRepository ();
+ selectedProjects.GetSingleProjectSelected (repository);
+
+ Assert.AreEqual (repository, fakeSolution.RepositoryPassedToGetProject);
+ }
+
+ [Test]
+ public void GetSingleProjectSelected_NoProjectSelectedAndRepositoryPassed_ReturnsProjectCreatedWithRepository ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+ CreateSelectedProjects ();
+
+ var repository = new FakePackageRepository ();
+ selectedProjects.GetSingleProjectSelected (repository);
+
+ Assert.AreEqual (repository, fakeSolution.RepositoryPassedToGetProject);
+ }
+
+ [Test]
+ public void HasSingleProjectSelected_SolutionHasTwoProjectsAndOneProjectSelectedInProjectsBrowser_ReturnsTrue ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ FakeDotNetProject expectedProject = projectsAddedToSolution [1];
+ fakeSolution.FakeActiveDotNetProject = expectedProject;
+ CreateSelectedProjects ();
+
+ bool singleProjectSelected = selectedProjects.HasSingleProjectSelected ();
+
+ Assert.IsTrue (singleProjectSelected);
+ }
+
+ [Test]
+ public void HasSingleProjectSelected_SolutionHasTwoProjectsAndNoProjectsSelectedInProjectsBrowser_ReturnsFalse ()
+ {
+ CreateFakeSolution ();
+ AddSolutionWithTwoProjectsToProjectService ();
+ NoProjectsSelected ();
+ CreateSelectedProjects ();
+
+ bool singleProjectSelected = selectedProjects.HasSingleProjectSelected ();
+
+ Assert.IsFalse (singleProjectSelected);
+ }
+
+ [Test]
+ public void HasSingleProjectSelected_NoProjectsInitiallySelectedAndProjectSelectedAfterInitialCall_IsUnchangedAndReturnsFalse ()
+ {
+ CreateFakeSolution ();
+ AddSolutionWithTwoProjectsToProjectService ();
+ NoProjectsSelected ();
+ CreateSelectedProjects ();
+
+ bool singleProjectSelected = selectedProjects.HasSingleProjectSelected ();
+ fakeSolution.FakeActiveDotNetProject = fakeSolution.FakeDotNetProjects [0];
+ singleProjectSelected = selectedProjects.HasSingleProjectSelected ();
+
+ Assert.IsFalse (singleProjectSelected);
+ }
+
+ [Test]
+ public void GetInstalledPackages_PackageInstalledInSolutionAndProjectNotSelected_ReturnsPackageInstalledInSolution ()
+ {
+ CreateFakeSolution ();
+ AddSolutionWithTwoProjectsToProjectService ();
+ NoProjectsSelected ();
+
+ var package = new FakePackage ("Test");
+ fakeSolution.FakeInstalledPackages.Add (package);
+ CreateSelectedProjects ();
+
+ var repository = new FakePackageRepository ();
+ IQueryable<IPackage> packages = selectedProjects.GetInstalledPackages (repository);
+
+ var expectedPackages = new FakePackage[] {
+ package
+ };
+
+ PackageCollectionAssert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void GetInstalledPackages_PackageInstalledInProjectAndProjectIsSelected_ReturnsPackageInstalledInProject ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+ fakeSolution.FakeActiveDotNetProject.Name = "MyProject";
+
+ var package = new FakePackage ("Test");
+ var project = new FakePackageManagementProject ("MyProject");
+ project.FakePackages.Add (package);
+ fakeSolution.FakeProjectsToReturnFromGetProject.Add ("MyProject", project);
+ CreateSelectedProjects ();
+
+ var repository = new FakePackageRepository ();
+ IQueryable<IPackage> packages = selectedProjects.GetInstalledPackages (repository);
+
+ var expectedPackages = new FakePackage[] {
+ package
+ };
+
+ PackageCollectionAssert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void GetInstalledPackages_PackageInstalledInProjectAndProjectIsSelected_CreatesProjectUsingRepository ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+ CreateSelectedProjects ();
+
+ var expectedRepository = new FakePackageRepository ();
+ selectedProjects.GetInstalledPackages (expectedRepository);
+
+ IPackageRepository repository = fakeSolution.RepositoryPassedToGetProject;
+
+ Assert.AreEqual (expectedRepository, repository);
+ }
+
+ [Test]
+ public void GetSingleProjectSelected_NoProjectSelected_ReturnsNull ()
+ {
+ CreateFakeSolution ();
+ AddSolutionWithTwoProjectsToProjectService ();
+ NoProjectsSelected ();
+ CreateSelectedProjects ();
+
+ var repository = new FakePackageRepository ();
+ IPackageManagementProject project = selectedProjects.GetSingleProjectSelected (repository);
+
+ Assert.IsNull (project);
+ }
+
+ [Test]
+ public void GetProjects_SolutionHasTwoProjectsAndOneProjectSelectedInitiallyAndActiveProjectChangedInSolutionAfterInstanceCreated_ReturnsProjectSelectedInProjects ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ FakeDotNetProject project = projectsAddedToSolution [1];
+ project.Name = "MyProject";
+ fakeSolution.FakeActiveDotNetProject = project;
+ fakeSolution.AddFakeProjectToReturnFromGetProject ("MyProject");
+ CreateSelectedProjects ();
+
+ NoProjectsSelected ();
+
+ var fakePackage = new FakePackage ();
+ List<IPackageManagementSelectedProject> projects = selectedProjects.GetProjects (fakePackage).ToList ();
+
+ var expectedProject = new PackageManagementSelectedProject ("MyProject", selected: false, enabled: true);
+ var expectedProjects = new List<IPackageManagementSelectedProject> ();
+ expectedProjects.Add (expectedProject);
+
+ SelectedProjectCollectionAssert.AreEqual (expectedProjects, projects);
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSolutionTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSolutionTests.cs
new file mode 100644
index 0000000000..b9b4485edd
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSolutionTests.cs
@@ -0,0 +1,665 @@
+//
+// PackageManagementSolutionTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class PackageManagementSolutionTests
+ {
+ PackageManagementSolution solution;
+ FakeRegisteredPackageRepositories fakeRegisteredPackageRepositories;
+ OneRegisteredPackageSourceHelper packageSourcesHelper;
+ FakePackageManagementProjectService fakeProjectService;
+ FakePackageManagementProjectFactory fakeProjectFactory;
+ FakeDotNetProject testProject;
+ FakeSolutionPackageRepositoryFactory fakeSolutionPackageRepositoryFactory;
+ FakeSolutionPackageRepository fakeSolutionPackageRepository;
+
+ void CreatePackageSources ()
+ {
+ packageSourcesHelper = new OneRegisteredPackageSourceHelper ();
+ }
+
+ void CreateSolution ()
+ {
+ CreatePackageSources ();
+ CreateSolution (packageSourcesHelper.Options);
+ }
+
+ void CreateSolution (PackageManagementOptions options)
+ {
+ testProject = ProjectHelper.CreateTestProject ();
+ fakeRegisteredPackageRepositories = new FakeRegisteredPackageRepositories ();
+ fakeProjectFactory = new FakePackageManagementProjectFactory ();
+ fakeProjectService = new FakePackageManagementProjectService ();
+
+ fakeProjectService.CurrentProject = testProject;
+ fakeProjectService.OpenSolution = testProject.ParentSolution;
+
+ fakeSolutionPackageRepositoryFactory = new FakeSolutionPackageRepositoryFactory ();
+ fakeSolutionPackageRepository = fakeSolutionPackageRepositoryFactory.FakeSolutionPackageRepository;
+
+ solution =
+ new PackageManagementSolution (
+ fakeRegisteredPackageRepositories,
+ fakeProjectService,
+ fakeProjectFactory,
+ fakeSolutionPackageRepositoryFactory);
+ }
+
+ FakeDotNetProject AddProjectToOpenProjects (string projectName)
+ {
+ FakeDotNetProject project = ProjectHelper.CreateTestProject (projectName);
+ fakeProjectService.OpenProjects.Add (project);
+ return project;
+ }
+
+ FakePackage AddPackageInReverseDependencyOrderToSolution (string packageId)
+ {
+ var package = new FakePackage (packageId);
+ fakeSolutionPackageRepository.FakePackagesByReverseDependencyOrder.Add (package);
+ return package;
+ }
+
+ [Test]
+ public void GetActiveProject_ProjectIsSelected_CreatesProjectUsingCurrentProjectSelectedInSharpDevelop ()
+ {
+ CreateSolution ();
+
+ solution.GetActiveProject ();
+
+ IProject actualProject = fakeProjectFactory.FirstProjectPassedToCreateProject;
+ Assert.AreEqual (testProject, actualProject);
+ }
+
+ [Test]
+ public void GetActiveProject_ProjectIsSelected_CreatesProjectUsingAggregateRepository ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = new FakeDotNetProject ();
+
+ solution.GetActiveProject ();
+
+ IPackageRepository repository = fakeProjectFactory.FirstRepositoryPassedToCreateProject;
+ IPackageRepository expectedRepository = fakeRegisteredPackageRepositories.FakeAggregateRepository;
+
+ Assert.AreEqual (expectedRepository, repository);
+ }
+
+ [Test]
+ public void GetActiveProject_ProjectIsSelected_ReturnsProjectCreatedByFactory ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = new FakeDotNetProject ();
+
+ IPackageManagementProject activeProject = solution.GetActiveProject ();
+ IPackageManagementProject expectedProject = fakeProjectFactory.FirstFakeProjectCreated;
+
+ Assert.AreEqual (expectedProject, activeProject);
+ }
+
+ [Test]
+ public void GetActiveProject_RepositoryPassed_CreatesProjectUsingRepository ()
+ {
+ CreateSolution ();
+ var expectedRepository = new FakePackageRepository ();
+ solution.GetActiveProject (expectedRepository);
+
+ IPackageRepository repository = fakeProjectFactory.FirstRepositoryPassedToCreateProject;
+
+ Assert.AreEqual (expectedRepository, repository);
+ }
+
+ [Test]
+ public void GetActiveProject_RepositoryPassed_CreatesProjectUsingCurrentActiveProject ()
+ {
+ CreateSolution ();
+ var expectedRepository = new FakePackageRepository ();
+ FakeDotNetProject expectedProject = ProjectHelper.CreateTestProject ();
+ fakeProjectService.CurrentProject = expectedProject;
+
+ solution.GetActiveProject (expectedRepository);
+
+ IDotNetProject project = fakeProjectFactory.FirstProjectPassedToCreateProject;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetActiveProject_RepositoryPassed_ReturnsProjectFromProjectFactory ()
+ {
+ CreateSolution ();
+ var expectedRepository = new FakePackageRepository ();
+ IPackageManagementProject project = solution.GetActiveProject (expectedRepository);
+
+ FakePackageManagementProject expectedProject = fakeProjectFactory.FirstFakeProjectCreated;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProject_PackagesSourceAndProjectNamePassed_CreatesProjectUsingFoundProjectMatchingName ()
+ {
+ CreateSolution ();
+ FakeDotNetProject expectedProject = AddProjectToOpenProjects ("Test");
+ var source = new PackageSource ("http://sharpdevelop.net");
+
+ solution.GetProject (source, "Test");
+
+ IDotNetProject project = fakeProjectFactory.FirstProjectPassedToCreateProject;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProject_PackagesSourceAndProjectNameWithDifferentCasePassed_CreatesProjectUsingFoundProjectMatchingName ()
+ {
+ CreateSolution ();
+ FakeDotNetProject expectedProject = AddProjectToOpenProjects ("Test");
+ var source = new PackageSource ("http://sharpdevelop.net");
+
+ solution.GetProject (source, "TEST");
+
+ IDotNetProject project = fakeProjectFactory.FirstProjectPassedToCreateProject;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProject_PackagesSourceAndProjectPassed_ReturnsProjectFromProjectFactory ()
+ {
+ CreateSolution ();
+ AddProjectToOpenProjects ("Test");
+ var source = new PackageSource ("http://sharpdevelop.net");
+ IPackageManagementProject project = solution.GetProject (source, "Test");
+
+ FakePackageManagementProject expectedProject = fakeProjectFactory.FirstFakeProjectCreated;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProject_PackagesSourceAndProjectPassed_PackageSourceUsedToCreateRepository ()
+ {
+ CreateSolution ();
+ AddProjectToOpenProjects ("Test");
+ var expectedSource = new PackageSource ("http://sharpdevelop.net");
+ solution.GetProject (expectedSource, "Test");
+
+ PackageSource actualSource = fakeRegisteredPackageRepositories.PackageSourcePassedToCreateRepository;
+
+ Assert.AreEqual (expectedSource, actualSource);
+ }
+
+ [Test]
+ public void GetProject_PackagesRepositoryAndProjectNamePassed_CreatesProjectUsingFoundProjectMatchingName ()
+ {
+ CreateSolution ();
+ FakeDotNetProject expectedProject = AddProjectToOpenProjects ("Test");
+ var repository = new FakePackageRepository ();
+
+ solution.GetProject (repository, "Test");
+
+ IDotNetProject project = fakeProjectFactory.FirstProjectPassedToCreateProject;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProject_PackagesRepositoryAndProjectPassed_CreatesProjectUsingProjectPassed ()
+ {
+ CreateSolution ();
+ FakeDotNetProject expectedProject = AddProjectToOpenProjects ("Test");
+ var repository = new FakePackageRepository ();
+
+ solution.GetProject (repository, expectedProject);
+
+ IDotNetProject project = fakeProjectFactory.FirstProjectPassedToCreateProject;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProject_PackagesRepositoryAndProjectPassed_ReturnsProjectCreatedFromProjectFactory ()
+ {
+ CreateSolution ();
+ FakeDotNetProject msbuildProject = AddProjectToOpenProjects ("Test");
+ var repository = new FakePackageRepository ();
+
+ IPackageManagementProject project = solution.GetProject (repository, msbuildProject);
+
+ FakePackageManagementProject expectedProject = fakeProjectFactory.FirstFakeProjectCreated;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProject_PackagesRepositoryAndProjectPassed_CreatesProjectUsingRepository ()
+ {
+ CreateSolution ();
+ FakeDotNetProject expectedProject = AddProjectToOpenProjects ("Test");
+ var expectedRepository = new FakePackageRepository ();
+
+ solution.GetProject (expectedRepository, expectedProject);
+
+ IPackageRepository repository = fakeProjectFactory.FirstRepositoryPassedToCreateProject;
+
+ Assert.AreEqual (expectedRepository, repository);
+ }
+
+ [Test]
+ public void GetProject_RepositoryAndProjectNameWithDifferentCasePassed_CreatesProjectUsingFoundProjectMatchingName ()
+ {
+ CreateSolution ();
+ FakeDotNetProject expectedProject = AddProjectToOpenProjects ("Test");
+ var repository = new FakePackageRepository ();
+
+ solution.GetProject (repository, "TEST");
+
+ IDotNetProject project = fakeProjectFactory.FirstProjectPassedToCreateProject;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProject_RepositoryAndProjectNamePassed_ReturnsProject ()
+ {
+ CreateSolution ();
+ AddProjectToOpenProjects ("Test");
+ var repository = new FakePackageRepository ();
+
+ IPackageManagementProject project = solution.GetProject (repository, "Test");
+
+ FakePackageManagementProject expectedProject = fakeProjectFactory.FirstFakeProjectCreated;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProject_RepositoryAndProjectNamePassed_RepositoryUsedToCreateProject ()
+ {
+ CreateSolution ();
+ AddProjectToOpenProjects ("Test");
+ var expectedRepository = new FakePackageRepository ();
+
+ solution.GetProject (expectedRepository, "Test");
+
+ IPackageRepository actualRepository = fakeProjectFactory.FirstRepositoryPassedToCreateProject;
+
+ Assert.AreEqual (expectedRepository, actualRepository);
+ }
+
+ [Test]
+ public void GetMSBuildProjects_TwoProjectsInOpenSolution_ReturnsTwoProjects ()
+ {
+ CreateSolution ();
+ AddProjectToOpenProjects ("A");
+ AddProjectToOpenProjects ("B");
+
+ IEnumerable<IDotNetProject> projects = solution.GetDotNetProjects ();
+ IEnumerable<IDotNetProject> expectedProjects = fakeProjectService.OpenProjects;
+
+ CollectionAssert.AreEqual (expectedProjects, projects);
+ }
+
+ [Test]
+ public void IsOpen_NoSolutionOpen_ReturnsFalse ()
+ {
+ CreateSolution ();
+ fakeProjectService.OpenSolution = null;
+
+ bool open = solution.IsOpen;
+
+ Assert.IsFalse (open);
+ }
+
+ [Test]
+ public void IsOpen_SolutionIsOpen_ReturnsTrue ()
+ {
+ CreateSolution ();
+ fakeProjectService.OpenSolution = new FakeSolution ();
+
+ bool open = solution.IsOpen;
+
+ Assert.IsTrue (open);
+ }
+
+ [Test]
+ public void GetActiveMSBuildProject_CurrentProjectIsSetInProjectService_ReturnsProjectCurrentlySelected ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = testProject;
+
+ IProject activeProject = solution.GetActiveDotNetProject ();
+
+ Assert.AreEqual (testProject, activeProject);
+ }
+
+ [Test]
+ public void HasMultipleProjects_OneProjectInSolution_ReturnsFalse ()
+ {
+ CreateSolution ();
+ FakeDotNetProject project = ProjectHelper.CreateTestProject ();
+ fakeProjectService.OpenProjects.Add (project);
+
+ bool hasMultipleProjects = solution.HasMultipleProjects ();
+
+ Assert.IsFalse (hasMultipleProjects);
+ }
+
+ [Test]
+ public void HasMultipleProjects_TwoProjectsInSolution_ReturnsTrue ()
+ {
+ CreateSolution ();
+ FakeDotNetProject project1 = ProjectHelper.CreateTestProject ();
+ fakeProjectService.OpenProjects.Add (project1);
+ FakeDotNetProject project2 = ProjectHelper.CreateTestProject ();
+ fakeProjectService.OpenProjects.Add (project2);
+
+ bool hasMultipleProjects = solution.HasMultipleProjects ();
+
+ Assert.IsTrue (hasMultipleProjects);
+ }
+
+ [Test]
+ public void FileName_SolutionHasFileName_ReturnsSolutionFileName ()
+ {
+ CreateSolution ();
+ string expectedFileName = @"d:\projects\myproject\Project.sln".ToNativePath ();
+ var solution = new FakeSolution (expectedFileName);
+ fakeProjectService.OpenSolution = solution;
+
+ string fileName = this.solution.FileName;
+
+ Assert.AreEqual (expectedFileName, fileName);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIsInstalledInSolutionLocalRepository_ReturnsTrue ()
+ {
+ CreateSolution ();
+ FakePackage package = FakePackage.CreatePackageWithVersion ("Test", "1.3.4.5");
+ fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add (package);
+
+ bool installed = solution.IsPackageInstalled (package);
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIsNotInstalledInSolutionLocalRepository_ReturnsFalse ()
+ {
+ CreateSolution ();
+ FakePackage package = FakePackage.CreatePackageWithVersion ("Test", "1.3.4.5");
+
+ bool installed = solution.IsPackageInstalled (package);
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIsNotInstalledInSolutionLocalRepository_ActivSolutionUsedToCreateSolutionPackageRepository ()
+ {
+ CreateSolution ();
+ FakePackage package = FakePackage.CreatePackageWithVersion ("Test", "1.3.4.5");
+
+ solution.IsPackageInstalled (package);
+
+ ISolution expectedSolution = fakeProjectService.OpenSolution;
+ ISolution solutionUsedToCreateSolutionPackageRepository =
+ fakeSolutionPackageRepositoryFactory.SolutionPassedToCreateSolutionPackageRepository;
+
+ Assert.AreEqual (expectedSolution, solutionUsedToCreateSolutionPackageRepository);
+ }
+
+ [Test]
+ public void GetActiveProject_SolutionOpenButNoProjectSelected_ReturnsNull ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = null;
+
+ IPackageManagementProject activeProject = solution.GetActiveProject ();
+
+ Assert.IsNull (activeProject);
+ }
+
+ [Test]
+ public void GetActiveProject_RepositoryPassedWhenSolutionOpenButNoProjectSelected_ReturnsNull ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = null;
+
+ var repository = new FakePackageRepository ();
+ IPackageManagementProject activeProject = solution.GetActiveProject (repository);
+
+ Assert.IsNull (activeProject);
+ }
+
+ [Test]
+ public void GetPackages_OnePackageInSolutionRepository_ReturnsOnePackage ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = null;
+ FakePackage package = FakePackage.CreatePackageWithVersion ("Test", "1.3.4.5");
+ fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add (package);
+ AddProjectToOpenProjects ("Test");
+ var project = new FakePackageManagementProject ();
+ fakeProjectFactory.CreatePackageManagementProject = (repository, msbuildProject) => {
+ return project;
+ };
+ project.FakePackages.Add (package);
+
+ IQueryable<IPackage> packages = solution.GetPackages ();
+
+ var expectedPackages = new FakePackage[] {
+ package
+ };
+ PackageCollectionAssert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void GetPackagesInReverseDependencyOrder_TwoPackages_ReturnsPackagesFromSolutionLocalRepositoryInCorrectOrder ()
+ {
+ CreateSolution ();
+ FakePackage packageA = AddPackageInReverseDependencyOrderToSolution ("A");
+ FakePackage packageB = AddPackageInReverseDependencyOrderToSolution ("A");
+
+ packageB.DependenciesList.Add (new PackageDependency ("A"));
+
+ var expectedPackages = new FakePackage[] {
+ packageB,
+ packageA
+ };
+
+ IEnumerable<IPackage> packages = solution.GetPackagesInReverseDependencyOrder ();
+
+ PackageCollectionAssert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void GetProjects_SolutionHasOneProject_ReturnsOneProject ()
+ {
+ CreateSolution ();
+ AddProjectToOpenProjects ("MyProject");
+ var repository = new FakePackageRepository ();
+ List<IPackageManagementProject> projects = solution.GetProjects (repository).ToList ();
+
+ Assert.AreEqual (1, projects.Count);
+ }
+
+ [Test]
+ public void GetProjects_SolutionHasOneProject_RepositoryUsedToCreateProject ()
+ {
+ CreateSolution ();
+ AddProjectToOpenProjects ("MyProject");
+ var expectedRepository = new FakePackageRepository ();
+ solution.GetProjects (expectedRepository).ToList ();
+
+ IPackageRepository repository = fakeProjectFactory.FirstRepositoryPassedToCreateProject;
+
+ Assert.AreEqual (expectedRepository, repository);
+ }
+
+ [Test]
+ public void GetProjects_SolutionHasOneProject_MSBuildProjectUsedToCreateProject ()
+ {
+ CreateSolution ();
+ FakeDotNetProject expectedProject = AddProjectToOpenProjects ("MyProject");
+ var repository = new FakePackageRepository ();
+ solution.GetProjects (repository).ToList ();
+
+ IDotNetProject project = fakeProjectFactory.FirstProjectPassedToCreateProject;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProjects_SolutionHasNoProjects_ReturnsNoProjects ()
+ {
+ CreateSolution ();
+ var repository = new FakePackageRepository ();
+ List<IPackageManagementProject> projects = solution.GetProjects (repository).ToList ();
+
+ Assert.AreEqual (0, projects.Count);
+ }
+
+ [Test]
+ public void GetProjects_SolutionHasTwoProjects_ReturnsTwoProjects ()
+ {
+ CreateSolution ();
+ AddProjectToOpenProjects ("One");
+ AddProjectToOpenProjects ("Two");
+ var repository = new FakePackageRepository ();
+ List<IPackageManagementProject> projects = solution.GetProjects (repository).ToList ();
+
+ Assert.AreEqual (2, projects.Count);
+ }
+
+ [Test]
+ public void GetInstallPath_OnePackageInSolutionRepository_ReturnsPackageInstallPath ()
+ {
+ CreateSolution ();
+ FakePackage package = FakePackage.CreatePackageWithVersion ("Test", "1.3.4.5");
+ string expectedInstallPath = @"d:\projects\MyProject\packages\TestPackage".ToNativePath ();
+ fakeSolutionPackageRepository.InstallPathToReturn = expectedInstallPath;
+
+ string installPath = solution.GetInstallPath (package);
+
+ Assert.AreEqual (expectedInstallPath, installPath);
+ Assert.AreEqual (package, fakeSolutionPackageRepository.PackagePassedToGetInstallPath);
+ }
+
+ [Test]
+ public void GetPackages_OnePackageInstalledIntoOneProjectButTwoPackagesInSolutionRepository_ReturnsOnePackageInstalledInProject ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = null;
+ AddProjectToOpenProjects ("Test");
+ var project = new FakePackageManagementProject ();
+ fakeProjectFactory.CreatePackageManagementProject = (repository, msbuildProject) => {
+ return project;
+ };
+ FakePackage notInstalledPackage = FakePackage.CreatePackageWithVersion ("NotInstalled", "1.0.0.0");
+ fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add (notInstalledPackage);
+ FakePackage installedPackage = FakePackage.CreatePackageWithVersion ("Installed", "1.0.0.0");
+ fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add (installedPackage);
+ project.FakePackages.Add (installedPackage);
+
+ IQueryable<IPackage> packages = solution.GetPackages ();
+
+ var expectedPackages = new FakePackage[] {
+ installedPackage
+ };
+
+ Assert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void GetPackages_OnePackageInstalledIntoOneProjectButTwoPackagesInSolutionRepository_ReturnsOnlyOneProjectPackage ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = null;
+ AddProjectToOpenProjects ("Test");
+ var project = new FakePackageManagementProject ();
+ fakeProjectFactory.CreatePackageManagementProject = (repository, msbuildProject) => {
+ return project;
+ };
+ FakePackage installedSolutionPackage = FakePackage.CreatePackageWithVersion ("SolutionPackage", "1.0.0.0");
+ fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add (installedSolutionPackage);
+ FakePackage installedProjectPackage = FakePackage.CreatePackageWithVersion ("ProjectPackage", "1.0.0.0");
+ fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add (installedProjectPackage);
+ project.FakePackages.Add (installedProjectPackage);
+
+ IQueryable<IPackage> packages = solution.GetPackages ();
+
+ var expectedPackages = new FakePackage[] {
+ installedProjectPackage
+ };
+
+ Assert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void GetPackages_TwoProjectsButNoPackagesInstalledInProjects_PackageProjectsCreatedUsingActiveRepository ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = null;
+ FakeDotNetProject testProject1 = AddProjectToOpenProjects ("Test1");
+ FakeDotNetProject testProject2 = AddProjectToOpenProjects ("Test2");
+
+ solution.GetPackages ();
+
+ Assert.AreEqual (testProject1, fakeProjectFactory.ProjectsPassedToCreateProject [0]);
+ Assert.AreEqual (testProject2, fakeProjectFactory.ProjectsPassedToCreateProject [1]);
+ Assert.AreEqual (fakeRegisteredPackageRepositories.ActiveRepository, fakeProjectFactory.RepositoriesPassedToCreateProject [0]);
+ Assert.AreEqual (fakeRegisteredPackageRepositories.ActiveRepository, fakeProjectFactory.RepositoriesPassedToCreateProject [1]);
+ }
+
+ [Test]
+ public void GetPackages_OnePackageInstalledIntoPackagesFolderOnly_ReturnsNoPackages ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = null;
+ FakePackage fakePackage = FakePackage.CreatePackageWithVersion ("One", "1.0");
+ fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add (fakePackage);
+
+ IQueryable<IPackage> packages = solution.GetPackages ();
+
+ var expectedPackages = new FakePackage [0];
+ Assert.AreEqual (expectedPackages, packages);
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageOperationMessageTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageOperationMessageTests.cs
new file mode 100644
index 0000000000..6f5c077c16
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageOperationMessageTests.cs
@@ -0,0 +1,73 @@
+//
+// PackageOperationMessageTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class PackageOperationMessageTests
+ {
+ [Test]
+ public void Level_CreateInfoMessage_CreatesMessageWithMessageLevelSetToInfo ()
+ {
+ var message = new PackageOperationMessage (MessageLevel.Info, "test");
+
+ Assert.AreEqual (MessageLevel.Info, message.Level);
+ }
+
+ [Test]
+ public void Level_CreateWarningMessage_CreatesMessageWithMessageLevelSetToWarning ()
+ {
+ var message = new PackageOperationMessage (MessageLevel.Warning, "test");
+
+ Assert.AreEqual (MessageLevel.Warning, message.Level);
+ }
+
+ [Test]
+ public void ToString_CreateWarningMessage_ReturnsMessage ()
+ {
+ var message = new PackageOperationMessage (MessageLevel.Warning, "test");
+ var text = message.ToString ();
+
+ Assert.AreEqual ("test", text);
+ }
+
+ [Test]
+ public void ToString_CreateFormattedWarningMessage_ReturnsFormattedMessage ()
+ {
+ string format = "Test '{0}'.";
+ var message = new PackageOperationMessage (MessageLevel.Warning, format, "A");
+ var text = message.ToString ();
+
+ var expectedText = "Test 'A'.";
+ Assert.AreEqual (expectedText, text);
+ }
+ }
+} \ No newline at end of file
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageRepositoryCacheTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageRepositoryCacheTests.cs
new file mode 100644
index 0000000000..694d4e232f
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageRepositoryCacheTests.cs
@@ -0,0 +1,383 @@
+//
+// PackageRepositoryCacheTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class PackageRepositoryCacheTests
+ {
+ PackageRepositoryCache cache;
+ FakePackageRepositoryFactory fakePackageRepositoryFactory;
+ PackageSource nuGetPackageSource;
+ OneRegisteredPackageSourceHelper packageSourcesHelper;
+ RecentPackageInfo[] recentPackagesPassedToCreateRecentPackageRepository;
+ FakePackageRepository fakeAggregateRepositoryPassedToCreateRecentPackageRepository;
+
+ void CreateCache ()
+ {
+ CreatePackageSources ();
+ CreateCacheUsingPackageSources ();
+ }
+
+ void CreatePackageSources ()
+ {
+ packageSourcesHelper = new OneRegisteredPackageSourceHelper ();
+ }
+
+ void CreateCacheUsingPackageSources ()
+ {
+ nuGetPackageSource = new PackageSource ("http://nuget.org", "NuGet");
+ fakePackageRepositoryFactory = new FakePackageRepositoryFactory ();
+ RegisteredPackageSources packageSources = packageSourcesHelper.Options.PackageSources;
+ IList<RecentPackageInfo> recentPackages = packageSourcesHelper.Options.RecentPackages;
+ cache = new PackageRepositoryCache (fakePackageRepositoryFactory, packageSources, recentPackages);
+ }
+
+ FakePackageRepository AddFakePackageRepositoryForPackageSource (string source)
+ {
+ return fakePackageRepositoryFactory.AddFakePackageRepositoryForPackageSource (source);
+ }
+
+ IPackageRepository CreateRecentPackageRepositoryPassingAggregateRepository ()
+ {
+ recentPackagesPassedToCreateRecentPackageRepository = new RecentPackageInfo[0];
+ fakeAggregateRepositoryPassedToCreateRecentPackageRepository = new FakePackageRepository ();
+
+ return cache.CreateRecentPackageRepository (
+ recentPackagesPassedToCreateRecentPackageRepository,
+ fakeAggregateRepositoryPassedToCreateRecentPackageRepository);
+ }
+
+ RecentPackageInfo AddOneRecentPackage ()
+ {
+ var recentPackage = new RecentPackageInfo ("Id", new SemanticVersion ("1.0"));
+ packageSourcesHelper.Options.RecentPackages.Add (recentPackage);
+ return recentPackage;
+ }
+
+ [Test]
+ public void CreateRepository_CacheCastToISharpDevelopPackageRepositoryFactory_CreatesPackageRepositoryUsingPackageRepositoryFactoryPassedInConstructor ()
+ {
+ CreateCache ();
+ var factory = cache as ISharpDevelopPackageRepositoryFactory;
+ IPackageRepository repository = factory.CreateRepository (nuGetPackageSource.Source);
+
+ Assert.AreEqual (fakePackageRepositoryFactory.FakePackageRepository, repository);
+ }
+
+ [Test]
+ public void CreateRepository_PackageSourcePassed_PackageSourceUsedToCreateRepository ()
+ {
+ CreateCache ();
+ cache.CreateRepository (nuGetPackageSource.Source);
+
+ string actualPackageSource = fakePackageRepositoryFactory.FirstPackageSourcePassedToCreateRepository;
+ Assert.AreEqual (nuGetPackageSource.Source, actualPackageSource);
+ }
+
+ [Test]
+ public void CreateRepository_RepositoryAlreadyCreatedForPackageSource_NoRepositoryCreated ()
+ {
+ CreateCache ();
+ cache.CreateRepository (nuGetPackageSource.Source);
+ fakePackageRepositoryFactory.PackageSourcesPassedToCreateRepository.Clear ();
+
+ cache.CreateRepository (nuGetPackageSource.Source);
+
+ Assert.AreEqual (0, fakePackageRepositoryFactory.PackageSourcesPassedToCreateRepository.Count);
+ }
+
+ [Test]
+ public void CreateRepository_RepositoryAlreadyCreatedForPackageSource_RepositoryOriginallyCreatedIsReturned ()
+ {
+ CreateCache ();
+ IPackageRepository originallyCreatedRepository = cache.CreateRepository (nuGetPackageSource.Source);
+ fakePackageRepositoryFactory.PackageSourcesPassedToCreateRepository.Clear ();
+
+ IPackageRepository repository = cache.CreateRepository (nuGetPackageSource.Source);
+
+ Assert.AreSame (originallyCreatedRepository, repository);
+ }
+
+ [Test]
+ public void CreateSharedRepository_MethodCalled_ReturnsSharedPackageRepository ()
+ {
+ CreateCache ();
+ ISharedPackageRepository repository = cache.CreateSharedRepository (null, null, null);
+ Assert.IsNotNull (repository);
+ }
+
+ [Test]
+ public void CreatedSharedRepository_PathResolverPassed_PathResolverUsedToCreatedSharedRepository ()
+ {
+ CreateCache ();
+ FakePackagePathResolver resolver = new FakePackagePathResolver ();
+ cache.CreateSharedRepository (resolver, null, null);
+
+ Assert.AreEqual (resolver, fakePackageRepositoryFactory.PathResolverPassedToCreateSharedRepository);
+ }
+
+ [Test]
+ public void CreatedSharedRepository_FileSystemPassed_FileSystemUsedToCreatedSharedRepository ()
+ {
+ CreateCache ();
+ FakeFileSystem fileSystem = new FakeFileSystem ();
+ cache.CreateSharedRepository (null, fileSystem, null);
+
+ Assert.AreEqual (fileSystem, fakePackageRepositoryFactory.FileSystemPassedToCreateSharedRepository);
+ }
+
+ [Test]
+ public void CreatedSharedRepository_ConfigSettingsFileSystemPassed_FileSystemUsedToCreatedSharedRepository ()
+ {
+ CreateCache ();
+ FakeFileSystem fileSystem = new FakeFileSystem ();
+ cache.CreateSharedRepository (null, null, fileSystem);
+
+ Assert.AreEqual (fileSystem, fakePackageRepositoryFactory.ConfigSettingsFileSystemPassedToCreateSharedRepository);
+ }
+
+ [Test]
+ public void CreateAggregatePackageRepository_TwoRegisteredPackageRepositories_ReturnsAggregateRepositoryFromFactory ()
+ {
+ CreatePackageSources ();
+ packageSourcesHelper.AddTwoPackageSources ("Source1", "Source2");
+ CreateCacheUsingPackageSources ();
+
+ IPackageRepository aggregateRepository = cache.CreateAggregateRepository ();
+ FakePackageRepository expectedRepository = fakePackageRepositoryFactory.FakeAggregateRepository;
+
+ Assert.AreEqual (expectedRepository, aggregateRepository);
+ }
+
+ [Test]
+ public void CreateAggregatePackageRepository_TwoRegisteredPackageSourcesButOneDisabled_ReturnsAggregateRepositoryCreatedWithOnlyEnabledPackageSource ()
+ {
+ CreatePackageSources ();
+ packageSourcesHelper.AddTwoPackageSources ("Source1", "Source2");
+ packageSourcesHelper.RegisteredPackageSources [0].IsEnabled = false;
+ CreateCacheUsingPackageSources ();
+ AddFakePackageRepositoryForPackageSource ("Source1");
+ FakePackageRepository repository2 = AddFakePackageRepositoryForPackageSource ("Source2");
+ var expectedRepositories = new FakePackageRepository[] {
+ repository2
+ };
+
+ cache.CreateAggregateRepository ();
+
+ IEnumerable<IPackageRepository> repositoriesUsedToCreateAggregateRepository =
+ fakePackageRepositoryFactory.RepositoriesPassedToCreateAggregateRepository;
+
+ var actualRepositoriesAsList = new List<IPackageRepository> (repositoriesUsedToCreateAggregateRepository);
+ IPackageRepository[] actualRepositories = actualRepositoriesAsList.ToArray ();
+
+ CollectionAssert.AreEqual (expectedRepositories, actualRepositories);
+ }
+
+ [Test]
+ public void CreateAggregatePackageRepository_TwoRegisteredPackageRepositories_AllRegisteredRepositoriesUsedToCreateAggregateRepositoryFromFactory ()
+ {
+ CreatePackageSources ();
+ packageSourcesHelper.AddTwoPackageSources ("Source1", "Source2");
+ CreateCacheUsingPackageSources ();
+
+ FakePackageRepository repository1 = AddFakePackageRepositoryForPackageSource ("Source1");
+ FakePackageRepository repository2 = AddFakePackageRepositoryForPackageSource ("Source2");
+ var expectedRepositories = new FakePackageRepository[] {
+ repository1,
+ repository2
+ };
+
+ cache.CreateAggregateRepository ();
+
+ IEnumerable<IPackageRepository> repositoriesUsedToCreateAggregateRepository =
+ fakePackageRepositoryFactory.RepositoriesPassedToCreateAggregateRepository;
+
+ var actualRepositoriesAsList = new List<IPackageRepository> (repositoriesUsedToCreateAggregateRepository);
+ IPackageRepository[] actualRepositories = actualRepositoriesAsList.ToArray ();
+
+ CollectionAssert.AreEqual (expectedRepositories, actualRepositories);
+ }
+
+ [Test]
+ public void CreateAggregatePackageRepository_OnePackageRepositoryPassed_ReturnsAggregateRepositoryFromFactory ()
+ {
+ CreateCache ();
+
+ var repositories = new FakePackageRepository[] {
+ new FakePackageRepository ()
+ };
+ IPackageRepository aggregateRepository = cache.CreateAggregateRepository (repositories);
+
+ FakePackageRepository expectedRepository = fakePackageRepositoryFactory.FakeAggregateRepository;
+
+ Assert.AreEqual (expectedRepository, aggregateRepository);
+ }
+
+ [Test]
+ public void CreateAggregatePackageRepository_OnePackageRepositoryPassed_RepositoryUsedToCreateAggregateRepository ()
+ {
+ CreateCache ();
+
+ var repositories = new FakePackageRepository[] {
+ new FakePackageRepository ()
+ };
+ cache.CreateAggregateRepository (repositories);
+
+ IEnumerable<IPackageRepository> repositoriesUsedToCreateAggregateRepository =
+ fakePackageRepositoryFactory.RepositoriesPassedToCreateAggregateRepository;
+
+ Assert.AreEqual (repositories, repositoriesUsedToCreateAggregateRepository);
+ }
+
+ [Test]
+ public void RecentPackageRepository_NoRecentPackages_ReturnsRecentRepositoryCreatedByFactory ()
+ {
+ CreateCache ();
+ IRecentPackageRepository repository = cache.RecentPackageRepository;
+ FakeRecentPackageRepository expectedRepository = fakePackageRepositoryFactory.FakeRecentPackageRepository;
+
+ Assert.AreEqual (expectedRepository, repository);
+ }
+
+ [Test]
+ public void RecentPackageRepository_NoRecentPackages_CreatedWithAggregateRepository ()
+ {
+ CreateCache ();
+ IRecentPackageRepository repository = cache.RecentPackageRepository;
+
+ IPackageRepository expectedRepository = MachineCache.Default;
+ IPackageRepository actualRepository = fakePackageRepositoryFactory.AggregateRepositoryPassedToCreateRecentPackageRepository;
+
+ Assert.AreEqual (expectedRepository, actualRepository);
+ }
+
+ [Test]
+ public void RecentPackageRepository_OneRecentPackage_RecentPackageUsedToCreateRecentPackageRepository ()
+ {
+ CreateCache ();
+ RecentPackageInfo recentPackage = AddOneRecentPackage ();
+
+ IRecentPackageRepository repository = cache.RecentPackageRepository;
+
+ IList<RecentPackageInfo> actualRecentPackages = fakePackageRepositoryFactory.RecentPackagesPassedToCreateRecentPackageRepository;
+
+ var expectedRecentPackages = new RecentPackageInfo[] {
+ recentPackage
+ };
+
+ Assert.AreEqual (expectedRecentPackages, actualRecentPackages);
+ }
+
+ [Test]
+ public void RecentPackageRepository_PropertyAccessedTwice_AggregateRepositoryCreatedOnce ()
+ {
+ CreateCache ();
+ IRecentPackageRepository repository = cache.RecentPackageRepository;
+ fakePackageRepositoryFactory.RepositoriesPassedToCreateAggregateRepository = null;
+ repository = cache.RecentPackageRepository;
+
+ Assert.IsNull (fakePackageRepositoryFactory.RepositoriesPassedToCreateAggregateRepository);
+ }
+
+ [Test]
+ public void CreateRecentPackageRepository_AggregateRepositoryPassedAndNoRecentPackagesPassed_UsesFactoryToCreateRepository ()
+ {
+ CreateCache ();
+ IPackageRepository repository = CreateRecentPackageRepositoryPassingAggregateRepository ();
+
+ FakeRecentPackageRepository expectedRepository = fakePackageRepositoryFactory.FakeRecentPackageRepository;
+
+ Assert.AreEqual (expectedRepository, repository);
+ }
+
+ [Test]
+ public void CreateRecentPackageRepository_AggregateRepositoryPassedAndNoRecentPackagesPassed_AggregateIsUsedToCreateRepository ()
+ {
+ CreateCache ();
+ CreateRecentPackageRepositoryPassingAggregateRepository ();
+
+ IPackageRepository actualRepository = fakePackageRepositoryFactory.AggregateRepositoryPassedToCreateRecentPackageRepository;
+
+ Assert.AreEqual (fakeAggregateRepositoryPassedToCreateRecentPackageRepository, actualRepository);
+ }
+
+ [Test]
+ public void CreateRecentPackageRepository_AggregateRepositoryPassedAndNoRecentPackagesPassed_RecentPackagesUsedToCreateRepository ()
+ {
+ CreateCache ();
+ CreateRecentPackageRepositoryPassingAggregateRepository ();
+
+ IList<RecentPackageInfo> recentPackages = fakePackageRepositoryFactory.RecentPackagesPassedToCreateRecentPackageRepository;
+
+ Assert.AreEqual (recentPackagesPassedToCreateRecentPackageRepository, recentPackages);
+ }
+
+ [Test]
+ public void CreateRecentPackageRepository_MethodCalledTwice_RecentPackageRepositoryCreatedOnce ()
+ {
+ CreateCache ();
+ CreateRecentPackageRepositoryPassingAggregateRepository ();
+ fakePackageRepositoryFactory.AggregateRepositoryPassedToCreateRecentPackageRepository = null;
+ CreateRecentPackageRepositoryPassingAggregateRepository ();
+
+ Assert.IsNull (fakePackageRepositoryFactory.AggregateRepositoryPassedToCreateRecentPackageRepository);
+ }
+
+ [Test]
+ public void CreateRepository_NewRepositoryCreated_RepositoryCreatedEventFired ()
+ {
+ CreateCache ();
+ PackageRepositoryFactoryEventArgs eventArgs = null;
+ cache.RepositoryCreated += (sender, e) => eventArgs = e;
+
+ cache.CreateRepository (nuGetPackageSource.Source);
+
+ Assert.AreEqual (fakePackageRepositoryFactory.FakePackageRepository, eventArgs.Repository);
+ }
+
+ [Test]
+ public void CreateRepository_RepositoryCreatedTwice_RepositoryCreatedEventIsNotFiredOnSecondCallToCreateRepository ()
+ {
+ CreateCache ();
+ cache.CreateRepository (nuGetPackageSource.Source);
+ PackageRepositoryFactoryEventArgs eventArgs = null;
+ cache.RepositoryCreated += (sender, e) => eventArgs = e;
+
+ cache.CreateRepository (nuGetPackageSource.Source);
+
+ Assert.IsNull (eventArgs);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageSourceViewModelTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageSourceViewModelTests.cs
new file mode 100644
index 0000000000..1790b4c647
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageSourceViewModelTests.cs
@@ -0,0 +1,158 @@
+//
+// PackageSourceViewModelTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class PackageSourceViewModelTests
+ {
+ PackageSourceViewModel viewModel;
+ PackageSource packageSource;
+
+ void CreatePackageSource ()
+ {
+ CreatePackageSource ("http://sharpdevelop.codeplex.com", "Test");
+ }
+
+ void CreatePackageSource (string source, string name)
+ {
+ packageSource = new PackageSource (source, name);
+ }
+
+ void CreatePackageSourceWithName (string name)
+ {
+ CreatePackageSource ("http://sharpdevelop.codeplex.com", name);
+ }
+
+ void CreatePackageSourceWithSourceUrl (string sourceUrl)
+ {
+ CreatePackageSource (sourceUrl, "Test");
+ }
+
+ void CreateViewModel (PackageSource packageSource)
+ {
+ viewModel = new PackageSourceViewModel (packageSource);
+ }
+
+ void CreateEnabledPackageSource ()
+ {
+ CreatePackageSource ();
+ packageSource.IsEnabled = true;
+ }
+
+ void CreateDisabledPackageSource ()
+ {
+ CreatePackageSource ();
+ packageSource.IsEnabled = false;
+ }
+
+ [Test]
+ public void Name_InstanceCreatedWithRegisteredPackageSource_MatchesRegisteredPackageSourceName ()
+ {
+ CreatePackageSourceWithName ("Test");
+ CreateViewModel (packageSource);
+
+ Assert.AreEqual ("Test", viewModel.Name);
+ }
+
+ [Test]
+ public void Name_Changed_NamePropertyIsChanged ()
+ {
+ CreatePackageSourceWithName ("Test");
+ CreateViewModel (packageSource);
+ viewModel.Name = "changed";
+
+ Assert.AreEqual ("changed", viewModel.Name);
+ }
+
+ [Test]
+ public void SourceUrl_InstanceCreatedWithRegisteredPackageSource_MatchesRegisteredPackageSourceSourceUrl ()
+ {
+ CreatePackageSourceWithSourceUrl ("Test-url");
+ CreateViewModel (packageSource);
+
+ Assert.AreEqual ("Test-url", viewModel.SourceUrl);
+ }
+
+ [Test]
+ public void Source_Changed_SourcePropertyIsChanged ()
+ {
+ CreatePackageSourceWithSourceUrl ("source-url");
+ CreateViewModel (packageSource);
+ viewModel.SourceUrl = "changed";
+
+ 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);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageViewModelTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageViewModelTests.cs
new file mode 100644
index 0000000000..91b21f6d92
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageViewModelTests.cs
@@ -0,0 +1,771 @@
+//
+// PackageViewModelTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class PackageViewModelTests
+ {
+ TestablePackageViewModel viewModel;
+ FakePackage fakePackage;
+ FakePackageManagementSolution fakeSolution;
+ PackageManagementEvents packageManagementEvents;
+ FakeUninstallPackageAction fakeUninstallPackageAction;
+ FakeLogger fakeLogger;
+ List<PackageManagementSelectedProject> fakeSelectedProjects;
+ AvailablePackagesViewModel viewModelParent;
+
+ void CreateFakeSolution ()
+ {
+ fakeSolution = new FakePackageManagementSolution ();
+ fakeSolution.FakeActiveDotNetProject = ProjectHelper.CreateTestProject ();
+ }
+
+ void CreateViewModel ()
+ {
+ CreateFakeSolution ();
+ CreateViewModel (fakeSolution);
+ }
+
+ void CreateViewModel (FakePackageManagementSolution solution)
+ {
+ viewModelParent = CreateViewModelParent ();
+ viewModel = new TestablePackageViewModel (viewModelParent, solution);
+ fakePackage = viewModel.FakePackage;
+ this.fakeSolution = solution;
+ packageManagementEvents = viewModel.PackageManagementEvents;
+ fakeLogger = viewModel.FakeLogger;
+ fakeUninstallPackageAction = solution.FakeProjectToReturnFromGetProject.FakeUninstallPackageAction;
+ }
+
+ AvailablePackagesViewModel CreateViewModelParent ()
+ {
+ var taskFactory = new FakeTaskFactory ();
+ var registeredPackageRepositories = new FakeRegisteredPackageRepositories ();
+ var packageViewModelFactory = new FakePackageViewModelFactory ();
+ var recentPackageRepository = new FakeRecentPackageRepository ();
+
+ return new AvailablePackagesViewModel (
+ registeredPackageRepositories,
+ recentPackageRepository,
+ packageViewModelFactory,
+ taskFactory);
+ }
+
+ void AddProjectToSolution ()
+ {
+ FakeDotNetProject project = ProjectHelper.CreateTestProject ();
+ fakeSolution.FakeDotNetProjects.Add (project);
+ }
+
+ void CreateViewModelWithTwoProjectsSelected (string projectName1, string projectName2)
+ {
+ CreateFakeSolution ();
+ AddTwoProjectsSelected (projectName1, projectName2);
+ CreateViewModel (fakeSolution);
+ }
+
+ void AddTwoProjectsSelected (string projectName1, string projectName2)
+ {
+ AddProjectToSolution ();
+ AddProjectToSolution ();
+ fakeSolution.FakeDotNetProjects [0].Name = projectName1;
+ fakeSolution.FakeDotNetProjects [1].Name = projectName2;
+ fakeSolution.NoProjectsSelected ();
+
+ fakeSolution.AddFakeProjectToReturnFromGetProject (projectName1);
+ fakeSolution.AddFakeProjectToReturnFromGetProject (projectName2);
+ }
+
+ void SetPackageIdAndVersion (string id, string version)
+ {
+ fakePackage.Id = id;
+ fakePackage.Version = new SemanticVersion (version);
+ }
+
+ void UserCancelsProjectSelection ()
+ {
+ packageManagementEvents.SelectProjects += (sender, e) => {
+ e.IsAccepted = false;
+ };
+ }
+
+ void UserAcceptsProjectSelection ()
+ {
+ packageManagementEvents.SelectProjects += (sender, e) => {
+ e.IsAccepted = true;
+ };
+ }
+
+ List<PackageManagementSelectedProject> CreateTwoFakeSelectedProjects ()
+ {
+ fakeSelectedProjects = new List<PackageManagementSelectedProject> ();
+ var projectA = new FakePackageManagementProject ("Project A");
+ fakeSelectedProjects.Add (new PackageManagementSelectedProject (projectA));
+
+ var projectB = new FakePackageManagementProject ("Project B");
+ fakeSelectedProjects.Add (new PackageManagementSelectedProject (projectB));
+ return fakeSelectedProjects;
+ }
+
+ FakePackageOperation AddFakeInstallPackageOperationWithPackageThatRequiresLicenseAcceptance (PackageManagementSelectedProject selectedProject)
+ {
+ return AddFakeInstallPackageOperationWithPackage (selectedProject, requireLicenseAcceptance: true);
+ }
+
+ FakePackageOperation AddFakeInstallPackageOperationWithPackageThatDoesNotRequireLicenseAcceptance (PackageManagementSelectedProject selectedProject)
+ {
+ return AddFakeInstallPackageOperationWithPackage (selectedProject, requireLicenseAcceptance: false);
+ }
+
+ FakePackageOperation AddFakeInstallPackageOperationWithPackage (PackageManagementSelectedProject selectedProject, bool requireLicenseAcceptance)
+ {
+ var project = selectedProject.Project as FakePackageManagementProject;
+ FakePackageOperation operation = project.AddFakeInstallOperation ();
+ operation.FakePackage.RequireLicenseAcceptance = requireLicenseAcceptance;
+ return operation;
+ }
+
+ FakePackageOperation AddFakeUninstallPackageOperationWithPackageThatRequiresLicenseAcceptance (PackageManagementSelectedProject selectedProject)
+ {
+ var project = selectedProject.Project as FakePackageManagementProject;
+ FakePackageOperation uninstallOperation = project.AddFakeUninstallOperation ();
+ uninstallOperation.FakePackage.RequireLicenseAcceptance = true;
+ return uninstallOperation;
+ }
+
+ PackageManagementSelectedProject FirstFakeSelectedProject {
+ get { return fakeSelectedProjects [0]; }
+ }
+
+ PackageManagementSelectedProject SecondFakeSelectedProject {
+ get { return fakeSelectedProjects [1]; }
+ }
+
+ void ParentAllowsPrereleasePackages ()
+ {
+ viewModelParent.IncludePrerelease = true;
+ }
+
+ [Test]
+ public void AddPackageCommand_CommandExecuted_InstallsPackage ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+
+ viewModel.AddPackageCommand.Execute (null);
+
+ IPackage package = fakeSolution.FakeProjectToReturnFromGetProject.LastInstallPackageCreated.Package;
+ Assert.AreEqual (fakePackage, package);
+ }
+
+ [Test]
+ public void AddPackage_PackageAddedSuccessfully_SourcePackageRepositoryUsedToCreateProject ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+
+ viewModel.AddPackage ();
+
+ Assert.AreEqual (fakePackage.Repository, fakeSolution.RepositoryPassedToGetProject);
+ }
+
+ [Test]
+ public void AddPackage_PackageAddedSuccessfully_PackageOperationsUsedWhenInstallingPackage ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ viewModel.AddPackage ();
+
+ PackageOperation[] expectedOperations = new PackageOperation[] {
+ new PackageOperation (fakePackage, PackageAction.Install)
+ };
+
+ FakeInstallPackageAction action = fakeSolution.FakeProjectToReturnFromGetProject.LastInstallPackageCreated;
+ CollectionAssert.AreEqual (expectedOperations, action.Operations);
+ }
+
+ [Test]
+ public void HasLicenseUrl_PackageHasLicenseUrl_ReturnsTrue ()
+ {
+ CreateViewModel ();
+ fakePackage.LicenseUrl = new Uri ("http://sharpdevelop.com");
+
+ Assert.IsTrue (viewModel.HasLicenseUrl);
+ }
+
+ [Test]
+ public void HasLicenseUrl_PackageHasNoLicenseUrl_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ fakePackage.LicenseUrl = null;
+
+ Assert.IsFalse (viewModel.HasLicenseUrl);
+ }
+
+ [Test]
+ public void HasProjectUrl_PackageHasProjectUrl_ReturnsTrue ()
+ {
+ CreateViewModel ();
+ fakePackage.ProjectUrl = new Uri ("http://sharpdevelop.com");
+
+ Assert.IsTrue (viewModel.HasProjectUrl);
+ }
+
+ [Test]
+ public void HasProjectUrl_PackageHasNoProjectUrl_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ fakePackage.ProjectUrl = null;
+
+ Assert.IsFalse (viewModel.HasProjectUrl);
+ }
+
+ [Test]
+ public void HasReportAbuseUrl_PackageHasReportAbuseUrl_ReturnsTrue ()
+ {
+ CreateViewModel ();
+ fakePackage.ReportAbuseUrl = new Uri ("http://sharpdevelop.com");
+
+ Assert.IsTrue (viewModel.HasReportAbuseUrl);
+ }
+
+ [Test]
+ public void HasReportAbuseUrl_PackageHasNoReportAbuseUrl_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ fakePackage.ReportAbuseUrl = null;
+
+ Assert.IsFalse (viewModel.HasReportAbuseUrl);
+ }
+
+ [Test]
+ public void IsAdded_ProjectHasPackageAdded_ReturnsTrue ()
+ {
+ CreateViewModel ();
+ fakeSolution.FakeProjectToReturnFromGetProject.FakePackages.Add (fakePackage);
+
+ Assert.IsTrue (viewModel.IsAdded);
+ }
+
+ [Test]
+ public void IsAdded_ProjectDoesNotHavePackageInstalled_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ fakeSolution.FakeProjectToReturnFromGetProject.FakePackages.Clear ();
+
+ Assert.IsFalse (viewModel.IsAdded);
+ }
+
+ [Test]
+ public void RemovePackageCommand_CommandExecuted_UninstallsPackage ()
+ {
+ CreateViewModel ();
+ viewModel.RemovePackageCommand.Execute (null);
+
+ Assert.AreEqual (fakePackage, fakeUninstallPackageAction.Package);
+ }
+
+ [Test]
+ public void RemovePackage_PackageRemovedSuccessfully_RepositoryUsedToCreateProject ()
+ {
+ CreateViewModel ();
+ viewModel.RemovePackage ();
+
+ Assert.AreEqual (fakePackage.Repository, fakeSolution.RepositoryPassedToGetProject);
+ }
+
+ [Test]
+ public void PackageChanged_PackageRemovedSuccessfully_PropertyNotifyChangedFiredForIsAddedProperty ()
+ {
+ CreateViewModel ();
+ string propertyChangedName = null;
+ viewModel.PropertyChanged += (sender, e) => propertyChangedName = e.PropertyName;
+ viewModel.RemovePackage ();
+
+ Assert.AreEqual ("IsAdded", propertyChangedName);
+ }
+
+ [Test]
+ public void PackageChanged_PackageRemovedSuccessfully_PropertyNotifyChangedFiredAfterPackageUninstalled ()
+ {
+ CreateViewModel ();
+ IPackage packagePassedToUninstallPackageWhenPropertyNameChanged = null;
+ viewModel.PropertyChanged += (sender, e) => {
+ packagePassedToUninstallPackageWhenPropertyNameChanged = fakeUninstallPackageAction.Package;
+ };
+ viewModel.RemovePackage ();
+
+ Assert.AreEqual (fakePackage, packagePassedToUninstallPackageWhenPropertyNameChanged);
+ }
+
+ [Test]
+ public void HasDependencies_PackageHasNoDependencies_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ fakePackage.HasDependencies = false;
+
+ Assert.IsFalse (viewModel.HasDependencies);
+ }
+
+ [Test]
+ public void HasDependencies_PackageHasDependency_ReturnsTrue ()
+ {
+ CreateViewModel ();
+ fakePackage.AddDependency ("Dependency");
+
+ Assert.IsTrue (viewModel.HasDependencies);
+ }
+
+ [Test]
+ public void HasNoDependencies_PackageHasNoDependencies_ReturnsTrue ()
+ {
+ CreateViewModel ();
+
+ Assert.IsTrue (viewModel.HasNoDependencies);
+ }
+
+ [Test]
+ public void HasNoDependencies_PackageHasOneDependency_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ fakePackage.AddDependency ("Dependency");
+
+ Assert.IsFalse (viewModel.HasNoDependencies);
+ }
+
+ [Test]
+ public void HasDownloadCount_DownloadCountIsZero_ReturnsTrue ()
+ {
+ CreateViewModel ();
+ fakePackage.DownloadCount = 0;
+
+ Assert.IsTrue (viewModel.HasDownloadCount);
+ }
+
+ [Test]
+ public void HasDownloadCount_DownloadCountIsMinusOne_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ fakePackage.DownloadCount = -1;
+
+ Assert.IsFalse (viewModel.HasDownloadCount);
+ }
+
+ [Test]
+ public void HasLastPublished_PackageHasPublishedDate_ReturnsTrue ()
+ {
+ CreateViewModel ();
+ fakePackage.Published = new DateTime (2011, 1, 2);
+
+ Assert.IsTrue (viewModel.HasLastPublished);
+ }
+
+ [Test]
+ public void HasLastPublished_PackageHasNoPublishedDate_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ fakePackage.Published = null;
+
+ Assert.IsFalse (viewModel.HasLastPublished);
+ }
+
+ [Test]
+ public void LastPublished_PackageHasPublishedDate_ReturnsPackagePublishedDate ()
+ {
+ CreateViewModel ();
+ fakePackage.Published = new DateTime (2011, 1, 2);
+
+ Assert.AreEqual (fakePackage.Published, viewModel.LastPublished);
+ }
+
+ [Test]
+ public void LastPublished_PackageHasNoPublishedDate_ReturnsNull ()
+ {
+ CreateViewModel ();
+ fakePackage.Published = null;
+
+ Assert.IsNull (viewModel.LastPublished);
+ }
+
+ [Test]
+ public void AddPackage_CheckLoggerUsed_PackageViewModelLoggerUsedWhenResolvingPackageOperations ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ viewModel.AddPackage ();
+
+ ILogger expectedLogger = viewModel.OperationLoggerCreated;
+ ILogger actualLogger = fakeSolution.FakeProjectToReturnFromGetProject.Logger;
+ Assert.AreEqual (expectedLogger, actualLogger);
+ }
+
+ [Test]
+ public void AddPackage_PackageAddedSuccessfully_InstallingPackageMessageIsFirstMessageLogged ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ fakePackage.Id = "Test.Package";
+ fakePackage.Version = new SemanticVersion (1, 2, 0, 55);
+ viewModel.AddPackage ();
+
+ string expectedMessage = "------- Installing...Test.Package 1.2.0.55 -------";
+ string actualMessage = fakeLogger.FirstFormattedMessageLogged;
+
+ Assert.AreEqual (expectedMessage, actualMessage);
+ }
+
+ [Test]
+ public void AddPackage_PackageAddedSuccessfully_NextToLastMessageLoggedMarksEndOfInstallation ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ viewModel.AddPackage ();
+
+ string expectedMessage = "==============================";
+ string actualMessage = fakeLogger.NextToLastFormattedMessageLogged;
+
+ Assert.AreEqual (expectedMessage, actualMessage);
+ }
+
+ [Test]
+ public void AddPackage_PackageAddedSuccessfully_LastMessageLoggedIsEmptyLine ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ viewModel.AddPackage ();
+
+ string expectedMessage = String.Empty;
+ string actualMessage = fakeLogger.LastFormattedMessageLogged;
+
+ Assert.AreEqual (expectedMessage, actualMessage);
+ }
+
+ [Test]
+ public void RemovePackage_PackageRemovedSuccessfully_UninstallingPackageMessageIsFirstMessageLogged ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ fakePackage.Id = "Test.Package";
+ fakePackage.Version = new SemanticVersion (1, 2, 0, 55);
+ viewModel.RemovePackage ();
+
+ string expectedMessage = "------- Uninstalling...Test.Package 1.2.0.55 -------";
+ string actualMessage = fakeLogger.FirstFormattedMessageLogged;
+
+ Assert.AreEqual (expectedMessage, actualMessage);
+ }
+
+ [Test]
+ public void RemovePackage_PackageRemovedSuccessfully_NextToLastMessageLoggedMarksEndOfInstallation ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ viewModel.RemovePackage ();
+
+ string expectedMessage = "==============================";
+ string actualMessage = fakeLogger.NextToLastFormattedMessageLogged;
+
+ Assert.AreEqual (expectedMessage, actualMessage);
+ }
+
+ [Test]
+ public void RemovePackage_PackageRemovedSuccessfully_LastMessageLoggedIsEmptyLine ()
+ {
+ CreateViewModel ();
+ viewModel.RemovePackage ();
+
+ string expectedMessage = String.Empty;
+ string actualMessage = fakeLogger.LastFormattedMessageLogged;
+
+ Assert.AreEqual (expectedMessage, actualMessage);
+ }
+
+ [Test]
+ public void AddPackage_PackagesInstalledSuccessfully_ViewModelPackageUsedWhenResolvingPackageOperations ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ viewModel.AddPackage ();
+
+ FakePackage expectedPackage = fakePackage;
+ IPackage actualPackage = fakeSolution
+ .FakeProjectToReturnFromGetProject
+ .PackagePassedToGetInstallPackageOperations;
+
+ Assert.AreEqual (expectedPackage, actualPackage);
+ }
+
+ [Test]
+ public void AddPackage_PackagesInstalledSuccessfully_PackageDependenciesNotIgnoredWhenCheckingForPackageOperations ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ viewModel.AddPackage ();
+
+ bool result = fakeSolution
+ .FakeProjectToReturnFromGetProject
+ .IgnoreDependenciesPassedToGetInstallPackageOperations;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void AddPackage_PackagesInstalledSuccessfully_PrereleaseVersionsNotAllowedWhenCheckingForPackageOperations ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ viewModel.AddPackage ();
+
+ bool result = fakeSolution
+ .FakeProjectToReturnFromGetProject
+ .AllowPrereleaseVersionsPassedToGetInstallPackageOperations;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void AddPackage_ParentHasIncludePrereleaseSetToTrueWhenInstalling_PrereleaseVersionsAllowedWhenCheckingForPackageOperations ()
+ {
+ CreateViewModel ();
+ ParentAllowsPrereleasePackages ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ viewModel.AddPackage ();
+
+ bool result = fakeSolution
+ .FakeProjectToReturnFromGetProject
+ .AllowPrereleaseVersionsPassedToGetInstallPackageOperations;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void IsAdded_SolutionSelectedContainingOneProjectAndPackageIsInstalledInSolutionSharedRepository_ReturnsTrue ()
+ {
+ CreateFakeSolution ();
+ AddProjectToSolution ();
+ fakeSolution.NoProjectsSelected ();
+ fakeSolution.FakeInstalledPackages.Add (fakePackage);
+ CreateViewModel (fakeSolution);
+
+ bool added = viewModel.IsAdded;
+
+ Assert.IsTrue (added);
+ }
+
+ [Test]
+ public void IsAdded_SolutionSelectedContainingOneProjectAndPackageIsNotInstalledInSolutionSharedRepository_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ AddProjectToSolution ();
+ fakeSolution.NoProjectsSelected ();
+
+ bool added = viewModel.IsAdded;
+
+ Assert.IsFalse (added);
+ }
+
+ [Test]
+ public void IsManaged_SolutionSelectedContainingTwoProjects_ReturnsTrue ()
+ {
+ CreateFakeSolution ();
+ AddProjectToSolution ();
+ AddProjectToSolution ();
+ fakeSolution.NoProjectsSelected ();
+ CreateViewModel (fakeSolution);
+
+ bool managed = viewModel.IsManaged;
+
+ Assert.IsTrue (managed);
+ }
+
+ [Test]
+ public void IsManaged_SolutionSelectedContainingOneProject_ReturnsTrue ()
+ {
+ CreateFakeSolution ();
+ AddProjectToSolution ();
+ fakeSolution.NoProjectsSelected ();
+ CreateViewModel (fakeSolution);
+
+ bool managed = viewModel.IsManaged;
+
+ Assert.IsTrue (managed);
+ }
+
+ [Test]
+ public void IsManaged_SolutionWithOneProjectSelected_ReturnsFalse ()
+ {
+ CreateFakeSolution ();
+ AddProjectToSolution ();
+ fakeSolution.FakeActiveDotNetProject = fakeSolution.FakeDotNetProjects [0];
+ CreateViewModel (fakeSolution);
+
+ bool managed = viewModel.IsManaged;
+
+ Assert.IsFalse (managed);
+ }
+
+ [Test]
+ public void Summary_PackageHasSummary_PackageSummaryReturned ()
+ {
+ CreateViewModel ();
+ fakePackage.Summary = "Expected summary";
+
+ string summary = viewModel.Summary;
+
+ Assert.AreEqual ("Expected summary", summary);
+ }
+
+ [Test]
+ public void Summary_PackageHasDescriptionButNoSummary_PackageDescriptionReturned ()
+ {
+ CreateViewModel ();
+ fakePackage.Summary = String.Empty;
+ fakePackage.Description = "Expected description";
+
+ string summary = viewModel.Summary;
+
+ Assert.AreEqual ("Expected description", summary);
+ }
+
+ [Test]
+ public void Name_PackageHasIdButNoTitle_ReturnsPackageId ()
+ {
+ CreateViewModel ();
+ fakePackage.Id = "MyPackage";
+
+ string name = viewModel.Name;
+
+ Assert.AreEqual ("MyPackage", name);
+ }
+
+ [Test]
+ public void Name_PackageHasIdAndTitle_ReturnsPackageId ()
+ {
+ CreateViewModel ();
+ fakePackage.Id = "MyPackage";
+ fakePackage.Title = "My Package Title";
+
+ string name = viewModel.Name;
+
+ Assert.AreEqual ("My Package Title", name);
+ }
+
+ [Test]
+ public void GalleryUrl_PackageHasGalleryUrl_ReturnsUrl ()
+ {
+ CreateViewModel ();
+ var expectedUrl = new Uri ("http://test.com/MyPackage");
+ fakePackage.GalleryUrl = expectedUrl;
+
+ Uri url = viewModel.GalleryUrl;
+
+ Assert.AreEqual (expectedUrl, url);
+ }
+
+ [Test]
+ public void HasGalleryUrl_PackageHasGalleryUrl_ReturnsTrue ()
+ {
+ CreateViewModel ();
+ var expectedUrl = new Uri ("http://test.com/MyPackage");
+ fakePackage.GalleryUrl = expectedUrl;
+
+ bool result = viewModel.HasGalleryUrl;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void HasNoGalleryUrl_PackageHasNoGalleryUrl_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ fakePackage.GalleryUrl = null;
+
+ bool result = viewModel.HasGalleryUrl;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void HasNoGalleryUrl_PackageHasGalleryUrl_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ var expectedUrl = new Uri ("http://test.com/MyPackage");
+ fakePackage.GalleryUrl = expectedUrl;
+
+ bool result = viewModel.HasNoGalleryUrl;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void IsGalleryUrlMissing_PackageHasNoGalleryUrl_ReturnsTrue ()
+ {
+ CreateViewModel ();
+ fakePackage.GalleryUrl = null;
+
+ bool result = viewModel.HasNoGalleryUrl;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void AddPackage_PackageRepositoryIsOperationAwareAndPackageAddedSuccessfully_InstallOperationStartedForPackage ()
+ {
+ CreateViewModel ();
+ var operationAwareRepository = new FakeOperationAwarePackageRepository ();
+ fakePackage.FakePackageRepository = operationAwareRepository;
+ fakePackage.Id = "MyPackage";
+
+ viewModel.AddPackage ();
+
+ operationAwareRepository.AssertOperationWasStartedAndDisposed (RepositoryOperationNames.Install, "MyPackage");
+ }
+
+ [Test]
+ public void ManagePackage_TwoProjectsNeitherSelectedAndSourceRepositoryIsOperationAware_InstallOperationStarted ()
+ {
+ CreateViewModelWithTwoProjectsSelected ("Project A", "Project B");
+ UserAcceptsProjectSelection ();
+ var operationAwareRepository = new FakeOperationAwarePackageRepository ();
+ fakePackage.FakePackageRepository = operationAwareRepository;
+ fakePackage.Id = "MyPackage";
+
+ viewModel.ManagePackage ();
+
+ operationAwareRepository.AssertOperationWasStartedAndDisposed (RepositoryOperationNames.Install, "MyPackage");
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ProcessPackageActionTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ProcessPackageActionTests.cs
new file mode 100644
index 0000000000..ef9622d12d
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ProcessPackageActionTests.cs
@@ -0,0 +1,110 @@
+//
+// ProcessPackageActionTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class ProcessPackageActionTests
+ {
+ TestableProcessPackageAction action;
+ FakePackageManagementProject fakeProject;
+ ExceptionThrowingProcessPackageAction exceptionThrowingAction;
+
+ void CreateAction ()
+ {
+ action = new TestableProcessPackageAction ();
+ fakeProject = action.FakeProject;
+ }
+
+ ILogger AddLoggerToAction ()
+ {
+ var logger = new NullLogger ();
+ action.Logger = logger;
+ return logger;
+ }
+
+ void CreateActionWithExceptionThrownInExecuteCore ()
+ {
+ exceptionThrowingAction = new ExceptionThrowingProcessPackageAction ();
+ }
+
+ [Test]
+ public void Execute_LoggerIsNull_LoggerUsedByProjectIsPackageManagementLogger ()
+ {
+ CreateAction ();
+ action.Execute ();
+
+ ILogger actualLogger = fakeProject.Logger;
+
+ Assert.IsInstanceOf<PackageManagementLogger> (actualLogger);
+ }
+
+ [Test]
+ public void Execute_LoggerIsDefined_LoggerDefinedIsUsedByProjectManager ()
+ {
+ CreateAction ();
+ ILogger expectedLogger = AddLoggerToAction ();
+ action.Execute ();
+
+ ILogger actualLogger = fakeProject.Logger;
+
+ Assert.AreEqual (expectedLogger, actualLogger);
+ }
+
+ [Test]
+ public void BeforeExecute_LoggerIsDefined_LoggerUsedByProjectIsConfiguredBeforeInstallPackageCalled ()
+ {
+ CreateAction ();
+ ILogger expectedLogger = AddLoggerToAction ();
+ action.CallBeforeExecute ();
+
+ ILogger actualLogger = fakeProject.Logger;
+
+ Assert.AreEqual (expectedLogger, actualLogger);
+ }
+
+ [Test]
+ public void Execute_ExceptionThrownInExecuteCore_ExceptionThrownByExecuteMethod ()
+ {
+ CreateActionWithExceptionThrownInExecuteCore ();
+ var expectedException = new Exception ("Error");
+ exceptionThrowingAction.ExceptionToThrowInExecuteCore = expectedException;
+
+ Exception exception = Assert.Throws<Exception> (() => exceptionThrowingAction.Execute ());
+
+ Assert.AreEqual (expectedException, exception);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ProjectHelper.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ProjectHelper.cs
new file mode 100644
index 0000000000..0ea0adcad9
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ProjectHelper.cs
@@ -0,0 +1,129 @@
+//
+// ProjectHelper.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Core;
+using MonoDevelop.PackageManagement;
+using MonoDevelop.Projects;
+using System.Linq;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public static class ProjectHelper
+ {
+ public static ISolution CreateSolution ()
+ {
+ return new FakeSolution ();
+ }
+
+ public static FakeDotNetProject CreateTestProject ()
+ {
+ return CreateTestProject ("TestProject");
+ }
+
+ public static FakeDotNetProject CreateTestProject (string name)
+ {
+ ISolution solution = CreateSolution ();
+
+ return CreateTestProject (solution, name);
+ }
+
+ public static FakeDotNetProject CreateTestProject (
+ ISolution parentSolution,
+ string name,
+ string fileName = null)
+ {
+ return new FakeDotNetProject {
+ ParentSolution = parentSolution,
+ FileName = new FilePath (fileName),
+ Name = name
+ };
+ }
+
+ public static FakeDotNetProject CreateTestWebApplicationProject ()
+ {
+ FakeDotNetProject project = CreateTestProject ();
+ AddWebApplicationProjectType (project);
+ return project;
+ }
+
+ public static FakeDotNetProject CreateTestWebSiteProject ()
+ {
+ FakeDotNetProject project = CreateTestProject ();
+ AddWebSiteProjectType (project);
+ return project;
+ }
+
+ public static void AddWebApplicationProjectType (FakeDotNetProject project)
+ {
+ AddProjectType (project, DotNetProjectExtensions.WebApplication);
+ }
+
+ public static void AddWebSiteProjectType (FakeDotNetProject project)
+ {
+ AddProjectType (project, DotNetProjectExtensions.WebSite);
+ }
+
+ public static void AddProjectType (FakeDotNetProject project, Guid guid)
+ {
+ project.AddProjectType (guid);
+ }
+
+ public static void AddReference (FakeDotNetProject project, string referenceName, string hintPath = null)
+ {
+ var reference = new ProjectReference (ReferenceType.Assembly, referenceName, hintPath);
+ project.References.Add (reference);
+ }
+
+ public static void AddGacReference (FakeDotNetProject project, string referenceName)
+ {
+ var reference = new ProjectReference (ReferenceType.Package, referenceName);
+ project.References.Add (reference);
+ }
+
+ public static void AddFile (FakeDotNetProject project, string fileName)
+ {
+ project.Files.Add (new ProjectFile (fileName.ToNativePath ()));
+ }
+
+ public static ProjectReference GetReference (FakeDotNetProject project, string referenceName)
+ {
+ foreach (ProjectReference referenceProjectItem in project.References) {
+ if (referenceProjectItem.Reference == referenceName) {
+ return referenceProjectItem;
+ }
+ }
+ return null;
+ }
+
+ public static ProjectFile GetFile (FakeDotNetProject project, string fileName)
+ {
+ return project.FilesAdded.FirstOrDefault (file => file.FilePath == new FilePath (fileName));
+ }
+ }
+} \ No newline at end of file
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RecentPackageInfoTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RecentPackageInfoTests.cs
new file mode 100644
index 0000000000..0ed79dbc6c
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RecentPackageInfoTests.cs
@@ -0,0 +1,91 @@
+//
+// RecentPackageInfoTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class RecentPackageInfoTests
+ {
+ [Test]
+ public void ToString_IdAndVersionSpecified_ContainsIdAndVersion ()
+ {
+ var recentPackageInfo = new RecentPackageInfo ("id", new SemanticVersion ("1.0"));
+
+ string actual = recentPackageInfo.ToString ();
+
+ string expected = "[RecentPackageInfo Id=id, Version=1.0]";
+ Assert.AreEqual (expected, actual);
+ }
+
+ [Test]
+ public void IsMatch_PackageWithSameIdAndVersionPassed_ReturnsTrue ()
+ {
+ string id = "id";
+ var version = new SemanticVersion (1, 0, 0, 0);
+ var recentPackageInfo = new RecentPackageInfo (id, version);
+ var package = new FakePackage (id);
+ package.Version = version;
+
+ bool result = recentPackageInfo.IsMatch (package);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void IsMatch_PackageWithSameIdButDifferentVersionPassed_ReturnsFalse ()
+ {
+ string id = "id";
+ var version = new SemanticVersion (1, 0, 0, 0);
+ var recentPackageInfo = new RecentPackageInfo (id, version);
+ var package = new FakePackage (id);
+ package.Version = new SemanticVersion (2, 0, 0, 0);
+
+ bool result = recentPackageInfo.IsMatch (package);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void IsMatch_PackageWithDifferentIdButSameVersionPassed_ReturnsFalse ()
+ {
+ var version = new SemanticVersion (1, 0, 0, 0);
+ var recentPackageInfo = new RecentPackageInfo ("id", version);
+ var package = new FakePackage ("different-id");
+ package.Version = version;
+
+ bool result = recentPackageInfo.IsMatch (package);
+
+ Assert.IsFalse (result);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RecentPackageRepositoryTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RecentPackageRepositoryTests.cs
new file mode 100644
index 0000000000..52f8577756
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RecentPackageRepositoryTests.cs
@@ -0,0 +1,216 @@
+//
+// RecentPackageRepositoryTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class RecentPackageRepositoryTests
+ {
+ RecentPackageRepository repository;
+ FakePackageRepository aggregateRepository;
+ List<RecentPackageInfo> recentPackages;
+
+ void CreateRepository ()
+ {
+ CreateRecentPackages ();
+ CreateRepository (recentPackages);
+ }
+
+ void CreateRecentPackages ()
+ {
+ recentPackages = new List<RecentPackageInfo> ();
+ aggregateRepository = new FakePackageRepository ();
+ }
+
+ void CreateRepository (IList<RecentPackageInfo> recentPackages)
+ {
+ repository = new RecentPackageRepository (recentPackages, aggregateRepository);
+ }
+
+ FakePackage AddOnePackageToRepository (string id)
+ {
+ var package = new FakePackage (id);
+ repository.AddPackage (package);
+ return package;
+ }
+
+ IEnumerable<IPackage> AddTwoDifferentPackagesToRepository ()
+ {
+ yield return AddOnePackageToRepository ("Test.Package.1");
+ yield return AddOnePackageToRepository ("Test.Package.2");
+ }
+
+ IEnumerable<IPackage> AddFourDifferentPackagesToRepository ()
+ {
+ yield return AddOnePackageToRepository ("Test.Package.1");
+ yield return AddOnePackageToRepository ("Test.Package.2");
+ yield return AddOnePackageToRepository ("Test.Package.3");
+ yield return AddOnePackageToRepository ("Test.Package.4");
+ }
+
+ FakePackage CreateRepositoryWithOneRecentPackageSavedInOptions ()
+ {
+ CreateRecentPackages ();
+ var package = new FakePackage ("Test");
+ aggregateRepository.FakePackages.Add (package);
+ recentPackages.Add (new RecentPackageInfo (package));
+ CreateRepository (recentPackages);
+ return package;
+ }
+
+ [Test]
+ public void Source_NewRecentRepositoryCreated_IsRecentPackages ()
+ {
+ CreateRepository ();
+ Assert.AreEqual ("RecentPackages", repository.Source);
+ }
+
+ [Test]
+ public void GetPackages_RepositoryIsEmptyAndOnePackageAdded_ReturnsPackageAdded ()
+ {
+ CreateRepository ();
+ var package = AddOnePackageToRepository ("Test.Package");
+
+ var packages = repository.GetPackages ();
+
+ var expectedPackages = new FakePackage[] {
+ package
+ };
+
+ PackageCollectionAssert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void GetPackages_RepositoryIsEmptyAndTwoDifferentPackagesAdded_ReturnsPackagesInReverseOrderWithLastAddedFirst ()
+ {
+ CreateRepository ();
+ var packagesAdded = AddTwoDifferentPackagesToRepository ();
+
+ var packages = repository.GetPackages ();
+
+ var expectedPackages = packagesAdded.Reverse ();
+
+ PackageCollectionAssert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void GetPackages_RepositoryCanHoldThreePackagesAndFourPackagesAdded_ReturnsLastThreePackagesAddedInReverseOrder ()
+ {
+ CreateRepository ();
+ repository.MaximumPackagesCount = 3;
+ var packagesAdded = AddFourDifferentPackagesToRepository ();
+
+ var packages = repository.GetPackages ();
+
+ var expectedPackages = packagesAdded.Reverse ().Take (3);
+
+ PackageCollectionAssert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void GetPackages_RepositoryIsEmptyAndSamePackageIsAddedTwice_OnePackageReturned ()
+ {
+ CreateRepository ();
+ AddOnePackageToRepository ("Test");
+ var package = AddOnePackageToRepository ("Test");
+
+ var packages = repository.GetPackages ();
+
+ var expectedPackages = new FakePackage[] {
+ package
+ };
+
+ PackageCollectionAssert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void AddPackage_RepositoryIsEmptyAndTwoPackagesAddedFromDifferentSources_BothRecentPackagesAdded ()
+ {
+ CreateRepository ();
+ var package1 = AddOnePackageToRepository ("Test1");
+ var package2 = AddOnePackageToRepository ("Test2");
+
+ var expectedPackages = new IPackage[] {
+ package2,
+ package1
+ };
+
+ PackageCollectionAssert.AreEqual (expectedPackages, repository.GetPackages ());
+ }
+
+ public void Clear_OneRecentPackage_PackagesRemoved ()
+ {
+ CreateRepository ();
+ AddOnePackageToRepository ("Test1");
+
+ repository.Clear ();
+
+ int count = repository.GetPackages ().Count ();
+
+ Assert.AreEqual (0, count);
+ }
+
+ [Test]
+ public void Clear_OneRecentPackageInOptions_RecentPackagesAreRemovedFromOptions ()
+ {
+ CreateRepositoryWithOneRecentPackageSavedInOptions ();
+
+ repository.Clear ();
+
+ int count = recentPackages.Count;
+
+ Assert.AreEqual (0, count);
+ }
+
+ [Test]
+ public void HasRecentPackages_NoSavedRecentPackages_ReturnsFalse ()
+ {
+ CreateRepository ();
+
+ bool hasRecentPackages = repository.HasRecentPackages;
+
+ Assert.IsFalse (hasRecentPackages);
+ }
+
+ [Test]
+ public void HasRecentPackages_OneSavedRecentPackages_ReturnsTrue ()
+ {
+ CreateRepositoryWithOneRecentPackageSavedInOptions ();
+
+ bool hasRecentPackages = repository.HasRecentPackages;
+
+ Assert.IsTrue (hasRecentPackages);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ReducedPackageOperationsTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ReducedPackageOperationsTests.cs
new file mode 100644
index 0000000000..644f16fa5a
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ReducedPackageOperationsTests.cs
@@ -0,0 +1,188 @@
+//
+// ReducedPackageOperationsTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class ReducedPackageOperationsTests
+ {
+ ReducedPackageOperations reducedPackageOperations;
+ FakePackageOperationResolver fakePackageOperationResolver;
+ List<IPackage> packages;
+
+ void CreateReducedPackageOperations ()
+ {
+ packages = new List<IPackage> ();
+ fakePackageOperationResolver = new FakePackageOperationResolver ();
+ reducedPackageOperations = new ReducedPackageOperations (fakePackageOperationResolver, packages);
+ }
+
+ IPackage AddPackage (string id, string version)
+ {
+ IPackage package = CreatePackage (id, version);
+ packages.Add (package);
+
+ return package;
+ }
+
+ IPackage CreatePackage (string id, string version)
+ {
+ return new TestPackageHelper (id, version).Package;
+ }
+
+ PackageOperation AddInstallOperationForPackage (IPackage package)
+ {
+ var operation = new PackageOperation (package, PackageAction.Install);
+ AddInstallOperationsForPackage (package, operation);
+ return operation;
+ }
+
+ void AddInstallOperationsForPackage (IPackage package, params PackageOperation[] operations)
+ {
+ fakePackageOperationResolver.AddOperations (package, operations);
+ }
+
+ PackageOperation CreatePackageOperation (string id, string version, PackageAction action)
+ {
+ IPackage package = CreatePackage (id, version);
+ return new PackageOperation (package, action);
+ }
+
+ void AssertReducedOperationsContains (PackageOperation operation)
+ {
+ Assert.IsTrue (reducedPackageOperations.Operations.ToList ().Contains (operation));
+ }
+
+ [Test]
+ public void Reduce_OnePackage_ReturnsPackageOperationsFromResolverForPackage ()
+ {
+ CreateReducedPackageOperations ();
+ IPackage package = AddPackage ("Test", "1.0");
+ PackageOperation operation = AddInstallOperationForPackage (package);
+
+ reducedPackageOperations.Reduce ();
+
+ Assert.AreEqual (1, reducedPackageOperations.Operations.Count ());
+ Assert.AreEqual (operation, reducedPackageOperations.Operations.First ());
+ }
+
+ [Test]
+ public void Reduce_TwoPackages_ReturnsPackageOperationsForBothPackages ()
+ {
+ CreateReducedPackageOperations ();
+ IPackage package1 = AddPackage ("Test", "1.0");
+ IPackage package2 = AddPackage ("Test2", "1.0");
+ PackageOperation operation1 = AddInstallOperationForPackage (package1);
+ PackageOperation operation2 = AddInstallOperationForPackage (package2);
+
+ reducedPackageOperations.Reduce ();
+
+ Assert.AreEqual (2, reducedPackageOperations.Operations.Count ());
+ AssertReducedOperationsContains (operation1);
+ AssertReducedOperationsContains (operation2);
+ }
+
+ [Test]
+ public void Reduce_OncePackageOperationInstallsPackageWhilstOneUninstallsSamePackage_PackageOperationNotIncludedInReducedSet ()
+ {
+ CreateReducedPackageOperations ();
+ IPackage package = AddPackage ("Test", "1.0");
+ PackageOperation installOperation = CreatePackageOperation ("Foo", "1.0", PackageAction.Install);
+ PackageOperation uninstallOperation = CreatePackageOperation ("Foo", "1.0", PackageAction.Uninstall);
+ AddInstallOperationsForPackage (package, installOperation, uninstallOperation);
+
+ reducedPackageOperations.Reduce ();
+
+ Assert.AreEqual (0, reducedPackageOperations.Operations.Count ());
+ }
+
+ [Test]
+ public void Reduce_OnePackageOperationMatchesPackageBeingInstalled_ReturnsOnlyOnePackageInstallOperationForThisPackage ()
+ {
+ CreateReducedPackageOperations ();
+ IPackage package1 = AddPackage ("Test", "1.0");
+ IPackage package2 = AddPackage ("Test2", "1.0");
+ PackageOperation operation1a = CreatePackageOperation ("Test", "1.0", PackageAction.Install);
+ PackageOperation operation1b = CreatePackageOperation ("Test2", "1.0", PackageAction.Install);
+ PackageOperation operation2 = CreatePackageOperation ("Test2", "1.0", PackageAction.Install);
+ AddInstallOperationsForPackage (package1, operation1a, operation1b);
+ AddInstallOperationsForPackage (package2, operation2);
+
+ reducedPackageOperations.Reduce ();
+
+ reducedPackageOperations
+ .Operations
+ .SingleOrDefault (o => o.Package.Id == "Test2");
+ Assert.AreEqual (2, reducedPackageOperations.Operations.Count ());
+ }
+
+ [Test]
+ public void Reduce_OnePackageOperationMatchesPackageBeingInstalledOnlyById_MatchingPackageOperationByIdIncludedInSet ()
+ {
+ CreateReducedPackageOperations ();
+ IPackage package1 = AddPackage ("Test", "1.0");
+ IPackage package2 = AddPackage ("Test2", "1.0");
+ PackageOperation operation1a = CreatePackageOperation ("Test", "1.0", PackageAction.Install);
+ PackageOperation operation1b = CreatePackageOperation ("Test2", "1.1", PackageAction.Install);
+ PackageOperation operation2 = CreatePackageOperation ("Test2", "1.0", PackageAction.Install);
+ AddInstallOperationsForPackage (package1, operation1a, operation1b);
+ AddInstallOperationsForPackage (package2, operation2);
+
+ reducedPackageOperations.Reduce ();
+
+ Assert.AreEqual (3, reducedPackageOperations.Operations.Count ());
+ }
+
+ [Test]
+ public void Reduce_OnePackageOperationMatchesPackageBeingInstalledByIdAndVersionButOneIsInstallAndOneIsUninstall_BothOperationsNotIncludedInSet ()
+ {
+ CreateReducedPackageOperations ();
+ IPackage package1 = AddPackage ("Test", "1.0");
+ IPackage package2 = AddPackage ("Test2", "1.0");
+ PackageOperation operation1a = CreatePackageOperation ("Test", "1.0", PackageAction.Install);
+ PackageOperation operation1b = CreatePackageOperation ("Test2", "1.0", PackageAction.Uninstall);
+ PackageOperation operation2 = CreatePackageOperation ("Test2", "1.0", PackageAction.Install);
+ AddInstallOperationsForPackage (package1, operation1a, operation1b);
+ AddInstallOperationsForPackage (package2, operation2);
+
+ reducedPackageOperations.Reduce ();
+
+ reducedPackageOperations
+ .Operations
+ .SingleOrDefault (o => o.Package.Id == "Test");
+ Assert.AreEqual (1, reducedPackageOperations.Operations.Count ());
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RegisteredPackageRepositoriesTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RegisteredPackageRepositoriesTests.cs
new file mode 100644
index 0000000000..1986c835e6
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RegisteredPackageRepositoriesTests.cs
@@ -0,0 +1,314 @@
+//
+// RegisteredPackageRepositoriesTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class RegisteredPackageRepositoriesTests
+ {
+ RegisteredPackageRepositories registeredRepositories;
+ OneRegisteredPackageSourceHelper packageSourcesHelper;
+ FakePackageRepositoryFactory fakeRepositoryCache;
+
+ void CreateRegisteredPackageRepositories ()
+ {
+ CreatePackageSourcesHelper ();
+ CreateRegisteredPackageRepositoriesWithExistingPackageSourcesHelper ();
+ }
+
+ void CreatePackageSourcesHelper ()
+ {
+ packageSourcesHelper = new OneRegisteredPackageSourceHelper ();
+ }
+
+ void CreateRegisteredPackageRepositoriesWithExistingPackageSourcesHelper ()
+ {
+ fakeRepositoryCache = new FakePackageRepositoryFactory ();
+ registeredRepositories = new RegisteredPackageRepositories (fakeRepositoryCache, packageSourcesHelper.Options);
+ }
+
+ [Test]
+ public void RecentPackageRepository_PropertyAccessed_ReturnsRecentPackageRepositoryFromCache ()
+ {
+ CreateRegisteredPackageRepositories ();
+ IRecentPackageRepository recentRepository = registeredRepositories.RecentPackageRepository;
+ FakeRecentPackageRepository expectedRepository = fakeRepositoryCache.FakeRecentPackageRepository;
+
+ Assert.AreEqual (expectedRepository, recentRepository);
+ }
+
+ [Test]
+ public void CreateRepository_PackageSourceSpecified_CreatesRepositoryFromCache ()
+ {
+ CreateRegisteredPackageRepositories ();
+ IPackageRepository repository = registeredRepositories.CreateRepository (new PackageSource ("a"));
+ FakePackageRepository expectedRepository = fakeRepositoryCache.FakePackageRepository;
+
+ Assert.AreEqual (expectedRepository, repository);
+ }
+
+ [Test]
+ public void CreateRepository_PackageSourceSpecified_PackageSourcePassedToCache ()
+ {
+ CreateRegisteredPackageRepositories ();
+ var source = new PackageSource ("Test");
+ registeredRepositories.CreateRepository (source);
+ string actualSource = fakeRepositoryCache.FirstPackageSourcePassedToCreateRepository;
+
+ Assert.AreEqual ("Test", actualSource);
+ }
+
+ [Test]
+ public void CreateAggregateRepository_MethodCalled_ReturnsAggregateRepositoryCreatedFromCache ()
+ {
+ CreateRegisteredPackageRepositories ();
+ IPackageRepository repository = registeredRepositories.CreateAggregateRepository ();
+ FakePackageRepository expectedRepository = fakeRepositoryCache.FakeAggregateRepository;
+
+ Assert.AreEqual (expectedRepository, repository);
+ }
+
+ [Test]
+ public void HasMultiplePackageSources_OnePackageSource_ReturnsFalse ()
+ {
+ CreateRegisteredPackageRepositories ();
+ packageSourcesHelper.AddOnePackageSource ();
+
+ bool result = registeredRepositories.HasMultiplePackageSources;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void HasMultiplePackageSources_TwoPackageSources_ReturnsTrue ()
+ {
+ CreateRegisteredPackageRepositories ();
+ packageSourcesHelper.AddTwoPackageSources ();
+
+ bool result = registeredRepositories.HasMultiplePackageSources;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void HasMultiplePackageSources_TwoPackageSourcesButOneIsDisabled_ReturnsFalse ()
+ {
+ CreateRegisteredPackageRepositories ();
+ packageSourcesHelper.AddTwoPackageSources ();
+ packageSourcesHelper.RegisteredPackageSources [0].IsEnabled = false;
+
+ bool result = registeredRepositories.HasMultiplePackageSources;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void ActivePackageSource_TwoPackageSources_ByDefaultReturnsFirstPackageSource ()
+ {
+ CreateRegisteredPackageRepositories ();
+ packageSourcesHelper.AddTwoPackageSources ();
+
+ PackageSource expectedPackageSource = packageSourcesHelper.RegisteredPackageSources [0];
+ PackageSource packageSource = registeredRepositories.ActivePackageSource;
+
+ Assert.AreEqual (expectedPackageSource, packageSource);
+ }
+
+ [Test]
+ public void ActivePackageSource_ChangedToSecondRegisteredPackageSources_ReturnsSecondPackageSource ()
+ {
+ CreateRegisteredPackageRepositories ();
+ packageSourcesHelper.AddTwoPackageSources ();
+
+ PackageSource expectedPackageSource = packageSourcesHelper.RegisteredPackageSources [1];
+ registeredRepositories.ActivePackageSource = expectedPackageSource;
+ PackageSource packageSource = registeredRepositories.ActivePackageSource;
+
+ Assert.AreEqual (expectedPackageSource, packageSource);
+ }
+
+ [Test]
+ public void ActivePackageSource_ChangedToNonNullPackageSource_SavedInOptions ()
+ {
+ CreateRegisteredPackageRepositories ();
+ packageSourcesHelper.Options.ActivePackageSource = null;
+ var packageSource = new PackageSource ("http://source-url", "Test");
+ packageSourcesHelper.Options.PackageSources.Add (packageSource);
+
+ registeredRepositories.ActivePackageSource = packageSource;
+
+ PackageSource actualPackageSource = packageSourcesHelper.Options.ActivePackageSource;
+
+ Assert.AreEqual (packageSource, actualPackageSource);
+ }
+
+ [Test]
+ public void ActivePackageSource_ActivePackageSourceNonNullInOptionsBeforeInstanceCreated_ActivePackageSourceReadFromOptions ()
+ {
+ CreatePackageSourcesHelper ();
+ var packageSource = new PackageSource ("http://source-url", "Test");
+ packageSourcesHelper.Options.PackageSources.Add (packageSource);
+ packageSourcesHelper.Options.ActivePackageSource = packageSource;
+ CreateRegisteredPackageRepositoriesWithExistingPackageSourcesHelper ();
+
+ PackageSource actualPackageSource = registeredRepositories.ActivePackageSource;
+
+ Assert.AreEqual (packageSource, actualPackageSource);
+ }
+
+ [Test]
+ public void ActiveRepository_OneRegisteredSource_RepositoryCreatedFromRegisteredSource ()
+ {
+ CreateRegisteredPackageRepositories ();
+ IPackageRepository activeRepository = registeredRepositories.ActiveRepository;
+
+ string actualPackageSource = fakeRepositoryCache.FirstPackageSourcePassedToCreateRepository;
+ PackageSource expectedPackageSource = packageSourcesHelper.PackageSource;
+
+ Assert.AreEqual (expectedPackageSource.Source, actualPackageSource);
+ }
+
+ [Test]
+ public void ActiveRepository_CalledTwice_RepositoryCreatedOnce ()
+ {
+ CreateRegisteredPackageRepositories ();
+ IPackageRepository activeRepository = registeredRepositories.ActiveRepository;
+ activeRepository = registeredRepositories.ActiveRepository;
+
+ int count = fakeRepositoryCache.PackageSourcesPassedToCreateRepository.Count;
+
+ Assert.AreEqual (1, count);
+ }
+
+ [Test]
+ public void ActiveRepository_OneRegisteredSource_ReturnsPackageCreatedFromCache ()
+ {
+ CreateRegisteredPackageRepositories ();
+ IPackageRepository activeRepository = registeredRepositories.ActiveRepository;
+
+ IPackageRepository expectedRepository = fakeRepositoryCache.FakePackageRepository;
+
+ Assert.AreEqual (expectedRepository, activeRepository);
+ }
+
+ [Test]
+ public void ActivePackageRepository_ActivePackageSourceChangedToSecondRegisteredPackageSource_CreatesRepositoryUsingSecondPackageSource ()
+ {
+ CreateRegisteredPackageRepositories ();
+ packageSourcesHelper.AddTwoPackageSources ();
+
+ PackageSource expectedPackageSource = packageSourcesHelper.Options.PackageSources [1];
+ registeredRepositories.ActivePackageSource = expectedPackageSource;
+
+ IPackageRepository repository = registeredRepositories.ActiveRepository;
+ string packageSource = fakeRepositoryCache.FirstPackageSourcePassedToCreateRepository;
+
+ Assert.AreEqual (expectedPackageSource.Source, packageSource);
+ }
+
+ [Test]
+ public void ActiveRepository_ActivePackageSourceChangedAfterActivePackageRepositoryCreated_CreatesNewRepositoryUsingActivePackageSource ()
+ {
+ CreateRegisteredPackageRepositories ();
+ packageSourcesHelper.AddTwoPackageSources ();
+
+ IPackageRepository initialRepository = registeredRepositories.ActiveRepository;
+ fakeRepositoryCache.PackageSourcesPassedToCreateRepository.Clear ();
+
+ PackageSource expectedPackageSource = packageSourcesHelper.Options.PackageSources [1];
+ registeredRepositories.ActivePackageSource = expectedPackageSource;
+
+ IPackageRepository repository = registeredRepositories.ActiveRepository;
+ string packageSource = fakeRepositoryCache.FirstPackageSourcePassedToCreateRepository;
+
+ Assert.AreEqual (expectedPackageSource.Source, packageSource);
+ }
+
+ [Test]
+ public void ActiveRepository_ActivePackageSourceSetToSameValueAfterActivePackageRepositoryCreated_NewRepositoryNotCreated ()
+ {
+ CreateRegisteredPackageRepositories ();
+ packageSourcesHelper.AddOnePackageSource ();
+
+ IPackageRepository initialRepository = registeredRepositories.ActiveRepository;
+ fakeRepositoryCache.PackageSourcesPassedToCreateRepository.Clear ();
+
+ PackageSource expectedPackageSource = packageSourcesHelper.Options.PackageSources [0];
+ registeredRepositories.ActivePackageSource = expectedPackageSource;
+
+ IPackageRepository repository = registeredRepositories.ActiveRepository;
+
+ int count = fakeRepositoryCache.PackageSourcesPassedToCreateRepository.Count;
+
+ Assert.AreEqual (0, count);
+ }
+
+ [Test]
+ public void PackageSources_OnePackageSourceInOptions_ReturnsOnePackageSource ()
+ {
+ CreateRegisteredPackageRepositories ();
+ packageSourcesHelper.AddOnePackageSource ();
+
+ RegisteredPackageSources packageSources = registeredRepositories.PackageSources;
+ RegisteredPackageSources expectedPackageSources = packageSourcesHelper.Options.PackageSources;
+
+ Assert.AreEqual (expectedPackageSources, packageSources);
+ }
+
+ [Test]
+ public void ActivePackageRepository_ActivePackageSourceIsAggregate_ReturnsAggregatePackageRepository ()
+ {
+ CreateRegisteredPackageRepositories ();
+ packageSourcesHelper.AddTwoPackageSources ();
+
+ registeredRepositories.ActivePackageSource = RegisteredPackageSourceSettings.AggregatePackageSource;
+
+ IPackageRepository repository = registeredRepositories.ActiveRepository;
+ FakePackageRepository expectedRepository = fakeRepositoryCache.FakeAggregateRepository;
+
+ Assert.AreEqual (expectedRepository, repository);
+ }
+
+ [Test]
+ public void ActivePackageSource_AllPackageSourcesCleared_ReturnsNullAndDoesNotThrowArgumentOutOfRangeException ()
+ {
+ CreateRegisteredPackageRepositories ();
+ packageSourcesHelper.Options.ActivePackageSource = null;
+ registeredRepositories.PackageSources.Clear ();
+
+ PackageSource activePackageSource = registeredRepositories.ActivePackageSource;
+
+ Assert.IsNull (activePackageSource);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RegisteredPackageSourcesViewModelTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RegisteredPackageSourcesViewModelTests.cs
new file mode 100644
index 0000000000..ac526e2fbb
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RegisteredPackageSourcesViewModelTests.cs
@@ -0,0 +1,531 @@
+//
+// RegisteredPackageSourcesViewModelTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Core;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class RegisteredPackageSourcesViewModelTests
+ {
+ RegisteredPackageSourcesViewModel viewModel;
+ List<string> propertiesChanged;
+ RegisteredPackageSources packageSources;
+ RegisteredPackageRepositories registeredRepositories;
+
+ void CreateViewModel ()
+ {
+ var properties = new Properties ();
+ var settings = new FakeSettings ();
+ var options = new PackageManagementOptions (properties, settings);
+ packageSources = options.PackageSources;
+ packageSources.Clear ();
+
+ var cache = new PackageRepositoryCache (packageSources, new RecentPackageInfo [0]);
+ registeredRepositories = new RegisteredPackageRepositories (cache, options);
+
+ viewModel = new RegisteredPackageSourcesViewModel (registeredRepositories);
+ }
+
+ void CreateViewModelWithOnePackageSource ()
+ {
+ CreateViewModel ();
+ AddPackageSourceToOptions ("Source 1", "http://url1");
+ }
+
+ void CreateViewModelWithTwoPackageSources ()
+ {
+ CreateViewModel ();
+ AddPackageSourceToOptions ("Source 1", "http://url1");
+ AddPackageSourceToOptions ("Source 2", "http://url2");
+ }
+
+ void AddPackageSourceToOptions (string name, string url)
+ {
+ var source = new PackageSource (url, name);
+ packageSources.Add (source);
+ }
+
+ void RecordPropertyChanges ()
+ {
+ propertiesChanged = new List<string> ();
+ viewModel.PropertyChanged += (sender, e) => propertiesChanged.Add (e.PropertyName);
+ }
+
+ [Test]
+ public void Constructor_InstanceCreated_NoPackageSourceViewModels ()
+ {
+ CreateViewModel ();
+
+ Assert.AreEqual (0, viewModel.PackageSourceViewModels.Count);
+ }
+
+ [Test]
+ public void Load_OptionsHasOneRegisteredPackageSource_ViewModelHasOnePackageSourceViewModel ()
+ {
+ CreateViewModelWithOnePackageSource ();
+ viewModel.Load ();
+
+ Assert.AreEqual (1, viewModel.PackageSourceViewModels.Count);
+ }
+
+ [Test]
+ public void Load_OptionsHasOneRegisteredPackageSource_ViewModelHasOnePackageSourceViewModelWithPackageSourceFromOptions ()
+ {
+ CreateViewModelWithOnePackageSource ();
+ viewModel.Load ();
+
+ var expectedSources = new PackageSource[] {
+ packageSources [0]
+ };
+
+ PackageSourceCollectionAssert.AreEqual (expectedSources, viewModel.PackageSourceViewModels);
+ }
+
+ [Test]
+ public void Load_OptionsHasTwoRegisteredPackageSources_ViewModelHasTwoPackageSourceViewModelWithPackageSourcesFromOptions ()
+ {
+ CreateViewModelWithTwoPackageSources ();
+ viewModel.Load ();
+
+ var expectedSources = new PackageSource[] {
+ packageSources [0],
+ packageSources [1]
+ };
+
+ PackageSourceCollectionAssert.AreEqual (expectedSources, viewModel.PackageSourceViewModels);
+ }
+
+ [Test]
+ public void Load_PackageSourceModifiedAfterLoadAndSaveNotCalled_RegisteredPackageSourcesInOptionsUnchanged ()
+ {
+ CreateViewModel ();
+ AddPackageSourceToOptions ("Test", "http://sharpdevelop.com");
+ viewModel.Load ();
+
+ PackageSourceViewModel packageSourceViewModel = viewModel.PackageSourceViewModels [0];
+ packageSourceViewModel.Name = "Changed-Name";
+ packageSourceViewModel.SourceUrl = "changed-url";
+
+ var expectedSources = new PackageSource[] {
+ new PackageSource ("http://sharpdevelop.com", "Test")
+ };
+
+ PackageSourceCollectionAssert.AreEqual (expectedSources, packageSources);
+ }
+
+ [Test]
+ public void Save_PackageSourceModifiedAfterLoad_RegisteredPackageSourcesInOptionsUpdated ()
+ {
+ CreateViewModel ();
+ AddPackageSourceToOptions ("Test", "http://sharpdevelop.com");
+ viewModel.Load ();
+
+ PackageSourceViewModel packageSourceViewModel = viewModel.PackageSourceViewModels [0];
+ packageSourceViewModel.Name = "Test-updated";
+ packageSourceViewModel.SourceUrl = "url-updated";
+
+ viewModel.Save ();
+
+ var expectedSources = new PackageSource[] {
+ new PackageSource ("url-updated", "Test-updated")
+ };
+
+ PackageSourceCollectionAssert.AreEqual (expectedSources, packageSources);
+ }
+
+ [Test]
+ public void Save_OnePackageSourceAddedAfterLoadAndBeforeSave_TwoRegisteredPackageSourcesInOptions ()
+ {
+ CreateViewModel ();
+ AddPackageSourceToOptions ("Test", "http://sharpdevelop.com/1");
+ viewModel.Load ();
+
+ var newSource = new PackageSource ("http://sharpdevelop.com/2", "Test");
+
+ var newPackageSourceViewModel = new PackageSourceViewModel (newSource);
+ viewModel.PackageSourceViewModels.Add (newPackageSourceViewModel);
+
+ viewModel.Save ();
+
+ var expectedSource = new PackageSource ("http://sharpdevelop.com/1", "Test");
+
+ var expectedSources = new PackageSource[] {
+ expectedSource,
+ newSource
+ };
+
+ PackageSourceCollectionAssert.AreEqual (expectedSources, packageSources);
+ }
+
+ [Test]
+ public void AddPackageSourceCommand_CommandExecuted_AddsPackageSourceToPackageSourceViewModelsCollection ()
+ {
+ CreateViewModel ();
+ viewModel.Load ();
+ viewModel.NewPackageSourceName = "Test";
+ viewModel.NewPackageSourceUrl = "http://sharpdevelop.com";
+
+ viewModel.AddPackageSourceCommand.Execute (null);
+
+ var expectedSources = new PackageSource[] {
+ new PackageSource ("http://sharpdevelop.com", "Test")
+ };
+
+ PackageSourceCollectionAssert.AreEqual (expectedSources, viewModel.PackageSourceViewModels);
+ }
+
+ [Test]
+ public void AddPackageSourceCommand_NewPackageSourceHasNameButNoUrl_CanExecuteReturnsFalse ()
+ {
+ CreateViewModel ();
+ viewModel.Load ();
+ viewModel.NewPackageSourceName = "Test";
+ viewModel.NewPackageSourceUrl = null;
+
+ bool result = viewModel.AddPackageSourceCommand.CanExecute (null);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void AddPackageSourceCommand_NewPackageSourceHasNameAndUrl_CanExecuteReturnsTrue ()
+ {
+ CreateViewModel ();
+ viewModel.Load ();
+ viewModel.NewPackageSourceName = "Test";
+ viewModel.NewPackageSourceUrl = "http://codeplex.com";
+
+ bool result = viewModel.AddPackageSourceCommand.CanExecute (null);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void AddPackageSourceCommand_NewPackageSourceHasUrlButNoName_CanExecuteReturnsFalse ()
+ {
+ CreateViewModel ();
+ viewModel.Load ();
+ viewModel.NewPackageSourceName = null;
+ viewModel.NewPackageSourceUrl = "http://codeplex.com";
+
+ bool result = viewModel.AddPackageSourceCommand.CanExecute (null);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void AddPackageSource_NoExistingPackageSources_SelectsPackageSourceViewModel ()
+ {
+ CreateViewModel ();
+ viewModel.Load ();
+ viewModel.NewPackageSourceUrl = "http://url";
+ viewModel.NewPackageSourceName = "abc";
+
+ viewModel.AddPackageSource ();
+
+ PackageSourceViewModel expectedViewModel = viewModel.PackageSourceViewModels [0];
+
+ Assert.AreEqual (expectedViewModel, viewModel.SelectedPackageSourceViewModel);
+ }
+
+ [Test]
+ public void NewPackageSourceName_Changed_NewPackageSourceNameUpdated ()
+ {
+ CreateViewModel ();
+ viewModel.Load ();
+ viewModel.NewPackageSourceName = "Test";
+
+ Assert.AreEqual ("Test", viewModel.NewPackageSourceName);
+ }
+
+ [Test]
+ public void NewPackageSourceUrl_Changed_NewPackageSourceUrlUpdated ()
+ {
+ CreateViewModel ();
+ viewModel.Load ();
+ viewModel.NewPackageSourceUrl = "Test";
+
+ Assert.AreEqual ("Test", viewModel.NewPackageSourceUrl);
+ }
+
+ [Test]
+ public void RemovePackageSourceCommand_TwoPackagesSourcesInListAndOnePackageSourceSelected_PackageSourceIsRemoved ()
+ {
+ CreateViewModelWithTwoPackageSources ();
+ viewModel.Load ();
+ viewModel.SelectedPackageSourceViewModel = viewModel.PackageSourceViewModels [0];
+
+ viewModel.RemovePackageSourceCommand.Execute (null);
+
+ var expectedSources = new PackageSource[] {
+ packageSources [1]
+ };
+
+ PackageSourceCollectionAssert.AreEqual (expectedSources, viewModel.PackageSourceViewModels);
+ }
+
+ [Test]
+ public void RemovePackageSourceCommand_NoPackageSourceSelected_CanExecuteReturnsFalse ()
+ {
+ CreateViewModel ();
+ viewModel.Load ();
+ viewModel.SelectedPackageSourceViewModel = null;
+
+ bool result = viewModel.RemovePackageSourceCommand.CanExecute (null);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void RemovePackageSourceCommand_PackageSourceSelected_CanExecuteReturnsTrue ()
+ {
+ CreateViewModelWithOnePackageSource ();
+
+ viewModel.Load ();
+ viewModel.SelectedPackageSourceViewModel = viewModel.PackageSourceViewModels [0];
+
+ bool result = viewModel.RemovePackageSourceCommand.CanExecute (null);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void SelectedPackageSourceViewModel_Changed_PropertyChangedEventFiredForCanAddPackageSource ()
+ {
+ CreateViewModelWithOnePackageSource ();
+ viewModel.Load ();
+
+ string propertyName = null;
+ viewModel.PropertyChanged += (sender, e) => propertyName = e.PropertyName;
+
+ viewModel.SelectedPackageSourceViewModel = viewModel.PackageSourceViewModels [0];
+
+ Assert.AreEqual ("CanAddPackageSource", propertyName);
+ }
+
+ [Test]
+ public void MovePackageSourceUpCommand_TwoPackagesSourcesInListAndLastPackageSourceSelected_PackageSourceIsMovedUp ()
+ {
+ CreateViewModelWithTwoPackageSources ();
+ viewModel.Load ();
+ viewModel.SelectedPackageSourceViewModel = viewModel.PackageSourceViewModels [1];
+
+ viewModel.MovePackageSourceUpCommand.Execute (null);
+
+ var expectedSources = new PackageSource[] {
+ packageSources [1],
+ packageSources [0]
+ };
+
+ PackageSourceCollectionAssert.AreEqual (expectedSources, viewModel.PackageSourceViewModels);
+ }
+
+ [Test]
+ public void MovePackageSourceUpCommand_FirstPackageSourceSelected_CanExecuteReturnsFalse ()
+ {
+ CreateViewModelWithTwoPackageSources ();
+ viewModel.Load ();
+ viewModel.SelectedPackageSourceViewModel = viewModel.PackageSourceViewModels [0];
+
+ bool result = viewModel.MovePackageSourceUpCommand.CanExecute (null);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void MovePackageSourceUpCommand_LastPackageSourceSelected_CanExecuteReturnsTrue ()
+ {
+ CreateViewModelWithTwoPackageSources ();
+ viewModel.Load ();
+ viewModel.SelectedPackageSourceViewModel = viewModel.PackageSourceViewModels [1];
+
+ bool result = viewModel.MovePackageSourceUpCommand.CanExecute (null);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void CanMovePackageSourceUp_NoPackages_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ viewModel.Load ();
+
+ bool result = viewModel.CanMovePackageSourceUp;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void MovePackageSourceDownCommand_TwoPackagesSourcesAndFirstPackageSourceSelected_PackageSourceIsMovedDown ()
+ {
+ CreateViewModelWithTwoPackageSources ();
+ viewModel.Load ();
+ viewModel.SelectedPackageSourceViewModel = viewModel.PackageSourceViewModels [0];
+
+ viewModel.MovePackageSourceDownCommand.Execute (null);
+
+ var expectedSources = new PackageSource[] {
+ packageSources [1],
+ packageSources [0]
+ };
+
+ PackageSourceCollectionAssert.AreEqual (expectedSources, viewModel.PackageSourceViewModels);
+ }
+
+ [Test]
+ public void MovePackageSourceDownCommand_TwoPackageSourcesAndLastPackageSourceSelected_CanExecuteReturnsFalse ()
+ {
+ CreateViewModelWithTwoPackageSources ();
+ viewModel.Load ();
+ viewModel.SelectedPackageSourceViewModel = viewModel.PackageSourceViewModels [1];
+
+ bool result = viewModel.MovePackageSourceDownCommand.CanExecute (null);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void MovePackageSourceDownCommand_TwoPackageSourcesAndFirstPackageSourceSelected_CanExecuteReturnsTrue ()
+ {
+ CreateViewModelWithTwoPackageSources ();
+ viewModel.Load ();
+ viewModel.SelectedPackageSourceViewModel = viewModel.PackageSourceViewModels [0];
+
+ bool result = viewModel.MovePackageSourceDownCommand.CanExecute (null);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void CanMovePackageSourceDown_NoPackageSources_ReturnFalse ()
+ {
+ CreateViewModel ();
+ viewModel.Load ();
+
+ bool result = viewModel.CanMovePackageSourceDown;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void CanMovePackageSourceDown_OnePackageSourceAndPackageSourceIsSelected_ReturnsFalse ()
+ {
+ CreateViewModelWithOnePackageSource ();
+ viewModel.Load ();
+ viewModel.SelectedPackageSourceViewModel = viewModel.PackageSourceViewModels [0];
+
+ bool result = viewModel.CanMovePackageSourceDown;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void CanMovePackageSourceDown_OnePackageSourceAndNothingIsSelected_ReturnsFalse ()
+ {
+ CreateViewModelWithOnePackageSource ();
+ viewModel.Load ();
+ viewModel.SelectedPackageSourceViewModel = null;
+
+ bool result = viewModel.CanMovePackageSourceDown;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void CanMovePackageSourceUp_OnePackageSourceAndNothingIsSelected_ReturnsFalse ()
+ {
+ CreateViewModelWithOnePackageSource ();
+ viewModel.Load ();
+ viewModel.SelectedPackageSourceViewModel = null;
+
+ bool result = viewModel.CanMovePackageSourceUp;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void CanMovePackageSourceUp_TwoPackageSourcesAndNothingIsSelected_ReturnsFalse ()
+ {
+ CreateViewModelWithTwoPackageSources ();
+ viewModel.Load ();
+ viewModel.SelectedPackageSourceViewModel = null;
+
+ bool result = viewModel.CanMovePackageSourceUp;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void CanMovePackageSourceDown_TwoPackageSourcesAndNothingIsSelected_ReturnsFalse ()
+ {
+ CreateViewModelWithTwoPackageSources ();
+ viewModel.Load ();
+ viewModel.SelectedPackageSourceViewModel = null;
+
+ bool result = viewModel.CanMovePackageSourceDown;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void SelectedPackageSourceViewModel_PropertyChanged_FiresPropertyChangedEvent ()
+ {
+ CreateViewModelWithOnePackageSource ();
+ viewModel.Load ();
+ viewModel.SelectedPackageSourceViewModel = viewModel.PackageSourceViewModels [0];
+
+ List<string> propertyNames = new List<string> ();
+ viewModel.PropertyChanged += (sender, e) => propertyNames.Add (e.PropertyName);
+ viewModel.SelectedPackageSourceViewModel = null;
+
+ Assert.IsTrue (propertyNames.Contains ("SelectedPackageSourceViewModel"));
+ }
+
+ [Test]
+ public void AddPackageSource_OneExistingPackageSources_FiresPropertyChangedEventForSelectedPackageSource ()
+ {
+ CreateViewModelWithOnePackageSource ();
+ viewModel.Load ();
+ viewModel.SelectedPackageSourceViewModel = viewModel.PackageSourceViewModels [0];
+ viewModel.NewPackageSourceUrl = "http://url";
+ viewModel.NewPackageSourceName = "Test";
+
+ List<string> propertyNames = new List<string> ();
+ viewModel.PropertyChanged += (sender, e) => propertyNames.Add (e.PropertyName);
+ viewModel.AddPackageSource ();
+
+ Assert.IsTrue (propertyNames.Contains ("SelectedPackageSourceViewModel"));
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/SolutionPackageRepositoryPathTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/SolutionPackageRepositoryPathTests.cs
new file mode 100644
index 0000000000..10c5316833
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/SolutionPackageRepositoryPathTests.cs
@@ -0,0 +1,117 @@
+//
+// SolutionPackageRepositoryPathTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement;
+using NUnit.Framework;
+using MonoDevelop.Core;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class SolutionPackageRepositoryPathTests
+ {
+ SolutionPackageRepositoryPath repositoryPath;
+ FakeProject project;
+ PackageManagementOptions options;
+ FakeSolution solution;
+
+ void CreateSolutionPackageRepositoryPath ()
+ {
+ repositoryPath = new SolutionPackageRepositoryPath (project, options);
+ }
+
+ void CreateSolutionPackageRepositoryPath (ISolution solution)
+ {
+ repositoryPath = new SolutionPackageRepositoryPath (solution, options);
+ }
+
+ void CreateTestProject ()
+ {
+ project = new FakeProject ();
+ }
+
+ void CreateSolution (string fileName)
+ {
+ solution = new FakeSolution (fileName);
+ }
+
+ void CreateOptions ()
+ {
+ options = new TestablePackageManagementOptions ();
+ }
+
+ [Test]
+ public void PackageRepositoryPath_ProjectAndSolutionHaveDifferentFolders_IsConfiguredPackagesFolderInsideSolutionFolder ()
+ {
+ CreateOptions ();
+ CreateTestProject ();
+ CreateSolution (@"d:\projects\MyProject\MySolution.sln");
+ solution.BaseDirectory = @"d:\projects\MyProject\".ToNativePath ();
+ project.ParentSolution = solution;
+ options.PackagesDirectory = "MyPackages";
+ CreateSolutionPackageRepositoryPath ();
+
+ string path = repositoryPath.PackageRepositoryPath;
+ string expectedPath = @"d:\projects\MyProject\MyPackages".ToNativePath ();
+
+ Assert.AreEqual (expectedPath, path);
+ }
+
+ [Test]
+ public void PackageRepositoryPath_PassSolutionToConstructor_IsConfiguredPackagesFolderInsideSolutionFolder ()
+ {
+ CreateOptions ();
+ CreateSolution (@"d:\projects\MySolution\MySolution.sln");
+ options.PackagesDirectory = "Packages";
+ CreateSolutionPackageRepositoryPath (solution);
+
+ string path = repositoryPath.PackageRepositoryPath;
+ string expectedPath = @"d:\projects\MySolution\Packages".ToNativePath ();
+
+ Assert.AreEqual (expectedPath, path);
+ }
+
+ [Test]
+ public void GetInstallPath_GetInstallPathForPackage_ReturnsPackagePathInsideSolutionPackagesRepository ()
+ {
+ CreateOptions ();
+ CreateSolution (@"d:\projects\Test\MySolution\MyProject.sln");
+ options.PackagesDirectory = "MyPackages";
+ CreateSolutionPackageRepositoryPath (solution);
+
+ var package = FakePackage.CreatePackageWithVersion ("MyPackage", "1.2.1.40");
+
+ string installPath = repositoryPath.GetInstallPath (package);
+
+ string expectedInstallPath =
+ @"d:\projects\Test\MySolution\MyPackages\MyPackage.1.2.1.40".ToNativePath ();
+
+ Assert.AreEqual (expectedInstallPath, installPath);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/SolutionPackageRepositoryTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/SolutionPackageRepositoryTests.cs
new file mode 100644
index 0000000000..6e0d17e198
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/SolutionPackageRepositoryTests.cs
@@ -0,0 +1,247 @@
+//
+// SolutionPackageRepositoryTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class SolutionPackageRepositoryTests
+ {
+ SolutionPackageRepository repository;
+ TestablePackageManagementOptions options;
+ FakeSolution solution;
+ FakePackageRepositoryFactory fakeRepositoryFactory;
+ FakeSharedPackageRepository fakeSharedRepository;
+
+ void CreateSolution (string fileName)
+ {
+ solution = new FakeSolution (fileName);
+ }
+
+ void CreateFakeRepositoryFactory ()
+ {
+ fakeRepositoryFactory = new FakePackageRepositoryFactory ();
+ fakeSharedRepository = fakeRepositoryFactory.FakeSharedRepository;
+ }
+
+ void CreateOptions ()
+ {
+ options = new TestablePackageManagementOptions ();
+ }
+
+ void CreateRepository (ISolution solution, TestablePackageManagementOptions options)
+ {
+ CreateFakeRepositoryFactory ();
+ repository = new SolutionPackageRepository (solution, fakeRepositoryFactory, options);
+ }
+
+ void CreateRepository (ISolution solution)
+ {
+ CreateOptions ();
+ CreateRepository (solution, options);
+ }
+
+ void CreateRepository ()
+ {
+ CreateSolution (@"d:\projects\test\myproject\myproject.sln");
+ CreateRepository (solution);
+ }
+
+ FakePackage AddPackageToSharedRepository (string packageId)
+ {
+ FakeSharedPackageRepository sharedRepository = fakeRepositoryFactory.FakeSharedRepository;
+ return sharedRepository.AddFakePackage (packageId);
+ }
+
+ FakePackage AddPackageToSharedRepository (string packageId, string version)
+ {
+ FakeSharedPackageRepository sharedRepository = fakeRepositoryFactory.FakeSharedRepository;
+ return sharedRepository.AddFakePackageWithVersion (packageId, version);
+ }
+
+ [Test]
+ public void GetInstallPath_GetInstallPathForPackage_ReturnsPackagePathInsideSolutionPackagesRepository ()
+ {
+ CreateSolution (@"d:\projects\Test\MySolution\MyProject.sln");
+ CreateOptions ();
+ options.PackagesDirectory = "MyPackages";
+ CreateRepository (solution, options);
+
+ var package = FakePackage.CreatePackageWithVersion ("MyPackage", "1.0.1.40");
+
+ string installPath = repository.GetInstallPath (package);
+
+ string expectedInstallPath =
+ @"d:\projects\Test\MySolution\MyPackages\MyPackage.1.0.1.40".ToNativePath ();
+
+ Assert.AreEqual (expectedInstallPath, installPath);
+ }
+
+ [Test]
+ public void GetPackagesByDependencyOrder_OnePackageInSharedRepository_ReturnsOnePackage ()
+ {
+ CreateRepository ();
+ AddPackageToSharedRepository ("Test");
+
+ List<FakePackage> expectedPackages = fakeSharedRepository.FakePackages;
+
+ List<IPackage> actualPackages = repository.GetPackagesByDependencyOrder ().ToList ();
+
+ PackageCollectionAssert.AreEqual (expectedPackages, actualPackages);
+ }
+
+ [Test]
+ public void GetPackagesByDependencyOrder_OnePackageInSharedRepository_SharedRepositoryCreatedWithPathResolverForSolutionPackagesFolder ()
+ {
+ CreateSolution (@"d:\projects\myproject\myproject.sln");
+ CreateRepository (solution);
+ FakePackage package = AddPackageToSharedRepository ("Test", "1.0");
+
+ repository.GetPackagesByDependencyOrder ().ToList ();
+
+ IPackagePathResolver pathResolver = fakeRepositoryFactory.PathResolverPassedToCreateSharedRepository;
+ string installPath = pathResolver.GetInstallPath (package);
+
+ string expectedInstallPath = @"d:\projects\myproject\packages\Test.1.0".ToNativePath ();
+
+ Assert.AreEqual (expectedInstallPath, installPath);
+ }
+
+ [Test]
+ public void Constructor_CreateInstance_SharedRepositoryCreatedWithFileSystemForSolutionPackagesFolder ()
+ {
+ CreateSolution (@"d:\projects\myproject\myproject.sln");
+ CreateRepository (solution);
+
+ IFileSystem fileSystem = fakeRepositoryFactory.FileSystemPassedToCreateSharedRepository;
+ string rootPath = fileSystem.Root;
+
+ string expectedRootPath = @"d:\projects\myproject\packages".ToNativePath ();
+
+ Assert.AreEqual (expectedRootPath, rootPath);
+ }
+
+ [Test]
+ public void Constructor_CreateInstance_SharedRepositoryCreatedWithConfigSettingsFileSystemForSolutionNuGetFolder ()
+ {
+ CreateSolution (@"d:\projects\myproject\myproject.sln");
+ CreateRepository (solution);
+
+ IFileSystem fileSystem = fakeRepositoryFactory.ConfigSettingsFileSystemPassedToCreateSharedRepository;
+ string rootPath = fileSystem.Root;
+
+ string expectedRootPath = @"d:\projects\myproject\.nuget".ToNativePath ();
+
+ Assert.AreEqual (expectedRootPath, rootPath);
+ }
+
+ [Test]
+ public void GetPackagesByDependencyOrder_TwoPackagesInSharedRepositoryFirstPackageDependsOnSecond_ReturnsSecondPackageFirst ()
+ {
+ CreateSolution (@"d:\projects\myproject\myproject.sln");
+ CreateRepository (solution);
+ FakePackage firstPackage = AddPackageToSharedRepository ("First");
+ firstPackage.AddDependency ("Second");
+ FakePackage secondPackage = AddPackageToSharedRepository ("Second");
+
+ List<IPackage> actualPackages = repository.GetPackagesByDependencyOrder ().ToList ();
+
+ var expectedPackages = new IPackage[] {
+ secondPackage,
+ firstPackage
+ };
+
+ Assert.AreEqual (expectedPackages, actualPackages);
+ }
+
+ [Test]
+ public void GetPackagesByReverseDependencyOrder_TwoPackagesInSharedRepositorySecondPackageDependsOnFirst_ReturnsSecondPackageFirst ()
+ {
+ CreateSolution (@"d:\projects\myproject\myproject.sln");
+ CreateRepository (solution);
+ FakePackage firstPackage = AddPackageToSharedRepository ("First");
+ FakePackage secondPackage = AddPackageToSharedRepository ("Second");
+ secondPackage.AddDependency ("First");
+
+ List<IPackage> actualPackages = repository.GetPackagesByReverseDependencyOrder ().ToList ();
+
+ var expectedPackages = new IPackage[] {
+ secondPackage,
+ firstPackage
+ };
+
+ Assert.AreEqual (expectedPackages, actualPackages);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIsInSharedRepository_ReturnsTrue ()
+ {
+ CreateSolution (@"d:\projects\myproject\myproject.sln");
+ CreateRepository (solution);
+ FakePackage firstPackage = AddPackageToSharedRepository ("First");
+
+ bool installed = repository.IsInstalled (firstPackage);
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIsNotInSharedRepository_ReturnsFalse ()
+ {
+ CreateSolution (@"d:\projects\myproject\myproject.sln");
+ CreateRepository (solution);
+ FakePackage testPackage = new FakePackage ("Test");
+
+ bool installed = repository.IsInstalled (testPackage);
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void GetPackages_OnePackageIsInSharedRepository_ReturnsOnePackage ()
+ {
+ CreateSolution (@"d:\projects\myproject\myproject.sln");
+ CreateRepository (solution);
+ FakePackage firstPackage = AddPackageToSharedRepository ("First");
+
+ IQueryable<IPackage> packages = repository.GetPackages ();
+
+ var expectedPackages = new FakePackage[] {
+ firstPackage
+ };
+
+ PackageCollectionAssert.AreEqual (expectedPackages, packages);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ThreadSafePackageManagementEventsTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ThreadSafePackageManagementEventsTests.cs
new file mode 100644
index 0000000000..42810f1dac
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ThreadSafePackageManagementEventsTests.cs
@@ -0,0 +1,607 @@
+//
+// ThreadSafePackageManagementEventsTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NuGet;
+using NUnit.Framework;
+using MonoDevelop.Ide;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class ThreadSafePackageManagementEventsTests
+ {
+ ThreadSafePackageManagementEvents threadSafeEvents;
+ PackageManagementEvents unsafeEvents;
+ bool eventHandlerFired;
+ bool isGuiSyncDispatchCalled;
+
+ void CreateEvents ()
+ {
+ isGuiSyncDispatchCalled = false;
+ unsafeEvents = new PackageManagementEvents ();
+ threadSafeEvents = new ThreadSafePackageManagementEvents (unsafeEvents, RunGuiSyncDispatch);
+ }
+
+ void RunGuiSyncDispatch (MessageHandler messageHandler)
+ {
+ isGuiSyncDispatchCalled = true;
+ messageHandler.Invoke ();
+ }
+
+ void OnEventHandlerFired (object sender, EventArgs e)
+ {
+ eventHandlerFired = true;
+ }
+
+ [Test]
+ public void OnPackageOperationsStarting_NoInvokeRequired_NonThreadSafePackageOperationsStartingMethodCalled ()
+ {
+ CreateEvents ();
+ bool called = false;
+ unsafeEvents.PackageOperationsStarting += (sender, e) => called = true;
+ threadSafeEvents.OnPackageOperationsStarting ();
+
+ Assert.IsTrue (called);
+ }
+
+ [Test]
+ public void OnPackageOperationError_NoInvokeRequired_NonThreadSafeOnPackageOperationErrorMethodCalled ()
+ {
+ CreateEvents ();
+ Exception exception = null;
+ unsafeEvents.PackageOperationError += (sender, e) => exception = e.Exception;
+ var expectedException = new Exception ("test");
+
+ threadSafeEvents.OnPackageOperationError (expectedException);
+
+ Assert.AreEqual (expectedException, exception);
+ }
+
+ [Test]
+ public void OnAcceptLicenses_NoInvokeRequired_NonThreadSafeOnAcceptLicensesMethodCalled ()
+ {
+ CreateEvents ();
+ IEnumerable<IPackage> packages = null;
+ unsafeEvents.AcceptLicenses += (sender, e) => packages = e.Packages;
+ var expectedPackages = new List<IPackage> ();
+
+ threadSafeEvents.OnAcceptLicenses (expectedPackages);
+
+ Assert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void OnAcceptLicenses_NoInvokeRequired_NonThreadSafeOnAcceptLicensesMethodCalledAndReturnsResult ()
+ {
+ CreateEvents ();
+ unsafeEvents.AcceptLicenses += (sender, e) => e.IsAccepted = false;
+
+ bool result = threadSafeEvents.OnAcceptLicenses (null);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void OnParentPackageInstalled_NoInvokeRequired_NonThreadSafeOnParentPackageInstalledMethodCalled ()
+ {
+ CreateEvents ();
+ IPackage package = null;
+ IPackageManagementProject project = null;
+ unsafeEvents.ParentPackageInstalled += (sender, e) => {
+ package = e.Package;
+ project = e.Project;
+ };
+ var expectedPackage = new FakePackage ();
+ var expectedProject = new FakePackageManagementProject ();
+
+ threadSafeEvents.OnParentPackageInstalled (expectedPackage, expectedProject);
+
+ Assert.AreEqual (expectedPackage, package);
+ }
+
+ [Test]
+ public void OnParentPackageUninstalled_NoInvokeRequired_NonThreadSafeOnParentPackageUninstalledMethodCalled ()
+ {
+ CreateEvents ();
+ IPackage package = null;
+ IPackageManagementProject project = null;
+ unsafeEvents.ParentPackageUninstalled += (sender, e) => {
+ package = e.Package;
+ project = e.Project;
+ };
+ var expectedPackage = new FakePackage ();
+ var expectedProject = new FakePackageManagementProject ();
+
+ threadSafeEvents.OnParentPackageUninstalled (expectedPackage, expectedProject);
+
+ Assert.AreEqual (expectedPackage, package);
+ }
+
+ [Test]
+ public void OnPackageOperationMessageLogged_NoInvokeRequired_NonThreadSafeOnPackageOperationMessageLoggedMethodCalled ()
+ {
+ CreateEvents ();
+ MessageLevel actualLevel = MessageLevel.Debug;
+ string actualMessage = null;
+ unsafeEvents.PackageOperationMessageLogged += (sender, e) => {
+ actualLevel = e.Message.Level;
+ actualMessage = e.Message.ToString ();
+ };
+
+ var messageLevel = MessageLevel.Warning;
+ string message = "abc {0}";
+ string arg = "test";
+ threadSafeEvents.OnPackageOperationMessageLogged (messageLevel, message, arg);
+
+ Assert.AreEqual (messageLevel, actualLevel);
+ Assert.AreEqual ("abc test", actualMessage);
+ }
+
+ [Test]
+ public void AcceptLicenses_UnsafeEventFired_ThreadSafeEventFired ()
+ {
+ CreateEvents ();
+ bool fired = false;
+ threadSafeEvents.AcceptLicenses += (sender, e) => fired = true;
+ unsafeEvents.OnAcceptLicenses (null);
+
+ Assert.IsTrue (fired);
+ }
+
+ [Test]
+ public void AcceptLicenses_UnsafeEventFiredAfterEventHandlerRemoved_ThreadSafeEventIsNotFired ()
+ {
+ CreateEvents ();
+ eventHandlerFired = false;
+ threadSafeEvents.AcceptLicenses += OnEventHandlerFired;
+ threadSafeEvents.AcceptLicenses -= OnEventHandlerFired;
+ unsafeEvents.OnAcceptLicenses (null);
+
+ Assert.IsFalse (eventHandlerFired);
+ }
+
+ [Test]
+ public void PackageOperationsStarting_UnsafeEventFired_ThreadSafeEventFired ()
+ {
+ CreateEvents ();
+ bool fired = false;
+ threadSafeEvents.PackageOperationsStarting += (sender, e) => fired = true;
+ unsafeEvents.OnPackageOperationsStarting ();
+
+ Assert.IsTrue (fired);
+ }
+
+ [Test]
+ public void PackageOperationsStarting_UnsafeEventFiredAndInvokeRequired_ThreadSafeEventIsSafelyInvoked ()
+ {
+ CreateEvents ();
+ threadSafeEvents.PackageOperationsStarting += OnEventHandlerFired;
+ unsafeEvents.OnPackageOperationsStarting ();
+
+ Assert.IsTrue (isGuiSyncDispatchCalled);
+ }
+
+ [Test]
+ public void PackageOperationsStarting_UnsafeEventFiredAndInvokeRequiredButNoEventHandlerRegistered_ThreadSafeEventIsNotInvoked ()
+ {
+ CreateEvents ();
+ unsafeEvents.OnPackageOperationsStarting ();
+
+ Assert.IsFalse (isGuiSyncDispatchCalled);
+ }
+
+ [Test]
+ public void PackageOperationsStarting_UnsafeEventFiredAfterEventHandlerRemoved_ThreadSafeEventIsNotFired ()
+ {
+ CreateEvents ();
+ eventHandlerFired = false;
+ threadSafeEvents.PackageOperationsStarting += OnEventHandlerFired;
+ threadSafeEvents.PackageOperationsStarting -= OnEventHandlerFired;
+ unsafeEvents.OnPackageOperationsStarting ();
+
+ Assert.IsFalse (eventHandlerFired);
+ }
+
+ [Test]
+ public void PackageOperationError_UnsafeEventFired_ThreadSafeEventFired ()
+ {
+ CreateEvents ();
+ bool fired = false;
+ threadSafeEvents.PackageOperationError += (sender, e) => fired = true;
+ unsafeEvents.OnPackageOperationError (new Exception ());
+
+ Assert.IsTrue (fired);
+ }
+
+ [Test]
+ public void PackageOperationError_UnsafeEventFiredAndInvokeRequired_ThreadSafeEventIsSafelyInvoked ()
+ {
+ CreateEvents ();
+ threadSafeEvents.PackageOperationError += OnEventHandlerFired;
+ var expectedException = new Exception ("Test");
+
+ unsafeEvents.OnPackageOperationError (expectedException);
+
+ Assert.IsTrue (isGuiSyncDispatchCalled);
+ }
+
+ [Test]
+ public void PackageOperationError_UnsafeEventFiredAndInvokeRequiredButNoEventHandlerRegistered_ThreadSafeEventIsNotInvoked ()
+ {
+ CreateEvents ();
+ unsafeEvents.OnPackageOperationError (new Exception ());
+
+ Assert.IsFalse (isGuiSyncDispatchCalled);
+ }
+
+ [Test]
+ public void PackageOperationError_UnsafeEventFiredAfterEventHandlerRemoved_ThreadSafeEventIsNotFired ()
+ {
+ CreateEvents ();
+ eventHandlerFired = false;
+ threadSafeEvents.PackageOperationError += OnEventHandlerFired;
+ threadSafeEvents.PackageOperationError -= OnEventHandlerFired;
+ unsafeEvents.OnPackageOperationError (new Exception ());
+
+ Assert.IsFalse (eventHandlerFired);
+ }
+
+ [Test]
+ public void ParentPackageInstalled_UnsafeEventFired_ThreadSafeEventFired ()
+ {
+ CreateEvents ();
+ bool fired = false;
+ threadSafeEvents.ParentPackageInstalled += (sender, e) => fired = true;
+ unsafeEvents.OnParentPackageInstalled (null, null);
+
+ Assert.IsTrue (fired);
+ }
+
+ [Test]
+ public void ParentPackageInstalled_UnsafeEventFiredAndInvokeRequired_ThreadSafeEventIsSafelyInvoked ()
+ {
+ CreateEvents ();
+ threadSafeEvents.ParentPackageInstalled += OnEventHandlerFired;
+ var expectedPackage = new FakePackage ();
+
+ unsafeEvents.OnParentPackageInstalled (expectedPackage, null);
+
+ Assert.IsTrue (isGuiSyncDispatchCalled);
+ }
+
+ [Test]
+ public void ParentPackageInstalled_UnsafeEventFiredAndInvokeRequiredButNoEventHandlerRegistered_ThreadSafeEventIsNotInvoked ()
+ {
+ CreateEvents ();
+ unsafeEvents.OnParentPackageInstalled (new FakePackage (), null);
+
+ Assert.IsFalse (isGuiSyncDispatchCalled);
+ }
+
+ [Test]
+ public void ParentPackageInstalled_UnsafeEventFiredAfterEventHandlerRemoved_ThreadSafeEventIsNotFired ()
+ {
+ CreateEvents ();
+ eventHandlerFired = false;
+ threadSafeEvents.ParentPackageInstalled += OnEventHandlerFired;
+ threadSafeEvents.ParentPackageInstalled -= OnEventHandlerFired;
+ unsafeEvents.OnParentPackageInstalled (null, null);
+
+ Assert.IsFalse (eventHandlerFired);
+ }
+
+ [Test]
+ public void ParentPackageUninstalled_UnsafeEventFired_ThreadSafeEventFired ()
+ {
+ CreateEvents ();
+ bool fired = false;
+ threadSafeEvents.ParentPackageUninstalled += (sender, e) => fired = true;
+ unsafeEvents.OnParentPackageUninstalled (null, null);
+
+ Assert.IsTrue (fired);
+ }
+
+ [Test]
+ public void ParentPackageUninstalled_UnsafeEventFiredAndInvokeRequired_ThreadSafeEventIsSafelyInvoked ()
+ {
+ CreateEvents ();
+ threadSafeEvents.ParentPackageUninstalled += OnEventHandlerFired;
+ var expectedPackage = new FakePackage ();
+
+ unsafeEvents.OnParentPackageUninstalled (expectedPackage, null);
+
+ Assert.IsTrue (isGuiSyncDispatchCalled);
+ }
+
+ [Test]
+ public void ParentPackageUninstalled_UnsafeEventFiredAndInvokeRequiredButNoEventHandlerRegistered_ThreadSafeEventIsNotInvoked ()
+ {
+ CreateEvents ();
+ unsafeEvents.OnParentPackageUninstalled (new FakePackage (), null);
+
+ Assert.IsFalse (isGuiSyncDispatchCalled);
+ }
+
+ [Test]
+ public void ParentPackageUninstalled_UnsafeEventFiredAfterEventHandlerRemoved_ThreadSafeEventIsNotFired ()
+ {
+ CreateEvents ();
+ eventHandlerFired = false;
+ threadSafeEvents.ParentPackageUninstalled += OnEventHandlerFired;
+ threadSafeEvents.ParentPackageUninstalled -= OnEventHandlerFired;
+ unsafeEvents.OnParentPackageUninstalled (null, null);
+
+ Assert.IsFalse (eventHandlerFired);
+ }
+
+ [Test]
+ public void PackageOperationMessageLogged_UnsafeEventFired_ThreadSafeEventFired ()
+ {
+ CreateEvents ();
+ bool fired = false;
+ threadSafeEvents.PackageOperationMessageLogged += (sender, e) => fired = true;
+ unsafeEvents.OnPackageOperationMessageLogged (MessageLevel.Info, String.Empty, new object[0]);
+
+ Assert.IsTrue (fired);
+ }
+
+ [Test]
+ public void PackageOperationMessageLogged_UnsafeEventFiredAfterEventHandlerRemoved_ThreadSafeEventIsNotFired ()
+ {
+ CreateEvents ();
+ eventHandlerFired = false;
+ threadSafeEvents.PackageOperationMessageLogged += OnEventHandlerFired;
+ threadSafeEvents.PackageOperationMessageLogged -= OnEventHandlerFired;
+ unsafeEvents.OnPackageOperationMessageLogged (MessageLevel.Info, String.Empty, new object[0]);
+
+ Assert.IsFalse (eventHandlerFired);
+ }
+
+ [Test]
+ public void Dispose_PackageOperationsStartingHandlerExistsAndThreadUnsafeEventFiredAfterDispose_ThreadSafeEventIsNotFired ()
+ {
+ CreateEvents ();
+ eventHandlerFired = false;
+ threadSafeEvents.PackageOperationsStarting += OnEventHandlerFired;
+
+ threadSafeEvents.Dispose ();
+ unsafeEvents.OnPackageOperationsStarting ();
+
+ Assert.IsFalse (eventHandlerFired);
+ }
+
+ [Test]
+ public void Dispose_PackageOperationErrorHandlerExistsAndThreadUnsafeEventFiredAfterDispose_ThreadSafeEventIsNotFired ()
+ {
+ CreateEvents ();
+ eventHandlerFired = false;
+ threadSafeEvents.PackageOperationError += OnEventHandlerFired;
+
+ threadSafeEvents.Dispose ();
+ unsafeEvents.OnPackageOperationError (new Exception ());
+
+ Assert.IsFalse (eventHandlerFired);
+ }
+
+ [Test]
+ public void Dispose_ParentPackageInstalledHandlerExistsAndThreadUnsafeEventFiredAfterDispose_ThreadSafeEventIsNotFired ()
+ {
+ CreateEvents ();
+ eventHandlerFired = false;
+ threadSafeEvents.ParentPackageInstalled += OnEventHandlerFired;
+
+ threadSafeEvents.Dispose ();
+ unsafeEvents.OnParentPackageInstalled (new FakePackage (), null);
+
+ Assert.IsFalse (eventHandlerFired);
+ }
+
+ [Test]
+ public void Dispose_ParentParentPackageUninstalledHandlerExistsAndThreadUnsafeEventFiredAfterDispose_ThreadSafeEventIsNotFired ()
+ {
+ CreateEvents ();
+ eventHandlerFired = false;
+ threadSafeEvents.ParentPackageUninstalled += OnEventHandlerFired;
+
+ threadSafeEvents.Dispose ();
+ unsafeEvents.OnParentPackageUninstalled (new FakePackage (), null);
+
+ Assert.IsFalse (eventHandlerFired);
+ }
+
+ [Test]
+ public void OnSelectProjects_NoInvokeRequired_NonThreadSafeOnSelectProjectsMethodCalled ()
+ {
+ CreateEvents ();
+ IEnumerable<IPackageManagementSelectedProject> selectedProjects = null;
+ unsafeEvents.SelectProjects += (sender, e) => selectedProjects = e.SelectedProjects;
+ var expectedSelectedProjects = new List<IPackageManagementSelectedProject> ();
+
+ threadSafeEvents.OnSelectProjects (expectedSelectedProjects);
+
+ Assert.AreEqual (expectedSelectedProjects, selectedProjects);
+ }
+
+ [Test]
+ public void OnSelectLicenses_NoInvokeRequired_NonThreadSafeOnSelectProjectsMethodCalledAndReturnsResult ()
+ {
+ CreateEvents ();
+ unsafeEvents.SelectProjects += (sender, e) => e.IsAccepted = true;
+ var projects = new List<IPackageManagementSelectedProject> ();
+ bool result = threadSafeEvents.OnSelectProjects (projects);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void SelectProjects_UnsafeEventFired_ThreadSafeEventFired ()
+ {
+ CreateEvents ();
+ bool fired = false;
+ threadSafeEvents.SelectProjects += (sender, e) => fired = true;
+ var projects = new List<IPackageManagementSelectedProject> ();
+ unsafeEvents.OnSelectProjects (projects);
+
+ Assert.IsTrue (fired);
+ }
+
+ [Test]
+ public void SelectProjects_UnsafeEventFiredAfterEventHandlerRemoved_ThreadSafeEventIsNotFired ()
+ {
+ CreateEvents ();
+ eventHandlerFired = false;
+ threadSafeEvents.SelectProjects += OnEventHandlerFired;
+ threadSafeEvents.SelectProjects -= OnEventHandlerFired;
+ var projects = new List<IPackageManagementSelectedProject> ();
+ unsafeEvents.OnSelectProjects (projects);
+
+ Assert.IsFalse (eventHandlerFired);
+ }
+
+ [Test]
+ public void OnResolveFileConflict_NoInvokeRequired_NonThreadSafeOnResolveFileConflictMethodCalledWithMessage ()
+ {
+ CreateEvents ();
+ string message = null;
+ unsafeEvents.ResolveFileConflict += (sender, e) => message = e.Message.ToString ();
+
+ threadSafeEvents.OnResolveFileConflict ("message");
+
+ Assert.AreEqual ("message", message);
+ }
+
+ [Test]
+ public void OnResolveFileConflict_NoInvokeRequired_ValueReturnedFromNonThreadSafeOnResolveFileConflict ()
+ {
+ CreateEvents ();
+ unsafeEvents.ResolveFileConflict += (sender, e) => {
+ e.Resolution = FileConflictResolution.OverwriteAll;
+ };
+
+ FileConflictResolution result = threadSafeEvents.OnResolveFileConflict ("message");
+
+ Assert.AreEqual (FileConflictResolution.OverwriteAll, result);
+ }
+
+ [Test]
+ public void OnResolveFileConflict_UnsafeEventFired_ThreadSafeEventFired ()
+ {
+ CreateEvents ();
+ bool fired = false;
+ threadSafeEvents.ResolveFileConflict += (sender, e) => fired = true;
+ unsafeEvents.OnResolveFileConflict ("message");
+
+ Assert.IsTrue (fired);
+ }
+
+ [Test]
+ public void ResolveFileConflict_UnsafeEventFired_ThreadSafeEventFired ()
+ {
+ CreateEvents ();
+ bool fired = false;
+ threadSafeEvents.ResolveFileConflict += (sender, e) => fired = true;
+ unsafeEvents.OnResolveFileConflict ("message");
+
+ Assert.IsTrue (fired);
+ }
+
+ [Test]
+ public void ResolveFileConflict_UnsafeEventFiredAfterEventHandlerRemoved_ThreadSafeEventIsNotFired ()
+ {
+ CreateEvents ();
+ eventHandlerFired = false;
+ threadSafeEvents.ResolveFileConflict += OnEventHandlerFired;
+ threadSafeEvents.ResolveFileConflict -= OnEventHandlerFired;
+ unsafeEvents.OnResolveFileConflict ("message");
+
+ Assert.IsFalse (eventHandlerFired);
+ }
+
+ [Test]
+ public void OnParentPackagesUpdated_NoInvokeRequired_NonThreadSafeOnParentPackagesUpdatedMethodCalled ()
+ {
+ CreateEvents ();
+ IEnumerable<IPackage> packages = null;
+ unsafeEvents.ParentPackagesUpdated += (sender, e) => packages = e.Packages;
+ var expectedPackages = new FakePackage[] { new FakePackage () };
+
+ threadSafeEvents.OnParentPackagesUpdated (expectedPackages);
+
+ Assert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void ParentPackagesUpdated_UnsafeEventFired_ThreadSafeEventFired ()
+ {
+ CreateEvents ();
+ bool fired = false;
+ threadSafeEvents.ParentPackagesUpdated += (sender, e) => fired = true;
+ unsafeEvents.OnParentPackagesUpdated (null);
+
+ Assert.IsTrue (fired);
+ }
+
+ [Test]
+ public void ParentPackagesUpdated_UnsafeEventFiredAndInvokeRequired_ThreadSafeEventIsSafelyInvoked ()
+ {
+ CreateEvents ();
+ threadSafeEvents.ParentPackagesUpdated += OnEventHandlerFired;
+ var expectedPackages = new FakePackage[] { new FakePackage () };
+
+ unsafeEvents.OnParentPackagesUpdated (expectedPackages);
+
+ Assert.IsTrue (isGuiSyncDispatchCalled);
+ }
+
+ [Test]
+ public void ParentPackagesUpdated_UnsafeEventFiredAndInvokeRequiredButNoEventHandlerRegistered_ThreadSafeEventIsNotInvoked ()
+ {
+ CreateEvents ();
+ var packages = new FakePackage[] { new FakePackage () };
+ unsafeEvents.OnParentPackagesUpdated (packages);
+
+ Assert.IsFalse (isGuiSyncDispatchCalled);
+ }
+
+ [Test]
+ public void Dispose_ParentPackagesUpdatedHandlerExistsAndThreadUnsafeEventFiredAfterDispose_ThreadSafeEventIsNotFired ()
+ {
+ CreateEvents ();
+ eventHandlerFired = false;
+ threadSafeEvents.ParentPackagesUpdated += OnEventHandlerFired;
+ threadSafeEvents.Dispose ();
+
+ unsafeEvents.OnParentPackagesUpdated (new FakePackage[0]);
+
+ Assert.IsFalse (eventHandlerFired);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UninstallPackageActionTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UninstallPackageActionTests.cs
new file mode 100644
index 0000000000..885c10c377
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UninstallPackageActionTests.cs
@@ -0,0 +1,287 @@
+//
+// UninstallPackageActionTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class UninstallPackageActionTests
+ {
+ UninstallPackageAction action;
+ PackageManagementEvents packageManagementEvents;
+ UninstallPackageHelper uninstallPackageHelper;
+ FakePackageManagementProject fakeProject;
+
+ void CreateAction ()
+ {
+ packageManagementEvents = new PackageManagementEvents ();
+ fakeProject = new FakePackageManagementProject ();
+ action = new UninstallPackageAction (fakeProject, packageManagementEvents);
+ uninstallPackageHelper = new UninstallPackageHelper (action);
+ }
+
+ FakePackage AddOnePackageToProjectSourceRepository (string packageId)
+ {
+ return fakeProject.FakeSourceRepository.AddFakePackage (packageId);
+ }
+
+ FakePackage AddOnePackageToProjectSourceRepository (string packageId, string version)
+ {
+ return fakeProject.FakeSourceRepository.AddFakePackageWithVersion (packageId, version);
+ }
+
+ void AddFileToPackageBeingUninstalled (string fileName)
+ {
+ var package = new FakePackage ();
+ package.AddFile (fileName);
+
+ action.Package = package;
+ }
+
+ [Test]
+ public void Execute_PackageObjectPassed_UninstallsPackageFromProject ()
+ {
+ CreateAction ();
+
+ uninstallPackageHelper.UninstallTestPackage ();
+
+ var actualPackage = fakeProject.PackagePassedToUninstallPackage;
+ var expectedPackage = uninstallPackageHelper.TestPackage;
+
+ Assert.AreEqual (expectedPackage, actualPackage);
+ }
+
+ [Test]
+ public void Execute_PackageAndPackageRepositoryPassed_OnPackageUninstalledCalledWithPackage ()
+ {
+ CreateAction ();
+ IPackage actualPackage = null;
+ packageManagementEvents.ParentPackageUninstalled += (sender, e) => {
+ actualPackage = e.Package;
+ };
+
+ uninstallPackageHelper.UninstallTestPackage ();
+
+ var expectedPackage = uninstallPackageHelper.TestPackage;
+ Assert.AreEqual (expectedPackage, actualPackage);
+ }
+
+ [Test]
+ public void Execute_PackageObjectPassedAndForceRemoveIsFalse_PackageIsNotForcefullyRemoved ()
+ {
+ CreateAction ();
+ fakeProject.AddFakePackageToSourceRepository ("PackageId");
+ uninstallPackageHelper.ForceRemove = false;
+ uninstallPackageHelper.UninstallPackageById ("PackageId");
+
+ bool forceRemove = fakeProject.ForceRemovePassedToUninstallPackage;
+
+ Assert.IsFalse (forceRemove);
+ }
+
+ [Test]
+ public void Execute_PackageObjectPassedAndForceRemoveIsTrue_PackageIsForcefullyRemoved ()
+ {
+ CreateAction ();
+ fakeProject.AddFakePackageToSourceRepository ("PackageId");
+ uninstallPackageHelper.ForceRemove = true;
+ uninstallPackageHelper.UninstallPackageById ("PackageId");
+
+ bool forceRemove = fakeProject.ForceRemovePassedToUninstallPackage;
+
+ Assert.IsTrue (forceRemove);
+ }
+
+ [Test]
+ public void Execute_PackageObjectPassedAndRemoveDependenciesIsFalse_PackageDependenciesAreNotRemoved ()
+ {
+ CreateAction ();
+ fakeProject.AddFakePackageToSourceRepository ("PackageId");
+ uninstallPackageHelper.RemoveDependencies = false;
+ uninstallPackageHelper.UninstallPackageById ("PackageId");
+
+ bool removeDependencies = fakeProject.RemoveDependenciesPassedToUninstallPackage;
+
+ Assert.IsFalse (removeDependencies);
+ }
+
+ [Test]
+ public void Execute_PackageObjectPassedAndRemoveDependenciesIsTrue_PackageDependenciesAreRemoved ()
+ {
+ CreateAction ();
+ fakeProject.AddFakePackageToSourceRepository ("PackageId");
+ uninstallPackageHelper.RemoveDependencies = true;
+ uninstallPackageHelper.UninstallPackageById ("PackageId");
+
+ bool removeDependencies = fakeProject.RemoveDependenciesPassedToUninstallPackage;
+
+ Assert.IsTrue (removeDependencies);
+ }
+
+ [Test]
+ public void Execute_PackageIdSpecifiedAndForceRemoveIsTrue_PackageIsForcefullyRemoved ()
+ {
+ CreateAction ();
+ fakeProject.AddFakePackageToSourceRepository ("PackageId");
+ uninstallPackageHelper.ForceRemove = true;
+ uninstallPackageHelper.UninstallPackageById ("PackageId");
+
+ bool forceRemove = fakeProject.ForceRemovePassedToUninstallPackage;
+
+ Assert.IsTrue (forceRemove);
+ }
+
+ [Test]
+ public void Execute_PackageIdSpecifiedAndRemoveDependenciesIsTrue_PackageDependenciesAreRemoved ()
+ {
+ CreateAction ();
+ fakeProject.AddFakePackageToSourceRepository ("PackageId");
+ uninstallPackageHelper.RemoveDependencies = true;
+ uninstallPackageHelper.UninstallPackageById ("PackageId");
+
+ bool removeDependencies = fakeProject.RemoveDependenciesPassedToUninstallPackage;
+
+ Assert.IsTrue (removeDependencies);
+ }
+
+ [Test]
+ public void Execute_VersionSpecified_VersionUsedWhenSearchingForPackage ()
+ {
+ CreateAction ();
+
+ AddOnePackageToProjectSourceRepository ("PackageId", "1.2.0.0");
+ AddOnePackageToProjectSourceRepository ("PackageId", "1.0.0.0");
+ FakePackage package = AddOnePackageToProjectSourceRepository ("PackageId", "1.1.0");
+
+ uninstallPackageHelper.Version = package.Version;
+ uninstallPackageHelper.UninstallPackageById ("PackageId");
+
+ var actualPackage = fakeProject.PackagePassedToUninstallPackage;
+
+ Assert.AreEqual (package, actualPackage);
+ }
+
+ [Test]
+ public void ForceRemove_DefaultValue_ReturnsFalse ()
+ {
+ CreateAction ();
+ Assert.IsFalse (action.ForceRemove);
+ }
+
+ [Test]
+ public void RemoveDependencies_DefaultValue_ReturnsFalse ()
+ {
+ CreateAction ();
+ Assert.IsFalse (action.RemoveDependencies);
+ }
+
+ [Test]
+ public void HasPackageScriptsToRun_OnePackageInOperationsHasUninstallPowerShellScript_ReturnsTrue ()
+ {
+ CreateAction ();
+ AddFileToPackageBeingUninstalled (@"tools\uninstall.ps1");
+
+ bool hasPackageScripts = action.HasPackageScriptsToRun ();
+
+ Assert.IsTrue (hasPackageScripts);
+ }
+
+ [Test]
+ public void HasPackageScriptsToRun_OnePackageInOperationsHasNoFiles_ReturnsFalse ()
+ {
+ CreateAction ();
+ action.Package = new FakePackage ();
+
+ bool hasPackageScripts = action.HasPackageScriptsToRun ();
+
+ Assert.IsFalse (hasPackageScripts);
+ }
+
+ [Test]
+ public void HasPackageScriptsToRun_OnePackageInOperationsHasUninstallPowerShellScriptInUpperCase_ReturnsTrue ()
+ {
+ CreateAction ();
+ AddFileToPackageBeingUninstalled (@"tools\UNINSTALL.PS1");
+
+ bool hasPackageScripts = action.HasPackageScriptsToRun ();
+
+ Assert.IsTrue (hasPackageScripts);
+ }
+
+ [Test]
+ public void AllowPreleasePackages_DefaultValue_IsTrue ()
+ {
+ CreateAction ();
+
+ Assert.IsTrue (action.AllowPrereleaseVersions);
+ }
+
+ [Test]
+ public void Execute_PackageHasPowerShellUninstallScript_PowerShellWarningLogged ()
+ {
+ CreateAction ();
+ FakePackage package = FakePackage.CreatePackageWithVersion ("Test", "1.0");
+ action.Package = package;
+ package.AddFile (@"tools\uninstall.ps1");
+ string messageLogged = null;
+ packageManagementEvents.PackageOperationMessageLogged += (sender, e) => {
+ if (e.Message.Level == MessageLevel.Warning) {
+ messageLogged = e.Message.ToString ();
+ }
+ };
+
+ action.Execute ();
+
+ Assert.AreEqual ("Test Package contains PowerShell scripts which will not be run.", messageLogged);
+ }
+
+ [Test]
+ public void Execute_PackageHasPowerShellInstallScript_NoPowerShellWarningLogged ()
+ {
+ CreateAction ();
+ FakePackage package = FakePackage.CreatePackageWithVersion ("Test", "1.0");
+ action.Package = package;
+ package.AddFile (@"tools\install.ps1");
+ bool messageLogged = false;
+ packageManagementEvents.PackageOperationMessageLogged += (sender, e) => {
+ if (e.Message.Level == MessageLevel.Warning) {
+ messageLogged = true;
+ }
+ };
+
+ action.Execute ();
+
+ Assert.IsFalse (messageLogged);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UpdateAllPackagesInProjectTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UpdateAllPackagesInProjectTests.cs
new file mode 100644
index 0000000000..4d267ceeae
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UpdateAllPackagesInProjectTests.cs
@@ -0,0 +1,233 @@
+//
+// UpdateAllPackagesInProjectTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class UpdateAllPackagesInProjectTests
+ {
+ UpdateAllPackagesInProject updateAllPackagesInProject;
+ FakePackageManagementProject fakeProject;
+ List<UpdatePackageAction> updateActions;
+
+ void CreateUpdateAllPackagesInProject ()
+ {
+ fakeProject = new FakePackageManagementProject ();
+ updateAllPackagesInProject = new UpdateAllPackagesInProject (fakeProject);
+ }
+
+ void AddPackageToProject (string packageId)
+ {
+ var package = new FakePackage (packageId, "1.0");
+ fakeProject.FakePackagesInReverseDependencyOrder.Add (package);
+ }
+
+ void CallCreateActions ()
+ {
+ IEnumerable<UpdatePackageAction> actions = updateAllPackagesInProject.CreateActions ();
+ updateActions = actions.ToList ();
+ }
+
+ UpdatePackageAction FirstUpdateAction {
+ get { return updateActions [0]; }
+ }
+
+ [Test]
+ public void CreateActions_OnePackageInProject_ReturnsOneAction ()
+ {
+ CreateUpdateAllPackagesInProject ();
+ AddPackageToProject ("Test");
+ CallCreateActions ();
+
+ Assert.AreEqual (1, updateActions.Count);
+ }
+
+ [Test]
+ public void CreateActions_OnePackageInProject_ActionCreatedFromProject ()
+ {
+ CreateUpdateAllPackagesInProject ();
+ AddPackageToProject ("Test");
+ CallCreateActions ();
+
+ UpdatePackageAction action = updateActions [0];
+ UpdatePackageAction expectedAction = fakeProject.FirstFakeUpdatePackageActionCreated;
+
+ Assert.AreEqual (expectedAction, action);
+ }
+
+ [Test]
+ public void CreateActions_OnePackageInProject_PackageIdSpecifiedInAction ()
+ {
+ CreateUpdateAllPackagesInProject ();
+ AddPackageToProject ("Test");
+ CallCreateActions ();
+
+ string id = FirstUpdateAction.PackageId;
+
+ Assert.AreEqual ("Test", id);
+ }
+
+ [Test]
+ public void CreateActions_OnePackageInProject_PackageVersionSpecifiedInActionIsNull ()
+ {
+ CreateUpdateAllPackagesInProject ();
+ AddPackageToProject ("Test");
+ CallCreateActions ();
+
+ SemanticVersion version = FirstUpdateAction.PackageVersion;
+
+ Assert.IsNull (version);
+ }
+
+ [Test]
+ public void CreateActions_NoPackagesInProject_ReturnsNoActions ()
+ {
+ CreateUpdateAllPackagesInProject ();
+ CallCreateActions ();
+
+ Assert.AreEqual (0, updateActions.Count);
+ }
+
+ [Test]
+ public void CreateActions_TwoPackagesInProject_TwoUpdateActionsCreated ()
+ {
+ CreateUpdateAllPackagesInProject ();
+ AddPackageToProject ("Test1");
+ AddPackageToProject ("Test2");
+ CallCreateActions ();
+
+ Assert.AreEqual (2, updateActions.Count);
+ }
+
+ [Test]
+ public void CreateActions_TwoPackagesInProject_TwoPackageIdsSpecifiedInActions ()
+ {
+ CreateUpdateAllPackagesInProject ();
+ AddPackageToProject ("Test1");
+ AddPackageToProject ("Test2");
+ CallCreateActions ();
+
+ Assert.AreEqual ("Test1", updateActions [0].PackageId);
+ Assert.AreEqual ("Test2", updateActions [1].PackageId);
+ }
+
+ [Test]
+ public void CreateActions_OnePackageInProject_UpdateIfPackageDoesNotExistInProjectIsFalse ()
+ {
+ CreateUpdateAllPackagesInProject ();
+ AddPackageToProject ("Test");
+ CallCreateActions ();
+
+ bool update = FirstUpdateAction.UpdateIfPackageDoesNotExistInProject;
+
+ Assert.IsFalse (update);
+ }
+
+ [Test]
+ public void CreateActions_OnePackageInProjectAndUpdateDependenciesSetToFalse_ActionUpdateDependenciesIsFalse ()
+ {
+ CreateUpdateAllPackagesInProject ();
+ AddPackageToProject ("Test");
+ updateAllPackagesInProject.UpdateDependencies = false;
+
+ CallCreateActions ();
+
+ bool update = FirstUpdateAction.UpdateDependencies;
+
+ Assert.IsFalse (update);
+ }
+
+ [Test]
+ public void UpdateDependencies_NewInstance_ReturnsTrue ()
+ {
+ CreateUpdateAllPackagesInProject ();
+ bool update = updateAllPackagesInProject.UpdateDependencies;
+
+ Assert.IsTrue (update);
+ }
+
+ [Test]
+ public void CreateActions_OnePackageInProjectAndAllowPrereleaseVersionsSetToFalse_ActionPrereleaseVersionsIsFalse ()
+ {
+ CreateUpdateAllPackagesInProject ();
+ AddPackageToProject ("Test");
+ updateAllPackagesInProject.AllowPrereleaseVersions = false;
+
+ CallCreateActions ();
+
+ bool allow = FirstUpdateAction.AllowPrereleaseVersions;
+
+ Assert.IsFalse (allow);
+ }
+
+ [Test]
+ public void CreateActions_OnePackageInProjectAndAllowPrereleaseVersionsSetToTrue_ActionPrereleaseVersionsIsTrue ()
+ {
+ CreateUpdateAllPackagesInProject ();
+ AddPackageToProject ("Test");
+ updateAllPackagesInProject.AllowPrereleaseVersions = true;
+
+ CallCreateActions ();
+
+ bool allow = FirstUpdateAction.AllowPrereleaseVersions;
+
+ Assert.IsTrue (allow);
+ }
+
+ [Test]
+ public void AllowPrereleaseVersions_NewInstance_ReturnsFalse ()
+ {
+ CreateUpdateAllPackagesInProject ();
+ bool allow = updateAllPackagesInProject.AllowPrereleaseVersions;
+
+ Assert.IsFalse (allow);
+ }
+
+ [Test]
+ public void CreateActions_OnePackageInProjectAndUpdateDependenciesSetToTrue_ActionUpdateDependenciesIsTrue ()
+ {
+ CreateUpdateAllPackagesInProject ();
+ AddPackageToProject ("Test");
+ updateAllPackagesInProject.UpdateDependencies = true;
+
+ CallCreateActions ();
+
+ bool update = FirstUpdateAction.UpdateDependencies;
+
+ Assert.IsTrue (update);
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UpdateAllPackagesInSolutionTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UpdateAllPackagesInSolutionTests.cs
new file mode 100644
index 0000000000..1f0c499aea
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UpdateAllPackagesInSolutionTests.cs
@@ -0,0 +1,258 @@
+//
+// UpdateAllPackagesInSolutionTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class UpdateAllPackagesInSolutionTests
+ {
+ UpdateAllPackagesInSolution updateAllPackagesInSolution;
+ FakePackageManagementSolution fakeSolution;
+ List<UpdatePackageAction> updateActions;
+ FakePackageRepository fakeSourceRepository;
+
+ void CreateUpdateAllPackagesInSolution ()
+ {
+ fakeSolution = new FakePackageManagementSolution ();
+ fakeSourceRepository = new FakePackageRepository ();
+ updateAllPackagesInSolution = new UpdateAllPackagesInSolution (fakeSolution, fakeSourceRepository);
+ }
+
+ void AddPackageToSolution (string packageId)
+ {
+ var package = new FakePackage (packageId, "1.0");
+ fakeSolution.FakePackagesInReverseDependencyOrder.Add (package);
+ }
+
+ FakePackageManagementProject AddProjectToSolution (string projectName)
+ {
+ return fakeSolution.AddFakeProject (projectName);
+ }
+
+ void CallCreateActions ()
+ {
+ IEnumerable<UpdatePackageAction> actions = updateAllPackagesInSolution.CreateActions ();
+ updateActions = actions.ToList ();
+ }
+
+ UpdatePackageAction FirstUpdateAction {
+ get { return updateActions [0]; }
+ }
+
+ FakePackageManagementProject FirstProjectInSolution {
+ get { return fakeSolution.FakeProjects [0]; }
+ }
+
+ [Test]
+ public void CreateActions_OnePackageInSolutionWithOneProject_ReturnsOneAction ()
+ {
+ CreateUpdateAllPackagesInSolution ();
+ AddProjectToSolution ("MyProject");
+ AddPackageToSolution ("Test");
+ CallCreateActions ();
+
+ Assert.AreEqual (1, updateActions.Count);
+ }
+
+ [Test]
+ public void CreateActions_OnePackageInSolutionWithOneProject_UpdateActionCreatedFromProject ()
+ {
+ CreateUpdateAllPackagesInSolution ();
+ AddProjectToSolution ("MyProject");
+ AddPackageToSolution ("Test");
+ CallCreateActions ();
+
+ UpdatePackageAction action = FirstUpdateAction;
+ UpdatePackageAction expectedAction = FirstProjectInSolution.FirstFakeUpdatePackageActionCreated;
+
+ Assert.AreEqual (expectedAction, action);
+ }
+
+ [Test]
+ public void CreateActions_OnePackageInSolutionWithOneProject_UpdateActionCreatedUsingSourceRepositoryPassedInConstructor ()
+ {
+ CreateUpdateAllPackagesInSolution ();
+ AddProjectToSolution ("MyProject");
+ AddPackageToSolution ("Test");
+ CallCreateActions ();
+
+ IPackageRepository repository = fakeSolution.SourceRepositoryPassedToGetProjects;
+ FakePackageRepository expectedRepository = fakeSourceRepository;
+
+ Assert.AreEqual (expectedRepository, repository);
+ }
+
+ [Test]
+ public void CreateActions_NoPackagesInSolution_NoActionsReturned ()
+ {
+ CreateUpdateAllPackagesInSolution ();
+ CallCreateActions ();
+
+ Assert.AreEqual (0, updateActions.Count);
+ }
+
+ [Test]
+ public void CreateActions_TwoPackagesInSolutionWithOneProject_ReturnsTwoActions ()
+ {
+ CreateUpdateAllPackagesInSolution ();
+ AddProjectToSolution ("MyProject");
+ AddPackageToSolution ("Test1");
+ AddPackageToSolution ("Test2");
+ CallCreateActions ();
+
+ Assert.AreEqual (2, updateActions.Count);
+ }
+
+ [Test]
+ public void CreateActions_TwoPackagesInSolutionWithOneProject_ReturnsTwoActionsWithPackageIdsForTwoPackages ()
+ {
+ CreateUpdateAllPackagesInSolution ();
+ FakePackageManagementProject project = AddProjectToSolution ("MyProject");
+ AddPackageToSolution ("Test1");
+ AddPackageToSolution ("Test2");
+ CallCreateActions ();
+
+ string[] packageIds = new string[] {
+ project.FirstFakeUpdatePackageActionCreated.PackageId,
+ project.SecondFakeUpdatePackageActionCreated.PackageId
+ };
+
+ string[] expectedPackageIds = new string[] {
+ "Test1",
+ "Test2"
+ };
+
+ Assert.AreEqual (expectedPackageIds, packageIds);
+ }
+
+ [Test]
+ public void CreateActions_OnePackageInSolutionWithTwoProjects_ReturnsTwoActions ()
+ {
+ CreateUpdateAllPackagesInSolution ();
+ AddProjectToSolution ("MyProject1");
+ AddProjectToSolution ("MyProject2");
+ AddPackageToSolution ("Test");
+ CallCreateActions ();
+
+ Assert.AreEqual (2, updateActions.Count);
+ }
+
+ [Test]
+ public void CreateActions_OnePackageInSolutionWithTwoProjects_ReturnsTwoActionsCreatedFromProjects ()
+ {
+ CreateUpdateAllPackagesInSolution ();
+ FakePackageManagementProject project1 = AddProjectToSolution ("MyProject1");
+ FakePackageManagementProject project2 = AddProjectToSolution ("MyProject2");
+ AddPackageToSolution ("Test");
+ CallCreateActions ();
+
+ var expectedActions = new UpdatePackageAction[] {
+ project1.FirstFakeUpdatePackageActionCreated,
+ project2.FirstFakeUpdatePackageActionCreated
+ };
+
+ Assert.AreEqual (expectedActions, updateActions);
+ }
+
+ [Test]
+ public void CreateActions_OnePackageInSolutionWithOneProject_UpdateActionDoesNotUpdatePackageIfProjectDoesNotHavePackage ()
+ {
+ CreateUpdateAllPackagesInSolution ();
+ AddProjectToSolution ("MyProject");
+ AddPackageToSolution ("Test");
+ CallCreateActions ();
+
+ bool updateIfPackageDoesNotExist = FirstUpdateAction.UpdateIfPackageDoesNotExistInProject;
+
+ Assert.IsFalse (updateIfPackageDoesNotExist);
+ }
+
+ [Test]
+ public void CreateActions_OnePackageInSolutionWithOneProjectAndUpdateDependenciesIsFalse_UpdateActionDoesNotUpdateDependencies ()
+ {
+ CreateUpdateAllPackagesInSolution ();
+ AddProjectToSolution ("MyProject");
+ AddPackageToSolution ("Test");
+ updateAllPackagesInSolution.UpdateDependencies = false;
+ CallCreateActions ();
+
+ bool updateDependencies = FirstUpdateAction.UpdateDependencies;
+
+ Assert.IsFalse (updateDependencies);
+ }
+
+ [Test]
+ public void CreateActions_OnePackageInSolutionWithOneProjectAndUpdateDependenciesIsTrue_UpdateActionDoesUpdateDependencies ()
+ {
+ CreateUpdateAllPackagesInSolution ();
+ AddProjectToSolution ("MyProject");
+ AddPackageToSolution ("Test");
+ updateAllPackagesInSolution.UpdateDependencies = true;
+ CallCreateActions ();
+
+ bool updateDependencies = FirstUpdateAction.UpdateDependencies;
+
+ Assert.IsTrue (updateDependencies);
+ }
+
+ [Test]
+ public void CreateActions_OnePackageInSolutionWithOneProjectAndAllowPrereleaseVersionsIsFalse_UpdateActionDoesNotAllowPrereleases ()
+ {
+ CreateUpdateAllPackagesInSolution ();
+ AddProjectToSolution ("MyProject");
+ AddPackageToSolution ("Test");
+ updateAllPackagesInSolution.AllowPrereleaseVersions = false;
+ CallCreateActions ();
+
+ bool allowPrereleases = FirstUpdateAction.AllowPrereleaseVersions;
+
+ Assert.IsFalse (allowPrereleases);
+ }
+
+ [Test]
+ public void CreateActions_OnePackageInSolutionWithOneProjectAndAllowPrereleaseVersionsIsTrue_UpdateActionDoesAllowPrereleases ()
+ {
+ CreateUpdateAllPackagesInSolution ();
+ AddProjectToSolution ("MyProject");
+ AddPackageToSolution ("Test");
+ updateAllPackagesInSolution.AllowPrereleaseVersions = true;
+ CallCreateActions ();
+
+ bool allowPrereleases = FirstUpdateAction.AllowPrereleaseVersions;
+
+ Assert.IsTrue (allowPrereleases);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UpdatePackageActionTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UpdatePackageActionTests.cs
new file mode 100644
index 0000000000..b1da8e5976
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UpdatePackageActionTests.cs
@@ -0,0 +1,371 @@
+//
+// UpdatePackageActionTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class UpdatePackageActionTests
+ {
+ UpdatePackageAction action;
+ PackageManagementEvents packageManagementEvents;
+ FakePackageManagementProject fakeProject;
+ UpdatePackageHelper updatePackageHelper;
+
+ void CreateSolution ()
+ {
+ packageManagementEvents = new PackageManagementEvents ();
+ fakeProject = new FakePackageManagementProject ();
+ action = new UpdatePackageAction (fakeProject, packageManagementEvents);
+ updatePackageHelper = new UpdatePackageHelper (action);
+ }
+
+ void AddInstallOperationWithFile (string fileName)
+ {
+ var package = new FakePackage ();
+ package.AddFile (fileName);
+
+ var operation = new PackageOperation (package, PackageAction.Install);
+ var operations = new List<PackageOperation> ();
+ operations.Add (operation);
+
+ action.Operations = operations;
+ }
+
+ [Test]
+ public void Execute_PackageAndRepositoryPassed_PackageIsUpdated ()
+ {
+ CreateSolution ();
+ updatePackageHelper.UpdateTestPackage ();
+
+ FakePackage expectedPackage = updatePackageHelper.TestPackage;
+ IPackage actualPackage = fakeProject.PackagePassedToUpdatePackage;
+
+ Assert.AreEqual (expectedPackage, actualPackage);
+ }
+
+ [Test]
+ public void UpdateDependencies_DefaultValue_ReturnsTrue ()
+ {
+ CreateSolution ();
+ Assert.IsTrue (action.UpdateDependencies);
+ }
+
+ [Test]
+ public void AllowPrereleaseVersions_DefaultValue_ReturnsFalse ()
+ {
+ CreateSolution ();
+ Assert.IsFalse (action.AllowPrereleaseVersions);
+ }
+
+ [Test]
+ public void Execute_PackageAndRepositoryPassed_PackageOperationsUsedToUpdatePackage ()
+ {
+ CreateSolution ();
+ updatePackageHelper.UpdateTestPackage ();
+
+ IEnumerable<PackageOperation> expectedOperations = updatePackageHelper.PackageOperations;
+ IEnumerable<PackageOperation> actualOperations = fakeProject.PackageOperationsPassedToUpdatePackage;
+
+ Assert.AreEqual (expectedOperations, actualOperations);
+ }
+
+ [Test]
+ public void Execute_PackageAndRepositoryPassed_DependenciesUpdated ()
+ {
+ CreateSolution ();
+ updatePackageHelper.UpdateDependencies = true;
+ updatePackageHelper.UpdateTestPackage ();
+
+ bool result = fakeProject.UpdateDependenciesPassedToUpdatePackage;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void Execute_PackageAndRepositoryPassed_PrereleaseVersionsNotAllowed ()
+ {
+ CreateSolution ();
+ updatePackageHelper.AllowPrereleaseVersions = false;
+ updatePackageHelper.UpdateTestPackage ();
+
+ bool result = fakeProject.AllowPrereleaseVersionsPassedToUpdatePackage;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void Execute_PackageAndRepositoryPassedAndAllowPrereleaseVersions_PrereleaseVersionsAllowed ()
+ {
+ CreateSolution ();
+ updatePackageHelper.AllowPrereleaseVersions = true;
+ updatePackageHelper.UpdateTestPackage ();
+
+ bool result = fakeProject.AllowPrereleaseVersionsPassedToUpdatePackage;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void Execute_PackageAndRepositoryPassedAndUpdateDependenciesIsFalse_DependenciesNotUpdated ()
+ {
+ CreateSolution ();
+ updatePackageHelper.UpdateDependencies = false;
+ updatePackageHelper.UpdateTestPackage ();
+
+ bool result = fakeProject.UpdateDependenciesPassedToUpdatePackage;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void Execute_PackageAndRepositoryPassed_PackageInstalledEventIsFired ()
+ {
+ CreateSolution ();
+ IPackage actualPackage = null;
+ packageManagementEvents.ParentPackageInstalled += (sender, e) => {
+ actualPackage = e.Package;
+ };
+ updatePackageHelper.UpdateTestPackage ();
+
+ FakePackage expectedPackage = updatePackageHelper.TestPackage;
+ Assert.AreEqual (expectedPackage, actualPackage);
+ }
+
+ [Test]
+ public void Execute_PackagePassedButNoPackageOperations_PackageOperationsRetrievedFromProject ()
+ {
+ CreateSolution ();
+ updatePackageHelper.PackageOperations = null;
+ updatePackageHelper.UpdateTestPackage ();
+
+ IEnumerable<PackageOperation> actualOperations = action.Operations;
+ List<FakePackageOperation> expectedOperations = fakeProject.FakeInstallOperations;
+
+ Assert.AreEqual (expectedOperations, actualOperations);
+ }
+
+ [Test]
+ public void Execute_PackagePassedButNoPackageOperations_PackageOperationsCreatedForPackage ()
+ {
+ CreateSolution ();
+ updatePackageHelper.PackageOperations = null;
+ updatePackageHelper.UpdateTestPackage ();
+
+ var expectedPackage = updatePackageHelper.TestPackage;
+ var actualPackage = fakeProject.PackagePassedToGetInstallPackageOperations;
+
+ Assert.AreEqual (expectedPackage, actualPackage);
+ }
+
+ [Test]
+ public void Execute_PackageIdAndSourceAndProjectPassedAndUpdateDependenciesIsTrue_DependenciesUpdatedWhenUpdatingPackage ()
+ {
+ CreateSolution ();
+ fakeProject.AddFakePackageToSourceRepository ("PackageId");
+ updatePackageHelper.UpdateDependencies = true;
+ updatePackageHelper.UpdatePackageById ("PackageId");
+
+ bool result = fakeProject.UpdateDependenciesPassedToUpdatePackage;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void Execute_PackageIdAndSourceAndProjectPassedAndUpdateDependenciesIsFalse_DependenciesNotUpdatedWhenGettingPackageOperations ()
+ {
+ CreateSolution ();
+ fakeProject.AddFakePackageToSourceRepository ("PackageId");
+ updatePackageHelper.UpdateDependencies = false;
+ updatePackageHelper.UpdatePackageById ("PackageId");
+
+ bool result = fakeProject.UpdateDependenciesPassedToUpdatePackage;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void Execute_UpdatedDepdenciesIsFalseAndNoPackageOperations_DependenciesIgnoredWhenGettingPackageOperations ()
+ {
+ CreateSolution ();
+ fakeProject.AddFakePackageToSourceRepository ("PackageId");
+ updatePackageHelper.UpdateDependencies = false;
+ updatePackageHelper.UpdatePackageById ("PackageId");
+
+ bool result = fakeProject.IgnoreDependenciesPassedToGetInstallPackageOperations;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void Execute_UpdateDependenciesIsTrueAndNoPackageOperations_DependenciesNotIgnoredWhenGettingPackageOperations ()
+ {
+ CreateSolution ();
+ fakeProject.AddFakePackageToSourceRepository ("PackageId");
+ updatePackageHelper.UpdateDependencies = true;
+ updatePackageHelper.UpdatePackageById ("PackageId");
+
+ bool result = fakeProject.IgnoreDependenciesPassedToGetInstallPackageOperations;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void Execute_AllowPrereleaseVersionsIsFalseAndNoPackageOperations_PrereleaseVersionsNotAllowedWhenGettingPackageOperations ()
+ {
+ CreateSolution ();
+ fakeProject.AddFakePackageToSourceRepository ("PackageId");
+ updatePackageHelper.AllowPrereleaseVersions = false;
+ updatePackageHelper.UpdatePackageById ("PackageId");
+
+ bool result = fakeProject.AllowPrereleaseVersionsPassedToGetInstallPackageOperations;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void Execute_AllowPrereleaseVersionsIsTrueAndNoPackageOperations_PrereleaseVersionsAllowedWhenGettingPackageOperations ()
+ {
+ CreateSolution ();
+ fakeProject.AddFakePackageToSourceRepository ("PackageId");
+ updatePackageHelper.AllowPrereleaseVersions = true;
+ updatePackageHelper.UpdatePackageById ("PackageId");
+
+ bool result = fakeProject.AllowPrereleaseVersionsPassedToGetInstallPackageOperations;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void Execute_PackageAndPackageOperationsSet_OperationsNotRetrievedFromPackageManager ()
+ {
+ CreateSolution ();
+ updatePackageHelper.UpdateTestPackage ();
+
+ IPackage actualPackage = fakeProject.PackagePassedToGetInstallPackageOperations;
+
+ Assert.IsNull (actualPackage);
+ }
+
+ [Test]
+ public void HasPackageScriptsToRun_OnePackageInOperationsHasInitPowerShellScript_ReturnsTrue ()
+ {
+ CreateSolution ();
+ fakeProject.AddFakePackageToSourceRepository ("Test");
+ action.PackageId = "Test";
+ AddInstallOperationWithFile (@"tools\init.ps1");
+
+ bool hasPackageScripts = action.HasPackageScriptsToRun ();
+
+ Assert.IsTrue (hasPackageScripts);
+ }
+
+ [Test]
+ public void HasPackageScriptsToRun_OnePackageInOperationsHasNoFiles_ReturnsFalse ()
+ {
+ CreateSolution ();
+ fakeProject.AddFakePackageToSourceRepository ("Test");
+ action.PackageId = "Test";
+ action.Operations = new List<PackageOperation> ();
+
+ bool hasPackageScripts = action.HasPackageScriptsToRun ();
+
+ Assert.IsFalse (hasPackageScripts);
+ }
+
+ [Test]
+ public void UpdateIfPackageDoesNotExistInProject_NewUpdateActionInstanceCreate_ReturnsTrue ()
+ {
+ CreateSolution ();
+ bool update = action.UpdateIfPackageDoesNotExistInProject;
+
+ Assert.IsTrue (update);
+ }
+
+ [Test]
+ public void Execute_UpdateIfPackageDoesNotExistInProjectSetToFalseAndPackageDoesNotExistInProject_PackageIsNotUpdated ()
+ {
+ CreateSolution ();
+ action.Package = new FakePackage ("Test");
+ action.UpdateIfPackageDoesNotExistInProject = false;
+ action.Execute ();
+
+ bool updated = fakeProject.IsUpdatePackageCalled;
+
+ Assert.IsFalse (updated);
+ }
+
+ [Test]
+ public void Execute_UpdateIfPackageDoesNotExistInProjectSetToFalseAndPackageDoesNotExistInProject_PackageInstalledEventIsNotFired ()
+ {
+ CreateSolution ();
+ bool updated = false;
+ packageManagementEvents.ParentPackageInstalled += (sender, e) => updated = true;
+ action.UpdateIfPackageDoesNotExistInProject = false;
+
+ updatePackageHelper.UpdateTestPackage ();
+
+ Assert.IsFalse (updated);
+ }
+
+ [Test]
+ public void Execute_UpdateIfPackageDoesNotExistInProjectSetToFalseAndPackageExistsInProject_PackageIsUpdated ()
+ {
+ CreateSolution ();
+ action.UpdateIfPackageDoesNotExistInProject = false;
+ action.PackageId = "Test";
+ FakePackage expectedPackage = fakeProject.FakeSourceRepository.AddFakePackageWithVersion ("Test", "1.1");
+ fakeProject.FakePackages.Add (new FakePackage ("Test", "1.0"));
+ action.Execute ();
+
+ IPackage actualPackage = fakeProject.PackagePassedToUpdatePackage;
+
+ Assert.AreEqual (expectedPackage, actualPackage);
+ }
+
+ [Test]
+ public void Execute_PackagePassedAndUpdateIfPackageDoesNotExistInProjectSetToFalseAndPackageExistsInProject_PackageIsUpdated ()
+ {
+ CreateSolution ();
+ action.UpdateIfPackageDoesNotExistInProject = false;
+ var expectedPackage = new FakePackage ("Test");
+ action.Package = expectedPackage;
+ fakeProject.FakePackages.Add (new FakePackage ("Test", "1.0"));
+ action.Execute ();
+
+ IPackage actualPackage = fakeProject.PackagePassedToUpdatePackage;
+
+ Assert.AreEqual (expectedPackage, actualPackage);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UserAgentGeneratorForRepositoryRequestsTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UserAgentGeneratorForRepositoryRequestsTests.cs
new file mode 100644
index 0000000000..6a729abaa7
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UserAgentGeneratorForRepositoryRequestsTests.cs
@@ -0,0 +1,106 @@
+//
+// UserAgentGeneratorForRepositoryRequestsTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Net;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Core;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class UserAgentGeneratorForRepositoryRequestsTests
+ {
+ UserAgentGeneratorForRepositoryRequests generator;
+
+ FakePackageRepositoryFactoryEvents repositoryFactoryEvents;
+
+ void CreateGenerator ()
+ {
+ repositoryFactoryEvents = new FakePackageRepositoryFactoryEvents ();
+ generator = new UserAgentGeneratorForRepositoryRequests ();
+ generator.Register (repositoryFactoryEvents);
+ }
+
+ IPackageRepository CreatePackageRepository ()
+ {
+ return new FakePackageRepository ();
+ }
+
+ FakePackageRepositoryWithHttpClientEvents CreatePackageRepositoryThatImplementsIHttpClientEvents ()
+ {
+ return new FakePackageRepositoryWithHttpClientEvents ();
+ }
+
+ void FireRepositoryCreatedEvent (FakePackageRepositoryWithHttpClientEvents clientEvents)
+ {
+ FireRepositoryCreatedEvent (clientEvents as IPackageRepository);
+ }
+
+ void FireRepositoryCreatedEvent (IPackageRepository repository)
+ {
+ var eventArgs = new PackageRepositoryFactoryEventArgs (repository);
+ repositoryFactoryEvents.RaiseRepositoryCreatedEvent (eventArgs);
+ }
+
+ WebRequest FireSendingRequestEvent (FakePackageRepositoryWithHttpClientEvents clientEvents)
+ {
+ var request = new FakeWebRequest ();
+ request.Headers = new WebHeaderCollection ();
+
+ var eventArgs = new WebRequestEventArgs (request);
+ clientEvents.RaiseSendingRequestEvent (eventArgs);
+
+ return request;
+ }
+
+ [Test]
+ public void SendingRequest_UserAgentGeneration_UserAgentSetOnRequest ()
+ {
+ CreateGenerator ();
+ var clientEvents = CreatePackageRepositoryThatImplementsIHttpClientEvents ();
+ FireRepositoryCreatedEvent (clientEvents);
+
+ WebRequest request = FireSendingRequestEvent (clientEvents);
+
+ string userAgent = request.Headers [HttpRequestHeader.UserAgent];
+ Assert.IsTrue (userAgent.StartsWith (BrandingService.ApplicationName), userAgent);
+ }
+
+ [Test]
+ public void RepositoryCreated_RepositoryDoesNotImplementIHttpClientEvents_NullReferenceExceptionNotThrown ()
+ {
+ CreateGenerator ();
+ IPackageRepository repository = CreatePackageRepository ();
+
+ FireRepositoryCreatedEvent (repository);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ViewModelBaseTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ViewModelBaseTests.cs
new file mode 100644
index 0000000000..ba42df1a92
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ViewModelBaseTests.cs
@@ -0,0 +1,71 @@
+//
+// ViewModelBaseTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class ViewModelBaseTests
+ {
+ TestableViewModelBase viewModel;
+
+ void CreateTestableViewModel ()
+ {
+ viewModel = new TestableViewModelBase ();
+ }
+
+ [Test]
+ public void PropertyChangedFor_PropertySpecified_ReturnsPropertyName ()
+ {
+ CreateTestableViewModel ();
+ string name = viewModel.PropertyChangedFor (m => m.MyProperty);
+
+ Assert.AreEqual ("MyProperty", name);
+ }
+
+ [Test]
+ public void PropertyChangedFor_TypeSpecified_ReturnsEmptyString ()
+ {
+ CreateTestableViewModel ();
+ string name = viewModel.PropertyChangedFor (m => m);
+
+ Assert.AreEqual (String.Empty, name);
+ }
+
+ [Test]
+ public void PropertyChangedFor_MethodSpecified_ReturnsEmptyString ()
+ {
+ CreateTestableViewModel ();
+ string name = viewModel.PropertyChangedFor (m => m.ToString ());
+
+ Assert.AreEqual (String.Empty, name);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/XmlDocumentTransformTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/XmlDocumentTransformTests.cs
new file mode 100644
index 0000000000..f5e0d70c6f
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/XmlDocumentTransformTests.cs
@@ -0,0 +1,147 @@
+//
+// XmlDocumentTransformTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml;
+using NUnit.Framework;
+using Microsoft.Web.XmlTransform;
+using System.IO;
+using System.Text;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ /// <summary>
+ /// Tests that patches applied to Microsoft's XML Document Transformation (XDT)
+ /// library for Mono issues are working.
+ /// </summary>
+ [TestFixture]
+ public class XmlDocumentTransformTests
+ {
+ string RunTransform (string input, string xdt)
+ {
+ using (var transformation = new XmlTransformation (xdt, isTransformAFile: false, logger: null)) {
+ using (var document = new XmlTransformableDocument ()) {
+ document.PreserveWhitespace = true;
+
+ document.Load (new StringReader (input));
+
+ bool succeeded = transformation.Apply(document);
+ if (succeeded) {
+ var writer = new StringWriter ();
+ document.Save (writer);
+ return writer.ToString ();
+ }
+ return null;
+ }
+ }
+ }
+
+ /// <summary>
+ /// XDT change:
+ ///
+ /// https://github.com/mrward/xdt/commit/b2c3b5383d589c3f79650a0cab93f88a8741b057
+ /// </summary>
+ [Test]
+ public void RemoveTransformShouldRemoveExistingXmlElements ()
+ {
+ string input =
+@"<?xml version=""1.0"" encoding=""utf-8""?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1"">
+ <dependentAssembly>
+ <assemblyIdentity name=""System.Web.WebPages"" publicKeyToken=""31bf3856ad364e35""/>
+ <bindingRedirect oldVersion=""0.0.0.0-0.0.0.0"" newVersion=""0.0.0.0""/>
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
+";
+
+ string xdt =
+@"<?xml version=""1.0"" encoding=""utf-8""?>
+<configuration xmlns:xdt=""http://schemas.microsoft.com/XML-Document-Transform"">
+ <runtime>
+ <assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1"">
+ <dependentAssembly xdt:Transform=""Remove""
+ xdt:Locator=""Condition(./_defaultNamespace:assemblyIdentity/@name='System.Web.WebPages')"" >
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>";
+
+ string output = RunTransform (input, xdt);
+
+ Assert.IsFalse (output.Contains ("WebPages"), output);
+
+ // Sanity check that the transform is returning something.
+ Assert.IsTrue (output.Contains ("assemblyBinding"), output);
+ }
+
+ /// <summary>
+ /// XDT change:
+ ///
+ /// https://github.com/mrward/xdt/commit/9ae2e113dc4140fa7da853436f42547795cfebb5
+ /// </summary>
+ [Test]
+ public void SetAttributesTransformShouldSetAttribute ()
+ {
+ string input =
+@"<?xml version=""1.0"" encoding=""utf-8""?>
+<configuration>
+ <connectionStrings>
+ <!-- Example connection to a SQL Server Database on localhost. -->
+ <add name=""MyDB""
+ connectionString=""""
+ providerName=""System.Data.SqlClient""/>
+ </connectionStrings>
+ <appSettings>
+ <add key=""Setting1"" value=""Very""/>
+ <add key=""Setting2"" value=""Easy""/>
+ </appSettings>
+</configuration>
+";
+
+ string xdt =
+@"<?xml version=""1.0""?>
+<configuration xmlns:xdt=""http://schemas.microsoft.com/XML-Document-Transform"">
+ <connectionStrings>
+ <add name=""MyDB""
+ connectionString=""value for the deployed Web.config file""
+ xdt:Transform=""SetAttributes"" xdt:Locator=""Match(name)""/>
+ <add name=""AWLT"" connectionString=""newstring""
+ providerName=""newprovider""
+ xdt:Transform=""Insert"" />
+ </connectionStrings>
+</configuration>";
+
+ string output = RunTransform (input, xdt);
+
+ Assert.IsTrue (output.Contains ("deployed Web.config file"), output);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.addin.xml b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.addin.xml
index dbbae46b40..cd25f7298d 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.addin.xml
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.addin.xml
@@ -91,22 +91,14 @@
<Extension path="/MonoDevelop/Core/StockIcons">
<StockIcon stockid="md-nuget-package" resource="reference-light-48.png" />
<StockIcon stockid="md-nuget-package-source" resource="package-source-light-32.png" size="Dnd" />
+ <StockIcon stockid="md-prefs-package" resource="prefs-package-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-package-source" resource="prefs-package-source-light-16.png" size="Menu" />
</Extension>
<Extension path="/MonoDevelop/Ide/GlobalOptionsDialog">
- <Section id="NuGetPackageManagement" _label="Packages" icon="md-reference">
- <Section
- id="General"
- _label="General"
- fill="true"
- class="MonoDevelop.PackageManagement.Gui.PackageManagementOptionsPanel"
- icon="md-reference" />
- <Section
- id="PackageSources"
- _label="Sources"
- fill="true"
- class="MonoDevelop.PackageManagement.Gui.PackageSourcesOptionsPanel"
- icon="md-package-source" />
+ <Section id="NuGetPackageManagement" _label="Packages">
+ <Section id="General" _label="General" fill="true" class="MonoDevelop.PackageManagement.Gui.PackageManagementOptionsPanel" icon="md-prefs-package" />
+ <Section id="PackageSources" _label="Sources" fill="true" class="MonoDevelop.PackageManagement.Gui.PackageSourcesOptionsPanel" icon="md-prefs-package-source" />
</Section>
</Extension>
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj
index 1a676a6709..f13bf9e969 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj
@@ -126,7 +126,6 @@
<Compile Include="MonoDevelop.PackageManagement\LicenseAcceptanceService.cs" />
<Compile Include="MonoDevelop.PackageManagement\LicenseAcceptanceViewModel.cs" />
<Compile Include="MonoDevelop.PackageManagement\MachinePackageCache.cs" />
- <Compile Include="MonoDevelop.PackageManagement\ManagePackagesUserPrompts.cs" />
<Compile Include="MonoDevelop.PackageManagement\ManagePackagesViewModel.cs" />
<Compile Include="MonoDevelop.PackageManagement\ManagePackagesViewTitle.cs" />
<Compile Include="MonoDevelop.PackageManagement\MonoDevelopCredentialProvider.cs" />
@@ -314,6 +313,12 @@
<Compile Include="MonoDevelop.PackageManagement\PackagesForSelectedPageQuery.cs" />
<Compile Include="MonoDevelop.PackageManagement\PackageManagementProgressProvider.cs" />
<Compile Include="MonoDevelop.PackageManagement\PackageManagementProgressMonitor.cs" />
+ <Compile Include="MonoDevelop.PackageManagement\ISolution.cs" />
+ <Compile Include="MonoDevelop.PackageManagement\IProject.cs" />
+ <Compile Include="MonoDevelop.PackageManagement\ProjectProxy.cs" />
+ <Compile Include="MonoDevelop.PackageManagement\SolutionProxy.cs" />
+ <Compile Include="MonoDevelop.PackageManagement\IDotNetProject.cs" />
+ <Compile Include="MonoDevelop.PackageManagement\DotNetProjectProxy.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="MonoDevelop.PackageManagement.addin.xml" />
@@ -326,6 +331,18 @@
<EmbeddedResource Include="icons\light\package-source-32%402x.png">
<LogicalName>package-source-light-32@2x.png</LogicalName>
</EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-package-16.png">
+ <LogicalName>prefs-package-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-package-16%402x.png">
+ <LogicalName>prefs-package-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-package-source-16.png">
+ <LogicalName>prefs-package-source-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-package-source-16%402x.png">
+ <LogicalName>prefs-package-source-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="icons\dark\reference-48.png">
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/BackgroundPackageActionRunner.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/BackgroundPackageActionRunner.cs
index 1116905d8d..d02f01385f 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/BackgroundPackageActionRunner.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/BackgroundPackageActionRunner.cs
@@ -39,14 +39,17 @@ namespace MonoDevelop.PackageManagement
{
IPackageManagementProgressMonitorFactory progressMonitorFactory;
IPackageManagementEvents packageManagementEvents;
+ IProgressProvider progressProvider;
List<InstallPackageAction> pendingInstallActions = new List<InstallPackageAction> ();
public BackgroundPackageActionRunner (
IPackageManagementProgressMonitorFactory progressMonitorFactory,
- IPackageManagementEvents packageManagementEvents)
+ IPackageManagementEvents packageManagementEvents,
+ IProgressProvider progressProvider)
{
this.progressMonitorFactory = progressMonitorFactory;
this.packageManagementEvents = packageManagementEvents;
+ this.progressProvider = progressProvider;
}
public IEnumerable<InstallPackageAction> PendingInstallActions {
@@ -67,7 +70,7 @@ namespace MonoDevelop.PackageManagement
{
AddInstallActionsToPendingQueue (actions);
packageManagementEvents.OnPackageOperationsStarting ();
- DispatchService.BackgroundDispatch (() => RunActionsWithProgressMonitor (progressMessage, actions.ToList ()));
+ BackgroundDispatch (() => RunActionsWithProgressMonitor (progressMessage, actions.ToList ()));
}
void AddInstallActionsToPendingQueue (IEnumerable<IPackageAction> actions)
@@ -80,7 +83,7 @@ namespace MonoDevelop.PackageManagement
void RunActionsWithProgressMonitor (ProgressMonitorStatusMessage progressMessage, IList<IPackageAction> installPackageActions)
{
using (IProgressMonitor monitor = progressMonitorFactory.CreateProgressMonitor (progressMessage.Status)) {
- using (var eventMonitor = new PackageManagementEventsMonitor (monitor, packageManagementEvents, PackageManagementServices.ProgressProvider)) {
+ using (PackageManagementEventsMonitor eventMonitor = CreateEventMonitor (monitor)) {
try {
monitor.BeginTask (null, installPackageActions.Count);
RunActionsWithProgressMonitor (monitor, installPackageActions);
@@ -90,7 +93,7 @@ namespace MonoDevelop.PackageManagement
eventMonitor.ReportError (progressMessage, ex);
} finally {
monitor.EndTask ();
- DispatchService.GuiDispatch (() => {
+ GuiDispatch (() => {
RemoveInstallActions (installPackageActions);
packageManagementEvents.OnPackageOperationsFinished ();
});
@@ -99,6 +102,19 @@ namespace MonoDevelop.PackageManagement
}
}
+ PackageManagementEventsMonitor CreateEventMonitor (IProgressMonitor monitor)
+ {
+ return CreateEventMonitor (monitor, packageManagementEvents, progressProvider);
+ }
+
+ protected virtual PackageManagementEventsMonitor CreateEventMonitor (
+ IProgressMonitor monitor,
+ IPackageManagementEvents packageManagementEvents,
+ IProgressProvider progressProvider)
+ {
+ return new PackageManagementEventsMonitor (monitor, packageManagementEvents, progressProvider);
+ }
+
void RunActionsWithProgressMonitor (IProgressMonitor monitor, IList<IPackageAction> packageActions)
{
foreach (IPackageAction action in packageActions) {
@@ -128,6 +144,16 @@ namespace MonoDevelop.PackageManagement
monitor.ShowPackageConsole ();
}
}
+
+ protected virtual void BackgroundDispatch (MessageHandler handler)
+ {
+ DispatchService.BackgroundDispatch (handler);
+ }
+
+ protected virtual void GuiDispatch (MessageHandler handler)
+ {
+ DispatchService.GuiDispatch (handler);
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ConfigSettingsFileSystem.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ConfigSettingsFileSystem.cs
index 0bbe79cc15..8e656126b1 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ConfigSettingsFileSystem.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ConfigSettingsFileSystem.cs
@@ -28,6 +28,7 @@
using System;
using System.IO;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
using NuGet;
@@ -40,7 +41,7 @@ namespace ICSharpCode.PackageManagement
{
}
- public static ConfigSettingsFileSystem CreateConfigSettingsFileSystem(Solution solution)
+ public static ConfigSettingsFileSystem CreateConfigSettingsFileSystem (ISolution solution)
{
string configSettingsFolder = Path.Combine(solution.BaseDirectory, ".nuget");
return new ConfigSettingsFileSystem(configSettingsFolder);
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs
index 61c4c60a44..8b390d9a91 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs
@@ -27,11 +27,12 @@
//
using System;
+using System.IO;
+using MonoDevelop.Core;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
using MonoDevelop.Projects.Formats.MSBuild;
using NuGet;
-using System.IO;
-using MonoDevelop.Core;
namespace ICSharpCode.PackageManagement
{
@@ -40,20 +41,12 @@ namespace ICSharpCode.PackageManagement
public static readonly Guid WebApplication = Guid.Parse("{349C5851-65DF-11DA-9384-00065B846F21}");
public static readonly Guid WebSite = Guid.Parse("{E24C65DC-7377-472B-9ABA-BC803B73C61A}");
- public static bool IsWebProject(this DotNetProject project)
+ public static bool IsWebProject(this IDotNetProject project)
{
return project.HasProjectType(WebApplication) || project.HasProjectType(WebSite);
}
- public static string GetEvaluatedProperty(this DotNetProject project, string name)
- {
- if ("RootNamespace".Equals(name, StringComparison.OrdinalIgnoreCase)) {
- return project.DefaultNamespace;
- }
- return String.Empty;
- }
-
- public static bool HasProjectType(this DotNetProject project, Guid projectTypeGuid)
+ public static bool HasProjectType(this IDotNetProject project, Guid projectTypeGuid)
{
foreach (string guid in project.GetProjectTypeGuids()) {
if (IsMatch(projectTypeGuid, guid)) {
@@ -63,7 +56,7 @@ namespace ICSharpCode.PackageManagement
return false;
}
- public static string[] GetProjectTypeGuids(this DotNetProject project)
+ public static string[] GetProjectTypeGuids(this IDotNetProject project)
{
string projectTypeGuids = project.GetProjectTypeGuidPropertyValue();
return projectTypeGuids.Split(new char[] {';'}, StringSplitOptions.RemoveEmptyEntries);
@@ -78,7 +71,7 @@ namespace ICSharpCode.PackageManagement
return false;
}
- public static string GetProjectTypeGuidPropertyValue(this DotNetProject project)
+ public static string GetProjectTypeGuidPropertyValue (this IDotNetProject project)
{
string propertyValue = null;
if (project.ExtendedProperties.Contains("ProjectTypeGuids")) {
@@ -86,30 +79,6 @@ namespace ICSharpCode.PackageManagement
}
return propertyValue ?? String.Empty;
}
-
- public static void AddImportIfMissing(
- this DotNetProject project,
- string importedProjectFile,
- ProjectImportLocation importLocation)
- {
- var msbuildProject = new MSBuildProject ();
- msbuildProject.Load (project.FileName);
- msbuildProject.AddImportIfMissing (importedProjectFile, importLocation, GetCondition (importedProjectFile));
- msbuildProject.Save (project.FileName);
- }
-
- static string GetCondition(string importedProjectFile)
- {
- return String.Format("Exists('{0}')", importedProjectFile);
- }
-
- public static void RemoveImport(this DotNetProject project, string importedProjectFile)
- {
- var msbuildProject = new MSBuildProject ();
- msbuildProject.Load (project.FileName);
- msbuildProject.RemoveImportIfExists (importedProjectFile);
- msbuildProject.Save (project.FileName);
- }
public static bool HasPackages (this DotNetProject project)
{
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectProxy.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectProxy.cs
new file mode 100644
index 0000000000..287a46f396
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectProxy.cs
@@ -0,0 +1,89 @@
+//
+// DotNetProjectProxy.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using MonoDevelop.Core.Assemblies;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.PackageManagement
+{
+ public class DotNetProjectProxy : ProjectProxy, IDotNetProject
+ {
+ DotNetProject project;
+
+ public DotNetProjectProxy (DotNetProject project)
+ : base (project)
+ {
+ this.project = project;
+ }
+
+ public DotNetProject DotNetProject {
+ get { return project; }
+ }
+
+ public TargetFrameworkMoniker TargetFrameworkMoniker {
+ get { return project.TargetFramework.Id; }
+ }
+
+ public string DefaultNamespace {
+ get { return project.DefaultNamespace; }
+ }
+
+ public ProjectReferenceCollection References {
+ get { return project.References; }
+ }
+
+ public ProjectFileCollection Files {
+ get { return project.Files; }
+ }
+
+ public void AddFile (ProjectFile projectFile)
+ {
+ project.AddFile (projectFile);
+ }
+
+ public string GetDefaultBuildAction (string fileName)
+ {
+ return project.GetDefaultBuildAction (fileName);
+ }
+
+ public bool IsFileInProject (string fileName)
+ {
+ return project.IsFileInProject (fileName);
+ }
+
+ public void AddImportIfMissing (string name, string condition)
+ {
+ project.AddImportIfMissing (name, condition);
+ }
+
+ public void RemoveImport (string name)
+ {
+ project.RemoveImport (name);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IDotNetProject.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IDotNetProject.cs
new file mode 100644
index 0000000000..8d8c0b98a3
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IDotNetProject.cs
@@ -0,0 +1,48 @@
+//
+// IDotNetProject.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using MonoDevelop.Core.Assemblies;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.PackageManagement
+{
+ public interface IDotNetProject : IProject
+ {
+ DotNetProject DotNetProject { get; }
+ TargetFrameworkMoniker TargetFrameworkMoniker { get; }
+ string DefaultNamespace { get; }
+ ProjectReferenceCollection References { get; }
+ ProjectFileCollection Files { get; }
+
+ void AddFile (ProjectFile projectFile);
+ string GetDefaultBuildAction (string fileName);
+ bool IsFileInProject (string fileName);
+ void AddImportIfMissing (string name, string condition);
+ void RemoveImport (string name);
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectFactory.cs
index 5a92539b45..b9dbd43d97 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectFactory.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectFactory.cs
@@ -26,13 +26,13 @@
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
using System;
-using MonoDevelop.Projects;
+using MonoDevelop.PackageManagement;
using NuGet;
namespace ICSharpCode.PackageManagement
{
public interface IPackageManagementProjectFactory
{
- IPackageManagementProject CreateProject(IPackageRepository sourceRepository, DotNetProject project);
+ IPackageManagementProject CreateProject (IPackageRepository sourceRepository, IDotNetProject project);
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectService.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectService.cs
index 436c21fcf4..88d458144c 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectService.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectService.cs
@@ -28,18 +28,17 @@
using System;
using System.Collections.Generic;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
namespace ICSharpCode.PackageManagement
{
public interface IPackageManagementProjectService
{
- Project CurrentProject { get; }
- Solution OpenSolution { get; }
+ IProject CurrentProject { get; }
+ ISolution OpenSolution { get; }
- void Save(Solution solution);
-
- IEnumerable<DotNetProject> GetOpenProjects();
+ IEnumerable<IDotNetProject> GetOpenProjects ();
IProjectBrowserUpdater CreateProjectBrowserUpdater();
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementSolution.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementSolution.cs
index acb993f73f..03f279d604 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementSolution.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementSolution.cs
@@ -30,6 +30,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
using NuGet;
@@ -41,11 +42,11 @@ namespace ICSharpCode.PackageManagement
IPackageManagementProject GetActiveProject(IPackageRepository sourceRepository);
IPackageManagementProject GetProject(PackageSource source, string projectName);
IPackageManagementProject GetProject(IPackageRepository sourceRepository, string projectName);
- IPackageManagementProject GetProject(IPackageRepository sourceRepository, Project project);
+ IPackageManagementProject GetProject (IPackageRepository sourceRepository, IDotNetProject project);
IEnumerable<IPackageManagementProject> GetProjects(IPackageRepository sourceRepository);
- Project GetActiveDotNetProject();
- IEnumerable<Project> GetDotNetProjects();
+ IDotNetProject GetActiveDotNetProject ();
+ IEnumerable<IDotNetProject> GetDotNetProjects ();
bool HasMultipleProjects();
bool IsPackageInstalled(IPackage package);
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagerFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagerFactory.cs
index ec4285d316..0428fa1a84 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagerFactory.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagerFactory.cs
@@ -27,15 +27,15 @@
//
using System;
-using MonoDevelop.Projects;
+using MonoDevelop.PackageManagement;
using NuGet;
namespace ICSharpCode.PackageManagement
{
public interface IPackageManagerFactory
{
- ISharpDevelopPackageManager CreatePackageManager(
+ ISharpDevelopPackageManager CreatePackageManager (
IPackageRepository sourceRepository,
- DotNetProject project);
+ IDotNetProject project);
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IProject.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IProject.cs
new file mode 100644
index 0000000000..d359be3c57
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IProject.cs
@@ -0,0 +1,44 @@
+//
+// IProject.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections;
+using MonoDevelop.Core;
+
+namespace MonoDevelop.PackageManagement
+{
+ public interface IProject
+ {
+ string Name { get; }
+ FilePath FileName { get; }
+ FilePath BaseDirectory { get; }
+ ISolution ParentSolution { get; }
+ IDictionary ExtendedProperties { get; }
+
+ void Save ();
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ISolution.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ISolution.cs
new file mode 100644
index 0000000000..abfd279ea7
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ISolution.cs
@@ -0,0 +1,38 @@
+//
+// ISolution.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using MonoDevelop.Core;
+
+namespace MonoDevelop.PackageManagement
+{
+ public interface ISolution
+ {
+ FilePath BaseDirectory { get; }
+ FilePath FileName { get; }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ISolutionPackageRepositoryFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ISolutionPackageRepositoryFactory.cs
index c3ab8c2652..c9cc090a9c 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ISolutionPackageRepositoryFactory.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ISolutionPackageRepositoryFactory.cs
@@ -27,12 +27,13 @@
//
using System;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
namespace ICSharpCode.PackageManagement
{
public interface ISolutionPackageRepositoryFactory
{
- ISolutionPackageRepository CreateSolutionPackageRepository(Solution solution);
+ ISolutionPackageRepository CreateSolutionPackageRepository (ISolution solution);
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ManagePackagesUserPrompts.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ManagePackagesUserPrompts.cs
deleted file mode 100644
index 9680004b52..0000000000
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ManagePackagesUserPrompts.cs
+++ /dev/null
@@ -1,124 +0,0 @@
-//
-// ManagePackagesUserPrompts.cs
-//
-// Author:
-// Matt Ward <ward.matt@gmail.com>
-//
-// Copyright (C) 2013 Matthew Ward
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-using System;
-using NuGet;
-
-namespace ICSharpCode.PackageManagement
-{
- public class ManagePackagesUserPrompts
- {
- ILicenseAcceptanceService licenseAcceptanceService;
- ISelectProjectsService selectProjectsService;
- IPackageManagementEvents packageManagementEvents;
- IFileConflictResolver fileConflictResolver;
- FileConflictResolution lastFileConflictResolution;
-
- public ManagePackagesUserPrompts(IPackageManagementEvents packageManagementEvents)
- : this(
- packageManagementEvents,
- new LicenseAcceptanceService(),
- new SelectProjectsService(),
- new FileConflictResolver())
- {
- }
-
- public ManagePackagesUserPrompts(
- IPackageManagementEvents packageManagementEvents,
- ILicenseAcceptanceService licenseAcceptanceService,
- ISelectProjectsService selectProjectsService,
- IFileConflictResolver fileConflictResolver)
- {
- this.packageManagementEvents = packageManagementEvents;
- this.licenseAcceptanceService = licenseAcceptanceService;
- this.selectProjectsService = selectProjectsService;
- this.fileConflictResolver = fileConflictResolver;
-
- ResetFileConflictResolution();
- SubscribeToEvents();
- }
-
- void ResetFileConflictResolution()
- {
- lastFileConflictResolution = FileConflictResolution.Overwrite;
- }
-
- void SubscribeToEvents()
- {
- packageManagementEvents.AcceptLicenses += AcceptLicenses;
- packageManagementEvents.SelectProjects += SelectProjects;
- packageManagementEvents.ResolveFileConflict += ResolveFileConflict;
- packageManagementEvents.PackageOperationsStarting += PackageOperationsStarting;
- }
-
- void AcceptLicenses(object sender, AcceptLicensesEventArgs e)
- {
- e.IsAccepted = licenseAcceptanceService.AcceptLicenses(e.Packages);
- }
-
- void SelectProjects(object sender, SelectProjectsEventArgs e)
- {
- e.IsAccepted = selectProjectsService.SelectProjects(e.SelectedProjects);
- }
-
- void ResolveFileConflict(object sender, ResolveFileConflictEventArgs e)
- {
- if (UserPreviouslySelectedOverwriteAllOrIgnoreAll()) {
- e.Resolution = lastFileConflictResolution;
- } else {
- e.Resolution = fileConflictResolver.ResolveFileConflict(e.Message);
- lastFileConflictResolution = e.Resolution;
- }
- }
-
- bool UserPreviouslySelectedOverwriteAllOrIgnoreAll()
- {
- return
- (lastFileConflictResolution == FileConflictResolution.IgnoreAll) ||
- (lastFileConflictResolution == FileConflictResolution.OverwriteAll);
- }
-
- void PackageOperationsStarting(object sender, EventArgs e)
- {
- ResetFileConflictResolution();
- }
-
- public void Dispose()
- {
- UnsubscribeFromEvents();
- }
-
- public void UnsubscribeFromEvents()
- {
- packageManagementEvents.SelectProjects -= SelectProjects;
- packageManagementEvents.AcceptLicenses -= AcceptLicenses;
- packageManagementEvents.ResolveFileConflict -= ResolveFileConflict;
- packageManagementEvents.PackageOperationsStarting -= PackageOperationsStarting;
- }
- }
-}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ManagePackagesViewModel.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ManagePackagesViewModel.cs
index 5d0313197f..d794208cbc 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ManagePackagesViewModel.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ManagePackagesViewModel.cs
@@ -37,7 +37,6 @@ namespace ICSharpCode.PackageManagement
public class ManagePackagesViewModel : ViewModelBase<ManagePackagesViewModel>, IDisposable
{
IThreadSafePackageManagementEvents packageManagementEvents;
- ManagePackagesUserPrompts userPrompts;
PackagesViewModels packagesViewModels;
ManagePackagesViewTitle viewTitle;
string message;
@@ -46,13 +45,11 @@ namespace ICSharpCode.PackageManagement
public ManagePackagesViewModel(
PackagesViewModels packagesViewModels,
ManagePackagesViewTitle viewTitle,
- IThreadSafePackageManagementEvents packageManagementEvents,
- ManagePackagesUserPrompts userPrompts)
+ IThreadSafePackageManagementEvents packageManagementEvents)
{
this.packagesViewModels = packagesViewModels;
this.viewTitle = viewTitle;
this.packageManagementEvents = packageManagementEvents;
- this.userPrompts = userPrompts;
packageManagementEvents.PackageOperationError += PackageOperationError;
packageManagementEvents.PackageOperationsStarting += PackageOperationsStarting;
@@ -81,7 +78,6 @@ namespace ICSharpCode.PackageManagement
public void Dispose()
{
packagesViewModels.Dispose();
- userPrompts.Dispose();
packageManagementEvents.PackageOperationError -= PackageOperationError;
packageManagementEvents.PackageOperationsStarting -= PackageOperationsStarting;
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopCredentialProvider.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopCredentialProvider.cs
index 67340d862c..e9dbe4417b 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopCredentialProvider.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopCredentialProvider.cs
@@ -32,20 +32,15 @@ using NuGet;
namespace ICSharpCode.PackageManagement
{
- public class MonoDevelopCredentialProvider : ICredentialProvider
+ class MonoDevelopCredentialProvider : ICredentialProvider
{
public ICredentials GetCredentials(Uri uri, IWebProxy proxy, CredentialType credentialType, bool retrying)
{
- var pah = MonoDevelop.Core.WebRequestHelper.ProxyAuthenticationHandler;
- if (pah == null)
+ var cp = MonoDevelop.Core.WebRequestHelper.CredentialProvider;
+ if (cp == null)
return null;
- return pah.GetCredentialsFromUser (uri, proxy, GetCredentialType (credentialType), null, retrying);
- }
-
- MonoDevelop.Core.Web.CredentialType GetCredentialType (CredentialType credentialType)
- {
- return (MonoDevelop.Core.Web.CredentialType)credentialType;
+ return cp.GetCredentials (uri, proxy, (MonoDevelop.Core.Web.CredentialType)credentialType, retrying);
}
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/NuGetPackageRestoreCommandLine.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/NuGetPackageRestoreCommandLine.cs
index 6422633538..20f1136e4b 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/NuGetPackageRestoreCommandLine.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/NuGetPackageRestoreCommandLine.cs
@@ -35,8 +35,25 @@ namespace ICSharpCode.PackageManagement
{
public class NuGetPackageRestoreCommandLine
{
- public NuGetPackageRestoreCommandLine(IPackageManagementSolution solution)
+ MonoRuntimeInfo monoRuntime;
+ bool isMonoRuntime;
+
+ public NuGetPackageRestoreCommandLine (IPackageManagementSolution solution)
+ : this (
+ solution,
+ MonoRuntimeInfo.FromCurrentRuntime (),
+ EnvironmentUtility.IsMonoRuntime)
{
+ }
+
+ public NuGetPackageRestoreCommandLine (
+ IPackageManagementSolution solution,
+ MonoRuntimeInfo monoRuntime,
+ bool isMonoRuntime)
+ {
+ this.monoRuntime = monoRuntime;
+ this.isMonoRuntime = isMonoRuntime;
+
GenerateCommandLine(solution);
GenerateWorkingDirectory(solution);
}
@@ -47,7 +64,7 @@ namespace ICSharpCode.PackageManagement
void GenerateCommandLine(IPackageManagementSolution solution)
{
- if (EnvironmentUtility.IsMonoRuntime) {
+ if (isMonoRuntime) {
GenerateMonoCommandLine(solution);
} else {
GenerateWindowsCommandLine(solution);
@@ -61,8 +78,7 @@ namespace ICSharpCode.PackageManagement
NuGetExePath.GetPath(),
solution.FileName);
- string monoPrefix = MonoRuntimeInfo.FromCurrentRuntime().Prefix;
- Command = Path.Combine(monoPrefix, "bin", "mono");
+ Command = Path.Combine (monoRuntime.Prefix, "bin", "mono");
}
void GenerateWindowsCommandLine(IPackageManagementSolution solution)
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/OpenDotNetProjects.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/OpenDotNetProjects.cs
index 4845f95ae9..cd3138b4bc 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/OpenDotNetProjects.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/OpenDotNetProjects.cs
@@ -29,6 +29,7 @@
using System;
using System.Collections.Generic;
using MonoDevelop.Projects;
+using MonoDevelop.PackageManagement;
namespace ICSharpCode.PackageManagement
{
@@ -36,30 +37,30 @@ namespace ICSharpCode.PackageManagement
{
IPackageManagementProjectService projectService;
- public OpenDotNetProjects(IPackageManagementProjectService projectService)
+ public OpenDotNetProjects (IPackageManagementProjectService projectService)
{
this.projectService = projectService;
}
- public DotNetProject FindProject(string name)
+ public IDotNetProject FindProject (string name)
{
- foreach (Project project in projectService.GetOpenProjects()) {
- if (IsProjectNameMatch(project, name)) {
- return project as DotNetProject;
+ foreach (IProject project in projectService.GetOpenProjects ()) {
+ if (IsProjectNameMatch (project, name)) {
+ return project as IDotNetProject;
}
}
return null;
}
- bool IsProjectNameMatch(Project project, string name)
+ bool IsProjectNameMatch (IProject project, string name)
{
- return IsMatchIgnoringCase(project.Name, name) ||
+ return IsMatchIgnoringCase (project.Name, name) ||
(project.FileName == name);
}
- bool IsMatchIgnoringCase(string a, string b)
+ bool IsMatchIgnoringCase (string a, string b)
{
- return String.Equals(a, b, StringComparison.OrdinalIgnoreCase);
+ return String.Equals (a, b, StringComparison.OrdinalIgnoreCase);
}
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementEventsMonitor.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementEventsMonitor.cs
index 9d565c9791..7594cb305e 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementEventsMonitor.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementEventsMonitor.cs
@@ -76,7 +76,7 @@ namespace MonoDevelop.PackageManagement
if (UserPreviouslySelectedOverwriteAllOrIgnoreAll ()) {
e.Resolution = lastFileConflictResolution;
} else {
- DispatchService.GuiSyncDispatch (() => {
+ GuiSyncDispatch (() => {
e.Resolution = fileConflictResolver.ResolveFileConflict (e.Message);
});
lastFileConflictResolution = e.Resolution;
@@ -89,7 +89,12 @@ namespace MonoDevelop.PackageManagement
(lastFileConflictResolution == FileConflictResolution.IgnoreAll) ||
(lastFileConflictResolution == FileConflictResolution.OverwriteAll);
}
-
+
+ protected virtual void GuiSyncDispatch (MessageHandler handler)
+ {
+ DispatchService.GuiSyncDispatch (handler);
+ }
+
void PackageOperationMessageLogged (object sender, PackageOperationMessageLoggedEventArgs e)
{
if (e.Message.Level == MessageLevel.Warning) {
@@ -161,24 +166,34 @@ namespace MonoDevelop.PackageManagement
void NotifyFilesChanged ()
{
- DispatchService.GuiSyncDispatch (() => {
+ GuiSyncDispatch (() => {
FilePath[] files = fileChangedEvents
.SelectMany (fileChangedEvent => fileChangedEvent.ToArray ())
.Select (fileInfo => fileInfo.FileName)
.ToArray ();
- FileService.NotifyFilesChanged (files);
+ NotifyFilesChanged (files);
});
}
+ protected virtual void NotifyFilesChanged (FilePath[] files)
+ {
+ FileService.NotifyFilesChanged (files);
+ }
+
public void ReportError (ProgressMonitorStatusMessage progressMessage, Exception ex)
{
LoggingService.LogInternalError (ex);
progressMonitor.Log.WriteLine (ex.Message);
progressMonitor.ReportError (progressMessage.Error, null);
- progressMonitor.ShowPackageConsole ();
+ ShowPackageConsole (progressMonitor);
packageManagementEvents.OnPackageOperationError (ex);
}
+
+ protected virtual void ShowPackageConsole (IProgressMonitor progressMonitor)
+ {
+ progressMonitor.ShowPackageConsole ();
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementOptionsViewModel.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementOptionsViewModel.cs
index 0f23c12de1..9b2993006a 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementOptionsViewModel.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementOptionsViewModel.cs
@@ -56,7 +56,6 @@ namespace ICSharpCode.PackageManagement
this.HasNoRecentPackages = !RecentPackageRepositoryHasPackages();
this.HasNoCachedPackages = !MachinePackageCacheHasPackages();
- this.IsPackageRestoreEnabled = options.IsPackageRestoreEnabled;
this.IsAutomaticPackageRestoreOnOpeningSolutionEnabled = options.IsAutomaticPackageRestoreOnOpeningSolutionEnabled;
CreateCommands();
@@ -64,7 +63,6 @@ namespace ICSharpCode.PackageManagement
public bool HasNoRecentPackages { get; private set; }
public bool HasNoCachedPackages { get; private set; }
- public bool IsPackageRestoreEnabled { get; set; }
public bool IsAutomaticPackageRestoreOnOpeningSolutionEnabled { get; set; }
bool MachinePackageCacheHasPackages()
@@ -112,7 +110,6 @@ namespace ICSharpCode.PackageManagement
public void SaveOptions()
{
- options.IsPackageRestoreEnabled = IsPackageRestoreEnabled;
options.IsAutomaticPackageRestoreOnOpeningSolutionEnabled = IsAutomaticPackageRestoreOnOpeningSolutionEnabled;
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProgressProvider.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProgressProvider.cs
index ff270b893f..4c2353b194 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProgressProvider.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProgressProvider.cs
@@ -33,9 +33,19 @@ namespace MonoDevelop.PackageManagement
{
public class PackageManagementProgressProvider : IProgressProvider
{
+ Action<MessageHandler> guiDispatcher;
+
public PackageManagementProgressProvider (IPackageRepositoryFactoryEvents repositoryFactoryEvents)
+ : this (repositoryFactoryEvents, DispatchService.GuiDispatch)
+ {
+ }
+
+ public PackageManagementProgressProvider (
+ IPackageRepositoryFactoryEvents repositoryFactoryEvents,
+ Action<MessageHandler> guiDispatcher)
{
repositoryFactoryEvents.RepositoryCreated += RepositoryCreated;
+ this.guiDispatcher = guiDispatcher;
}
void RepositoryCreated (object sender, PackageRepositoryFactoryEventArgs e)
@@ -50,7 +60,7 @@ namespace MonoDevelop.PackageManagement
void OnProgressAvailable (object sender, ProgressEventArgs e)
{
- DispatchService.GuiDispatch (() => {
+ guiDispatcher (() => {
if (ProgressAvailable != null) {
ProgressAvailable (sender, e);
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProject.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProject.cs
index 4a206370e3..11b1f19285 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProject.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProject.cs
@@ -30,9 +30,10 @@ using System;
using System.Collections.Generic;
using System.Linq;
+using System.Runtime.Versioning;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
using NuGet;
-using System.Runtime.Versioning;
namespace ICSharpCode.PackageManagement
{
@@ -41,29 +42,29 @@ namespace ICSharpCode.PackageManagement
ISharpDevelopPackageManager packageManager;
ISharpDevelopProjectManager projectManager;
IPackageManagementEvents packageManagementEvents;
- DotNetProject msbuildProject;
+ IDotNetProject project;
ProjectTargetFramework targetFramework;
- public PackageManagementProject(
+ public PackageManagementProject (
IPackageRepository sourceRepository,
- DotNetProject project,
+ IDotNetProject project,
IPackageManagementEvents packageManagementEvents,
IPackageManagerFactory packageManagerFactory)
{
SourceRepository = sourceRepository;
- msbuildProject = project;
+ this.project = project;
this.packageManagementEvents = packageManagementEvents;
- packageManager = packageManagerFactory.CreatePackageManager(sourceRepository, project);
+ packageManager = packageManagerFactory.CreatePackageManager (sourceRepository, project);
projectManager = packageManager.ProjectManager;
}
public string Name {
- get { return msbuildProject.Name; }
+ get { return project.Name; }
}
public DotNetProject DotNetProject {
- get { return msbuildProject; }
+ get { return project.DotNetProject; }
}
public FrameworkName TargetFramework {
@@ -73,7 +74,7 @@ namespace ICSharpCode.PackageManagement
FrameworkName GetTargetFramework()
{
if (targetFramework == null) {
- targetFramework = new ProjectTargetFramework(msbuildProject);
+ targetFramework = new ProjectTargetFramework(project);
}
return targetFramework.TargetFrameworkName;
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectFactory.cs
index 5e3c276d1f..6dfe3931de 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectFactory.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectFactory.cs
@@ -27,7 +27,7 @@
//
using System;
-using MonoDevelop.Projects;
+using MonoDevelop.PackageManagement;
using NuGet;
namespace ICSharpCode.PackageManagement
@@ -42,11 +42,11 @@ namespace ICSharpCode.PackageManagement
this.packageManagementEvents = packageManagementEvents;
}
- public IPackageManagementProject CreateProject(
+ public IPackageManagementProject CreateProject (
IPackageRepository sourceRepository,
- DotNetProject project)
+ IDotNetProject project)
{
- return new PackageManagementProject(sourceRepository, project, packageManagementEvents, factory);
+ return new PackageManagementProject (sourceRepository, project, packageManagementEvents, factory);
}
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectService.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectService.cs
index 8951c7d4d5..01c8d1d841 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectService.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectService.cs
@@ -30,6 +30,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using MonoDevelop.Ide;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
namespace ICSharpCode.PackageManagement
@@ -39,29 +40,42 @@ namespace ICSharpCode.PackageManagement
public PackageManagementProjectService()
{
}
-
- public Project CurrentProject {
- get { return IdeApp.ProjectOperations.CurrentSelectedProject; }
+
+ public IProject CurrentProject {
+ get {
+ Project project = IdeApp.ProjectOperations.CurrentSelectedProject;
+ if (project != null) {
+ if (project is DotNetProject) {
+ return new DotNetProjectProxy ((DotNetProject)project);
+ }
+ return new ProjectProxy (project);
+ }
+ return null;
+ }
}
-
- public Solution OpenSolution {
- get { return IdeApp.ProjectOperations.CurrentSelectedSolution; }
+
+ public ISolution OpenSolution {
+ get {
+ Solution solution = IdeApp.ProjectOperations.CurrentSelectedSolution;
+ if (solution != null) {
+ return new SolutionProxy (solution);
+ }
+ return null;
+ }
}
-
- public IEnumerable<DotNetProject> GetOpenProjects()
+
+ public IEnumerable<IDotNetProject> GetOpenProjects ()
{
- Solution solution = OpenSolution;
+ Solution solution = IdeApp.ProjectOperations.CurrentSelectedSolution;
if (solution != null) {
- return solution.GetAllProjects ().OfType<DotNetProject> ();
+ return solution
+ .GetAllProjects ()
+ .OfType<DotNetProject> ()
+ .Select (project => new DotNetProjectProxy (project));
}
- return new DotNetProject [0];
- }
-
- public void Save(Solution solution)
- {
- solution.Save();
+ return new IDotNetProject [0];
}
-
+
public IProjectBrowserUpdater CreateProjectBrowserUpdater()
{
return new ThreadSafeProjectBrowserUpdater();
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProject.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProject.cs
index c2fb5ca2f1..d4eef0a928 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProject.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProject.cs
@@ -44,13 +44,21 @@ namespace ICSharpCode.PackageManagement
{
}
- public PackageManagementSelectedProject(
+ public PackageManagementSelectedProject (
IPackageManagementProject project,
bool selected,
bool enabled)
+ : this (project.Name, selected, enabled)
{
this.Project = project;
- this.Name = Project.Name;
+ }
+
+ public PackageManagementSelectedProject (
+ string name,
+ bool selected,
+ bool enabled)
+ {
+ this.Name = name;
this.IsSelected = selected;
this.IsEnabled = enabled;
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProjects.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProjects.cs
index aac384d23c..d2d5b69700 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProjects.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProjects.cs
@@ -30,16 +30,18 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
+using System.Runtime.Versioning;
using MonoDevelop.Projects;
using NuGet;
+using MonoDevelop.PackageManagement;
namespace ICSharpCode.PackageManagement
{
public class PackageManagementSelectedProjects
{
bool? singleProjectSelected;
- Project singleDotNetProjectSelected;
+ IDotNetProject singleDotNetProjectSelected;
public PackageManagementSelectedProjects(IPackageManagementSolution solution)
{
@@ -54,8 +56,8 @@ namespace ICSharpCode.PackageManagement
if (HasSingleProjectSelected()) {
yield return GetSingleProjectSelected(package);
} else {
- foreach (Project project in GetOpenProjects()) {
- yield return CreateSelectedProject(project, package);
+ foreach (IDotNetProject project in GetOpenProjects ()) {
+ yield return CreateSelectedProject (project, package);
}
}
}
@@ -74,7 +76,7 @@ namespace ICSharpCode.PackageManagement
singleProjectSelected = singleDotNetProjectSelected != null;
}
- IEnumerable<Project> GetOpenProjects()
+ IEnumerable<IDotNetProject> GetOpenProjects ()
{
return Solution.GetDotNetProjects();
}
@@ -84,7 +86,7 @@ namespace ICSharpCode.PackageManagement
return CreateSelectedProject(singleDotNetProjectSelected, package);
}
- IPackageManagementSelectedProject CreateSelectedProject(Project dotNetProject, IPackageFromRepository package)
+ IPackageManagementSelectedProject CreateSelectedProject(IDotNetProject dotNetProject, IPackageFromRepository package)
{
IPackageManagementProject project = Solution.GetProject(package.Repository, dotNetProject);
return CreateSelectedProject(project, package);
@@ -186,5 +188,14 @@ namespace ICSharpCode.PackageManagement
}
return false;
}
+
+ public FrameworkName GetTargetFramework ()
+ {
+ if (HasSingleProjectSelected ()) {
+ return new ProjectTargetFramework (singleDotNetProjectSelected)
+ .TargetFrameworkName;
+ }
+ return null;
+ }
}
} \ No newline at end of file
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementServices.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementServices.cs
index 6039618e50..7dd05654fa 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementServices.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementServices.cs
@@ -53,7 +53,8 @@ namespace ICSharpCode.PackageManagement
{
options = new PackageManagementOptions();
packageRepositoryCache = new PackageRepositoryCache(options.PackageSources, options.RecentPackages);
- userAgentGenerator = new UserAgentGeneratorForRepositoryRequests(packageRepositoryCache);
+ userAgentGenerator = new UserAgentGeneratorForRepositoryRequests ();
+ userAgentGenerator.Register (packageRepositoryCache);
progressProvider = new PackageManagementProgressProvider (packageRepositoryCache);
registeredPackageRepositories = new RegisteredPackageRepositories(packageRepositoryCache, options);
projectTemplatePackageSources = new RegisteredProjectTemplatePackageSources();
@@ -64,7 +65,7 @@ namespace ICSharpCode.PackageManagement
packageActionRunner = new PackageActionRunner(packageManagementEvents);
progressMonitorFactory = new PackageManagementProgressMonitorFactory ();
- backgroundPackageActionRunner = new BackgroundPackageActionRunner (progressMonitorFactory, packageManagementEvents);
+ backgroundPackageActionRunner = new BackgroundPackageActionRunner (progressMonitorFactory, packageManagementEvents, progressProvider);
InitializeCredentialProvider();
}
@@ -81,11 +82,6 @@ namespace ICSharpCode.PackageManagement
return new SettingsCredentialProvider(credentialProvider, packageSourceProvider);
}
- public static void DisablePromptForCredentials ()
- {
- HttpClient.DefaultCredentialProvider = CreateSettingsCredentialProvider (NullCredentialProvider.Instance);
- }
-
public static PackageManagementOptions Options {
get { return options; }
}
@@ -137,9 +133,5 @@ namespace ICSharpCode.PackageManagement
public static IRecentPackageRepository RecentPackageRepository {
get { return packageRepositoryCache.RecentPackageRepository; }
}
-
- public static IProgressProvider ProgressProvider {
- get { return progressProvider; }
- }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSolution.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSolution.cs
index cadcd39ca0..ba5cfb3433 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSolution.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSolution.cs
@@ -29,7 +29,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using MonoDevelop.Projects;
+using MonoDevelop.PackageManagement;
using NuGet;
namespace ICSharpCode.PackageManagement
@@ -68,14 +68,14 @@ namespace ICSharpCode.PackageManagement
get { return OpenSolution.FileName; }
}
- Solution OpenSolution {
+ ISolution OpenSolution {
get { return projectService.OpenSolution; }
}
-
+
public IPackageManagementProject GetActiveProject()
{
if (HasActiveProject()) {
- return GetActiveProject(ActivePackageRepository);
+ return GetActiveProject(registeredPackageRepositories.CreateAggregateRepository());
}
return null;
}
@@ -85,9 +85,12 @@ namespace ICSharpCode.PackageManagement
return GetActiveDotNetProject() != null;
}
- public Project GetActiveDotNetProject()
+ public IDotNetProject GetActiveDotNetProject ()
{
- return projectService.CurrentProject;
+ if (projectService.CurrentProject != null) {
+ return projectService.CurrentProject as IDotNetProject;
+ }
+ return null;
}
IPackageRepository ActivePackageRepository {
@@ -96,18 +99,18 @@ namespace ICSharpCode.PackageManagement
public IPackageManagementProject GetActiveProject(IPackageRepository sourceRepository)
{
- var activeProject = GetActiveDotNetProject() as DotNetProject;
+ IDotNetProject activeProject = GetActiveDotNetProject ();
if (activeProject != null) {
- return CreateProject(sourceRepository, activeProject);
+ return CreateProject (sourceRepository, activeProject);
}
return null;
}
-
- IPackageManagementProject CreateProject(IPackageRepository sourceRepository, DotNetProject project)
+
+ IPackageManagementProject CreateProject (IPackageRepository sourceRepository, IDotNetProject project)
{
- return projectFactory.CreateProject(sourceRepository, project);
+ return projectFactory.CreateProject (sourceRepository, project);
}
-
+
IPackageRepository CreatePackageRepository(PackageSource source)
{
return registeredPackageRepositories.CreateRepository(source);
@@ -115,17 +118,17 @@ namespace ICSharpCode.PackageManagement
public IPackageManagementProject GetProject(PackageSource source, string projectName)
{
- DotNetProject project = GetDotNetProject(projectName);
+ IDotNetProject project = GetDotNetProject (projectName);
return CreateProject(source, project);
}
- DotNetProject GetDotNetProject(string name)
+ IDotNetProject GetDotNetProject (string name)
{
var openProjects = new OpenDotNetProjects(projectService);
return openProjects.FindProject(name);
}
- IPackageManagementProject CreateProject(PackageSource source, DotNetProject project)
+ IPackageManagementProject CreateProject (PackageSource source, IDotNetProject project)
{
IPackageRepository sourceRepository = CreatePackageRepository(source);
return CreateProject(sourceRepository, project);
@@ -133,19 +136,18 @@ namespace ICSharpCode.PackageManagement
public IPackageManagementProject GetProject(IPackageRepository sourceRepository, string projectName)
{
- DotNetProject project = GetDotNetProject(projectName);
+ IDotNetProject project = GetDotNetProject (projectName);
return CreateProject(sourceRepository, project);
}
- public IPackageManagementProject GetProject(IPackageRepository sourceRepository, Project project)
+ public IPackageManagementProject GetProject (IPackageRepository sourceRepository, IDotNetProject project)
{
- var dotNetProject = project as DotNetProject;
- return CreateProject(sourceRepository, dotNetProject);
+ return CreateProject (sourceRepository, project);
}
- public IEnumerable<Project> GetDotNetProjects()
+ public IEnumerable<IDotNetProject> GetDotNetProjects ()
{
- return projectService.GetOpenProjects();
+ return projectService.GetOpenProjects ();
}
public bool IsOpen {
@@ -165,7 +167,7 @@ namespace ICSharpCode.PackageManagement
ISolutionPackageRepository CreateSolutionPackageRepository()
{
- return solutionPackageRepositoryFactory.CreateSolutionPackageRepository(OpenSolution);
+ return solutionPackageRepositoryFactory.CreateSolutionPackageRepository (OpenSolution);
}
public IQueryable<IPackage> GetPackages()
@@ -199,7 +201,7 @@ namespace ICSharpCode.PackageManagement
public IEnumerable<IPackageManagementProject> GetProjects(IPackageRepository sourceRepository)
{
- foreach (DotNetProject dotNetProject in GetDotNetProjects()) {
+ foreach (IDotNetProject dotNetProject in GetDotNetProjects ()) {
yield return projectFactory.CreateProject(sourceRepository, dotNetProject);
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementViewModels.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementViewModels.cs
index 80e8e1d65e..8132c0eea9 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementViewModels.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementViewModels.cs
@@ -57,8 +57,7 @@ namespace ICSharpCode.PackageManagement
new ManagePackagesViewModel(
packagesViewModels,
new ManagePackagesViewTitle(solution),
- packageManagementEvents,
- new ManagePackagesUserPrompts(packageManagementEvents));
+ packageManagementEvents);
}
void CreateRegisteredPackageRepositories()
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageSourceViewModelChecker.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageSourceViewModelChecker.cs
index d5cf85c7f5..354881eeab 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageSourceViewModelChecker.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageSourceViewModelChecker.cs
@@ -80,7 +80,7 @@ namespace MonoDevelop.PackageManagement
PackageSourceViewModelCheckedEventArgs CheckHttpPackageSource (PackageSourceViewModel packageSource)
{
- var httpClient = new HttpClient (new Uri (packageSource.SourceUrl));
+ HttpClient httpClient = CreateHttpClient (packageSource);
try {
using (var response = (HttpWebResponse)httpClient.GetResponse ()) {
if (response.StatusCode == HttpStatusCode.OK) {
@@ -97,6 +97,34 @@ namespace MonoDevelop.PackageManagement
}
}
+ /// <summary>
+ /// Do not use cached credentials for the first request sent to a package source.
+ ///
+ /// Once NuGet has a valid credential for a package source it is used from that point
+ /// onwards. So if the user changes a valid username/password in Preferences
+ /// to a non-valid username/password they will not see the 'Invalid credentials'
+ /// warning. To workaround this caching we remove the credentials for the request
+ /// the first time it is sent. Also the UseDefaultCredentials is set to true.
+ /// This forces NuGet to get the credentials from the IPackageSourceProvider,
+ /// which is implemented by the RegisteredPackageSourcesViewModel, and will
+ /// contain the latest usernames and passwords for all package sources.
+ /// </summary>
+ HttpClient CreateHttpClient(PackageSourceViewModel packageSource)
+ {
+ var httpClient = new HttpClient (new Uri (packageSource.SourceUrl));
+
+ bool resetCredentials = true;
+ httpClient.SendingRequest += (sender, e) => {
+ if (resetCredentials && packageSource.HasPassword ()) {
+ resetCredentials = false;
+ e.Request.Credentials = null;
+ e.Request.UseDefaultCredentials = true;
+ }
+ };
+
+ return httpClient;
+ }
+
PackageSourceViewModelCheckedEventArgs CheckFileSystemPackageSource (PackageSourceViewModel packageSource)
{
if (Directory.Exists (packageSource.SourceUrl)) {
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageViewModel.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageViewModel.cs
index 6cc610fce2..6f6873311e 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageViewModel.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageViewModel.cs
@@ -30,6 +30,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
+using System.Runtime.Versioning;
using MonoDevelop.PackageManagement;
using NuGet;
@@ -49,6 +50,7 @@ namespace ICSharpCode.PackageManagement
IPackageActionRunner actionRunner;
IPackageViewModelParent parent;
string summary;
+ List<PackageDependency> dependencies;
public PackageViewModel(
IPackageViewModelParent parent,
@@ -135,12 +137,20 @@ namespace ICSharpCode.PackageManagement
return selectedProjects.IsPackageInstalled(package);
}
- public IEnumerable<PackageDependencySet> Dependencies {
- get { return package.DependencySets; }
+ public IEnumerable<PackageDependency> Dependencies {
+ get {
+ if (dependencies == null) {
+ FrameworkName targetFramework = selectedProjects.GetTargetFramework ();
+ dependencies = package
+ .GetCompatiblePackageDependencies (targetFramework)
+ .ToList ();
+ }
+ return dependencies;
+ }
}
public bool HasDependencies {
- get { return package.HasDependencies; }
+ get { return Dependencies.Any (); }
}
public bool HasNoDependencies {
@@ -550,10 +560,8 @@ namespace ICSharpCode.PackageManagement
public string GetPackageDependenciesDisplayText ()
{
var displayText = new StringBuilder ();
- foreach (PackageDependencySet dependencySet in Dependencies) {
- foreach (PackageDependency dependency in dependencySet.Dependencies) {
- displayText.AppendLine (dependency.ToString ());
- }
+ foreach (PackageDependency dependency in Dependencies) {
+ displayText.AppendLine (dependency.ToString ());
}
return displayText.ToString ();
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackagesRequiringLicenseAcceptance.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackagesRequiringLicenseAcceptance.cs
index 0353b689f5..d0c0ea3318 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackagesRequiringLicenseAcceptance.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackagesRequiringLicenseAcceptance.cs
@@ -34,16 +34,11 @@ namespace MonoDevelop.PackageManagement
{
public class PackagesRequiringLicenseAcceptance
{
- IPackageManagementSolution solution;
+ IPackageManagementProject project;
- public PackagesRequiringLicenseAcceptance (IPackageManagementSolution solution)
- {
- this.solution = solution;
- }
-
- public PackagesRequiringLicenseAcceptance ()
- : this (PackageManagementServices.Solution)
+ public PackagesRequiringLicenseAcceptance (IPackageManagementProject project)
{
+ this.project = project;
}
public IEnumerable<IPackage> GetPackagesRequiringLicenseAcceptance (IEnumerable<IPackageAction> actions)
@@ -70,12 +65,12 @@ namespace MonoDevelop.PackageManagement
bool PackageRequiresLicenseAcceptance (IPackage package)
{
- return package.RequireLicenseAcceptance && !IsPackageInstalledInSolution (package);
+ return package.RequireLicenseAcceptance && !IsPackageInstalled (package);
}
- bool IsPackageInstalledInSolution(IPackage package)
+ bool IsPackageInstalled(IPackage package)
{
- return solution.IsPackageInstalled (package);
+ return project.IsPackageInstalled (package);
}
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackagesViewModel.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackagesViewModel.cs
index 878ed0b821..f721623185 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackagesViewModel.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackagesViewModel.cs
@@ -181,7 +181,7 @@ namespace ICSharpCode.PackageManagement
{
HasError = true;
ErrorMessage = GetErrorMessage(ex);
- LoggingService.LogDebug("PackagesViewModel error", ex);
+ LoggingService.LogInfo("PackagesViewModel error", ex);
}
string GetErrorMessage(AggregateException ex)
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackagesViewModels.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackagesViewModels.cs
index b1d223cdba..2bf7ad3e67 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackagesViewModels.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackagesViewModels.cs
@@ -40,8 +40,8 @@ namespace ICSharpCode.PackageManagement
ITaskFactory taskFactory)
{
var packageViewModelFactory = new PackageViewModelFactory(solution, packageManagementEvents, actionRunner);
- var updatedPackageViewModelFactory = new UpdatedPackageViewModelFactory(packageViewModelFactory);
- var installedPackageViewModelFactory = new InstalledPackageViewModelFactory(packageViewModelFactory);
+ //var updatedPackageViewModelFactory = new UpdatedPackageViewModelFactory(packageViewModelFactory);
+ //var installedPackageViewModelFactory = new InstalledPackageViewModelFactory(packageViewModelFactory);
IRecentPackageRepository recentPackageRepository = PackageManagementServices.RecentPackageRepository;
AvailablePackagesViewModel = new AvailablePackagesViewModel(registeredPackageRepositories, recentPackageRepository, packageViewModelFactory, taskFactory);
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProcessPackageAction.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProcessPackageAction.cs
index 6a32e9ed37..53d3b33c81 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProcessPackageAction.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProcessPackageAction.cs
@@ -159,7 +159,7 @@ namespace ICSharpCode.PackageManagement
bool AcceptLicenses ()
{
- var packagesWithLicenses = new PackagesRequiringLicenseAcceptance ();
+ var packagesWithLicenses = new PackagesRequiringLicenseAcceptance (Project);
var actions = new IPackageAction [] { this };
List<IPackage> packages = packagesWithLicenses.GetPackagesRequiringLicenseAcceptance (actions).ToList ();
if (packages.Any ()) {
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectProxy.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectProxy.cs
new file mode 100644
index 0000000000..7aef3277df
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectProxy.cs
@@ -0,0 +1,70 @@
+//
+// ProjectProxy.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Core;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.PackageManagement
+{
+ public class ProjectProxy : IProject
+ {
+ Project project;
+
+ public ProjectProxy (Project project)
+ {
+ this.project = project;
+ }
+
+ public string Name {
+ get { return project.Name; }
+ }
+
+ public FilePath FileName {
+ get { return project.FileName; }
+ }
+
+ public FilePath BaseDirectory {
+ get { return project.BaseDirectory; }
+ }
+
+ public ISolution ParentSolution {
+ get { return new SolutionProxy (project.ParentSolution); }
+ }
+
+ public IDictionary ExtendedProperties {
+ get { return project.ExtendedProperties; }
+ }
+
+ public void Save ()
+ {
+ project.Save ();
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTargetFramework.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTargetFramework.cs
index 249dc72c36..9099f6d4c7 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTargetFramework.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTargetFramework.cs
@@ -29,16 +29,17 @@
using System;
using System.Runtime.Versioning;
using MonoDevelop.Core.Assemblies;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
namespace ICSharpCode.PackageManagement
{
public class ProjectTargetFramework
{
- DotNetProject project;
+ IDotNetProject project;
FrameworkName targetFramework;
-
- public ProjectTargetFramework(DotNetProject project)
+
+ public ProjectTargetFramework (IDotNetProject project)
{
this.project = project;
GetTargetFramework();
@@ -65,7 +66,7 @@ namespace ICSharpCode.PackageManagement
}
TargetFrameworkMoniker TargetFrameworkMoniker {
- get { return project.TargetFramework.Id; }
+ get { return project.TargetFrameworkMoniker; }
}
string UseDefaultIfNullOrEmpty(string value, string defaultValue)
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateNuGetPackageInstaller.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateNuGetPackageInstaller.cs
index 7c94e8bc5c..a29d135b41 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateNuGetPackageInstaller.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateNuGetPackageInstaller.cs
@@ -38,13 +38,11 @@ namespace MonoDevelop.PackageManagement
{
IPackageManagementSolution packageManagementSolution;
IPackageRepositoryCache packageRepositoryCache;
- IPackageManagementEvents packageManagementEvents;
IBackgroundPackageActionRunner backgroundPackageActionRunner;
public ProjectTemplateNuGetPackageInstaller ()
: this(
PackageManagementServices.Solution,
- PackageManagementServices.PackageManagementEvents,
PackageManagementServices.ProjectTemplatePackageRepositoryCache,
PackageManagementServices.BackgroundPackageActionRunner)
{
@@ -52,28 +50,25 @@ namespace MonoDevelop.PackageManagement
public ProjectTemplateNuGetPackageInstaller (
IPackageManagementSolution solution,
- IPackageManagementEvents packageManagementEvents,
IPackageRepositoryCache packageRepositoryCache,
IBackgroundPackageActionRunner backgroundPackageActionRunner)
{
this.packageManagementSolution = solution;
- this.packageManagementEvents = packageManagementEvents;
this.packageRepositoryCache = packageRepositoryCache;
this.backgroundPackageActionRunner = backgroundPackageActionRunner;
}
- public override void Run (IList<PackageReferencesForCreatedProject> packageReferencesForCreatedProjects)
+ public override void Run (Solution solution, IList<PackageReferencesForCreatedProject> packageReferencesForCreatedProjects)
{
- List<InstallPackageAction> installPackageActions = CreateInstallPackageActions (packageReferencesForCreatedProjects);
+ List<InstallPackageAction> installPackageActions = CreateInstallPackageActions (solution, packageReferencesForCreatedProjects);
ProgressMonitorStatusMessage progressMessage = ProgressMonitorStatusMessageFactory.CreateInstallingProjectTemplatePackagesMessage ();
backgroundPackageActionRunner.Run (progressMessage, installPackageActions);
}
- List<InstallPackageAction> CreateInstallPackageActions (IList<PackageReferencesForCreatedProject> packageReferencesForCreatedProjects)
+ List<InstallPackageAction> CreateInstallPackageActions (Solution solution, IList<PackageReferencesForCreatedProject> packageReferencesForCreatedProjects)
{
var installPackageActions = new List<InstallPackageAction> ();
- Solution solution = IdeApp.ProjectOperations.CurrentSelectedSolution;
foreach (PackageReferencesForCreatedProject packageReferences in packageReferencesForCreatedProjects) {
var project = solution.GetAllProjects ().First (p => p.Name == packageReferences.ProjectName) as DotNetProject;
if (project != null) {
@@ -104,8 +99,9 @@ namespace MonoDevelop.PackageManagement
return null;
}
- IPackageManagementProject CreatePackageManagementProject (DotNetProject dotNetProject)
+ IPackageManagementProject CreatePackageManagementProject (DotNetProject project)
{
+ var dotNetProject = new DotNetProjectProxy (project);
return packageManagementSolution.GetProject (packageRepositoryCache.CreateAggregateRepository (), dotNetProject);
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RecentPackageRepository.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RecentPackageRepository.cs
index b1f034dba6..f2e8b14cc8 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RecentPackageRepository.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RecentPackageRepository.cs
@@ -41,16 +41,13 @@ namespace ICSharpCode.PackageManagement
int maximumPackagesCount = DefaultMaximumPackagesCount;
IList<RecentPackageInfo> savedRecentPackages;
IPackageRepository aggregateRepository;
- IPackageManagementEvents packageManagementEvents;
-
+
public RecentPackageRepository(
IList<RecentPackageInfo> recentPackages,
- IPackageRepository aggregateRepository,
- IPackageManagementEvents packageManagementEvents)
+ IPackageRepository aggregateRepository)
{
this.savedRecentPackages = recentPackages;
this.aggregateRepository = aggregateRepository;
- this.packageManagementEvents = packageManagementEvents;
//UpdatePackages ();
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RegisteredPackageRepositories.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RegisteredPackageRepositories.cs
index 0e99626c06..c326c47d1b 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RegisteredPackageRepositories.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RegisteredPackageRepositories.cs
@@ -113,12 +113,21 @@ namespace ICSharpCode.PackageManagement
public void UpdatePackageSources (IEnumerable<PackageSource> updatedPackageSources)
{
- PackageSources.Clear ();
- foreach (PackageSource updatedPackageSource in updatedPackageSources) {
- PackageSources.Add (updatedPackageSource);
- }
+ List<PackageSource> packageSourcesBackup = PackageSources.ToList ();
+
+ try {
+ PackageSources.Clear ();
+ foreach (PackageSource updatedPackageSource in updatedPackageSources) {
+ PackageSources.Add (updatedPackageSource);
+ }
- UpdateActivePackageSource ();
+ UpdateActivePackageSource ();
+ } catch (Exception) {
+ PackageSources.AddRange (packageSourcesBackup);
+ UpdateActivePackageSource ();
+
+ throw;
+ }
}
void UpdateActivePackageSource ()
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RegisteredPackageSourceSettings.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RegisteredPackageSourceSettings.cs
index 9d60350227..7651775c7b 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RegisteredPackageSourceSettings.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RegisteredPackageSourceSettings.cs
@@ -31,6 +31,7 @@ using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
+using MonoDevelop.Core;
using NuGet;
namespace ICSharpCode.PackageManagement
@@ -51,7 +52,7 @@ namespace ICSharpCode.PackageManagement
public RegisteredPackageSourceSettings(ISettings settings)
: this(
settings,
- new PackageSourceProvider(settings, new [] { RegisteredPackageSources.DefaultPackageSource }),
+ CreatePackageSourceProvider (settings),
RegisteredPackageSources.DefaultPackageSource)
{
}
@@ -67,6 +68,11 @@ namespace ICSharpCode.PackageManagement
ReadActivePackageSource();
}
+ static IPackageSourceProvider CreatePackageSourceProvider (ISettings settings)
+ {
+ return new PackageSourceProvider (settings, new [] { RegisteredPackageSources.DefaultPackageSource });
+ }
+
void ReadActivePackageSource()
{
IList<KeyValuePair<string, string>> packageSources = settings.GetValues(ActivePackageSourceSectionName);
@@ -76,11 +82,25 @@ namespace ICSharpCode.PackageManagement
public RegisteredPackageSources PackageSources {
get {
if (packageSources == null) {
- ReadPackageSources();
+ TryReadPackageSources();
}
return packageSources;
}
}
+
+ void TryReadPackageSources()
+ {
+ try {
+ ReadPackageSources ();
+ } catch (Exception ex) {
+ LoggingService.LogError ("Unable to read NuGet.config file.", ex);
+
+ // Fallback to using the default package source only (nuget.org)
+ // and treat NuGet.config as read-only.
+ packageSourceProvider = CreatePackageSourceProvider (NullSettings.Instance);
+ ReadPackageSources ();
+ }
+ }
void ReadPackageSources()
{
@@ -117,6 +137,12 @@ namespace ICSharpCode.PackageManagement
}
set {
activePackageSource = value;
+
+ if (settings is NullSettings) {
+ // NuGet failed to load settings so do not try to update them since this will fail.
+ return;
+ }
+
if (activePackageSource == null) {
RemoveActivePackageSourceSetting();
} else {
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RegisteredPackageSourcesViewModel.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RegisteredPackageSourcesViewModel.cs
index 5b551613ea..9dad10f11e 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RegisteredPackageSourcesViewModel.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RegisteredPackageSourcesViewModel.cs
@@ -37,7 +37,7 @@ using NuGet;
namespace ICSharpCode.PackageManagement
{
- public class RegisteredPackageSourcesViewModel : ViewModelBase<RegisteredPackageSourcesViewModel>, IDisposable
+ public class RegisteredPackageSourcesViewModel : ViewModelBase<RegisteredPackageSourcesViewModel>, IDisposable, IPackageSourceProvider
{
ObservableCollection<PackageSourceViewModel> packageSourceViewModels =
new ObservableCollection<PackageSourceViewModel>();
@@ -127,19 +127,32 @@ namespace ICSharpCode.PackageManagement
public ICommand BrowsePackageFolderCommand {
get { return browsePackageFolderCommand; }
}
-
+
+ public ICommand UpdatePackageSourceCommand {
+ get { return updatePackageSourceCommand; }
+ }
+
public ObservableCollection<PackageSourceViewModel> PackageSourceViewModels {
get { return packageSourceViewModels; }
}
public void Load()
{
- PackageManagementServices.DisablePromptForCredentials ();
+ ReplaceExistingPackageSourceCredentialProvider ();
foreach (PackageSource packageSource in packageSources) {
AddPackageSourceToViewModel(packageSource);
}
}
+
+ /// <summary>
+ /// Use this class as the source of package source credentials and disable any
+ /// prompt for credentials.
+ /// </summary>
+ void ReplaceExistingPackageSourceCredentialProvider ()
+ {
+ HttpClient.DefaultCredentialProvider = new SettingsCredentialProvider (NullCredentialProvider.Instance, this);
+ }
void AddPackageSourceToViewModel(PackageSource packageSource)
{
@@ -380,5 +393,28 @@ namespace ICSharpCode.PackageManagement
PackageManagementServices.InitializeCredentialProvider ();
}
}
+
+ /// <summary>
+ /// This is called by NuGet's credential provider when a request needs
+ /// a username and password. We return the current package sources
+ /// stored in Preferences with the latest usernames and passwords.
+ /// </summary>
+ IEnumerable<PackageSource> IPackageSourceProvider.LoadPackageSources ()
+ {
+ return packageSourceViewModels.Select (viewModel => viewModel.GetPackageSource ());
+ }
+
+ void IPackageSourceProvider.SavePackageSources (IEnumerable<PackageSource> sources)
+ {
+ }
+
+ void IPackageSourceProvider.DisablePackageSource (PackageSource source)
+ {
+ }
+
+ bool IPackageSourceProvider.IsPackageSourceEnabled (PackageSource source)
+ {
+ return true;
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SearchPackagesDataSource.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SearchPackagesDataSource.cs
index 12244289aa..0c6de1100b 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SearchPackagesDataSource.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SearchPackagesDataSource.cs
@@ -90,7 +90,12 @@ namespace MonoDevelop.PackageManagement
}
int ISearchDataSource.ItemCount {
- get { return 1; }
+ get {
+ if (IsProjectSelected ()) {
+ return 1;
+ }
+ return 0;
+ }
}
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopPackageManagerFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopPackageManagerFactory.cs
index 4f5d627629..eda02af109 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopPackageManagerFactory.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopPackageManagerFactory.cs
@@ -26,6 +26,7 @@
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
using NuGet;
@@ -57,10 +58,10 @@ namespace ICSharpCode.PackageManagement
public ISharpDevelopPackageManager CreatePackageManager(
IPackageRepository sourceRepository,
- DotNetProject project)
+ IDotNetProject project)
{
- SolutionPackageRepository solutionPackageRepository = CreateSolutionPackageRepository(project.ParentSolution);
- IProjectSystem projectSystem = CreateProjectSystem(project);
+ SolutionPackageRepository solutionPackageRepository = CreateSolutionPackageRepository (project.ParentSolution);
+ IProjectSystem projectSystem = CreateProjectSystem (project.DotNetProject);
PackageOperationsResolverFactory packageOperationResolverFactory = new PackageOperationsResolverFactory();
return new SharpDevelopPackageManager(
@@ -70,9 +71,9 @@ namespace ICSharpCode.PackageManagement
packageOperationResolverFactory);
}
- SolutionPackageRepository CreateSolutionPackageRepository(Solution solution)
+ SolutionPackageRepository CreateSolutionPackageRepository (ISolution solution)
{
- return new SolutionPackageRepository(solution, packageRepositoryFactory, options);
+ return new SolutionPackageRepository (solution, packageRepositoryFactory, options);
}
IProjectSystem CreateProjectSystem(DotNetProject project)
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopPackageRepositoryFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopPackageRepositoryFactory.cs
index ae396a290a..938cf529a5 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopPackageRepositoryFactory.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopPackageRepositoryFactory.cs
@@ -34,18 +34,6 @@ namespace ICSharpCode.PackageManagement
{
public class SharpDevelopPackageRepositoryFactory : PackageRepositoryFactory, ISharpDevelopPackageRepositoryFactory
{
- IPackageManagementEvents packageManagementEvents;
-
- public SharpDevelopPackageRepositoryFactory()
- : this(PackageManagementServices.PackageManagementEvents)
- {
- }
-
- public SharpDevelopPackageRepositoryFactory(IPackageManagementEvents packageManagementEvents)
- {
- this.packageManagementEvents = packageManagementEvents;
- }
-
public ISharedPackageRepository CreateSharedRepository(
IPackagePathResolver pathResolver,
IFileSystem fileSystem,
@@ -58,7 +46,7 @@ namespace ICSharpCode.PackageManagement
IList<RecentPackageInfo> recentPackages,
IPackageRepository aggregateRepository)
{
- return new RecentPackageRepository(recentPackages, aggregateRepository, packageManagementEvents);
+ return new RecentPackageRepository(recentPackages, aggregateRepository);
}
public IPackageRepository CreateAggregateRepository(IEnumerable<IPackageRepository> repositories)
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopProjectSystem.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopProjectSystem.cs
index 258818d24f..6a4c7d5e62 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopProjectSystem.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopProjectSystem.cs
@@ -41,25 +41,30 @@ namespace ICSharpCode.PackageManagement
{
public class SharpDevelopProjectSystem : PhysicalFileSystem, IProjectSystem
{
- DotNetProject project;
+ IDotNetProject project;
ProjectTargetFramework targetFramework;
IPackageManagementFileService fileService;
- IPackageManagementProjectService projectService;
-
+ Action<MessageHandler> guiSyncDispatcher;
+
public SharpDevelopProjectSystem(DotNetProject project)
- : this(project, new PackageManagementFileService(), new PackageManagementProjectService())
+ : this (
+ new DotNetProjectProxy (project),
+ new PackageManagementFileService (),
+ new PackageManagementProjectService (),
+ DispatchService.GuiSyncDispatch)
{
}
- public SharpDevelopProjectSystem(
- DotNetProject project,
+ public SharpDevelopProjectSystem (
+ IDotNetProject project,
IPackageManagementFileService fileService,
- IPackageManagementProjectService projectService)
- : base(AppendTrailingSlashToDirectory(project.BaseDirectory))
+ IPackageManagementProjectService projectService,
+ Action<MessageHandler> guiSyncDispatcher)
+ : base (AppendTrailingSlashToDirectory (project.BaseDirectory))
{
this.project = project;
this.fileService = fileService;
- this.projectService = projectService;
+ this.guiSyncDispatcher = guiSyncDispatcher;
}
static string AppendTrailingSlashToDirectory(string directory)
@@ -88,14 +93,17 @@ namespace ICSharpCode.PackageManagement
return GuiSyncDispatch (() => project.Name);
}
}
-
- public dynamic GetPropertyValue(string propertyName)
+
+ public dynamic GetPropertyValue (string propertyName)
{
return GuiSyncDispatch (() => {
- return project.GetEvaluatedProperty (propertyName);
+ if ("RootNamespace".Equals(propertyName, StringComparison.OrdinalIgnoreCase)) {
+ return project.DefaultNamespace;
+ }
+ return String.Empty;
});
}
-
+
public void AddReference(string referencePath, Stream stream)
{
GuiSyncDispatch (() => {
@@ -249,10 +257,15 @@ namespace ICSharpCode.PackageManagement
public override void AddFile(string path, Action<Stream> writeToStream)
{
- base.AddFile(path, writeToStream);
+ PhysicalFileSystemAddFile (path, writeToStream);
GuiSyncDispatch (() => AddFileToProject (path));
}
-
+
+ protected virtual void PhysicalFileSystemAddFile (string path, Action<Stream> writeToStream)
+ {
+ base.AddFile(path, writeToStream);
+ }
+
void AddFileToProject(string path)
{
if (ShouldAddFileToProject(path)) {
@@ -416,13 +429,13 @@ namespace ICSharpCode.PackageManagement
T GuiSyncDispatch<T> (Func<T> action)
{
T result = default(T);
- DispatchService.GuiSyncDispatch (() => result = action ());
+ guiSyncDispatcher (() => result = action ());
return result;
}
void GuiSyncDispatch (Action action)
{
- DispatchService.GuiSyncDispatch (() => action ());
+ guiSyncDispatcher (() => action ());
}
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepository.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepository.cs
index e6cb4013e5..47600b40a3 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepository.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepository.cs
@@ -30,7 +30,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
-using MonoDevelop.Projects;
+using MonoDevelop.PackageManagement;
using NuGet;
namespace ICSharpCode.PackageManagement
@@ -43,16 +43,16 @@ namespace ICSharpCode.PackageManagement
PhysicalFileSystem fileSystem;
ISharedPackageRepository repository;
- public SolutionPackageRepository(Solution solution)
- : this(
+ public SolutionPackageRepository (ISolution solution)
+ : this (
solution,
new SharpDevelopPackageRepositoryFactory(),
PackageManagementServices.Options)
{
}
- public SolutionPackageRepository(
- Solution solution,
+ public SolutionPackageRepository (
+ ISolution solution,
ISharpDevelopPackageRepositoryFactory repositoryFactory,
PackageManagementOptions options)
{
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryFactory.cs
index 9ac4dca212..d08e71d5c7 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryFactory.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryFactory.cs
@@ -27,6 +27,7 @@
//
using System;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
using NuGet;
@@ -50,9 +51,9 @@ namespace ICSharpCode.PackageManagement
this.options = options;
}
- public ISolutionPackageRepository CreateSolutionPackageRepository(Solution solution)
+ public ISolutionPackageRepository CreateSolutionPackageRepository (ISolution solution)
{
- return new SolutionPackageRepository(solution, repositoryFactory, options);
+ return new SolutionPackageRepository (solution, repositoryFactory, options);
}
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryPath.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryPath.cs
index 6daca5784d..3265a3984e 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryPath.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryPath.cs
@@ -28,6 +28,7 @@
using System;
using System.IO;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
using NuGet;
@@ -36,20 +37,20 @@ namespace ICSharpCode.PackageManagement
public class SolutionPackageRepositoryPath
{
string packagesRelativeDirectory;
- Solution solution;
+ ISolution solution;
DefaultPackagePathResolver pathResolver;
public SolutionPackageRepositoryPath(Project project)
- : this(project, new PackageManagementOptions())
+ : this (new ProjectProxy (project), new PackageManagementOptions ())
{
}
- public SolutionPackageRepositoryPath(Project project, PackageManagementOptions options)
- : this(project.ParentSolution, options)
+ public SolutionPackageRepositoryPath (IProject project, PackageManagementOptions options)
+ : this (project.ParentSolution, options)
{
}
- public SolutionPackageRepositoryPath(Solution solution, PackageManagementOptions options)
+ public SolutionPackageRepositoryPath (ISolution solution, PackageManagementOptions options)
{
packagesRelativeDirectory = options.PackagesDirectory;
this.solution = solution;
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionProxy.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionProxy.cs
new file mode 100644
index 0000000000..a41e940ccd
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionProxy.cs
@@ -0,0 +1,51 @@
+//
+// SolutionProxy.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using MonoDevelop.Core;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.PackageManagement
+{
+ public class SolutionProxy : ISolution
+ {
+ Solution solution;
+
+ public SolutionProxy (Solution solution)
+ {
+ this.solution = solution;
+ }
+
+ public FilePath BaseDirectory {
+ get { return solution.BaseDirectory; }
+ }
+
+ public FilePath FileName {
+ get { return solution.FileName; }
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ThreadSafePackageManagementEvents.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ThreadSafePackageManagementEvents.cs
index 30060f11c3..55ff40412a 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ThreadSafePackageManagementEvents.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ThreadSafePackageManagementEvents.cs
@@ -36,15 +36,26 @@ namespace ICSharpCode.PackageManagement
{
public class ThreadSafePackageManagementEvents : IThreadSafePackageManagementEvents
{
+ static Action<MessageHandler> defaultGuiSyncDispatcher = DispatchService.GuiSyncDispatch;
+
+ Action<MessageHandler> guiSyncDispatcher;
IPackageManagementEvents unsafeEvents;
-
- public ThreadSafePackageManagementEvents(IPackageManagementEvents unsafeEvents)
+
+ public ThreadSafePackageManagementEvents (IPackageManagementEvents unsafeEvents)
+ : this (unsafeEvents, defaultGuiSyncDispatcher)
+ {
+ }
+
+ public ThreadSafePackageManagementEvents (
+ IPackageManagementEvents unsafeEvents,
+ Action<MessageHandler> guiSyncDispatcher)
{
this.unsafeEvents = unsafeEvents;
+ this.guiSyncDispatcher = guiSyncDispatcher;
RegisterEventHandlers();
}
-
+
void RegisterEventHandlers()
{
unsafeEvents.PackageOperationsStarting += RaisePackageOperationStartingEventIfHasSubscribers;
@@ -75,7 +86,7 @@ namespace ICSharpCode.PackageManagement
void RaisePackageOperationStartingEventIfHasSubscribers(object sender, EventArgs e)
{
if (PackageOperationsStarting != null) {
- DispatchService.GuiSyncDispatch (() => RaisePackageOperationStartingEvent (sender, e));
+ guiSyncDispatcher (() => RaisePackageOperationStartingEvent (sender, e));
}
}
@@ -89,7 +100,7 @@ namespace ICSharpCode.PackageManagement
void RaisePackageOperationFinishedEventIfHasSubscribers(object sender, EventArgs e)
{
if (PackageOperationsFinished != null) {
- DispatchService.GuiSyncDispatch (() => RaisePackageOperationFinishedEvent (sender, e));
+ guiSyncDispatcher (() => RaisePackageOperationFinishedEvent (sender, e));
}
}
@@ -103,14 +114,14 @@ namespace ICSharpCode.PackageManagement
void RaisePackageOperationErrorEventIfHasSubscribers(object sender, PackageOperationExceptionEventArgs e)
{
if (PackageOperationError != null) {
- DispatchService.GuiSyncDispatch (() => RaisePackageOperationErrorEvent(sender, e));
+ guiSyncDispatcher (() => RaisePackageOperationErrorEvent(sender, e));
}
}
void RaisePackageOperationErrorEvent(object sender, PackageOperationExceptionEventArgs e)
{
if (PackageOperationError != null) {
- DispatchService.GuiSyncDispatch (() => PackageOperationError(sender, e));
+ guiSyncDispatcher (() => PackageOperationError(sender, e));
}
}
@@ -119,7 +130,7 @@ namespace ICSharpCode.PackageManagement
void RaiseParentPackageInstalledEventIfHasSubscribers(object sender, ParentPackageOperationEventArgs e)
{
if (ParentPackageInstalled != null) {
- DispatchService.GuiSyncDispatch (() => RaiseParentPackageInstalledEvent(sender, e));
+ guiSyncDispatcher (() => RaiseParentPackageInstalledEvent(sender, e));
}
}
@@ -133,7 +144,7 @@ namespace ICSharpCode.PackageManagement
void RaiseParentPackageUninstalledEventIfHasSubscribers(object sender, ParentPackageOperationEventArgs e)
{
if (ParentPackageUninstalled != null) {
- DispatchService.GuiSyncDispatch (() => RaiseParentPackageUninstalledEvent(sender, e));
+ guiSyncDispatcher (() => RaiseParentPackageUninstalledEvent(sender, e));
}
}
@@ -209,7 +220,7 @@ namespace ICSharpCode.PackageManagement
void RaiseResolveFileConflictEventIfHasSubscribers (object sender, ResolveFileConflictEventArgs e)
{
if (ResolveFileConflict != null) {
- DispatchService.GuiSyncDispatch (() => ResolveFileConflict (sender, e));
+ guiSyncDispatcher (() => ResolveFileConflict (sender, e));
}
}
@@ -223,7 +234,7 @@ namespace ICSharpCode.PackageManagement
void RaiseParentPackagesUpdatedEventIfHasSubscribers(object sender, ParentPackagesOperationEventArgs e)
{
if (ParentPackagesUpdated != null) {
- DispatchService.GuiSyncDispatch (() => RaiseParentPackagesUpdatedEvent(sender, e));
+ guiSyncDispatcher (() => RaiseParentPackagesUpdatedEvent(sender, e));
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/UserAgentGeneratorForRepositoryRequests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/UserAgentGeneratorForRepositoryRequests.cs
index 74a93b5ed9..8d878cab00 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/UserAgentGeneratorForRepositoryRequests.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/UserAgentGeneratorForRepositoryRequests.cs
@@ -34,8 +34,8 @@ namespace ICSharpCode.PackageManagement
public class UserAgentGeneratorForRepositoryRequests
{
MonoDevelopHttpUserAgent userAgent = new MonoDevelopHttpUserAgent();
-
- public UserAgentGeneratorForRepositoryRequests(IPackageRepositoryFactoryEvents repositoryFactoryEvents)
+
+ public void Register (IPackageRepositoryFactoryEvents repositoryFactoryEvents)
{
repositoryFactoryEvents.RepositoryCreated += RepositoryCreated;
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/icons/light/prefs-package-16.png b/main/src/addins/MonoDevelop.PackageManagement/icons/light/prefs-package-16.png
new file mode 100644
index 0000000000..b441192270
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/icons/light/prefs-package-16.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.PackageManagement/icons/light/prefs-package-16@2x.png b/main/src/addins/MonoDevelop.PackageManagement/icons/light/prefs-package-16@2x.png
new file mode 100644
index 0000000000..a59c599aca
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/icons/light/prefs-package-16@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.PackageManagement/icons/light/prefs-package-source-16.png b/main/src/addins/MonoDevelop.PackageManagement/icons/light/prefs-package-source-16.png
new file mode 100644
index 0000000000..c01c3f5eb0
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/icons/light/prefs-package-source-16.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.PackageManagement/icons/light/prefs-package-source-16@2x.png b/main/src/addins/MonoDevelop.PackageManagement/icons/light/prefs-package-source-16@2x.png
new file mode 100644
index 0000000000..7e19f0f3b1
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/icons/light/prefs-package-source-16@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.AnalysisCore/Gui/ResultMarker.cs b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.AnalysisCore/Gui/ResultMarker.cs
index 88c7167c2d..332f0061cf 100644
--- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.AnalysisCore/Gui/ResultMarker.cs
+++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.AnalysisCore/Gui/ResultMarker.cs
@@ -172,15 +172,25 @@ namespace MonoDevelop.AnalysisCore.Gui
int markerEnd = Segment.EndOffset;
for (int i = 0; i < chunks.Count; i++) {
var chunk = chunks [i];
- if (chunk.EndOffset < markerStart || markerEnd <= chunk.Offset)
+ if (chunk.EndOffset < markerStart || markerEnd <= chunk.Offset)
continue;
if (chunk.Offset == markerStart && chunk.EndOffset == markerEnd)
return;
- if (chunk.Offset < markerStart && chunk.EndOffset > markerEnd) {
- var newChunk = new Chunk (chunk.Offset, markerStart - chunk.Offset, chunk.Style);
- chunks.Insert (i, newChunk);
- chunk.Offset += newChunk.Length;
- chunk.Length -= newChunk.Length;
+
+ if (chunk.Offset <= markerStart && chunk.EndOffset >= markerEnd) {
+ if (markerStart - chunk.Offset > 0) {
+ var newChunk = new Chunk (chunk.Offset, markerStart - chunk.Offset, chunk.Style);
+ chunks.Insert (i, newChunk);
+ chunk.Offset += newChunk.Length;
+ chunk.Length -= newChunk.Length;
+ chunk = newChunk;
+ }
+ if (markerEnd < chunk.EndOffset) {
+ var newChunk = new Chunk (chunk.Offset, markerEnd - chunk.Offset, chunk.Style);
+ chunks.Insert (i, newChunk);
+ chunk.Offset += newChunk.Length;
+ chunk.Length -= newChunk.Length;
+ }
continue;
}
}
diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeActions/CodeActionEditorExtension.cs b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeActions/CodeActionEditorExtension.cs
index 02173cb7d7..9c3b135e75 100644
--- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeActions/CodeActionEditorExtension.cs
+++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeActions/CodeActionEditorExtension.cs
@@ -166,9 +166,9 @@ namespace MonoDevelop.CodeActions
if (token.IsCancellationRequested)
return;
CreateSmartTag (fixes, loc);
- quickFixTimeout = 0;
});
});
+ quickFixTimeout = 0;
return false;
});
} else {
diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeIssues/CodeIssuePanelWidget.cs b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeIssues/CodeIssuePanelWidget.cs
index 00da20d50a..0bb54c2812 100644
--- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeIssues/CodeIssuePanelWidget.cs
+++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeIssues/CodeIssuePanelWidget.cs
@@ -213,7 +213,7 @@ namespace MonoDevelop.CodeIssues
int w = 10;
var newCellArea = new Gdk.Rectangle (cell_area.X + w, cell_area.Y, cell_area.Width - w, cell_area.Height);
using (var ctx = CairoHelper.Create (window)) {
- ctx.DrawImage (widget, Icon, cell_area.X - 4, cell_area.Y + (cell_area.Height - Icon.Height) / 2);
+ ctx.DrawImage (widget, Icon, cell_area.X - 4, cell_area.Y + Math.Round ((cell_area.Height - Icon.Height) / 2));
}
base.Render (window, widget, background_area, newCellArea, expose_area, flags);
diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.addin.xml b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.addin.xml
index fc75465d12..3a57b9a33b 100644
--- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.addin.xml
+++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.addin.xml
@@ -162,18 +162,14 @@
<!-- Options panels -->
<Extension path = "/MonoDevelop/Ide/GlobalOptionsDialog/SourceCode">
- <Section id = "C#" _label = "C#">
- <Section id = "CodeIssuePanel" _label = "Code Rules" fill="true"
- class="MonoDevelop.CodeIssues.CodeIssuePanel"/>
- <Section id = "CodeActions" _label = "Code Actions" fill="true"
- icon="md-text-quickfix"
- class="MonoDevelop.CodeActions.CodeActionPanel"/>
+ <Section id="C#" _label="C#" icon="md-prefs-csharp">
+ <Section id="CodeIssuePanel" _label="Code Rules" fill="true" class="MonoDevelop.CodeIssues.CodeIssuePanel" icon="md-prefs-code-rules" />
+ <Section id="CodeActions" _label="Code Actions" fill="true" class="MonoDevelop.CodeActions.CodeActionPanel" icon="md-prefs-code-actions" />
</Section>
</Extension>
<Extension path = "/MonoDevelop/Ide/GlobalOptionsDialog/TextEditor">
- <Section id = "Analysis" _label = "Source Analysis" fill="true"
- class="MonoDevelop.AnalysisCore.Gui.AnalysisOptionsPanel"/>
+ <Section id="Analysis" _label="Source Analysis" fill="true" class="MonoDevelop.AnalysisCore.Gui.AnalysisOptionsPanel" icon="md-prefs-code-analysis" />
</Extension>
<!-- Extensions to the addin points defined by this addin -->
@@ -196,4 +192,10 @@
<Handler fixName="RenameMember" class = "MonoDevelop.AnalysisCore.Fixes.RenameMemberHandler" />
<Handler fixName="Generic" class = "MonoDevelop.AnalysisCore.Fixes.GenericFixHandler" />
</Extension>
+
+ <Extension path="/MonoDevelop/Core/StockIcons">
+ <StockIcon stockid="md-prefs-code-actions" resource="prefs-code-actions-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-code-rules" resource="prefs-code-rules-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-code-analysis" resource="prefs-code-analysis-light-16.png" size="Menu" />
+ </Extension>
</ExtensionModel>
diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.csproj b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.csproj
index 180cc93538..207e3072b9 100644
--- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.csproj
+++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.csproj
@@ -169,6 +169,26 @@
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
+ <EmbeddedResource Include="icons\light\prefs-code-actions-16.png">
+ <LogicalName>prefs-code-actions-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-code-actions-16%402x.png">
+ <LogicalName>prefs-code-actions-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-code-rules-16.png">
+ <LogicalName>prefs-code-rules-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-code-rules-16%402x.png">
+ <LogicalName>prefs-code-rules-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-code-analysis-16.png">
+ <LogicalName>prefs-code-analysis-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-code-analysis-16%402x.png">
+ <LogicalName>prefs-code-analysis-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ </ItemGroup>
+ <ItemGroup>
<ProjectReference Include="..\..\core\MonoDevelop.Ide\MonoDevelop.Ide.csproj">
<Project>{27096E7F-C91C-4AC6-B289-6897A701DF21}</Project>
<Name>MonoDevelop.Ide</Name>
diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/ExtensionMethods.cs b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/ExtensionMethods.cs
index 43e08f684a..cb52d45e37 100644
--- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/ExtensionMethods.cs
+++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/ExtensionMethods.cs
@@ -40,42 +40,13 @@ namespace MonoDevelop.Refactoring
{
public static class ExtensionMethods
{
-
class ResolverAnnotation
{
public CancellationTokenSource SharedTokenSource;
- public TaskWrapper Task;
+ public Task<CSharpAstResolver> Task;
public CSharpUnresolvedFile ParsedFile;
}
- public class TaskWrapper {
- readonly Task<CSharpAstResolver> underlyingTask;
-
- public CSharpAstResolver Result {
- get {
- if (underlyingTask.IsCanceled)
- return null;
- try {
- return underlyingTask.Result;
- } catch (AggregateException ae) {
- if (ae.InnerException is TaskCanceledException)
- return null;
- throw;
- } catch (TaskCanceledException) {
- return null;
- } catch (Exception e) {
- LoggingService.LogWarning ("Exception while getting shared AST resolver.", e);
- return null;
- }
- }
- }
- public TaskWrapper (Task<CSharpAstResolver> underlyingTask)
- {
- this.underlyingTask = underlyingTask;
- }
-
- }
-
public static TimerCounter ResolveCounter = InstrumentationService.CreateTimerCounter("Resolve document", "Parsing");
/// <summary>
@@ -84,7 +55,7 @@ namespace MonoDevelop.Refactoring
/// resolve navigator.
/// Note: The shared resolver is fully resolved.
/// </summary>
- public static TaskWrapper GetSharedResolver (this Document document)
+ public static Task<CSharpAstResolver> GetSharedResolver (this Document document)
{
var parsedDocument = document.ParsedDocument;
if (parsedDocument == null || document.IsProjectContextInUpdate || document.Project != null && !(document.Project is DotNetProject))
@@ -122,12 +93,25 @@ namespace MonoDevelop.Refactoring
return null;
}
}, token);
- var wrapper = new TaskWrapper (resolveTask);
+
+ var wrapper = resolveTask.ContinueWith (t => {
+ if (t.IsCanceled)
+ return null;
+ if (t.IsFaulted) {
+ var ex = t.Exception.Flatten ().InnerException;
+ if (!(ex is TaskCanceledException))
+ LoggingService.LogWarning ("Exception while getting shared AST resolver.", ex);
+ return null;
+ }
+ return t.Result;
+ }, TaskContinuationOptions.ExecuteSynchronously);
+
document.AddAnnotation (new ResolverAnnotation {
Task = wrapper,
ParsedFile = parsedFile,
SharedTokenSource = tokenSource
});
+
return wrapper;
}
diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoringOptions.cs b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoringOptions.cs
index 8fd59b1397..f0f9af2e6b 100644
--- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoringOptions.cs
+++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoringOptions.cs
@@ -39,12 +39,13 @@ using System.Linq;
using ICSharpCode.NRefactory.Semantics;
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.CSharp.TypeSystem;
+using System.Threading.Tasks;
namespace MonoDevelop.Refactoring
{
public class RefactoringOptions
{
- readonly CSharpAstResolver resolver;
+ readonly Task<CSharpAstResolver> resolver;
public Document Document {
get;
@@ -78,7 +79,7 @@ namespace MonoDevelop.Refactoring
return new TextLocation (Document.Editor.Caret.Line, Document.Editor.Caret.Column);
}
}
- public readonly SyntaxTree Unit;
+ //public readonly SyntaxTree Unit;
public RefactoringOptions ()
{
@@ -91,8 +92,8 @@ namespace MonoDevelop.Refactoring
var sharedResolver = doc.GetSharedResolver ();
if (sharedResolver == null)
return;
- resolver = sharedResolver.Result;
- Unit = resolver != null ? resolver.RootNode as SyntaxTree : null;
+ resolver = sharedResolver;
+ //Unit = resolver != null ? resolver.RootNode as SyntaxTree : null;
}
}
@@ -187,7 +188,11 @@ namespace MonoDevelop.Refactoring
public ResolveResult Resolve (AstNode node)
{
- return resolver.Resolve (node);
+ if (!resolver.IsCompleted)
+ resolver.Wait (2000);
+ if (!resolver.IsCompleted)
+ return null;
+ return resolver.Result.Resolve (node);
}
public AstType CreateShortType (IType fullType)
diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoringService.cs b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoringService.cs
index 7ea562c05b..d91b6f9a6d 100644
--- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoringService.cs
+++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoringService.cs
@@ -212,7 +212,10 @@ namespace MonoDevelop.Refactoring
if (editor != null && parsedDocument != null && parsedDocument.CreateRefactoringContext != null) {
var ctx = parsedDocument.CreateRefactoringContext (doc, cancellationToken);
if (ctx != null) {
- foreach (var provider in contextActions.Where (fix => disabledNodes.IndexOf (fix.IdString, StringComparison.Ordinal) < 0)) {
+ foreach (var provider in contextActions.Where (fix =>
+ fix.MimeType == editor.MimeType &&
+ disabledNodes.IndexOf (fix.IdString, StringComparison.Ordinal) < 0))
+ {
try {
result.AddRange (provider.GetActions (doc, ctx, loc, cancellationToken));
} catch (Exception ex) {
diff --git a/main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-actions-16.png b/main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-actions-16.png
new file mode 100644
index 0000000000..3bfcaaa4a0
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-actions-16.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-actions-16@2x.png b/main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-actions-16@2x.png
new file mode 100644
index 0000000000..d3843fa488
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-actions-16@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-analysis-16.png b/main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-analysis-16.png
new file mode 100644
index 0000000000..d332c8658f
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-analysis-16.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-analysis-16@2x.png b/main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-analysis-16@2x.png
new file mode 100644
index 0000000000..ae2a84b99b
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-analysis-16@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-rules-16.png b/main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-rules-16.png
new file mode 100644
index 0000000000..7bd0114b4f
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-rules-16.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-rules-16@2x.png b/main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-rules-16@2x.png
new file mode 100644
index 0000000000..7e0f57994c
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Refactoring/icons/light/prefs-code-rules-16@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor.OptionPanels/HighlightingPanel.cs b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor.OptionPanels/HighlightingPanel.cs
index ec3fa8c04e..18b223e77f 100644
--- a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor.OptionPanels/HighlightingPanel.cs
+++ b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor.OptionPanels/HighlightingPanel.cs
@@ -82,8 +82,7 @@ namespace MonoDevelop.SourceEditor.OptionPanels
void HandleButtonNewClicked (object sender, EventArgs e)
{
var newShemeDialog = new NewColorShemeDialog ();
- MessageService.RunCustomDialog (newShemeDialog, dialog);
- newShemeDialog.Destroy ();
+ MessageService.ShowCustomDialog (newShemeDialog, dialog);
ShowStyles ();
}
@@ -113,8 +112,7 @@ namespace MonoDevelop.SourceEditor.OptionPanels
var editor = new ColorShemeEditor (this);
var colorScheme = (Mono.TextEditor.Highlighting.ColorScheme)this.styleStore.GetValue (selectedIter, 1);
editor.SetSheme (colorScheme);
- MessageService.RunCustomDialog (editor, dialog);
- editor.Destroy ();
+ MessageService.ShowCustomDialog (editor, dialog);
}
}
diff --git a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor.addin.xml b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor.addin.xml
index 1e470f8aa1..b9e4922fdf 100644
--- a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor.addin.xml
+++ b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor.addin.xml
@@ -192,15 +192,14 @@
<CommandItem id = "MonoDevelop.SourceEditor.SourceEditorCommands.ToggleErrorTextMarker" />
</Extension>
-
- <Extension path = "/MonoDevelop/Ide/GlobalOptionsDialog/TextEditor">
- <Section id = "General" insertbefore="Formatting" _label = "General" icon="md-text-editor" fill="true" class = "MonoDevelop.SourceEditor.OptionPanels.GeneralOptionsPanel"/>
- <Section id = "Markers" _label = "Markers and Rulers" icon="md-markers-rulers" class = "MonoDevelop.SourceEditor.OptionPanels.MarkerPanel"/>
- <Section id = "Behavior" _label = "Behavior" icon="md-text-editor-behavior" class = "MonoDevelop.SourceEditor.OptionPanels.BehaviorPanel"/>
- <Section id = "CompletionBehavior" _label = "Completion Behavior" class = "MonoDevelop.SourceEditor.OptionPanels.CompletionOptionsPanel"/>
-<!-- <Section id = "CompletionCharacters" _label = "Completion Characters" class = "MonoDevelop.SourceEditor.OptionPanels.CompletionCharactersPanel"/> -->
- <Section id = "CompletionAppearance" _label = "Completion Appearance" class = "MonoDevelop.SourceEditor.OptionPanels.CompletionAppearancePanel"/>
- <Section id = "SyntaxHighlighting" _label = "Syntax Highlighting" fill="true" icon="md-syntax-highlighting" class = "MonoDevelop.SourceEditor.OptionPanels.HighlightingPanel"/>
+ <Extension path="/MonoDevelop/Ide/GlobalOptionsDialog/TextEditor">
+ <Section id="General" insertbefore="Formatting" _label="General" fill="true" class="MonoDevelop.SourceEditor.OptionPanels.GeneralOptionsPanel" icon="md-prefs-text-editor-general" />
+ <Section id="Markers" _label="Markers and Rulers" class="MonoDevelop.SourceEditor.OptionPanels.MarkerPanel" icon="md-prefs-markers-rulers" />
+ <Section id="Behavior" _label="Behavior" class="MonoDevelop.SourceEditor.OptionPanels.BehaviorPanel" icon="md-prefs-text-editor-behavior" />
+ <Section id="CompletionBehavior" _label="Completion Behavior" class="MonoDevelop.SourceEditor.OptionPanels.CompletionOptionsPanel" icon="md-prefs-completion-behavior" />
+ <!-- <Section id="CompletionCharacters" _label="Completion Characters" class="MonoDevelop.SourceEditor.OptionPanels.CompletionCharactersPanel" /> -->
+ <Section id="CompletionAppearance" _label="Completion Appearance" class="MonoDevelop.SourceEditor.OptionPanels.CompletionAppearancePanel" icon="md-prefs-completion-appearance" />
+ <Section id="SyntaxHighlighting" _label="Syntax Highlighting" fill="true" class="MonoDevelop.SourceEditor.OptionPanels.HighlightingPanel" icon="md-prefs-syntax-highlighting" />
</Extension>
<Extension path = "/MonoDevelop/Ide/MainMenu/View">
@@ -238,4 +237,14 @@
<!-- 2.6+ -->
<Migration sourceVersion="2.6+" kind="UserData" path="HighlightingSchemes" isDirectory="true" />
</Extension>
+
+ <Extension path = "/MonoDevelop/Core/StockIcons">
+ <StockIcon stockid="md-prefs-markers-rulers" resource="prefs-markers-rulers-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-syntax-highlighting" resource="prefs-syntax-highlighting-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-text-editor-general" resource="prefs-text-editor-general-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-text-editor-behavior" resource="prefs-text-editor-behavior-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-completion-appearance" resource="prefs-completion-appearance-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-completion-behavior" resource="prefs-completion-behavior-light-16.png" size="Menu" />
+ </Extension>
+
</ExtensionModel>
diff --git a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor.csproj b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor.csproj
index 60d051032e..2a15bd00b3 100644
--- a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor.csproj
+++ b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor.csproj
@@ -250,6 +250,42 @@
<EmbeddedResource Include="icons\light\gutter-warning-15%402x.png">
<LogicalName>gutter-warning-light-15@2x.png</LogicalName>
</EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-markers-rulers-16.png">
+ <LogicalName>prefs-markers-rulers-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-markers-rulers-16%402x.png">
+ <LogicalName>prefs-markers-rulers-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-syntax-highlighting-16.png">
+ <LogicalName>prefs-syntax-highlighting-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-syntax-highlighting-16%402x.png">
+ <LogicalName>prefs-syntax-highlighting-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-text-editor-general-16.png">
+ <LogicalName>prefs-text-editor-general-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-text-editor-general-16%402x.png">
+ <LogicalName>prefs-text-editor-general-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-text-editor-behavior-16.png">
+ <LogicalName>prefs-text-editor-behavior-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-text-editor-behavior-16%402x.png">
+ <LogicalName>prefs-text-editor-behavior-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-completion-appearance-16.png">
+ <LogicalName>prefs-completion-appearance-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-completion-appearance-16%402x.png">
+ <LogicalName>prefs-completion-appearance-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-completion-behavior-16.png">
+ <LogicalName>prefs-completion-behavior-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-completion-behavior-16%402x.png">
+ <LogicalName>prefs-completion-behavior-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>
diff --git a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/ExtensibleTextEditor.cs b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/ExtensibleTextEditor.cs
index 68ba98aeb4..a9f32e1d42 100644
--- a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/ExtensibleTextEditor.cs
+++ b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/ExtensibleTextEditor.cs
@@ -87,6 +87,12 @@ namespace MonoDevelop.SourceEditor
{
Initialize (view);
}
+
+ void HandleParseOperationFinished (object sender, EventArgs e)
+ {
+ resolveResult = null;
+ resolveRegion = DomRegion.Empty;
+ }
public ExtensibleTextEditor (SourceEditorView view)
{
@@ -112,7 +118,8 @@ namespace MonoDevelop.SourceEditor
};
Document.TextReplaced += HandleSkipCharsOnReplace;
-
+ TypeSystemService.ParseOperationFinished += HandleParseOperationFinished;
+
UpdateEditMode ();
this.DoPopupMenu = ShowPopup;
}
@@ -189,6 +196,7 @@ namespace MonoDevelop.SourceEditor
protected override void OnDestroyed ()
{
+ TypeSystemService.ParseOperationFinished -= HandleParseOperationFinished;
UnregisterAdjustments ();
resolveResult = null;
Extension = null;
diff --git a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/SourceEditorWidget.cs b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/SourceEditorWidget.cs
index fb125f8867..0c2c6c84d3 100644
--- a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/SourceEditorWidget.cs
+++ b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/SourceEditorWidget.cs
@@ -246,14 +246,29 @@ namespace MonoDevelop.SourceEditor
return;
if (QuickTaskStrip.EnableFancyFeatures) {
GtkWorkarounds.SetOverlayScrollbarPolicy (scrolledWindow, PolicyType.Automatic, PolicyType.Never);
+ SetSuppressScrollbar (true);
+ } else {
+ GtkWorkarounds.SetOverlayScrollbarPolicy (scrolledWindow, PolicyType.Automatic, PolicyType.Automatic);
+ SetSuppressScrollbar (false);
+ }
+ QueueResize ();
+ }
+
+ bool suppressScrollbar;
+
+ void SetSuppressScrollbar (bool value)
+ {
+ if (suppressScrollbar == value)
+ return;
+ suppressScrollbar = value;
+
+ if (suppressScrollbar) {
scrolledWindow.VScrollbar.SizeRequested += SuppressSize;
scrolledWindow.VScrollbar.ExposeEvent += SuppressExpose;
} else {
- GtkWorkarounds.SetOverlayScrollbarPolicy (scrolledWindow, PolicyType.Automatic, PolicyType.Automatic);
scrolledWindow.VScrollbar.SizeRequested -= SuppressSize;
scrolledWindow.VScrollbar.ExposeEvent -= SuppressExpose;
}
- QueueResize ();
}
[GLib.ConnectBefore]
@@ -296,6 +311,7 @@ namespace MonoDevelop.SourceEditor
if (scrolledWindow.Child != null)
RemoveEvents ();
+ SetSuppressScrollbar (false);
QuickTaskStrip.EnableFancyFeatures.Changed -= FancyFeaturesChanged;
scrolledWindow.ButtonPressEvent -= PrepareEvent;
base.OnDestroyed ();
diff --git a/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-completion-appearance-16.png b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-completion-appearance-16.png
new file mode 100644
index 0000000000..536c7bdb27
--- /dev/null
+++ b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-completion-appearance-16.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-completion-appearance-16@2x.png b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-completion-appearance-16@2x.png
new file mode 100644
index 0000000000..8883b8b5ec
--- /dev/null
+++ b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-completion-appearance-16@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-completion-behavior-16.png b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-completion-behavior-16.png
new file mode 100644
index 0000000000..536c7bdb27
--- /dev/null
+++ b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-completion-behavior-16.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-completion-behavior-16@2x.png b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-completion-behavior-16@2x.png
new file mode 100644
index 0000000000..8883b8b5ec
--- /dev/null
+++ b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-completion-behavior-16@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-markers-rulers-16.png b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-markers-rulers-16.png
new file mode 100644
index 0000000000..2272d20f00
--- /dev/null
+++ b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-markers-rulers-16.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-markers-rulers-16@2x.png b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-markers-rulers-16@2x.png
new file mode 100644
index 0000000000..be480ee9b7
--- /dev/null
+++ b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-markers-rulers-16@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-syntax-highlighting-16.png b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-syntax-highlighting-16.png
new file mode 100644
index 0000000000..878fd038b1
--- /dev/null
+++ b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-syntax-highlighting-16.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-syntax-highlighting-16@2x.png b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-syntax-highlighting-16@2x.png
new file mode 100644
index 0000000000..f5e72e78dc
--- /dev/null
+++ b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-syntax-highlighting-16@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-text-editor-behavior-16.png b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-text-editor-behavior-16.png
new file mode 100644
index 0000000000..bf175ec49a
--- /dev/null
+++ b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-text-editor-behavior-16.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-text-editor-behavior-16@2x.png b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-text-editor-behavior-16@2x.png
new file mode 100644
index 0000000000..e4a86d4fd8
--- /dev/null
+++ b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-text-editor-behavior-16@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-text-editor-general-16.png b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-text-editor-general-16.png
new file mode 100644
index 0000000000..3dee46575c
--- /dev/null
+++ b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-text-editor-general-16.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-text-editor-general-16@2x.png b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-text-editor-general-16@2x.png
new file mode 100644
index 0000000000..e0e6d11f70
--- /dev/null
+++ b/main/src/addins/MonoDevelop.SourceEditor2/icons/light/prefs-text-editor-general-16@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.XmlEditor/MonoDevelop.Xml.StateEngine/Parser.cs b/main/src/addins/MonoDevelop.XmlEditor/MonoDevelop.Xml.StateEngine/Parser.cs
index 6c6e481965..973040371e 100755
--- a/main/src/addins/MonoDevelop.XmlEditor/MonoDevelop.Xml.StateEngine/Parser.cs
+++ b/main/src/addins/MonoDevelop.XmlEditor/MonoDevelop.Xml.StateEngine/Parser.cs
@@ -127,15 +127,15 @@ namespace MonoDevelop.Xml.StateEngine
public void Push (char c)
{
try {
- //track line, column
+ //FIXME: position/location should be at current char, not after it
+ position++;
if (c == '\n') {
previousLineEnd = new TextLocation (location.Line, location.Column + 1);
location = new TextLocation (location.Line + 1, 1);
} else {
location = new TextLocation (location.Line, location.Column + 1);
}
-
- position++;
+
for (int loopLimit = 0; loopLimit < 10; loopLimit++) {
currentStateLength++;
string rollback = null;
@@ -161,15 +161,26 @@ namespace MonoDevelop.Xml.StateEngine
// only loop if the same char should be run through the new state
if (rollback == null)
return;
-
+
+ //simple rollback, just run same char through again
+ if (rollback.Length == 0)
+ continue;
+
//"complex" rollbacks require actually skipping backwards.
//Note the previous state is invalid for this operation.
- else if (rollback.Length > 0) {
- position -= (rollback.Length + 1);
- foreach (char rollChar in rollback)
- Push (rollChar);
- position++;
- }
+
+ //rollback position and location so they're valid
+ position -= (rollback.Length + 1);
+ location = new TextLocation (location.Line, location.Column - (rollback.Length + 1));
+ if (location.Column < 0)
+ throw new InvalidOperationException ("Can't roll back across line boundary");
+
+ foreach (char rollChar in rollback)
+ Push (rollChar);
+
+ //restore position and location
+ position++;
+ location = new TextLocation (location.Line, location.Column + 1);
}
throw new InvalidOperationException ("Too many state changes for char '" + c + "'. Current state is " + currentState.ToString () + ".");
} catch (Exception ex) {
@@ -292,13 +303,13 @@ namespace MonoDevelop.Xml.StateEngine
void IParseContext.LogWarning (string message)
{
if (errors != null || ErrorLogged != null)
- InternalLogError (new Error (ErrorType.Warning, message, Location));
+ InternalLogError (new Error (ErrorType.Warning, message, ((IParseContext)this).LocationMinus (1)));
}
void IParseContext.LogError (string message, TextLocation location)
{
if (errors != null || ErrorLogged != null)
- InternalLogError (new Error (ErrorType.Error, message, location));
+ InternalLogError (new Error (ErrorType.Error, message, ((IParseContext)this).LocationMinus (1)));
}
void IParseContext.LogWarning (string message, TextLocation location)
diff --git a/main/src/addins/MonoDevelop.XmlEditor/MonoDevelop.Xml.StateEngine/XmlClosingTagState.cs b/main/src/addins/MonoDevelop.XmlEditor/MonoDevelop.Xml.StateEngine/XmlClosingTagState.cs
index 3f7a035afe..7893d54365 100644
--- a/main/src/addins/MonoDevelop.XmlEditor/MonoDevelop.Xml.StateEngine/XmlClosingTagState.cs
+++ b/main/src/addins/MonoDevelop.XmlEditor/MonoDevelop.Xml.StateEngine/XmlClosingTagState.cs
@@ -54,7 +54,6 @@ namespace MonoDevelop.Xml.StateEngine
if (ct == null) {
Debug.Assert (context.CurrentStateLength == 1,
"IncompleteNode must not be an XClosingTag when CurrentStateLength is 1");
- Debug.Assert (context.Nodes.Peek () is XElement);
ct = new XClosingTag (context.LocationMinus (3)); //3 = </ and the current char
context.Nodes.Push (ct);
@@ -99,7 +98,9 @@ namespace MonoDevelop.Xml.StateEngine
context.Nodes.Pop ();
} else {
context.LogError (
- "Closing tag '" + ct.Name.FullName + "' does not match any currently open tag.");
+ "Closing tag '" + ct.Name.FullName + "' does not match any currently open tag.",
+ ct.Region
+ );
}
} else {
context.LogError ("Closing tag ended prematurely.");
diff --git a/main/src/addins/MonoDevelop.XmlEditor/MonoDevelop.XmlEditor.addin.xml b/main/src/addins/MonoDevelop.XmlEditor/MonoDevelop.XmlEditor.addin.xml
index 2fb83f2b38..73e7d2ba05 100644
--- a/main/src/addins/MonoDevelop.XmlEditor/MonoDevelop.XmlEditor.addin.xml
+++ b/main/src/addins/MonoDevelop.XmlEditor/MonoDevelop.XmlEditor.addin.xml
@@ -95,10 +95,10 @@
</Extension>
<Extension path = "/MonoDevelop/Ide/GlobalOptionsDialog/TextEditor/Behavior">
- <Section id = "XmlFormattingOptions" insertbefore="Formatting" _label = "XML" fill="true" class = "MonoDevelop.XmlEditor.Gui.XmlEditorOptionsPanel"/>
+ <Section id="XmlFormattingOptions" insertbefore="Formatting" _label="XML" fill="true" class="MonoDevelop.XmlEditor.Gui.XmlEditorOptionsPanel" icon="md-prefs-xml" />
</Extension>
<Extension path = "/MonoDevelop/Ide/GlobalOptionsDialog/TextEditor">
- <Section id = "XmlSchemas" _label = "XML Schemas" fill="true" class = "MonoDevelop.XmlEditor.Gui.XmlSchemasPanel"/>
+ <Section id="XmlSchemas" _label="XML Schemas" fill="true" class="MonoDevelop.XmlEditor.Gui.XmlSchemasPanel" icon="md-prefs-xml-schemas" />
</Extension>
<!-- XPath Query pad -->
@@ -145,4 +145,9 @@
<!-- 2.6+ -->
<Migration sourceVersion="2.6+" kind="UserData" path="XmlSchemas" isDirectory="true" />
</Extension>
+
+ <Extension path="/MonoDevelop/Core/StockIcons">
+ <StockIcon stockid="md-prefs-xml" resource="prefs-xml-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-xml-schemas" resource="prefs-xml-schemas-light-16.png" size="Menu" />
+ </Extension>
</ExtensionModel>
diff --git a/main/src/addins/MonoDevelop.XmlEditor/MonoDevelop.XmlEditor.csproj b/main/src/addins/MonoDevelop.XmlEditor/MonoDevelop.XmlEditor.csproj
index d147acb5d1..c9fb3eda17 100644
--- a/main/src/addins/MonoDevelop.XmlEditor/MonoDevelop.XmlEditor.csproj
+++ b/main/src/addins/MonoDevelop.XmlEditor/MonoDevelop.XmlEditor.csproj
@@ -119,6 +119,20 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
+ <EmbeddedResource Include="icons\light\prefs-xml-16.png">
+ <LogicalName>prefs-xml-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-xml-16%402x.png">
+ <LogicalName>prefs-xml-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-xml-schemas-16.png">
+ <LogicalName>prefs-xml-schemas-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-xml-schemas-16%402x.png">
+ <LogicalName>prefs-xml-schemas-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ </ItemGroup>
+ <ItemGroup>
<Compile Include="AssemblyInfo.cs" />
<Compile Include="MonoDevelop.XmlEditor\Commands.cs" />
<Compile Include="MonoDevelop.XmlEditor\EncodedStringWriter.cs" />
diff --git a/main/src/addins/MonoDevelop.XmlEditor/icons/light/prefs-xml-16.png b/main/src/addins/MonoDevelop.XmlEditor/icons/light/prefs-xml-16.png
new file mode 100644
index 0000000000..fc6082d1cb
--- /dev/null
+++ b/main/src/addins/MonoDevelop.XmlEditor/icons/light/prefs-xml-16.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.XmlEditor/icons/light/prefs-xml-16@2x.png b/main/src/addins/MonoDevelop.XmlEditor/icons/light/prefs-xml-16@2x.png
new file mode 100644
index 0000000000..0aef2fef5d
--- /dev/null
+++ b/main/src/addins/MonoDevelop.XmlEditor/icons/light/prefs-xml-16@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.XmlEditor/icons/light/prefs-xml-schemas-16.png b/main/src/addins/MonoDevelop.XmlEditor/icons/light/prefs-xml-schemas-16.png
new file mode 100644
index 0000000000..fc6082d1cb
--- /dev/null
+++ b/main/src/addins/MonoDevelop.XmlEditor/icons/light/prefs-xml-schemas-16.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.XmlEditor/icons/light/prefs-xml-schemas-16@2x.png b/main/src/addins/MonoDevelop.XmlEditor/icons/light/prefs-xml-schemas-16@2x.png
new file mode 100644
index 0000000000..0aef2fef5d
--- /dev/null
+++ b/main/src/addins/MonoDevelop.XmlEditor/icons/light/prefs-xml-schemas-16@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDeveloperExtensions/MonoSolutionItemHandler.cs b/main/src/addins/MonoDeveloperExtensions/MonoSolutionItemHandler.cs
index b54f70ffaa..d43e15eb86 100644
--- a/main/src/addins/MonoDeveloperExtensions/MonoSolutionItemHandler.cs
+++ b/main/src/addins/MonoDeveloperExtensions/MonoSolutionItemHandler.cs
@@ -179,23 +179,29 @@ namespace MonoDeveloper
target = "clean";
DotNetProjectConfiguration conf = (DotNetProjectConfiguration) project.GetConfiguration (configuration);
-
- StringWriter output = new StringWriter ();
- LogTextWriter tw = new LogTextWriter ();
- tw.ChainWriter (output);
- tw.ChainWriter (monitor.Log);
-
- ProcessWrapper proc = Runtime.ProcessService.StartProcess ("make", "PROFILE=" + conf.Id + " " + target, conf.OutputDirectory, monitor.Log, tw, null);
- proc.WaitForOutput ();
-
- CompilerResults cr = new CompilerResults (null);
- string[] lines = output.ToString().Split ('\n');
- foreach (string line in lines) {
- CompilerError err = CreateErrorFromString (line);
- if (err != null) cr.Errors.Add (err);
+
+ using (var output = new StringWriter ()) {
+ using (var tw = new LogTextWriter ()) {
+ tw.ChainWriter (output);
+ tw.ChainWriter (monitor.Log);
+
+ using (ProcessWrapper proc = Runtime.ProcessService.StartProcess ("make", "PROFILE=" + conf.Id + " " + target, conf.OutputDirectory, monitor.Log, tw, null))
+ proc.WaitForOutput ();
+
+ tw.UnchainWriter (output);
+ tw.UnchainWriter (monitor.Log);
+
+ CompilerResults cr = new CompilerResults (null);
+ string[] lines = output.ToString().Split ('\n');
+ foreach (string line in lines) {
+ CompilerError err = CreateErrorFromString (line);
+ if (err != null) cr.Errors.Add (err);
+ }
+
+ return new BuildResult (cr, output.ToString());
+ }
}
-
- return new BuildResult (cr, output.ToString());
+
}
private CompilerError CreateErrorFromString (string error_string)
diff --git a/main/src/addins/NUnit/Gui/icons/light/unit-failed-16.png b/main/src/addins/NUnit/Gui/icons/light/unit-failed-16.png
index 9f63e50433..93e3f64b25 100644
--- a/main/src/addins/NUnit/Gui/icons/light/unit-failed-16.png
+++ b/main/src/addins/NUnit/Gui/icons/light/unit-failed-16.png
Binary files differ
diff --git a/main/src/addins/NUnit/Gui/icons/light/unit-failed-16@2x.png b/main/src/addins/NUnit/Gui/icons/light/unit-failed-16@2x.png
index b5d2da79da..adfed112c6 100644
--- a/main/src/addins/NUnit/Gui/icons/light/unit-failed-16@2x.png
+++ b/main/src/addins/NUnit/Gui/icons/light/unit-failed-16@2x.png
Binary files differ
diff --git a/main/src/addins/NUnit/Gui/icons/light/unit-mixed-results-16.png b/main/src/addins/NUnit/Gui/icons/light/unit-mixed-results-16.png
index d5bfbcec95..68eaabceb5 100644
--- a/main/src/addins/NUnit/Gui/icons/light/unit-mixed-results-16.png
+++ b/main/src/addins/NUnit/Gui/icons/light/unit-mixed-results-16.png
Binary files differ
diff --git a/main/src/addins/NUnit/Gui/icons/light/unit-mixed-results-16@2x.png b/main/src/addins/NUnit/Gui/icons/light/unit-mixed-results-16@2x.png
index ac1879bcec..eab0665fd4 100644
--- a/main/src/addins/NUnit/Gui/icons/light/unit-mixed-results-16@2x.png
+++ b/main/src/addins/NUnit/Gui/icons/light/unit-mixed-results-16@2x.png
Binary files differ
diff --git a/main/src/addins/NUnit/Gui/icons/light/unit-running-16.png b/main/src/addins/NUnit/Gui/icons/light/unit-running-16.png
index 027e9aafb9..587de48d85 100644
--- a/main/src/addins/NUnit/Gui/icons/light/unit-running-16.png
+++ b/main/src/addins/NUnit/Gui/icons/light/unit-running-16.png
Binary files differ
diff --git a/main/src/addins/NUnit/Gui/icons/light/unit-running-16@2x.png b/main/src/addins/NUnit/Gui/icons/light/unit-running-16@2x.png
index 4c652686b0..e61f579a0c 100644
--- a/main/src/addins/NUnit/Gui/icons/light/unit-running-16@2x.png
+++ b/main/src/addins/NUnit/Gui/icons/light/unit-running-16@2x.png
Binary files differ
diff --git a/main/src/addins/NUnit/Gui/icons/light/unit-success-16.png b/main/src/addins/NUnit/Gui/icons/light/unit-success-16.png
index 95400a22fe..88e9fdbb7e 100644
--- a/main/src/addins/NUnit/Gui/icons/light/unit-success-16.png
+++ b/main/src/addins/NUnit/Gui/icons/light/unit-success-16.png
Binary files differ
diff --git a/main/src/addins/NUnit/Gui/icons/light/unit-success-16@2x.png b/main/src/addins/NUnit/Gui/icons/light/unit-success-16@2x.png
index 47af0e3075..4ce7c0ad2c 100644
--- a/main/src/addins/NUnit/Gui/icons/light/unit-success-16@2x.png
+++ b/main/src/addins/NUnit/Gui/icons/light/unit-success-16@2x.png
Binary files differ
diff --git a/main/src/addins/NUnit/Services/AbstractResultsStore.cs b/main/src/addins/NUnit/Services/AbstractResultsStore.cs
index b335e67dc7..c90dfe4a31 100644
--- a/main/src/addins/NUnit/Services/AbstractResultsStore.cs
+++ b/main/src/addins/NUnit/Services/AbstractResultsStore.cs
@@ -27,11 +27,11 @@
//
using System;
-using System.IO;
-using System.Linq;
using System.Collections;
-using System.Xml.Serialization;
+using System.Collections.Generic;
using System.Globalization;
+using System.IO;
+using System.Xml.Serialization;
using MonoDevelop.Core;
namespace MonoDevelop.NUnit
@@ -274,11 +274,27 @@ namespace MonoDevelop.NUnit
}
return null;
}
+
+ // Filter out all invalid path characters in the file name
+ // Bug 3023 - Running NUnit tests throws ArgumentException: Illegal Characters in path
+ static string EscapeFilename (string str)
+ {
+ var pc = Path.GetInvalidPathChars ();
+ char[] specialCharacters = new char[pc.Length + 1];
+ pc.CopyTo (specialCharacters, 0);
+ specialCharacters [specialCharacters.Length - 1] = '%';
+
+ int i = str.IndexOfAny (specialCharacters);
+ while (i != -1) {
+ str = str.Substring (0, i) + '%' + ((int) str [i]).ToString ("X") + str.Substring (i + 1);
+ i = str.IndexOfAny (specialCharacters, i + 3);
+ }
+ return str;
+ }
string GetRootFileName (string configuration, DateTime date)
{
- // Filter out all invalid path characters in the file name (see: Bug 3023 - Running NUnit tests throws ArgumentException: Illegal Characters in path)
- var filteredConfiguration = new string (configuration.Where (c => !Path.GetInvalidPathChars ().Any (i => c == i)).ToArray ());
+ var filteredConfiguration = EscapeFilename (configuration);
return storeId + "-" + filteredConfiguration + "-" + date.ToString ("yyyy-MM-dd", CultureInfo.InvariantCulture) + ".xml";
}
@@ -298,14 +314,15 @@ namespace MonoDevelop.NUnit
if (res != null)
return res;
- ArrayList dates = new ArrayList ();
- foreach (string file in Directory.GetFiles (basePath, storeId + "-" + configuration + "-*")) {
+ var dates = new List<DateTime> ();
+ var escapedConfiguration = EscapeFilename (configuration);
+ foreach (string file in Directory.GetFiles (basePath, storeId + "-" + escapedConfiguration + "-*")) {
try {
- DateTime t = ParseFileNameDate (configuration, Path.GetFileName (file));
+ DateTime t = ParseFileNameDate (escapedConfiguration, Path.GetFileName (file));
dates.Add (t);
} catch { }
}
- res = (DateTime[]) dates.ToArray (typeof(DateTime));
+ res = dates.ToArray ();
cachedRootList [configuration] = res;
return res;
}
diff --git a/main/src/addins/NUnit/Services/NUnitProjectTestSuite.cs b/main/src/addins/NUnit/Services/NUnitProjectTestSuite.cs
index 905114cc18..8f1e45b034 100644
--- a/main/src/addins/NUnit/Services/NUnitProjectTestSuite.cs
+++ b/main/src/addins/NUnit/Services/NUnitProjectTestSuite.cs
@@ -67,7 +67,7 @@ namespace MonoDevelop.NUnit
return null;
foreach (var p in project.References)
- if (p.Reference.IndexOf ("GuiUnit", StringComparison.OrdinalIgnoreCase) != -1 || p.Reference.IndexOf ("nunit.framework") != -1 || p.Reference.IndexOf ("nunit.core") != -1)
+ if (p.Reference.IndexOf ("GuiUnit", StringComparison.OrdinalIgnoreCase) != -1 || p.Reference.IndexOf ("nunit.framework") != -1 || p.Reference.IndexOf ("nunit.core") != -1 || p.Reference.IndexOf ("nunitlite") != -1)
return new NUnitProjectTestSuite (project);
return null;
}
diff --git a/main/src/addins/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplatingEngine.cs b/main/src/addins/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplatingEngine.cs
index 3d33e45185..24394ff826 100644
--- a/main/src/addins/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplatingEngine.cs
+++ b/main/src/addins/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplatingEngine.cs
@@ -416,10 +416,6 @@ namespace Mono.TextTemplating
foreach (var dt in settings.CustomDirectives) {
var processor = settings.DirectiveProcessors[dt.ProcessorName];
-
- if (processor is RequiresProvidesDirectiveProcessor)
- throw new NotImplementedException ("RequiresProvidesDirectiveProcessor");
-
processor.ProcessDirective (dt.Directive.Name, dt.Directive.Attributes);
}
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git.Tests/BaseGitRepositoryTests.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git.Tests/BaseGitRepositoryTests.cs
index 26bbcd59a5..8841f269d3 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git.Tests/BaseGitRepositoryTests.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git.Tests/BaseGitRepositoryTests.cs
@@ -45,17 +45,17 @@ namespace MonoDevelop.VersionControl.Git.Tests
public override void Setup ()
{
// Generate directories and a svn util.
- RootUrl = new FilePath (FileService.CreateTempDirectory () + Path.DirectorySeparatorChar);
- RootCheckout = new FilePath (FileService.CreateTempDirectory () + Path.DirectorySeparatorChar);
- Directory.CreateDirectory (RootUrl.FullPath + "repo.git");
- RepoLocation = "file:///" + RootUrl.FullPath + "repo.git";
+ RemotePath = new FilePath (FileService.CreateTempDirectory () + Path.DirectorySeparatorChar);
+ LocalPath = new FilePath (FileService.CreateTempDirectory () + Path.DirectorySeparatorChar);
+ Directory.CreateDirectory (RemotePath.FullPath + "repo.git");
+ RemoteUrl = "file:///" + RemotePath.FullPath + "repo.git";
// Initialize the bare repo.
var ci = new InitCommand ();
- ci.SetDirectory (new Sharpen.FilePath (RootUrl.FullPath + "repo.git"));
+ ci.SetDirectory (new Sharpen.FilePath (RemotePath.FullPath + "repo.git"));
ci.SetBare (true);
ci.Call ();
- var bare = new FileRepository (new Sharpen.FilePath (RootUrl.FullPath + "repo.git"));
+ var bare = new FileRepository (new Sharpen.FilePath (RemotePath.FullPath + "repo.git"));
string branch = Constants.R_HEADS + "master";
RefUpdate head = bare.UpdateRef (Constants.HEAD);
@@ -63,9 +63,9 @@ namespace MonoDevelop.VersionControl.Git.Tests
head.Link (branch);
// Check out the repository.
- Checkout (RootCheckout, RepoLocation);
- Repo = GetRepo (RootCheckout, RepoLocation);
- DotDir= ".git";
+ Checkout (LocalPath, RemoteUrl);
+ Repo = GetRepo (LocalPath, RemoteUrl);
+ DotDir = ".git";
}
protected override NUnit.Framework.Constraints.IResolveConstraint IsCorrectType ()
@@ -86,7 +86,7 @@ namespace MonoDevelop.VersionControl.Git.Tests
string difftext = @"@@ -0,0 +1 @@
+text
";
- Assert.AreEqual (difftext, Repo.GenerateDiff (RootCheckout + "testfile", Repo.GetVersionInfo (RootCheckout + "testfile", VersionInfoQueryFlags.IgnoreCache)).Content.Replace ("\n", "\r\n"));
+ Assert.AreEqual (difftext, Repo.GenerateDiff (LocalPath + "testfile", Repo.GetVersionInfo (LocalPath + "testfile", VersionInfoQueryFlags.IgnoreCache)).Content.Replace ("\n", "\r\n"));
}
[Test]
@@ -177,10 +177,10 @@ namespace MonoDevelop.VersionControl.Git.Tests
AddFile ("file2", "nothing", true, true);
AddFile ("file1", "text", true, false);
repo2.GetStashes ().Create (new NullProgressMonitor ());
- Assert.IsTrue (!File.Exists (RootCheckout + "file1"), "Stash creation failure");
+ Assert.IsTrue (!File.Exists (LocalPath + "file1"), "Stash creation failure");
repo2.GetStashes ().Pop (new NullProgressMonitor ());
- VersionInfo vi = repo2.GetVersionInfo (RootCheckout + "file1", VersionInfoQueryFlags.IgnoreCache);
+ VersionInfo vi = repo2.GetVersionInfo (LocalPath + "file1", VersionInfoQueryFlags.IgnoreCache);
Assert.AreEqual (VersionStatus.ScheduledAdd, vi.Status & VersionStatus.ScheduledAdd, "Stash pop failure");
}
@@ -195,15 +195,15 @@ namespace MonoDevelop.VersionControl.Git.Tests
repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitoring.NullProgressMonitor (), "branch1");
Assert.AreEqual ("branch1", repo2.GetCurrentBranch ());
- Assert.IsTrue (File.Exists (RootCheckout + "file1"), "Branch not inheriting from current.");
+ Assert.IsTrue (File.Exists (LocalPath + "file1"), "Branch not inheriting from current.");
AddFile ("file2", "text", true, false);
repo2.CreateBranch ("branch2", null);
repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitoring.NullProgressMonitor (), "branch2");
- Assert.IsTrue (!File.Exists (RootCheckout + "file2"), "Uncommitted changes were not stashed");
+ Assert.IsTrue (!File.Exists (LocalPath + "file2"), "Uncommitted changes were not stashed");
repo2.GetStashes ().Pop (new NullProgressMonitor ());
- Assert.IsTrue (File.Exists (RootCheckout + "file2"), "Uncommitted changes were not stashed correctly");
+ Assert.IsTrue (File.Exists (LocalPath + "file2"), "Uncommitted changes were not stashed correctly");
repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitoring.NullProgressMonitor (), "master");
repo2.RemoveBranch ("branch1");
@@ -232,7 +232,7 @@ namespace MonoDevelop.VersionControl.Git.Tests
repo2.CreateBranch ("branch4", "origin/branch3");
repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitoring.NullProgressMonitor (), "branch4");
- Assert.IsTrue (File.Exists (RootCheckout + "file2"), "Tracking remote is not grabbing correct commits");
+ Assert.IsTrue (File.Exists (LocalPath + "file2"), "Tracking remote is not grabbing correct commits");
}
[Test]
@@ -248,11 +248,11 @@ namespace MonoDevelop.VersionControl.Git.Tests
ChangeSet diff = repo2.GetPushChangeSet ("origin", "master");
Assert.AreEqual (2, diff.Items.Count ());
- ChangeSetItem item = diff.GetFileItem (RootCheckout + "file1");
+ ChangeSetItem item = diff.GetFileItem (LocalPath + "file1");
Assert.IsNotNull (item);
Assert.AreEqual (VersionStatus.ScheduledAdd, item.Status & VersionStatus.ScheduledAdd);
- item = diff.GetFileItem (RootCheckout + "file1");
+ item = diff.GetFileItem (LocalPath + "file1");
Assert.IsNotNull (item);
Assert.AreEqual (VersionStatus.ScheduledAdd, item.Status & VersionStatus.ScheduledAdd);
}
@@ -363,14 +363,14 @@ namespace MonoDevelop.VersionControl.Git.Tests
{
// Test that we have the same Revision on subsequent calls when HEAD doesn't change.
AddFile ("file1", null, true, true);
- var info1 = Repo.GetVersionInfo (RootCheckout + "file1", VersionInfoQueryFlags.IgnoreCache);
- var info2 = Repo.GetVersionInfo (RootCheckout + "file1", VersionInfoQueryFlags.IgnoreCache);
+ var info1 = Repo.GetVersionInfo (LocalPath + "file1", VersionInfoQueryFlags.IgnoreCache);
+ var info2 = Repo.GetVersionInfo (LocalPath + "file1", VersionInfoQueryFlags.IgnoreCache);
Assert.IsTrue (object.ReferenceEquals (info1.Revision, info2.Revision));
// Test that we have the same Revision between two files on a HEAD bump.
AddFile ("file2", null, true, true);
var infos = Repo.GetVersionInfo (
- new FilePath[] { RootCheckout + "file1", RootCheckout + "file2" },
+ new FilePath[] { LocalPath + "file1", LocalPath + "file2" },
VersionInfoQueryFlags.IgnoreCache
).ToArray ();
Assert.IsTrue (object.ReferenceEquals (infos [0].Revision, infos [1].Revision));
@@ -381,8 +381,8 @@ namespace MonoDevelop.VersionControl.Git.Tests
// Write the first test so it also covers directories.
AddDirectory ("meh", true, false);
AddFile ("meh/file3", null, true, true);
- var info3 = Repo.GetVersionInfo (RootCheckout + "meh", VersionInfoQueryFlags.IgnoreCache);
- var info4 = Repo.GetVersionInfo (RootCheckout + "meh", VersionInfoQueryFlags.IgnoreCache);
+ var info3 = Repo.GetVersionInfo (LocalPath + "meh", VersionInfoQueryFlags.IgnoreCache);
+ var info4 = Repo.GetVersionInfo (LocalPath + "meh", VersionInfoQueryFlags.IgnoreCache);
Assert.IsTrue (object.ReferenceEquals (info3.Revision, info4.Revision));
}
}
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git.Tests/BaseRepositoryTests.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git.Tests/BaseRepositoryTests.cs
index 3d04ebd517..acdaf3d5bf 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git.Tests/BaseRepositoryTests.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git.Tests/BaseRepositoryTests.cs
@@ -41,9 +41,9 @@ namespace MonoDevelop.VersionControl.Tests
protected const string Author = "author";
protected const string Email = "email@service.domain";
- protected string RepoLocation = "";
- protected FilePath RootUrl = "";
- protected FilePath RootCheckout;
+ protected string RemoteUrl = "";
+ protected FilePath RemotePath = "";
+ protected FilePath LocalPath;
protected Repository Repo;
protected Repository Repo2;
protected string DotDir;
@@ -56,8 +56,8 @@ namespace MonoDevelop.VersionControl.Tests
[TearDown]
public virtual void TearDown ()
{
- DeleteDirectory (RootUrl);
- DeleteDirectory (RootCheckout);
+ DeleteDirectory (RemotePath);
+ DeleteDirectory (LocalPath);
AddedItems.Clear ();
CommitNumber = 0;
}
@@ -84,7 +84,7 @@ namespace MonoDevelop.VersionControl.Tests
// Tests VersionControlService.GetRepositoryReference.
public void RightRepositoryDetection ()
{
- var path = ((string)RootCheckout).TrimEnd (Path.DirectorySeparatorChar);
+ var path = ((string)LocalPath).TrimEnd (Path.DirectorySeparatorChar);
var repo = VersionControlService.GetRepositoryReference (path, null);
Assert.That (repo, IsCorrectType (), "#1");
@@ -97,12 +97,12 @@ namespace MonoDevelop.VersionControl.Tests
// Versioned file
AddFile ("foo", "contents", true, true);
- path = Path.Combine (RootCheckout, "foo");
+ path = Path.Combine (LocalPath, "foo");
Assert.AreSame (VersionControlService.GetRepositoryReference (path, null), repo, "#2");
// Versioned directory
AddDirectory ("bar", true, true);
- path = Path.Combine (RootCheckout, "bar");
+ path = Path.Combine (LocalPath, "bar");
Assert.AreSame (VersionControlService.GetRepositoryReference (path, null), repo, "#3");
// Unversioned file
@@ -114,11 +114,11 @@ namespace MonoDevelop.VersionControl.Tests
Assert.AreSame (VersionControlService.GetRepositoryReference (path, null), repo, "#5");
// Nonexistent file
- path = Path.Combine (RootCheckout, "do_i_exist");
+ path = Path.Combine (LocalPath, "do_i_exist");
Assert.AreSame (VersionControlService.GetRepositoryReference (path, null), repo, "#6");
// Nonexistent directory
- path = Path.Combine (RootCheckout, "do", "i", "exist");
+ path = Path.Combine (LocalPath, "do", "i", "exist");
Assert.AreSame (VersionControlService.GetRepositoryReference (path, null), repo, "#6");
}
@@ -136,7 +136,7 @@ namespace MonoDevelop.VersionControl.Tests
// Tests Repository.Checkout.
public void CheckoutExists ()
{
- Assert.IsTrue (Directory.Exists (RootCheckout + DotDir));
+ Assert.IsTrue (Directory.Exists (LocalPath + DotDir));
}
// In main directory, ".git".
@@ -166,8 +166,8 @@ namespace MonoDevelop.VersionControl.Tests
AddFile ("testfile", null, true, false);
// Query two queries.
- VersionInfo vi = Repo.GetVersionInfo (RootCheckout + "testfile");
- VersionInfo[] vis = Repo.GetDirectoryVersionInfo (RootCheckout, false, false);
+ VersionInfo vi = Repo.GetVersionInfo (LocalPath + "testfile");
+ VersionInfo[] vis = Repo.GetDirectoryVersionInfo (LocalPath, false, false);
// No cache, query.
Assert.AreEqual (InitialValue, vi.Status);
@@ -175,28 +175,28 @@ namespace MonoDevelop.VersionControl.Tests
System.Threading.Thread.Sleep (QueryTimer);
// Cached.
- vi = Repo.GetVersionInfo (RootCheckout + "testfile");
+ vi = Repo.GetVersionInfo (LocalPath + "testfile");
Assert.AreEqual (VersionStatus.ScheduledAdd, vi.Status & VersionStatus.ScheduledAdd);
AddDirectory ("testdir", true, false);
AddFile (Path.Combine ("testdir", "testfile2"), null, true, false);
// Old cache.
- vis = Repo.GetDirectoryVersionInfo (RootCheckout, false, false);
+ vis = Repo.GetDirectoryVersionInfo (LocalPath, false, false);
Assert.AreEqual (1 + RepoItemsCount, vis.Length);
// Query.
- Repo.ClearCachedVersionInfo (RootCheckout);
- Repo.GetDirectoryVersionInfo (RootCheckout, false, false);
+ Repo.ClearCachedVersionInfo (LocalPath);
+ Repo.GetDirectoryVersionInfo (LocalPath, false, false);
System.Threading.Thread.Sleep (QueryTimer);
// Cached.
- vis = Repo.GetDirectoryVersionInfo (RootCheckout, false, false);
+ vis = Repo.GetDirectoryVersionInfo (LocalPath, false, false);
Assert.AreEqual (2 + RepoItemsCount, vis.Length);
// Wait for result.
AddFile ("testfile3", null, true, false);
- vis = Repo.GetDirectoryVersionInfo (RootCheckout, false, true);
+ vis = Repo.GetDirectoryVersionInfo (LocalPath, false, true);
Assert.AreEqual (4 + RepoItemsCountRecursive, vis.Length);
}
@@ -206,7 +206,7 @@ namespace MonoDevelop.VersionControl.Tests
{
AddFile ("testfile", null, true, false);
- VersionInfo vi = Repo.GetVersionInfo (RootCheckout + "testfile", VersionInfoQueryFlags.IgnoreCache);
+ VersionInfo vi = Repo.GetVersionInfo (LocalPath + "testfile", VersionInfoQueryFlags.IgnoreCache);
Assert.AreEqual (VersionStatus.Versioned, (VersionStatus.Versioned & vi.Status));
Assert.AreEqual (VersionStatus.ScheduledAdd, (VersionStatus.ScheduledAdd & vi.Status));
@@ -220,7 +220,7 @@ namespace MonoDevelop.VersionControl.Tests
AddFile ("testfile", null, true, true);
PostCommit (Repo);
- VersionInfo vi = Repo.GetVersionInfo (RootCheckout + "testfile", VersionInfoQueryFlags.IncludeRemoteStatus | VersionInfoQueryFlags.IgnoreCache);
+ VersionInfo vi = Repo.GetVersionInfo (LocalPath + "testfile", VersionInfoQueryFlags.IncludeRemoteStatus | VersionInfoQueryFlags.IgnoreCache);
// TODO: Fix Win32 Svn Remote status check.
Assert.AreEqual (VersionStatus.Versioned, (VersionStatus.Versioned & vi.Status));
}
@@ -238,8 +238,8 @@ namespace MonoDevelop.VersionControl.Tests
// Checkout a second repository.
FilePath second = new FilePath (FileService.CreateTempDirectory () + Path.DirectorySeparatorChar);
- Checkout (second, RepoLocation);
- Repo2 = GetRepo (second, RepoLocation);
+ Checkout (second, RemoteUrl);
+ Repo2 = GetRepo (second, RemoteUrl);
string added = second + "testfile2";
File.Create (added).Close ();
Repo2.Add (added, false, new NullProgressMonitor ());
@@ -251,7 +251,7 @@ namespace MonoDevelop.VersionControl.Tests
PostCommit (Repo2);
Repo.Update (Repo.RootPath, true, new NullProgressMonitor ());
- Assert.True (File.Exists (RootCheckout + "testfile2"));
+ Assert.True (File.Exists (LocalPath + "testfile2"));
DeleteDirectory (second);
}
@@ -263,7 +263,7 @@ namespace MonoDevelop.VersionControl.Tests
AddFile ("testfile", null, true, true);
AddFile ("testfile2", null, true, true);
int index = 0;
- foreach (Revision rev in Repo.GetHistory (RootCheckout + "testfile", null)) {
+ foreach (Revision rev in Repo.GetHistory (LocalPath + "testfile", null)) {
Assert.AreEqual (String.Format ("Commit #{0}", index++), rev.Message);
}
}
@@ -273,7 +273,7 @@ namespace MonoDevelop.VersionControl.Tests
public void DiffIsProper ()
{
AddFile ("testfile", null, true, true);
- File.AppendAllText (RootCheckout + "testfile", "text" + Environment.NewLine);
+ File.AppendAllText (LocalPath + "testfile", "text" + Environment.NewLine);
TestDiff ();
}
@@ -286,7 +286,7 @@ namespace MonoDevelop.VersionControl.Tests
{
string content = "text";
AddFile ("testfile", null, true, true);
- string added = RootCheckout + "testfile";
+ string added = LocalPath + "testfile";
// Revert to head.
File.WriteAllText (added, content);
@@ -311,7 +311,10 @@ namespace MonoDevelop.VersionControl.Tests
// Tests Repository.RevertRevision.
public virtual void RevertsRevision ()
{
- string added = RootCheckout + "testfile2";
+ if (!Repo.SupportsRevertRevision)
+ Assert.Ignore ("No support for reverting a specific revision.");
+
+ string added = LocalPath + "testfile2";
AddFile ("testfile", "text", true, true);
AddFile ("testfile2", "text2", true, true);
Repo.RevertRevision (added, GetHeadRevision (), new NullProgressMonitor ());
@@ -322,7 +325,7 @@ namespace MonoDevelop.VersionControl.Tests
// Tests Repository.MoveFile.
public virtual void MovesFile ()
{
- string src = RootCheckout + "testfile";
+ string src = LocalPath + "testfile";
string dst = src + "2";
AddFile ("testfile", null, true, true);
@@ -338,8 +341,8 @@ namespace MonoDevelop.VersionControl.Tests
// Tests Repository.MoveDirectory.
public virtual void MovesDirectory ()
{
- string srcDir = RootCheckout + "test";
- string dstDir = RootCheckout + "test2";
+ string srcDir = LocalPath + "test";
+ string dstDir = LocalPath + "test2";
string src = srcDir + Path.DirectorySeparatorChar + "testfile";
string dst = dstDir + Path.DirectorySeparatorChar + "testfile";
@@ -358,7 +361,7 @@ namespace MonoDevelop.VersionControl.Tests
// Tests Repository.DeleteFile.
public virtual void DeletesFile ()
{
- string added = RootCheckout + "testfile";
+ string added = LocalPath + "testfile";
AddFile ("testfile", null, true, true);
Repo.DeleteFile (added, true, new NullProgressMonitor ());
VersionInfo vi = Repo.GetVersionInfo (added, VersionInfoQueryFlags.IgnoreCache);
@@ -369,7 +372,7 @@ namespace MonoDevelop.VersionControl.Tests
// Tests Repository.DeleteDirectory.
public virtual void DeletesDirectory ()
{
- string addedDir = RootCheckout + "test";
+ string addedDir = LocalPath + "test";
string added = addedDir + Path.DirectorySeparatorChar + "testfile";
AddDirectory ("test", true, false);
AddFile ("testfile", null, true, true);
@@ -383,7 +386,7 @@ namespace MonoDevelop.VersionControl.Tests
// Tests Repository.Lock.
public virtual void LocksEntities ()
{
- string added = RootCheckout + "testfile";
+ string added = LocalPath + "testfile";
AddFile ("testfile", null, true, true);
Repo.Lock (new NullProgressMonitor (), added);
@@ -398,7 +401,7 @@ namespace MonoDevelop.VersionControl.Tests
// Tests Repository.Unlock.
public virtual void UnlocksEntities ()
{
- string added = RootCheckout + "testfile";
+ string added = LocalPath + "testfile";
AddFile ("testfile", null, true, true);
Repo.Lock (new NullProgressMonitor (), "testfile");
Repo.Unlock (new NullProgressMonitor (), added);
@@ -414,7 +417,7 @@ namespace MonoDevelop.VersionControl.Tests
// Tests Repository.Ignore
public virtual void IgnoresEntities ()
{
- string added = RootCheckout + "testfile";
+ string added = LocalPath + "testfile";
AddFile ("testfile", null, false, false);
Repo.Ignore (new FilePath[] { added });
VersionInfo vi = Repo.GetVersionInfo (added, VersionInfoQueryFlags.IgnoreCache);
@@ -425,7 +428,7 @@ namespace MonoDevelop.VersionControl.Tests
// Tests Repository.Unignore
public virtual void UnignoresEntities ()
{
- string added = RootCheckout + "testfile";
+ string added = LocalPath + "testfile";
AddFile ("testfile", null, false, false);
Repo.Ignore (new FilePath[] { added });
Repo.Unignore (new FilePath[] { added });
@@ -441,11 +444,11 @@ namespace MonoDevelop.VersionControl.Tests
// Tests Repository.GetTextAtRevision.
public void CorrectTextAtRevision ()
{
- string added = RootCheckout + "testfile";
+ string added = LocalPath + "testfile";
AddFile ("testfile", "text1", true, true);
File.AppendAllText (added, "text2");
CommitFile (added);
- string text = Repo.GetTextAtRevision (RootCheckout, GetHeadRevision ());
+ string text = Repo.GetTextAtRevision (LocalPath, GetHeadRevision ());
Assert.AreEqual ("text1text2", text);
}
@@ -453,7 +456,7 @@ namespace MonoDevelop.VersionControl.Tests
// Tests Repository.GetAnnotations.
public void BlameIsCorrect ()
{
- string added = RootCheckout + "testfile";
+ string added = LocalPath + "testfile";
// Initial commit.
AddFile ("testfile", "blah" + Environment.NewLine, true, true);
// Second commit.
@@ -529,7 +532,7 @@ namespace MonoDevelop.VersionControl.Tests
void AddToRepository (string relativePath, string contents, bool toVcs, bool commit)
{
- string added = Path.Combine (RootCheckout, relativePath);
+ string added = Path.Combine (LocalPath, relativePath);
if (contents == null)
Directory.CreateDirectory (added);
else
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git.addin.xml b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git.addin.xml
index 45870ce498..90464f077d 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git.addin.xml
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git.addin.xml
@@ -79,7 +79,7 @@
</Extension>
<Extension path = "/MonoDevelop/Ide/GlobalOptionsDialog/VersionControl">
- <Section id = "Git" _label = "Git" class = "MonoDevelop.VersionControl.Git.GitOptionsPanel" />
+ <Section id = "Git" _label = "Git" class = "MonoDevelop.VersionControl.Git.GitOptionsPanel" icon="md-prefs-git" />
</Extension>
<!-- <Extension path = "/MonoDevelop/Ide/ProjectFeatures">
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/Commands.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/Commands.cs
index 13b3fd9da2..b624b70f0e 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/Commands.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/Commands.cs
@@ -132,24 +132,27 @@ namespace MonoDevelop.VersionControl.Git
{
var stashes = Repository.GetStashes ();
NewStashDialog dlg = new NewStashDialog ();
- if (MessageService.RunCustomDialog (dlg) == (int) Gtk.ResponseType.Ok) {
- string comment = dlg.Comment;
- MessageDialogProgressMonitor monitor = new MessageDialogProgressMonitor (true, false, false, true);
- var statusTracker = IdeApp.Workspace.GetFileStatusTracker ();
- ThreadPool.QueueUserWorkItem (delegate {
- try {
- using (var gm = new GitMonitor (monitor))
- stashes.Create (gm, comment);
- } catch (Exception ex) {
- MessageService.ShowException (ex);
- }
- finally {
- monitor.Dispose ();
- statusTracker.NotifyChanges ();
- }
- });
+ try {
+ if (MessageService.RunCustomDialog (dlg) == (int) Gtk.ResponseType.Ok) {
+ string comment = dlg.Comment;
+ MessageDialogProgressMonitor monitor = new MessageDialogProgressMonitor (true, false, false, true);
+ var statusTracker = IdeApp.Workspace.GetFileStatusTracker ();
+ ThreadPool.QueueUserWorkItem (delegate {
+ try {
+ using (var gm = new GitMonitor (monitor))
+ stashes.Create (gm, comment);
+ } catch (Exception ex) {
+ MessageService.ShowException (ex);
+ }
+ finally {
+ monitor.Dispose ();
+ statusTracker.NotifyChanges ();
+ }
+ });
+ }
+ } finally {
+ dlg.Destroy ();
}
- dlg.Destroy ();
}
}
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs
index 02798b391d..144e81b7ce 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs
@@ -185,6 +185,7 @@ namespace MonoDevelop.VersionControl.Git
cachedSubmodules = submoduleStatus.Call ()
.Select(s => SubmoduleWalk.GetSubmoduleRepository (RootRepository, s.Key))
+ .Where(s => s != null) // TODO: Make this so we can tell user to clone them.
.ToArray ();
}
return cachedSubmodules;
@@ -400,14 +401,12 @@ namespace MonoDevelop.VersionControl.Git
{
if (!Directory.Exists (dir))
return;
- foreach (string file in Directory.GetFiles (dir))
- files.Add (new FilePath (file).CanonicalPath);
- foreach (string sub in Directory.GetDirectories (dir)) {
- directories.Add (new FilePath (sub));
- if (recursive)
- CollectFiles (files, directories, sub, true);
- }
+ directories.AddRange (Directory.GetDirectories (dir, "*", recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly)
+ .Select (f => new FilePath (f)));
+
+ files.UnionWith (Directory.GetFiles (dir, "*", recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly)
+ .Select (f => new FilePath (f).CanonicalPath));
}
protected override Repository OnPublish (string serverPath, FilePath localPath, FilePath[] files, string message, IProgressMonitor monitor)
@@ -507,9 +506,9 @@ namespace MonoDevelop.VersionControl.Git
var status = statusCommand.Call ();
if (status.IsClean ())
- updateSubmodules.Add (submodule.WorkTree);
+ updateSubmodules.Add (RootRepository.ToGitPath (submodule.WorkTree.GetAbsolutePath ()));
else
- dirtySubmodules.Add (submodule.WorkTree);
+ dirtySubmodules.Add (RootRepository.ToGitPath (submodule.WorkTree.GetAbsolutePath ()));
}
if (dirtySubmodules.Count != 0) {
@@ -776,7 +775,6 @@ namespace MonoDevelop.VersionControl.Git
ConflictResult res = ConflictResult.Abort;
DispatchService.GuiSyncDispatch (delegate {
ConflictResolutionDialog dlg = new ConflictResolutionDialog ();
- dlg.Load (file);
try {
dlg.Load (file);
var dres = (Gtk.ResponseType) MessageService.RunCustomDialog (dlg);
@@ -1005,23 +1003,9 @@ namespace MonoDevelop.VersionControl.Git
protected override void OnRevertRevision (FilePath localPath, Revision revision, IProgressMonitor monitor)
{
- var git = new NGit.Api.Git (GetRepository (localPath));
- var gitRev = (GitRevision)revision;
- var revert = git.Revert ().Include (gitRev.Commit.ToObjectId ());
- revert.Call ();
-
- var revertResult = revert.GetFailingResult ();
- if (revertResult == null) {
- monitor.ReportSuccess (GettextCatalog.GetString ("Revision {0} successfully reverted", gitRev));
- } else {
- var errorMessage = GettextCatalog.GetString ("Could not revert commit {0}", gitRev);
- var description = GettextCatalog.GetString ("The following files had merge conflicts");
- description += Environment.NewLine + string.Join (Environment.NewLine, revertResult.GetFailingPaths ().Keys);
- monitor.ReportError (errorMessage, new UserException (errorMessage, description));
- }
+ throw new NotSupportedException ();
}
-
protected override void OnRevertToRevision (FilePath localPath, Revision revision, IProgressMonitor monitor)
{
NGit.Repository repo = GetRepository (localPath);
@@ -1029,9 +1013,8 @@ namespace MonoDevelop.VersionControl.Git
GitRevision gitRev = (GitRevision)revision;
// Rewrite file data from selected revision.
- foreach (var path in GetFilesInPaths (new FilePath[] { localPath })) {
- MonoDevelop.Projects.Text.TextFile.WriteFile (path, GetCommitTextContent (gitRev.Commit, path), null);
- }
+ foreach (var path in GetFilesInPaths (new [] { localPath }))
+ MonoDevelop.Projects.Text.TextFile.WriteFile (repo.FromGitPath (path), GetCommitTextContent (gitRev.Commit, path), null);
monitor.ReportSuccess (GettextCatalog.GetString ("Successfully reverted {0} to revision {1}", localPath, gitRev));
}
@@ -1196,7 +1179,7 @@ namespace MonoDevelop.VersionControl.Git
{
var content = GetCommitContent (c, file);
if (RawText.IsBinary (content))
- return null;
+ return String.Empty;
return Mono.TextEditor.Utils.TextFileUtility.GetText (content);
}
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitService.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitService.cs
index fa11bb6fd9..41ffac25fd 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitService.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitService.cs
@@ -112,8 +112,7 @@ namespace MonoDevelop.VersionControl.Git
public static void ShowStashManager (GitRepository repo)
{
StashManagerDialog dlg = new StashManagerDialog (repo);
- MessageService.RunCustomDialog (dlg);
- dlg.Destroy ();
+ MessageService.ShowCustomDialog (dlg);
}
public static void SwitchToBranch (GitRepository repo, string branch)
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Tests/BaseSvnRepositoryTests.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Tests/BaseSvnRepositoryTests.cs
index cf2bb0be44..3a13ada0ac 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Tests/BaseSvnRepositoryTests.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Tests/BaseSvnRepositoryTests.cs
@@ -44,13 +44,13 @@ namespace MonoDevelop.VersionControl.Subversion.Tests
ProcessStartInfo info;
// Generate directories and a svn util.
- RootCheckout = new FilePath (FileService.CreateTempDirectory () + Path.DirectorySeparatorChar);
+ LocalPath = new FilePath (FileService.CreateTempDirectory () + Path.DirectorySeparatorChar);
// Create repo in "repo".
svnAdmin = new Process ();
info = new ProcessStartInfo ();
info.FileName = "svnadmin";
- info.Arguments = "create " + RootUrl + Path.DirectorySeparatorChar + "repo";
+ info.Arguments = "create " + RemotePath + Path.DirectorySeparatorChar + "repo";
info.WindowStyle = ProcessWindowStyle.Hidden;
svnAdmin.StartInfo = info;
svnAdmin.Start ();
@@ -62,13 +62,13 @@ namespace MonoDevelop.VersionControl.Subversion.Tests
if (SvnServe != null) {
info = new ProcessStartInfo ();
info.FileName = "svnserve";
- info.Arguments = "-dr " + RootUrl;
+ info.Arguments = "-dr " + RemotePath;
info.WindowStyle = ProcessWindowStyle.Hidden;
SvnServe.StartInfo = info;
SvnServe.Start ();
// Create user to auth.
- using (var perm = File. CreateText (RootUrl + Path.DirectorySeparatorChar + "repo" +
+ using (var perm = File. CreateText (RemotePath + Path.DirectorySeparatorChar + "repo" +
Path.DirectorySeparatorChar + "conf" + Path.DirectorySeparatorChar + "svnserve.conf")) {
perm.WriteLine ("[general]");
perm.WriteLine ("anon-access = write");
@@ -77,8 +77,8 @@ namespace MonoDevelop.VersionControl.Subversion.Tests
}
// Check out the repository.
- Checkout (RootCheckout, RepoLocation);
- Repo = GetRepo (RootCheckout, RepoLocation);
+ Checkout (LocalPath, RemoteUrl);
+ Repo = GetRepo (LocalPath, RemoteUrl);
DotDir = ".svn";
}
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Tests/RepositoryTests.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Tests/RepositoryTests.cs
index 35373469e4..c3d6273c9d 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Tests/RepositoryTests.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Tests/RepositoryTests.cs
@@ -49,8 +49,8 @@ namespace VersionControl.Subversion.Unix.Tests
[SetUp]
public override void Setup ()
{
- RootUrl = new FilePath (FileService.CreateTempDirectory ());
- RepoLocation = "file://" + RootUrl + "/repo";
+ RemotePath = new FilePath (FileService.CreateTempDirectory ());
+ RemoteUrl = "file://" + RemotePath + "/repo";
base.Setup ();
}
@@ -72,7 +72,7 @@ namespace VersionControl.Subversion.Unix.Tests
@@ -0,0 +1 @@
+text
";
- Assert.AreEqual (difftext, Repo.GenerateDiff (RootCheckout + "testfile", Repo.GetVersionInfo (RootCheckout + "testfile", VersionInfoQueryFlags.IgnoreCache)).Content);
+ Assert.AreEqual (difftext, Repo.GenerateDiff (LocalPath + "testfile", Repo.GetVersionInfo (LocalPath + "testfile", VersionInfoQueryFlags.IgnoreCache)).Content);
}
// Tests that fail due to Subversion giving wrong data.
@@ -106,7 +106,7 @@ namespace VersionControl.Subversion.Unix.Tests
protected override void PostLock ()
{
- string added = RootCheckout + "testfile";
+ string added = LocalPath + "testfile";
Assert.Throws<Exception> (delegate {
File.WriteAllText (added, "text");
});
@@ -121,7 +121,7 @@ namespace VersionControl.Subversion.Unix.Tests
protected override void PostUnlock ()
{
- string added = RootCheckout + "testfile";
+ string added = LocalPath + "testfile";
Assert.DoesNotThrow (delegate {
File.WriteAllText (added, "text");
});
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs
index 6745ae5ea7..b94c055d25 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs
@@ -42,14 +42,14 @@ namespace MonoDevelop.VersionControl.Subversion.Unix
CheckError (error, null);
}
- public static void CheckError (IntPtr error, int? allowedError)
+ public static SubversionException CheckErrorNoThrow (IntPtr error, int? allowedError)
{
string msg = null;
int errorCode = 0; // Innermost error-code.
while (error != IntPtr.Zero) {
- LibSvnClient.svn_error_t error_t = (LibSvnClient.svn_error_t) Marshal.PtrToStructure (error, typeof (LibSvnClient.svn_error_t));
+ LibSvnClient.svn_error_t error_t = (LibSvnClient.svn_error_t)Marshal.PtrToStructure (error, typeof(LibSvnClient.svn_error_t));
if (allowedError.HasValue && error_t.apr_err == allowedError.Value)
- return;
+ return null;
errorCode = error_t.apr_err;
if (msg != null)
@@ -61,8 +61,14 @@ namespace MonoDevelop.VersionControl.Subversion.Unix
if (msg == null)
msg = GettextCatalog.GetString ("Unknown error");
}
- if (msg != null)
- throw new SubversionException (msg, errorCode);
+ return msg != null ? new SubversionException (msg, errorCode) : null;
+ }
+
+ public static void CheckError (IntPtr error, int? allowedError)
+ {
+ SubversionException ex = CheckErrorNoThrow (error, allowedError);
+ if (ex != null)
+ throw ex;
}
static string GetErrorMessage (LibSvnClient.svn_error_t error)
@@ -224,6 +230,11 @@ namespace MonoDevelop.VersionControl.Subversion.Unix
SvnClient.CheckError (error, allowedError);
}
+ static SubversionException CheckErrorNoThrow (IntPtr error, int? allowedError)
+ {
+ return SvnClient.CheckErrorNoThrow (error, allowedError);
+ }
+
static IntPtr newpool (IntPtr parent)
{
return SvnClient.newpool (parent);
@@ -390,7 +401,8 @@ namespace MonoDevelop.VersionControl.Subversion.Unix
static readonly LibSvnClient.svn_auth_simple_prompt_func_t OnAuthSimplePromptCallback = OnAuthSimplePrompt;
static IntPtr OnAuthSimplePrompt (ref IntPtr cred, IntPtr baton, string realm, string user_name, bool may_save, IntPtr pool)
{
- LibSvnClient.svn_auth_cred_simple_t data = new LibSvnClient.svn_auth_cred_simple_t ();
+ LibSvnClient.svn_auth_cred_simple_t data = new LibSvnClient.svn_auth_cred_simple_t ();
+ data.username = user_name;
bool ms;
if (SimpleAuthenticationPrompt (realm, may_save, ref data.username, out data.password, out ms)) {
data.may_save = ms;
@@ -1106,6 +1118,36 @@ namespace MonoDevelop.VersionControl.Subversion.Unix
}
}
+ public override bool HasNeedLock (FilePath file)
+ {
+ IntPtr hash_item, hash_name, hash_val;
+ int length;
+ IntPtr result;
+ IntPtr props_ptr = IntPtr.Zero;
+ StringBuilder props = new StringBuilder ();
+ string new_path;
+ LibSvnClient.svn_string_t new_props;
+ LibSvnClient.Rev rev = LibSvnClient.Rev.Working;
+
+ var localpool = TryStartOperation (null);
+ try {
+ new_path = NormalizePath (file, localpool);
+ CheckError (svn.client_propget (out result, "svn:needs-lock", new_path,
+ ref rev, false, ctx, localpool));
+ hash_item = apr.hash_first (localpool, result);
+ while (hash_item != IntPtr.Zero) {
+ apr.hash_this (hash_item, out hash_name, out length, out hash_val);
+ new_props = (LibSvnClient.svn_string_t) Marshal.PtrToStructure (hash_val, typeof (LibSvnClient.svn_string_t));
+ props.Append (Marshal.PtrToStringAnsi (new_props.data));
+ hash_item = apr.hash_next (hash_item);
+ }
+ return props.Length != 0;
+ } finally {
+ apr.pool_destroy (localpool);
+ TryEndOperation ();
+ }
+ }
+
public override string GetTextBase (string sourcefile)
{
MemoryStream data = new MemoryStream ();
@@ -1487,9 +1529,8 @@ namespace MonoDevelop.VersionControl.Subversion.Unix
var localpool = TryStartOperation (null);
try {
string new_path = NormalizePath (path.FullPath, localpool);
- try {
- CheckError (svn.client_get_wc_root (out result, new_path, ctx, localpool, scratch));
- } catch (SubversionException e) {
+ SubversionException e = CheckErrorNoThrow (svn.client_get_wc_root (out result, new_path, ctx, localpool, scratch), null);
+ if (e != null) {
// SVN_ERR_SVN_ERR_WC_UPGRADE_REQUIRED
Upgrading = e.ErrorCode == 155036;
@@ -1508,7 +1549,7 @@ namespace MonoDevelop.VersionControl.Subversion.Unix
case 155036:
return String.Empty;
}
- throw;
+ throw e;
}
return Marshal.PtrToStringAnsi (result);
} finally {
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion/MonoDevelop.VersionControl.Subversion/SubversionRepository.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion/MonoDevelop.VersionControl.Subversion/SubversionRepository.cs
index 1a2d57856e..d2d5eac1d9 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion/MonoDevelop.VersionControl.Subversion/SubversionRepository.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion/MonoDevelop.VersionControl.Subversion/SubversionRepository.cs
@@ -52,9 +52,11 @@ namespace MonoDevelop.VersionControl.Subversion
}*/
public override bool SupportsRemoteStatus {
- get {
- return true;
- }
+ get { return true; }
+ }
+
+ public override bool SupportsRevertRevision {
+ get { return true; }
}
new SubversionVersionControl VersionControlSystem {
@@ -118,7 +120,7 @@ namespace MonoDevelop.VersionControl.Subversion
var toLock = new List<FilePath>();
foreach (var path in paths) {
- if (!File.Exists (path) || (File.GetAttributes (path) & FileAttributes.ReadOnly) == 0)
+ if (!File.Exists (path) || !Svn.HasNeedLock (path) || (File.GetAttributes (path) & FileAttributes.ReadOnly) == 0)
continue;
toLock.Add (path);
}
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion/MonoDevelop.VersionControl.Subversion/SubversionVersionControl.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion/MonoDevelop.VersionControl.Subversion/SubversionVersionControl.cs
index b037c0443c..3e442578a9 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion/MonoDevelop.VersionControl.Subversion/SubversionVersionControl.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion/MonoDevelop.VersionControl.Subversion/SubversionVersionControl.cs
@@ -252,6 +252,8 @@ namespace MonoDevelop.VersionControl.Subversion
{
return new Annotation[0];
}
+
+ public abstract bool HasNeedLock (FilePath file);
}
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Dialogs/CommitDialog.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Dialogs/CommitDialog.cs
index 65fecab444..ae518e5428 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Dialogs/CommitDialog.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Dialogs/CommitDialog.cs
@@ -163,6 +163,16 @@ namespace MonoDevelop.VersionControl.Dialogs
base.OnResponse (type);
}
+ protected override void OnDestroyed ()
+ {
+ foreach (var ob in extensions) {
+ var ext = ob as CommitDialogExtension;
+ if (ext != null)
+ ext.Destroy ();
+ }
+ base.OnDestroyed ();
+ }
+
bool ButtonCommitClicked ()
{
// In case we have local unsaved files with changes, throw a dialog for the user.
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/BlameWidget.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/BlameWidget.cs
index c8e5c0cfd0..11407c688a 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/BlameWidget.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/BlameWidget.cs
@@ -67,7 +67,7 @@ namespace MonoDevelop.VersionControl.Views
public override ContainerChild this [Widget w] {
get {
- foreach (ContainerChild info in children.ToArray ()) {
+ foreach (ContainerChild info in children) {
if (info.Child == w)
return info;
}
@@ -495,7 +495,6 @@ namespace MonoDevelop.VersionControl.Views
{
if (highlightAnnotation == null)
return;
- int i = 1;
foreach (var view in widget.info.Document.ParentDocument.Views) {
DiffView diffView = view.GetContent<DiffView> ();
if (diffView != null) {
@@ -507,7 +506,6 @@ namespace MonoDevelop.VersionControl.Views
diffView.ComparisonWidget.SetRevision (diffView.ComparisonWidget.OriginalEditor, rev);
break;
}
- i++;
}
}
@@ -516,7 +514,6 @@ namespace MonoDevelop.VersionControl.Views
{
if (highlightAnnotation == null)
return;
- int i = 1;
foreach (var view in widget.info.Document.ParentDocument.Views) {
LogView logView = view.GetContent<LogView> ();
if (logView != null) {
@@ -527,7 +524,6 @@ namespace MonoDevelop.VersionControl.Views
logView.LogWidget.SelectedRevision = rev;
break;
}
- i++;
}
}
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/LogWidget.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/LogWidget.cs
index 9856d9d52c..3c6c767628 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/LogWidget.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/LogWidget.cs
@@ -253,7 +253,9 @@ namespace MonoDevelop.VersionControl.Views
internal void SetToolbar (DocumentToolbar toolbar)
{
- toolbar.Add (revertButton);
+ if (info.Repository.SupportsRevertRevision)
+ toolbar.Add (revertButton);
+
toolbar.Add (revertToButton);
toolbar.Add (refreshButton);
@@ -464,9 +466,9 @@ namespace MonoDevelop.VersionControl.Views
var rev = (Revision)model.GetValue (iter, 0);
string day;
var age = rev.Time - DateTime.Now;
- if (age.TotalDays == 0) {
+ if (age.Days == 0) {
day = GettextCatalog.GetString ("Today");
- } else if (age.TotalDays == 1) {
+ } else if (age.Days == 1) {
day = GettextCatalog.GetString ("Yesterday");
} else {
day = rev.Time.ToShortDateString ();
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/MergeView.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/MergeView.cs
index 609d6727cd..8cb107fa2d 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/MergeView.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/MergeView.cs
@@ -70,22 +70,6 @@ namespace MonoDevelop.VersionControl.Views
public void BaseContentChanged ()
{
}
-
- /* MergeWidget mergeWidget;
-
- public override Gtk.Widget Control {
- get {
- return mergeWidget;
- }
- }
-
-
- public override void Load (string fileName)
- {
-
-
- }*/
-
}
}
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/StatusView.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/StatusView.cs
index cf9fc40db8..b9496598a4 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/StatusView.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/StatusView.cs
@@ -33,10 +33,11 @@ namespace MonoDevelop.VersionControl.Views
Gtk.Button buttonRevert;
FileTreeView filelist;
- TreeViewColumn colCommit, colRemote;
+ TreeViewColumn colCommit, colRemote, colFile;
TreeStore filestore;
ScrolledWindow scroller;
CellRendererDiff diffRenderer;
+ CellRendererToggle cellToggle;
Box commitBox;
TextView commitText;
@@ -162,7 +163,7 @@ namespace MonoDevelop.VersionControl.Views
filelist.RowActivated += OnRowActivated;
filelist.DiffLineActivated += OnDiffLineActivated;
- CellRendererToggle cellToggle = new CellRendererToggle();
+ cellToggle = new CellRendererToggle();
cellToggle.Toggled += new ToggledHandler(OnCommitToggledHandler);
var crc = new CellRendererImage ();
crc.StockId = "vc-comment";
@@ -187,7 +188,7 @@ namespace MonoDevelop.VersionControl.Views
colStatus.AddAttribute (crt, "text", ColStatus);
colStatus.AddAttribute (crt, "foreground", ColStatusColor);
- TreeViewColumn colFile = new TreeViewColumn ();
+ colFile = new TreeViewColumn ();
colFile.Title = GettextCatalog.GetString ("File");
colFile.Spacing = 2;
crp = new CellRendererImage ();
@@ -392,15 +393,32 @@ namespace MonoDevelop.VersionControl.Views
colCommit.Destroy ();
colCommit = null;
}
-
if (colRemote != null) {
colRemote.Destroy ();
colRemote = null;
}
+ if (colFile != null) {
+ colFile.Destroy ();
+ colFile = null;
+ }
if (filestore != null) {
filestore.Dispose ();
filestore = null;
}
+ if (filelist != null) {
+ filelist.DoPopupMenu = null;
+ filelist.RowActivated -= OnRowActivated;
+ filelist.DiffLineActivated -= OnDiffLineActivated;
+ filelist.TestExpandRow -= OnTestExpandRow;
+ filelist.Selection.Changed -= OnCursorChanged;
+ filelist.Destroy ();
+ filelist = null;
+ }
+ if (cellToggle != null) {
+ cellToggle.Toggled -= OnCommitToggledHandler;
+ cellToggle.Destroy ();
+ cellToggle = null;
+ }
if (this.diffRenderer != null) {
this.diffRenderer.Destroy ();
this.diffRenderer = null;
@@ -410,6 +428,8 @@ namespace MonoDevelop.VersionControl.Views
widget.Destroy ();
widget = null;
}
+ localDiff.Clear ();
+ remoteDiff.Clear ();
base.Dispose ();
}
@@ -501,8 +521,7 @@ namespace MonoDevelop.VersionControl.Views
colRemote.Visible = remoteStatus;
try {
- if (vc.GetVersionInfo (filepath).CanCommit)
- buttonCommit.Sensitive = true;
+ buttonCommit.Sensitive = statuses.Any (v => v.CanCommit);
} catch (Exception ex) {
LoggingService.LogError (ex.ToString ());
buttonCommit.Sensitive = true;
@@ -737,9 +756,7 @@ namespace MonoDevelop.VersionControl.Views
return;
}
- VersionControlService.FileStatusChanged -= OnFileStatusChanged;
CommitCommand.Commit (vc, changeSet.Clone ());
- VersionControlService.FileStatusChanged += OnFileStatusChanged;
}
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/VersionControlDocumentInfo.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/VersionControlDocumentInfo.cs
index de20609b6c..62faf89ddb 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/VersionControlDocumentInfo.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/VersionControlDocumentInfo.cs
@@ -50,7 +50,8 @@ namespace MonoDevelop.VersionControl.Views
get;
set;
}
-
+
+ [Obsolete ("Use Item.VersionInfo instead of this.")]
public VersionInfo VersionInfo {
get;
set;
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.csproj b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.csproj
index 6a49ee330d..8a5f3f4e40 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.csproj
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.csproj
@@ -290,6 +290,24 @@
<EmbeddedResource Include="icons\light\tag-16%402x.png">
<LogicalName>tag-light-16@2x.png</LogicalName>
</EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-git-16.png">
+ <LogicalName>prefs-git-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-git-16%402x.png">
+ <LogicalName>prefs-git-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-commit-message-style-16.png">
+ <LogicalName>prefs-commit-message-style-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-commit-message-style-16%402x.png">
+ <LogicalName>prefs-commit-message-style-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-version-control-general-16.png">
+ <LogicalName>prefs-version-control-general-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-version-control-general-16%402x.png">
+ <LogicalName>prefs-version-control-general-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Compile Include="gtk-gui\generated.cs" />
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/CommitCommand.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/CommitCommand.cs
index 1acde498d9..f5257c5979 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/CommitCommand.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/CommitCommand.cs
@@ -12,24 +12,20 @@ namespace MonoDevelop.VersionControl
public static void Commit (Repository vc, ChangeSet changeSet)
{
try {
- if (vc.GetVersionInfo (changeSet.BaseLocalPath).CanCommit) {
- if (!VersionControlService.NotifyPrepareCommit (vc, changeSet))
- return;
+ VersionControlService.NotifyPrepareCommit (vc, changeSet);
- CommitDialog dlg = new CommitDialog (changeSet);
- try {
- if (MessageService.RunCustomDialog (dlg) == (int) Gtk.ResponseType.Ok) {
- if (VersionControlService.NotifyBeforeCommit (vc, changeSet)) {
- new CommitWorker (vc, changeSet, dlg).Start();
- return;
- }
+ CommitDialog dlg = new CommitDialog (changeSet);
+ try {
+ if (MessageService.RunCustomDialog (dlg) == (int) Gtk.ResponseType.Ok) {
+ VersionControlService.NotifyBeforeCommit (vc, changeSet);
+ new CommitWorker (vc, changeSet, dlg).Start();
+ return;
}
- dlg.EndCommit (false);
- } finally {
- dlg.Destroy ();
- }
- VersionControlService.NotifyAfterCommit (vc, changeSet, false);
+ dlg.EndCommit (false);
+ } finally {
+ dlg.Destroy ();
}
+ VersionControlService.NotifyAfterCommit (vc, changeSet, false);
}
catch (Exception ex) {
MessageService.ShowException (ex, GettextCatalog.GetString ("Version control command failed."));
@@ -77,23 +73,15 @@ namespace MonoDevelop.VersionControl
protected override void Finished ()
{
dlg.EndCommit (success);
- dlg.Dispose ();
- VersionControlService.NotifyAfterCommit (vc, changeSet, success);
- ArrayList dirs = new ArrayList ();
- ArrayList files = new ArrayList ();
- foreach (ChangeSetItem it in changeSet.Items)
- if (it.IsDirectory) dirs.Add (it.LocalPath);
- else files.Add (it.LocalPath);
-
+ dlg.Destroy ();
FileUpdateEventArgs args = new FileUpdateEventArgs ();
-
- foreach (FilePath path in dirs)
- args.Add (new FileUpdateEventInfo (vc, path, true));
- foreach (FilePath path in files)
- args.Add (new FileUpdateEventInfo (vc, path, false));
-
+ foreach (ChangeSetItem it in changeSet.Items)
+ args.Add (new FileUpdateEventInfo (vc, it.LocalPath, it.IsDirectory));
+
if (args.Count > 0)
VersionControlService.NotifyFileStatusChanged (args);
+
+ VersionControlService.NotifyAfterCommit (vc, changeSet, success);
}
}
}
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Repository.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Repository.cs
index f585c6eb24..aef5e0dd2d 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Repository.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Repository.cs
@@ -18,14 +18,14 @@ namespace MonoDevelop.VersionControl
VersionControlSystem vcs;
[ItemProperty ("VcsType")]
- string vcsName;
-
- int references;
-
- public FilePath RootPath
- {
- get;
- protected set;
+ string vcsName;
+
+ int references;
+
+ public FilePath RootPath
+ {
+ get;
+ protected set;
}
public event EventHandler NameChanged;
@@ -129,6 +129,10 @@ namespace MonoDevelop.VersionControl
public virtual bool SupportsRemoteStatus {
get { return false; }
}
+
+ public virtual bool SupportsRevertRevision {
+ get { return false; }
+ }
internal protected virtual VersionControlOperation GetSupportedOperations (VersionInfo vinfo)
{
@@ -707,7 +711,6 @@ namespace MonoDevelop.VersionControl
} else {
if (fileName != null) {
list.Add (new DiffInfo (basePath, fileName, content.ToString ()));
- fileName = null;
}
fileName = line.Substring (6).Trim ();
fileName = fileName.Replace ('/', Path.DirectorySeparatorChar); // svn returns paths using unix separators
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlCommandHandler.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlCommandHandler.cs
index 90a1a020a5..ba12420ea5 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlCommandHandler.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlCommandHandler.cs
@@ -28,6 +28,7 @@
using MonoDevelop.Projects;
using MonoDevelop.Ide.Gui.Components;
using MonoDevelop.Ide.Gui.Pads.ProjectPad;
+using System;
namespace MonoDevelop.VersionControl
{
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlService.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlService.cs
index 00ac386e36..9d204b4309 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlService.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlService.cs
@@ -114,6 +114,9 @@ namespace MonoDevelop.VersionControl
public static Xwt.Drawing.Image LoadOverlayIconForStatus(VersionStatus status)
{
+ if ((status & VersionStatus.Ignored) != 0)
+ return overlay_ignored;
+
if ((status & VersionStatus.Versioned) == 0)
return overlay_unversioned;
@@ -129,8 +132,6 @@ namespace MonoDevelop.VersionControl
case VersionStatus.Missing:
case VersionStatus.ScheduledDelete:
return overlay_removed;
- case VersionStatus.Ignored:
- return overlay_ignored;
}
if ((status & VersionStatus.LockOwned) != 0)
@@ -358,40 +359,57 @@ namespace MonoDevelop.VersionControl
}
}
- internal static bool NotifyPrepareCommit (Repository repo, ChangeSet changeSet)
+ internal static void NotifyPrepareCommit (Repository repo, ChangeSet changeSet)
{
+ if (!DispatchService.IsGuiThread) {
+ Gtk.Application.Invoke (delegate {
+ NotifyPrepareCommit (repo, changeSet);
+ });
+ return;
+ }
+
if (PrepareCommit != null) {
try {
PrepareCommit (null, new CommitEventArgs (repo, changeSet, false));
} catch (Exception ex) {
MessageService.ShowException (ex);
- return false;
}
}
- return true;
}
- internal static bool NotifyBeforeCommit (Repository repo, ChangeSet changeSet)
+ internal static void NotifyBeforeCommit (Repository repo, ChangeSet changeSet)
{
+ if (!DispatchService.IsGuiThread) {
+ Gtk.Application.Invoke (delegate {
+ NotifyBeforeCommit (repo, changeSet);
+ });
+ return;
+ }
+
if (BeginCommit != null) {
try {
BeginCommit (null, new CommitEventArgs (repo, changeSet, false));
} catch (Exception ex) {
MessageService.ShowException (ex);
- return false;
}
}
- return true;
}
- internal static bool NotifyAfterCommit (Repository repo, ChangeSet changeSet, bool success)
+ internal static void NotifyAfterCommit (Repository repo, ChangeSet changeSet, bool success)
{
+ if (!DispatchService.IsGuiThread) {
+ Gtk.Application.Invoke (delegate {
+ NotifyAfterCommit (repo, changeSet, success);
+ });
+ return;
+ }
+
if (EndCommit != null) {
try {
EndCommit (null, new CommitEventArgs (repo, changeSet, success));
} catch (Exception ex) {
MessageService.ShowException (ex);
- return false;
+ return;
}
}
if (success) {
@@ -399,7 +417,6 @@ namespace MonoDevelop.VersionControl
SetCommitComment (it.LocalPath, null, false);
SaveComments ();
}
- return true;
}
public static void NotifyFileStatusChanged (IEnumerable<VersionControlItem> items)
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionInfoCache.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionInfoCache.cs
index c242c980bf..8228885a4c 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionInfoCache.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionInfoCache.cs
@@ -44,11 +44,11 @@ namespace MonoDevelop.VersionControl
{
rootPath = rootPath.CanonicalPath;
lock (fileStatus) {
- foreach (var p in fileStatus.Where (e => e.Key.IsChildPathOf (rootPath) || e.Key == rootPath).ToArray ())
+ foreach (var p in fileStatus.Where (e => e.Key.IsChildPathOf (rootPath) || e.Key == rootPath))
p.Value.RequiresRefresh = true;
}
lock (directoryStatus) {
- foreach (var p in directoryStatus.Where (e => e.Key.IsChildPathOf (rootPath) || e.Key == rootPath).ToArray ())
+ foreach (var p in directoryStatus.Where (e => e.Key.IsChildPathOf (rootPath) || e.Key == rootPath))
p.Value.RequiresRefresh = true;
}
}
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/VersionControl.addin.xml b/main/src/addins/VersionControl/MonoDevelop.VersionControl/VersionControl.addin.xml
index 636bae968b..848fcc2200 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/VersionControl.addin.xml
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/VersionControl.addin.xml
@@ -97,6 +97,9 @@
<StockIcon stockid = "vc-repository" resource = "repository-light-16.png" size="Menu" />
<StockIcon stockid = "vc-tag" resource = "tag-light-16.png" size="Menu" />
<StockIcon stockid = "vc-branch" resource = "branch-light-16.png" size="Menu" />
+ <StockIcon stockid = "md-prefs-git" resource="prefs-git-light-16.png" size="Menu" />
+ <StockIcon stockid = "md-prefs-commit-message-style" resource="prefs-commit-message-style-light-16.png" size="Menu" />
+ <StockIcon stockid = "md-prefs-version-control-general" resource="prefs-version-control-general-light-16.png" size="Menu" />
</Extension>
<Extension path = "/MonoDevelop/Ide/Commands">
@@ -278,27 +281,27 @@
</Extension> -->
<Extension path = "/MonoDevelop/ProjectModel/Gui/ItemOptionPanels">
- <Section id="VersionControl" _label="Version Control">
+ <Section id="VersionControl" _label="Version Control" icon="md-prefs-version-control-general">
<Condition id="ItemType" value="Solution">
- <Section id = "VersionControlGeneral" _label = "General" fill="true" class="MonoDevelop.VersionControl.VersionControlSolutionOptionsPanel" />
+ <Section id="VersionControlGeneral" _label="General" fill="true" class="MonoDevelop.VersionControl.VersionControlSolutionOptionsPanel" icon="md-prefs-version-control-general" />
</Condition>
<ComplexCondition>
<Or>
<Condition id="ItemType" value="SolutionItem" />
<Condition id="ItemType" value="Solution" />
</Or>
- <Section id = "VersionControlGeneral" _label = "Commit Message Style" fill="true" class="MonoDevelop.VersionControl.VersionControlPolicyPanel" />
+ <Section id="VersionControlGeneral" _label="Commit Message Style" fill="true" class="MonoDevelop.VersionControl.VersionControlPolicyPanel" icon="md-prefs-commit-message-style" />
</ComplexCondition>
</Section>
</Extension>
<Extension path = "/MonoDevelop/ProjectModel/Gui/DefaultPolicyPanels/VersionControl">
- <Section id = "VersionControlGeneral" _label = "Commit Message Style" fill="true" class="MonoDevelop.VersionControl.VersionControlPolicyPanel" />
+ <Section id="VersionControlGeneral" _label = "Commit Message Style" fill="true" class="MonoDevelop.VersionControl.VersionControlPolicyPanel" icon="md-prefs-commit-message-style" />
</Extension>
<Extension path = "/MonoDevelop/Ide/GlobalOptionsDialog/VersionControl">
- <Section id = "VersionControlGeneral" _label = "General" fill="true" class="MonoDevelop.VersionControl.VersionControlGeneralOptionsPanel" />
- <Section id = "VersionControlGeneral" _label = "Commit Message Style" fill="true" class="MonoDevelop.VersionControl.VersionControlPolicyPanel" />
+ <Section id = "VersionControlGeneral" _label = "General" fill="true" class="MonoDevelop.VersionControl.VersionControlGeneralOptionsPanel" icon="md-prefs-version-control-general" />
+ <Section id = "VersionControlGeneral" _label = "Commit Message Style" fill="true" class="MonoDevelop.VersionControl.VersionControlPolicyPanel" icon="md-prefs-commit-message-style" />
</Extension>
<Extension path = "/MonoDevelop/ProjectModel/PolicySets/Mono" >
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/gtk-gui/gui.stetic b/main/src/addins/VersionControl/MonoDevelop.VersionControl/gtk-gui/gui.stetic
index 0e6079564a..998958b1e3 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/gtk-gui/gui.stetic
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/gtk-gui/gui.stetic
@@ -9,6 +9,7 @@
<widget-library name="../../../../../build/bin/Mono.TextEditor.dll" />
<widget-library name="../../../../../build/AddIns/DisplayBindings/SourceEditor/MonoDevelop.SourceEditor2.dll" />
<widget-library name="../../../../../build/AddIns/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.dll" />
+ <widget-library name="../../../../../build/AddIns/MonoDevelop.Debugger/MonoDevelop.Debugger.dll" />
<widget-library name="../../../../../build/AddIns/VersionControl/MonoDevelop.VersionControl.dll" internal="true" />
</import>
<widget class="Gtk.Dialog" id="MonoDevelop.VersionControl.Dialogs.SelectRepositoryDialog" design-size="617 438">
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/branch-16.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/branch-16.png
index 4095508d7a..a6a5b24cfe 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/branch-16.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/branch-16.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/branch-16@2x.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/branch-16@2x.png
index 89c8ed31c5..a2bff92231 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/branch-16@2x.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/branch-16@2x.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/commit-16.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/commit-16.png
index 27f5a0da86..ea93ecbbf3 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/commit-16.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/commit-16.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/commit-16@2x.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/commit-16@2x.png
index fbfadf5239..596dc19eb9 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/commit-16@2x.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/commit-16@2x.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/local-status-16.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/local-status-16.png
index 940fc79c8a..b50e6fc982 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/local-status-16.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/local-status-16.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/local-status-16@2x.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/local-status-16@2x.png
index d4ac3d3fce..bf9dd78174 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/local-status-16@2x.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/local-status-16@2x.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-commit-message-style-16.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-commit-message-style-16.png
new file mode 100644
index 0000000000..ea93ecbbf3
--- /dev/null
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-commit-message-style-16.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-commit-message-style-16@2x.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-commit-message-style-16@2x.png
new file mode 100644
index 0000000000..596dc19eb9
--- /dev/null
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-commit-message-style-16@2x.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-git-16.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-git-16.png
new file mode 100644
index 0000000000..ac46bb38b3
--- /dev/null
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-git-16.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-git-16@2x.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-git-16@2x.png
new file mode 100644
index 0000000000..d09e54f010
--- /dev/null
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-git-16@2x.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-version-control-general-16.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-version-control-general-16.png
new file mode 100644
index 0000000000..f50af22deb
--- /dev/null
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-version-control-general-16.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-version-control-general-16@2x.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-version-control-general-16@2x.png
new file mode 100644
index 0000000000..230d65e12d
--- /dev/null
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/prefs-version-control-general-16@2x.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/refresh-16.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/refresh-16.png
index 3d04d301e2..d63fa2fad8 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/refresh-16.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/refresh-16.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/refresh-16@2x.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/refresh-16@2x.png
index 605845bb8a..848a94e174 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/refresh-16@2x.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/refresh-16@2x.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/remote-status-16.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/remote-status-16.png
index b9f3b07294..e362102a8c 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/remote-status-16.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/remote-status-16.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/remote-status-16@2x.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/remote-status-16@2x.png
index 65ebe1e883..c270cd23a5 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/remote-status-16@2x.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/remote-status-16@2x.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/removed-overlay-16.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/removed-overlay-16.png
index d616c9cbd3..8f41659d22 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/removed-overlay-16.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/removed-overlay-16.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/removed-overlay-16@2x.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/removed-overlay-16@2x.png
index b0e192736b..953e8105a4 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/removed-overlay-16@2x.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/removed-overlay-16@2x.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/repository-16.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/repository-16.png
index 53ae402909..f50af22deb 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/repository-16.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/repository-16.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/repository-16@2x.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/repository-16@2x.png
index b93409475d..230d65e12d 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/repository-16@2x.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/repository-16@2x.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/revert-16.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/revert-16.png
index 512902f76c..e08803d985 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/revert-16.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/revert-16.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/revert-16@2x.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/revert-16@2x.png
index 4cfae960df..d9155f2685 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/revert-16@2x.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/revert-16@2x.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/unlocked-overlay-16.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/unlocked-overlay-16.png
index 9a5aa60080..3d2ff49956 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/unlocked-overlay-16.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/unlocked-overlay-16.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/unlocked-overlay-16@2x.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/unlocked-overlay-16@2x.png
index a26c3f532e..14fb4b8bc1 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/unlocked-overlay-16@2x.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/unlocked-overlay-16@2x.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/vcs-removed-16.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/vcs-removed-16.png
index 67ad8cdc7f..d33e4da129 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/vcs-removed-16.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/vcs-removed-16.png
Binary files differ
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/vcs-removed-16@2x.png b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/vcs-removed-16@2x.png
index 4fc3ef4bc3..e29f3370cd 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/vcs-removed-16@2x.png
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/icons/light/vcs-removed-16@2x.png
Binary files differ
diff --git a/main/src/addins/VersionControl/Subversion.Win32.Tests/RepositoryTests.cs b/main/src/addins/VersionControl/Subversion.Win32.Tests/RepositoryTests.cs
index 7385ee64a7..c7cf1c8601 100644
--- a/main/src/addins/VersionControl/Subversion.Win32.Tests/RepositoryTests.cs
+++ b/main/src/addins/VersionControl/Subversion.Win32.Tests/RepositoryTests.cs
@@ -41,8 +41,8 @@ namespace MonoDevelop.VersionControl.Subversion.Tests
[SetUp]
public override void Setup ()
{
- RootUrl = new FilePath (FileService.CreateTempDirectory ());
- RepoLocation = "svn://localhost:3690/repo";
+ RemotePath = new FilePath (FileService.CreateTempDirectory ());
+ RemoteUrl = "svn://localhost:3690/repo";
SvnServe = new Process ();
base.Setup ();
}
@@ -62,7 +62,7 @@ namespace MonoDevelop.VersionControl.Subversion.Tests
@@ -0,0 +1 @@
+text
";
- Assert.AreEqual (difftext, Repo.GenerateDiff (RootCheckout + "testfile", Repo.GetVersionInfo (RootCheckout + "testfile", VersionInfoQueryFlags.IgnoreCache)).Content.Replace ("\n", "\r\n"));
+ Assert.AreEqual (difftext, Repo.GenerateDiff (LocalPath + "testfile", Repo.GetVersionInfo (LocalPath + "testfile", VersionInfoQueryFlags.IgnoreCache)).Content.Replace ("\n", "\r\n"));
}
// Tests that fail due to SvnSharp giving wrong data.
@@ -96,7 +96,7 @@ namespace MonoDevelop.VersionControl.Subversion.Tests
protected override void PostLock ()
{
- string added = RootCheckout + "testfile";
+ string added = LocalPath + "testfile";
Assert.Throws<Exception> (delegate {
File.WriteAllText (added, "text");
});
@@ -111,7 +111,7 @@ namespace MonoDevelop.VersionControl.Subversion.Tests
protected override void PostUnlock ()
{
- string added = RootCheckout + "testfile";
+ string added = LocalPath + "testfile";
Assert.DoesNotThrow (delegate {
File.WriteAllText (added, "text");
});
diff --git a/main/src/addins/VersionControl/Subversion.Win32/SvnSharpClient.cs b/main/src/addins/VersionControl/Subversion.Win32/SvnSharpClient.cs
index 0e099140dc..667308fa8f 100644
--- a/main/src/addins/VersionControl/Subversion.Win32/SvnSharpClient.cs
+++ b/main/src/addins/VersionControl/Subversion.Win32/SvnSharpClient.cs
@@ -16,17 +16,24 @@ namespace SubversionAddinWindows
sealed class SvnSharpClient: SubversionVersionControl
{
static bool errorShown;
- static readonly bool installError;
- static readonly SvnClient client;
+ static bool installError {
+ get { return client.Value == null; }
+ }
+ static readonly internal Lazy<SvnClient> client;
static SvnSharpClient ()
{
+ client = new Lazy<SvnClient> (CheckInstalled);
+ }
+
+ static SvnClient CheckInstalled ()
+ {
try {
- client = new SvnClient ();
+ return new SvnClient ();
} catch (Exception ex) {
LoggingService.LogError ("SVN client could not be initialized", ex);
- installError = true;
}
+ return null;
}
public override SubversionBackend CreateBackend ()
@@ -37,7 +44,7 @@ namespace SubversionAddinWindows
public override string GetPathUrl (FilePath path)
{
lock (client) {
- Uri u = client.GetUriFromWorkingCopy (path);
+ Uri u = client.Value.GetUriFromWorkingCopy (path);
return u != null ? u.ToString () : null;
}
}
@@ -62,7 +69,7 @@ namespace SubversionAddinWindows
{
string wc_path;
try {
- wc_path = client.GetWorkingCopyRoot (path.FullPath);
+ wc_path = client.Value.GetWorkingCopyRoot (path.FullPath);
return wc_path;
} catch (SvnException e) {
switch (e.SvnErrorCode) {
@@ -77,7 +84,10 @@ namespace SubversionAddinWindows
sealed class SvnSharpBackend: SubversionBackend
{
- SvnClient client;
+ static SvnClient client {
+ get { return SvnSharpClient.client.Value; }
+ }
+
IProgressMonitor updateMonitor;
NotifData notifyData;
ProgressData progressData;
@@ -107,7 +117,6 @@ namespace SubversionAddinWindows
void Init ()
{
- client = new SvnClient ();
client.Authentication.SslClientCertificateHandlers += AuthenticationSslClientCertificateHandlers;
client.Authentication.SslClientCertificatePasswordHandlers += AuthenticationSslClientCertificatePasswordHandlers;
client.Authentication.SslServerTrustHandlers += AuthenticationSslServerTrustHandlers;
@@ -791,5 +800,11 @@ namespace SubversionAddinWindows
if (notifyChange && File.Exists (file))
FileService.NotifyFileChanged (file, true);
}
+
+ public override bool HasNeedLock (FilePath file)
+ {
+ string tmp;
+ return client.GetProperty (new SvnPathTarget (file), SvnPropertyNames.SvnNeedsLock, out tmp);
+ }
}
}
diff --git a/main/src/addins/WindowsPlatform/WindowsPlatform/WindowsProxyCredentialProvider.cs b/main/src/addins/WindowsPlatform/WindowsPlatform/WindowsProxyCredentialProvider.cs
index 8c5f2bab88..598f796ce0 100644
--- a/main/src/addins/WindowsPlatform/WindowsPlatform/WindowsProxyCredentialProvider.cs
+++ b/main/src/addins/WindowsPlatform/WindowsPlatform/WindowsProxyCredentialProvider.cs
@@ -38,18 +38,58 @@ namespace MonoDevelop.Platform.Windows
{
public class WindowsProxyCredentialProvider : ICredentialProvider
{
- public ICredentials GetCredentials (Uri uri, IWebProxy proxy, CredentialType credentialType, ICredentials existingCredential, bool retrying)
+ object guiLock = new object();
+
+ public ICredentials GetCredentials (Uri uri, IWebProxy proxy, CredentialType credentialType, bool retrying)
{
if (uri == null)
throw new ArgumentNullException ("uri");
- NetworkCredential currentCredentials = null;
- if (existingCredential != null)
- currentCredentials = CredentialsUtility.GetCredentialsForUriFromICredentials (uri, existingCredential);
+ // if looking for proxy credentials, we care about the proxy's URL, not the request URL
+ if (credentialType == CredentialType.ProxyCredentials) {
+ var proxyUri = proxy.GetProxy (uri);
+ if (proxyUri != null)
+ uri = proxyUri;
+ }
+
+ lock (guiLock) {
+ // If this is the first attempt, return any stored credentials. If they fail, we'll be called again.
+ if (!retrying) {
+ var creds = GetExistingCredentials (uri, credentialType);
+ if (creds != null)
+ return creds;
+ }
+
+ return GetCredentialsFromUser (uri, proxy, credentialType);
+ }
+ }
+
+ static ICredentials GetExistingCredentials (Uri uri, CredentialType credentialType)
+ {
+ var rootUri = new Uri (uri.GetComponents (UriComponents.SchemeAndServer, UriFormat.SafeUnescaped));
+ var existing =
+ PasswordService.GetWebUserNameAndPassword (uri) ??
+ PasswordService.GetWebUserNameAndPassword (rootUri);
+
+ return existing != null ? new NetworkCredential (existing.Item1, existing.Item2) : null;
+ }
+
+ static ICredentials GetCredentialsFromUser (Uri uri, IWebProxy proxy, CredentialType credentialType)
+ {
+ NetworkCredential result = null;
+
+ DispatchService.GuiSyncDispatch (() => {
+ var form = new PlaceholderForm (credentialType, uri, null);
+ if (GdkWin32.RunModalWin32Form (form, IdeApp.Workbench.RootWindow))
+ result = new NetworkCredential (form.Username, form.Password, form.Domain);
+ });
- var form = new PlaceholderForm (credentialType, uri, currentCredentials);
- var result = GdkWin32.RunModalWin32Form (form, IdeApp.Workbench.RootWindow);
- return result ? new NetworkCredential (form.Username, form.Password, form.Domain) : null;
+ // store the obtained credentials in the auth store
+ // but don't store for the root url since it may have other credentials
+ if (result != null)
+ PasswordService.AddWebUserNameAndPassword (uri, result.UserName, result.Password);
+
+ return result;
}
}
@@ -74,9 +114,21 @@ namespace MonoDevelop.Platform.Windows
public override DialogResult ShowMagicDialog ()
{
+ var message = type == CredentialType.ProxyCredentials
+ ? GettextCatalog.GetString (
+ "{0} needs credentials to access the proxy server {1}.",
+ BrandingService.ApplicationName,
+ uri.Host
+ )
+ : GettextCatalog.GetString (
+ "{0} needs credentials to access {1}.",
+ BrandingService.ApplicationName,
+ uri.Host
+ );
+
var credUiInfo = new Native.CredentialUiInfo {
- MessageText = GettextCatalog.GetString ("{1} needs {2} credentials to access {0}.", uri.Host, BrandingService.ApplicationName, type == CredentialType.ProxyCredentials ? "proxy" : "request"),
- CaptionText = GettextCatalog.GetString ("{0} needs {1} credentials", BrandingService.ApplicationName, type == CredentialType.ProxyCredentials ? "proxy" : "request"),
+ MessageText = message,
+ CaptionText = GettextCatalog.GetString ("Credentials Required"),
StructureSize = Marshal.SizeOf (typeof (Native.CredentialUiInfo)),
ParentWindow = GdkWin32.HgdiobjGet (IdeApp.Workbench.RootWindow.GdkWindow)
};
diff --git a/main/src/core/Makefile.am b/main/src/core/Makefile.am
index 3b02756b8e..a71f67828c 100644
--- a/main/src/core/Makefile.am
+++ b/main/src/core/Makefile.am
@@ -2,5 +2,6 @@ SUBDIRS = \
MonoDevelop.Projects.Formats.MSBuild \
MonoDevelop.Core \
Mono.Texteditor \
- MonoDevelop.Ide MonoDevelop.Startup
+ MonoDevelop.Ide MonoDevelop.Startup \
+ MonoDevelop.TextEditor.Tests
diff --git a/main/src/core/Mono.Texteditor/Mono.TextEditor.Highlighting/Chunk.cs b/main/src/core/Mono.Texteditor/Mono.TextEditor.Highlighting/Chunk.cs
index e267acb14e..2f41c21d08 100644
--- a/main/src/core/Mono.Texteditor/Mono.TextEditor.Highlighting/Chunk.cs
+++ b/main/src/core/Mono.Texteditor/Mono.TextEditor.Highlighting/Chunk.cs
@@ -85,5 +85,10 @@ namespace Mono.TextEditor
{
return new TextSegment (chunk.Offset, chunk.Length);
}
+
+ public override string ToString ()
+ {
+ return string.Format ("[Chunk: Style={0}, Offset={1}, Length={2}]", Style, Offset, Length);
+ }
}
}
diff --git a/main/src/core/Mono.Texteditor/Mono.TextEditor.Highlighting/SyntaxMode.cs b/main/src/core/Mono.Texteditor/Mono.TextEditor.Highlighting/SyntaxMode.cs
index 76484611fe..b180208ace 100644
--- a/main/src/core/Mono.Texteditor/Mono.TextEditor.Highlighting/SyntaxMode.cs
+++ b/main/src/core/Mono.Texteditor/Mono.TextEditor.Highlighting/SyntaxMode.cs
@@ -367,9 +367,8 @@ namespace Mono.TextEditor.Highlighting
if ((span.BeginFlags & SpanBeginFlags.FirstNonWs) == SpanBeginFlags.FirstNonWs)
mismatch = CurText.Take (i).Any (ch => !char.IsWhiteSpace (ch));
if ((span.BeginFlags & SpanBeginFlags.NewWord) == SpanBeginFlags.NewWord) {
- if (i - 1 > 0 && i - 1 < CurText.Length) {
- mismatch = !char.IsWhiteSpace (CurText[i - 1]);
- }
+ if (textOffset - 1 > 0 && textOffset - 1 < CurText.Length)
+ mismatch = !char.IsWhiteSpace (CurText [textOffset - 1]);
}
if (mismatch)
continue;
diff --git a/main/src/core/Mono.Texteditor/Mono.TextEditor.Highlighting/SyntaxModeService.cs b/main/src/core/Mono.Texteditor/Mono.TextEditor.Highlighting/SyntaxModeService.cs
index 367fa0446f..d1415b8bf6 100644
--- a/main/src/core/Mono.Texteditor/Mono.TextEditor.Highlighting/SyntaxModeService.cs
+++ b/main/src/core/Mono.Texteditor/Mono.TextEditor.Highlighting/SyntaxModeService.cs
@@ -259,62 +259,67 @@ namespace Mono.TextEditor.Highlighting
public void InnerRun ()
{
- bool doUpdate = false;
- int startLine = doc.OffsetToLineNumber (startOffset);
- if (startLine < 0 || mode.Document == null)
- return;
try {
- var lineSegment = doc.GetLine (startLine);
- if (lineSegment == null)
- return;
- var span = lineSegment.StartSpan;
- if (span == null)
+ bool doUpdate = false;
+ int startLine = doc.OffsetToLineNumber (startOffset);
+ if (startLine < 0 || mode.Document == null)
return;
-
- var spanStack = span.Clone ();
-
- SyntaxMode.SpanParser parser = mode.CreateSpanParser(null, spanStack);
-
- foreach (var line in doc.GetLinesStartingAt (startLine)) {
- if (line == null)
+ try {
+ var lineSegment = doc.GetLine (startLine);
+ if (lineSegment == null)
return;
-
- if (line.Offset > endOffset) {
- span = line.StartSpan;
- if (span == null)
+ var span = lineSegment.StartSpan;
+ if (span == null)
+ return;
+
+ var spanStack = span.Clone ();
+
+ SyntaxMode.SpanParser parser = mode.CreateSpanParser(null, spanStack);
+
+ foreach (var line in doc.GetLinesStartingAt (startLine)) {
+ if (line == null)
return;
-
- bool equal = span.Equals(spanStack);
-
- doUpdate |= !equal;
-
- if (equal)
-
- break;
-
+
+ if (line.Offset > endOffset) {
+ span = line.StartSpan;
+ if (span == null)
+ return;
+
+ bool equal = span.Equals(spanStack);
+
+ doUpdate |= !equal;
+
+ if (equal)
+
+ break;
+
+ }
+
+ line.StartSpan = spanStack.Clone();
+
+ parser.ParseSpans(line.Offset, line.LengthIncludingDelimiter);
+
+ while (spanStack.Count > 0 && !EndsWithContinuation(spanStack.Peek(), line))
+
+ parser.PopSpan();
+
}
-
- line.StartSpan = spanStack.Clone();
-
- parser.ParseSpans(line.Offset, line.LengthIncludingDelimiter);
-
- while (spanStack.Count > 0 && !EndsWithContinuation(spanStack.Peek(), line))
-
- parser.PopSpan();
-
+
+ } catch (Exception e) {
+ Console.WriteLine ("Syntax highlighting exception:" + e);
}
-
- } catch (Exception e) {
- Console.WriteLine ("Syntax highlighting exception:" + e);
- }
- if (doUpdate) {
- Gtk.Application.Invoke (delegate {
- doc.RequestUpdate (new UpdateAll ());
- doc.CommitDocumentUpdate ();
- });
+ if (doUpdate) {
+ var storedDoc = doc;
+ Gtk.Application.Invoke (delegate {
+ storedDoc.CommitUpdateAll ();
+ });
+ }
+ IsFinished = true;
+ ManualResetEvent.Set ();
+ } finally {
+ doc = null;
+ mode = null;
}
- IsFinished = true;
- ManualResetEvent.Set ();
}
}
@@ -344,7 +349,11 @@ namespace Mono.TextEditor.Highlighting
lock (updateQueue) {
worker = updateQueue.Dequeue ();
}
- worker.InnerRun ();
+ try {
+ worker.InnerRun ();
+ } catch (Exception e) {
+ Console.WriteLine ("Exception in syntax mode update thread:" + e);
+ }
}
queueSignal.WaitOne ();
}
diff --git a/main/src/core/Mono.Texteditor/Mono.TextEditor.Vi/ViActionMaps.cs b/main/src/core/Mono.Texteditor/Mono.TextEditor.Vi/ViActionMaps.cs
index 317d247137..fb0c3eb14c 100644
--- a/main/src/core/Mono.Texteditor/Mono.TextEditor.Vi/ViActionMaps.cs
+++ b/main/src/core/Mono.Texteditor/Mono.TextEditor.Vi/ViActionMaps.cs
@@ -90,6 +90,10 @@ namespace Mono.TextEditor.Vi
return CaretMoveActions.PreviousWord;
case 'l':
return ViActions.Right;
+ case 'e':
+ return ViActions.NextSubwordEnd;
+ case 'E':
+ return ViActions.NextWordEnd;
case 'w':
return CaretMoveActions.NextSubword;
case 'W':
diff --git a/main/src/core/Mono.Texteditor/Mono.TextEditor.Vi/ViActions.cs b/main/src/core/Mono.Texteditor/Mono.TextEditor.Vi/ViActions.cs
index 95bb9d5823..dab41c1bd5 100644
--- a/main/src/core/Mono.Texteditor/Mono.TextEditor.Vi/ViActions.cs
+++ b/main/src/core/Mono.Texteditor/Mono.TextEditor.Vi/ViActions.cs
@@ -32,10 +32,18 @@ using System.Text;
namespace Mono.TextEditor.Vi
{
-
-
public static class ViActions
{
+ public static void NextSubwordEnd (TextEditorData data)
+ {
+ data.Caret.Offset = ViWordFindStrategy.FindNextSubwordEndOffset (data.Document, data.Caret.Offset);
+ }
+
+ public static void NextWordEnd (TextEditorData data)
+ {
+ data.Caret.Offset = ViWordFindStrategy.FindNextWordEndOffset (data.Document, data.Caret.Offset);
+ }
+
public static void MoveToNextEmptyLine (TextEditorData data)
{
if (data.Caret.Line == data.Document.LineCount) {
diff --git a/main/src/core/Mono.Texteditor/Mono.TextEditor.Vi/ViWordFindStrategy.cs b/main/src/core/Mono.Texteditor/Mono.TextEditor.Vi/ViWordFindStrategy.cs
index 45fd8a3604..de2efa4548 100644
--- a/main/src/core/Mono.Texteditor/Mono.TextEditor.Vi/ViWordFindStrategy.cs
+++ b/main/src/core/Mono.Texteditor/Mono.TextEditor.Vi/ViWordFindStrategy.cs
@@ -116,7 +116,62 @@ namespace Mono.TextEditor.Vi
}
#endregion
-
+
+ private static bool OffsetIsWithinBounds (TextDocument doc, int offset)
+ {
+ return (offset >= 0 && offset <= doc.TextLength - 1);
+ }
+
+ public static int FindNextSubwordEndOffset (TextDocument doc, int offset)
+ {
+ int myoffset = offset + 1;
+
+ if (!OffsetIsWithinBounds (doc, myoffset)) {
+ return myoffset;
+ }
+
+ char c = doc.GetCharAt (myoffset);
+ // skip whitespace
+ while (char.IsWhiteSpace (c)) {
+ if (OffsetIsWithinBounds (doc, ++myoffset)) {
+ c = doc.GetCharAt (myoffset);
+ } else {
+ return offset;
+ }
+ }
+ var initialClass = ViWordFindStrategy.GetCharacterClass (c);
+ while (ViWordFindStrategy.GetCharacterClass (c) == initialClass && 0 <= myoffset && doc.TextLength-1 > myoffset) {
+ c = doc.GetCharAt (++myoffset);
+ }
+
+ return System.Math.Max (offset, myoffset - 1);
+ }
+
+ public static int FindNextWordEndOffset (TextDocument doc, int offset)
+ {
+ int myoffset = offset + 1;
+
+ if (!OffsetIsWithinBounds (doc, myoffset)) {
+ return myoffset;
+ }
+
+ char c = doc.GetCharAt (myoffset);
+ // skip whitespace
+ while (char.IsWhiteSpace (c)) {
+ if (OffsetIsWithinBounds (doc, ++myoffset)) {
+ c = doc.GetCharAt (myoffset);
+ } else {
+ return offset;
+ }
+ }
+
+ while (!char.IsWhiteSpace (c) && 0 <= myoffset && doc.TextLength-1 > myoffset) {
+ c = doc.GetCharAt (++myoffset);
+ }
+
+ return System.Math.Max (offset, myoffset - 1);
+ }
+
/// <summary>
/// Gets the character class for a given character.
/// </summary>
diff --git a/main/src/core/Mono.Texteditor/Mono.TextEditor/Document/FoldSegment.cs b/main/src/core/Mono.Texteditor/Mono.TextEditor/Document/FoldSegment.cs
index e2b994ddad..4ae6afd272 100644
--- a/main/src/core/Mono.Texteditor/Mono.TextEditor/Document/FoldSegment.cs
+++ b/main/src/core/Mono.Texteditor/Mono.TextEditor/Document/FoldSegment.cs
@@ -73,13 +73,19 @@ namespace Mono.TextEditor
public DocumentLine StartLine {
get {
- return doc.GetLineByOffset (Offset);
+ return doc.GetLineByOffset (System.Math.Min (doc.TextLength, System.Math.Max (0, Offset)));
}
}
public DocumentLine EndLine {
get {
- return doc.GetLineByOffset (EndOffset);
+ return doc.GetLineByOffset (System.Math.Min (doc.TextLength, System.Math.Max (0, EndOffset)));
+ }
+ }
+
+ public bool IsInvalid {
+ get {
+ return Offset < 0;
}
}
diff --git a/main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/FoldingScreenbackgroundRenderer.cs b/main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/FoldingScreenbackgroundRenderer.cs
index 88c8122f5d..172e11d8c3 100644
--- a/main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/FoldingScreenbackgroundRenderer.cs
+++ b/main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/FoldingScreenbackgroundRenderer.cs
@@ -100,6 +100,8 @@ namespace Mono.TextEditor
const int rightMarginPadding = 16;
for (int i = foldSegments.Count - 1; i >= 0 ; i--) {
var segment = foldSegments [i];
+ if (segment.IsInvalid)
+ continue;
var segmentStartLine = segment.StartLine;
var segmentEndLine = segment.EndLine;
diff --git a/main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/TextArea.cs b/main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/TextArea.cs
index 4e0c6384c3..be802c68f6 100644
--- a/main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/TextArea.cs
+++ b/main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/TextArea.cs
@@ -1845,9 +1845,6 @@ namespace Mono.TextEditor
animation.Drawer.Draw (cr);
}
- if (HasFocus)
- textViewMargin.DrawCaret (e.Window, e.Area);
-
OnPainted (new PaintEventArgs (cr, cairoArea));
}
diff --git a/main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/TextViewMargin.cs b/main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/TextViewMargin.cs
index 429946252d..bc0edb824b 100644
--- a/main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/TextViewMargin.cs
+++ b/main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/TextViewMargin.cs
@@ -699,10 +699,10 @@ namespace Mono.TextEditor
var curRect = new Gdk.Rectangle ((int)caretX, (int)caretY, (int)this.charWidth, (int)LineHeight - 1);
if (curRect != caretRectangle) {
caretRectangle = curRect;
- textEditor.TextArea.QueueDrawArea (caretRectangle.X - (int)textEditor.Options.Zoom,
- (int)(caretRectangle.Y + (-textEditor.VAdjustment.Value + caretVAdjustmentValue)),
- caretRectangle.Width + (int)textEditor.Options.Zoom,
- caretRectangle.Height + 1);
+// textEditor.TextArea.QueueDrawArea (caretRectangle.X - (int)textEditor.Options.Zoom,
+// (int)(caretRectangle.Y + (-textEditor.VAdjustment.Value + caretVAdjustmentValue)),
+// caretRectangle.Width + (int)textEditor.Options.Zoom,
+// caretRectangle.Height + 1);
caretVAdjustmentValue = textEditor.VAdjustment.Value;
}
diff --git a/main/src/core/Mono.Texteditor/SyntaxModes/FSharpSyntaxMode.xml b/main/src/core/Mono.Texteditor/SyntaxModes/FSharpSyntaxMode.xml
index f032a75348..3e989e82de 100644
--- a/main/src/core/Mono.Texteditor/SyntaxModes/FSharpSyntaxMode.xml
+++ b/main/src/core/Mono.Texteditor/SyntaxModes/FSharpSyntaxMode.xml
@@ -29,6 +29,8 @@
<Property name="BlockCommentEnd">*)</Property>
<Property name="StringQuote">"</Property>
+ <Delimiters>&amp;&lt;&gt;~@%^*()-+=|\#/{}[]:;"' , ?</Delimiters>
+
<EolSpan tagColor = "Preprocessor" rule="text.preprocessor">#if</EolSpan>
<EolSpan tagColor = "Preprocessor" rule="text.preprocessor">#else</EolSpan>
<EolSpan tagColor = "Preprocessor" rule="text.preprocessor">#elif</EolSpan>
@@ -95,6 +97,14 @@
<Match color="Number">CSharpNumber</Match>
+ <Match color="Keyword(Iteration)">let(!)?</Match>
+ <Match color="Keyword(Iteration)">use(!)?</Match>
+ <Match color="Keyword(Iteration)">yield(!)?</Match>
+ <Match color="Keyword(Iteration)">return(!)?</Match>
+ <Match color="Keyword(Iteration)">do(!)?</Match>
+
+ <!-- reserved-ident-keyword F# spec v3.0 section 3.4 -->
+ <Match color="Keyword(Other)">(atomic|break|checked|component|const|constraint|constructor|continue|eager|fixed|fori|functor|include|measure|method|mixin|object|parallel|params|process|protected|pure|recursive|sealed|tailcall|trait|virtual|volatile)[!#]?</Match>
<!-- It is really impossible to do some intelligent grouping here, because
it looks weird no matter what we do... some things are context-sensitive,
@@ -114,17 +124,9 @@
<Word>with</Word>
<Word>val</Word>
- <Word>use</Word>
- <Word>yield</Word>
- <Word>let!</Word>
- <Word>use!</Word>
- <Word>do!</Word>
- <Word>yield!</Word>
- <Word>return!</Word>
<Word>while</Word>
<Word>for</Word>
- <Word>do</Word>
<Word>begin</Word>
<Word>done</Word>
<Word>elif</Word>
@@ -132,7 +134,6 @@
<Word>end</Word>
<Word>if</Word>
<Word>match</Word>
- <Word>return</Word>
<Word>then</Word>
<Word>when</Word>
@@ -176,6 +177,7 @@
<Word>lazy</Word>
<Word>and</Word>
<Word>downcast</Word>
+ <Word>select</Word>
</Keywords>
<Keywords color="Keyword(Constants)">
@@ -214,6 +216,15 @@
</Keywords>
<Keywords color="Keyword(Other)">
+ <!-- reserved OCaml keywords -->
+ <Word>asr</Word>
+ <Word>land</Word>
+ <Word>lor</Word>
+ <Word>lsl</Word>
+ <Word>lsr</Word>
+ <Word>lxor</Word>
+ <Word>mod</Word>
+ <Word>sig</Word>
</Keywords>
<Rule name="text.preprocessor" ignorecase="True">
@@ -293,7 +304,7 @@
<Rule name="XmlDocumentation">
<Delimiters>&lt;&gt;</Delimiters>
- <Span color = "Comment(DocTag)" rule = "XmlDocumentationTag">
+ <Span color = "Comment(DocTag)" rule = "XmlDocumentationTag" stopateol = "true">
<Begin>&lt;</Begin>
<End>&gt;</End>
</Span>
diff --git a/main/src/core/Mono.Texteditor/SyntaxModes/JavascriptSyntaxMode.xml b/main/src/core/Mono.Texteditor/SyntaxModes/JavascriptSyntaxMode.xml
index 58de0b9172..add1a65161 100644
--- a/main/src/core/Mono.Texteditor/SyntaxModes/JavascriptSyntaxMode.xml
+++ b/main/src/core/Mono.Texteditor/SyntaxModes/JavascriptSyntaxMode.xml
@@ -25,6 +25,8 @@
THE SOFTWARE. -->
<SyntaxMode name = "Javascript" mimeTypes="application/javascript;text/javascript">
+ <Property name="LineComment">//</Property>
+
<EolSpan color = "Script Comment" rule="Comment">//</EolSpan>
<Span color = "Script Comment" rule="Comment">
<Begin>/*</Begin>
diff --git a/main/src/core/Mono.Texteditor/SyntaxModes/TypescriptSyntaxMode.xml b/main/src/core/Mono.Texteditor/SyntaxModes/TypescriptSyntaxMode.xml
index 36d76840d5..a6ccc9c804 100644
--- a/main/src/core/Mono.Texteditor/SyntaxModes/TypescriptSyntaxMode.xml
+++ b/main/src/core/Mono.Texteditor/SyntaxModes/TypescriptSyntaxMode.xml
@@ -27,7 +27,8 @@ THE SOFTWARE.
-->
<SyntaxMode name = "Typescript" mimeTypes="application/typescript;text/typescript">
-
+ <Property name="LineComment">//</Property>
+
<EolSpan color = "Script Comment" rule="Comment">//</EolSpan>
<Span color = "Script Comment" rule="Comment">
diff --git a/main/src/core/MonoDevelop.Core/Makefile.am b/main/src/core/MonoDevelop.Core/Makefile.am
index c9cc87438f..0f98ef2b7e 100644
--- a/main/src/core/MonoDevelop.Core/Makefile.am
+++ b/main/src/core/MonoDevelop.Core/Makefile.am
@@ -1 +1,4 @@
include $(top_srcdir)/xbuild.include
+
+EXTRA_DIST += \
+ BuildVariables.cs.in
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoFrameworkBackend.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoFrameworkBackend.cs
index df631da7dd..5194d0c421 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoFrameworkBackend.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoFrameworkBackend.cs
@@ -164,7 +164,8 @@ namespace MonoDevelop.Core.Assemblies
SystemPackageInfo info = base.GetFrameworkPackageInfo (packageName);
if (framework.Id.Version == "3.0" && packageName == "olive") {
info.IsCorePackage = false;
- } else {
+ }
+ if (String.IsNullOrEmpty (info.Name)) {
info.Name = "mono";
}
return info;
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/IDebugConsole.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/IDebugConsole.cs
new file mode 100644
index 0000000000..feded135b7
--- /dev/null
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/IDebugConsole.cs
@@ -0,0 +1,35 @@
+//
+// IDebugConsole.cs
+//
+// Author:
+// David Karlaš <david.karlas@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin, Inc (http://www.xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.IO;
+
+namespace MonoDevelop.Core.Execution
+{
+ public interface IDebugConsole: IConsole
+ {
+ void Debug (int level, string category, string message);
+ }
+}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.ProgressMonitoring/ConsoleProgressMonitor.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.ProgressMonitoring/ConsoleProgressMonitor.cs
index b502d99669..82410eae20 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.ProgressMonitoring/ConsoleProgressMonitor.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.ProgressMonitoring/ConsoleProgressMonitor.cs
@@ -34,6 +34,7 @@ namespace MonoDevelop.Core.ProgressMonitoring
public class ConsoleProgressMonitor: NullProgressMonitor
{
int columns = 0;
+ bool leaveOpen;
bool indent = true;
bool wrap = false;
int ilevel = 0;
@@ -47,7 +48,7 @@ namespace MonoDevelop.Core.ProgressMonitoring
get { return EnableTimeStamp ? string.Format ("[{0}] ", DateTime.Now.ToString ("yyyy-MM-dd HH:mm:ss.f")) : string.Empty; }
}
- public ConsoleProgressMonitor () : this (Console.Out)
+ public ConsoleProgressMonitor () : this (Console.Out, true)
{
//TODO: can we efficiently update Console.WindowWidth when it changes?
// TODO: Use Console.IsOutputRedirected in .NET 4.5.
@@ -61,12 +62,28 @@ namespace MonoDevelop.Core.ProgressMonitoring
wrap = columns > 0;
}
-
- public ConsoleProgressMonitor (TextWriter writer)
+
+ public ConsoleProgressMonitor (TextWriter writer, bool leaveOpen)
{
this.writer = writer;
+ this.leaveOpen = leaveOpen;
logger = new LogTextWriter ();
- logger.TextWritten += new LogTextEventHandler (WriteLog);
+ logger.TextWritten += WriteLog;
+ }
+
+ public ConsoleProgressMonitor (TextWriter writer) : this (writer, false)
+ {
+ }
+
+ public override void Dispose ()
+ {
+ logger.TextWritten -= WriteLog;
+ logger.Dispose ();
+
+ if (!leaveOpen)
+ writer.Dispose ();
+
+ base.Dispose ();
}
public bool EnableTimeStamp {
@@ -151,27 +168,27 @@ namespace MonoDevelop.Core.ProgressMonitoring
else
WriteText (text, 0);
}
-
- void WriteText (string text, int leftMargin)
- {
+
+ void WriteText (string text, int leftMargin)
+ {
if (text == null)
return;
- string timestamp = TimeStamp;
+ string timestamp = TimeStamp;
int maxCols = wrap ? columns - timestamp.Length : int.MaxValue;
- int n = 0;
+ int n = 0;
- while (n < text.Length)
- {
+ while (n < text.Length)
+ {
if (col == -1) {
writer.Write (timestamp + new string (' ', leftMargin));
col = leftMargin;
}
- int lastWhite = -1;
+ int lastWhite = -1;
int sn = n;
bool eol = false;
-
+
while (col < maxCols && n < text.Length) {
char c = text [n];
if (c == '\r') {
@@ -181,26 +198,26 @@ namespace MonoDevelop.Core.ProgressMonitoring
if (c == '\n') {
eol = true;
break;
- }
- if (char.IsWhiteSpace (c))
- lastWhite = n;
- col++;
- n++;
- }
-
- if (lastWhite == -1 || col < maxCols)
- lastWhite = n;
- else if (col >= maxCols)
- n = lastWhite + 1;
-
+ }
+ if (char.IsWhiteSpace (c))
+ lastWhite = n;
+ col++;
+ n++;
+ }
+
+ if (lastWhite == -1 || col < maxCols)
+ lastWhite = n;
+ else if (col >= maxCols)
+ n = lastWhite + 1;
+
writer.Write (text.Substring (sn, lastWhite - sn));
if (eol || col >= maxCols) {
col = -1;
writer.WriteLine ();
if (eol) n++;
- }
- }
+ }
+ }
}
void Indent ()
@@ -222,4 +239,4 @@ namespace MonoDevelop.Core.ProgressMonitoring
}
}
}
-} \ No newline at end of file
+}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/CredentialsUtility.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/CredentialProviderExtensions.cs
index 5038c4031e..e9f3ad148b 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/CredentialsUtility.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/CredentialProviderExtensions.cs
@@ -1,13 +1,6 @@
//
-// CredentialsUtility.cs
+// From NuGet src/Core
//
-// Author:
-// Bojan Rajkovic <bojan.rajkovic@xamarin.com>
-// Michael Hutchinson <mhutch@xamarin.com>
-//
-// based on NuGet src/Core/Http
-//
-// Copyright (c) 2013-2014 Xamarin Inc.
// Copyright (c) 2010-2014 Outercurve Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,54 +14,52 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
-//
using System;
using System.Net;
namespace MonoDevelop.Core.Web
{
- public static class CredentialsUtility
+ internal static class CredentialProviderExtensions
{
- static readonly string[] AuthenticationSchemes = { "Basic", "NTLM", "Negotiate" };
+ private static readonly string[] _authenticationSchemes = new[] { "Basic", "NTLM", "Negotiate" };
- public static NetworkCredential GetCredentialsForUriFromICredentials (Uri uri, ICredentials credentials)
+ internal static ICredentials GetCredentials(this ICredentialProvider provider, WebRequest request, CredentialType credentialType, bool retrying = false)
{
- if (credentials == null)
- return null;
-
- NetworkCredential cred = null;
- foreach (var scheme in AuthenticationSchemes) {
- cred = credentials.GetCredential (uri, scheme);
- if (cred != null)
- break;
- }
-
- return cred;
+ return provider.GetCredentials(request.RequestUri, request.Proxy, credentialType, retrying);
}
- internal static ICredentials AsCredentialCache (this ICredentials credentials, Uri uri)
+ internal static ICredentials AsCredentialCache(this ICredentials credentials, Uri uri)
{
// No credentials then bail
if (credentials == null)
+ {
return null;
+ }
// Do nothing with default credentials
- if (credentials == CredentialCache.DefaultCredentials || credentials == CredentialCache.DefaultNetworkCredentials)
+ if (credentials == CredentialCache.DefaultCredentials ||
+ credentials == CredentialCache.DefaultNetworkCredentials)
+ {
return credentials;
+ }
// If this isn't a NetworkCredential then leave it alone
var networkCredentials = credentials as NetworkCredential;
if (networkCredentials == null)
+ {
return credentials;
+ }
// Set this up for each authentication scheme we support
// The reason we're using a credential cache is so that the HttpWebRequest will forward our
// credentials if there happened to be any redirects in the chain of requests.
- var cache = new CredentialCache ();
- foreach (var scheme in AuthenticationSchemes)
- cache.Add (uri, scheme, networkCredentials);
+ var cache = new CredentialCache();
+ foreach (var scheme in _authenticationSchemes)
+ {
+ cache.Add(uri, scheme, networkCredentials);
+ }
return cache;
}
}
-} \ No newline at end of file
+}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/CredentialStore.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/CredentialStore.cs
index 539c5df1da..d22f2f27af 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/CredentialStore.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/CredentialStore.cs
@@ -1,13 +1,6 @@
//
-// CredentialStore.cs
+// From NuGet src/Core
//
-// Author:
-// Bojan Rajkovic <bojan.rajkovic@xamarin.com>
-// Michael Hutchinson <mhutch@xamarin.com>
-//
-// based on NuGet src/Core/Http
-//
-// Copyright (c) 2013-2014 Xamarin Inc.
// Copyright (c) 2010-2014 Outercurve Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,7 +14,6 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
-//
using System;
using System.Net;
@@ -29,42 +21,45 @@ using System.Collections.Concurrent;
namespace MonoDevelop.Core.Web
{
- class CredentialStore
+ class CredentialStore : ICredentialCache
{
- readonly ConcurrentDictionary<Uri, ICredentials> credentialCache = new ConcurrentDictionary<Uri, ICredentials> ();
+ private readonly ConcurrentDictionary<Uri, ICredentials> _credentialCache = new ConcurrentDictionary<Uri, ICredentials>();
+
+ private static readonly CredentialStore _instance = new CredentialStore();
+
+ public static CredentialStore Instance
+ {
+ get
+ {
+ return _instance;
+ }
+ }
- public ICredentials GetCredentials (Uri uri, CredentialType credentialType)
+ public ICredentials GetCredentials(Uri uri)
{
+ Uri rootUri = GetRootUri(uri);
+
ICredentials credentials;
- if (!credentialCache.TryGetValue (uri, out credentials)) {
- if (credentialType == CredentialType.RequestCredentials &&
- credentialCache.TryGetValue (GetRootUri (uri), out credentials))
- return credentials;
- } else {
+ if (_credentialCache.TryGetValue(uri, out credentials) ||
+ _credentialCache.TryGetValue(rootUri, out credentials))
+ {
return credentials;
}
- // Then go to the keychain
- var creds = PasswordService.GetWebUserNameAndPassword (uri);
- return creds != null ? new NetworkCredential (creds.Item1, creds.Item2).AsCredentialCache (uri) : null;
+ return null;
}
- public void Add (Uri requestUri, ICredentials credentials, CredentialType credentialType)
+ public void Add(Uri uri, ICredentials credentials)
{
- credentialCache.TryAdd (requestUri, credentials);
- if (credentialType == CredentialType.RequestCredentials) {
- var rootUri = GetRootUri (requestUri);
- credentialCache.AddOrUpdate (rootUri, credentials, (u, c) => credentials);
- }
-
- var cred = CredentialsUtility.GetCredentialsForUriFromICredentials (requestUri, credentials);
- if (cred != null && !string.IsNullOrWhiteSpace (cred.UserName) && !string.IsNullOrWhiteSpace (cred.Password))
- PasswordService.AddWebUserNameAndPassword (requestUri, cred.UserName, cred.Password);
+ Uri rootUri = GetRootUri(uri);
+ _credentialCache.TryAdd(uri, credentials);
+ _credentialCache.AddOrUpdate(rootUri, credentials, (u, c) => credentials);
}
- static Uri GetRootUri (Uri uri)
+ internal static Uri GetRootUri(Uri uri)
{
- return new Uri (uri.GetComponents (UriComponents.SchemeAndServer, UriFormat.SafeUnescaped));
+ return new Uri(uri.GetComponents(UriComponents.SchemeAndServer, UriFormat.SafeUnescaped));
}
}
+
}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/CredentialType.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/CredentialType.cs
index f5b7a3c854..c65b61086c 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/CredentialType.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/CredentialType.cs
@@ -1,13 +1,6 @@
+//
+// From NuGet src/Core
//
-// CredentialType.cs
-//
-// Author:
-// Bojan Rajkovic <bojan.rajkovic@xamarin.com>
-// Michael Hutchinson <mhutch@xamarin.com>
-//
-// based on NuGet src/Core/Http
-//
-// Copyright (c) 2013-2014 Xamarin Inc.
// Copyright (c) 2010-2014 Outercurve Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,14 +14,12 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
-//
namespace MonoDevelop.Core.Web
{
- ///<summary>Credential type.</summary>
public enum CredentialType
{
ProxyCredentials,
RequestCredentials
}
-} \ No newline at end of file
+}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/ICredentialCache.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/ICredentialCache.cs
new file mode 100644
index 0000000000..10c47194d8
--- /dev/null
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/ICredentialCache.cs
@@ -0,0 +1,28 @@
+//
+// From NuGet src/Core
+//
+// Copyright (c) 2010-2014 Outercurve Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.Net;
+
+namespace MonoDevelop.Core.Web
+{
+ interface ICredentialCache
+ {
+ void Add(Uri uri, ICredentials credentials);
+ ICredentials GetCredentials(Uri uri);
+ }
+}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/ICredentialProvider.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/ICredentialProvider.cs
index 8c6e6e3b66..4646e7cf4c 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/ICredentialProvider.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/ICredentialProvider.cs
@@ -1,13 +1,6 @@
//
-// ICredentialProvider.cs
+// From NuGet src/Core
//
-// Author:
-// Bojan Rajkovic <bojan.rajkovic@xamarin.com>
-// Michael Hutchinson <mhutch@xamarin.com>
-//
-// based on NuGet src/Core/Http
-//
-// Copyright (c) 2013-2014 Xamarin Inc.
// Copyright (c) 2010-2014 Outercurve Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,7 +14,6 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
-//
using System;
using System.Net;
@@ -35,21 +27,12 @@ namespace MonoDevelop.Core.Web
public interface ICredentialProvider
{
/// <summary>
- /// Returns CredentialState state that lets the consumer know if ICredentials
+ /// Returns CredentialState state that let's the consumer know if ICredentials
/// were discovered by the ICredentialProvider. The credentials argument is then
/// populated with the discovered valid credentials that can be used for the given Uri.
/// The proxy instance if passed will be used to ensure that the request goes through the proxy
/// to ensure successful connection to the destination Uri.
/// </summary>
- ICredentials GetCredentials (Uri uri, IWebProxy proxy, CredentialType credentialType, ICredentials existingCredentials, bool retrying);
- }
-
- class NullCredentialsProvider : ICredentialProvider
- {
- public ICredentials GetCredentials (
- Uri uri, IWebProxy proxy, CredentialType credentialType, ICredentials existingCredentials, bool retrying)
- {
- return null;
- }
+ ICredentials GetCredentials(Uri uri, IWebProxy proxy, CredentialType credentialType, bool retrying);
}
-} \ No newline at end of file
+}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/IHttpWebResponse.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/IHttpWebResponse.cs
new file mode 100644
index 0000000000..65959bab1e
--- /dev/null
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/IHttpWebResponse.cs
@@ -0,0 +1,32 @@
+//
+// From NuGet src/Core
+//
+// Copyright (c) 2010-2014 Outercurve Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.Net;
+using System.Collections.Specialized;
+
+namespace MonoDevelop.Core.Web
+{
+ // For unit testing
+ interface IHttpWebResponse : IDisposable
+ {
+ HttpStatusCode StatusCode { get; }
+ Uri ResponseUri { get; }
+ string AuthType { get; }
+ NameValueCollection Headers { get; }
+ }
+}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/IProxyAuthenticationHandler.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/IProxyAuthenticationHandler.cs
index a2055fe2e8..5a9f422d13 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/IProxyAuthenticationHandler.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/IProxyAuthenticationHandler.cs
@@ -1,13 +1,6 @@
//
-// IProxyAuthenticationHandler.cs
+// From NuGet src/Core
//
-// Author:
-// Bojan Rajkovic <bojan.rajkovic@xamarin.com>
-// Michael Hutchinson <mhutch@xamarin.com>
-//
-// based on NuGet src/Core/Http
-//
-// Copyright (c) 2013-2014 Xamarin Inc.
// Copyright (c) 2010-2014 Outercurve Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,7 +14,6 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
-//
using System;
using System.Net;
@@ -29,6 +21,7 @@ using System.Net;
namespace MonoDevelop.Core.Web
{
///<summary>Proxy authentication handler.</summary>
+ [Obsolete]
public interface IProxyAuthenticationHandler
{
/// <summary>
@@ -49,27 +42,22 @@ namespace MonoDevelop.Core.Web
/// </summary>
/// <param name="uri">URI for which the credentials are valid.</param>
/// <param name="credentials">Credentials.</param>
- /// <param name="credentialType">Type of the credentials.</param>
- void AddCredentialsToCache (Uri uri, ICredentials credentials, CredentialType credentialType);
+ void AddCredentialsToCache (Uri uri, ICredentials credentials);
/// <summary>
/// Gets cached credentials, if available.
/// </summary>
/// <returns>The cached credentials.</returns>
/// <param name="uri">URI for which the credentials will be used.</param>
- /// <param name="credentialType">Type of the credentials.</param>
- ICredentials GetCachedCredentials (Uri uri, CredentialType credentialType);
+ ICredentials GetCachedCredentials (Uri uri);
/// <summary>
/// Gets credentials from user.
/// </summary>
/// <returns>The credentials from user.</returns>
- /// <param name="uri">URI for which the credentials will be used.</param>
- /// <param name="proxy">Proxy.</param>
+ /// <param name="request">Request for which the credentials will be used.</param>
/// <param name="credentialType">Type of the credentials.</param>
- /// <param name="existingCredentials">Existing credentials.</param>
- /// <param name="retrying">If set to <c>true</c> retrying.</param>
- ICredentials GetCredentialsFromUser (Uri uri, IWebProxy proxy, CredentialType credentialType, ICredentials existingCredentials, bool retrying);
+ /// <param name="retrying">Whether retrying.</param>
+ ICredentials GetCredentialsFromUser (HttpWebRequest request, CredentialType credentialType, bool retrying);
}
-
} \ No newline at end of file
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/IProxyCache.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/IProxyCache.cs
new file mode 100644
index 0000000000..488dfcf142
--- /dev/null
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/IProxyCache.cs
@@ -0,0 +1,29 @@
+//
+// From NuGet src/Core
+//
+// Copyright (c) 2010-2014 Outercurve Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.Net;
+
+namespace MonoDevelop.Core.Web
+{
+ interface IProxyCache
+ {
+ void Add (IWebProxy proxy);
+
+ IWebProxy GetProxy (Uri uri);
+ }
+}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/MemoryCache.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/MemoryCache.cs
new file mode 100644
index 0000000000..6f06838350
--- /dev/null
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/MemoryCache.cs
@@ -0,0 +1,150 @@
+//
+// From NuGet src/Core
+//
+// Copyright (c) 2010-2014 Outercurve Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.Collections.Concurrent;
+using System.Threading;
+
+namespace MonoDevelop.Core.Web
+{
+ sealed class MemoryCache : IDisposable
+ {
+ private static readonly Lazy<MemoryCache> _instance = new Lazy<MemoryCache>(() => new MemoryCache());
+ // Interval to wait before cleaning up expired items
+ private static readonly TimeSpan _cleanupInterval = TimeSpan.FromSeconds(10);
+
+ // Cache keys are case-sensitive
+ private readonly ConcurrentDictionary<object, CacheItem> _cache = new ConcurrentDictionary<object, CacheItem>();
+ private readonly Timer _timer;
+
+ internal MemoryCache()
+ {
+ _timer = new Timer(RemoveExpiredEntries, null, _cleanupInterval, _cleanupInterval);
+ }
+
+ internal static MemoryCache Instance
+ {
+ get
+ {
+ return _instance.Value;
+ }
+ }
+
+ internal T GetOrAdd<T>(object cacheKey, Func<T> factory, TimeSpan expiration, bool absoluteExpiration = false) where T : class
+ {
+ // Although this method would return values that have expired while also elavating them to unexpired entries,
+ // none of the data that we cache is time sensitive. At worst, an item will be cached for an extra _cleanupInterval duration.
+
+ CacheItem cacheFactory = new CacheItem(factory, expiration, absoluteExpiration);
+
+ var cachedItem = _cache.GetOrAdd(cacheKey, cacheFactory);
+
+ // Increase the expiration time
+ cachedItem.UpdateUsage(expiration);
+
+ return (T)cachedItem.Value;
+ }
+
+ internal bool TryGetValue<T>(object cacheKey, out T value) where T : class
+ {
+ CacheItem cacheItem;
+ if (_cache.TryGetValue(cacheKey, out cacheItem))
+ {
+ value = (T)cacheItem.Value;
+ return true;
+ }
+ else
+ {
+ value = null;
+ return false;
+ }
+ }
+
+ internal void Remove(object cacheKey)
+ {
+ CacheItem item;
+ _cache.TryRemove(cacheKey, out item);
+ }
+
+ private void RemoveExpiredEntries(object state)
+ {
+ // Remove all the expired ones
+ var keys = _cache.Keys;
+ foreach (var key in keys)
+ {
+ CacheItem cacheItem;
+ if (_cache.TryGetValue(key, out cacheItem) && cacheItem.Expired)
+ {
+ // Note: It is entirely possible that someone reads the value between the time we read Expired on the CacheItem
+ // and we call TryRemove. However we are fine with cache misses at these boundary values. If in the future the nature
+ // of this cache changes, use the method prescribed at http://blogs.msdn.com/b/pfxteam/archive/2011/04/02/10149222.aspx
+ _cache.TryRemove(key, out cacheItem);
+ }
+ }
+ }
+
+ public void Dispose()
+ {
+ if (_timer != null)
+ {
+ _timer.Dispose();
+ }
+ }
+
+ private sealed class CacheItem
+ {
+ private readonly Lazy<object> _valueFactory;
+ private readonly bool _absoluteExpiration;
+ private long _expires;
+
+ public CacheItem(Func<object> valueFactory, TimeSpan expires, bool absoluteExpiration)
+ {
+ _valueFactory = new Lazy<object>(valueFactory);
+ _absoluteExpiration = absoluteExpiration;
+ _expires = DateTime.UtcNow.Ticks + expires.Ticks;
+ }
+
+ public object Value
+ {
+ get
+ {
+ return _valueFactory.Value;
+ }
+ }
+
+ public void UpdateUsage(TimeSpan slidingExpiration)
+ {
+ if (!_absoluteExpiration)
+ {
+ _expires = DateTime.UtcNow.Ticks + slidingExpiration.Ticks;
+ }
+ }
+
+ public bool Expired
+ {
+ get
+ {
+ long ticks = DateTime.UtcNow.Ticks;
+ long expires = Interlocked.Read(ref _expires);
+ // > is atomic on primitive types
+ return ticks > expires;
+ }
+ }
+ }
+ }
+
+}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/MonoAddinsProxyWrapper.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/MonoAddinsProxyWrapper.cs
deleted file mode 100644
index de7e1bb5cc..0000000000
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/MonoAddinsProxyWrapper.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-//
-// MonoAddinsProxyWrapper.cs
-//
-// Author:
-// Michael Hutchinson <m.j.hutchinson@gmail.com>
-//
-// Copyright (c) 2014 Xamarin Inc.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-using System.Net;
-using System;
-
-namespace MonoDevelop.Core.Web
-{
- class MonoAddinsProxyHandler : Mono.Addins.Setup.WebRequestHelper.IProxyAuthenticationHandler
- {
- public void AddProxyToCache (IWebProxy proxy)
- {
- var pah = WebRequestHelper.ProxyAuthenticationHandler;
- if (pah != null)
- pah.AddProxyToCache (proxy);
- }
-
- public IWebProxy GetCachedProxy (Uri uri)
- {
- var pah = WebRequestHelper.ProxyAuthenticationHandler;
- return pah != null ? pah.GetCachedProxy (uri) : null;
- }
-
- public void AddCredentialsToCache (Uri uri, ICredentials credentials,
- Mono.Addins.Setup.WebRequestHelper.CredentialType credentialType)
- {
- var pah = WebRequestHelper.ProxyAuthenticationHandler;
- if (pah != null)
- pah.AddCredentialsToCache (uri, credentials, (CredentialType) credentialType);
- }
-
- public ICredentials GetCachedCredentials (Uri uri, Mono.Addins.Setup.WebRequestHelper.CredentialType credentialType)
- {
- var pah = WebRequestHelper.ProxyAuthenticationHandler;
- return pah != null ? pah.GetCachedCredentials (uri, (CredentialType)credentialType) : null;
- }
-
- public ICredentials GetCredentialsFromUser (Uri uri, IWebProxy proxy,
- Mono.Addins.Setup.WebRequestHelper.CredentialType credentialType,
- ICredentials existingCredentials, bool retrying)
- {
- var pah = WebRequestHelper.ProxyAuthenticationHandler;
- return pah != null ? pah.GetCredentialsFromUser (uri, proxy, (CredentialType)credentialType, existingCredentials, retrying) : null;
- }
- }
-}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/NullCredentialProvider.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/NullCredentialProvider.cs
new file mode 100644
index 0000000000..40e96ff66c
--- /dev/null
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/NullCredentialProvider.cs
@@ -0,0 +1,30 @@
+//
+// From NuGet src/Core
+//
+// Copyright (c) 2010-2014 Outercurve Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.Net;
+
+namespace MonoDevelop.Core.Web
+{
+ class NullCredentialProvider : ICredentialProvider
+ {
+ public ICredentials GetCredentials(Uri uri, IWebProxy proxy, CredentialType credentialType, bool retrying)
+ {
+ return null;
+ }
+ }
+}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/ProxyAuthenticationHandler.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/ProxyAuthenticationHandler.cs
deleted file mode 100644
index 4dca16e674..0000000000
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/ProxyAuthenticationHandler.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-//
-// ProxyAuthenticationHandler.cs
-//
-// Author:
-// Bojan Rajkovic <bojan.rajkovic@xamarin.com>
-// Michael Hutchinson <mhutch@xamarin.com>
-//
-// based on NuGet src/Core/Http
-//
-// Copyright (c) 2013-2014 Xamarin Inc.
-// Copyright (c) 2010-2014 Outercurve Foundation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-using System;
-using System.Linq;
-
-using Mono.Addins;
-using System.Net;
-
-namespace MonoDevelop.Core.Web
-{
- class ProxyAuthenticationHandler : IProxyAuthenticationHandler
- {
- const string WebCredentialProvidersPath = "/MonoDevelop/Core/WebCredentialProviders";
-
- public ProxyAuthenticationHandler ()
- {
- credentialStore = new CredentialStore ();
- proxyCache = new ProxyCache ();
- credentialProvider = AddinManager.GetExtensionObjects<ICredentialProvider> (WebCredentialProvidersPath).FirstOrDefault ();
-
- if (credentialProvider == null) {
- LoggingService.LogWarning ("No proxy credential provider was found");
- }
- }
-
- readonly ProxyCache proxyCache;
- readonly CredentialStore credentialStore;
- readonly ICredentialProvider credentialProvider;
-
- public void AddProxyToCache (IWebProxy proxy)
- {
- proxyCache.Add (proxy);
- }
-
- public IWebProxy GetCachedProxy (Uri uri)
- {
- return proxyCache.GetProxy (uri);
- }
-
- public void AddCredentialsToCache (Uri uri, ICredentials credentials, CredentialType credentialType)
- {
- credentialStore.Add (uri, credentials, credentialType);
- }
-
- public ICredentials GetCachedCredentials (Uri uri, CredentialType credentialType)
- {
- return credentialStore.GetCredentials (uri, credentialType);
- }
-
- public ICredentials GetCredentialsFromUser (Uri uri, IWebProxy proxy, CredentialType credentialType, ICredentials existingCredentials, bool retrying)
- {
- return credentialProvider.GetCredentials (uri, proxy, credentialType, existingCredentials, retrying);
- }
- }
-}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/ProxyCache.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/ProxyCache.cs
index bdd149d460..ddba33042a 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/ProxyCache.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/ProxyCache.cs
@@ -1,4 +1,21 @@
-using System;
+//
+// From NuGet src/Core
+//
+// Copyright (c) 2010-2014 Outercurve Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
using System.Collections.Concurrent;
using System.Net;
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/RequestHelper.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/RequestHelper.cs
new file mode 100644
index 0000000000..863a60beff
--- /dev/null
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/RequestHelper.cs
@@ -0,0 +1,358 @@
+//
+// From NuGet src/Core
+//
+// Copyright (c) 2010-2014 Outercurve Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.Net;
+using System.Collections.Specialized;
+using System.Threading;
+
+namespace MonoDevelop.Core.Web
+{
+ /// <summary>
+ /// This class is used to keep sending requests until a response code that doesn't require
+ /// authentication happens or if the request requires authentication and
+ /// the user has stopped trying to enter them (i.e. they hit cancel when they are prompted).
+ /// </summary>
+ class RequestHelper
+ {
+ private Func<HttpWebRequest> _createRequest;
+ private Action<HttpWebRequest> _prepareRequest;
+ private IProxyCache _proxyCache;
+ private ICredentialCache _credentialCache;
+ private ICredentialProvider _credentialProvider;
+
+ HttpWebRequest _previousRequest;
+ IHttpWebResponse _previousResponse;
+ HttpStatusCode? _previousStatusCode;
+ int _credentialsRetryCount;
+ bool _usingSTSAuth;
+ bool _continueIfFailed;
+ int _proxyCredentialsRetryCount;
+ bool _basicAuthIsUsedInPreviousRequest;
+
+ public RequestHelper(Func<HttpWebRequest> createRequest,
+ Action<HttpWebRequest> prepareRequest,
+ IProxyCache proxyCache,
+ ICredentialCache credentialCache,
+ ICredentialProvider credentialProvider)
+ {
+ _createRequest = createRequest;
+ _prepareRequest = prepareRequest;
+ _proxyCache = proxyCache;
+ _credentialCache = credentialCache;
+ _credentialProvider = credentialProvider;
+ }
+
+ static void MakeCancelable (HttpWebRequest request, CancellationToken token)
+ {
+ if (token.CanBeCanceled)
+ token.Register (request.Abort);
+ }
+
+ public HttpWebResponse GetResponse(CancellationToken token)
+ {
+ _previousRequest = null;
+ _previousResponse = null;
+ _previousStatusCode = null;
+ _usingSTSAuth = false;
+ _continueIfFailed = true;
+ _proxyCredentialsRetryCount = 0;
+ _credentialsRetryCount = 0;
+ int failureCount = 0;
+ const int MaxFailureCount = 10;
+
+ while (true)
+ {
+ // Create the request
+ var request = (HttpWebRequest)_createRequest();
+ MakeCancelable (request, token);
+ ConfigureRequest(request);
+
+ try
+ {
+ var auth = request.Headers["Authorization"];
+ _basicAuthIsUsedInPreviousRequest = (auth != null)
+ && auth.StartsWith("Basic ", StringComparison.Ordinal);
+
+ // Prepare the request, we do something like write to the request stream
+ // which needs to happen last before the request goes out
+ _prepareRequest(request);
+
+ HttpWebResponse response = (HttpWebResponse)request.GetResponse();
+
+ // Cache the proxy and credentials
+ _proxyCache.Add(request.Proxy);
+
+ ICredentials credentials = request.Credentials;
+ _credentialCache.Add(request.RequestUri, credentials);
+ _credentialCache.Add(response.ResponseUri, credentials);
+
+ return response;
+ }
+ catch (WebException ex)
+ {
+ ++failureCount;
+ if (failureCount >= MaxFailureCount)
+ {
+ throw;
+ }
+
+ using (IHttpWebResponse response = GetResponse(ex.Response))
+ {
+ if (response == null &&
+ ex.Status != WebExceptionStatus.SecureChannelFailure)
+ {
+ // No response, something went wrong so just rethrow
+ throw;
+ }
+
+ // Special case https connections that might require authentication
+ if (ex.Status == WebExceptionStatus.SecureChannelFailure)
+ {
+ if (_continueIfFailed)
+ {
+ // Act like we got a 401 so that we prompt for credentials on the next request
+ _previousStatusCode = HttpStatusCode.Unauthorized;
+ continue;
+ }
+ throw;
+ }
+
+ // If we were trying to authenticate the proxy or the request and succeeded, cache the result.
+ if (_previousStatusCode == HttpStatusCode.ProxyAuthenticationRequired &&
+ response.StatusCode != HttpStatusCode.ProxyAuthenticationRequired)
+ {
+ _proxyCache.Add(request.Proxy);
+ }
+ else if (_previousStatusCode == HttpStatusCode.Unauthorized &&
+ response.StatusCode != HttpStatusCode.Unauthorized)
+ {
+ _credentialCache.Add(request.RequestUri, request.Credentials);
+ _credentialCache.Add(response.ResponseUri, request.Credentials);
+ }
+
+ _usingSTSAuth = STSAuthHelper.TryRetrieveSTSToken(request.RequestUri, response);
+
+ if (!IsAuthenticationResponse(response) || !_continueIfFailed)
+ {
+ throw;
+ }
+
+ _previousRequest = request;
+ _previousResponse = response;
+ _previousStatusCode = _previousResponse.StatusCode;
+ }
+ }
+ }
+ }
+
+ private void ConfigureRequest(HttpWebRequest request)
+ {
+ request.Proxy = _proxyCache.GetProxy(request.RequestUri);
+ if (request.Proxy != null && request.Proxy.Credentials == null)
+ {
+ request.Proxy.Credentials = CredentialCache.DefaultCredentials;
+ }
+
+ if (_previousResponse == null || ShouldKeepAliveBeUsedInRequest(_previousRequest, _previousResponse))
+ {
+ // Try to use the cached credentials (if any, for the first request)
+ request.Credentials = _credentialCache.GetCredentials(request.RequestUri);
+
+ // If there are no cached credentials, use the default ones
+ if (request.Credentials == null)
+ {
+ request.UseDefaultCredentials = true;
+ }
+ }
+ else if (_previousStatusCode == HttpStatusCode.ProxyAuthenticationRequired)
+ {
+ request.Proxy.Credentials = _credentialProvider.GetCredentials(
+ request, CredentialType.ProxyCredentials, retrying: _proxyCredentialsRetryCount > 0);
+ _continueIfFailed = request.Proxy.Credentials != null;
+ _proxyCredentialsRetryCount++;
+ }
+ else if (_previousStatusCode == HttpStatusCode.Unauthorized)
+ {
+ SetCredentialsOnAuthorizationError(request);
+ }
+
+ SetKeepAliveHeaders(request, _previousResponse);
+ if (_usingSTSAuth)
+ {
+ // Add request headers if the server requires STS based auth.
+ STSAuthHelper.PrepareSTSRequest(request);
+ }
+
+ // Wrap the credentials in a CredentialCache in case there is a redirect
+ // and credentials need to be kept around.
+ request.Credentials = request.Credentials.AsCredentialCache(request.RequestUri);
+ }
+
+ private void SetCredentialsOnAuthorizationError(HttpWebRequest request)
+ {
+ if (_usingSTSAuth)
+ {
+ // If we are using STS, the auth's being performed by a request header.
+ // We do not need to ask the user for credentials at this point.
+ return;
+ }
+
+ bool basicAuth = _previousResponse.AuthType != null &&
+ _previousResponse.AuthType.IndexOf("Basic", StringComparison.OrdinalIgnoreCase) != -1;
+ if (basicAuth && !_basicAuthIsUsedInPreviousRequest)
+ {
+ // The basic auth credentials were not sent in the last request.
+ // We need to try with cached credentials in this request.
+ request.Credentials = _credentialCache.GetCredentials(request.RequestUri);
+ }
+
+ if (request.Credentials == null)
+ {
+ request.Credentials = _credentialProvider.GetCredentials(
+ request, CredentialType.RequestCredentials, retrying: _credentialsRetryCount > 0);
+ }
+
+ if (basicAuth)
+ {
+ // Add the Authorization header for basic authentication.
+ var networkCredentials = request.Credentials.GetCredential(request.RequestUri, "Basic");
+ if (networkCredentials != null)
+ {
+ string authInfo = networkCredentials.UserName + ":" + networkCredentials.Password;
+ authInfo = Convert.ToBase64String(System.Text.Encoding.Default.GetBytes(authInfo));
+ request.Headers["Authorization"] = "Basic " + authInfo;
+ }
+ }
+
+ _continueIfFailed = request.Credentials != null;
+ _credentialsRetryCount++;
+ }
+
+ private static IHttpWebResponse GetResponse(WebResponse response)
+ {
+ var httpWebResponse = response as IHttpWebResponse;
+ if (httpWebResponse == null)
+ {
+ var webResponse = response as HttpWebResponse;
+ if (webResponse == null)
+ {
+ return null;
+ }
+ return new HttpWebResponseWrapper(webResponse);
+ }
+
+ return httpWebResponse;
+ }
+
+ private static bool IsAuthenticationResponse(IHttpWebResponse response)
+ {
+ return response.StatusCode == HttpStatusCode.Unauthorized ||
+ response.StatusCode == HttpStatusCode.ProxyAuthenticationRequired;
+ }
+
+ private static void SetKeepAliveHeaders(HttpWebRequest request, IHttpWebResponse previousResponse)
+ {
+ // KeepAlive is required for NTLM and Kerberos authentication. If we've never been authenticated or are using a different auth, we
+ // should not require KeepAlive.
+ // REVIEW: The WWW-Authenticate header is tricky to parse so a Equals might not be correct.
+ if (previousResponse == null ||
+ !IsNtlmOrKerberos(previousResponse.AuthType))
+ {
+ // This is to work around the "The underlying connection was closed: An unexpected error occurred on a receive."
+ // exception.
+ request.KeepAlive = false;
+ request.ProtocolVersion = HttpVersion.Version10;
+ }
+ }
+
+ private static bool ShouldKeepAliveBeUsedInRequest(HttpWebRequest request, IHttpWebResponse response)
+ {
+ if (request == null)
+ {
+ throw new ArgumentNullException("request");
+ }
+
+ if (response == null)
+ {
+ throw new ArgumentNullException("response");
+ }
+
+ return !request.KeepAlive && IsNtlmOrKerberos(response.AuthType);
+ }
+
+ private static bool IsNtlmOrKerberos(string authType)
+ {
+ if (String.IsNullOrEmpty(authType))
+ {
+ return false;
+ }
+
+ return authType.IndexOf("NTLM", StringComparison.OrdinalIgnoreCase) != -1
+ || authType.IndexOf("Kerberos", StringComparison.OrdinalIgnoreCase) != -1;
+ }
+
+ private class HttpWebResponseWrapper : IHttpWebResponse
+ {
+ private readonly HttpWebResponse _response;
+ public HttpWebResponseWrapper(HttpWebResponse response)
+ {
+ _response = response;
+ }
+
+ public string AuthType
+ {
+ get
+ {
+ return _response.Headers[HttpResponseHeader.WwwAuthenticate];
+ }
+ }
+
+ public HttpStatusCode StatusCode
+ {
+ get
+ {
+ return _response.StatusCode;
+ }
+ }
+
+ public Uri ResponseUri
+ {
+ get
+ {
+ return _response.ResponseUri;
+ }
+ }
+
+ public NameValueCollection Headers
+ {
+ get
+ {
+ return _response.Headers;
+ }
+ }
+
+ public void Dispose()
+ {
+ if (_response != null)
+ {
+ _response.Close();
+ }
+ }
+ }
+ }
+}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/STSAuthHelper.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/STSAuthHelper.cs
new file mode 100644
index 0000000000..83dc43d972
--- /dev/null
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/STSAuthHelper.cs
@@ -0,0 +1,153 @@
+//
+// From NuGet src/Core
+//
+// Copyright (c) 2010-2014 Outercurve Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.Net;
+using System.Globalization;
+using System.ServiceModel;
+using System.ServiceModel.Security;
+using System.Text;
+
+namespace MonoDevelop.Core.Web
+{
+ static class STSAuthHelper
+ {
+ /// <summary>
+ /// Response header that specifies the WSTrust13 Windows Transport endpoint.
+ /// </summary>
+ /// <remarks>
+ /// TODO: Is there a way to discover this \ negotiate this endpoint?
+ /// </remarks>
+ private const string STSEndPointHeader = "X-MonoDevelop-STS-EndPoint";
+
+ /// <summary>
+ /// Response header that specifies the realm to authenticate for. In most cases this would be the gallery we are going up against.
+ /// </summary>
+ private const string STSRealmHeader = "X-MonoDevelop-STS-Realm";
+
+ /// <summary>
+ /// Request header that contains the SAML token.
+ /// </summary>
+ private const string STSTokenHeader = "X-MonoDevelop-STS-Token";
+
+ /// <summary>
+ /// Adds the SAML token as a header to the request if it is already cached for this host.
+ /// </summary>
+ public static void PrepareSTSRequest(WebRequest request)
+ {
+ string cacheKey = GetCacheKey(request.RequestUri);
+ string token;
+ if (MemoryCache.Instance.TryGetValue(cacheKey, out token))
+ {
+ request.Headers[STSTokenHeader] = EncodeHeader(token);
+ }
+ }
+
+ /// <summary>
+ /// Attempts to retrieve a SAML token if the response indicates that server requires STS-based auth.
+ /// </summary>
+ /// <param name="requestUri">The feed URI we were connecting to.</param>
+ /// <param name="response">The 401 response we receieved from the server.</param>
+ /// <returns>True if we were able to successfully retrieve a SAML token from the STS specified in the response headers.</returns>
+ public static bool TryRetrieveSTSToken(Uri requestUri, IHttpWebResponse response)
+ {
+ if (response.StatusCode != HttpStatusCode.Unauthorized)
+ {
+ // We only care to do STS auth if the server returned a 401
+ return false;
+ }
+
+ string endPoint = GetSTSEndPoint(response);
+ string realm = response.Headers[STSRealmHeader];
+ if (String.IsNullOrEmpty(endPoint) || String.IsNullOrEmpty(realm))
+ {
+ // The server does not conform to our STS-auth requirements.
+ return false;
+ }
+
+ string cacheKey = GetCacheKey(requestUri);
+
+ // TODO: We need to figure out a way to cache the token for the duration of the token's validity (which is available as part of it's result).
+ MemoryCache.Instance.GetOrAdd(cacheKey,
+ () => GetSTSToken(requestUri, endPoint, realm),
+ TimeSpan.FromMinutes(30),
+ absoluteExpiration: true);
+ return true;
+ }
+
+ private static string GetSTSToken(Uri requestUri, string endPoint, string appliesTo)
+ {
+ var typeProvider = WIFTypeProvider.GetWIFTypes();
+ if (typeProvider == null)
+ {
+ throw new InvalidOperationException (
+ String.Format (
+ CultureInfo.CurrentCulture,
+ "Connection to feed '{0}' requires the Windows Identity Foundation runtime to be installed.",
+ requestUri
+ )
+ );
+ }
+
+ var binding = new WS2007HttpBinding(SecurityMode.Transport);
+ dynamic factory = Activator.CreateInstance(typeProvider.ChannelFactory, binding, endPoint);
+ factory.TrustVersion = TrustVersion.WSTrust13;
+
+ // Check if we can create 4.5 types.
+ dynamic rst = Activator.CreateInstance(typeProvider.RequestSecurityToken);
+ rst.RequestType = GetFieldValue<string>(typeProvider.RequestTypes, "Issue");
+ rst.KeyType = GetFieldValue<string>(typeProvider.KeyTypes, "Bearer");
+
+ // Dynamic verifies the type of the instance so we cannot use it to assign a value for this property.
+ var endPointAddress = Activator.CreateInstance(typeProvider.EndPoint, appliesTo);
+ SetProperty(rst, "AppliesTo", endPointAddress);
+
+ dynamic channel = factory.CreateChannel();
+ dynamic securityToken = channel.Issue(rst);
+ return securityToken.TokenXml.OuterXml;
+ }
+
+ private static void SetProperty(object instance, string propertyName, object value)
+ {
+ var type = instance.GetType();
+ var property = type.GetProperty(propertyName);
+
+ var propertySetter = property.GetSetMethod();
+ propertySetter.Invoke(instance, new[] { value });
+ }
+
+ private static TVal GetFieldValue<TVal>(Type type, string fieldName)
+ {
+ return (TVal)type.GetField(fieldName).GetValue(obj: null);
+ }
+
+ private static string GetSTSEndPoint(IHttpWebResponse response)
+ {
+ return response.Headers[STSEndPointHeader].SafeTrim();
+ }
+
+ private static string GetCacheKey(Uri requestUri)
+ {
+ return STSTokenHeader + "|" + requestUri.GetComponents(UriComponents.SchemeAndServer, UriFormat.SafeUnescaped);
+ }
+
+ private static string EncodeHeader(string token)
+ {
+ return Convert.ToBase64String(Encoding.UTF8.GetBytes(token));
+ }
+ }
+}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/StringExtensions.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/StringExtensions.cs
new file mode 100644
index 0000000000..e7f892380d
--- /dev/null
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/StringExtensions.cs
@@ -0,0 +1,29 @@
+//
+// From NuGet src/Core
+//
+// Copyright (c) 2010-2014 Outercurve Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+
+namespace MonoDevelop.Core.Web
+{
+ static class StringExtensions
+ {
+ public static string SafeTrim(this string value)
+ {
+ return value == null ? null : value.Trim();
+ }
+ }
+}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/WIFTypeProvider.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/WIFTypeProvider.cs
new file mode 100644
index 0000000000..e3417894ac
--- /dev/null
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/WIFTypeProvider.cs
@@ -0,0 +1,163 @@
+//
+// From NuGet src/Core
+//
+// Copyright (c) 2010-2014 Outercurve Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+
+namespace MonoDevelop.Core.Web
+{
+ abstract class WIFTypeProvider
+ {
+ public abstract Type ChannelFactory { get; }
+
+ public abstract Type RequestSecurityToken { get; }
+
+ public abstract Type EndPoint { get; }
+
+ public abstract Type RequestTypes { get; }
+
+ public abstract Type KeyTypes { get; }
+
+ protected abstract string AssemblyName { get; }
+
+ public static WIFTypeProvider GetWIFTypes()
+ {
+ // First attempt to look up the 4.5 types
+ WIFTypeProvider wifProvider = new WIFTypes45();
+ if (wifProvider.ChannelFactory != null)
+ {
+ return wifProvider;
+ }
+
+ // We could be on 4.0 with the SDK \ WIF Runtime installed.
+ wifProvider = new WIFTypes40();
+ if (wifProvider.ChannelFactory != null)
+ {
+ return wifProvider;
+ }
+ return null;
+ }
+
+ protected string QualifyTypeName(string typeName)
+ {
+ return typeName + ',' + AssemblyName;
+ }
+
+ private sealed class WIFTypes40 : WIFTypeProvider
+ {
+ public override Type ChannelFactory
+ {
+ get
+ {
+ string typeName = QualifyTypeName("Microsoft.IdentityModel.Protocols.WSTrust.WSTrustChannelFactory");
+ return Type.GetType(typeName);
+ }
+ }
+
+ public override Type RequestSecurityToken
+ {
+ get
+ {
+ string typeName = QualifyTypeName("Microsoft.IdentityModel.Protocols.WSTrust.RequestSecurityToken");
+ return Type.GetType(typeName);
+ }
+ }
+
+ public override Type EndPoint
+ {
+ get
+ {
+ return typeof(System.ServiceModel.EndpointAddress);
+ }
+ }
+
+ public override Type RequestTypes
+ {
+ get
+ {
+ string typeName = QualifyTypeName("Microsoft.IdentityModel.SecurityTokenService.RequestTypes");
+ return Type.GetType(typeName);
+ }
+ }
+
+ public override Type KeyTypes
+ {
+ get
+ {
+ string typeName = QualifyTypeName("Microsoft.IdentityModel.SecurityTokenService.KeyTypes");
+ return Type.GetType(typeName);
+ }
+ }
+
+ protected override string AssemblyName
+ {
+ get { return "Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; }
+ }
+ }
+
+ private sealed class WIFTypes45 : WIFTypeProvider
+ {
+ public override Type ChannelFactory
+ {
+ get
+ {
+ return Type.GetType("System.ServiceModel.Security.WSTrustChannelFactory, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
+ }
+ }
+
+ public override Type RequestSecurityToken
+ {
+ get
+ {
+ string typeName = QualifyTypeName("System.IdentityModel.Protocols.WSTrust.RequestSecurityToken");
+ return Type.GetType(typeName);
+ }
+ }
+
+ public override Type EndPoint
+ {
+ get
+ {
+ string typeName = QualifyTypeName("System.IdentityModel.Protocols.WSTrust.EndpointReference");
+ return Type.GetType(typeName);
+ }
+ }
+
+ public override Type RequestTypes
+ {
+ get
+ {
+ string typeName = QualifyTypeName("System.IdentityModel.Protocols.WSTrust.RequestTypes");
+ return Type.GetType(typeName);
+ }
+ }
+
+ public override Type KeyTypes
+ {
+ get
+ {
+ string typeName = QualifyTypeName("System.IdentityModel.Protocols.WSTrust.KeyTypes");
+ return Type.GetType(typeName);
+ }
+ }
+
+ protected override string AssemblyName
+ {
+ get { return "System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; }
+ }
+ }
+ }
+}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/WebService.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/WebService.cs
deleted file mode 100644
index 995da844ea..0000000000
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Web/WebService.cs
+++ /dev/null
@@ -1,105 +0,0 @@
-//
-// WebService.cs
-//
-// Author:
-// Bojan Rajkovic <bojan.rajkovic@xamarin.com>
-//
-// Copyright (c) 2013 Xamarin Inc.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-using System;
-using System.Linq;
-
-using Mono.Addins;
-using System.Net;
-
-namespace MonoDevelop.Core.Web
-{
- [Obsolete ("Use WebRequestHelper.ProxyAuthenticationHandler")]
- public static class WebService
- {
- static IProxyCache proxyCache = new ForwardingProxyCache ();
- static ICredentialCache credentialCache = new ForwardingCredentialCache ();
- static ICredentialProvider credentialProvider = new ForwardingCredentialProvider ();
-
- public static IProxyCache ProxyCache { get { return proxyCache; } }
- public static ICredentialCache CredentialCache { get { return credentialCache; } }
- public static ICredentialProvider CredentialProvider { get { return credentialProvider; } }
-
- class ForwardingCredentialProvider : ICredentialProvider
- {
- public ICredentials GetCredentials (
- Uri uri, IWebProxy proxy, CredentialType credentialType, ICredentials existingCredentials, bool retrying)
- {
- var pah = WebRequestHelper.ProxyAuthenticationHandler;
- return pah != null ? pah.GetCredentialsFromUser (uri, proxy, credentialType, existingCredentials, retrying) : null;
- }
- }
-
- class ForwardingProxyCache : IProxyCache
- {
- public void Add (IWebProxy proxy)
- {
- var pah = WebRequestHelper.ProxyAuthenticationHandler;
- if (pah != null)
- pah.AddProxyToCache (proxy);
- }
-
- public IWebProxy GetProxy (Uri uri)
- {
- var pah = WebRequestHelper.ProxyAuthenticationHandler;
- return pah != null ? pah.GetCachedProxy (uri) : null;
- }
- }
-
- class ForwardingCredentialCache : ICredentialCache
- {
- public void Add (Uri uri, ICredentials credentials, CredentialType credentialType)
- {
- var pah = WebRequestHelper.ProxyAuthenticationHandler;
- if (pah != null)
- pah.AddCredentialsToCache (uri, credentials, credentialType);
- }
-
- public ICredentials GetCredentials (Uri uri, CredentialType credentialType)
- {
- var pah = WebRequestHelper.ProxyAuthenticationHandler;
- return pah != null ? pah.GetCachedCredentials (uri, credentialType) : null;
- }
- }
- }
-
- [Obsolete ("Use WebRequestHelper.ProxyAuthenticationHandler")]
- public interface IProxyCache
- {
- void Add (IWebProxy proxy);
-
- IWebProxy GetProxy (Uri uri);
- }
-
- [Obsolete ("Use WebRequestHelper.ProxyAuthenticationHandler")]
- public interface ICredentialCache
- {
- void Add (Uri uri, ICredentials credentials, CredentialType credentialType);
-
- ICredentials GetCredentials (Uri uri, CredentialType credentialType);
- }
-}
-
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.addin.xml b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.addin.xml
index 593459fe7c..ccab54f5a6 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.addin.xml
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.addin.xml
@@ -316,6 +316,7 @@
<ProjectType guid = "{4925A630-B079-445d-BCD4-3A9C94FE9307}" name = "F#" extension="fsproj" addin = "F#" />
<ProjectType guid = "{F2A71F9B-5D33-465A-A702-920D77279786}" name = "F#" extension="fsproj" addin = "F#" />
<ProjectType guid = "{C089C8C0-30E0-4E22-80C0-CE093F111A43}" name = "Windows Phone" />
+ <ProjectType guid = "{76F1466A-8B6D-4E39-A767-685A06062A39}" name = "Windows Phone" />
<ProjectType guid = "{E24C65DC-7377-472B-9ABA-BC803B73C61A}" name = "ASP.NET Web Site" />
<ProjectType guid = "{F135691A-BF7E-435D-8960-F99683D2D49C}" name = "MS Distributed System" loadFiles="False" />
<ProjectType guid = "{3D9AD99F-2412-4246-B90B-4EAA41C64699}" name = "Windows Communication Foundation (WCF)" />
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.csproj b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.csproj
index b53cb64600..493cb4bd7f 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.csproj
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.csproj
@@ -85,6 +85,8 @@
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Web" />
+ <Reference Include="System.ServiceModel" />
+ <Reference Include="Microsoft.CSharp" />
</ItemGroup>
<ItemGroup>
<Compile Include="MonoDevelop.Core\StringParserService.cs" />
@@ -442,7 +444,6 @@
<Compile Include="MonoDevelop.Core.Execution\DotNetCommandFactory.cs" />
<Compile Include="BuildVariables.cs" />
<Compile Include="AddinInfo.cs" />
- <Compile Include="MonoDevelop.Core.Web\ICredentialProvider.cs" />
<Compile Include="MonoDevelop.Core.Logging\AssertLoggingTraceListener.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MD1\MD1ProjectService.cs" />
<Compile Include="MonoDevelop.Projects\UnknownProject.cs" />
@@ -452,14 +453,22 @@
<Compile Include="MonoDevelop.Projects.SharedAssetsProjects\SharedAssetsProjectMSBuildHandler.cs" />
<Compile Include="MonoDevelop.Projects.SharedAssetsProjects\SharedAssetsProjectBinding.cs" />
<Compile Include="MonoDevelop.Core\WebRequestHelper.cs" />
- <Compile Include="MonoDevelop.Core.Web\CredentialsUtility.cs" />
<Compile Include="MonoDevelop.Core.Web\IProxyAuthenticationHandler.cs" />
- <Compile Include="MonoDevelop.Core.Web\CredentialType.cs" />
<Compile Include="MonoDevelop.Core.Web\CredentialStore.cs" />
- <Compile Include="MonoDevelop.Core.Web\ProxyAuthenticationHandler.cs" />
- <Compile Include="MonoDevelop.Core.Web\WebService.cs" />
- <Compile Include="MonoDevelop.Core.Web\MonoAddinsProxyWrapper.cs" />
+ <Compile Include="MonoDevelop.Core.Web\CredentialType.cs" />
+ <Compile Include="MonoDevelop.Core.Web\ICredentialCache.cs" />
+ <Compile Include="MonoDevelop.Core.Web\ICredentialProvider.cs" />
+ <Compile Include="MonoDevelop.Core.Web\IHttpWebResponse.cs" />
+ <Compile Include="MonoDevelop.Core.Web\IProxyCache.cs" />
+ <Compile Include="MonoDevelop.Core.Web\MemoryCache.cs" />
+ <Compile Include="MonoDevelop.Core.Web\NullCredentialProvider.cs" />
<Compile Include="MonoDevelop.Core.Web\ProxyCache.cs" />
+ <Compile Include="MonoDevelop.Core.Web\RequestHelper.cs" />
+ <Compile Include="MonoDevelop.Core.Web\StringExtensions.cs" />
+ <Compile Include="MonoDevelop.Core.Web\STSAuthHelper.cs" />
+ <Compile Include="MonoDevelop.Core.Web\WIFTypeProvider.cs" />
+ <Compile Include="MonoDevelop.Core.Web\CredentialProviderExtensions.cs" />
+ <Compile Include="MonoDevelop.Core.Execution\IDebugConsole.cs" />
</ItemGroup>
<ItemGroup>
<None Include="Makefile.am" />
@@ -558,7 +567,6 @@
</Content>
</ItemGroup>
<ItemGroup>
- <Folder Include="MonoDevelop.Core.Web\" />
<Folder Include="MonoDevelop.Projects.SharedAssetsProjects\" />
</ItemGroup>
<Target Name="BeforeBuild" Inputs="BuildVariables.cs.in; $(MSBuildProjectDirectory)\..\..\..\..\version.config" Outputs="BuildVariables.cs">
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core/FileService.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core/FileService.cs
index d5582c00b0..044704ec37 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core/FileService.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core/FileService.cs
@@ -463,7 +463,7 @@ namespace MonoDevelop.Core
public static bool IsDirectory (string filename)
{
- return Directory.Exists (filename) && (File.GetAttributes (filename) & FileAttributes.Directory) != 0;
+ return Directory.Exists (filename);
}
public static string GetFullPath (string path)
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core/LoggingService.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core/LoggingService.cs
index 85851dd004..1bcbd46c3e 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core/LoggingService.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core/LoggingService.cs
@@ -198,13 +198,14 @@ namespace MonoDevelop.Core
internal static void ReportUnhandledException (Exception ex, bool willShutDown, bool silently, string tag)
{
- var tags = new List<string> { tag };
+ try {
+ var tags = new List<string> { tag };
- if (reporting)
- return;
+ if (reporting)
+ return;
+
+ reporting = true;
- reporting = true;
- try {
var oldReportCrashes = ReportCrashes;
if (UnhandledErrorOccured != null && !silently)
@@ -221,7 +222,12 @@ namespace MonoDevelop.Core
#if ENABLE_RAYGUN
if (raygunClient != null) {
ThreadPool.QueueUserWorkItem (delegate {
- raygunClient.Send (ex, tags, customData, Runtime.Version.ToString ());
+ try {
+ raygunClient.Send (ex, tags, customData, Runtime.Version.ToString ());
+ } catch {
+ // If we get here then things have gone really wrong - we can't log anything or
+ // attempt to report anything. Drop any exception that ends up here.
+ }
});
}
#endif
@@ -231,6 +237,10 @@ namespace MonoDevelop.Core
PropertyService.SaveProperties ();
}
+ } catch {
+ // I don't know if we can/should try to log this. I'm going to guess that we don't want to
+ // and can't safely call any LoggingService.Log methods anyway in case we'd recurse, though
+ // the 'reporting' boolean should take care of that.
} finally {
reporting = false;
}
@@ -271,19 +281,22 @@ namespace MonoDevelop.Core
}
}
+ static MonoDevelop.Core.ProgressMonitoring.LogTextWriter stderr;
+ static MonoDevelop.Core.ProgressMonitoring.LogTextWriter stdout;
+ static TextWriter writer;
static void RedirectOutputToFileWindows ()
{
- var writer = CreateLogFile ("Ide");
+ writer = CreateLogFile ("Ide");
if (writer == Console.Out)
return;
- var stderr = new MonoDevelop.Core.ProgressMonitoring.LogTextWriter ();
+ stderr = new MonoDevelop.Core.ProgressMonitoring.LogTextWriter ();
stderr.ChainWriter (Console.Error);
stderr.ChainWriter (writer);
defaultError = Console.Error;
Console.SetError (stderr);
- var stdout = new MonoDevelop.Core.ProgressMonitoring.LogTextWriter ();
+ stdout = new MonoDevelop.Core.ProgressMonitoring.LogTextWriter ();
stdout.ChainWriter (Console.Out);
stdout.ChainWriter (writer);
defaultOut = Console.Out;
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core/MacSystemInformation.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core/MacSystemInformation.cs
index 3ef2206863..90db5cae46 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core/MacSystemInformation.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core/MacSystemInformation.cs
@@ -30,6 +30,7 @@ namespace MonoDevelop.Core
{
public class MacSystemInformation : UnixSystemInformation
{
+ public static readonly Version Mavericks = new Version (10, 9);
public static readonly Version MountainLion = new Version (10, 8);
public static readonly Version Lion = new Version (10, 7);
public static readonly Version SnowLeopard = new Version (10, 6);
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core/Runtime.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core/Runtime.cs
index 613acf997b..653f215e61 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core/Runtime.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core/Runtime.cs
@@ -114,8 +114,8 @@ namespace MonoDevelop.Core
PropertyService.Initialize ();
- WebRequestHelper.ProxyAuthenticationHandler = new ProxyAuthenticationHandler ();
- Mono.Addins.Setup.WebRequestHelper.ProxyAuthenticationHandler = new MonoAddinsProxyHandler ();
+ WebRequestHelper.Initialize ();
+ Mono.Addins.Setup.WebRequestHelper.SetRequestHandler (WebRequestHelper.GetResponse);
//have to do this after the addin service and property service have initialized
if (UserDataMigrationService.HasSource) {
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core/WebRequestHelper.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core/WebRequestHelper.cs
index 4805266b94..0fa710e677 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core/WebRequestHelper.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core/WebRequestHelper.cs
@@ -24,11 +24,12 @@
//
using System;
-using System.Collections.Specialized;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using MonoDevelop.Core.Web;
+using Mono.Addins;
+using System.Linq;
namespace MonoDevelop.Core
{
@@ -37,6 +38,27 @@ namespace MonoDevelop.Core
/// </summary>
public static class WebRequestHelper
{
+ const string WebCredentialProvidersPath = "/MonoDevelop/Core/WebCredentialProviders";
+
+ static ProxyCache proxyCache;
+ static ICredentialProvider credentialProvider;
+
+ internal static void Initialize ()
+ {
+ proxyCache = new ProxyCache ();
+ credentialProvider = AddinManager.GetExtensionObjects<ICredentialProvider> (WebCredentialProvidersPath).FirstOrDefault ();
+
+ if (credentialProvider != null) {
+ credentialProvider = new CachingCredentialProvider (credentialProvider);
+ } else {
+ LoggingService.LogWarning ("No proxy credential provider was found");
+ credentialProvider = new NullCredentialProvider ();
+ }
+ }
+
+ public static ICredentialProvider CredentialProvider { get { return credentialProvider; } }
+
+ [Obsolete]
public static IProxyAuthenticationHandler ProxyAuthenticationHandler { get; internal set; }
/// <summary>
@@ -77,244 +99,22 @@ namespace MonoDevelop.Core
Action<HttpWebRequest> prepareRequest = null,
CancellationToken token = default(CancellationToken))
{
- var provider = ProxyAuthenticationHandler;
- if (provider == null) {
- var rq = createRequest ();
- if (prepareRequest != null)
- prepareRequest (rq);
- return (HttpWebResponse) rq.GetResponse ();
+ if (prepareRequest == null) {
+ prepareRequest = r => {};
}
- HttpWebRequest previousRequest = null;
- IHttpWebResponse previousResponse = null;
- HttpStatusCode? previousStatusCode = null;
- var continueIfFailed = true;
- int proxyCredentialsRetryCount = 0, credentialsRetryCount = 0;
-
- HttpWebRequest request = null;
-
- if (token.CanBeCanceled) {
- token.Register (() => {
- var r = request;
- if (r != null)
- r.Abort ();
- });
+ if (credentialProvider == null) {
+ var req = createRequest ();
+ req.MakeCancelable (token);
+ prepareRequest (req);
+ return (HttpWebResponse) req.GetResponse ();
}
- while (true) {
- // Create the request
- // NOTE: .NET blocks on DNS here, see http://stackoverflow.com/questions/1232139#1232930
- request = createRequest ();
- request.Proxy = provider.GetCachedProxy (request.RequestUri);
-
- if (token.IsCancellationRequested) {
- request.Abort ();
- throw new OperationCanceledException (token);
- }
-
- if (request.Proxy != null && request.Proxy.Credentials == null && request.Proxy is WebProxy) {
- var proxyAddress = ((WebProxy)request.Proxy).Address;
- request.Proxy.Credentials = provider.GetCachedCredentials (proxyAddress, CredentialType.ProxyCredentials) ??
- CredentialCache.DefaultCredentials;
- }
-
- var retrying = proxyCredentialsRetryCount > 0;
- ICredentials oldCredentials;
- if (!previousStatusCode.HasValue && (previousResponse == null || ShouldKeepAliveBeUsedInRequest (previousRequest, previousResponse))) {
- // Try to use the cached credentials (if any, for the first request)
- request.Credentials = provider.GetCachedCredentials (request.RequestUri, CredentialType.RequestCredentials);
-
- // If there are no cached credentials, use the default ones
- if (request.Credentials == null)
- request.UseDefaultCredentials = true;
- } else if (previousStatusCode == HttpStatusCode.ProxyAuthenticationRequired) {
- oldCredentials = previousRequest != null && previousRequest.Proxy != null ? previousRequest.Proxy.Credentials : null;
- request.Proxy.Credentials = provider.GetCredentialsFromUser (request.RequestUri, request.Proxy, CredentialType.ProxyCredentials, oldCredentials, retrying);
- continueIfFailed = request.Proxy.Credentials != null;
- proxyCredentialsRetryCount++;
- } else if (previousStatusCode == HttpStatusCode.Unauthorized) {
- oldCredentials = previousRequest != null ? previousRequest.Credentials : null;
- request.Credentials = provider.GetCredentialsFromUser (request.RequestUri, request.Proxy, CredentialType.RequestCredentials, oldCredentials, retrying);
- continueIfFailed = request.Credentials != null;
- credentialsRetryCount++;
- }
-
- try {
- ICredentials credentials = request.Credentials;
-
- SetKeepAliveHeaders (request, previousResponse);
-
- // Wrap the credentials in a CredentialCache in case there is a redirect
- // and credentials need to be kept around.
- request.Credentials = AsCredentialCache (request.Credentials, request.RequestUri);
-
- // Prepare the request, we do something like write to the request stream
- // which needs to happen last before the request goes out
- if (prepareRequest != null)
- prepareRequest (request);
- var response = (HttpWebResponse) request.GetResponse ();
-
- // Cache the proxy and credentials
- if (request.Proxy != null) {
- provider.AddProxyToCache (request.Proxy);
- if (request.Proxy is WebProxy)
- provider.AddCredentialsToCache (((WebProxy)request.Proxy).Address, request.Proxy.Credentials, CredentialType.ProxyCredentials);
- }
-
- provider.AddCredentialsToCache (request.RequestUri, credentials, CredentialType.RequestCredentials);
- provider.AddCredentialsToCache (response.ResponseUri, credentials, CredentialType.RequestCredentials);
-
- return response;
- } catch (WebException ex) {
- if (ex.Status == WebExceptionStatus.RequestCanceled)
- token.ThrowIfCancellationRequested ();
-
- using (var response = GetResponse ((HttpWebResponse)ex.Response)) {
- if (response == null && ex.Status != WebExceptionStatus.SecureChannelFailure) {
- // No response, something went wrong so just rethrow
- throw;
- }
-
- // Special case https connections that might require authentication
- if (ex.Status == WebExceptionStatus.SecureChannelFailure) {
- if (continueIfFailed) {
- if (ex.Message.Contains ("407"))
- previousStatusCode = HttpStatusCode.ProxyAuthenticationRequired;
- else if (ex.Message.Contains ("401"))
- previousStatusCode = HttpStatusCode.Unauthorized;
- else
- previousStatusCode = null;
- continue;
- }
-
- throw;
- }
-
- // If we were trying to authenticate the proxy or the request and succeeded, cache the result.
- if (previousStatusCode == HttpStatusCode.ProxyAuthenticationRequired && response.StatusCode != HttpStatusCode.ProxyAuthenticationRequired) {
- provider.AddProxyToCache (request.Proxy);
- provider.AddCredentialsToCache (((WebProxy)request.Proxy).Address, request.Proxy.Credentials, CredentialType.ProxyCredentials);
- } else if (previousStatusCode == HttpStatusCode.Unauthorized && response.StatusCode != HttpStatusCode.Unauthorized) {
- provider.AddCredentialsToCache (request.RequestUri, request.Credentials, CredentialType.RequestCredentials);
- provider.AddCredentialsToCache (response.ResponseUri, request.Credentials, CredentialType.RequestCredentials);
- }
-
- if (!IsAuthenticationResponse (response) || !continueIfFailed)
- throw;
-
- previousRequest = request;
- previousResponse = response;
- previousStatusCode = previousResponse.StatusCode;
- }
- }
- }
- }
-
- static IHttpWebResponse GetResponse (HttpWebResponse response)
- {
- if (response == null)
- return null;
-
- var httpWebResponse = response as IHttpWebResponse;
- if (httpWebResponse != null)
- return httpWebResponse;
-
- return new HttpWebResponseWrapper (response);
- }
-
- static bool IsAuthenticationResponse (IHttpWebResponse response)
- {
- return response != null && (
- response.StatusCode == HttpStatusCode.Unauthorized ||
- response.StatusCode == HttpStatusCode.ProxyAuthenticationRequired
+ var handler = new RequestHelper (
+ createRequest, prepareRequest, proxyCache, CredentialStore.Instance, credentialProvider
);
- }
-
- static void SetKeepAliveHeaders (HttpWebRequest request, IHttpWebResponse previousResponse)
- {
- // KeepAlive is required for NTLM and Kerberos authentication. If we've never been authenticated or are
- // using a different auth, we should not require KeepAlive.
- // REVIEW: The WWW-Authenticate header is tricky to parse so a Equals might not be correct.
- if (previousResponse != null && IsNtlmOrKerberos (previousResponse.AuthType))
- return;
- // This is to work around the "The underlying connection was closed: An unexpected error occurred on a receive." exception.
- request.KeepAlive = false;
- request.ProtocolVersion = HttpVersion.Version10;
- }
-
- static bool ShouldKeepAliveBeUsedInRequest (HttpWebRequest request, IHttpWebResponse response)
- {
- if (request == null)
- throw new ArgumentNullException ("request");
-
- if (response == null)
- throw new ArgumentNullException ("response");
-
- return !request.KeepAlive && IsNtlmOrKerberos (response.AuthType);
- }
-
- static bool IsNtlmOrKerberos (string authType)
- {
- if (String.IsNullOrEmpty (authType)) {
- return false;
- }
-
- return authType.IndexOf ("NTLM", StringComparison.OrdinalIgnoreCase) != -1
- || authType.IndexOf ("Kerberos", StringComparison.OrdinalIgnoreCase) != -1;
- }
-
- // For unit testing
- interface IHttpWebResponse : IDisposable
- {
- HttpStatusCode StatusCode { get; }
-
- Uri ResponseUri { get; }
-
- string AuthType { get; }
-
- NameValueCollection Headers { get; }
- }
-
- class HttpWebResponseWrapper : IHttpWebResponse
- {
- readonly HttpWebResponse response;
-
- public HttpWebResponseWrapper (HttpWebResponse response)
- {
- this.response = response;
- }
-
- public string AuthType {
- get {
- return response.Headers [HttpResponseHeader.WwwAuthenticate];
- }
- }
-
- public HttpStatusCode StatusCode {
- get {
- return response.StatusCode;
- }
- }
-
- public Uri ResponseUri {
- get {
- return response.ResponseUri;
- }
- }
-
- public NameValueCollection Headers {
- get {
- return response.Headers;
- }
- }
-
- public void Dispose ()
- {
- if (response != null) {
- response.Close ();
- }
- }
+ return handler.GetResponse (token);
}
/// <summary>
@@ -335,30 +135,62 @@ namespace MonoDevelop.Core
}
}
- static readonly string[] AuthenticationSchemes = { "Basic", "NTLM", "Negotiate" };
+ static void MakeCancelable (this HttpWebRequest request, CancellationToken token)
+ {
+ if (!token.CanBeCanceled)
+ return;
+ token.Register (() => {
+ var r = request;
+ if (r != null)
+ r.Abort ();
+ });
+ }
- static ICredentials AsCredentialCache (ICredentials credentials, Uri uri)
+ // RequestHelper doesn't cache proxy credentials, only request credentials. We'll cache proxy credentials
+ // to avoid propting auth for the system store multiple times.
+ //
+ // We implement caching here so we can use the same store without making it public
+ // and so that the providers don't have to implement caching too.
+ class CachingCredentialProvider : ICredentialProvider
{
- // No credentials then bail
- if (credentials == null)
- return null;
+ readonly ICredentialProvider wrapped;
+ readonly object locker = new object ();
+
+ public CachingCredentialProvider (ICredentialProvider wrapped)
+ {
+ this.wrapped = wrapped;
+ }
+
+ public ICredentials GetCredentials (Uri uri, IWebProxy proxy, CredentialType credentialType, bool retrying)
+ {
+ if (credentialType != CredentialType.ProxyCredentials)
+ return wrapped.GetCredentials (uri, proxy, credentialType, retrying);
+
+ var proxyUri = proxy.GetProxy (uri);
+ if (proxyUri == null)
+ return null;
- // Do nothing with default credentials
- if (credentials == CredentialCache.DefaultCredentials || credentials == CredentialCache.DefaultNetworkCredentials)
- return credentials;
+ if (!retrying) {
+ var cached = CredentialStore.Instance.GetCredentials (proxyUri);
+ if (cached != null)
+ return cached;
+ }
- // If this isn't a NetworkCredential then leave it alone
- var networkCredentials = credentials as NetworkCredential;
- if (networkCredentials == null)
- return credentials;
+ lock (locker) {
+ if (!retrying) {
+ var cached = CredentialStore.Instance.GetCredentials (proxyUri);
+ if (cached != null)
+ return cached;
+ }
- // Set this up for each authentication scheme we support
- // The reason we're using a credential cache is so that the HttpWebRequest will forward our
- // credentials if there happened to be any redirects in the chain of requests.
- var cache = new CredentialCache ();
- foreach (var scheme in AuthenticationSchemes)
- cache.Add (uri, scheme, networkCredentials);
- return cache;
+ var creds = wrapped.GetCredentials (uri, proxy, credentialType, retrying);
+
+ if (creds != null)
+ CredentialStore.Instance.Add (proxyUri, creds);
+
+ return creds;
+ }
+ }
}
}
}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProject.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProject.cs
index e0b213cfbe..0589449a84 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProject.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProject.cs
@@ -778,6 +778,11 @@ namespace MonoDevelop.Projects.Formats.MSBuild
set { Element.SetAttribute ("Include", value); }
}
+ public string UnevaluatedInclude {
+ get { return Element.GetAttribute ("Include"); }
+ set { Element.SetAttribute ("Include", value); }
+ }
+
public string Name {
get { return Element.Name; }
}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectHandler.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectHandler.cs
index cabee1e34b..5b7e75a11a 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectHandler.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectHandler.cs
@@ -358,6 +358,11 @@ namespace MonoDevelop.Projects.Formats.MSBuild
if (itemGuid == null)
throw new UserException ("Project file doesn't have a valid ProjectGuid");
+ // Workaround for a VS issue. VS doesn't include the curly braces in the ProjectGuid
+ // of shared projects.
+ if (!itemGuid.StartsWith ("{") && fileName.EndsWith (".shproj"))
+ itemGuid = "{" + itemGuid + "}";
+
itemGuid = itemGuid.ToUpper ();
string projectTypeGuids = globalGroup.GetPropertyValue ("ProjectTypeGuids");
string itemType = globalGroup.GetPropertyValue ("ItemType");
@@ -376,6 +381,11 @@ namespace MonoDevelop.Projects.Formats.MSBuild
ProjectExtensionUtil.BeginLoadOperation ();
Item = CreateSolutionItem (monitor, p, fileName, language, itemType, itemClass);
+ if (subtypeGuids.Any ()) {
+ string gg = string.Join (";", subtypeGuids) + ";" + TypeGuid;
+ Item.ExtendedProperties ["ProjectTypeGuids"] = gg.ToUpper ();
+ }
+
Item.SetItemHandler (this);
MSBuildProjectService.SetId (Item, itemGuid);
@@ -982,6 +992,11 @@ namespace MonoDevelop.Projects.Formats.MSBuild
return ReadProjectFile (ser, project, buildItem, typeof(ProjectFile));
}
}
+
+ // ProjectReference objects only make sense on a DotNetProject, so don't load them
+ // if that's not the type of the project.
+ if (dt != null && dt.ValueType == typeof(ProjectReference) && dotNetProject == null)
+ dt = null;
if (dt != null && typeof(ProjectItem).IsAssignableFrom (dt.ValueType)) {
ProjectItem obj = (ProjectItem) Activator.CreateInstance (dt.ValueType);
@@ -1146,9 +1161,11 @@ namespace MonoDevelop.Projects.Formats.MSBuild
}
gg += ";" + TypeGuid;
Item.ExtendedProperties ["ProjectTypeGuids"] = gg.ToUpper ();
- }
- else
+ globalGroup.SetPropertyValue ("ProjectTypeGuids", gg.ToUpper (), true);
+ } else {
Item.ExtendedProperties.Remove ("ProjectTypeGuids");
+ globalGroup.RemoveProperty ("ProjectTypeGuids");
+ }
Item.ExtendedProperties ["ProductVersion"] = productVersion;
Item.ExtendedProperties ["SchemaVersion"] = schemaVersion;
@@ -1332,7 +1349,7 @@ namespace MonoDevelop.Projects.Formats.MSBuild
// Remove old items
Dictionary<string, ItemInfo> oldItems = new Dictionary<string, ItemInfo> ();
foreach (MSBuildItem item in msproject.GetAllItems ())
- oldItems [item.Name + "<" + item.Include + "<" + item.Condition] = new ItemInfo () {
+ oldItems [item.Name + "<" + item.UnevaluatedInclude + "<" + item.Condition] = new ItemInfo () {
Item = item
};
// Add the new items
@@ -1430,14 +1447,17 @@ namespace MonoDevelop.Projects.Formats.MSBuild
}
else {
string itemName;
- if (ob is UnknownProjectItem)
- itemName = ((UnknownProjectItem)ob).ItemName;
+ if (ob is UnknownProjectItem) {
+ var ui = (UnknownProjectItem)ob;
+ itemName = ui.ItemName;
+ var buildItem = AddOrGetBuildItem (msproject, oldItems, itemName, ui.Include, ui.Condition);
+ WriteBuildItemMetadata (ser, buildItem, ob, oldItems);
+ }
else {
DataType dt = ser.DataContext.GetConfigurationDataType (ob.GetType ());
- itemName = dt.Name;
+ var buildItem = msproject.AddNewItem (dt.Name, "");
+ WriteBuildItemMetadata (ser, buildItem, ob, oldItems);
}
- MSBuildItem buildItem = msproject.AddNewItem (itemName, "");
- WriteBuildItemMetadata (ser, buildItem, ob, oldItems);
}
}
@@ -1482,7 +1502,7 @@ namespace MonoDevelop.Projects.Formats.MSBuild
buildItem.UnsetMetadata ("LastGenOutput");
if (!string.IsNullOrEmpty (file.Link))
- buildItem.SetMetadata ("Link", pathPrefix + MSBuildProjectService.ToMSBuildPathRelative (Item.ItemDirectory, file.Link));
+ buildItem.SetMetadata ("Link", MSBuildProjectService.ToMSBuildPathRelative (Item.ItemDirectory, file.Link));
else
buildItem.UnsetMetadata ("Link");
@@ -1499,11 +1519,17 @@ namespace MonoDevelop.Projects.Formats.MSBuild
} else {
buildItem.UnsetMetadata ("Visible");
}
-
- if (file.BuildAction == BuildAction.EmbeddedResource) {
- //Emit LogicalName only when it does not match the default Id
- if (GetDefaultResourceId (file) != file.ResourceId)
- buildItem.SetMetadata ("LogicalName", file.ResourceId);
+
+ var resId = file.ResourceId;
+
+ //For EmbeddedResource, emit LogicalName only when it does not match the default Id
+ if (file.BuildAction == BuildAction.EmbeddedResource && GetDefaultResourceId (file) == resId)
+ resId = null;
+
+ if (!string.IsNullOrEmpty (resId)) {
+ buildItem.SetMetadata ("LogicalName", resId);
+ } else {
+ buildItem.UnsetMetadata ("LogicalName");
}
}
@@ -1951,7 +1977,7 @@ namespace MonoDevelop.Projects.Formats.MSBuild
}
static readonly MSBuildElementOrder globalConfigOrder = new MSBuildElementOrder (
- "Configuration","Platform","ProductVersion","SchemaVersion","ProjectGuid","ProjectTypeGuids", "OutputType",
+ "Configuration","Platform","ProductVersion","SchemaVersion","ProjectGuid", "OutputType",
"AppDesignerFolder","RootNamespace","AssemblyName","StartupObject"
);
static readonly MSBuildElementOrder configOrder = new MSBuildElementOrder (
@@ -1965,7 +1991,6 @@ namespace MonoDevelop.Projects.Formats.MSBuild
new ItemMember (typeof(SolutionEntityItem), "ProductVersion"),
new ItemMember (typeof(SolutionEntityItem), "SchemaVersion"),
new ItemMember (typeof(SolutionEntityItem), "ProjectGuid"),
- new ItemMember (typeof(SolutionEntityItem), "ProjectTypeGuids"),
new ItemMember (typeof(DotNetProjectConfiguration), "ErrorReport"),
new ItemMember (typeof(DotNetProjectConfiguration), "TargetFrameworkVersion", new object[] { new MergeToProjectAttribute () }),
new ItemMember (typeof(ProjectReference), "RequiredTargetFramework"),
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectService.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectService.cs
index df6d026199..217124a284 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectService.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectService.cs
@@ -534,7 +534,15 @@ namespace MonoDevelop.Projects.Formats.MSBuild
try {
p = runtime.ExecuteAssembly (pinfo);
p.StandardInput.WriteLine (Process.GetCurrentProcess ().Id.ToString ());
- string sref = p.StandardError.ReadLine ();
+ string responseKey = "[MonoDevelop]";
+ string sref;
+ while (true) {
+ sref = p.StandardError.ReadLine ();
+ if (sref.StartsWith (responseKey)) {
+ sref = sref.Substring (responseKey.Length);
+ break;
+ }
+ }
byte[] data = Convert.FromBase64String (sref);
MemoryStream ms = new MemoryStream (data);
BinaryFormatter bf = new BinaryFormatter ();
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/SlnFileFormat.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/SlnFileFormat.cs
index 7940eddda2..53097157b4 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/SlnFileFormat.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/SlnFileFormat.cs
@@ -540,7 +540,7 @@ namespace MonoDevelop.Projects.Formats.MSBuild
int lineNum = start + 1;
int lastLine = start + count - 2;
while (lineNum <= lastLine) {
- if (!ReadDataNode (it, lines, lastLine, "", ref lineNum))
+ if (!ReadDataNode (it, lines, lastLine, "", ref lineNum))
lineNum++;
}
return it;
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs
index 281d3ef7cf..430f7b2ecb 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs
@@ -43,6 +43,11 @@ namespace MonoDevelop.Projects.SharedAssetsProjects
{
}
+ public SharedAssetsProject (string language)
+ {
+ languageName = language;
+ }
+
public SharedAssetsProject (ProjectCreateInformation projectCreateInfo, XmlElement projectOptions)
{
languageName = projectOptions.GetAttribute ("language");
@@ -99,26 +104,60 @@ namespace MonoDevelop.Projects.SharedAssetsProjects
return false;
}
+ internal protected override bool OnGetSupportsExecute ()
+ {
+ return false;
+ }
+
+ protected override IEnumerable<string> GetStandardBuildActions ()
+ {
+ return BuildAction.DotNetActions;
+ }
+
+ protected override IList<string> GetCommonBuildActions ()
+ {
+ return BuildAction.DotNetCommonActions;
+ }
+
protected override void OnBoundToSolution ()
{
- if (currentSolution != null) {
- currentSolution.ReferenceAddedToProject -= HandleReferenceAddedToProject;
- currentSolution.ReferenceRemovedFromProject -= HandleReferenceRemovedFromProject;
- }
+ if (currentSolution != null)
+ DisconnectFromSolution ();
base.OnBoundToSolution ();
ParentSolution.ReferenceAddedToProject += HandleReferenceAddedToProject;
ParentSolution.ReferenceRemovedFromProject += HandleReferenceRemovedFromProject;
+ ParentSolution.SolutionItemAdded += HandleSolutionItemAdded;
currentSolution = ParentSolution;
+
+ // Maybe there is a project that is already referencing this one. It may happen when creating a solution
+ // from a template
+ foreach (var p in ParentSolution.GetAllSolutionItems<DotNetProject> ())
+ ProcessProject (p);
+ }
+
+ void HandleSolutionItemAdded (object sender, SolutionItemChangeEventArgs e)
+ {
+ var p = e.SolutionItem as DotNetProject;
+ if (p != null)
+ // Maybe the new project already contains a reference to this shared project
+ ProcessProject (p);
}
public override void Dispose ()
{
base.Dispose ();
+ DisconnectFromSolution ();
+ }
+
+ void DisconnectFromSolution ()
+ {
if (currentSolution != null) {
currentSolution.ReferenceAddedToProject -= HandleReferenceAddedToProject;
currentSolution.ReferenceRemovedFromProject -= HandleReferenceRemovedFromProject;
+ currentSolution.SolutionItemAdded -= HandleSolutionItemAdded;
+ currentSolution = null;
}
}
@@ -136,12 +175,25 @@ namespace MonoDevelop.Projects.SharedAssetsProjects
void HandleReferenceAddedToProject (object sender, ProjectReferenceEventArgs e)
{
if (e.ProjectReference.ReferenceType == ReferenceType.Project && e.ProjectReference.Reference == Name) {
- e.ProjectReference.Flags = ProjectItemFlags.DontPersist;
- foreach (var f in Files) {
- var cf = (ProjectFile) f.Clone ();
+ ProcessNewReference (e.ProjectReference);
+ }
+ }
+
+ void ProcessProject (DotNetProject p)
+ {
+ foreach (var pref in p.References.Where (r => r.ReferenceType == ReferenceType.Project && r.Reference == Name))
+ ProcessNewReference (pref);
+ }
+
+ void ProcessNewReference (ProjectReference pref)
+ {
+ pref.Flags = ProjectItemFlags.DontPersist;
+ pref.SetItemsProjectPath (Path.ChangeExtension (FileName, ".projitems"));
+ foreach (var f in Files) {
+ if (pref.OwnerProject.Files.GetFile (f.FilePath) == null) {
+ var cf = (ProjectFile)f.Clone ();
cf.Flags |= ProjectItemFlags.DontPersist | ProjectItemFlags.Hidden;
- e.Project.Files.Add (cf);
- e.ProjectReference.SetItemsProjectPath (Path.ChangeExtension (FileName, ".projitems"));
+ pref.OwnerProject.Files.Add (cf);
}
}
}
@@ -151,6 +203,8 @@ namespace MonoDevelop.Projects.SharedAssetsProjects
base.OnFilePropertyChangedInProject (e);
foreach (var p in GetReferencingProjects ()) {
foreach (var f in e) {
+ if (f.ProjectFile.Subtype == Subtype.Directory)
+ continue;
var pf = (ProjectFile) f.ProjectFile.Clone ();
pf.Flags |= ProjectItemFlags.DontPersist | ProjectItemFlags.Hidden;
p.Files.Remove (pf.FilePath);
@@ -164,9 +218,11 @@ namespace MonoDevelop.Projects.SharedAssetsProjects
base.OnFileAddedToProject (e);
foreach (var p in GetReferencingProjects ()) {
foreach (var f in e) {
- var pf = (ProjectFile) f.ProjectFile.Clone ();
- pf.Flags |= ProjectItemFlags.DontPersist | ProjectItemFlags.Hidden;
- p.Files.Add (pf);
+ if (f.ProjectFile.Subtype != Subtype.Directory && p.Files.GetFile (f.ProjectFile.FilePath) == null) {
+ var pf = (ProjectFile)f.ProjectFile.Clone ();
+ pf.Flags |= ProjectItemFlags.DontPersist | ProjectItemFlags.Hidden;
+ p.Files.Add (pf);
+ }
}
}
}
@@ -176,7 +232,8 @@ namespace MonoDevelop.Projects.SharedAssetsProjects
base.OnFileRemovedFromProject (e);
foreach (var p in GetReferencingProjects ()) {
foreach (var f in e) {
- p.Files.Remove (f.ProjectFile.FilePath);
+ if (f.ProjectFile.Subtype != Subtype.Directory)
+ p.Files.Remove (f.ProjectFile.FilePath);
}
}
}
@@ -186,6 +243,8 @@ namespace MonoDevelop.Projects.SharedAssetsProjects
base.OnFileRenamedInProject (e);
foreach (var p in GetReferencingProjects ()) {
foreach (var f in e) {
+ if (f.ProjectFile.Subtype == Subtype.Directory)
+ continue;
var pf = (ProjectFile) f.ProjectFile.Clone ();
p.Files.Remove (f.OldName);
pf.Flags |= ProjectItemFlags.DontPersist | ProjectItemFlags.Hidden;
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProjectMSBuildExtension.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProjectMSBuildExtension.cs
index 630382b5ea..1da660c7a1 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProjectMSBuildExtension.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProjectMSBuildExtension.cs
@@ -42,6 +42,8 @@ namespace MonoDevelop.Projects.SharedAssetsProjects
if (dnp == null)
return;
+ // Convert .projitems imports into project references
+
foreach (var sp in msproject.Imports.Where (im => im.Label == "Shared" && im.Project.EndsWith (".projitems"))) {
var projitemsFile = sp.Project;
if (!string.IsNullOrEmpty (projitemsFile)) {
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProjectMSBuildHandler.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProjectMSBuildHandler.cs
index d38acac226..d64df4f8e0 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProjectMSBuildHandler.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProjectMSBuildHandler.cs
@@ -119,11 +119,14 @@ namespace MonoDevelop.Projects.SharedAssetsProjects
grp.SetPropertyValue ("MSBuildAllProjects", "$(MSBuildAllProjects);$(MSBuildThisFileFullPath)", false);
grp.SetPropertyValue ("HasSharedItems", "true", false);
grp.SetPropertyValue ("SharedGUID", EntityItem.ItemId, false);
+ }
- grp = projitemsProject.AddNewPropertyGroup (true);
- grp.Label = "Configuration";
- grp.SetPropertyValue ("Import_RootNamespace", ((SharedAssetsProject)EntityItem).DefaultNamespace, false);
+ var configGrp = projitemsProject.PropertyGroups.FirstOrDefault (g => g.Label == "Configuration");
+ if (configGrp == null) {
+ configGrp = projitemsProject.AddNewPropertyGroup (true);
+ configGrp.Label = "Configuration";
}
+ configGrp.SetPropertyValue ("Import_RootNamespace", ((SharedAssetsProject)EntityItem).DefaultNamespace, false);
SaveProjectItems (monitor, new MSBuildFileFormatVS12 (), ser, projitemsProject, "$(MSBuildThisFileDirectory)");
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Text/TextFile.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Text/TextFile.cs
index a97fd46e02..85f4dd8b26 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Text/TextFile.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Text/TextFile.cs
@@ -438,6 +438,7 @@ namespace MonoDevelop.Projects.Text
fs.Close ();
FileService.SystemRename (tempName, fileName);
+ FileService.NotifyFileChanged (fileName);
}
public static void WriteFile (FilePath fileName, string content, string encoding, ByteOrderMark bom, bool onlyIfChanged)
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectReference.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectReference.cs
index 98ca1f3ccc..c19688397f 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectReference.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectReference.cs
@@ -107,12 +107,17 @@ namespace MonoDevelop.Projects
public ProjectReference (ReferenceType referenceType, string reference, string hintPath)
{
- if (referenceType == ReferenceType.Assembly)
+ if (referenceType == ReferenceType.Assembly) {
specificVersion = false;
+ if (hintPath == null) {
+ hintPath = reference;
+ reference = Path.GetFileNameWithoutExtension (reference);
+ }
+ }
this.referenceType = referenceType;
- this.reference = reference;
- this.hintPath = hintPath ?? (referenceType == ReferenceType.Assembly ? reference : null);
+ this.reference = reference;
+ this.hintPath = hintPath;
UpdatePackageReference ();
}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectService.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectService.cs
index 3b4b21a2e9..2679c9d0f4 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectService.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectService.cs
@@ -709,6 +709,16 @@ namespace MonoDevelop.Projects
throw new InvalidOperationException ("Unknown item type: " + item);
}
+ public override bool SupportsExecute (IBuildTarget item)
+ {
+ if (item is WorkspaceItem)
+ return ((WorkspaceItem)item).OnGetSupportsExecute ();
+ else if (item is SolutionItem)
+ return ((SolutionItem)item).OnGetSupportsExecute ();
+ else
+ throw new InvalidOperationException ("Unknown item type: " + item);
+ }
+
public override void Execute (IProgressMonitor monitor, IBuildTarget item, ExecutionContext context, ConfigurationSelector configuration)
{
if (item is SolutionEntityItem) {
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectServiceExtension.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectServiceExtension.cs
index 245eb658c3..476081baf6 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectServiceExtension.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectServiceExtension.cs
@@ -156,6 +156,34 @@ namespace MonoDevelop.Projects
return GetNext (item).SupportsTarget ((IBuildTarget) item, target);
}
+ public virtual bool SupportsExecute (IBuildTarget item)
+ {
+ if (item is SolutionEntityItem)
+ return SupportsExecute ((SolutionEntityItem)item);
+ else if (item is WorkspaceItem)
+ return SupportsExecute ((WorkspaceItem) item);
+ else
+ return GetNext (item).SupportsExecute (item);
+ }
+
+ protected virtual bool SupportsExecute (SolutionEntityItem item)
+ {
+ return GetNext (item).SupportsExecute ((IBuildTarget) item);
+ }
+
+ protected virtual bool SupportsExecute (Solution solution)
+ {
+ return GetNext (solution).SupportsExecute ((IBuildTarget) solution);
+ }
+
+ protected virtual bool SupportsExecute (WorkspaceItem item)
+ {
+ if (item is Solution)
+ return SupportsExecute ((Solution) item);
+ else
+ return GetNext (item).SupportsExecute ((IBuildTarget) item);
+ }
+
protected virtual void Clean (IProgressMonitor monitor, IBuildTarget item, ConfigurationSelector configuration)
{
if (item is SolutionEntityItem)
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Solution.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Solution.cs
index 09f023d53c..0210331f4f 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Solution.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Solution.cs
@@ -124,7 +124,7 @@ namespace MonoDevelop.Projects
if (startupItem == null && singleStartup) {
ReadOnlyCollection<SolutionEntityItem> its = GetAllSolutionItems<SolutionEntityItem> ();
if (its.Count > 0)
- startupItem = its [0];
+ startupItem = its.FirstOrDefault (it => it.SupportsExecute ());
}
return startupItem;
}
@@ -366,11 +366,17 @@ namespace MonoDevelop.Projects
{
return RootFolder.GetAllProjectsWithTopologicalSort (configuration);
}
-
+
+ [Obsolete("Use GetProjectsContainingFile() (plural) instead")]
public override Project GetProjectContainingFile (FilePath fileName)
{
return RootFolder.GetProjectContainingFile (fileName);
}
+
+ public override IEnumerable<Project> GetProjectsContainingFile (FilePath fileName)
+ {
+ return RootFolder.GetProjectsContainingFile (fileName);
+ }
public override bool ContainsItem (IWorkspaceObject obj)
{
@@ -666,6 +672,9 @@ namespace MonoDevelop.Projects
// Register the new entry in every solution configuration
foreach (SolutionConfiguration conf in Configurations)
conf.AddItem (eitem);
+ // If there is no startup project or it is an invalid one, use the new project as startup if possible
+ if ((StartupItem == null || !StartupItem.SupportsExecute ()) && eitem.SupportsExecute ())
+ StartupItem = eitem;
} else {
// Reuse the configuration information of the replaced item
foreach (SolutionConfiguration conf in Configurations)
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionFolder.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionFolder.cs
index 093f346b58..43c748de31 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionFolder.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionFolder.cs
@@ -477,7 +477,7 @@ namespace MonoDevelop.Projects
foreach (SolutionItem item in Items) {
if (item is SolutionFolder)
((SolutionFolder)item).GetAllBuildableEntries (list, configuration, includeExternalReferences);
- else if ((item is SolutionEntityItem) && conf.BuildEnabledForItem ((SolutionEntityItem) item))
+ else if ((item is SolutionEntityItem) && conf.BuildEnabledForItem ((SolutionEntityItem) item) && item.SupportsBuild ())
GetAllBuildableReferences (list, item, configuration, includeExternalReferences);
}
}
@@ -492,7 +492,8 @@ namespace MonoDevelop.Projects
GetAllBuildableReferences (list, it, configuration, includeExternalReferences);
}
}
-
+
+ [Obsolete("Use GetProjectsContainingFile() (plural) instead")]
public Project GetProjectContainingFile (string fileName)
{
ReadOnlyCollection<Project> projects = GetAllProjects ();
@@ -503,6 +504,31 @@ namespace MonoDevelop.Projects
}
return null;
}
+
+ public IEnumerable<Project> GetProjectsContainingFile (string fileName)
+ {
+ ReadOnlyCollection<Project> projects = GetAllProjects ();
+
+ Project mainProject = null;
+ var projectsWithLinks = new List<Project>();
+ foreach (Project projectEntry in projects) {
+ if (projectEntry.FileName == fileName || projectEntry.IsFileInProject(fileName)) {
+ var projectPath = Path.GetDirectoryName (projectEntry.FileName);
+ if (fileName.StartsWith (projectPath)) {
+ mainProject = projectEntry;
+ } else {
+ projectsWithLinks.Add (projectEntry);
+ }
+ }
+ }
+
+ if (mainProject != null) {
+ yield return mainProject;
+ }
+ foreach (var project in projectsWithLinks) {
+ yield return project;
+ }
+ }
public SolutionEntityItem FindSolutionItem (string fileName)
{
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionItem.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionItem.cs
index 2bbab1c45e..3dd753efab 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionItem.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionItem.cs
@@ -483,6 +483,11 @@ namespace MonoDevelop.Projects
return SupportsTarget (ProjectService.BuildTarget);
}
+ public bool SupportsExecute ()
+ {
+ return Services.ProjectService.GetExtensionChain (this).SupportsExecute (this);
+ }
+
/// <summary>
/// Cleans the files produced by this solution item
/// </summary>
@@ -624,7 +629,7 @@ namespace MonoDevelop.Projects
void GetBuildableReferencedItems (Set<SolutionItem> visited, List<SolutionItem> referenced, SolutionItem item, ConfigurationSelector configuration)
{
- if (!visited.Add(item) || !item.SupportsBuild ())
+ if (!visited.Add(item))
return;
referenced.Add (item);
@@ -664,6 +669,8 @@ namespace MonoDevelop.Projects
/// </param>
public bool CanExecute (ExecutionContext context, ConfigurationSelector configuration)
{
+ if (!SupportsExecute ())
+ return false;
return Services.ProjectService.GetExtensionChain (this).CanExecute (this, context, configuration);
}
@@ -1060,6 +1067,11 @@ namespace MonoDevelop.Projects
return true;
}
+ internal protected virtual bool OnGetSupportsExecute ()
+ {
+ return true;
+ }
+
/// <summary>
/// Determines whether this solution item can be executed using the specified context and configuration.
/// </summary>
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/UnknownProject.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/UnknownProject.cs
index 1e61bd6a4c..581d8a1b6a 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/UnknownProject.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/UnknownProject.cs
@@ -88,6 +88,12 @@ namespace MonoDevelop.Projects
set { }
}
+ internal protected override bool OnGetSupportsTarget (string target)
+ {
+ // We can't do anything with unsupported projects, other than display them in the solution pad
+ return false;
+ }
+
protected override void OnClean (IProgressMonitor monitor, ConfigurationSelector configuration)
{
}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/UnknownSolutionItem.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/UnknownSolutionItem.cs
index 0c39360adb..4c384540f4 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/UnknownSolutionItem.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/UnknownSolutionItem.cs
@@ -80,6 +80,11 @@ namespace MonoDevelop.Projects
}
set { }
}
+
+ internal protected override bool OnGetSupportsTarget (string target)
+ {
+ return false;
+ }
protected override void OnClean (IProgressMonitor monitor, ConfigurationSelector configuration)
{
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Workspace.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Workspace.cs
index 02b51a6646..a59cdab116 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Workspace.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Workspace.cs
@@ -95,8 +95,8 @@ namespace MonoDevelop.Projects
}
return null;
}
-
-
+
+ [Obsolete("Use GetProjectsContainingFile() (plural) instead")]
public override Project GetProjectContainingFile (FilePath fileName)
{
foreach (WorkspaceItem it in Items) {
@@ -107,6 +107,15 @@ namespace MonoDevelop.Projects
return null;
}
+ public override IEnumerable<Project> GetProjectsContainingFile (FilePath fileName)
+ {
+ foreach (WorkspaceItem it in Items) {
+ foreach (Project p in it.GetProjectsContainingFile (fileName)) {
+ yield return p;
+ }
+ }
+ }
+
public override bool ContainsItem (IWorkspaceObject obj)
{
if (base.ContainsItem (obj))
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/WorkspaceItem.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/WorkspaceItem.cs
index c9f0169080..8455a52481 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/WorkspaceItem.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/WorkspaceItem.cs
@@ -216,11 +216,17 @@ namespace MonoDevelop.Projects
list.Add ((T)this);
return list.AsReadOnly ();
}
-
+
+ [Obsolete("Use GetProjectsContainingFile() (plural) instead")]
public virtual Project GetProjectContainingFile (FilePath fileName)
{
return null;
}
+
+ public virtual IEnumerable<Project> GetProjectsContainingFile (FilePath fileName)
+ {
+ yield break;
+ }
public virtual ReadOnlyCollection<string> GetConfigurations ()
{
@@ -267,6 +273,11 @@ namespace MonoDevelop.Projects
return Services.ProjectService.GetExtensionChain (this).SupportsTarget (this, target);
}
+ public bool SupportsExecute ()
+ {
+ return Services.ProjectService.GetExtensionChain (this).SupportsExecute (this);
+ }
+
public BuildResult Build (IProgressMonitor monitor, string configuration)
{
return InternalBuild (monitor, (SolutionConfigurationSelector) configuration);
@@ -421,6 +432,11 @@ namespace MonoDevelop.Projects
return true;
}
+ internal protected virtual bool OnGetSupportsExecute ()
+ {
+ return true;
+ }
+
protected virtual void OnClean (IProgressMonitor monitor, ConfigurationSelector configuration)
{
}
diff --git a/main/src/core/MonoDevelop.Ide/ExtensionModel/Commands.addin.xml b/main/src/core/MonoDevelop.Ide/ExtensionModel/Commands.addin.xml
index ef6b450f33..a633e6d460 100644
--- a/main/src/core/MonoDevelop.Ide/ExtensionModel/Commands.addin.xml
+++ b/main/src/core/MonoDevelop.Ide/ExtensionModel/Commands.addin.xml
@@ -380,7 +380,7 @@
_label = "_Save" />
<Command id = "MonoDevelop.Ide.Commands.FileCommands.SaveAll"
defaultHandler = "MonoDevelop.Ide.Commands.SaveAllHandler"
- icon = "md-save-all-icon"
+ icon = "md-save-all"
shortcut = "Control|Shift|S"
macShortcut = "Meta|Shift|S"
_description = "Save all open files"
diff --git a/main/src/core/MonoDevelop.Ide/ExtensionModel/DefaultPolicyPanels.addin.xml b/main/src/core/MonoDevelop.Ide/ExtensionModel/DefaultPolicyPanels.addin.xml
index 5609d08bd5..87421f4d48 100644
--- a/main/src/core/MonoDevelop.Ide/ExtensionModel/DefaultPolicyPanels.addin.xml
+++ b/main/src/core/MonoDevelop.Ide/ExtensionModel/DefaultPolicyPanels.addin.xml
@@ -9,16 +9,16 @@
<Extension path = "/MonoDevelop/ProjectModel/Gui/DefaultPolicyPanels">
<Section id="Common" _label="General">
</Section>
- <Section id="Build" _label="Build">
+ <Section id="Build" _label="Build" icon="md-prefs-build">
</Section>
- <Section id="Run" _label="Run">
+ <Section id="Run" _label="Run" icon="md-prefs-play">
</Section>
<Section id="SourceCode" _label="Source Code">
- <Section id="DefaultDotNetNamingPolicies" _label=".NET Naming Policies">
+ <Section id="DefaultDotNetNamingPolicies" _label=".NET Naming Policies" icon="md-prefs-dotnet-naming-policies" >
<Panel id = "NamespaceSynchronisationPanel" class = "MonoDevelop.Ide.Projects.OptionPanels.NamespaceSynchronisationPanel" />
</Section>
- <Section id="CodeFormattingPolicies" _label="Code Formatting" icon="md-formatting" fill = "true" class="MonoDevelop.Ide.Projects.OptionPanels.CodeFormattingPanel" />
- <Section id="DefaultStandardHeader" _label = "Standard Header" fill="true" class = "MonoDevelop.Ide.StandardHeader.StandardHeaderPolicyPanel" />
+ <Section id="CodeFormattingPolicies" _label="Code Formatting" fill="true" class="MonoDevelop.Ide.Projects.OptionPanels.CodeFormattingPanel" icon="md-prefs-code-formatting" />
+ <Section id="DefaultStandardHeader" _label="Standard Header" fill="true" class="MonoDevelop.Ide.StandardHeader.StandardHeaderPolicyPanel" icon="md-prefs-standard-header" />
</Section>
<Section id="VersionControl" _label="Version Control" />
</Extension>
diff --git a/main/src/core/MonoDevelop.Ide/ExtensionModel/GlobalOptionsDialog.addin.xml b/main/src/core/MonoDevelop.Ide/ExtensionModel/GlobalOptionsDialog.addin.xml
index 101ee91f08..19b8e2e82f 100644
--- a/main/src/core/MonoDevelop.Ide/ExtensionModel/GlobalOptionsDialog.addin.xml
+++ b/main/src/core/MonoDevelop.Ide/ExtensionModel/GlobalOptionsDialog.addin.xml
@@ -7,38 +7,38 @@
<Extension path = "/MonoDevelop/Ide/GlobalOptionsDialog">
<Section id = "Preferences" _label = "Environment">
- <Section id = "GeneralAuthorInfo" _label = "Author Information" icon="md-monkey" fill="true" class = "MonoDevelop.Ide.Gui.OptionPanels.GlobalAuthorInformationPanel" />
- <Section id = "Language" _label = "Language" icon="md-locale" class = "MonoDevelop.Ide.Gui.OptionPanels.IDEStyleOptionsPanel">
-<!-- <Panel _label = "Welcome Page" class = "MonoDevelop.Ide.WelcomePage.WelcomePageOptionPanel" />-->
+ <Section id = "GeneralAuthorInfo" _label = "Author Information" fill="true" class = "MonoDevelop.Ide.Gui.OptionPanels.GlobalAuthorInformationPanel" icon="md-prefs-author-information" />
+ <Section id = "Language" _label = "Language" class = "MonoDevelop.Ide.Gui.OptionPanels.IDEStyleOptionsPanel" icon="md-prefs-language">
+ <!-- <Panel _label = "Welcome Page" class = "MonoDevelop.Ide.WelcomePage.WelcomePageOptionPanel" />-->
</Section>
- <Section id = "KeyBindings" _label = "Key Bindings" fill="true" icon="md-keyboard-shortcuts" class = "MonoDevelop.Ide.Gui.OptionPanels.KeyBindingsPanel" />
- <Section id = "Fonts" _label = "Fonts" fill="true" icon = "md-letters" class = "MonoDevelop.Ide.Fonts.FontChooserPanel"/>
- <Section id = "Updates" _label = "Updates" icon="md-updates" class = "MonoDevelop.Ide.Gui.OptionPanels.AddInsOptionsPanel" />
- <Section id = "TaskList" _label = "Tasks" icon="md-task-list-icon" fill="true" class = "MonoDevelop.Ide.Gui.OptionPanels.TasksOptionsPanel" />
- <Section id = "ExternalTools" _label = "External Tools" icon="md-external-tools" fill="true" class = "MonoDevelop.Ide.ExternalTools.ExternalToolPane" />
+ <Section id = "KeyBindings" _label = "Key Bindings" fill="true" class = "MonoDevelop.Ide.Gui.OptionPanels.KeyBindingsPanel" icon="md-prefs-key-bindings" />
+ <Section id = "Fonts" _label = "Fonts" fill="true" class = "MonoDevelop.Ide.Fonts.FontChooserPanel" icon = "md-prefs-fonts" />
+ <Section id = "Updates" _label = "Updates" class = "MonoDevelop.Ide.Gui.OptionPanels.AddInsOptionsPanel" icon="md-prefs-updates" />
+ <Section id = "TaskList" _label = "Tasks" fill="true" class = "MonoDevelop.Ide.Gui.OptionPanels.TasksOptionsPanel" icon="md-prefs-task-list" />
+ <Section id = "ExternalTools" _label = "External Tools" fill="true" class = "MonoDevelop.Ide.ExternalTools.ExternalToolPane" icon="md-prefs-external-tools" />
</Section>
<Section id = "Projects" _label = "Projects">
- <Section id = "LoadSave" _label = "Load/Save" icon="md-drive" class = "MonoDevelop.Ide.Gui.OptionPanels.LoadSavePanel" />
- <Section id = "Build" _label = "Build" icon="md-hammer" class = "MonoDevelop.Ide.Gui.OptionPanels.BuildPanel">
+ <Section id = "LoadSave" _label = "Load/Save" class = "MonoDevelop.Ide.Gui.OptionPanels.LoadSavePanel" icon="md-prefs-load-save" />
+ <Section id = "Build" _label = "Build" class = "MonoDevelop.Ide.Gui.OptionPanels.BuildPanel" icon="md-prefs-build">
<Panel id = "BuildMessages" _label = "Errors and Warnings" class = "MonoDevelop.Ide.Gui.OptionPanels.BuildMessagePanel" />
<Panel id = "Directories" _label = "Assembly Folders" class = "MonoDevelop.Ide.Gui.OptionPanels.AssemblyFoldersPanel" />
</Section>
<Section id = "MonoRuntime" _label = ".NET Runtimes" fill="true" class = "MonoDevelop.Ide.Gui.OptionPanels.MonoRuntimePanel" />
- <Section id = "SdkLocations" _label = "SDK Locations" icon = "sdk-locations" />
+ <Section id = "SdkLocations" _label = "SDK Locations" icon = "md-prefs-sdk-locations" />
</Section>
<Section id = "TextEditor" _label = "Text Editor">
- <Section id = "Formatting" icon="md-formatting" _label = "Formatting" />
- <Section id = "CodeTemplates" icon="md-template" _label = "Code Templates" fill="true" class = "MonoDevelop.Ide.CodeTemplates.CodeTemplatePane"/>
+ <Section id = "Formatting" _label = "Formatting" icon="md-prefs-code-formatting" />
+ <Section id = "CodeTemplates" _label = "Code Templates" fill="true" class = "MonoDevelop.Ide.CodeTemplates.CodeTemplatePane" icon="md-prefs-code-templates" />
</Section>
<Section id="SourceCode" _label="Source Code">
- <Section id="DefaultDotNetNamingPolicies" _label=".NET Naming Policies">
+ <Section id="DefaultDotNetNamingPolicies" _label=".NET Naming Policies" icon="md-prefs-dotnet-naming-policies">
<Panel id = "NamespaceSynchronisationPanel" class = "MonoDevelop.Ide.Projects.OptionPanels.NamespaceSynchronisationPanel" />
</Section>
- <Section id="CodeFormattingPolicies" _label="Code Formatting" icon="md-formatting" fill = "true" class="MonoDevelop.Ide.Projects.OptionPanels.CodeFormattingPanel" />
- <Section id="DefaultStandardHeader" _label = "Standard Header" fill="true" class = "MonoDevelop.Ide.StandardHeader.StandardHeaderPolicyPanel" />
+ <Section id="CodeFormattingPolicies" _label="Code Formatting" fill="true" class="MonoDevelop.Ide.Projects.OptionPanels.CodeFormattingPanel" icon="md-prefs-code-formatting" />
+ <Section id="DefaultStandardHeader" _label="Standard Header" fill="true" class="MonoDevelop.Ide.StandardHeader.StandardHeaderPolicyPanel" icon="md-prefs-standard-header" />
</Section>
<Section id = "VersionControl" _label = "Version Control" />
diff --git a/main/src/core/MonoDevelop.Ide/ExtensionModel/ItemOptionPanels.addin.xml b/main/src/core/MonoDevelop.Ide/ExtensionModel/ItemOptionPanels.addin.xml
index 680d22099a..2a9bfa6b3a 100644
--- a/main/src/core/MonoDevelop.Ide/ExtensionModel/ItemOptionPanels.addin.xml
+++ b/main/src/core/MonoDevelop.Ide/ExtensionModel/ItemOptionPanels.addin.xml
@@ -30,11 +30,11 @@
</Condition>
</Section>
<Condition id="ItemType" value="Solution">
- <Section id = "AuthorInfo" _label = "Author Information" fill="true" class = "MonoDevelop.Ide.Gui.OptionPanels.AuthorInformationPanel" />
+ <Section id = "AuthorInfo" _label = "Author Information" fill="true" class = "MonoDevelop.Ide.Gui.OptionPanels.AuthorInformationPanel" icon="md-prefs-author-information" />
</Condition>
</Section>
<Section id="Build" _label="Build">
- <Section id="General" _label="General" icon="md-build-combine">
+ <Section id="General" _label="General" icon="md-prefs-build">
<Condition id="ItemType" value="DotNetAssemblyProject">
<Panel id = "RuntimeOptionsPanel" _label = "Runtime Options" class = "MonoDevelop.Ide.Projects.OptionPanels.RuntimeOptionsPanel"/>
</Condition>
@@ -49,11 +49,11 @@
</Condition>
</Section>
<Condition id="ItemType" value="SolutionEntityItem">
- <Section id = "CustomCommands" _label = "Custom Commands" icon="md-custom-commands" fill = "true" class = "MonoDevelop.Ide.Projects.OptionPanels.BuildCustomCommandPanel"/>
+ <Section id = "CustomCommands" _label = "Custom Commands" fill = "true" class = "MonoDevelop.Ide.Projects.OptionPanels.BuildCustomCommandPanel" icon = "md-prefs-generic" />
</Condition>
<Condition id="ItemType" value="Project">
<Section id = "ProjectConfigurations" _label = "Configurations" fill = "true" class = "MonoDevelop.Ide.Projects.OptionPanels.SolutionItemConfigurationsPanel"/>
- <Section id = "Compiler" _label="Compiler" icon="md-compiler-options" />
+ <Section id = "Compiler" _label="Compiler" />
<Section id = "SigningPreferences" _label = "Assembly Signing" class = "MonoDevelop.Ide.Projects.OptionPanels.CommonAssemblySigningPreferencesPanel"/>
<Section id = "OutputOptionsPanel" _label = "Output" class = "MonoDevelop.Ide.Projects.OptionPanels.OutputOptionsPanel"/>
</Condition>
@@ -65,7 +65,7 @@
</Condition>
</Section>
<Section id="Run" _label="Run">
- <Section id="General" _label="General" icon="gtk-execute">
+ <Section id="General" _label="General" icon="md-prefs-play">
<Condition id="ItemType" value="Project">
<Panel id = "RunOptionsPanel" _label = "Run" fill = "true" class = "MonoDevelop.Ide.Projects.OptionPanels.RunOptionsPanel"/>
</Condition>
@@ -74,11 +74,11 @@
<Section id = "StartupOptionsPanel" _label = "Startup Project" fill = "true" class = "MonoDevelop.Ide.Projects.OptionPanels.StartupOptionsPanel"/>
</Condition>
<Condition id="ItemType" value="SolutionEntityItem">
- <Section id = "CustomCommands" _label = "Custom Commands" icon="md-custom-commands" fill = "true" class = "MonoDevelop.Ide.Projects.OptionPanels.ExecutionCustomCommandPanel"/>
+ <Section id = "CustomCommands" _label = "Custom Commands" fill = "true" class = "MonoDevelop.Ide.Projects.OptionPanels.ExecutionCustomCommandPanel" />
</Condition>
</Section>
<Section id="SourceCode" _label="Source Code">
- <Section id="DotNetNamingPolicies" _label=".NET Naming Policies">
+ <Section id="DotNetNamingPolicies" _label=".NET Naming Policies" icon="md-prefs-dotnet-naming-policies">
<Condition id="ItemType" value="Solution">
<Panel id = "NamespaceSynchronisationPanel" class = "MonoDevelop.Ide.Projects.OptionPanels.NamespaceSynchronisationPanel" />
</Condition>
@@ -87,12 +87,12 @@
</Condition>
</Section>
<Condition id="ItemType" value="Solution">
- <Section id="CodeFormattingPolicies" _label="Code Formatting" icon="md-formatting" fill = "true" class="MonoDevelop.Ide.Projects.OptionPanels.CodeFormattingPanel" />
- <Section id="DefaultStandardHeader" _label = "Standard Header" fill="true" class = "MonoDevelop.Ide.StandardHeader.StandardHeaderPolicyPanel" />
+ <Section id="CodeFormattingPolicies" _label="Code Formatting" fill="true" class="MonoDevelop.Ide.Projects.OptionPanels.CodeFormattingPanel" icon="md-prefs-code-formatting" />
+ <Section id="DefaultStandardHeader" _label="Standard Header" fill="true" class= "MonoDevelop.Ide.StandardHeader.StandardHeaderPolicyPanel" icon="md-prefs-standard-header" />
</Condition>
<Condition id="ItemType" value="SolutionItem">
- <Section id="CodeFormattingPolicies" _label="Code Formatting" icon="md-formatting" fill = "true" class="MonoDevelop.Ide.Projects.OptionPanels.CodeFormattingPanel" />
- <Section id="DefaultStandardHeader" _label = "Standard Header" fill="true" class = "MonoDevelop.Ide.StandardHeader.StandardHeaderPolicyPanel" />
+ <Section id="CodeFormattingPolicies" _label="Code Formatting" fill="true" class="MonoDevelop.Ide.Projects.OptionPanels.CodeFormattingPanel" icon="md-prefs-code-formatting" />
+ <Section id="DefaultStandardHeader" _label="Standard Header" fill="true" class="MonoDevelop.Ide.StandardHeader.StandardHeaderPolicyPanel" icon="md-prefs-standard-header" />
</Condition>
</Section>
</Extension>
diff --git a/main/src/core/MonoDevelop.Ide/ExtensionModel/MimeTypes.addin.xml b/main/src/core/MonoDevelop.Ide/ExtensionModel/MimeTypes.addin.xml
index 9bd4a526e8..54d687c19f 100644
--- a/main/src/core/MonoDevelop.Ide/ExtensionModel/MimeTypes.addin.xml
+++ b/main/src/core/MonoDevelop.Ide/ExtensionModel/MimeTypes.addin.xml
@@ -73,10 +73,10 @@
<MimeType id="application/x-sh" _description="Shell script" isText="true">
<File pattern="*.sh" />
</MimeType>
- <MimeType id="text/x-fsharp" _description="f# files" isText="true">
- <File pattern="*.fs" icon="md-file-source" />
- <File pattern="*.fsx" icon="md-file-source" />
- <File pattern="*.fsi" icon="md-file-header" />
+ <MimeType id="text/x-fsharp" _description="f# files" isText="true" icon="md-file-source">
+ <File pattern="*.fs" />
+ <File pattern="*.fsx" />
+ <File pattern="*.fsi" />
</MimeType>
<MimeType id="application/x-msbuild" _description="MSBuild targets file" baseType="application/xml">
<File pattern="*.targets" />
diff --git a/main/src/core/MonoDevelop.Ide/ExtensionModel/Pads.addin.xml b/main/src/core/MonoDevelop.Ide/ExtensionModel/Pads.addin.xml
index db5de6fe9b..c3094cc430 100644
--- a/main/src/core/MonoDevelop.Ide/ExtensionModel/Pads.addin.xml
+++ b/main/src/core/MonoDevelop.Ide/ExtensionModel/Pads.addin.xml
@@ -31,7 +31,7 @@
<Pad id = "MonoDevelop.Ide.Gui.Pads.TaskListPad"
_label = "Tasks"
- icon="md-task-list-icon"
+ icon="md-task-list"
class = "MonoDevelop.Ide.Gui.Pads.TaskListPad"
defaultPlacement = "Bottom"
defaultStatus="AutoHide"
diff --git a/main/src/core/MonoDevelop.Ide/ExtensionModel/StockIcons.addin.xml b/main/src/core/MonoDevelop.Ide/ExtensionModel/StockIcons.addin.xml
index 1028ee14ba..d01665f8da 100644
--- a/main/src/core/MonoDevelop.Ide/ExtensionModel/StockIcons.addin.xml
+++ b/main/src/core/MonoDevelop.Ide/ExtensionModel/StockIcons.addin.xml
@@ -34,18 +34,38 @@
<StockIcon stockid="md-component-folder-open" resource="special-folder-win-light-16.png" size="Menu" />
</Condition>
+ <!-- GTK icons redefined -->
<StockIcon stockid="gtk-add" resource="add-light-16.png" size="Menu" />
<StockIcon stockid="gtk-apply" resource="done-light-16.png" size="Menu" />
<StockIcon stockid="gtk-cancel" resource="remove-light-16.png" size="Menu" />
<StockIcon stockid="gtk-clear" resource="clear-light-16.png" size="Menu" />
<StockIcon stockid="gtk-close" resource="remove-light-16.png" size="Menu" />
+ <StockIcon stockid="gtk-copy" resource="copy-light-16.png" size="Menu" />
<StockIcon stockid="gtk-delete" resource="remove-light-16.png" size="Menu" />
<StockIcon stockid="gtk-edit" resource="edit-light-16.png" size="Menu" />
- <StockIcon stockid="gtk-find" resource="pad-search-results-light-16.png" size="Menu" />
+ <StockIcon stockid="gtk-find" resource="find-light-16.png" size="Menu" />
+ <StockIcon stockid="gtk-find-and-replace" resource="find-and-replace-light-16.png" size="Menu" />
+ <StockIcon stockid="gtk-go-back" resource="go-back-light-16.png" size="Menu" />
+ <StockIcon stockid="gtk-go-down" resource="go-down-light-16.png" size="Menu" />
+ <StockIcon stockid="gtk-go-forward" resource="go-forward-light-16.png" size="Menu" />
+ <StockIcon stockid="gtk-go-up" resource="go-up-light-16.png" size="Menu" />
+ <StockIcon stockid="gtk-home" resource="home-light-16.png" size="Menu" />
+ <StockIcon stockid="gtk-jump-to" resource="jump-to-light-16.png" size="Menu" />
+ <StockIcon stockid="gtk-media-play" resource="media-play-light-16.png" size="Menu" />
+ <StockIcon stockid="gtk-missing-image" resource="missing-image-light-16.png" size="Menu" />
+ <StockIcon stockid="gtk-new" resource="add-light-16.png" size="Menu" />
<StockIcon stockid="gtk-ok" resource="done-light-16.png" size="Menu" />
+ <StockIcon stockid="gtk-open" resource="open-light-16.png" size="Menu" />
<StockIcon stockid="gtk-properties" resource="properties-light-16.png" size="Menu" />
+ <StockIcon stockid="gtk-refresh" resource="refresh-light-16.png" size="Menu" />
<StockIcon stockid="gtk-remove" resource="remove-light-16.png" size="Menu" />
+ <StockIcon stockid="gtk-save" resource="save-light-16.png" size="Menu" />
<StockIcon stockid="gtk-stop" resource="stop-light-16.png" size="Menu" />
+ <StockIcon stockid="gtk-undo" resource="undo-light-16.png" size="Menu" />
+ <StockIcon stockid="gtk-zoom-in" resource="zoom-in-light-16.png" size="Menu" />
+ <StockIcon stockid="gtk-zoom-out" resource="zoom-out-light-16.png" size="Menu" />
+
+ <!-- MD icons -->
<StockIcon stockid="md-add" resource="add-light-16.png" size="Menu" />
<StockIcon stockid="md-assembly-project" resource="assembly-project-light-16.png" size="Menu" />
<StockIcon stockid="md-breadcrumb-next" resource="breadcrumb-next-normal-light-16.png" size="Menu" />
@@ -67,7 +87,6 @@
<StockIcon stockid="md-disclose-arrow-down" resource="disclose-arrow-down-light-16.png" size="Menu" />
<StockIcon stockid="md-disclose-arrow-up" resource="disclose-arrow-up-light-16.png" size="Menu" />
<StockIcon stockid="md-done" resource="done-light-16.png" size="Menu" />
- <StockIcon stockid="md-empty-category" resource="command-light-16.png" size="Menu" />
<StockIcon stockid="md-empty-file-icon" resource="file-generic-light-16.png" size="Menu" />
<StockIcon stockid="md-enum" resource="element-enumeration-light-16.png" size="Menu" />
<StockIcon stockid="md-enum-file" resource="file-enumeration-light-32.png" size="Dnd" />
@@ -75,6 +94,7 @@
<StockIcon stockid="md-errors-list-has-errors" resource="pad-error-list-errors-light-16.png" size="Menu" />
<StockIcon stockid="md-errors-list-has-warnings" resource="pad-error-list-warnings-light-16.png" size="Menu" />
<StockIcon stockid="md-event" resource="element-event-light-16.png" size="Menu" />
+ <StockIcon stockid="md-exception" resource="element-exception-light-16.png" size="Menu" />
<StockIcon stockid="md-extensionmethod" resource="element-extensionmethod-light-16.png" size="Menu" />
<StockIcon stockid="md-feedback" resource="feedback-light-16.png" size="Menu" />
<StockIcon stockid="md-field" resource="element-field-light-16.png" size="Menu" />
@@ -84,6 +104,7 @@
<StockIcon stockid="md-file-source" resource="file-source-light-32.png" size="Dnd" />
<StockIcon stockid="md-file-unit-test" resource="file-unit-test-light-32.png" size="Dnd" />
<StockIcon stockid="md-folder-overlay" resource="assembly-reference-overlay-light-16.png" size="Menu" />
+ <StockIcon stockid="md-fs-field" resource="element-fs-field-light-16.png" size="Menu" />
<StockIcon stockid="md-generic-pad" resource="pad-generic-pad-light-16.png" size="Menu" />
<StockIcon stockid="md-group-by-category" resource="group-by-category-light-16.png" size="Menu" />
<StockIcon stockid="md-gui-file" resource="file-gtk-light-32.png" size="Dnd" />
@@ -102,8 +123,10 @@
<StockIcon stockid="md-message-log" resource="pad-application-output-light-16.png" size="Menu" />
<StockIcon stockid="md-method" resource="element-method-light-16.png" size="Menu" />
<StockIcon stockid="md-misc-files" resource="file-generic-light-16.png" size="Menu" />
+ <StockIcon stockid="md-module" resource="element-module-light-16.png" size="Menu" />
<StockIcon stockid="md-name-space" resource="element-namespace-light-16.png" size="Menu" />
<StockIcon stockid="md-newmethod" resource="element-method-new-light-16.png" size="Menu" />
+ <StockIcon stockid="md-other-declaration" resource="element-other-declaration-light-16.png" size="Menu" />
<StockIcon stockid="md-output-icon" resource="pad-application-output-light-16.png" size="Menu" />
<StockIcon stockid="md-package-source" resource="package-source-light-16.png" size="Menu" />
<StockIcon stockid="md-parser" resource="parser-light-16.png" size="Menu" />
@@ -112,6 +135,24 @@
<StockIcon stockid="md-popup-close" resource="popup-close-light-16.png" size="Menu" />
<StockIcon stockid="md-popup-close-hover" resource="popup-close-hover-light-16.png" size="Menu" />
<StockIcon stockid="md-preferences" resource="preferences-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-author-information" resource="prefs-author-information-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-build" resource="prefs-build-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-code-formatting" resource="prefs-code-formatting-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-code-templates" resource="prefs-code-templates-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-csharp" resource="prefs-csharp-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-dotnet-naming-policies" resource="prefs-dotnet-naming-policies-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-external-tools" resource="prefs-external-tools-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-fonts" resource="prefs-fonts-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-generic" resource="prefs-generic-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-key-bindings" resource="prefs-key-bindings-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-language" resource="prefs-language-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-load-save" resource="prefs-load-save-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-name-conventions" resource="prefs-name-conventions-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-play" resource="prefs-play-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-sdk-locations" resource="prefs-sdk-locations-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-standard-header" resource="prefs-standard-header-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-task-list" resource="prefs-task-list-light-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-updates" resource="prefs-updates-light-16.png" size="Menu" />
<StockIcon stockid="md-project" resource="project-light-16.png" size="Menu" />
<StockIcon stockid="md-project" resource="project-light-32.png" size="Dnd" />
<StockIcon stockid="md-project-overlay" resource="project-reference-overlay-light-16.png" size="Menu" />
@@ -121,6 +162,9 @@
<StockIcon stockid="md-regular-file" resource="file-generic-light-16.png" size="Menu" />
<StockIcon stockid="md-resource-file-icon" resource="file-resource-light-16.png" size="Menu" />
<StockIcon stockid="md-resource-file-icon" resource="file-resource-light-32.png" size="Dnd" />
+ <StockIcon stockid="md-save-all" resource="save-all-light-16.png" size="Menu" />
+ <StockIcon stockid="md-script-file-icon" resource="file-script-light-16.png" size="Menu" />
+ <StockIcon stockid="md-script-file-icon" resource="file-script-light-32.png" size="Dnd" />
<StockIcon stockid="md-searchbox-clear" resource="searchbox-clear-light-16.png" size="Menu" />
<StockIcon stockid="md-searchbox-search" resource="searchbox-search-light-16.png" size="Menu" />
<StockIcon stockid="md-solution" resource="solution-light-16.png" size="Menu" />
@@ -129,11 +173,12 @@
<StockIcon stockid="md-stop" resource="stop-light-16.png" size="Menu" />
<StockIcon stockid="md-struct" resource="element-structure-light-16.png" size="Menu" />
<StockIcon stockid="md-struct-file" resource="file-struct-light-32.png" size="Dnd" />
- <StockIcon stockid="md-task-list-icon" resource="pad-task-list-light-16.png" size="Menu" />
+ <StockIcon stockid="md-task-list" resource="pad-task-list-light-16.png" size="Menu" />
<StockIcon stockid="md-template" resource="element-template-light-16.png" size="Menu" />
<StockIcon stockid="md-template-surroundwith" resource="element-template-surroundwith-light-16.png" size="Menu" />
<StockIcon stockid="md-text-file-icon" resource="file-text-light-16.png" size="Menu" />
<StockIcon stockid="md-text-file-icon" resource="file-text-light-32.png" size="Dnd" />
+ <StockIcon stockid="md-type" resource="element-type-light-16.png" size="Menu" />
<StockIcon stockid="md-updates" resource="updates-light-16.png" size="Menu" />
<StockIcon stockid="md-variable" resource="element-variable-light-16.png" size="Menu" />
<StockIcon stockid="md-warning-overlay" resource="invalid-reference-overlay-light-16.png" size="Menu" />
@@ -164,6 +209,13 @@
<StockIcon stockid="gtk-dialog-info" resource="information-light-24.png" size="LargeToolbar" />
<StockIcon stockid="gtk-dialog-info" resource="information-light-32.png" size="Dnd" />
<StockIcon stockid="gtk-dialog-info" resource="information-light-48.png" size="Dialog" />
+
+ <StockIcon stockid="gtk-dialog-question" resource="question-light-16.png" />
+ <StockIcon stockid="gtk-dialog-question" resource="question-light-16.png" size="Menu" />
+ <StockIcon stockid="gtk-dialog-question" resource="question-light-24.png" size="Button" />
+ <StockIcon stockid="gtk-dialog-question" resource="question-light-24.png" size="LargeToolbar" />
+ <StockIcon stockid="gtk-dialog-question" resource="question-light-32.png" size="Dnd" />
+ <StockIcon stockid="gtk-dialog-question" resource="question-light-48.png" size="Dialog" />
<StockIcon stockid="md-error" resource="error-light-16.png" />
<StockIcon stockid="md-error" resource="error-light-16.png" size="Menu" />
@@ -200,22 +252,11 @@
<StockIcon stockid="md-clear-all-bookmarks" resource="clear-all-bookmarks-16.png" size="Menu" />
<StockIcon stockid="md-close-all-documents" resource="close-all-documents-16.png" size="Menu" />
<StockIcon stockid="md-close-combine-icon" resource="close-solution-16.png" size="Menu" />
- <StockIcon stockid="md-compiler-options" resource="compiler-options-16.png" size="Menu" />
- <StockIcon stockid="md-custom-commands" resource="custom-commands-16.png" size="Menu" />
- <StockIcon stockid="md-drive" resource="drive-16.png" size="Menu" />
<StockIcon stockid="md-empty" resource="empty-16.png" size="Menu" />
- <StockIcon stockid="md-external-tools" resource="tools-external-tools-16.png" size="Menu" />
<StockIcon stockid="md-find-in-files" resource="find-in-files-16.png" size="Menu" />
<StockIcon stockid="md-find-next-icon" resource="edit-find-next-16.png" size="Menu" />
- <StockIcon stockid="md-formatting" resource="formatting-16.png" size="Menu" />
<StockIcon stockid="md-goto-nextbookmark" resource="goto-next-bookmark-16.png" size="Menu" />
<StockIcon stockid="md-goto-prevbookmark" resource="goto-prev-bookmark-16.png" size="Menu" />
- <StockIcon stockid="md-hammer" resource="hammer-16.png" size="Menu" />
- <StockIcon stockid="md-keyboard-shortcuts" resource="keyboard-shortcuts-16.png" size="Menu" />
- <StockIcon stockid="md-letters" resource="letters-16.png" size="Menu" />
- <StockIcon stockid="md-locale" resource="locale-16.png" size="Menu" />
- <StockIcon stockid="md-markers-rulers" resource="markers-rulers-16.png" size="Menu" />
- <StockIcon stockid="md-monkey" resource="monkey-16.png" size="Menu" />
<StockIcon stockid="md-monodevelop" resource="monodevelop-16.png" size="Menu" />
<StockIcon stockid="md-monodevelop" resource="monodevelop-22.png" />
<StockIcon stockid="md-monodevelop" resource="monodevelop-22.png" size="Button" />
@@ -228,15 +269,9 @@
<StockIcon stockid="md-new-solution" resource="solution-new-16.png" size="Menu" />
<StockIcon stockid="md-new-solution-folder" resource="solution-folder-new-16.png" size="Menu" />
<StockIcon stockid="md-replace-in-files" resource="replace-in-files-16.png" size="Menu" />
- <StockIcon stockid="md-save-all-icon" resource="save-all-16.png" size="Menu" />
<StockIcon stockid="md-select-all" resource="edit-select-all-16.png" size="Menu" />
- <StockIcon stockid="md-syntax-highlighting" resource="syntax-highlighting-16.png" size="Menu" />
- <StockIcon stockid="md-text-editor" resource="text-editor-16.png" size="Menu" />
- <StockIcon stockid="md-text-editor-behavior" resource="text-editor-behavior-16.png" size="Menu" />
- <StockIcon stockid="md-text-quickfix" resource="text-quickfix-16.png" size="Menu" />
<StockIcon stockid="md-toggle-bookmark" resource="toggle-bookmark-16.png" size="Menu" />
<StockIcon stockid="md-web-search-icon" resource="web-search-16.png" size="Menu" />
- <StockIcon stockid="sdk-locations" resource="sdk-locations-16.png" size="Menu" />
<!-- Status icons -->
<StockIcon stockid="md-status-build" animation="res:status-building-1-light-14.png;res:status-building-2-light-14.png;res:status-building-3-light-14.png;res:status-building-4-light-14.png;res:status-building-5-light-14.png" size="Menu" />
diff --git a/main/src/core/MonoDevelop.Ide/Makefile.am b/main/src/core/MonoDevelop.Ide/Makefile.am
index deb0ebdaf3..1056586d0a 100644
--- a/main/src/core/MonoDevelop.Ide/Makefile.am
+++ b/main/src/core/MonoDevelop.Ide/Makefile.am
@@ -1 +1,7 @@
-include $(top_srcdir)/xbuild.include \ No newline at end of file
+include $(top_srcdir)/xbuild.include
+
+EXTRA_DIST += \
+ gtkrc \
+ gtkrc.mac \
+ gtkrc.win32 \
+ gtkrc.win32-vista
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Commands/CommandCheckMenuItem.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Commands/CommandCheckMenuItem.cs
index a0fde12cf1..47e5a7aa42 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Commands/CommandCheckMenuItem.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Commands/CommandCheckMenuItem.cs
@@ -180,6 +180,7 @@ namespace MonoDevelop.Components.Commands
base.OnDestroyed ();
initialTarget = null;
arrayDataItem = null;
+ lastCmdInfo = null;
}
}
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Commands/CommandMenuItem.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Commands/CommandMenuItem.cs
index 2fd04db58e..df4cdae1de 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Commands/CommandMenuItem.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Commands/CommandMenuItem.cs
@@ -258,6 +258,7 @@ namespace MonoDevelop.Components.Commands
itemArray = null;
initialTarget = null;
arrayDataItem = null;
+ lastCmdInfo = null;
}
}
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/ConfigurationMerger.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/ConfigurationMerger.cs
index d32eb80443..b111883203 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/ConfigurationMerger.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/ConfigurationMerger.cs
@@ -126,6 +126,7 @@ namespace MonoDevelop.Components.MainToolbar
// There is no startup project, just use all solution configurations in this case
var p = new TargetPartition ();
p.SolutionConfigurations.AddRange (sol.GetConfigurations ());
+ partitions.Add (p);
}
// There can be several configurations with the same prefix and different platform but which build the same projects.
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/MainToolbar.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/MainToolbar.cs
index 33490e22d7..e67b86b3ff 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/MainToolbar.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/MainToolbar.cs
@@ -69,7 +69,7 @@ namespace MonoDevelop.Components.MainToolbar
StatusArea statusArea;
SearchEntry matchEntry;
- static object lastCommandTarget;
+ static WeakReference lastCommandTarget;
ButtonBar buttonBar = new ButtonBar ();
RoundButton button = new RoundButton ();
@@ -113,7 +113,7 @@ namespace MonoDevelop.Components.MainToolbar
}
internal static object LastCommandTarget {
- get { return lastCommandTarget; }
+ get { return lastCommandTarget != null ? lastCommandTarget.Target : null; }
}
void SetSearchCategory (string category)
@@ -330,7 +330,7 @@ namespace MonoDevelop.Components.MainToolbar
IdeApp.CommandService.RegisterCommandBar (this);
IdeApp.CommandService.ActiveWidgetChanged += (sender, e) => {
- lastCommandTarget = e.OldActiveWidget;
+ lastCommandTarget = new WeakReference (e.OldActiveWidget);
};
this.ShowAll ();
@@ -345,9 +345,12 @@ namespace MonoDevelop.Components.MainToolbar
protected override bool OnButtonPressEvent (Gdk.EventButton evnt)
{
- if (evnt.Button == 1 && evnt.Window == this.GdkWindow) {
- (Toplevel as Gtk.Window).BeginMoveDrag (1, (int)evnt.XRoot, (int)evnt.YRoot, evnt.Time);
- return true;
+ if (evnt.Button == 1 && evnt.Window == GdkWindow) {
+ var window = (Window)Toplevel;
+ if (!DesktopService.GetIsFullscreen (window)) {
+ window.BeginMoveDrag (1, (int)evnt.XRoot, (int)evnt.YRoot, evnt.Time);
+ return true;
+ }
}
return base.OnButtonPressEvent (evnt);
}
@@ -359,7 +362,7 @@ namespace MonoDevelop.Components.MainToolbar
currentSolution.Saved -= HandleSolutionSaved;
}
- currentSolution = IdeApp.ProjectOperations.CurrentSelectedSolution;
+ currentSolution = e.Solution;
if (currentSolution != null) {
currentSolution.StartupItemChanged += HandleStartupItemChanged;
@@ -913,6 +916,9 @@ namespace MonoDevelop.Components.MainToolbar
base.OnDestroyed ();
AddinManager.ExtensionChanged -= OnExtensionChanged;
+ if (button != null)
+ button.Clicked -= HandleStartButtonClicked;
+
if (Background != null) {
((IDisposable)Background).Dispose ();
Background = null;
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/CellRendererImage.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/CellRendererImage.cs
index 25a6cce614..3cd15e12d5 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/CellRendererImage.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/CellRendererImage.cs
@@ -26,6 +26,7 @@
using System;
using Xwt.Drawing;
using MonoDevelop.Core;
+using MonoDevelop.Ide;
namespace MonoDevelop.Components
{
@@ -37,6 +38,12 @@ namespace MonoDevelop.Components
IconId icon;
Gtk.IconSize stockSize = Gtk.IconSize.Menu;
+ /// <summary>
+ /// Image to be used to represent "no image". This is necessary since GLib.Value can't hold
+ /// null values for object that are not of subclasses of GLib.Object
+ /// </summary>
+ public static readonly Xwt.Drawing.Image NullImage = ImageService.GetIcon ("md-empty");
+
public CellRendererImage ()
{
}
@@ -136,8 +143,13 @@ namespace MonoDevelop.Components
protected void GetImageInfo (Gdk.Rectangle cell_area, out Image img, out int x, out int y)
{
img = GetImage ();
- x = (int)(cell_area.X + cell_area.Width / 2 - (int)(img.Width / 2));
- y = (int)(cell_area.Y + cell_area.Height / 2 - (int)(img.Height / 2));
+ if (img == null) {
+ x = (int)(cell_area.X + cell_area.Width / 2);
+ y = (int)(cell_area.Y + cell_area.Height / 2);
+ } else {
+ x = (int)(cell_area.X + cell_area.Width / 2 - (int)(img.Width / 2));
+ y = (int)(cell_area.Y + cell_area.Height / 2 - (int)(img.Height / 2));
+ }
}
public override void GetSize (Gtk.Widget widget, ref Gdk.Rectangle cell_area, out int x_offset, out int y_offset, out int width, out int height)
@@ -154,12 +166,15 @@ namespace MonoDevelop.Components
x_offset = y_offset = 0;
}
- Xwt.Drawing.Image GetImage ()
+ Image GetImage ()
{
+ Image img;
if (icon.IsNull)
- return IsExpanded ? (imageOpen ?? image) : (imageClosed ?? image);
+ img = IsExpanded ? (imageOpen ?? image) : (imageClosed ?? image);
else
- return Ide.ImageService.GetIcon (icon, stockSize);
+ img = ImageService.GetIcon (icon, stockSize);
+
+ return img != NullImage ? img : null;
}
}
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/DropDownBoxListWindow.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/DropDownBoxListWindow.cs
index 221301ab47..de70274ed6 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/DropDownBoxListWindow.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/DropDownBoxListWindow.cs
@@ -388,7 +388,7 @@ namespace MonoDevelop.Components
layout.Ellipsize = Pango.EllipsizeMode.End;
layout.Width = (Allocation.Width - xpos - iconWidth - 2) * (int)Pango.Scale.PangoScale;
- layout.SetMarkup (text);
+ layout.SetMarkup (PathBar.GetFirstLineFromMarkup (text));
int wi, he, typos, iypos;
layout.GetPixelSize (out wi, out he);
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/ImageLoader.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/ImageLoader.cs
index c10ffc603e..ec06229cd2 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/ImageLoader.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/ImageLoader.cs
@@ -70,14 +70,22 @@ namespace MonoDevelop.Components
}
).ContinueWith (t => {
try {
- // If the errorcode is NotModified the file we cached on disk is still the latest one.
if (t.IsFaulted) {
var wex = t.Exception.Flatten ().InnerException as WebException;
if (wex != null) {
var resp = wex.Response as HttpWebResponse;
- if (resp != null && resp.StatusCode == HttpStatusCode.NotModified) {
- Cleanup ();
- return;
+ if (resp != null) {
+ // If the errorcode is NotModified the file we cached on disk is still the latest one.
+ if (resp.StatusCode == HttpStatusCode.NotModified) {
+ Cleanup ();
+ return;
+ }
+ //if 404, there is no gravatar for the user
+ if (resp.StatusCode == HttpStatusCode.NotFound) {
+ image = null;
+ Cleanup ();
+ return;
+ }
}
}
}
@@ -97,14 +105,21 @@ namespace MonoDevelop.Components
LoadFromDisk (cachePath, true);
}
} catch (Exception ex) {
- LoggingService.LogError ("Error in image loader", ex);
+ var aex = ex as AggregateException;
+ if (aex != null)
+ ex = aex.Flatten ().InnerException;
+ var wex = ex as WebException;
+ if (wex != null && wex.Status.IsCannotReachInternetError ())
+ LoggingService.LogWarning ("Gravatar service could not be reached.");
+ else
+ LoggingService.LogError ("Error in Gravatar downloader.", ex);
Cleanup ();
} finally {
try {
if (File.Exists (tempPath))
File.Delete (tempPath);
} catch (Exception ex) {
- LoggingService.LogError ("Error deleting temp file", ex);
+ LoggingService.LogError ("Error deleting Gravatar temp file.", ex);
}
}
});
@@ -112,9 +127,7 @@ namespace MonoDevelop.Components
void Cleanup ()
{
- Xwt.Application.Invoke (delegate {
- UpdateImage (image, true);
- });
+ Xwt.Application.Invoke (() => UpdateImage (image, true));
}
void LoadFromDisk (string path, bool downloaded)
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PathBar.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PathBar.cs
index 43771179a2..22b65b1cb3 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PathBar.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PathBar.cs
@@ -33,6 +33,7 @@ using Gdk;
using MonoDevelop.Ide;
using MonoDevelop.Ide.Gui;
using Mono.TextEditor;
+using ICSharpCode.NRefactory;
namespace MonoDevelop.Components
{
@@ -165,6 +166,14 @@ namespace MonoDevelop.Components
this.createMenuForItem = createMenuForItem;
EnsureLayout ();
}
+
+ internal static string GetFirstLineFromMarkup (string markup)
+ {
+ var idx = markup.IndexOfAny (new [] { NewLine.CR, NewLine.LF });
+ if (idx >= 0)
+ return markup.Substring (0, idx);
+ return markup;
+ }
public new PathEntry[] Path { get; private set; }
public int ActiveIndex { get { return activeIndex; } }
@@ -271,7 +280,7 @@ namespace MonoDevelop.Components
}
layout.Attributes = (i == activeIndex) ? boldAtts : null;
- layout.SetMarkup (leftPath [i].Markup);
+ layout.SetMarkup (GetFirstLineFromMarkup (leftPath [i].Markup));
ctx.Save ();
@@ -329,7 +338,7 @@ namespace MonoDevelop.Components
}
layout.Attributes = (i == activeIndex) ? boldAtts : null;
- layout.SetMarkup (rightPath [i].Markup);
+ layout.SetMarkup (GetFirstLineFromMarkup (rightPath [i].Markup));
ctx.Save ();
@@ -619,7 +628,7 @@ namespace MonoDevelop.Components
for (int i = 0; i < path.Length; i++) {
layout.Attributes = (i == activeIndex)? boldAtts : null;
- layout.SetMarkup (path[i].Markup);
+ layout.SetMarkup (GetFirstLineFromMarkup (path[i].Markup));
layout.Width = -1;
int w, h;
layout.GetPixelSize (out w, out h);
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ListWidget.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ListWidget.cs
index 68a0b8bb23..391c9f1cd3 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ListWidget.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ListWidget.cs
@@ -604,13 +604,13 @@ namespace MonoDevelop.Ide.CodeCompletion
internal List<int> filteredItems = new List<int> ();
- Category GetCategory (CompletionCategory completionCategory)
+ static Category GetCategory (List<Category> categories, CompletionCategory completionCategory)
{
- foreach (Category cat in categories) {
+ foreach (var cat in categories) {
if (cat.CompletionCategory == completionCategory)
return cat;
}
- Category result = new Category ();
+ var result = new Category ();
result.CompletionCategory = completionCategory;
if (completionCategory == null) {
categories.Add (result);
@@ -623,14 +623,14 @@ namespace MonoDevelop.Ide.CodeCompletion
string oldCompletionString = null;
public void FilterWords ()
{
- categories.Clear ();
+ var newCategories = new List<Category> ();
var matcher = CompletionMatcher.CreateCompletionMatcher (CompletionString);
if (oldCompletionString == null || !CompletionString.StartsWith (oldCompletionString)) {
filteredItems.Clear ();
for (int newSelection = 0; newSelection < win.DataProvider.ItemCount; newSelection++) {
if (string.IsNullOrEmpty (CompletionString) || matcher.IsMatch (win.DataProvider.GetText (newSelection))) {
var completionCategory = win.DataProvider.GetCompletionCategory (newSelection);
- GetCategory (completionCategory).Items.Add (newSelection);
+ GetCategory (newCategories, completionCategory).Items.Add (newSelection);
filteredItems.Add (newSelection);
}
}
@@ -640,7 +640,7 @@ namespace MonoDevelop.Ide.CodeCompletion
foreach (int newSelection in oldItems) {
if (string.IsNullOrEmpty (CompletionString) || matcher.IsMatch (win.DataProvider.GetText (newSelection))) {
var completionCategory = win.DataProvider.GetCompletionCategory (newSelection);
- GetCategory (completionCategory).Items.Add (newSelection);
+ GetCategory (newCategories, completionCategory).Items.Add (newSelection);
filteredItems.Add (newSelection);
}
}
@@ -649,10 +649,11 @@ namespace MonoDevelop.Ide.CodeCompletion
filteredItems.Sort (delegate (int left, int right) {
return win.DataProvider.CompareTo (left, right);
});
- categories.Sort (delegate (Category left, Category right) {
+ newCategories.Sort (delegate (Category left, Category right) {
return left.CompletionCategory != null ? left.CompletionCategory.CompareTo (right.CompletionCategory) : -1;
});
-
+ categories = newCategories;
+
SelectFirstItemInCategory ();
CalcVisibleRows ();
SetAdjustments ();
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindow.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindow.cs
index 1da5e34f58..d0e2b9eb89 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindow.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindow.cs
@@ -76,6 +76,7 @@ namespace MonoDevelop.Ide.CodeCompletion
this.AllowGrow = false;
this.CanFocus = false;
this.CanDefault = false;
+ Mono.TextEditor.PopupWindow.WindowTransparencyDecorator.Attach (this);
headlabel = new MonoDevelop.Components.FixedWidthWrapLabel ();
headlabel.Indent = -20;
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Commands/ProjectCommands.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Commands/ProjectCommands.cs
index 9ab0b31cdb..4f6b0d1812 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Commands/ProjectCommands.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Commands/ProjectCommands.cs
@@ -563,8 +563,7 @@ namespace MonoDevelop.Ide.Commands
protected override void Run ()
{
ApplyPolicyDialog dlg = new ApplyPolicyDialog ((IPolicyProvider)IdeApp.ProjectOperations.CurrentSelectedSolutionItem ?? (IPolicyProvider)IdeApp.ProjectOperations.CurrentSelectedSolution);
- MessageService.RunCustomDialog (dlg);
- dlg.Destroy ();
+ MessageService.ShowCustomDialog (dlg);
}
}
@@ -578,8 +577,7 @@ namespace MonoDevelop.Ide.Commands
protected override void Run ()
{
ExportProjectPolicyDialog dlg = new ExportProjectPolicyDialog ((IPolicyProvider)IdeApp.ProjectOperations.CurrentSelectedSolutionItem ?? (IPolicyProvider)IdeApp.ProjectOperations.CurrentSelectedSolution);
- MessageService.RunCustomDialog (dlg);
- dlg.Destroy ();
+ MessageService.ShowCustomDialog (dlg);
}
}
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CustomTools/ResXFileCodeGenerator.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CustomTools/ResXFileCodeGenerator.cs
index 4463ce0235..d38aba3a2d 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CustomTools/ResXFileCodeGenerator.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CustomTools/ResXFileCodeGenerator.cs
@@ -41,6 +41,9 @@ using System.CodeDom.Compiler;
using System.CodeDom;
using System.Linq;
using MonoDevelop.Core.Assemblies;
+using System.Resources;
+using System.Collections.Generic;
+using System.Collections;
namespace MonoDevelop.Ide.CustomTools
{
@@ -71,10 +74,20 @@ namespace MonoDevelop.Ide.CustomTools
var outputfile = file.FilePath.ChangeExtension (".Designer." + provider.FileExtension);
var ns = CustomToolService.GetFileNamespace (file, outputfile);
var cn = provider.CreateValidIdentifier (file.FilePath.FileNameWithoutExtension);
+ var rd = new Dictionary<object, object> ();
- string[] unmatchable;
- var ccu = StronglyTypedResourceBuilder.Create (file.FilePath, cn, ns, provider, internalClass, out unmatchable);
+ using (var r = new ResXResourceReader (file.FilePath)) {
+ r.UseResXDataNodes = true;
+ r.BasePath = Path.GetDirectoryName (file.FilePath.ParentDirectory);
+
+ foreach (DictionaryEntry e in r) {
+ rd.Add (e.Key, e.Value);
+ }
+ }
+ string[] unmatchable;
+ var ccu = StronglyTypedResourceBuilder.Create (rd, cn, ns, provider, internalClass, out unmatchable);
+
if (TargetsPcl2Framework (dnp)) {
FixupPclTypeInfo (ccu);
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/ReferencesFinder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/ReferencesFinder.cs
index 8958d18654..0600d9f415 100755
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/ReferencesFinder.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/ReferencesFinder.cs
@@ -226,11 +226,16 @@ namespace MonoDevelop.Ide.FindInFiles
// execute search
if (monitor != null)
monitor.BeginTask (GettextCatalog.GetString ("Analyzing files..."), totalFiles);
+ var foundOccurrences = new HashSet<Tuple<string, DomRegion>> ();
foreach (var tuple in preparedFinders) {
var finder = tuple.Item1;
foreach (var foundReference in finder.FindReferences (tuple.Item2, tuple.Item3, tuple.Item4, monitor, searchNodes)) {
if (monitor != null && monitor.IsCancelRequested)
yield break;
+ var tag = Tuple.Create (foundReference.FileName, foundReference.Region);
+ if (foundOccurrences.Contains (tag))
+ continue;
+ foundOccurrences.Add (tag);
yield return foundReference;
}
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/SearchResult.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/SearchResult.cs
index cabf29ab2e..a5fece4cfb 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/SearchResult.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/SearchResult.cs
@@ -25,7 +25,10 @@
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-using Mono.TextEditor.Highlighting;
+
+using Mono.TextEditor.Highlighting;
+using MonoDevelop.Projects;
+using System.Collections.Generic;
namespace MonoDevelop.Ide.FindInFiles
{
@@ -63,10 +66,25 @@ namespace MonoDevelop.Ide.FindInFiles
set;
}
- public Xwt.Drawing.Image Icon {
+ public Xwt.Drawing.Image FileIcon {
+ get;
+ set;
+ }
+
+ public Xwt.Drawing.Image ProjectIcon {
get;
set;
}
+
+ private List<Project> projects;
+ public List<Project> Projects {
+ get {
+ if (projects == null) {
+ projects = new List<Project> (IdeApp.Workspace.GetProjectsContainingFile (FileName));
+ }
+ return projects;
+ }
+ }
#endregion
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/SearchResultWidget.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/SearchResultWidget.cs
index ad56b94d6c..35c90f9a7c 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/SearchResultWidget.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/SearchResultWidget.cs
@@ -118,14 +118,28 @@ namespace MonoDevelop.Ide.FindInFiles
resultsScroll.Add (treeviewSearchResults);
this.ShowAll ();
-
- var fileNameColumn = new TreeViewColumn {
+
+ var projectColumn = new TreeViewColumn {
Resizable = true,
SortColumnId = 0,
- Title = GettextCatalog.GetString("File")
+ Title = GettextCatalog.GetString ("Project"),
+ FixedWidth = 100
};
- fileNameColumn.FixedWidth = 200;
+ var projectPixbufRenderer = new CellRendererImage ();
+ projectColumn.PackStart (projectPixbufRenderer, false);
+ projectColumn.SetCellDataFunc (projectPixbufRenderer, ResultProjectIconDataFunc);
+
+ projectColumn.PackStart (treeviewSearchResults.TextRenderer, true);
+ projectColumn.SetCellDataFunc (treeviewSearchResults.TextRenderer, ResultProjectDataFunc);
+ treeviewSearchResults.AppendColumn (projectColumn);
+
+ var fileNameColumn = new TreeViewColumn {
+ Resizable = true,
+ SortColumnId = 1,
+ Title = GettextCatalog.GetString ("File"),
+ FixedWidth = 200
+ };
var fileNamePixbufRenderer = new CellRendererImage ();
fileNameColumn.PackStart (fileNamePixbufRenderer, false);
@@ -134,12 +148,8 @@ namespace MonoDevelop.Ide.FindInFiles
fileNameColumn.PackStart (treeviewSearchResults.TextRenderer, true);
fileNameColumn.SetCellDataFunc (treeviewSearchResults.TextRenderer, FileNameDataFunc);
treeviewSearchResults.AppendColumn (fileNameColumn);
-
-// TreeViewColumn lineColumn = treeviewSearchResults.AppendColumn (GettextCatalog.GetString ("Line"), new CellRendererText (), ResultLineDataFunc);
-// lineColumn.SortColumnId = 1;
-// lineColumn.FixedWidth = 50;
-//
-
+
+
TreeViewColumn textColumn = treeviewSearchResults.AppendColumn (GettextCatalog.GetString ("Text"),
treeviewSearchResults.TextRenderer, ResultTextDataFunc);
textColumn.SortColumnId = 2;
@@ -153,9 +163,9 @@ namespace MonoDevelop.Ide.FindInFiles
pathColumn.Resizable = true;
pathColumn.FixedWidth = 500;
-
- store.SetSortFunc (0, CompareFileNames);
-// store.SetSortFunc (1, CompareLineNumbers);
+
+ store.SetSortFunc (0, CompareProjectFileNames);
+ store.SetSortFunc (1, CompareFileNames);
store.SetSortFunc (3, CompareFilePaths);
treeviewSearchResults.RowActivated += TreeviewSearchResultsRowActivated;
@@ -163,7 +173,7 @@ namespace MonoDevelop.Ide.FindInFiles
buttonStop = new ToolButton (Ide.Gui.Stock.Stop) { Sensitive = false };
buttonStop.Clicked += ButtonStopClicked;
-
+
buttonStop.TooltipText = GettextCatalog.GetString ("Stop");
toolbar.Insert (buttonStop, -1);
@@ -193,11 +203,6 @@ namespace MonoDevelop.Ide.FindInFiles
base.OnRealized ();
highlightStyle = SyntaxModeService.GetColorStyle (IdeApp.Preferences.ColorScheme);
}
-
- protected override void OnStyleSet (Gtk.Style previousStyle)
- {
- base.OnStyleSet (previousStyle);
- }
void ButtonPinClicked (object sender, EventArgs e)
{
@@ -243,8 +248,8 @@ namespace MonoDevelop.Ide.FindInFiles
public void EndProgress ()
{
buttonStop.Sensitive = false;
- newStore.SetSortFunc (0, CompareFileNames);
- newStore.SetSortFunc (1, CompareLineNumbers);
+ newStore.SetSortFunc (0, CompareProjectFileNames);
+ newStore.SetSortFunc (1, CompareFileNames);
newStore.SetSortFunc (3, CompareFilePaths);
treeviewSearchResults.Model = newStore;
@@ -305,7 +310,6 @@ namespace MonoDevelop.Ide.FindInFiles
int offset = 0;
-
// This is a workaround for Bug 559804 - Strings in search result pad are near-invisible
// On mac it's not possible to get the white background color with the Base or Background
// methods. If this bug is fixed or a better work around is found - remove this hack.
@@ -356,9 +360,9 @@ namespace MonoDevelop.Ide.FindInFiles
var searchResult = (SearchResult)store.GetValue (iter, SearchResultColumn);
if (searchResult == null)
return;
- if (searchResult.Icon == null)
- searchResult.Icon = DesktopService.GetIconForFile (searchResult.FileName, IconSize.Menu);
- fileNamePixbufRenderer.Image = searchResult.Icon;
+ if (searchResult.FileIcon == null)
+ searchResult.FileIcon = DesktopService.GetIconForFile (searchResult.FileName, IconSize.Menu);
+ fileNamePixbufRenderer.Image = searchResult.FileIcon;
}
@@ -406,7 +410,18 @@ namespace MonoDevelop.Ide.FindInFiles
return -1;
return System.IO.Path.GetFileName (searchResult1.FileName).CompareTo (System.IO.Path.GetFileName (searchResult2.FileName));
}
-
+
+ static int CompareProjectFileNames (TreeModel model, TreeIter first, TreeIter second)
+ {
+ var searchResult1 = (SearchResult)model.GetValue (first, SearchResultColumn);
+ var searchResult2 = (SearchResult)model.GetValue (second, SearchResultColumn);
+ if (searchResult1 == null || searchResult2 == null ||
+ searchResult1.Projects == null || searchResult2.Projects == null ||
+ searchResult1.Projects.Count == 0 || searchResult2.Projects.Count == 0)
+ return -1;
+ return System.IO.Path.GetFileName (searchResult1.Projects[0].FileName).CompareTo (System.IO.Path.GetFileName (searchResult2.Projects[0].FileName));
+ }
+
static int CompareFilePaths (TreeModel model, TreeIter first, TreeIter second)
{
var searchResult1 = (SearchResult)model.GetValue (first, SearchResultColumn);
@@ -429,22 +444,35 @@ namespace MonoDevelop.Ide.FindInFiles
bool didRead = (bool)store.GetValue (iter, DidReadColumn);
pathRenderer.Markup = MarkupText (System.IO.Path.GetDirectoryName (searchResult.FileName), didRead);
}
-
-// void ResultLineDataFunc (TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
-// {
-// if (TreeIter.Zero.Equals (iter))
-// return;
-// var lineRenderer = (CellRendererText)cell;
-// var searchResult = (SearchResult)store.GetValue (iter, SearchResultColumn);
-// if (searchResult == null)
-// return;
-//
-// Document doc = GetDocument (searchResult);
-// int lineNr = doc.OffsetToLineNumber (searchResult.Offset) + 1;
-// bool didRead = (bool)store.GetValue (iter, DidReadColumn);
-// lineRenderer.Markup = MarkupText (lineNr.ToString (), didRead);
-// }
-//
+
+ void ResultProjectIconDataFunc (TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
+ {
+ if (TreeIter.Zero.Equals (iter))
+ return;
+ var fileNamePixbufRenderer = (CellRendererImage) cell;
+ var searchResult = (SearchResult)store.GetValue (iter, SearchResultColumn);
+ if (searchResult == null)
+ return;
+ if (searchResult.ProjectIcon == null && searchResult.Projects.Count > 0)
+ searchResult.ProjectIcon = ImageService.GetIcon (searchResult.Projects [0].StockIcon).WithSize (Gtk.IconSize.Menu);
+ fileNamePixbufRenderer.Image = searchResult.ProjectIcon;
+ }
+
+ void ResultProjectDataFunc (TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
+ {
+ if (TreeIter.Zero.Equals (iter))
+ return;
+ var pathRenderer = (CellRendererText)cell;
+ var searchResult = (SearchResult)store.GetValue (iter, SearchResultColumn);
+ if (searchResult == null)
+ return;
+ bool didRead = (bool)store.GetValue (iter, DidReadColumn);
+ if (searchResult.Projects.Count > 0)
+ pathRenderer.Markup = MarkupText (String.Join (", ", searchResult.Projects.Select (p => p.Name)), didRead);
+ else
+ pathRenderer.Markup = "";
+ }
+
void ResultTextDataFunc (TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
{
if (TreeIter.Zero.Equals (iter))
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Fonts/FontService.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Fonts/FontService.cs
index 7c960bfde5..87f565324d 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Fonts/FontService.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Fonts/FontService.cs
@@ -93,6 +93,9 @@ namespace MonoDevelop.Ide.Fonts
public static FontDescription MonospaceFont { get { return defaultMonospaceFont; } }
public static FontDescription SansFont { get { return defaultSansFont; } }
+ public static string MonospaceFontName { get { return defaultMonospaceFontName; } }
+ public static string SansFontName { get { return defaultSansFontName; } }
+
[Obsolete ("Use MonospaceFont")]
public static FontDescription DefaultMonospaceFontDescription {
get {
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/ExtensibleTreeView.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/ExtensibleTreeView.cs
index 19a08ca54a..59359ce981 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/ExtensibleTreeView.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/ExtensibleTreeView.cs
@@ -88,6 +88,7 @@ namespace MonoDevelop.Ide.Gui.Components
TreeNodeNavigator workNode;
TreeNodeNavigator compareNode1;
TreeNodeNavigator compareNode2;
+
internal bool sorting;
object[] copyObjects;
@@ -1461,6 +1462,8 @@ namespace MonoDevelop.Ide.Gui.Components
return string.Compare (tb1.GetNodeName (compareNode1, o1), tb2.GetNodeName (compareNode2, o2), true);
} finally {
sorting = false;
+ compareNode1.MoveToIter (Gtk.TreeIter.Zero);
+ compareNode2.MoveToIter (Gtk.TreeIter.Zero);
}
}
@@ -1655,6 +1658,8 @@ namespace MonoDevelop.Ide.Gui.Components
sb.Insert (0, name);
} while (workNode.MoveToParent ());
+ workNode.MoveToIter (Gtk.TreeIter.Zero);
+
return sb.ToString ();
}
@@ -2575,14 +2580,14 @@ namespace MonoDevelop.Ide.Gui.Components
Xwt.Drawing.Image GetResized (Xwt.Drawing.Image value)
{
- if (zoom == 1)
- return value;
-
//this can happen during solution deserialization if the project is unrecognized
//because a line is added into the treeview with no icon
- if (value == null)
+ if (value == null || value == CellRendererImage.NullImage)
return null;
+ if (zoom == 1)
+ return value;
+
Xwt.Drawing.Image resized;
if (resizedCache.TryGetValue (value, out resized))
return resized;
@@ -2618,14 +2623,17 @@ namespace MonoDevelop.Ide.Gui.Components
Xwt.Drawing.Image image;
GetImageInfo (cell_area, out image, out x, out y);
+ if (image == null)
+ return;
+
using (var ctx = Gdk.CairoHelper.Create (window)) {
- if (overlayBottomLeft != null)
+ if (overlayBottomLeft != null && overlayBottomLeft != NullImage)
ctx.DrawImage (widget, overlayBottomLeft, x - overlayOverflow, y + image.Height - overlayBottomLeft.Height + overlayOverflow);
- if (overlayBottomRight != null)
+ if (overlayBottomRight != null && overlayBottomRight != NullImage)
ctx.DrawImage (widget, overlayBottomRight, x + image.Width - overlayBottomRight.Width + overlayOverflow, y + image.Height - overlayBottomRight.Height + overlayOverflow);
- if (overlayTopLeft != null)
+ if (overlayTopLeft != null && overlayTopLeft != NullImage)
ctx.DrawImage (widget, overlayTopLeft, x - overlayOverflow, y - overlayOverflow);
- if (overlayTopRight != null)
+ if (overlayTopRight != null && overlayTopRight != NullImage)
ctx.DrawImage (widget, overlayTopRight, x + image.Width - overlayTopRight.Width + overlayOverflow, y - overlayOverflow);
}
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/LogView.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/LogView.cs
index 57901d5512..b8944e730f 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/LogView.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/LogView.cs
@@ -41,19 +41,20 @@ namespace MonoDevelop.Ide.Gui.Components
{
public class LogView : MonoDevelop.Components.CompactScrolledWindow
{
- Gtk.TextBuffer buffer;
- Gtk.TextView textEditorControl;
+ TextBuffer buffer;
+ TextView textEditorControl;
TextMark endMark;
TextTag tag;
TextTag bold;
TextTag errorTag;
TextTag consoleLogTag;
+ TextTag debugTag;
int ident = 0;
List<TextTag> tags = new List<TextTag> ();
Stack<string> indents = new Stack<string> ();
- Queue<QueuedUpdate> updates = new Queue<QueuedUpdate> ();
+ readonly Queue<QueuedUpdate> updates = new Queue<QueuedUpdate> ();
QueuedTextWrite lastTextWrite;
GLib.TimeoutHandler outputDispatcher;
bool outputDispatcherRunning = false;
@@ -66,7 +67,7 @@ namespace MonoDevelop.Ide.Gui.Components
/// </summary>
public class LogTextView : TextView
{
- public LogTextView (Gtk.TextBuffer buf) : base (buf)
+ public LogTextView (TextBuffer buf) : base (buf)
{
}
@@ -74,7 +75,6 @@ namespace MonoDevelop.Ide.Gui.Components
{
}
-
static readonly Regex lineRegex = new Regex ("\\b.*\\s(?<file>(\\w:)?[/\\\\].*):(\\w+\\s)?(?<line>\\d+)\\.?\\s*$", RegexOptions.Compiled);
internal static bool TryExtractFileAndLine (string lineText, out string file, out int line)
@@ -83,11 +83,8 @@ namespace MonoDevelop.Ide.Gui.Components
if (match.Success) {
file = match.Groups["file"].Value;
string lineNumberText = match.Groups["line"].Value;
- try {
- line = int.Parse (lineNumberText);
+ if (int.TryParse (lineNumberText, out line))
return true;
- } catch (Exception) {
- }
}
file = null;
line = 0;
@@ -97,11 +94,11 @@ namespace MonoDevelop.Ide.Gui.Components
protected override bool OnButtonPressEvent (Gdk.EventButton evnt)
{
if (evnt.Type == Gdk.EventType.TwoButtonPress) {
- var cursorPos = base.Buffer.GetIterAtOffset (this.Buffer.CursorPosition);
-
+ var cursorPos = Buffer.GetIterAtOffset (Buffer.CursorPosition);
TextIter iterStart;
TextIter iterEnd;
string lineText;
+
try {
iterStart = Buffer.GetIterAtLine (cursorPos.Line);
iterEnd = Buffer.GetIterAtOffset (iterStart.Offset + iterStart.CharsInLine);
@@ -123,7 +120,7 @@ namespace MonoDevelop.Ide.Gui.Components
fileExists = false;
}
if (fileExists)
- IdeApp.Workbench.OpenDocument (file, lineNumber, 1);
+ IdeApp.Workbench.OpenDocument (file, null, lineNumber, 1);
}
}
}
@@ -133,7 +130,7 @@ namespace MonoDevelop.Ide.Gui.Components
public LogView ()
{
- buffer = new Gtk.TextBuffer (new Gtk.TextTagTable ());
+ buffer = new TextBuffer (new TextTagTable ());
textEditorControl = new LogTextView (buffer);
textEditorControl.Editable = false;
@@ -141,14 +138,18 @@ namespace MonoDevelop.Ide.Gui.Components
Add (textEditorControl);
bold = new TextTag ("bold");
- bold.Weight = Pango.Weight.Bold;
+ bold.Weight = Weight.Bold;
buffer.TagTable.Add (bold);
errorTag = new TextTag ("error");
- errorTag.Foreground = "red";
- errorTag.Weight = Pango.Weight.Bold;
+ errorTag.Foreground = "#dc3122";
+ errorTag.Weight = Weight.Bold;
buffer.TagTable.Add (errorTag);
-
+
+ debugTag = new TextTag ("debug");
+ debugTag.Foreground = "#256ada";
+ buffer.TagTable.Add (debugTag);
+
consoleLogTag = new TextTag ("consoleLog");
consoleLogTag.Foreground = "darkgrey";
buffer.TagTable.Add (consoleLogTag);
@@ -171,6 +172,7 @@ namespace MonoDevelop.Ide.Gui.Components
{
TextIter start;
TextIter end;
+
if (buffer.HasSelection && buffer.GetSelectionBounds (out start, out end)) {
var text = buffer.GetText (start, end, false);
var clipboard = Clipboard.Get (Gdk.Atom.Intern ("CLIPBOARD", false));
@@ -215,14 +217,16 @@ namespace MonoDevelop.Ide.Gui.Components
if (updates.Count == 0) {
outputDispatcherRunning = false;
return false;
- } else if (!outputDispatcherRunning) {
+ }
+
+ if (!outputDispatcherRunning) {
updates.Clear ();
return false;
- } else {
- while (updates.Count > 0) {
- QueuedUpdate up = updates.Dequeue ();
- up.Execute (this);
- }
+ }
+
+ while (updates.Count > 0) {
+ var up = updates.Dequeue ();
+ up.Execute (this);
}
}
return true;
@@ -248,20 +252,19 @@ namespace MonoDevelop.Ide.Gui.Components
} else
indents.Push (null);
- if (name != null) {
+ if (name != null)
UnsafeAddText (Environment.NewLine + name + Environment.NewLine, bold);
- }
}
public void BeginTask (string name, int totalWork)
{
- QueuedBeginTask bt = new QueuedBeginTask (name, totalWork);
+ var bt = new QueuedBeginTask (name, totalWork);
addQueuedUpdate (bt);
}
public void EndTask ()
{
- QueuedEndTask et = new QueuedEndTask ();
+ var et = new QueuedEndTask ();
addQueuedUpdate (et);
}
@@ -282,7 +285,8 @@ namespace MonoDevelop.Ide.Gui.Components
}
}
}
- QueuedTextWrite qtw = new QueuedTextWrite (text, null);
+
+ var qtw = new QueuedTextWrite (text, null);
addQueuedUpdate (qtw);
}
@@ -294,32 +298,40 @@ namespace MonoDevelop.Ide.Gui.Components
return;
}
}
- QueuedTextWrite w = new QueuedTextWrite (text, consoleLogTag);
+
+ var w = new QueuedTextWrite (text, consoleLogTag);
addQueuedUpdate (w);
}
public void WriteError (string text)
{
- QueuedTextWrite w = new QueuedTextWrite (text, errorTag);
+ var w = new QueuedTextWrite (text, errorTag);
addQueuedUpdate (w);
}
+
+ public void WriteDebug (int level, string category, string message)
+ {
+ //TODO: Give user ability to filter levels and categories
+ if (string.IsNullOrEmpty (category))
+ addQueuedUpdate (new QueuedTextWrite (message, debugTag));
+ else
+ addQueuedUpdate (new QueuedTextWrite (category + ": " + message, debugTag));
+ }
protected void UnsafeAddText (string text, TextTag extraTag)
{
//don't allow the pad to hold more than MAX_BUFFER_LENGTH chars
int overrun = (buffer.CharCount + text.Length) - MAX_BUFFER_LENGTH;
+
if (overrun > 0) {
TextIter start = buffer.StartIter;
TextIter end = buffer.GetIterAtOffset (overrun);
buffer.Delete (ref start, ref end);
}
-
+
+ bool scrollToEnd = Vadjustment.Value >= Vadjustment.Upper - 2 * Vadjustment.PageSize;
TextIter it = buffer.EndIter;
- ScrolledWindow window = textEditorControl.Parent as ScrolledWindow;
- bool scrollToEnd = true;
- if (window != null) {
- scrollToEnd = window.Vadjustment.Value >= window.Vadjustment.Upper - 2 * window.Vadjustment.PageSize;
- }
+
if (extraTag != null)
buffer.InsertWithTags (ref it, text, tag, extraTag);
else
@@ -364,15 +376,16 @@ namespace MonoDevelop.Ide.Gui.Components
IdeApp.Preferences.CustomOutputPadFontChanged -= HandleCustomFontChanged;
}
- private abstract class QueuedUpdate
+ abstract class QueuedUpdate
{
public abstract void Execute (LogView pad);
}
- private class QueuedTextWrite : QueuedUpdate
+ class QueuedTextWrite : QueuedUpdate
{
- private System.Text.StringBuilder Text;
+ readonly System.Text.StringBuilder Text;
public TextTag Tag;
+
public override void Execute (LogView pad)
{
pad.UnsafeAddText (Text.ToString (), Tag);
@@ -392,7 +405,7 @@ namespace MonoDevelop.Ide.Gui.Components
}
}
- private class QueuedBeginTask : QueuedUpdate
+ class QueuedBeginTask : QueuedUpdate
{
public string Name;
public int TotalWork;
@@ -408,7 +421,7 @@ namespace MonoDevelop.Ide.Gui.Components
}
}
- private class QueuedEndTask : QueuedUpdate
+ class QueuedEndTask : QueuedUpdate
{
public override void Execute (LogView pad)
{
@@ -417,17 +430,18 @@ namespace MonoDevelop.Ide.Gui.Components
}
}
- public class LogViewProgressMonitor : NullProgressMonitor, IConsole
+ public class LogViewProgressMonitor : NullProgressMonitor, IDebugConsole
{
LogView outputPad;
event EventHandler stopRequested;
LogTextWriter logger = new LogTextWriter ();
LogTextWriter internalLogger = new LogTextWriter ();
+ LogTextWriter errorLogger = new LogTextWriter();
NotSupportedTextReader inputReader = new NotSupportedTextReader ();
public LogView LogView {
- get { return this.outputPad; }
+ get { return outputPad; }
}
public LogViewProgressMonitor (LogView pad)
@@ -436,6 +450,7 @@ namespace MonoDevelop.Ide.Gui.Components
outputPad.Clear ();
logger.TextWritten += outputPad.WriteText;
internalLogger.TextWritten += outputPad.WriteConsoleLogText;
+ errorLogger.TextWritten += outputPad.WriteError;
}
public override void BeginTask (string name, int totalWork)
@@ -500,8 +515,13 @@ namespace MonoDevelop.Ide.Gui.Components
}
TextWriter IConsole.Error {
- get { return logger; }
+ get { return errorLogger; }
}
+
+ void IDebugConsole.Debug (int level, string category, string message)
+ {
+ outputPad.WriteDebug (level, category, message);
+ }
bool IConsole.CloseOnDispose {
get { return false; }
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/PadTreeView.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/PadTreeView.cs
index e832d127d5..fed5414ad4 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/PadTreeView.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/PadTreeView.cs
@@ -63,7 +63,7 @@ namespace MonoDevelop.Ide.Gui.Components
changer.Dispose ();
changer = null;
}
- base.Dispose ();
+ base.OnDestroyed ();
}
// Workaround for Bug 1698 - Error list scroll position doesn't reset when list changes, hides items
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/TransactedTreeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/TransactedTreeBuilder.cs
index e2e09bed33..7f26bb49af 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/TransactedTreeBuilder.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/TransactedTreeBuilder.cs
@@ -29,6 +29,7 @@ using System;
using System.Collections.Generic;
using MonoDevelop.Core;
using System.Collections;
+using MonoDevelop.Components;
namespace MonoDevelop.Ide.Gui.Components
{
@@ -834,22 +835,16 @@ namespace MonoDevelop.Ide.Gui.Components
return;
}
tree.Store.SetValue (node.NodeIter, ExtensibleTreeView.TextColumn, node.NodeInfo.Label);
- if (node.NodeInfo.Icon != null)
- tree.Store.SetValue (node.NodeIter, ExtensibleTreeView.OpenIconColumn, node.NodeInfo.Icon);
- if (node.NodeInfo.ClosedIcon != null)
- tree.Store.SetValue (node.NodeIter, ExtensibleTreeView.ClosedIconColumn, node.NodeInfo.ClosedIcon);
- if (node.NodeInfo.OverlayBottomRight != null)
- tree.Store.SetValue (node.NodeIter, ExtensibleTreeView.OverlayBottomRightColumn, node.NodeInfo.OverlayBottomRight);
- if (node.NodeInfo.OverlayBottomLeft != null)
- tree.Store.SetValue (node.NodeIter, ExtensibleTreeView.OverlayBottomLeftColumn, node.NodeInfo.OverlayBottomLeft);
- if (node.NodeInfo.OverlayTopLeft != null)
- tree.Store.SetValue (node.NodeIter, ExtensibleTreeView.OverlayTopLeftColumn, node.NodeInfo.OverlayTopLeft);
- if (node.NodeInfo.OverlayTopRight != null)
- tree.Store.SetValue (node.NodeIter, ExtensibleTreeView.OverlayTopRightColumn, node.NodeInfo.OverlayTopRight);
+ tree.Store.SetValue (node.NodeIter, ExtensibleTreeView.OpenIconColumn, node.NodeInfo.Icon ?? CellRendererImage.NullImage);
+ tree.Store.SetValue (node.NodeIter, ExtensibleTreeView.ClosedIconColumn, node.NodeInfo.ClosedIcon ?? CellRendererImage.NullImage);
+ tree.Store.SetValue (node.NodeIter, ExtensibleTreeView.OverlayBottomRightColumn, node.NodeInfo.OverlayBottomRight ?? CellRendererImage.NullImage);
+ tree.Store.SetValue (node.NodeIter, ExtensibleTreeView.OverlayBottomLeftColumn, node.NodeInfo.OverlayBottomLeft ?? CellRendererImage.NullImage);
+ tree.Store.SetValue (node.NodeIter, ExtensibleTreeView.OverlayTopLeftColumn, node.NodeInfo.OverlayTopLeft ?? CellRendererImage.NullImage);
+ tree.Store.SetValue (node.NodeIter, ExtensibleTreeView.OverlayTopRightColumn, node.NodeInfo.OverlayTopRight ?? CellRendererImage.NullImage);
}
if (node.Children != null) {
foreach (TreeNode cn in node.Children) {
- Gtk.TreeIter it = tree.Store.AppendValues (node.NodeIter, cn.NodeInfo.Label, cn.NodeInfo.Icon, cn.NodeInfo.ClosedIcon, cn.DataItem, cn.BuilderChain, cn.Filled);
+ Gtk.TreeIter it = tree.Store.AppendValues (node.NodeIter, cn.NodeInfo.Label, cn.NodeInfo.Icon, cn.NodeInfo.ClosedIcon, cn.DataItem, cn.BuilderChain, cn.Filled, false, cn.NodeInfo.OverlayBottomRight, cn.NodeInfo.OverlayBottomLeft, cn.NodeInfo.OverlayTopLeft, cn.NodeInfo.OverlayTopRight);
if (!cn.Filled)
tree.Store.AppendNode (it); // Dummy node
// The OnNodeAdded event was already fired when the node was added. There is no need to fire it again.
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/TreeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/TreeBuilder.cs
index a768592e14..6f064e368f 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/TreeBuilder.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/TreeBuilder.cs
@@ -320,12 +320,12 @@ namespace MonoDevelop.Ide.Gui.Components
void SetNodeInfo (Gtk.TreeIter it, NodeAttributes ats, NodeInfo nodeInfo)
{
store.SetValue (it, ExtensibleTreeView.TextColumn, nodeInfo.Label);
- if (nodeInfo.Icon != null) store.SetValue (it, ExtensibleTreeView.OpenIconColumn, nodeInfo.Icon);
- if (nodeInfo.ClosedIcon != null) store.SetValue (it, ExtensibleTreeView.ClosedIconColumn, nodeInfo.ClosedIcon);
- if (nodeInfo.OverlayBottomLeft != null) store.SetValue (it, ExtensibleTreeView.OverlayBottomLeftColumn, nodeInfo.OverlayBottomLeft);
- if (nodeInfo.OverlayBottomRight != null) store.SetValue (it, ExtensibleTreeView.OverlayBottomRightColumn, nodeInfo.OverlayBottomRight);
- if (nodeInfo.OverlayTopLeft != null) store.SetValue (it, ExtensibleTreeView.OverlayTopLeftColumn, nodeInfo.OverlayTopLeft);
- if (nodeInfo.OverlayTopRight != null) store.SetValue (it, ExtensibleTreeView.OverlayTopRightColumn, nodeInfo.OverlayTopRight);
+ store.SetValue (it, ExtensibleTreeView.OpenIconColumn, nodeInfo.Icon ?? CellRendererImage.NullImage);
+ store.SetValue (it, ExtensibleTreeView.ClosedIconColumn, nodeInfo.ClosedIcon ?? CellRendererImage.NullImage);
+ store.SetValue (it, ExtensibleTreeView.OverlayBottomLeftColumn, nodeInfo.OverlayBottomLeft ?? CellRendererImage.NullImage);
+ store.SetValue (it, ExtensibleTreeView.OverlayBottomRightColumn, nodeInfo.OverlayBottomRight ?? CellRendererImage.NullImage);
+ store.SetValue (it, ExtensibleTreeView.OverlayTopLeftColumn, nodeInfo.OverlayTopLeft ?? CellRendererImage.NullImage);
+ store.SetValue (it, ExtensibleTreeView.OverlayTopRightColumn, nodeInfo.OverlayTopRight ?? CellRendererImage.NullImage);
pad.Tree.QueueDraw ();
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/OptionsDialog.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/OptionsDialog.cs
index 7fbf771a77..7b1547a1a2 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/OptionsDialog.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/OptionsDialog.cs
@@ -58,7 +58,7 @@ namespace MonoDevelop.Ide.Gui.Dialogs
HashSet<object> modifiedObjects = new HashSet<object> ();
bool removeEmptySections;
- const string emptyCategoryIcon = "md-empty-category";
+ const string emptyCategoryIcon = "md-prefs-generic";
const Gtk.IconSize treeIconSize = IconSize.Menu;
const Gtk.IconSize headerIconSize = IconSize.Button;
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/SplashScreen.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/SplashScreen.cs
index 516b5012d9..a9f61140aa 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/SplashScreen.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/SplashScreen.cs
@@ -54,6 +54,10 @@ namespace MonoDevelop.Ide.Gui.Dialogs {
bitmap.Dispose ();
bitmap = null;
}
+ if (monitor != null) {
+ monitor.Dispose ();
+ monitor = null;
+ }
}
protected override bool OnExposeEvent (Gdk.EventExpose evt)
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.OptionPanels/LoadSavePanel.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.OptionPanels/LoadSavePanel.cs
index c723e5bf3c..49bd123846 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.OptionPanels/LoadSavePanel.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.OptionPanels/LoadSavePanel.cs
@@ -73,8 +73,6 @@ namespace MonoDevelop.Ide.Gui.OptionPanels
partial class LoadSavePanelWidget : Gtk.Bin
{
- List<string> formats = new List<string> ();
-
public LoadSavePanelWidget ()
{
Build ();
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/FileOperationsBuilderExtension.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/FileOperationsBuilderExtension.cs
index 6f9273842b..b75cf90dbf 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/FileOperationsBuilderExtension.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/FileOperationsBuilderExtension.cs
@@ -67,10 +67,15 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad
[AllowMultiSelection]
public void OnOpenFolder ()
{
- HashSet<string> paths = new HashSet<string> ();
+ var paths = new HashSet<string> ();
foreach (ITreeNavigator node in CurrentNodes) {
- string path = GetDir (node.DataItem);
- if (!string.IsNullOrEmpty (path) && paths.Add (path))
+ FilePath path = GetDir (node.DataItem);
+
+ //if folder doesn't exist, walk up to parent that does
+ while (!path.IsNullOrEmpty && !path.IsDirectory)
+ path = path.ParentDirectory;
+
+ if (!path.IsNullOrEmpty && paths.Add (path))
DesktopService.OpenFolder (path);
}
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFileNodeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFileNodeBuilder.cs
index 623324ebb2..5725c9dcb4 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFileNodeBuilder.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFileNodeBuilder.cs
@@ -336,7 +336,7 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad
var project = file.Project;
var inFolder = project.Files.GetFilesInVirtualPath (file.ProjectVirtualPath.ParentDirectory).ToList ();
- if (inFolder.Count == 1 && inFolder [0] == file) {
+ if (inFolder.Count == 1 && inFolder [0] == file && project.Files.GetFileWithVirtualPath (file.ProjectVirtualPath.ParentDirectory) == null) {
// This is the last project file in the folder. Make sure we keep
// a reference to the folder, so it is not deleted from the tree.
var folderFile = new ProjectFile (project.BaseDirectory.Combine (file.ProjectVirtualPath.ParentDirectory));
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectSolutionPad.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectSolutionPad.cs
index f59d9ddb27..cb8a60c75c 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectSolutionPad.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectSolutionPad.cs
@@ -77,6 +77,7 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad
base.OnCloseWorkspace (sender, e);
IdeApp.ProjectOperations.CurrentSelectedSolutionItem = null;
IdeApp.ProjectOperations.CurrentSelectedWorkspaceItem = null;
+ IdeApp.ProjectOperations.CurrentSelectedItem = null;
}
void OnWindowChanged (object ob, EventArgs args)
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/CommonTextEditorOptions.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/CommonTextEditorOptions.cs
index 08637b370a..a47edcba8c 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/CommonTextEditorOptions.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/CommonTextEditorOptions.cs
@@ -40,7 +40,7 @@ namespace MonoDevelop.Ide.Gui
public CommonTextEditorOptions ()
{
PropertyService.PropertyChanged += PropertyServiceChanged;
- base.FontName = PropertyService.Get ("FontName", DesktopService.DefaultMonospaceFont);
+ base.FontName = PropertyService.Get ("FontName", FontService.MonospaceFontName);
base.ColorScheme = IdeApp.Preferences.ColorScheme;
FontService.RegisterFontChangedCallback ("Editor", UpdateFont);
FontService.RegisterFontChangedCallback ("Editor(Gutter)", UpdateFont);
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/SdiWorkspaceWindow.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/SdiWorkspaceWindow.cs
index 9506ed784b..9979f38245 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/SdiWorkspaceWindow.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/SdiWorkspaceWindow.cs
@@ -405,6 +405,11 @@ namespace MonoDevelop.Ide.Gui
content = null;
}
+ if (subViewToolbar != null) {
+ subViewToolbar.Dispose ();
+ subViewToolbar = null;
+ }
+
DetachFromPathedDocument ();
commandHandler = null;
document = null;
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/StockIcons.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/StockIcons.cs
index 6041dd12ad..8966e2dc61 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/StockIcons.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/StockIcons.cs
@@ -121,13 +121,13 @@ namespace MonoDevelop.Ide.Gui
public static readonly IconId ResourceFileIcon = "md-resource-file-icon";
public static readonly IconId Console = "md-console";
public static readonly IconId RunProgramIcon = Gtk.Stock.Execute;
- public static readonly IconId SaveAllIcon = "md-save-all-icon";
+ public static readonly IconId SaveAllIcon = "md-save-all";
public static readonly IconId SaveAsIcon = Gtk.Stock.SaveAs;
public static readonly IconId SaveIcon = Gtk.Stock.Save;
public static readonly IconId MonoDevelop = "md-monodevelop";
public static readonly IconId Project = "md-project";
public static readonly IconId Struct = "md-struct";
- public static readonly IconId TaskListIcon = "md-task-list-icon";
+ public static readonly IconId TaskListIcon = "md-task-list";
public static readonly IconId TextFileIcon = "md-text-file-icon";
public static readonly IconId ToggleBookmark = "md-toggle-bookmark";
public static readonly IconId UndoIcon = Gtk.Stock.Undo;
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ViewCommandHandlers.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ViewCommandHandlers.cs
index ba749ba217..b3ad06cd5f 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ViewCommandHandlers.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ViewCommandHandlers.cs
@@ -95,7 +95,7 @@ namespace MonoDevelop.Ide.Gui
[CommandUpdateHandler (FileCommands.ReloadFile)]
protected void OnUpdateReloadFile (CommandInfo info)
{
- info.Enabled = window.ViewContent.ContentName != null && !window.ViewContent.IsViewOnly;
+ info.Enabled = window.ViewContent.ContentName != null && !window.ViewContent.IsViewOnly && window.Document != null && window.Document.IsDirty;
}
[CommandHandler (FileCommands.OpenContainingFolder)]
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Navigation/NavigationHistoryService.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Navigation/NavigationHistoryService.cs
index 283494e865..837b8f9fec 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Navigation/NavigationHistoryService.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Navigation/NavigationHistoryService.cs
@@ -58,6 +58,7 @@ namespace MonoDevelop.Ide.Navigation
{
IdeApp.Workspace.LastWorkspaceItemClosed += delegate {
history.Clear ();
+ closedHistory.Clear ();
OnHistoryChanged ();
};
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects.OptionPanels/GeneralProjectOptions.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects.OptionPanels/GeneralProjectOptions.cs
index eec414022e..5176e25e51 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects.OptionPanels/GeneralProjectOptions.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects.OptionPanels/GeneralProjectOptions.cs
@@ -68,7 +68,7 @@ namespace MonoDevelop.Ide.Projects.OptionPanels
if (project is DotNetProject) {
projectDefaultNamespaceEntry.Text = ((DotNetProject)project).DefaultNamespace;
- } if (project is SharedAssetsProject) {
+ } else if (project is SharedAssetsProject) {
projectDefaultNamespaceEntry.Text = ((SharedAssetsProject)project).DefaultNamespace;
} else {
defaultNamespaceLabel.Visible = false;
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects.OptionPanels/PortableRuntimeOptionsPanel.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects.OptionPanels/PortableRuntimeOptionsPanel.cs
index 81ef4841a9..6a4169cc9e 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects.OptionPanels/PortableRuntimeOptionsPanel.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects.OptionPanels/PortableRuntimeOptionsPanel.cs
@@ -24,15 +24,11 @@
// THE SOFTWARE.
using System;
-using System.IO;
using System.Text;
using System.Linq;
-using System.Collections;
using System.Collections.Generic;
using MonoDevelop.Projects;
-using MonoDevelop.Ide.Projects;
-using MonoDevelop.Components;
using MonoDevelop.Core;
using MonoDevelop.Core.Assemblies;
@@ -73,8 +69,6 @@ namespace MonoDevelop.Ide.Projects.OptionPanels
ComboBox selectorCombo;
bool disableEvents;
- const bool UseShortDescriptionInSelector = false;
-
class OptionComboItem {
public readonly string Name;
public readonly SupportedFramework Framework;
@@ -235,18 +229,7 @@ namespace MonoDevelop.Ide.Projects.OptionPanels
string description;
if (fx == missingFramework)
description = " - not installed";
- else if (UseShortDescriptionInSelector) {
- var sb = new StringBuilder ();
- sb.Append (" (");
- foreach (var sfx in fx.SupportedFrameworks) {
- var label = GetShortName (sfx);
- if (sb.Length > 2)
- sb.Append (", ");
- sb.Append (label);
- }
- sb.Append (")");
- description = sb.ToString ();
- } else
+ else
description = string.Empty;
return string.Format (
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/ConfirmProjectDeleteDialog.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/ConfirmProjectDeleteDialog.cs
index 11809d5848..83b1c22d89 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/ConfirmProjectDeleteDialog.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/ConfirmProjectDeleteDialog.cs
@@ -36,7 +36,7 @@ using MonoDevelop.Components;
namespace MonoDevelop.Ide.Projects
{
- public partial class ConfirmProjectDeleteDialog : Gtk.Dialog
+ partial class ConfirmProjectDeleteDialog : Gtk.Dialog
{
TreeStore store;
IWorkspaceFileObject item;
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/ExportSolutionDialog.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/ExportSolutionDialog.cs
index f571ea06fe..b3ce373bc7 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/ExportSolutionDialog.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/ExportSolutionDialog.cs
@@ -33,7 +33,7 @@ using MonoDevelop.Projects;
namespace MonoDevelop.Ide.Projects
{
- public partial class ExportSolutionDialog : Gtk.Dialog
+ partial class ExportSolutionDialog : Gtk.Dialog
{
FileFormat[] formats;
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/NewPolicySetDialog.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/NewPolicySetDialog.cs
index 43933126e2..e446130cd6 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/NewPolicySetDialog.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/NewPolicySetDialog.cs
@@ -29,7 +29,7 @@ using MonoDevelop.Projects.Policies;
namespace MonoDevelop.Ide.Projects
{
- public partial class NewPolicySetDialog : Gtk.Dialog
+ partial class NewPolicySetDialog : Gtk.Dialog
{
List<PolicySet> sets;
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/NewProjectDialog.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/NewProjectDialog.cs
index 93951a2033..7a8818b9dd 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/NewProjectDialog.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/NewProjectDialog.cs
@@ -50,7 +50,7 @@ namespace MonoDevelop.Ide.Projects {
/// This class displays a new project dialog and sets up and creates a a new project,
/// the project types are described in an XML options file
/// </summary>
- public partial class NewProjectDialog: Gtk.Dialog
+ internal partial class NewProjectDialog: Gtk.Dialog
{
ArrayList alltemplates = new ArrayList();
List<Category> categories = new List<Category> ();
@@ -69,6 +69,7 @@ namespace MonoDevelop.Ide.Projects {
IWorkspaceFileObject newItem;
Category recentCategory;
List<string> recentTemplates = new List<string> ();
+ bool disposeNewItem = true;
public NewProjectDialog (SolutionFolder parentFolder, bool openCombine, string basePath)
{
@@ -213,6 +214,10 @@ namespace MonoDevelop.Ide.Projects {
cat_text_render.Destroy ();
cat_text_render = null;
}
+
+ if (disposeNewItem && newItem != null)
+ newItem.Dispose ();
+
base.OnDestroyed ();
}
@@ -378,11 +383,24 @@ namespace MonoDevelop.Ide.Projects {
IdeApp.ProjectOperations.Save (parentFolder.ParentSolution);
else
IdeApp.ProjectOperations.Save (newItem);
-
- if (openSolution)
- selectedItem.OpenCreatedSolution();
- InstallProjectTemplatePackages ();
+ if (openSolution) {
+ var op = selectedItem.OpenCreatedSolution ();
+ op.Completed += delegate {
+ if (op.Success) {
+ var sol = IdeApp.Workspace.GetAllSolutions ().FirstOrDefault ();
+ if (sol != null)
+ InstallProjectTemplatePackages (sol);
+ }
+ };
+ }
+ else {
+ // The item is not a solution being opened, so it is going to be added to
+ // an existing item. In this case, it must not be disposed by the dialog.
+ disposeNewItem = false;
+ if (parentFolder != null)
+ InstallProjectTemplatePackages (parentFolder.ParentSolution);
+ }
Respond (ResponseType.Ok);
}
@@ -454,7 +472,11 @@ namespace MonoDevelop.Ide.Projects {
MessageService.ShowError (GettextCatalog.GetString ("You do not have permission to create to {0}", location));
return false;
}
-
+
+ if (newItem != null) {
+ newItem.Dispose ();
+ newItem = null;
+ }
try {
ProjectCreateInformation cinfo = CreateProjectCreateInformation ();
@@ -485,13 +507,13 @@ namespace MonoDevelop.Ide.Projects {
return cinfo;
}
- void InstallProjectTemplatePackages ()
+ void InstallProjectTemplatePackages (Solution sol)
{
if (!selectedItem.HasPackages ())
return;
foreach (ProjectTemplatePackageInstaller installer in AddinManager.GetExtensionObjects ("/MonoDevelop/Ide/ProjectTemplatePackageInstallers")) {
- installer.Run (selectedItem.PackageReferencesForCreatedProjects);
+ installer.Run (sol, selectedItem.PackageReferencesForCreatedProjects);
}
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/NewProjectOptionsWidget.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/NewProjectOptionsWidget.cs
index 4bc678a553..8b79a631d0 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/NewProjectOptionsWidget.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/NewProjectOptionsWidget.cs
@@ -32,7 +32,7 @@ using System.Text;
namespace MonoDevelop.Ide.Projects
{
- public class NewProjectOptionsWidget : Bin
+ class NewProjectOptionsWidget : Bin
{
Entry nameEntry;
FileEntry locationEntry;
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/CommentTasksView.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/CommentTasksView.cs
index 65a30860e6..74fbae57bc 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/CommentTasksView.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/CommentTasksView.cs
@@ -145,6 +145,18 @@ namespace MonoDevelop.Ide.Tasks
// Initialize with existing tags.
foreach (Task t in comments)
AddGeneratedTask (t);
+
+ view.Destroyed += delegate {
+ view.RowActivated -= OnRowActivated;
+ TaskService.CommentTasksChanged -= OnCommentTasksChanged;
+ CommentTag.SpecialCommentTagsChanged -= OnCommentTagsChanged;
+ IdeApp.Workspace.WorkspaceItemLoaded -= OnWorkspaceItemLoaded;
+ IdeApp.Workspace.WorkspaceItemUnloaded -= OnWorkspaceItemUnloaded;
+ comments.TasksAdded -= DispatchService.GuiDispatch<TaskEventHandler> (GeneratedTaskAdded);
+ comments.TasksRemoved -= DispatchService.GuiDispatch<TaskEventHandler> (GeneratedTaskRemoved);
+
+ PropertyService.PropertyChanged -= DispatchService.GuiDispatch<EventHandler<PropertyChangedEventArgs>> (OnPropertyUpdated);
+ };
}
void LoadColumnsVisibility ()
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/Task.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/Task.cs
index 6d0fef6a3a..09bd276157 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/Task.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/Task.cs
@@ -209,10 +209,8 @@ namespace MonoDevelop.Ide.Tasks
public virtual void JumpToPosition()
{
if (!file.IsNullOrEmpty) {
- var doc = IdeApp.Workbench.OpenDocument (file, Math.Max (1, line), Math.Max (1, column));
var project = WorkspaceObject as Project;
- if (doc != null && project != null)
- doc.SetProject (project);
+ IdeApp.Workbench.OpenDocument (file, project, Math.Max (1, line), Math.Max (1, column));
} else if (parentObject != null) {
Pad pad = IdeApp.Workbench.GetPad<ProjectSolutionPad> ();
ProjectSolutionPad spad = pad.Content as ProjectSolutionPad;
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplate.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplate.cs
index 6be69a59f4..dd3fc5d476 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplate.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplate.cs
@@ -376,7 +376,7 @@ namespace MonoDevelop.Ide.Templates
if (directory != null) {
string fileName = singleFile.SaveFile (policyParent, project, language, directory, name);
if (fileName != null) {
- IdeApp.Workbench.OpenDocument (fileName);
+ IdeApp.Workbench.OpenDocument (fileName, project);
return true;
}
} else {
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplate.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplate.cs
index e83b4e5fbb..9640135723 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplate.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplate.cs
@@ -45,6 +45,7 @@ using Mono.Addins;
using MonoDevelop.Ide.Codons;
using MonoDevelop.Projects;
using MonoDevelop.Ide.Gui;
+using System.Linq;
namespace MonoDevelop.Ide.Templates
{
@@ -216,16 +217,17 @@ namespace MonoDevelop.Ide.Templates
}
//methods
- public void OpenCreatedSolution ()
+ public IAsyncOperation OpenCreatedSolution ()
{
IAsyncOperation asyncOperation = IdeApp.Workspace.OpenWorkspaceItem (createdSolutionName);
- asyncOperation.WaitForCompleted ();
-
- if (asyncOperation.Success) {
- foreach (string action in actions) {
- IdeApp.Workbench.OpenDocument (Path.Combine (createdProjectInformation.ProjectBasePath, action));
+ asyncOperation.Completed += delegate {
+ if (asyncOperation.Success) {
+ foreach (string action in actions) {
+ IdeApp.Workbench.OpenDocument (Path.Combine (createdProjectInformation.ProjectBasePath, action));
+ }
}
- }
+ };
+ return asyncOperation;
}
public WorkspaceItem CreateWorkspaceItem (ProjectCreateInformation cInfo)
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplatePackageInstaller.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplatePackageInstaller.cs
index 2aaddc361d..8739bee850 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplatePackageInstaller.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplatePackageInstaller.cs
@@ -32,7 +32,7 @@ namespace MonoDevelop.Ide.Templates
{
public abstract class ProjectTemplatePackageInstaller
{
- public abstract void Run(IList<PackageReferencesForCreatedProject> packageReferencesForCreatedProjects);
+ public abstract void Run (Solution solution, IList<PackageReferencesForCreatedProject> packageReferencesForCreatedProjects);
}
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemParserNode.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemParserNode.cs
index e726d0cc02..93d23a6d38 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemParserNode.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemParserNode.cs
@@ -27,13 +27,16 @@ using System;
using Mono.Addins;
using System.Collections.Generic;
using System.Linq;
+using MonoDevelop.Core.StringParsing;
namespace MonoDevelop.Ide.TypeSystem
{
public class TypeSystemParserNode : TypeExtensionNode
{
+ const string ApiDefinitionBuildAction = "ObjcBindingApiDefinition";
+
[NodeAttribute (Description="The build actions.")]
- string[] buildActions = new string[] { MonoDevelop.Projects.BuildAction.Compile };
+ string[] buildActions = { MonoDevelop.Projects.BuildAction.Compile, ApiDefinitionBuildAction };
public string[] BuildActions {
get {
@@ -73,6 +76,12 @@ namespace MonoDevelop.Ide.TypeSystem
return false;
return buildActions.Any (action => string.Equals (action, buildAction, StringComparison.OrdinalIgnoreCase));
}
+
+ public static bool IsCompileBuildAction(string buildAction)
+ {
+ return buildAction == MonoDevelop.Projects.BuildAction.Compile ||
+ buildAction == ApiDefinitionBuildAction;
+ }
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs
index 695d30f704..ddc288debb 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs
@@ -1753,7 +1753,6 @@ namespace MonoDevelop.Ide.TypeSystem
}
}
- var oldCache = cachedAssemblyContents.Values.ToList ();
cachedAssemblyContents.Clear ();
lock (parseQueueLock) {
parseQueueIndex.Clear ();
@@ -2602,7 +2601,6 @@ namespace MonoDevelop.Ide.TypeSystem
TypeSystemParserNode node = null;
TypeSystemParser parser = null;
var tags = Context.GetExtensionObject <ProjectCommentTags> ();
- string mimeType = null, oldExtension = null, buildAction = null;
try {
Context.BeginLoadOperation ();
var parsedFiles = new List<Tuple<ParsedDocument, IUnresolvedFile>> ();
@@ -2610,7 +2608,7 @@ namespace MonoDevelop.Ide.TypeSystem
if (token.IsCancellationRequested)
return;
var fileName = file.FilePath;
- if (file.BuildAction != BuildAction.Compile || filesSkippedInParseThread.Any (f => f == fileName)) {
+ if (!TypeSystemParserNode.IsCompileBuildAction (file.BuildAction) || filesSkippedInParseThread.Any (f => f == fileName)) {
continue;
}
if (node == null || !node.CanParse (fileName, file.BuildAction)) {
@@ -2903,6 +2901,7 @@ namespace MonoDevelop.Ide.TypeSystem
int pending = 0;
IProgressMonitor monitor = null;
var token = loadCancellationSource.Token;
+ StartParseOperation ();
try {
do {
if (pending > 5 && monitor == null) {
@@ -2930,6 +2929,7 @@ namespace MonoDevelop.Ide.TypeSystem
} finally {
if (monitor != null)
monitor.Dispose ();
+ EndParseOperation ();
}
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj
index 921dbea9eb..caa2a4b8f8 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj
@@ -69,6 +69,7 @@
<Reference Include="System.Web" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Design" />
+ <Reference Include="System.Windows.Forms" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\MonoDevelop.Core\MonoDevelop.Core.csproj">
@@ -221,12 +222,6 @@
<EmbeddedResource Include="options\KeyBindingSchemeMonoDevelop1.xml">
<LogicalName>KeyBindingSchemeMonoDevelop1.xml</LogicalName>
</EmbeddedResource>
- <EmbeddedResource Include="icons\keyboard-shortcuts-16.png">
- <LogicalName>keyboard-shortcuts-16.png</LogicalName>
- </EmbeddedResource>
- <EmbeddedResource Include="icons\text-editor-16.png">
- <LogicalName>text-editor-16.png</LogicalName>
- </EmbeddedResource>
<EmbeddedResource Include="icons\navigate-next-16.png">
<LogicalName>navigate-next-16.png</LogicalName>
</EmbeddedResource>
@@ -266,9 +261,6 @@
<EmbeddedResource Include="MonoDevelop.Ide.StandardHeader\LGPL3LicencePolicy.xml">
<LogicalName>LGPL3LicencePolicy.xml</LogicalName>
</EmbeddedResource>
- <EmbeddedResource Include="icons\tools-external-tools-16.png">
- <LogicalName>tools-external-tools-16.png</LogicalName>
- </EmbeddedResource>
<EmbeddedResource Include="MonoDevelop.Ide.CodeFormatting\InvariantTextStylePolicy.xml">
<LogicalName>InvariantTextStylePolicy.xml</LogicalName>
</EmbeddedResource>
@@ -341,12 +333,6 @@
<EmbeddedResource Include="icons\light\comment-16%402x.png">
<LogicalName>comment-light-16@2x.png</LogicalName>
</EmbeddedResource>
- <EmbeddedResource Include="icons\compiler-options-16.png">
- <LogicalName>compiler-options-16.png</LogicalName>
- </EmbeddedResource>
- <EmbeddedResource Include="icons\custom-commands-16.png">
- <LogicalName>custom-commands-16.png</LogicalName>
- </EmbeddedResource>
<EmbeddedResource Include="icons\edit-find-next-16.png">
<LogicalName>edit-find-next-16.png</LogicalName>
</EmbeddedResource>
@@ -467,21 +453,27 @@
<EmbeddedResource Include="icons\light\file-xml-32%402x.png">
<LogicalName>file-xml-light-32@2x.png</LogicalName>
</EmbeddedResource>
+ <EmbeddedResource Include="icons\light\file-script-16.png">
+ <LogicalName>file-script-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\file-script-16%402x.png">
+ <LogicalName>file-script-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\file-script-32.png">
+ <LogicalName>file-script-light-32.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\file-script-32%402x.png">
+ <LogicalName>file-script-light-32@2x.png</LogicalName>
+ </EmbeddedResource>
<EmbeddedResource Include="icons\folder-new-16.png">
<LogicalName>folder-new-16.png</LogicalName>
</EmbeddedResource>
- <EmbeddedResource Include="icons\formatting-16.png">
- <LogicalName>formatting-16.png</LogicalName>
- </EmbeddedResource>
<EmbeddedResource Include="icons\light\element-keyword-16.png">
<LogicalName>element-keyword-light-16.png</LogicalName>
</EmbeddedResource>
<EmbeddedResource Include="icons\light\element-keyword-16%402x.png">
<LogicalName>element-keyword-light-16@2x.png</LogicalName>
</EmbeddedResource>
- <EmbeddedResource Include="icons\markers-rulers-16.png">
- <LogicalName>markers-rulers-16.png</LogicalName>
- </EmbeddedResource>
<EmbeddedResource Include="icons\monodevelop-16.png">
<LogicalName>monodevelop-16.png</LogicalName>
</EmbeddedResource>
@@ -500,11 +492,11 @@
<EmbeddedResource Include="icons\light\package-16%402x.png">
<LogicalName>package-light-16@2x.png</LogicalName>
</EmbeddedResource>
- <EmbeddedResource Include="icons\light\package-22.png">
- <LogicalName>package-light-22.png</LogicalName>
+ <EmbeddedResource Include="icons\light\package-24.png">
+ <LogicalName>package-light-24.png</LogicalName>
</EmbeddedResource>
- <EmbeddedResource Include="icons\light\package-22%402x.png">
- <LogicalName>package-light-22@2x.png</LogicalName>
+ <EmbeddedResource Include="icons\light\package-24%402x.png">
+ <LogicalName>package-light-24@2x.png</LogicalName>
</EmbeddedResource>
<EmbeddedResource Include="icons\light\package-32.png">
<LogicalName>package-light-32.png</LogicalName>
@@ -599,24 +591,6 @@
<EmbeddedResource Include="icons\solution-new-16.png">
<LogicalName>solution-new-16.png</LogicalName>
</EmbeddedResource>
- <EmbeddedResource Include="icons\syntax-highlighting-16.png">
- <LogicalName>syntax-highlighting-16.png</LogicalName>
- </EmbeddedResource>
- <EmbeddedResource Include="icons\text-editor-behavior-16.png">
- <LogicalName>text-editor-behavior-16.png</LogicalName>
- </EmbeddedResource>
- <EmbeddedResource Include="icons\letters-16.png">
- <LogicalName>letters-16.png</LogicalName>
- </EmbeddedResource>
- <EmbeddedResource Include="icons\hammer-16.png">
- <LogicalName>hammer-16.png</LogicalName>
- </EmbeddedResource>
- <EmbeddedResource Include="icons\drive-16.png">
- <LogicalName>drive-16.png</LogicalName>
- </EmbeddedResource>
- <EmbeddedResource Include="icons\monkey-16.png">
- <LogicalName>monkey-16.png</LogicalName>
- </EmbeddedResource>
<EmbeddedResource Include="icons\light\element-visibility-internal-overlay-16.png">
<LogicalName>element-visibility-internal-overlay-light-16.png</LogicalName>
</EmbeddedResource>
@@ -731,9 +705,6 @@
<EmbeddedResource Include="MonoDevelop.Components.Commands\CommandsExtensionModel.addin.xml">
<LogicalName>CommandsExtensionModel.addin.xml</LogicalName>
</EmbeddedResource>
- <EmbeddedResource Include="icons\text-quickfix-16.png">
- <LogicalName>text-quickfix-16.png</LogicalName>
- </EmbeddedResource>
<EmbeddedResource Include="MonoDevelop.Ide.Gui.Pads.ClassPad\ClassPadContextMenu.addin.xml">
<LogicalName>ClassPadContextMenu.addin.xml</LogicalName>
</EmbeddedResource>
@@ -960,9 +931,6 @@
<EmbeddedResource Include="icons\light\file-resource-32%402x.png">
<LogicalName>file-resource-light-32@2x.png</LogicalName>
</EmbeddedResource>
- <EmbeddedResource Include="icons\save-all-16.png">
- <LogicalName>save-all-16.png</LogicalName>
- </EmbeddedResource>
<EmbeddedResource Include="icons\light\file-text-32.png">
<LogicalName>file-text-light-32.png</LogicalName>
</EmbeddedResource>
@@ -1203,6 +1171,30 @@
<EmbeddedResource Include="icons\light\information-48%402x.png">
<LogicalName>information-light-48@2x.png</LogicalName>
</EmbeddedResource>
+ <EmbeddedResource Include="icons\light\question-16.png">
+ <LogicalName>question-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\question-16%402x.png">
+ <LogicalName>question-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\question-24.png">
+ <LogicalName>question-light-24.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\question-24%402x.png">
+ <LogicalName>question-light-24@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\question-32.png">
+ <LogicalName>question-light-32.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\question-32%402x.png">
+ <LogicalName>question-light-32@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\question-48.png">
+ <LogicalName>question-light-48.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\question-48%402x.png">
+ <LogicalName>question-light-48@2x.png</LogicalName>
+ </EmbeddedResource>
<EmbeddedResource Include="icons\light\command-16.png">
<LogicalName>command-light-16.png</LogicalName>
</EmbeddedResource>
@@ -1275,18 +1267,12 @@
<EmbeddedResource Include="MonoDevelop.Ide.WelcomePage\icons\open_solution.png">
<LogicalName>open_solution.png</LogicalName>
</EmbeddedResource>
- <EmbeddedResource Include="icons\locale-16.png">
- <LogicalName>locale-16.png</LogicalName>
- </EmbeddedResource>
<EmbeddedResource Include="icons\light\link-overlay-16.png">
<LogicalName>link-overlay-light-16.png</LogicalName>
</EmbeddedResource>
<EmbeddedResource Include="icons\light\link-overlay-16%402x.png">
<LogicalName>link-overlay-light-16@2x.png</LogicalName>
</EmbeddedResource>
- <EmbeddedResource Include="icons\sdk-locations-16.png">
- <LogicalName>sdk-locations-16.png</LogicalName>
- </EmbeddedResource>
<EmbeddedResource Include="icons\light\pad-error-list-16.png">
<LogicalName>pad-error-list-light-16.png</LogicalName>
</EmbeddedResource>
@@ -1350,6 +1336,36 @@
<EmbeddedResource Include="icons\light\element-variable-16%402x.png">
<LogicalName>element-variable-light-16@2x.png</LogicalName>
</EmbeddedResource>
+ <EmbeddedResource Include="icons\light\element-exception-16.png">
+ <LogicalName>element-exception-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\element-exception-16%402x.png">
+ <LogicalName>element-exception-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\element-fs-field-16.png">
+ <LogicalName>element-fs-field-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\element-fs-field-16%402x.png">
+ <LogicalName>element-fs-field-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\element-module-16.png">
+ <LogicalName>element-module-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\element-module-16%402x.png">
+ <LogicalName>element-module-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\element-other-declaration-16.png">
+ <LogicalName>element-other-declaration-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\element-other-declaration-16%402x.png">
+ <LogicalName>element-other-declaration-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\element-type-16.png">
+ <LogicalName>element-type-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\element-type-16%402x.png">
+ <LogicalName>element-type-16@2x.png</LogicalName>
+ </EmbeddedResource>
<EmbeddedResource Include="icons\light\file-source-16.png">
<LogicalName>file-source-light-16.png</LogicalName>
</EmbeddedResource>
@@ -1512,6 +1528,12 @@
<EmbeddedResource Include="icons\light\warning-overlay-9%402x.png">
<LogicalName>warning-overlay-light-9@2x.png</LogicalName>
</EmbeddedResource>
+ <EmbeddedResource Include="icons\light\warning-8.png">
+ <LogicalName>warning-light-8.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\warning-8%402x.png">
+ <LogicalName>warning-light-8@2x.png</LogicalName>
+ </EmbeddedResource>
<EmbeddedResource Include="icons\light\warning-16.png">
<LogicalName>warning-light-16.png</LogicalName>
</EmbeddedResource>
@@ -1626,6 +1648,213 @@
<EmbeddedResource Include="icons\light\properties-16%402x.png">
<LogicalName>properties-light-16@2x.png</LogicalName>
</EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-load-save-16.png">
+ <LogicalName>prefs-load-save-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-load-save-16%402x.png">
+ <LogicalName>prefs-load-save-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-code-formatting-16.png">
+ <LogicalName>prefs-code-formatting-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-code-formatting-16%402x.png">
+ <LogicalName>prefs-code-formatting-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-language-16.png">
+ <LogicalName>prefs-language-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-language-16%402x.png">
+ <LogicalName>prefs-language-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-key-bindings-16.png">
+ <LogicalName>prefs-key-bindings-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-key-bindings-16%402x.png">
+ <LogicalName>prefs-key-bindings-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-fonts-16.png">
+ <LogicalName>prefs-fonts-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-fonts-16%402x.png">
+ <LogicalName>prefs-fonts-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-author-information-16.png">
+ <LogicalName>prefs-author-information-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-author-information-16%402x.png">
+ <LogicalName>prefs-author-information-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-sdk-locations-16.png">
+ <LogicalName>prefs-sdk-locations-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-sdk-locations-16%402x.png">
+ <LogicalName>prefs-sdk-locations-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-external-tools-16.png">
+ <LogicalName>prefs-external-tools-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-external-tools-16%402x.png">
+ <LogicalName>prefs-external-tools-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-build-16.png">
+ <LogicalName>prefs-build-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-build-16%402x.png">
+ <LogicalName>prefs-build-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-play-16.png">
+ <LogicalName>prefs-play-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-play-16%402x.png">
+ <LogicalName>prefs-play-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-updates-16.png">
+ <LogicalName>prefs-updates-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-updates-16%402x.png">
+ <LogicalName>prefs-updates-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-task-list-16.png">
+ <LogicalName>prefs-task-list-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-task-list-16%402x.png">
+ <LogicalName>prefs-task-list-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-generic-16.png">
+ <LogicalName>prefs-generic-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-generic-16%402x.png">
+ <LogicalName>prefs-generic-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-csharp-16.png">
+ <LogicalName>prefs-csharp-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-csharp-16%402x.png">
+ <LogicalName>prefs-csharp-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-standard-header-16.png">
+ <LogicalName>prefs-standard-header-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-standard-header-16%402x.png">
+ <LogicalName>prefs-standard-header-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-dotnet-naming-policies-16.png">
+ <LogicalName>prefs-dotnet-naming-policies-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-dotnet-naming-policies-16%402x.png">
+ <LogicalName>prefs-dotnet-naming-policies-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-code-templates-16.png">
+ <LogicalName>prefs-code-templates-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-code-templates-16%402x.png">
+ <LogicalName>prefs-code-templates-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-name-conventions-16.png">
+ <LogicalName>prefs-name-conventions-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\prefs-name-conventions-16%402x.png">
+ <LogicalName>prefs-name-conventions-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\copy-16.png">
+ <LogicalName>copy-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\copy-16%402x.png">
+ <LogicalName>copy-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\find-16.png">
+ <LogicalName>find-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\find-16%402x.png">
+ <LogicalName>find-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\find-and-replace-16.png">
+ <LogicalName>find-and-replace-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\find-and-replace-16%402x.png">
+ <LogicalName>find-and-replace-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\go-back-16.png">
+ <LogicalName>go-back-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\go-back-16%402x.png">
+ <LogicalName>go-back-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\go-down-16.png">
+ <LogicalName>go-down-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\go-down-16%402x.png">
+ <LogicalName>go-down-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\go-forward-16.png">
+ <LogicalName>go-forward-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\go-forward-16%402x.png">
+ <LogicalName>go-forward-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\go-up-16.png">
+ <LogicalName>go-up-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\go-up-16%402x.png">
+ <LogicalName>go-up-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\undo-16.png">
+ <LogicalName>undo-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\undo-16%402x.png">
+ <LogicalName>undo-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\home-16.png">
+ <LogicalName>home-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\home-16%402x.png">
+ <LogicalName>home-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\jump-to-16.png">
+ <LogicalName>jump-to-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\jump-to-16%402x.png">
+ <LogicalName>jump-to-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\media-play-16.png">
+ <LogicalName>media-play-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\media-play-16%402x.png">
+ <LogicalName>media-play-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\missing-image-16.png">
+ <LogicalName>missing-image-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\missing-image-16%402x.png">
+ <LogicalName>missing-image-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\open-16.png">
+ <LogicalName>open-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\refresh-16.png">
+ <LogicalName>refresh-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\refresh-16%402x.png">
+ <LogicalName>refresh-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\save-16.png">
+ <LogicalName>save-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\save-all-16.png">
+ <LogicalName>save-all-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\zoom-in-16.png">
+ <LogicalName>zoom-in-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\zoom-in-16%402x.png">
+ <LogicalName>zoom-in-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\zoom-out-16.png">
+ <LogicalName>zoom-out-light-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\light\zoom-out-16%402x.png">
+ <LogicalName>zoom-out-light-16@2x.png</LogicalName>
+ </EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Compile Include="MonoDevelop.Ide.Commands\CustomStringTagProvider.cs" />
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/Ide.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/Ide.cs
index 373075661a..648180e7c6 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/Ide.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/Ide.cs
@@ -58,7 +58,6 @@ namespace MonoDevelop.Ide
static IdeServices ideServices;
static RootWorkspace workspace;
static IdePreferences preferences;
- static IdeCustomizer customizer;
public const int CurrentRevision = 5;
@@ -283,8 +282,10 @@ namespace MonoDevelop.Ide
}
}
- if (initializedEvent != null)
+ if (initializedEvent != null) {
initializedEvent (null, EventArgs.Empty);
+ initializedEvent = null;
+ }
// load previous combine
if ((bool)PropertyService.Get("SharpDevelop.LoadPrevProjectOnStartup", false)) {
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ImageService.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ImageService.cs
index 6b3284b40a..86f7fd681d 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ImageService.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ImageService.cs
@@ -55,7 +55,6 @@ namespace MonoDevelop.Ide
static List<RuntimeAddin> addins = new List<RuntimeAddin> ();
static Dictionary<string, string> composedIcons = new Dictionary<string, string> ();
- static Dictionary<Gdk.Pixbuf, string> namedIcons = new Dictionary<Gdk.Pixbuf, string> ();
// Dictionary of extension nodes by stock icon id. It holds nodes that have not yet been loaded
static Dictionary<string, List<StockIconCodon>> iconStock = new Dictionary<string, List<StockIconCodon>> ();
@@ -76,6 +75,8 @@ namespace MonoDevelop.Ide
if (!iconStock.ContainsKey (iconCodon.StockId))
iconStock[iconCodon.StockId] = new List<StockIconCodon> ();
iconStock[iconCodon.StockId].Add (iconCodon);
+ if (iconCodon.Addin == AddinManager.CurrentAddin)
+ EnsureStockIconIsLoaded (iconCodon.StockId);
break;
}
});
@@ -90,7 +91,7 @@ namespace MonoDevelop.Ide
if (Platform.IsWindows) {
iconSizes[(int)Gtk.IconSize.Menu].Width = 16;
iconSizes[(int)Gtk.IconSize.Menu].Height = 16;
- }
+ }
}
static void LoadStockIcon (StockIconCodon iconCodon, bool forceWildcard)
@@ -718,7 +719,8 @@ namespace MonoDevelop.Ide
animatedImages.RemoveAll (a => (AnimatedImageInfo)a.Target == ainfo);
}
- //TODO: size-limit this cache
+ //TODO: size-limit the in-memory cache
+ //TODO: size-limit the on-disk cache
static Dictionary<string,ImageLoader> gravatars = new Dictionary<string,ImageLoader> ();
public static ImageLoader GetUserIcon (string email, int size, Xwt.Screen screen = null)
@@ -740,7 +742,7 @@ namespace MonoDevelop.Ide
}
ImageLoader loader;
- if (!gravatars.TryGetValue (key, out loader)) {
+ if (!gravatars.TryGetValue (key, out loader) || (!loader.Downloading && loader.Image == null)) {
var cacheFile = UserProfile.Current.TempDir.Combine ("Gravatars", key);
string url = "https://www.gravatar.com/avatar/" + hash + "?d=404&s=" + size;
gravatars[key] = loader = new ImageLoader (cacheFile, url, scaleFactor);
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ProjectOperations.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ProjectOperations.cs
index ca0e25b600..9f3656b125 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ProjectOperations.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ProjectOperations.cs
@@ -802,30 +802,32 @@ namespace MonoDevelop.Ide
if (!IdeApp.Workspace.RequestItemUnload (prj))
return;
ConfirmProjectDeleteDialog dlg = new ConfirmProjectDeleteDialog (prj);
- if (MessageService.RunCustomDialog (dlg) == (int) Gtk.ResponseType.Ok) {
-
- // Remove the project before removing the files to avoid unnecessary events
- RemoveItemFromSolution (prj);
-
- List<FilePath> files = dlg.GetFilesToDelete ();
- dlg.Destroy ();
- using (IProgressMonitor monitor = new MessageDialogProgressMonitor (true)) {
- monitor.BeginTask (GettextCatalog.GetString ("Deleting Files..."), files.Count);
- foreach (FilePath file in files) {
- try {
- if (Directory.Exists (file))
- FileService.DeleteDirectory (file);
- else
- FileService.DeleteFile (file);
- } catch (Exception ex) {
- monitor.ReportError (GettextCatalog.GetString ("The file or directory '{0}' could not be deleted.", file), ex);
+ try {
+ if (MessageService.RunCustomDialog (dlg) == (int) Gtk.ResponseType.Ok) {
+
+ // Remove the project before removing the files to avoid unnecessary events
+ RemoveItemFromSolution (prj);
+
+ List<FilePath> files = dlg.GetFilesToDelete ();
+ using (IProgressMonitor monitor = new MessageDialogProgressMonitor (true)) {
+ monitor.BeginTask (GettextCatalog.GetString ("Deleting Files..."), files.Count);
+ foreach (FilePath file in files) {
+ try {
+ if (Directory.Exists (file))
+ FileService.DeleteDirectory (file);
+ else
+ FileService.DeleteFile (file);
+ } catch (Exception ex) {
+ monitor.ReportError (GettextCatalog.GetString ("The file or directory '{0}' could not be deleted.", file), ex);
+ }
+ monitor.Step (1);
}
- monitor.Step (1);
+ monitor.EndTask ();
}
- monitor.EndTask ();
}
- } else
+ } finally {
dlg.Destroy ();
+ }
}
else if (result == AlertButton.Remove && IdeApp.Workspace.RequestItemUnload (prj)) {
RemoveItemFromSolution (prj);
@@ -1775,7 +1777,7 @@ namespace MonoDevelop.Ide
// a reference to the folder, so it is not deleted from the tree.
if (removeFromSource && sourceProject != null && pfolder.CanonicalPath != sourceProject.BaseDirectory.CanonicalPath && pfolder.IsChildPathOf (sourceProject.BaseDirectory)) {
pfolder = pfolder.ToRelative (sourceProject.BaseDirectory);
- if (!sourceProject.Files.GetFilesInVirtualPath (pfolder).Any ()) {
+ if (!sourceProject.Files.GetFilesInVirtualPath (pfolder).Any () && sourceProject.Files.GetFileWithVirtualPath (pfolder) == null) {
var folderFile = new ProjectFile (sourceProject.BaseDirectory.Combine (pfolder));
folderFile.Subtype = Subtype.Directory;
sourceProject.Files.Add (folderFile);
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/RootWorkspace.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/RootWorkspace.cs
index 2820a58b4e..262e1807d0 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/RootWorkspace.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/RootWorkspace.cs
@@ -263,6 +263,7 @@ namespace MonoDevelop.Ide
}
}
+ [Obsolete("Use GetProjectsContainingFile() (plural) instead")]
public Project GetProjectContainingFile (string fileName)
{
foreach (WorkspaceItem it in Items) {
@@ -272,7 +273,16 @@ namespace MonoDevelop.Ide
}
return null;
}
-
+
+ public IEnumerable<Project> GetProjectsContainingFile (string fileName)
+ {
+ foreach (WorkspaceItem it in Items) {
+ foreach (Project p in it.GetProjectsContainingFile (fileName)) {
+ yield return p;
+ }
+ }
+ }
+
#endregion
#region Build and run operations
@@ -525,21 +535,29 @@ namespace MonoDevelop.Ide
public IAsyncOperation OpenWorkspaceItem (string filename, bool closeCurrent, bool loadPreferences)
{
+ if (filename.StartsWith ("file://", StringComparison.Ordinal))
+ filename = new Uri(filename).LocalPath;
+
+ var item = GetAllItems<WorkspaceItem> ().FirstOrDefault (w => w.FileName == filename);
+ if (item != null) {
+ IdeApp.ProjectOperations.CurrentSelectedWorkspaceItem = item;
+ IdeApp.Workbench.StatusBar.ShowWarning (GettextCatalog.GetString ("{0} is already opened", item.FileName.FileName));
+ return MonoDevelop.Core.ProgressMonitoring.NullAsyncOperation.Success;
+ }
+
if (closeCurrent) {
if (!Close ())
return MonoDevelop.Core.ProgressMonitoring.NullAsyncOperation.Failure;
}
- if (filename.StartsWith ("file://", StringComparison.Ordinal))
- filename = new Uri(filename).LocalPath;
-
- var monitor = IdeApp.Workbench.ProgressMonitors.GetProjectLoadProgressMonitor (true);
- bool reloading = IsReloading;
+ using (var monitor = IdeApp.Workbench.ProgressMonitors.GetProjectLoadProgressMonitor (true)) {
+ bool reloading = IsReloading;
- DispatchService.BackgroundDispatch (delegate {
- BackgroundLoadWorkspace (monitor, filename, loadPreferences, reloading);
- });
- return monitor.AsyncOperation;
+ DispatchService.BackgroundDispatch (delegate {
+ BackgroundLoadWorkspace (monitor, filename, loadPreferences, reloading);
+ });
+ return monitor.AsyncOperation;
+ }
}
void ReattachDocumentProjects (IEnumerable<string> closedDocs)
@@ -573,14 +591,6 @@ namespace MonoDevelop.Ide
return;
}
- for (int i = 0; i < Items.Count; i++) {
- if (Items[i].FileName == filename) {
- IdeApp.ProjectOperations.CurrentSelectedWorkspaceItem = Items[i];
- monitor.Dispose ();
- return;
- }
- }
-
if (!Services.ProjectService.IsWorkspaceItemFile (filename)) {
if (!Services.ProjectService.IsSolutionItemFile (filename)) {
monitor.ReportError (GettextCatalog.GetString ("File is not a project or solution: {0}", filename), null);
@@ -999,14 +1009,14 @@ namespace MonoDevelop.Ide
WorkspaceItemEventArgs args = new WorkspaceItemEventArgs (item);
NotifyDescendantItemAdded (this, args);
NotifyConfigurationsChanged (null, args);
-
- if (WorkspaceItemOpened != null)
- WorkspaceItemOpened (this, args);
+
if (Items.Count == 1 && !reloading) {
IdeApp.Workbench.CurrentLayout = "Solution";
if (FirstWorkspaceItemOpened != null)
FirstWorkspaceItemOpened (this, args);
}
+ if (WorkspaceItemOpened != null)
+ WorkspaceItemOpened (this, args);
}
internal void NotifyItemRemoved (WorkspaceItem item)
@@ -1030,16 +1040,16 @@ namespace MonoDevelop.Ide
}
item.ConfigurationsChanged -= configurationsChanged;
- if (Items.Count == 0 && !reloading) {
- if (LastWorkspaceItemClosed != null)
- LastWorkspaceItemClosed (this, EventArgs.Empty);
- }
-
WorkspaceItemEventArgs args = new WorkspaceItemEventArgs (item);
NotifyConfigurationsChanged (null, args);
if (WorkspaceItemClosed != null)
WorkspaceItemClosed (this, args);
+
+ if (Items.Count == 0 && !reloading) {
+ if (LastWorkspaceItemClosed != null)
+ LastWorkspaceItemClosed (this, EventArgs.Empty);
+ }
MonoDevelop.Ide.TypeSystem.TypeSystemService.Unload (item);
// ParserDatabase.Unload (item);
diff --git a/main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ConfirmProjectDeleteDialog.cs b/main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ConfirmProjectDeleteDialog.cs
index b7b8e84cd0..754e9bc1ee 100644
--- a/main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ConfirmProjectDeleteDialog.cs
+++ b/main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ConfirmProjectDeleteDialog.cs
@@ -2,18 +2,28 @@
// This file has been generated by the GUI designer. Do not modify.
namespace MonoDevelop.Ide.Projects
{
- public partial class ConfirmProjectDeleteDialog
+ internal partial class ConfirmProjectDeleteDialog
{
private global::Gtk.VBox vbox2;
+
private global::Gtk.Label label1;
+
private global::Gtk.RadioButton radioDeleteAll;
+
private global::Gtk.Alignment alignment1;
+
private global::Gtk.Label labelProjectDir;
+
private global::Gtk.RadioButton radioDeleteSel;
+
private global::Gtk.Alignment alignment2;
+
private global::Gtk.ScrolledWindow GtkScrolledWindow;
+
private global::Gtk.TreeView fileList;
+
private global::Gtk.Button buttonCancel;
+
private global::Gtk.Button buttonOk;
protected virtual void Build ()
diff --git a/main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ExportSolutionDialog.cs b/main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ExportSolutionDialog.cs
index 724ca014f5..451ebc0865 100644
--- a/main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ExportSolutionDialog.cs
+++ b/main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.ExportSolutionDialog.cs
@@ -2,17 +2,26 @@
// This file has been generated by the GUI designer. Do not modify.
namespace MonoDevelop.Ide.Projects
{
- public partial class ExportSolutionDialog
+ internal partial class ExportSolutionDialog
{
private global::Gtk.VBox vbox2;
+
private global::Gtk.Table table;
+
private global::Gtk.ComboBox comboFormat;
+
private global::MonoDevelop.Components.FolderEntry folderEntry;
+
private global::Gtk.Label label2;
+
private global::Gtk.Label label4;
+
private global::Gtk.Label labelNewFormat;
+
private global::Gtk.Label newFormatLabel;
+
private global::Gtk.Button button51;
+
private global::Gtk.Button buttonOk;
protected virtual void Build ()
@@ -54,6 +63,7 @@ namespace MonoDevelop.Ide.Projects
// Container child table.Gtk.Table+TableChild
this.folderEntry = new global::MonoDevelop.Components.FolderEntry ();
this.folderEntry.Name = "folderEntry";
+ this.folderEntry.DisplayAsRelativePath = false;
this.table.Add (this.folderEntry);
global::Gtk.Table.TableChild w3 = ((global::Gtk.Table.TableChild)(this.table [this.folderEntry]));
w3.TopAttach = ((uint)(2));
diff --git a/main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.NewPolicySetDialog.cs b/main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.NewPolicySetDialog.cs
index f292c6fd49..e1736e8342 100644
--- a/main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.NewPolicySetDialog.cs
+++ b/main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.NewPolicySetDialog.cs
@@ -2,14 +2,20 @@
// This file has been generated by the GUI designer. Do not modify.
namespace MonoDevelop.Ide.Projects
{
- public partial class NewPolicySetDialog
+ internal partial class NewPolicySetDialog
{
private global::Gtk.VBox vbox2;
+
private global::Gtk.Label label1;
+
private global::Gtk.Entry entryName;
+
private global::Gtk.Label label2;
+
private global::Gtk.ComboBox comboSets;
+
private global::Gtk.Button buttonCancel;
+
private global::Gtk.Button buttonOk;
protected virtual void Build ()
diff --git a/main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.NewProjectDialog.cs b/main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.NewProjectDialog.cs
index 634ef24699..fc31f2fdfb 100644
--- a/main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.NewProjectDialog.cs
+++ b/main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.NewProjectDialog.cs
@@ -1,382 +1,411 @@
-
-// This file has been generated by the GUI designer. Do not modify.
-namespace MonoDevelop.Ide.Projects
-{
- public partial class NewProjectDialog
- {
- private global::Gtk.Notebook notebook;
- private global::Gtk.VBox vbox1;
- private global::Gtk.VBox vbox2;
- private global::Gtk.HBox hbox1;
- private global::Gtk.VBox vbox4;
- private global::Gtk.HPaned hpaned1;
- private global::Gtk.ScrolledWindow scrolledwindow1;
- private global::Gtk.TreeView lst_template_types;
- private global::Gtk.HPaned panedTemplates;
- private global::Gtk.VBox boxTemplates;
- private global::Gtk.ScrolledWindow scrolledInfo;
- private global::Gtk.VBox boxInfo;
- private global::Gtk.Label labelTemplateTitle;
- private global::Gtk.Label lbl_template_descr;
- private global::Gtk.VBox vbox3;
- private global::Gtk.Table table1;
- private global::MonoDevelop.Components.FolderEntry entry_location;
- private global::Gtk.HBox hbox2;
- private global::Gtk.Entry txt_subdirectory;
- private global::Gtk.CheckButton chk_combine_directory;
- private global::Gtk.Label lbl_location;
- private global::Gtk.Label lbl_name;
- private global::Gtk.Label lbl_subdirectory;
- private global::Gtk.Entry txt_name;
- private global::Gtk.Label lbl_will_save_in;
- private global::Gtk.Label label1;
- private global::Gtk.VBox vbox5;
- private global::Gtk.Label label3;
- private global::Gtk.Label label4;
- private global::Gtk.Label label2;
- private global::Gtk.Button btn_close;
- private global::Gtk.Button btn_new;
-
- protected virtual void Build ()
- {
- global::Stetic.Gui.Initialize (this);
- // Widget MonoDevelop.Ide.Projects.NewProjectDialog
- this.WidthRequest = 930;
- this.Name = "MonoDevelop.Ide.Projects.NewProjectDialog";
- this.Title = "New Solution";
- this.TypeHint = ((global::Gdk.WindowTypeHint)(1));
- this.WindowPosition = ((global::Gtk.WindowPosition)(1));
- this.BorderWidth = ((uint)(6));
- this.DestroyWithParent = true;
- // Internal child MonoDevelop.Ide.Projects.NewProjectDialog.VBox
- global::Gtk.VBox w1 = this.VBox;
- w1.Name = "dialog-vbox1";
- w1.Spacing = 6;
- w1.BorderWidth = ((uint)(2));
- // Container child dialog-vbox1.Gtk.Box+BoxChild
- this.notebook = new global::Gtk.Notebook ();
- this.notebook.CanFocus = true;
- this.notebook.Name = "notebook";
- this.notebook.CurrentPage = 0;
- this.notebook.ShowBorder = false;
- this.notebook.BorderWidth = ((uint)(6));
- // Container child notebook.Gtk.Notebook+NotebookChild
- this.vbox1 = new global::Gtk.VBox ();
- this.vbox1.Name = "vbox1";
- this.vbox1.Spacing = 7;
- // Container child vbox1.Gtk.Box+BoxChild
- this.vbox2 = new global::Gtk.VBox ();
- this.vbox2.Name = "vbox2";
- this.vbox2.Spacing = 6;
- // Container child vbox2.Gtk.Box+BoxChild
- this.hbox1 = new global::Gtk.HBox ();
- this.hbox1.Name = "hbox1";
- // Container child hbox1.Gtk.Box+BoxChild
- this.vbox4 = new global::Gtk.VBox ();
- this.vbox4.Name = "vbox4";
- this.vbox4.Spacing = 6;
- // Container child vbox4.Gtk.Box+BoxChild
- this.hpaned1 = new global::Gtk.HPaned ();
- this.hpaned1.CanFocus = true;
- this.hpaned1.Name = "hpaned1";
- this.hpaned1.Position = 188;
- // Container child hpaned1.Gtk.Paned+PanedChild
- this.scrolledwindow1 = new global::Gtk.ScrolledWindow ();
- this.scrolledwindow1.Name = "scrolledwindow1";
- this.scrolledwindow1.ShadowType = ((global::Gtk.ShadowType)(1));
- // Container child scrolledwindow1.Gtk.Container+ContainerChild
- this.lst_template_types = new global::Gtk.TreeView ();
- this.lst_template_types.Name = "lst_template_types";
- this.lst_template_types.HeadersVisible = false;
- this.scrolledwindow1.Add (this.lst_template_types);
- this.hpaned1.Add (this.scrolledwindow1);
- global::Gtk.Paned.PanedChild w3 = ((global::Gtk.Paned.PanedChild)(this.hpaned1 [this.scrolledwindow1]));
- w3.Resize = false;
- // Container child hpaned1.Gtk.Paned+PanedChild
- this.panedTemplates = new global::Gtk.HPaned ();
- this.panedTemplates.CanFocus = true;
- this.panedTemplates.Name = "panedTemplates";
- this.panedTemplates.Position = 430;
- // Container child panedTemplates.Gtk.Paned+PanedChild
- this.boxTemplates = new global::Gtk.VBox ();
- this.boxTemplates.Name = "boxTemplates";
- this.boxTemplates.Spacing = 6;
- this.panedTemplates.Add (this.boxTemplates);
- global::Gtk.Paned.PanedChild w4 = ((global::Gtk.Paned.PanedChild)(this.panedTemplates [this.boxTemplates]));
- w4.Resize = false;
- // Container child panedTemplates.Gtk.Paned+PanedChild
- this.scrolledInfo = new global::Gtk.ScrolledWindow ();
- this.scrolledInfo.CanFocus = true;
- this.scrolledInfo.Name = "scrolledInfo";
- this.scrolledInfo.HscrollbarPolicy = ((global::Gtk.PolicyType)(2));
- this.scrolledInfo.ShadowType = ((global::Gtk.ShadowType)(1));
- // Container child scrolledInfo.Gtk.Container+ContainerChild
- global::Gtk.Viewport w5 = new global::Gtk.Viewport ();
- w5.ShadowType = ((global::Gtk.ShadowType)(0));
- // Container child GtkViewport.Gtk.Container+ContainerChild
- this.boxInfo = new global::Gtk.VBox ();
- this.boxInfo.Name = "boxInfo";
- this.boxInfo.Spacing = 6;
- this.boxInfo.BorderWidth = ((uint)(3));
- // Container child boxInfo.Gtk.Box+BoxChild
- this.labelTemplateTitle = new global::Gtk.Label ();
- this.labelTemplateTitle.WidthRequest = 30;
- this.labelTemplateTitle.Name = "labelTemplateTitle";
- this.labelTemplateTitle.Xalign = 0F;
- this.labelTemplateTitle.LabelProp = global::Mono.Unix.Catalog.GetString ("<b>Console Project</b>");
- this.labelTemplateTitle.UseMarkup = true;
- this.labelTemplateTitle.Wrap = true;
- this.boxInfo.Add (this.labelTemplateTitle);
- global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.boxInfo [this.labelTemplateTitle]));
- w6.Position = 0;
- w6.Expand = false;
- w6.Fill = false;
- // Container child boxInfo.Gtk.Box+BoxChild
- this.lbl_template_descr = new global::Gtk.Label ();
- this.lbl_template_descr.WidthRequest = 116;
- this.lbl_template_descr.Name = "lbl_template_descr";
- this.lbl_template_descr.Xalign = 0F;
- this.lbl_template_descr.Yalign = 0F;
- this.lbl_template_descr.LabelProp = global::Mono.Unix.Catalog.GetString ("Creates a new C# Project");
- this.lbl_template_descr.Wrap = true;
- this.boxInfo.Add (this.lbl_template_descr);
- global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.boxInfo [this.lbl_template_descr]));
- w7.Position = 1;
- w7.Expand = false;
- w7.Fill = false;
- w5.Add (this.boxInfo);
- this.scrolledInfo.Add (w5);
- this.panedTemplates.Add (this.scrolledInfo);
- global::Gtk.Paned.PanedChild w10 = ((global::Gtk.Paned.PanedChild)(this.panedTemplates [this.scrolledInfo]));
- w10.Resize = false;
- this.hpaned1.Add (this.panedTemplates);
- this.vbox4.Add (this.hpaned1);
- global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(this.vbox4 [this.hpaned1]));
- w12.Position = 0;
- this.hbox1.Add (this.vbox4);
- global::Gtk.Box.BoxChild w13 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.vbox4]));
- w13.Position = 0;
- this.vbox2.Add (this.hbox1);
- global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.hbox1]));
- w14.Position = 0;
- this.vbox1.Add (this.vbox2);
- global::Gtk.Box.BoxChild w15 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.vbox2]));
- w15.Position = 0;
- // Container child vbox1.Gtk.Box+BoxChild
- this.vbox3 = new global::Gtk.VBox ();
- this.vbox3.Name = "vbox3";
- this.vbox3.Spacing = 6;
- // Container child vbox3.Gtk.Box+BoxChild
- this.table1 = new global::Gtk.Table (((uint)(3)), ((uint)(2)), false);
- this.table1.Name = "table1";
- this.table1.RowSpacing = ((uint)(6));
- this.table1.ColumnSpacing = ((uint)(6));
- // Container child table1.Gtk.Table+TableChild
- this.entry_location = new global::MonoDevelop.Components.FolderEntry ();
- this.entry_location.Name = "entry_location";
- this.entry_location.DisplayAsRelativePath = false;
- this.table1.Add (this.entry_location);
- global::Gtk.Table.TableChild w16 = ((global::Gtk.Table.TableChild)(this.table1 [this.entry_location]));
- w16.TopAttach = ((uint)(1));
- w16.BottomAttach = ((uint)(2));
- w16.LeftAttach = ((uint)(1));
- w16.RightAttach = ((uint)(2));
- w16.XOptions = ((global::Gtk.AttachOptions)(4));
- w16.YOptions = ((global::Gtk.AttachOptions)(4));
- // Container child table1.Gtk.Table+TableChild
- this.hbox2 = new global::Gtk.HBox ();
- this.hbox2.Name = "hbox2";
- this.hbox2.Spacing = 6;
- // Container child hbox2.Gtk.Box+BoxChild
- this.txt_subdirectory = new global::Gtk.Entry ();
- this.txt_subdirectory.Name = "txt_subdirectory";
- this.txt_subdirectory.IsEditable = true;
- this.txt_subdirectory.ActivatesDefault = true;
- this.txt_subdirectory.InvisibleChar = '●';
- this.hbox2.Add (this.txt_subdirectory);
- global::Gtk.Box.BoxChild w17 = ((global::Gtk.Box.BoxChild)(this.hbox2 [this.txt_subdirectory]));
- w17.Position = 0;
- // Container child hbox2.Gtk.Box+BoxChild
- this.chk_combine_directory = new global::Gtk.CheckButton ();
- this.chk_combine_directory.Name = "chk_combine_directory";
- this.chk_combine_directory.Label = global::Mono.Unix.Catalog.GetString ("_Create directory for solution");
- this.chk_combine_directory.Active = true;
- this.chk_combine_directory.DrawIndicator = true;
- this.chk_combine_directory.UseUnderline = true;
- this.hbox2.Add (this.chk_combine_directory);
- global::Gtk.Box.BoxChild w18 = ((global::Gtk.Box.BoxChild)(this.hbox2 [this.chk_combine_directory]));
- w18.Position = 1;
- w18.Expand = false;
- w18.Fill = false;
- this.table1.Add (this.hbox2);
- global::Gtk.Table.TableChild w19 = ((global::Gtk.Table.TableChild)(this.table1 [this.hbox2]));
- w19.TopAttach = ((uint)(2));
- w19.BottomAttach = ((uint)(3));
- w19.LeftAttach = ((uint)(1));
- w19.RightAttach = ((uint)(2));
- w19.YOptions = ((global::Gtk.AttachOptions)(4));
- // Container child table1.Gtk.Table+TableChild
- this.lbl_location = new global::Gtk.Label ();
- this.lbl_location.Name = "lbl_location";
- this.lbl_location.Xalign = 0F;
- this.lbl_location.Yalign = 0F;
- this.lbl_location.LabelProp = global::Mono.Unix.Catalog.GetString ("_Location:");
- this.lbl_location.UseUnderline = true;
- this.table1.Add (this.lbl_location);
- global::Gtk.Table.TableChild w20 = ((global::Gtk.Table.TableChild)(this.table1 [this.lbl_location]));
- w20.TopAttach = ((uint)(1));
- w20.BottomAttach = ((uint)(2));
- w20.XOptions = ((global::Gtk.AttachOptions)(4));
- w20.YOptions = ((global::Gtk.AttachOptions)(0));
- // Container child table1.Gtk.Table+TableChild
- this.lbl_name = new global::Gtk.Label ();
- this.lbl_name.Name = "lbl_name";
- this.lbl_name.Xalign = 0F;
- this.lbl_name.Yalign = 0F;
- this.lbl_name.LabelProp = global::Mono.Unix.Catalog.GetString ("N_ame:");
- this.lbl_name.UseUnderline = true;
- this.table1.Add (this.lbl_name);
- global::Gtk.Table.TableChild w21 = ((global::Gtk.Table.TableChild)(this.table1 [this.lbl_name]));
- w21.XOptions = ((global::Gtk.AttachOptions)(4));
- w21.YOptions = ((global::Gtk.AttachOptions)(0));
- // Container child table1.Gtk.Table+TableChild
- this.lbl_subdirectory = new global::Gtk.Label ();
- this.lbl_subdirectory.Name = "lbl_subdirectory";
- this.lbl_subdirectory.Xalign = 0F;
- this.lbl_subdirectory.LabelProp = global::Mono.Unix.Catalog.GetString ("_Solution name:");
- this.lbl_subdirectory.UseUnderline = true;
- this.table1.Add (this.lbl_subdirectory);
- global::Gtk.Table.TableChild w22 = ((global::Gtk.Table.TableChild)(this.table1 [this.lbl_subdirectory]));
- w22.TopAttach = ((uint)(2));
- w22.BottomAttach = ((uint)(3));
- w22.XOptions = ((global::Gtk.AttachOptions)(4));
- w22.YOptions = ((global::Gtk.AttachOptions)(4));
- // Container child table1.Gtk.Table+TableChild
- this.txt_name = new global::Gtk.Entry ();
- this.txt_name.Name = "txt_name";
- this.txt_name.IsEditable = true;
- this.txt_name.ActivatesDefault = true;
- this.txt_name.InvisibleChar = '●';
- this.table1.Add (this.txt_name);
- global::Gtk.Table.TableChild w23 = ((global::Gtk.Table.TableChild)(this.table1 [this.txt_name]));
- w23.LeftAttach = ((uint)(1));
- w23.RightAttach = ((uint)(2));
- w23.YOptions = ((global::Gtk.AttachOptions)(0));
- this.vbox3.Add (this.table1);
- global::Gtk.Box.BoxChild w24 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.table1]));
- w24.Position = 0;
- w24.Expand = false;
- w24.Fill = false;
- // Container child vbox3.Gtk.Box+BoxChild
- this.lbl_will_save_in = new global::Gtk.Label ();
- this.lbl_will_save_in.WidthRequest = 580;
- this.lbl_will_save_in.Name = "lbl_will_save_in";
- this.lbl_will_save_in.Xalign = 0F;
- this.lbl_will_save_in.Yalign = 0F;
- this.lbl_will_save_in.LabelProp = "Project will be saved in: /dev/null";
- this.lbl_will_save_in.Wrap = true;
- this.vbox3.Add (this.lbl_will_save_in);
- global::Gtk.Box.BoxChild w25 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.lbl_will_save_in]));
- w25.Position = 1;
- w25.Expand = false;
- w25.Fill = false;
- this.vbox1.Add (this.vbox3);
- global::Gtk.Box.BoxChild w26 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.vbox3]));
- w26.Position = 1;
- w26.Expand = false;
- this.notebook.Add (this.vbox1);
- // Notebook tab
- this.label1 = new global::Gtk.Label ();
- this.label1.Name = "label1";
- this.label1.LabelProp = "page1";
- this.notebook.SetTabLabel (this.vbox1, this.label1);
- this.label1.ShowAll ();
- // Container child notebook.Gtk.Notebook+NotebookChild
- this.vbox5 = new global::Gtk.VBox ();
- this.vbox5.Name = "vbox5";
- this.vbox5.Spacing = 6;
- // Container child vbox5.Gtk.Box+BoxChild
- this.label3 = new global::Gtk.Label ();
- this.label3.Name = "label3";
- this.label3.Xalign = 0F;
- this.label3.LabelProp = global::Mono.Unix.Catalog.GetString ("<b>Project Features</b>");
- this.label3.UseMarkup = true;
- this.vbox5.Add (this.label3);
- global::Gtk.Box.BoxChild w28 = ((global::Gtk.Box.BoxChild)(this.vbox5 [this.label3]));
- w28.Position = 0;
- w28.Expand = false;
- w28.Fill = false;
- // Container child vbox5.Gtk.Box+BoxChild
- this.label4 = new global::Gtk.Label ();
- this.label4.WidthRequest = 632;
- this.label4.Name = "label4";
- this.label4.Xalign = 0F;
- this.label4.LabelProp = global::Mono.Unix.Catalog.GetString ("<small>This list shows a set of features you can enable in the new project. After" +
- " creating the project those features can be enabled or disabled in the Project O" +
- "ptions dialog, or by adding new projects to the solution.</small>");
- this.label4.UseMarkup = true;
- this.label4.Wrap = true;
- this.vbox5.Add (this.label4);
- global::Gtk.Box.BoxChild w29 = ((global::Gtk.Box.BoxChild)(this.vbox5 [this.label4]));
- w29.Position = 1;
- w29.Expand = false;
- w29.Fill = false;
- this.notebook.Add (this.vbox5);
- global::Gtk.Notebook.NotebookChild w30 = ((global::Gtk.Notebook.NotebookChild)(this.notebook [this.vbox5]));
- w30.Position = 1;
- // Notebook tab
- this.label2 = new global::Gtk.Label ();
- this.label2.Name = "label2";
- this.label2.LabelProp = "page2";
- this.notebook.SetTabLabel (this.vbox5, this.label2);
- this.label2.ShowAll ();
- w1.Add (this.notebook);
- global::Gtk.Box.BoxChild w31 = ((global::Gtk.Box.BoxChild)(w1 [this.notebook]));
- w31.Position = 0;
- // Internal child MonoDevelop.Ide.Projects.NewProjectDialog.ActionArea
- global::Gtk.HButtonBox w32 = this.ActionArea;
- w32.Name = "dialog-action_area1";
- w32.Spacing = 6;
- w32.BorderWidth = ((uint)(5));
- w32.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4));
- // Container child dialog-action_area1.Gtk.ButtonBox+ButtonBoxChild
- this.btn_close = new global::Gtk.Button ();
- this.btn_close.CanDefault = true;
- this.btn_close.Name = "btn_close";
- this.btn_close.UseStock = true;
- this.btn_close.UseUnderline = true;
- this.btn_close.Label = "gtk-cancel";
- this.AddActionWidget (this.btn_close, -6);
- global::Gtk.ButtonBox.ButtonBoxChild w33 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w32 [this.btn_close]));
- w33.Expand = false;
- w33.Fill = false;
- // Container child dialog-action_area1.Gtk.ButtonBox+ButtonBoxChild
- this.btn_new = new global::Gtk.Button ();
- this.btn_new.CanDefault = true;
- this.btn_new.Name = "btn_new";
- this.btn_new.UseStock = true;
- this.btn_new.UseUnderline = true;
- this.btn_new.Label = "gtk-go-forward";
- w32.Add (this.btn_new);
- global::Gtk.ButtonBox.ButtonBoxChild w34 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w32 [this.btn_new]));
- w34.Position = 1;
- w34.Expand = false;
- w34.Fill = false;
- if ((this.Child != null)) {
- this.Child.ShowAll ();
- }
- this.DefaultWidth = 930;
- this.DefaultHeight = 539;
- this.lbl_name.MnemonicWidget = this.txt_name;
- this.lbl_subdirectory.MnemonicWidget = this.txt_subdirectory;
- this.Hide ();
- this.scrolledInfo.SizeAllocated += new global::Gtk.SizeAllocatedHandler (this.OnScrolledInfoSizeAllocated);
- this.boxInfo.SizeAllocated += new global::Gtk.SizeAllocatedHandler (this.OnBoxInfoSizeAllocated);
- this.txt_name.Changed += new global::System.EventHandler (this.NameChanged);
- this.txt_subdirectory.Changed += new global::System.EventHandler (this.PathChanged);
- this.chk_combine_directory.Clicked += new global::System.EventHandler (this.SolutionCheckChanged);
- this.btn_close.Clicked += new global::System.EventHandler (this.cancelClicked);
- this.btn_new.Clicked += new global::System.EventHandler (this.OpenEvent);
- }
- }
-}
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace MonoDevelop.Ide.Projects
+{
+ internal partial class NewProjectDialog
+ {
+ private global::Gtk.Notebook notebook;
+
+ private global::Gtk.VBox vbox1;
+
+ private global::Gtk.VBox vbox2;
+
+ private global::Gtk.HBox hbox1;
+
+ private global::Gtk.VBox vbox4;
+
+ private global::Gtk.HPaned hpaned1;
+
+ private global::Gtk.ScrolledWindow scrolledwindow1;
+
+ private global::Gtk.TreeView lst_template_types;
+
+ private global::Gtk.HPaned panedTemplates;
+
+ private global::Gtk.VBox boxTemplates;
+
+ private global::Gtk.ScrolledWindow scrolledInfo;
+
+ private global::Gtk.VBox boxInfo;
+
+ private global::Gtk.Label labelTemplateTitle;
+
+ private global::Gtk.Label lbl_template_descr;
+
+ private global::Gtk.VBox vbox3;
+
+ private global::Gtk.Table table1;
+
+ private global::MonoDevelop.Components.FolderEntry entry_location;
+
+ private global::Gtk.HBox hbox2;
+
+ private global::Gtk.Entry txt_subdirectory;
+
+ private global::Gtk.CheckButton chk_combine_directory;
+
+ private global::Gtk.Label lbl_location;
+
+ private global::Gtk.Label lbl_name;
+
+ private global::Gtk.Label lbl_subdirectory;
+
+ private global::Gtk.Entry txt_name;
+
+ private global::Gtk.Label lbl_will_save_in;
+
+ private global::Gtk.Label label1;
+
+ private global::Gtk.VBox vbox5;
+
+ private global::Gtk.Label label3;
+
+ private global::Gtk.Label label4;
+
+ private global::Gtk.Label label2;
+
+ private global::Gtk.Button btn_close;
+
+ private global::Gtk.Button btn_new;
+
+ protected virtual void Build ()
+ {
+ global::Stetic.Gui.Initialize (this);
+ // Widget MonoDevelop.Ide.Projects.NewProjectDialog
+ this.WidthRequest = 930;
+ this.Name = "MonoDevelop.Ide.Projects.NewProjectDialog";
+ this.Title = "New Solution";
+ this.TypeHint = ((global::Gdk.WindowTypeHint)(1));
+ this.WindowPosition = ((global::Gtk.WindowPosition)(1));
+ this.BorderWidth = ((uint)(6));
+ this.DestroyWithParent = true;
+ // Internal child MonoDevelop.Ide.Projects.NewProjectDialog.VBox
+ global::Gtk.VBox w1 = this.VBox;
+ w1.Name = "dialog-vbox1";
+ w1.Spacing = 6;
+ w1.BorderWidth = ((uint)(2));
+ // Container child dialog-vbox1.Gtk.Box+BoxChild
+ this.notebook = new global::Gtk.Notebook ();
+ this.notebook.CanFocus = true;
+ this.notebook.Name = "notebook";
+ this.notebook.CurrentPage = 0;
+ this.notebook.ShowBorder = false;
+ this.notebook.BorderWidth = ((uint)(6));
+ // Container child notebook.Gtk.Notebook+NotebookChild
+ this.vbox1 = new global::Gtk.VBox ();
+ this.vbox1.Name = "vbox1";
+ this.vbox1.Spacing = 7;
+ // Container child vbox1.Gtk.Box+BoxChild
+ this.vbox2 = new global::Gtk.VBox ();
+ this.vbox2.Name = "vbox2";
+ this.vbox2.Spacing = 6;
+ // Container child vbox2.Gtk.Box+BoxChild
+ this.hbox1 = new global::Gtk.HBox ();
+ this.hbox1.Name = "hbox1";
+ // Container child hbox1.Gtk.Box+BoxChild
+ this.vbox4 = new global::Gtk.VBox ();
+ this.vbox4.Name = "vbox4";
+ this.vbox4.Spacing = 6;
+ // Container child vbox4.Gtk.Box+BoxChild
+ this.hpaned1 = new global::Gtk.HPaned ();
+ this.hpaned1.CanFocus = true;
+ this.hpaned1.Name = "hpaned1";
+ this.hpaned1.Position = 188;
+ // Container child hpaned1.Gtk.Paned+PanedChild
+ this.scrolledwindow1 = new global::Gtk.ScrolledWindow ();
+ this.scrolledwindow1.Name = "scrolledwindow1";
+ this.scrolledwindow1.ShadowType = ((global::Gtk.ShadowType)(1));
+ // Container child scrolledwindow1.Gtk.Container+ContainerChild
+ this.lst_template_types = new global::Gtk.TreeView ();
+ this.lst_template_types.Name = "lst_template_types";
+ this.lst_template_types.HeadersVisible = false;
+ this.scrolledwindow1.Add (this.lst_template_types);
+ this.hpaned1.Add (this.scrolledwindow1);
+ global::Gtk.Paned.PanedChild w3 = ((global::Gtk.Paned.PanedChild)(this.hpaned1 [this.scrolledwindow1]));
+ w3.Resize = false;
+ // Container child hpaned1.Gtk.Paned+PanedChild
+ this.panedTemplates = new global::Gtk.HPaned ();
+ this.panedTemplates.CanFocus = true;
+ this.panedTemplates.Name = "panedTemplates";
+ this.panedTemplates.Position = 430;
+ // Container child panedTemplates.Gtk.Paned+PanedChild
+ this.boxTemplates = new global::Gtk.VBox ();
+ this.boxTemplates.Name = "boxTemplates";
+ this.boxTemplates.Spacing = 6;
+ this.panedTemplates.Add (this.boxTemplates);
+ global::Gtk.Paned.PanedChild w4 = ((global::Gtk.Paned.PanedChild)(this.panedTemplates [this.boxTemplates]));
+ w4.Resize = false;
+ // Container child panedTemplates.Gtk.Paned+PanedChild
+ this.scrolledInfo = new global::Gtk.ScrolledWindow ();
+ this.scrolledInfo.CanFocus = true;
+ this.scrolledInfo.Name = "scrolledInfo";
+ this.scrolledInfo.HscrollbarPolicy = ((global::Gtk.PolicyType)(2));
+ this.scrolledInfo.ShadowType = ((global::Gtk.ShadowType)(1));
+ // Container child scrolledInfo.Gtk.Container+ContainerChild
+ global::Gtk.Viewport w5 = new global::Gtk.Viewport ();
+ w5.ShadowType = ((global::Gtk.ShadowType)(0));
+ // Container child GtkViewport.Gtk.Container+ContainerChild
+ this.boxInfo = new global::Gtk.VBox ();
+ this.boxInfo.Name = "boxInfo";
+ this.boxInfo.Spacing = 6;
+ this.boxInfo.BorderWidth = ((uint)(3));
+ // Container child boxInfo.Gtk.Box+BoxChild
+ this.labelTemplateTitle = new global::Gtk.Label ();
+ this.labelTemplateTitle.WidthRequest = 30;
+ this.labelTemplateTitle.Name = "labelTemplateTitle";
+ this.labelTemplateTitle.Xalign = 0F;
+ this.labelTemplateTitle.LabelProp = global::Mono.Unix.Catalog.GetString ("<b>Console Project</b>");
+ this.labelTemplateTitle.UseMarkup = true;
+ this.labelTemplateTitle.Wrap = true;
+ this.boxInfo.Add (this.labelTemplateTitle);
+ global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.boxInfo [this.labelTemplateTitle]));
+ w6.Position = 0;
+ w6.Expand = false;
+ w6.Fill = false;
+ // Container child boxInfo.Gtk.Box+BoxChild
+ this.lbl_template_descr = new global::Gtk.Label ();
+ this.lbl_template_descr.WidthRequest = 116;
+ this.lbl_template_descr.Name = "lbl_template_descr";
+ this.lbl_template_descr.Xalign = 0F;
+ this.lbl_template_descr.Yalign = 0F;
+ this.lbl_template_descr.LabelProp = global::Mono.Unix.Catalog.GetString ("Creates a new C# Project");
+ this.lbl_template_descr.Wrap = true;
+ this.boxInfo.Add (this.lbl_template_descr);
+ global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.boxInfo [this.lbl_template_descr]));
+ w7.Position = 1;
+ w7.Expand = false;
+ w7.Fill = false;
+ w5.Add (this.boxInfo);
+ this.scrolledInfo.Add (w5);
+ this.panedTemplates.Add (this.scrolledInfo);
+ global::Gtk.Paned.PanedChild w10 = ((global::Gtk.Paned.PanedChild)(this.panedTemplates [this.scrolledInfo]));
+ w10.Resize = false;
+ this.hpaned1.Add (this.panedTemplates);
+ this.vbox4.Add (this.hpaned1);
+ global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(this.vbox4 [this.hpaned1]));
+ w12.Position = 0;
+ this.hbox1.Add (this.vbox4);
+ global::Gtk.Box.BoxChild w13 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.vbox4]));
+ w13.Position = 0;
+ this.vbox2.Add (this.hbox1);
+ global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.hbox1]));
+ w14.Position = 0;
+ this.vbox1.Add (this.vbox2);
+ global::Gtk.Box.BoxChild w15 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.vbox2]));
+ w15.Position = 0;
+ // Container child vbox1.Gtk.Box+BoxChild
+ this.vbox3 = new global::Gtk.VBox ();
+ this.vbox3.Name = "vbox3";
+ this.vbox3.Spacing = 6;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.table1 = new global::Gtk.Table (((uint)(3)), ((uint)(2)), false);
+ this.table1.Name = "table1";
+ this.table1.RowSpacing = ((uint)(6));
+ this.table1.ColumnSpacing = ((uint)(6));
+ // Container child table1.Gtk.Table+TableChild
+ this.entry_location = new global::MonoDevelop.Components.FolderEntry ();
+ this.entry_location.Name = "entry_location";
+ this.entry_location.DisplayAsRelativePath = false;
+ this.table1.Add (this.entry_location);
+ global::Gtk.Table.TableChild w16 = ((global::Gtk.Table.TableChild)(this.table1 [this.entry_location]));
+ w16.TopAttach = ((uint)(1));
+ w16.BottomAttach = ((uint)(2));
+ w16.LeftAttach = ((uint)(1));
+ w16.RightAttach = ((uint)(2));
+ w16.XOptions = ((global::Gtk.AttachOptions)(4));
+ w16.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child table1.Gtk.Table+TableChild
+ this.hbox2 = new global::Gtk.HBox ();
+ this.hbox2.Name = "hbox2";
+ this.hbox2.Spacing = 6;
+ // Container child hbox2.Gtk.Box+BoxChild
+ this.txt_subdirectory = new global::Gtk.Entry ();
+ this.txt_subdirectory.Name = "txt_subdirectory";
+ this.txt_subdirectory.IsEditable = true;
+ this.txt_subdirectory.ActivatesDefault = true;
+ this.txt_subdirectory.InvisibleChar = '●';
+ this.hbox2.Add (this.txt_subdirectory);
+ global::Gtk.Box.BoxChild w17 = ((global::Gtk.Box.BoxChild)(this.hbox2 [this.txt_subdirectory]));
+ w17.Position = 0;
+ // Container child hbox2.Gtk.Box+BoxChild
+ this.chk_combine_directory = new global::Gtk.CheckButton ();
+ this.chk_combine_directory.Name = "chk_combine_directory";
+ this.chk_combine_directory.Label = global::Mono.Unix.Catalog.GetString ("_Create directory for solution");
+ this.chk_combine_directory.Active = true;
+ this.chk_combine_directory.DrawIndicator = true;
+ this.chk_combine_directory.UseUnderline = true;
+ this.hbox2.Add (this.chk_combine_directory);
+ global::Gtk.Box.BoxChild w18 = ((global::Gtk.Box.BoxChild)(this.hbox2 [this.chk_combine_directory]));
+ w18.Position = 1;
+ w18.Expand = false;
+ w18.Fill = false;
+ this.table1.Add (this.hbox2);
+ global::Gtk.Table.TableChild w19 = ((global::Gtk.Table.TableChild)(this.table1 [this.hbox2]));
+ w19.TopAttach = ((uint)(2));
+ w19.BottomAttach = ((uint)(3));
+ w19.LeftAttach = ((uint)(1));
+ w19.RightAttach = ((uint)(2));
+ w19.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child table1.Gtk.Table+TableChild
+ this.lbl_location = new global::Gtk.Label ();
+ this.lbl_location.Name = "lbl_location";
+ this.lbl_location.Xalign = 0F;
+ this.lbl_location.Yalign = 0F;
+ this.lbl_location.LabelProp = global::Mono.Unix.Catalog.GetString ("_Location:");
+ this.lbl_location.UseUnderline = true;
+ this.table1.Add (this.lbl_location);
+ global::Gtk.Table.TableChild w20 = ((global::Gtk.Table.TableChild)(this.table1 [this.lbl_location]));
+ w20.TopAttach = ((uint)(1));
+ w20.BottomAttach = ((uint)(2));
+ w20.XOptions = ((global::Gtk.AttachOptions)(4));
+ w20.YOptions = ((global::Gtk.AttachOptions)(0));
+ // Container child table1.Gtk.Table+TableChild
+ this.lbl_name = new global::Gtk.Label ();
+ this.lbl_name.Name = "lbl_name";
+ this.lbl_name.Xalign = 0F;
+ this.lbl_name.Yalign = 0F;
+ this.lbl_name.LabelProp = global::Mono.Unix.Catalog.GetString ("N_ame:");
+ this.lbl_name.UseUnderline = true;
+ this.table1.Add (this.lbl_name);
+ global::Gtk.Table.TableChild w21 = ((global::Gtk.Table.TableChild)(this.table1 [this.lbl_name]));
+ w21.XOptions = ((global::Gtk.AttachOptions)(4));
+ w21.YOptions = ((global::Gtk.AttachOptions)(0));
+ // Container child table1.Gtk.Table+TableChild
+ this.lbl_subdirectory = new global::Gtk.Label ();
+ this.lbl_subdirectory.Name = "lbl_subdirectory";
+ this.lbl_subdirectory.Xalign = 0F;
+ this.lbl_subdirectory.LabelProp = global::Mono.Unix.Catalog.GetString ("_Solution name:");
+ this.lbl_subdirectory.UseUnderline = true;
+ this.table1.Add (this.lbl_subdirectory);
+ global::Gtk.Table.TableChild w22 = ((global::Gtk.Table.TableChild)(this.table1 [this.lbl_subdirectory]));
+ w22.TopAttach = ((uint)(2));
+ w22.BottomAttach = ((uint)(3));
+ w22.XOptions = ((global::Gtk.AttachOptions)(4));
+ w22.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child table1.Gtk.Table+TableChild
+ this.txt_name = new global::Gtk.Entry ();
+ this.txt_name.Name = "txt_name";
+ this.txt_name.IsEditable = true;
+ this.txt_name.ActivatesDefault = true;
+ this.txt_name.InvisibleChar = '●';
+ this.table1.Add (this.txt_name);
+ global::Gtk.Table.TableChild w23 = ((global::Gtk.Table.TableChild)(this.table1 [this.txt_name]));
+ w23.LeftAttach = ((uint)(1));
+ w23.RightAttach = ((uint)(2));
+ w23.YOptions = ((global::Gtk.AttachOptions)(0));
+ this.vbox3.Add (this.table1);
+ global::Gtk.Box.BoxChild w24 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.table1]));
+ w24.Position = 0;
+ w24.Expand = false;
+ w24.Fill = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.lbl_will_save_in = new global::Gtk.Label ();
+ this.lbl_will_save_in.WidthRequest = 580;
+ this.lbl_will_save_in.Name = "lbl_will_save_in";
+ this.lbl_will_save_in.Xalign = 0F;
+ this.lbl_will_save_in.Yalign = 0F;
+ this.lbl_will_save_in.LabelProp = "Project will be saved in: /dev/null";
+ this.lbl_will_save_in.Wrap = true;
+ this.vbox3.Add (this.lbl_will_save_in);
+ global::Gtk.Box.BoxChild w25 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.lbl_will_save_in]));
+ w25.Position = 1;
+ w25.Expand = false;
+ w25.Fill = false;
+ this.vbox1.Add (this.vbox3);
+ global::Gtk.Box.BoxChild w26 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.vbox3]));
+ w26.Position = 1;
+ w26.Expand = false;
+ this.notebook.Add (this.vbox1);
+ // Notebook tab
+ this.label1 = new global::Gtk.Label ();
+ this.label1.Name = "label1";
+ this.label1.LabelProp = "page1";
+ this.notebook.SetTabLabel (this.vbox1, this.label1);
+ this.label1.ShowAll ();
+ // Container child notebook.Gtk.Notebook+NotebookChild
+ this.vbox5 = new global::Gtk.VBox ();
+ this.vbox5.Name = "vbox5";
+ this.vbox5.Spacing = 6;
+ // Container child vbox5.Gtk.Box+BoxChild
+ this.label3 = new global::Gtk.Label ();
+ this.label3.Name = "label3";
+ this.label3.Xalign = 0F;
+ this.label3.LabelProp = global::Mono.Unix.Catalog.GetString ("<b>Project Features</b>");
+ this.label3.UseMarkup = true;
+ this.vbox5.Add (this.label3);
+ global::Gtk.Box.BoxChild w28 = ((global::Gtk.Box.BoxChild)(this.vbox5 [this.label3]));
+ w28.Position = 0;
+ w28.Expand = false;
+ w28.Fill = false;
+ // Container child vbox5.Gtk.Box+BoxChild
+ this.label4 = new global::Gtk.Label ();
+ this.label4.WidthRequest = 632;
+ this.label4.Name = "label4";
+ this.label4.Xalign = 0F;
+ this.label4.LabelProp = global::Mono.Unix.Catalog.GetString ("<small>This list shows a set of features you can enable in the new project. After creating the project those features can be enabled or disabled in the Project Options dialog, or by adding new projects to the solution.</small>");
+ this.label4.UseMarkup = true;
+ this.label4.Wrap = true;
+ this.vbox5.Add (this.label4);
+ global::Gtk.Box.BoxChild w29 = ((global::Gtk.Box.BoxChild)(this.vbox5 [this.label4]));
+ w29.Position = 1;
+ w29.Expand = false;
+ w29.Fill = false;
+ this.notebook.Add (this.vbox5);
+ global::Gtk.Notebook.NotebookChild w30 = ((global::Gtk.Notebook.NotebookChild)(this.notebook [this.vbox5]));
+ w30.Position = 1;
+ // Notebook tab
+ this.label2 = new global::Gtk.Label ();
+ this.label2.Name = "label2";
+ this.label2.LabelProp = "page2";
+ this.notebook.SetTabLabel (this.vbox5, this.label2);
+ this.label2.ShowAll ();
+ w1.Add (this.notebook);
+ global::Gtk.Box.BoxChild w31 = ((global::Gtk.Box.BoxChild)(w1 [this.notebook]));
+ w31.Position = 0;
+ // Internal child MonoDevelop.Ide.Projects.NewProjectDialog.ActionArea
+ global::Gtk.HButtonBox w32 = this.ActionArea;
+ w32.Name = "dialog-action_area1";
+ w32.Spacing = 6;
+ w32.BorderWidth = ((uint)(5));
+ w32.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4));
+ // Container child dialog-action_area1.Gtk.ButtonBox+ButtonBoxChild
+ this.btn_close = new global::Gtk.Button ();
+ this.btn_close.CanDefault = true;
+ this.btn_close.Name = "btn_close";
+ this.btn_close.UseStock = true;
+ this.btn_close.UseUnderline = true;
+ this.btn_close.Label = "gtk-cancel";
+ this.AddActionWidget (this.btn_close, -6);
+ global::Gtk.ButtonBox.ButtonBoxChild w33 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w32 [this.btn_close]));
+ w33.Expand = false;
+ w33.Fill = false;
+ // Container child dialog-action_area1.Gtk.ButtonBox+ButtonBoxChild
+ this.btn_new = new global::Gtk.Button ();
+ this.btn_new.CanDefault = true;
+ this.btn_new.Name = "btn_new";
+ this.btn_new.UseStock = true;
+ this.btn_new.UseUnderline = true;
+ this.btn_new.Label = "gtk-go-forward";
+ w32.Add (this.btn_new);
+ global::Gtk.ButtonBox.ButtonBoxChild w34 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w32 [this.btn_new]));
+ w34.Position = 1;
+ w34.Expand = false;
+ w34.Fill = false;
+ if ((this.Child != null)) {
+ this.Child.ShowAll ();
+ }
+ this.DefaultWidth = 930;
+ this.DefaultHeight = 539;
+ this.lbl_name.MnemonicWidget = this.txt_name;
+ this.lbl_subdirectory.MnemonicWidget = this.txt_subdirectory;
+ this.Hide ();
+ this.scrolledInfo.SizeAllocated += new global::Gtk.SizeAllocatedHandler (this.OnScrolledInfoSizeAllocated);
+ this.boxInfo.SizeAllocated += new global::Gtk.SizeAllocatedHandler (this.OnBoxInfoSizeAllocated);
+ this.txt_name.Changed += new global::System.EventHandler (this.NameChanged);
+ this.txt_subdirectory.Changed += new global::System.EventHandler (this.PathChanged);
+ this.chk_combine_directory.Clicked += new global::System.EventHandler (this.SolutionCheckChanged);
+ this.btn_close.Clicked += new global::System.EventHandler (this.cancelClicked);
+ this.btn_new.Clicked += new global::System.EventHandler (this.OpenEvent);
+ }
+ }
+}
diff --git a/main/src/core/MonoDevelop.Ide/gtk-gui/gui.stetic b/main/src/core/MonoDevelop.Ide/gtk-gui/gui.stetic
index d8078c5191..b21ff3ba7a 100644
--- a/main/src/core/MonoDevelop.Ide/gtk-gui/gui.stetic
+++ b/main/src/core/MonoDevelop.Ide/gtk-gui/gui.stetic
@@ -14,6 +14,7 @@
<property name="MemberName" />
<property name="Visible">False</property>
<property name="Events">ButtonPressMask</property>
+ <property name="GeneratePublic">False</property>
<property name="Title" translatable="yes">Export Solution</property>
<property name="WindowPosition">CenterOnParent</property>
<property name="BorderWidth">6</property>
@@ -240,6 +241,7 @@
<property name="MemberName" />
<property name="WidthRequest">930</property>
<property name="Visible">False</property>
+ <property name="GeneratePublic">False</property>
<property name="Title">New Solution</property>
<property name="TypeHint">Dialog</property>
<property name="WindowPosition">Center</property>
@@ -6261,6 +6263,7 @@ All solutions</property>
<widget class="Gtk.Dialog" id="MonoDevelop.Ide.Projects.ConfirmProjectDeleteDialog" design-size="512 387">
<property name="MemberName" />
<property name="Visible">False</property>
+ <property name="GeneratePublic">False</property>
<property name="Title" translatable="yes">Delete Project</property>
<property name="WindowPosition">CenterOnParent</property>
<property name="Modal">True</property>
@@ -10699,6 +10702,7 @@ Visual Studio generates a default ID for embedded resources, instead of simply u
</widget>
<widget class="Gtk.Dialog" id="MonoDevelop.Ide.Projects.NewPolicySetDialog" design-size="429 200">
<property name="MemberName" />
+ <property name="GeneratePublic">False</property>
<property name="Title" translatable="yes">New Policy</property>
<property name="WindowPosition">CenterOnParent</property>
<property name="Buttons">2</property>
diff --git a/main/src/core/MonoDevelop.Ide/icons/compiler-options-16.png b/main/src/core/MonoDevelop.Ide/icons/compiler-options-16.png
deleted file mode 100644
index b78f93e965..0000000000
--- a/main/src/core/MonoDevelop.Ide/icons/compiler-options-16.png
+++ /dev/null
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/custom-commands-16.png b/main/src/core/MonoDevelop.Ide/icons/custom-commands-16.png
deleted file mode 100644
index 8cde617d3b..0000000000
--- a/main/src/core/MonoDevelop.Ide/icons/custom-commands-16.png
+++ /dev/null
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/drive-16.png b/main/src/core/MonoDevelop.Ide/icons/drive-16.png
deleted file mode 100755
index b6822468da..0000000000
--- a/main/src/core/MonoDevelop.Ide/icons/drive-16.png
+++ /dev/null
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/formatting-16.png b/main/src/core/MonoDevelop.Ide/icons/formatting-16.png
deleted file mode 100644
index e756df0546..0000000000
--- a/main/src/core/MonoDevelop.Ide/icons/formatting-16.png
+++ /dev/null
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/hammer-16.png b/main/src/core/MonoDevelop.Ide/icons/hammer-16.png
deleted file mode 100755
index 970bdaa911..0000000000
--- a/main/src/core/MonoDevelop.Ide/icons/hammer-16.png
+++ /dev/null
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/keyboard-shortcuts-16.png b/main/src/core/MonoDevelop.Ide/icons/keyboard-shortcuts-16.png
deleted file mode 100755
index 8b9c740f41..0000000000
--- a/main/src/core/MonoDevelop.Ide/icons/keyboard-shortcuts-16.png
+++ /dev/null
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/letters-16.png b/main/src/core/MonoDevelop.Ide/icons/letters-16.png
deleted file mode 100755
index 8f22ae6273..0000000000
--- a/main/src/core/MonoDevelop.Ide/icons/letters-16.png
+++ /dev/null
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/add-16.png b/main/src/core/MonoDevelop.Ide/icons/light/add-16.png
index 269fbb39be..1885122981 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/add-16.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/add-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/add-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/add-16@2x.png
index 2c0ba56029..3b6dece125 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/add-16@2x.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/add-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-16.png b/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-16.png
index cc19a5ade7..c0c017eb32 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-16.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-16@2x.png
index 53c8edb69a..9f68a52e2f 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-16@2x.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-invalid-16.png b/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-invalid-16.png
index 42464a8da8..c7075c7e8c 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-invalid-16.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-invalid-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-invalid-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-invalid-16@2x.png
index b6396b1ea1..6a684c6baf 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-invalid-16@2x.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-invalid-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-new-16.png b/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-new-16.png
index f3b20d1c1f..186cab63bc 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-new-16.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-new-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-new-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-new-16@2x.png
index d29f35d0be..fd0345e0d9 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-new-16@2x.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-new-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-on-off-16.png b/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-on-off-16.png
index 5a4fe826c1..99a37a5497 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-on-off-16.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-on-off-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-on-off-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-on-off-16@2x.png
index 2611c196cb..4bdfc0bd33 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-on-off-16@2x.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/breakpoint-on-off-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/copy-16.png b/main/src/core/MonoDevelop.Ide/icons/light/copy-16.png
new file mode 100644
index 0000000000..574162bafa
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/copy-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/copy-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/copy-16@2x.png
new file mode 100644
index 0000000000..343cabc06c
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/copy-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/done-16.png b/main/src/core/MonoDevelop.Ide/icons/light/done-16.png
index 469f60c5e3..7799066c43 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/done-16.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/done-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/done-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/done-16@2x.png
index 7b24c97916..c63d3974d1 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/done-16@2x.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/done-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/element-exception-16.png b/main/src/core/MonoDevelop.Ide/icons/light/element-exception-16.png
new file mode 100644
index 0000000000..d25657e2af
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/element-exception-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/element-exception-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/element-exception-16@2x.png
new file mode 100644
index 0000000000..e926c3c9ab
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/element-exception-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/element-fs-field-16.png b/main/src/core/MonoDevelop.Ide/icons/light/element-fs-field-16.png
new file mode 100644
index 0000000000..fdfd653023
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/element-fs-field-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/element-fs-field-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/element-fs-field-16@2x.png
new file mode 100644
index 0000000000..2e1b4c5ec9
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/element-fs-field-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/element-method-new-16.png b/main/src/core/MonoDevelop.Ide/icons/light/element-method-new-16.png
index a84e0df9a7..440b505bb8 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/element-method-new-16.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/element-method-new-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/element-method-new-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/element-method-new-16@2x.png
index 2f08476974..d6011bb744 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/element-method-new-16@2x.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/element-method-new-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/element-module-16.png b/main/src/core/MonoDevelop.Ide/icons/light/element-module-16.png
new file mode 100644
index 0000000000..8c866474da
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/element-module-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/element-module-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/element-module-16@2x.png
new file mode 100644
index 0000000000..bd2192282e
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/element-module-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/element-other-declaration-16.png b/main/src/core/MonoDevelop.Ide/icons/light/element-other-declaration-16.png
new file mode 100644
index 0000000000..bb9955fb86
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/element-other-declaration-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/element-other-declaration-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/element-other-declaration-16@2x.png
new file mode 100644
index 0000000000..e94d4d8b38
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/element-other-declaration-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/element-type-16.png b/main/src/core/MonoDevelop.Ide/icons/light/element-type-16.png
new file mode 100644
index 0000000000..53a2f5f33f
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/element-type-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/element-type-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/element-type-16@2x.png
new file mode 100644
index 0000000000..11fcb74fd6
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/element-type-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/error-16.png b/main/src/core/MonoDevelop.Ide/icons/light/error-16.png
index d9c4c975f2..30b5da6e9b 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/error-16.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/error-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/error-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/error-16@2x.png
index 22dfe0c16c..adfd2b7b19 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/error-16@2x.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/error-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/error-24.png b/main/src/core/MonoDevelop.Ide/icons/light/error-24.png
index 5fd87a9170..637ab79bff 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/error-24.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/error-24.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/error-24@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/error-24@2x.png
index 6973c54f8d..bf5a3b9f70 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/error-24@2x.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/error-24@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/error-32.png b/main/src/core/MonoDevelop.Ide/icons/light/error-32.png
index 22dfe0c16c..adfd2b7b19 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/error-32.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/error-32.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/error-32@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/error-32@2x.png
index da95643e4a..f422cb3969 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/error-32@2x.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/error-32@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/error-48.png b/main/src/core/MonoDevelop.Ide/icons/light/error-48.png
index 6973c54f8d..bf5a3b9f70 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/error-48.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/error-48.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/error-48@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/error-48@2x.png
index 9ab708779d..1e2cd50f70 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/error-48@2x.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/error-48@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/file-script-16.png b/main/src/core/MonoDevelop.Ide/icons/light/file-script-16.png
new file mode 100644
index 0000000000..78fab9fae2
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/file-script-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/file-script-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/file-script-16@2x.png
new file mode 100644
index 0000000000..a77dfbe024
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/file-script-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/file-script-32.png b/main/src/core/MonoDevelop.Ide/icons/light/file-script-32.png
new file mode 100644
index 0000000000..a77dfbe024
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/file-script-32.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/file-script-32@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/file-script-32@2x.png
new file mode 100644
index 0000000000..892e70fc93
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/file-script-32@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/find-16.png b/main/src/core/MonoDevelop.Ide/icons/light/find-16.png
new file mode 100644
index 0000000000..85e5d0df07
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/find-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/find-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/find-16@2x.png
new file mode 100644
index 0000000000..f53fae3769
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/find-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/find-and-replace-16.png b/main/src/core/MonoDevelop.Ide/icons/light/find-and-replace-16.png
new file mode 100644
index 0000000000..4fd9e05804
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/find-and-replace-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/find-and-replace-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/find-and-replace-16@2x.png
new file mode 100644
index 0000000000..9ae65404e5
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/find-and-replace-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/go-back-16.png b/main/src/core/MonoDevelop.Ide/icons/light/go-back-16.png
new file mode 100644
index 0000000000..a812575428
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/go-back-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/go-back-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/go-back-16@2x.png
new file mode 100644
index 0000000000..dd2620713e
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/go-back-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/go-down-16.png b/main/src/core/MonoDevelop.Ide/icons/light/go-down-16.png
new file mode 100644
index 0000000000..24c499b29c
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/go-down-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/go-down-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/go-down-16@2x.png
new file mode 100644
index 0000000000..2df5aecf13
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/go-down-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/go-forward-16.png b/main/src/core/MonoDevelop.Ide/icons/light/go-forward-16.png
new file mode 100644
index 0000000000..1d338ba1bb
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/go-forward-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/go-forward-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/go-forward-16@2x.png
new file mode 100644
index 0000000000..cd6c264767
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/go-forward-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/go-up-16.png b/main/src/core/MonoDevelop.Ide/icons/light/go-up-16.png
new file mode 100644
index 0000000000..3d7f56a783
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/go-up-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/go-up-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/go-up-16@2x.png
new file mode 100644
index 0000000000..d768f10cfa
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/go-up-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/home-16.png b/main/src/core/MonoDevelop.Ide/icons/light/home-16.png
new file mode 100644
index 0000000000..33f0f125d1
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/home-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/home-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/home-16@2x.png
new file mode 100644
index 0000000000..4911d16866
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/home-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/information-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/information-16@2x.png
index df699e23de..5557a3de4a 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/information-16@2x.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/information-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/information-32.png b/main/src/core/MonoDevelop.Ide/icons/light/information-32.png
index df699e23de..5557a3de4a 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/information-32.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/information-32.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/jump-to-16.png b/main/src/core/MonoDevelop.Ide/icons/light/jump-to-16.png
new file mode 100644
index 0000000000..274255670b
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/jump-to-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/jump-to-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/jump-to-16@2x.png
new file mode 100644
index 0000000000..2c0c87596d
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/jump-to-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/media-play-16.png b/main/src/core/MonoDevelop.Ide/icons/light/media-play-16.png
new file mode 100644
index 0000000000..7b5e2a5b1f
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/media-play-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/media-play-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/media-play-16@2x.png
new file mode 100644
index 0000000000..4e2eaf097d
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/media-play-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/missing-image-16.png b/main/src/core/MonoDevelop.Ide/icons/light/missing-image-16.png
new file mode 100644
index 0000000000..bf13fbba53
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/missing-image-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/missing-image-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/missing-image-16@2x.png
new file mode 100644
index 0000000000..71dba1ed78
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/missing-image-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/open-16.png b/main/src/core/MonoDevelop.Ide/icons/light/open-16.png
new file mode 100644
index 0000000000..fbb0cec986
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/open-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/package-22.png b/main/src/core/MonoDevelop.Ide/icons/light/package-22.png
deleted file mode 100644
index 1f766f555e..0000000000
--- a/main/src/core/MonoDevelop.Ide/icons/light/package-22.png
+++ /dev/null
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/package-22@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/package-22@2x.png
deleted file mode 100644
index 5ea3ad546e..0000000000
--- a/main/src/core/MonoDevelop.Ide/icons/light/package-22@2x.png
+++ /dev/null
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/package-24.png b/main/src/core/MonoDevelop.Ide/icons/light/package-24.png
new file mode 100644
index 0000000000..0e2e9604a4
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/package-24.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/package-24@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/package-24@2x.png
new file mode 100644
index 0000000000..81a5324fce
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/package-24@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-author-information-16.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-author-information-16.png
new file mode 100644
index 0000000000..a911510938
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-author-information-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-author-information-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-author-information-16@2x.png
new file mode 100644
index 0000000000..e6de7cb721
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-author-information-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-build-16.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-build-16.png
new file mode 100644
index 0000000000..45fd2732a6
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-build-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-build-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-build-16@2x.png
new file mode 100644
index 0000000000..2e6aec66a5
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-build-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-code-formatting-16.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-code-formatting-16.png
new file mode 100644
index 0000000000..66313da3bc
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-code-formatting-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-code-formatting-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-code-formatting-16@2x.png
new file mode 100644
index 0000000000..243e316934
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-code-formatting-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-code-templates-16.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-code-templates-16.png
new file mode 100644
index 0000000000..ba48bc0df4
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-code-templates-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-code-templates-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-code-templates-16@2x.png
new file mode 100644
index 0000000000..052e26edf7
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-code-templates-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-csharp-16.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-csharp-16.png
new file mode 100644
index 0000000000..34b7ac06e1
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-csharp-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-csharp-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-csharp-16@2x.png
new file mode 100644
index 0000000000..df5ea2bdc6
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-csharp-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-dotnet-naming-policies-16.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-dotnet-naming-policies-16.png
new file mode 100644
index 0000000000..e7e0d6f2e6
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-dotnet-naming-policies-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-dotnet-naming-policies-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-dotnet-naming-policies-16@2x.png
new file mode 100644
index 0000000000..a5443dde5b
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-dotnet-naming-policies-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-external-tools-16.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-external-tools-16.png
new file mode 100644
index 0000000000..73668287fb
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-external-tools-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-external-tools-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-external-tools-16@2x.png
new file mode 100644
index 0000000000..3fb43534d5
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-external-tools-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-fonts-16.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-fonts-16.png
new file mode 100644
index 0000000000..72ed2240e2
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-fonts-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-fonts-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-fonts-16@2x.png
new file mode 100644
index 0000000000..00609d0eca
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-fonts-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-generic-16.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-generic-16.png
new file mode 100644
index 0000000000..7e65a86774
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-generic-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-generic-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-generic-16@2x.png
new file mode 100644
index 0000000000..593606db5f
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-generic-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-key-bindings-16.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-key-bindings-16.png
new file mode 100644
index 0000000000..52c35f86fb
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-key-bindings-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-key-bindings-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-key-bindings-16@2x.png
new file mode 100644
index 0000000000..5184aa50c6
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-key-bindings-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-language-16.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-language-16.png
new file mode 100644
index 0000000000..19f2663360
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-language-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-language-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-language-16@2x.png
new file mode 100644
index 0000000000..1e4d00deb6
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-language-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-load-save-16.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-load-save-16.png
new file mode 100644
index 0000000000..4cda9212c9
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-load-save-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-load-save-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-load-save-16@2x.png
new file mode 100644
index 0000000000..93c03d1a65
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-load-save-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-name-conventions-16.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-name-conventions-16.png
new file mode 100644
index 0000000000..e6a8ac57cf
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-name-conventions-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-name-conventions-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-name-conventions-16@2x.png
new file mode 100644
index 0000000000..3267cddee2
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-name-conventions-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-play-16.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-play-16.png
new file mode 100644
index 0000000000..66bf188a37
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-play-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-play-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-play-16@2x.png
new file mode 100644
index 0000000000..417e6855b3
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-play-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-sdk-locations-16.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-sdk-locations-16.png
new file mode 100644
index 0000000000..800b76d447
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-sdk-locations-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-sdk-locations-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-sdk-locations-16@2x.png
new file mode 100644
index 0000000000..c319f59bc2
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-sdk-locations-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-standard-header-16.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-standard-header-16.png
new file mode 100644
index 0000000000..83f9bcee6d
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-standard-header-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-standard-header-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-standard-header-16@2x.png
new file mode 100644
index 0000000000..05d18fb6bd
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-standard-header-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-task-list-16.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-task-list-16.png
new file mode 100644
index 0000000000..17e0ea108d
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-task-list-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-task-list-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-task-list-16@2x.png
new file mode 100644
index 0000000000..fe974de727
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-task-list-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-updates-16.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-updates-16.png
new file mode 100644
index 0000000000..818f09fb65
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-updates-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/prefs-updates-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/prefs-updates-16@2x.png
new file mode 100644
index 0000000000..0582e35d0c
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/prefs-updates-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/question-16.png b/main/src/core/MonoDevelop.Ide/icons/light/question-16.png
new file mode 100644
index 0000000000..eaaa5ef50c
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/question-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/question-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/question-16@2x.png
new file mode 100644
index 0000000000..37cf140f47
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/question-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/question-24.png b/main/src/core/MonoDevelop.Ide/icons/light/question-24.png
new file mode 100644
index 0000000000..9f6e40ebf4
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/question-24.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/question-24@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/question-24@2x.png
new file mode 100644
index 0000000000..9dd68c7f5a
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/question-24@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/question-32.png b/main/src/core/MonoDevelop.Ide/icons/light/question-32.png
new file mode 100644
index 0000000000..37cf140f47
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/question-32.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/question-32@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/question-32@2x.png
new file mode 100644
index 0000000000..a6c00f792f
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/question-32@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/question-48.png b/main/src/core/MonoDevelop.Ide/icons/light/question-48.png
new file mode 100644
index 0000000000..9dd68c7f5a
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/question-48.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/question-48@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/question-48@2x.png
new file mode 100644
index 0000000000..589e1b09b4
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/question-48@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/refresh-16.png b/main/src/core/MonoDevelop.Ide/icons/light/refresh-16.png
new file mode 100644
index 0000000000..b7ffd20c72
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/refresh-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/refresh-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/refresh-16@2x.png
new file mode 100644
index 0000000000..b65a18fc0a
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/refresh-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/remove-16.png b/main/src/core/MonoDevelop.Ide/icons/light/remove-16.png
index df22807792..7e76236f64 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/remove-16.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/remove-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/remove-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/remove-16@2x.png
index bc36be9fb8..21318f43f2 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/remove-16@2x.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/remove-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/save-16.png b/main/src/core/MonoDevelop.Ide/icons/light/save-16.png
new file mode 100644
index 0000000000..50d6447f3e
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/save-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/save-all-16.png b/main/src/core/MonoDevelop.Ide/icons/light/save-all-16.png
new file mode 100644
index 0000000000..6c6ae344d2
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/save-all-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/stop-16.png b/main/src/core/MonoDevelop.Ide/icons/light/stop-16.png
index 7b09206fac..ea37d34b8c 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/stop-16.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/stop-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/stop-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/stop-16@2x.png
index e69e660db4..d281d4f5be 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/stop-16@2x.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/stop-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/undo-16.png b/main/src/core/MonoDevelop.Ide/icons/light/undo-16.png
new file mode 100644
index 0000000000..8a5836ce43
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/undo-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/undo-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/undo-16@2x.png
new file mode 100644
index 0000000000..103f68d4bd
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/undo-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/updates-16.png b/main/src/core/MonoDevelop.Ide/icons/light/updates-16.png
index 6d68a87461..818f09fb65 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/updates-16.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/updates-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/updates-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/updates-16@2x.png
index 64d9c9cfe6..0582e35d0c 100644
--- a/main/src/core/MonoDevelop.Ide/icons/light/updates-16@2x.png
+++ b/main/src/core/MonoDevelop.Ide/icons/light/updates-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/warning-8.png b/main/src/core/MonoDevelop.Ide/icons/light/warning-8.png
new file mode 100644
index 0000000000..888e69f00f
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/warning-8.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/warning-8@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/warning-8@2x.png
new file mode 100644
index 0000000000..36e3484d08
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/warning-8@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/zoom-in-16.png b/main/src/core/MonoDevelop.Ide/icons/light/zoom-in-16.png
new file mode 100644
index 0000000000..74a0653a80
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/zoom-in-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/zoom-in-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/zoom-in-16@2x.png
new file mode 100644
index 0000000000..a92d18dfa0
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/zoom-in-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/zoom-out-16.png b/main/src/core/MonoDevelop.Ide/icons/light/zoom-out-16.png
new file mode 100644
index 0000000000..ea2ea187f3
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/zoom-out-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/light/zoom-out-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/light/zoom-out-16@2x.png
new file mode 100644
index 0000000000..34e563fcce
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/light/zoom-out-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/locale-16.png b/main/src/core/MonoDevelop.Ide/icons/locale-16.png
deleted file mode 100644
index 22b7913c19..0000000000
--- a/main/src/core/MonoDevelop.Ide/icons/locale-16.png
+++ /dev/null
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/markers-rulers-16.png b/main/src/core/MonoDevelop.Ide/icons/markers-rulers-16.png
deleted file mode 100755
index f1ee975bdb..0000000000
--- a/main/src/core/MonoDevelop.Ide/icons/markers-rulers-16.png
+++ /dev/null
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/monkey-16.png b/main/src/core/MonoDevelop.Ide/icons/monkey-16.png
deleted file mode 100755
index df60d4de1a..0000000000
--- a/main/src/core/MonoDevelop.Ide/icons/monkey-16.png
+++ /dev/null
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/save-all-16.png b/main/src/core/MonoDevelop.Ide/icons/save-all-16.png
deleted file mode 100644
index 16a2642c70..0000000000
--- a/main/src/core/MonoDevelop.Ide/icons/save-all-16.png
+++ /dev/null
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/sdk-locations-16.png b/main/src/core/MonoDevelop.Ide/icons/sdk-locations-16.png
deleted file mode 100755
index 12f988e94e..0000000000
--- a/main/src/core/MonoDevelop.Ide/icons/sdk-locations-16.png
+++ /dev/null
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/syntax-highlighting-16.png b/main/src/core/MonoDevelop.Ide/icons/syntax-highlighting-16.png
deleted file mode 100644
index 449f0f7e4b..0000000000
--- a/main/src/core/MonoDevelop.Ide/icons/syntax-highlighting-16.png
+++ /dev/null
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/text-editor-16.png b/main/src/core/MonoDevelop.Ide/icons/text-editor-16.png
deleted file mode 100644
index 188e1c12bd..0000000000
--- a/main/src/core/MonoDevelop.Ide/icons/text-editor-16.png
+++ /dev/null
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/text-editor-behavior-16.png b/main/src/core/MonoDevelop.Ide/icons/text-editor-behavior-16.png
deleted file mode 100644
index 007ab18815..0000000000
--- a/main/src/core/MonoDevelop.Ide/icons/text-editor-behavior-16.png
+++ /dev/null
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/text-quickfix-16.png b/main/src/core/MonoDevelop.Ide/icons/text-quickfix-16.png
deleted file mode 100755
index 5f0e34f490..0000000000
--- a/main/src/core/MonoDevelop.Ide/icons/text-quickfix-16.png
+++ /dev/null
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/tools-external-tools-16.png b/main/src/core/MonoDevelop.Ide/icons/tools-external-tools-16.png
deleted file mode 100755
index fe8428588b..0000000000
--- a/main/src/core/MonoDevelop.Ide/icons/tools-external-tools-16.png
+++ /dev/null
Binary files differ
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/Main.cs b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/Main.cs
index 2b8b5144a1..7436777040 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/Main.cs
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/Main.cs
@@ -51,7 +51,7 @@ namespace MonoDevelop.Projects.Formats.MSBuild
ObjRef oref = RemotingServices.Marshal (builderEngine);
var ms = new MemoryStream ();
bf.Serialize (ms, oref);
- Console.Error.WriteLine (Convert.ToBase64String (ms.ToArray ()));
+ Console.Error.WriteLine ("[MonoDevelop]" + Convert.ToBase64String (ms.ToArray ()));
if (WaitHandle.WaitAny (new WaitHandle[] { builderEngine.WaitHandle, exitEvent }) == 0) {
// Wait before exiting, so that the remote call that disposed the builder can be completed
diff --git a/main/src/core/MonoDevelop.TextEditor.Tests/Makefile.am b/main/src/core/MonoDevelop.TextEditor.Tests/Makefile.am
new file mode 100644
index 0000000000..c9cc87438f
--- /dev/null
+++ b/main/src/core/MonoDevelop.TextEditor.Tests/Makefile.am
@@ -0,0 +1 @@
+include $(top_srcdir)/xbuild.include
diff --git a/main/src/core/MonoDevelop.TextEditor.Tests/Mono.TextEditor.Tests/SyntaxHighlightingTests.cs b/main/src/core/MonoDevelop.TextEditor.Tests/Mono.TextEditor.Tests/SyntaxHighlightingTests.cs
index 097e026db7..3dc7361e19 100644
--- a/main/src/core/MonoDevelop.TextEditor.Tests/Mono.TextEditor.Tests/SyntaxHighlightingTests.cs
+++ b/main/src/core/MonoDevelop.TextEditor.Tests/Mono.TextEditor.Tests/SyntaxHighlightingTests.cs
@@ -132,5 +132,14 @@ namespace Mono.TextEditor.Tests
TestOutput ("///<summary>foo bar</summary>",
"<span foreground=\"#888888\" style=\"Italic\">///</span><span foreground=\"#888888\" style=\"Italic\">&lt;</span><span foreground=\"#888888\" style=\"Italic\">summary</span><span foreground=\"#888888\" style=\"Italic\">&gt;</span><span foreground=\"#888888\" style=\"Italic\">foo bar</span><span foreground=\"#888888\" style=\"Italic\">&lt;</span><span foreground=\"#888888\" style=\"Italic\">/</span><span foreground=\"#888888\" style=\"Italic\">summary</span><span foreground=\"#888888\" style=\"Italic\">&gt;</span>");
}
+
+ [Test]
+ public void TestFSharpLineBug ()
+ {
+ TestOutput (
+ "\n\n\nlet x = 2",
+ "<span foreground=\"#009695\">let </span><span foreground=\"#333333\">x = </span><span foreground=\"#F57D00\">2</span>",
+ "text/x-fsharp");
+ }
}
}
diff --git a/main/tests/Ide.Tests/Makefile.am b/main/tests/Ide.Tests/Makefile.am
new file mode 100644
index 0000000000..c9cc87438f
--- /dev/null
+++ b/main/tests/Ide.Tests/Makefile.am
@@ -0,0 +1 @@
+include $(top_srcdir)/xbuild.include
diff --git a/main/tests/Makefile.am b/main/tests/Makefile.am
index 2e6e251bf0..bcc1ce088b 100644
--- a/main/tests/Makefile.am
+++ b/main/tests/Makefile.am
@@ -1,6 +1,6 @@
include $(top_srcdir)/xbuild.include
-SUBDIRS=UnitTests MacPlatform.Tests UserInterfaceTests
+SUBDIRS=UnitTests MacPlatform.Tests UserInterfaceTests TestRunner Ide.Tests
MONO=mono
HARNESS=$(top_srcdir)/external/mdtestharness/nunit-console-x86.exe -domain=multiple
diff --git a/main/tests/TestRunner/Makefile.am b/main/tests/TestRunner/Makefile.am
new file mode 100644
index 0000000000..c9cc87438f
--- /dev/null
+++ b/main/tests/TestRunner/Makefile.am
@@ -0,0 +1 @@
+include $(top_srcdir)/xbuild.include
diff --git a/main/tests/UnitTests/MonoDevelop.Projects/ProjectTests.cs b/main/tests/UnitTests/MonoDevelop.Projects/ProjectTests.cs
index da52d8e085..7b1bc7d9d0 100644
--- a/main/tests/UnitTests/MonoDevelop.Projects/ProjectTests.cs
+++ b/main/tests/UnitTests/MonoDevelop.Projects/ProjectTests.cs
@@ -431,5 +431,21 @@ namespace MonoDevelop.Projects
Assert.AreEqual (r.GetReferencedFileNames(project.DefaultConfiguration.Selector).Single (), project.BaseDirectory.Combine ("gtk-sharp.dll").FullPath.ToString ());
Assert.IsTrue (r.IsValid);
}
+
+ [Test]
+ public void AssemblyReferenceHintPath ()
+ {
+ var file = GetType ().Assembly.Location;
+ var asmName = Path.GetFileNameWithoutExtension (file);
+
+ var r = new ProjectReference (ReferenceType.Assembly, file);
+ Assert.AreEqual (asmName, r.Reference);
+ Assert.AreEqual (file, r.HintPath);
+
+ r = new ProjectReference (ReferenceType.Assembly, "Foo", file);
+ Assert.AreEqual ("Foo", r.Reference);
+ Assert.AreEqual (file, r.HintPath);
+
+ }
}
}
diff --git a/main/tests/UnitTests/MonoDevelop.Projects/SharedAssetsProjectTests.cs b/main/tests/UnitTests/MonoDevelop.Projects/SharedAssetsProjectTests.cs
index 871679f075..612a738393 100644
--- a/main/tests/UnitTests/MonoDevelop.Projects/SharedAssetsProjectTests.cs
+++ b/main/tests/UnitTests/MonoDevelop.Projects/SharedAssetsProjectTests.cs
@@ -168,7 +168,8 @@ namespace MonoDevelop.Projects
// Add shared project
var sp = new SharedAssetsProject () {
- LanguageName = "C#"
+ LanguageName = "C#",
+ DefaultNamespace = "TestNamespace"
};
sp.AddFile (sol.ItemDirectory.Combine ("Test.cs"));
@@ -212,8 +213,9 @@ namespace MonoDevelop.Projects
Assert.AreEqual (refSharedProjectXml, sharedProjectXml);
Assert.AreEqual (refSharedProjectItemsXml, sharedProjectItemsXml);
- // Add a file
+ // Add a file and change the default namespace
+ sp.DefaultNamespace = "TestNamespace2";
var file = sp.AddFile (sol.ItemDirectory.Combine ("Test2.cs"));
sol.Save (Util.GetMonitor ());
@@ -229,8 +231,9 @@ namespace MonoDevelop.Projects
Assert.AreEqual (refSharedProjectXml, sharedProjectXml);
Assert.AreEqual (refSharedProjectItemsXml, sharedProjectItemsXml);
- // Remove a file
+ // Remove a file and restore the namespace
+ sp.DefaultNamespace = "TestNamespace";
sp.Files.Remove (file);
sol.Save (Util.GetMonitor ());
@@ -263,6 +266,60 @@ namespace MonoDevelop.Projects
Assert.AreEqual (refSharedProjectXml, sharedProjectXml);
Assert.AreEqual (refSharedProjectItemsXml, sharedProjectItemsXml);
}
+
+ [Test]
+ public void SharedProjectCantBeStartup ()
+ {
+ var sol = new Solution ();
+ var shared = new SharedAssetsProject ();
+
+ // Shared projects are not executable
+ Assert.IsFalse (shared.SupportsExecute ());
+
+ sol.RootFolder.AddItem (shared);
+
+ // The shared project is not executable, so it shouldn't be set as startup by default
+ Assert.IsNull (sol.StartupItem);
+
+ // An executable project is set as startup by default when there is no startup project
+ DotNetAssemblyProject project = new DotNetAssemblyProject ("C#");
+ sol.RootFolder.AddItem (project);
+ Assert.IsTrue (sol.StartupItem == project);
+ }
+
+ [Test]
+ public void IncludingProjectAddedAfterShared ()
+ {
+ var sol = new Solution ();
+ var shared = new SharedAssetsProject ("C#");
+ shared.AddFile ("Foo.cs");
+
+ sol.RootFolder.AddItem (shared);
+
+ // Reference to shared is added before adding project to solution
+ var main = new DotNetAssemblyProject ("C#");
+ main.References.Add (new ProjectReference (shared));
+ sol.RootFolder.AddItem (main);
+
+ Assert.IsNotNull (main.Files.GetFile ("Foo.cs"));
+ }
+
+ [Test]
+ public void SharedProjectAddedAfterIncluder ()
+ {
+ var sol = new Solution ();
+ var shared = new SharedAssetsProject ("C#");
+ shared.AddFile ("Foo.cs");
+
+ // Reference to shared is added before adding project to solution
+ var main = new DotNetAssemblyProject ("C#");
+ main.References.Add (new ProjectReference (shared));
+ sol.RootFolder.AddItem (main);
+
+ sol.RootFolder.AddItem (shared);
+
+ Assert.IsNotNull (main.Files.GetFile ("Foo.cs"));
+ }
}
}
diff --git a/main/tests/UnitTests/MonoDevelop.Projects/SolutionTests.cs b/main/tests/UnitTests/MonoDevelop.Projects/SolutionTests.cs
index e2f10a4d1f..1e491ef69a 100644
--- a/main/tests/UnitTests/MonoDevelop.Projects/SolutionTests.cs
+++ b/main/tests/UnitTests/MonoDevelop.Projects/SolutionTests.cs
@@ -704,5 +704,33 @@ namespace MonoDevelop.Projects
Assert.AreEqual (Util.GetXmlFileInfoset (p.FileName + ".saved"), Util.GetXmlFileInfoset (p.FileName));
}
+
+ [Test]
+ public void BuildSolutionWithUnsupportedProjects ()
+ {
+ string solFile = Util.GetSampleProject ("unsupported-project", "console-with-libs.sln");
+
+ Solution sol = (Solution) Services.ProjectService.ReadWorkspaceItem (Util.GetMonitor (), solFile);
+ var res = sol.Build (Util.GetMonitor (), "Debug");
+
+ // The solution has a console app that references an unsupported library. The build of the solution should fail.
+ Assert.IsTrue (res.ErrorCount == 1);
+
+ var app = (DotNetAssemblyProject) sol.GetAllSolutionItems<SolutionEntityItem> ().FirstOrDefault (it => it.FileName.FileName == "console-with-libs.csproj");
+
+ // The console app references an unsupported library. The build of the project should fail.
+ res = app.Build (Util.GetMonitor (), ConfigurationSelector.Default, true);
+ Assert.IsTrue (res.ErrorCount == 1);
+
+ // A solution build should succeed if it has unbuildable projects but those projects are not referenced by buildable projects
+ app.References.Clear ();
+ sol.Save (Util.GetMonitor ());
+ res = sol.Build (Util.GetMonitor (), "Debug");
+ Assert.IsTrue (res.ErrorCount == 0);
+
+ // Regular project not referencing anything else. Should build.
+ res = app.Build (Util.GetMonitor (), ConfigurationSelector.Default, true);
+ Assert.IsTrue (res.ErrorCount == 0);
+ }
}
}
diff --git a/main/tests/UnitTests/MonoDevelop.Projects/WebProjectTests.cs b/main/tests/UnitTests/MonoDevelop.Projects/WebProjectTests.cs
new file mode 100644
index 0000000000..d0fb009f93
--- /dev/null
+++ b/main/tests/UnitTests/MonoDevelop.Projects/WebProjectTests.cs
@@ -0,0 +1,56 @@
+//
+// WebProjectTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Linq;
+using MonoDevelop.Ide;
+using NUnit.Framework;
+using UnitTests;
+
+namespace MonoDevelop.Projects
+{
+ [TestFixture]
+ public class WebProjectTests : TestBase
+ {
+ /// <summary>
+ /// Package Management addin depends on the project type guids in the DotNetProject
+ /// so it can detect if a project is a web project or not.
+ /// </summary>
+ [Test]
+ public void LoadedWebProjectContainsWebProjectTypeGuid ()
+ {
+ string solutionFileName = Util.GetSampleProject ("WebProjectTest", "WebProjectTest.sln");
+ var solution = (Solution)Services.ProjectService.ReadWorkspaceItem (Util.GetMonitor (), solutionFileName);
+ Project project = solution.GetAllProjects ().First ();
+
+ string projectTypeGuids = (string) project.ExtendedProperties ["ProjectTypeGuids"];
+ string[] guids = projectTypeGuids.Split (';');
+
+ Assert.That (guids, Contains.Item ("{349C5851-65DF-11DA-9384-00065B846F21}"));
+ }
+ }
+}
+
diff --git a/main/tests/UnitTests/UnitTests.csproj b/main/tests/UnitTests/UnitTests.csproj
index 8b9a310ab0..0b4fbd8d69 100644
--- a/main/tests/UnitTests/UnitTests.csproj
+++ b/main/tests/UnitTests/UnitTests.csproj
@@ -293,6 +293,7 @@
<Compile Include="MonoDevelop.Ide.Gui\LogViewTests.cs" />
<Compile Include="MonoDevelop.SourceEditor\JSonIndentEngineTests.cs" />
<Compile Include="MonoDevelop.Projects\SharedAssetsProjectTests.cs" />
+ <Compile Include="MonoDevelop.Projects\WebProjectTests.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="..\..\md.targets" />
diff --git a/main/tests/test-projects/WebProjectTest/WebProject/WebProject.csproj b/main/tests/test-projects/WebProjectTest/WebProject/WebProject.csproj
new file mode 100644
index 0000000000..6a584b6d17
--- /dev/null
+++ b/main/tests/test-projects/WebProjectTest/WebProject/WebProject.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProjectGuid>{60B77863-B583-47EA-9E6C-DC33306CF5AF}</ProjectGuid>
+ <ProjectTypeGuids>{349C5851-65DF-11DA-9384-00065B846F21};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <OutputType>Library</OutputType>
+ <RootNamespace>WebProject</RootNamespace>
+ <AssemblyName>WebProject</AssemblyName>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin</OutputPath>
+ <DefineConstants>DEBUG;</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <ConsolePause>false</ConsolePause>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>full</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin</OutputPath>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <ConsolePause>false</ConsolePause>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Web" />
+ <Reference Include="System.Xml" />
+ <Reference Include="System.Web.Services" />
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+ <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
+ <ProjectExtensions>
+ <MonoDevelop>
+ <Properties VerifyCodeBehindFields="True" VerifyCodeBehindEvents="True" xmlns="">
+ <XspParameters Port="8080" Address="127.0.0.1" SslMode="None" SslProtocol="Default" KeyType="None" CertFile="" KeyFile="" PasswordOptions="None" Password="" Verbose="True" />
+ </Properties>
+ </MonoDevelop>
+ </ProjectExtensions>
+</Project> \ No newline at end of file
diff --git a/main/tests/test-projects/WebProjectTest/WebProjectTest.sln b/main/tests/test-projects/WebProjectTest/WebProjectTest.sln
new file mode 100644
index 0000000000..fe9c1d094e
--- /dev/null
+++ b/main/tests/test-projects/WebProjectTest/WebProjectTest.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebProject", "WebProject\WebProject.csproj", "{60B77863-B583-47EA-9E6C-DC33306CF5AF}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {60B77863-B583-47EA-9E6C-DC33306CF5AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {60B77863-B583-47EA-9E6C-DC33306CF5AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {60B77863-B583-47EA-9E6C-DC33306CF5AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {60B77863-B583-47EA-9E6C-DC33306CF5AF}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = WebProject\WebProject.csproj
+ EndGlobalSection
+EndGlobal
diff --git a/main/tests/test-projects/generated-shared-project/Shared.projitems b/main/tests/test-projects/generated-shared-project/Shared.projitems
index c1b0b1ac69..7800470da3 100644
--- a/main/tests/test-projects/generated-shared-project/Shared.projitems
+++ b/main/tests/test-projects/generated-shared-project/Shared.projitems
@@ -6,8 +6,7 @@
<SharedGUID>{8DD793BE-42C3-4D66-8359-460CEE75980D}</SharedGUID>
</PropertyGroup>
<PropertyGroup Label="Configuration">
- <Import_RootNamespace>
- </Import_RootNamespace>
+ <Import_RootNamespace>TestNamespace</Import_RootNamespace>
</PropertyGroup>
<ItemGroup>
<Compile Include="$(MSBuildThisFileDirectory)Test.cs" />
diff --git a/main/tests/test-projects/generated-shared-project/Shared.projitems.saved1 b/main/tests/test-projects/generated-shared-project/Shared.projitems.saved1
index c51eeda40d..13878b180c 100644
--- a/main/tests/test-projects/generated-shared-project/Shared.projitems.saved1
+++ b/main/tests/test-projects/generated-shared-project/Shared.projitems.saved1
@@ -6,8 +6,7 @@
<SharedGUID>{8DD793BE-42C3-4D66-8359-460CEE75980D}</SharedGUID>
</PropertyGroup>
<PropertyGroup Label="Configuration">
- <Import_RootNamespace>
- </Import_RootNamespace>
+ <Import_RootNamespace>TestNamespace2</Import_RootNamespace>
</PropertyGroup>
<ItemGroup>
<Compile Include="$(MSBuildThisFileDirectory)Test.cs" />
diff --git a/main/tests/test-projects/unsupported-project/library2/library2.csproj b/main/tests/test-projects/unsupported-project/library2/library2.csproj
index 0fe53cf5a3..79c145687a 100644
--- a/main/tests/test-projects/unsupported-project/library2/library2.csproj
+++ b/main/tests/test-projects/unsupported-project/library2/library2.csproj
@@ -41,6 +41,13 @@
</ItemGroup>
<ItemGroup>
<Reference Include="System" />
+ <Reference Include="System.Xaml">
+ <RequiredTargetFramework>4.0</RequiredTargetFramework>
+ </Reference>
+ <ProjectReference Include="..\library1\library1.csproj">
+ <Project>{7F63CBE6-2FE7-47A7-8930-EA078DA05062}</Project>
+ <Name>library1</Name>
+ </ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project> \ No newline at end of file
diff --git a/main/tests/test-projects/unsupported-project/library2/library2.csproj.saved b/main/tests/test-projects/unsupported-project/library2/library2.csproj.saved
index 6add90b4f4..2b7261f704 100644
--- a/main/tests/test-projects/unsupported-project/library2/library2.csproj.saved
+++ b/main/tests/test-projects/unsupported-project/library2/library2.csproj.saved
@@ -42,6 +42,13 @@
</ItemGroup>
<ItemGroup>
<Reference Include="System" />
+ <Reference Include="System.Xaml">
+ <RequiredTargetFramework>4.0</RequiredTargetFramework>
+ </Reference>
+ <ProjectReference Include="..\library1\library1.csproj">
+ <Project>{7F63CBE6-2FE7-47A7-8930-EA078DA05062}</Project>
+ <Name>library1</Name>
+ </ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project> \ No newline at end of file