From b88947a4fef47a0b27e01ea68a81085deb22a45f Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Tue, 26 Feb 2013 18:10:00 +0100 Subject: [PATCH] Started refactoring the project service / solution API. --- SharpDevelop.Tests.sln | 4 +- .../Src/SolutionCodeCoverageResults.cs | 6 +- .../SolutionCodeCoverageResultsTests.cs | 2 +- .../Test/Utils/MockCSharpProject.cs | 2 +- .../Test/Helpers/TestableProject.cs | 2 +- .../Project/Src/Project/CSharpProject.cs | 10 +- .../CppBinding/Project/ApplicationOptions.cs | 2 +- .../Scripting/Test/Utils/MockProject.cs | 4 +- .../Test/Utils/WixBindingTestsHelper.cs | 2 +- .../Project/Src/ConfigSettingsFileSystem.cs | 2 +- .../FakePackageManagementProjectService.cs | 12 +- .../Src/IPackageManagementProjectService.cs | 6 +- .../Src/ISolutionPackageRepositoryFactory.cs | 2 +- .../Src/PackageManagementProjectService.cs | 8 +- .../Project/Src/PackageManagementSolution.cs | 2 +- .../IPackageInitializationScriptsFactory.cs | 2 +- .../PackageManagementConsoleViewModel.cs | 4 +- .../Scripting/PowerShellWorkingDirectory.cs | 2 +- .../Src/SharpDevelopPackageManagerFactory.cs | 2 +- .../Project/Src/SolutionPackageRepository.cs | 4 +- .../Src/SolutionPackageRepositoryFactory.cs | 2 +- .../Src/SolutionPackageRepositoryPath.cs | 4 +- ...eInitializationScriptsInSolutionFactory.cs | 4 +- .../FakeSolutionPackageRepositoryFactory.cs | 4 +- .../Test/Src/Helpers/ProjectHelper.cs | 4 +- .../PackageManagementSelectedProjectsTests.cs | 2 +- .../Src/PackageManagementSolutionTests.cs | 4 +- .../PackageManagementConsoleViewModelTests.cs | 16 +- ...lectedProjectsForInstalledPackagesTests.cs | 2 +- ...SelectedProjectsForUpdatedPackagesTests.cs | 2 +- .../Src/SolutionPackageRepositoryPathTests.cs | 4 +- .../Src/SolutionPackageRepositoryTests.cs | 6 +- .../Src/Commands/ProjectBrowserCommands.cs | 4 +- .../Project/Designer/TypeResolutionService.cs | 9 +- src/Main/Base/Project/Dom/IModelCollection.cs | 15 ++ .../Base/Project/Dom/SimpleModelCollection.cs | 15 -- .../Project/ICSharpCode.SharpDevelop.csproj | 22 +-- .../Project/Project/Build/IBuildService.cs | 2 +- .../Project/ConfigurationAndPlatform.cs | 104 +++++++++++ .../Base/Project/Project/IConfigurable.cs | 42 +++++ .../Project/Project/IConfigurationMapping.cs | 33 ++++ .../IConfigurationOrPlatformNameCollection.cs | 54 ++++++ .../Base/Project/Project/IProjectService.cs | 80 +++++++++ src/Main/Base/Project/Project/ISolution.cs | 88 +++++++++ .../Base/Project/Project/ISolutionFolder.cs | 40 +++++ .../Base/Project/Project/ISolutionItem.cs | 41 +++++ src/Main/Base/Project/Services/SD.cs | 5 + .../Project/Src/Commands/BuildCommands.cs | 25 ++- .../Base/Project/Src/Commands/FileCommands.cs | 2 +- .../LocalizedPropertyGrid/LocalizedObject.cs | 2 +- .../LocalizedPropertyDescriptor.cs | 4 +- .../ApplicationSettings.xaml.cs | 2 +- .../ProjectOptions/BuildAdvanced.xaml.cs | 2 +- .../ProjectOptions/ProjectOptionPanel.cs | 12 +- .../EditAvailableConfigurationsDialog.cs | 168 ++++-------------- .../SolutionConfigurationEditor.cs | 108 +++++------ .../Src/Gui/Dialogs/WordCountDialog.cs | 2 +- .../Base/Project/Src/Gui/Pads/FileScout.cs | 11 +- .../Commands/ProjectNodeCommands.cs | 4 +- .../Commands/SolutionNodeCommands.cs | 32 +--- .../ProjectBrowser/ProjectBrowserControl.cs | 21 ++- .../Pads/ProjectBrowser/ProjectBrowserPad.cs | 10 +- .../ProjectBrowser/ProjectBrowserPanel.cs | 2 +- .../AbstractProjectBrowserTreeNode.cs | 2 +- .../ProjectBrowser/TreeNodes/DirectoryNode.cs | 2 +- .../Pads/ProjectBrowser/TreeNodes/FileNode.cs | 2 +- .../ProjectBrowser/TreeNodes/ProjectNode.cs | 4 +- .../ProjectBrowser/TreeNodes/ReferenceNode.cs | 2 +- .../TreeNodes/SolutionFolderNode.cs | 47 ++--- .../TreeNodes/SolutionItemNode.cs | 10 +- .../ProjectBrowser/TreeNodes/SolutionNode.cs | 27 +-- .../Util/SolutionFolderRemoveVisitor.cs | 6 +- .../WriteableProjectEvaluator.cs | 2 +- .../WriteableSolutionEvaluator.cs | 2 +- .../Project/ProjectCreateInformation.cs | 2 +- .../Templates/Project/ProjectTemplate.cs | 4 +- .../Templates/Project/SolutionDescriptor.cs | 4 +- .../Project/Src/Project/AbstractProject.cs | 101 +++++++---- .../Project/Behaviors/DotNetStartBehavior.cs | 10 +- .../Project/Src/Project/CompilableProject.cs | 14 +- .../Src/Project/ConfigurationGuiHelper.cs | 4 +- .../Project/Converter/LanguageConverter.cs | 3 +- .../Src/Project/Converter/UpgradeView.xaml.cs | 6 +- .../Project/Converter/UpgradeViewContent.cs | 8 +- .../Base/Project/Src/Project/CustomTool.cs | 2 +- src/Main/Base/Project/Src/Project/IProject.cs | 63 +------ .../Project/Src/Project/Items/ProjectItem.cs | 4 +- .../Src/Project/MSBuildBasedProject.cs | 41 ++--- .../Project/MSBuildEngine/MSBuildEngine.cs | 10 +- .../TargetingPackWarningWorkaround.cs | 2 +- .../Project/Src/Project/MSBuildInternals.cs | 32 +--- .../Project/Src/Project/MissingProject.cs | 2 +- .../Src/Project/ProjectLoadInformation.cs | 8 +- .../ProjectService/ProjectEventHandler.cs | 2 - .../Services/ProjectService/ProjectLoader.cs | 40 ----- .../Services/ProjectService/ProjectService.cs | 56 +++--- .../SolutionConfigurationEventHandler.cs | 6 +- .../ProjectService/SolutionEventHandler.cs | 12 +- .../SolutionFolderEventHandler.cs | 6 +- .../FindReferenceService.cs | 2 +- .../BeforeBuildCustomToolProjectItemsTests.cs | 2 +- src/Main/Base/Test/SolutionTests.cs | 2 +- .../WebReferences/WebReferenceTestHelper.cs | 2 +- src/Main/SharpDevelop/Parser/ParserService.cs | 2 +- .../Project/Build/BuildService.cs | 2 +- 105 files changed, 931 insertions(+), 724 deletions(-) delete mode 100644 src/Main/Base/Project/Dom/SimpleModelCollection.cs create mode 100644 src/Main/Base/Project/Project/ConfigurationAndPlatform.cs create mode 100644 src/Main/Base/Project/Project/IConfigurable.cs create mode 100644 src/Main/Base/Project/Project/IConfigurationMapping.cs create mode 100644 src/Main/Base/Project/Project/IConfigurationOrPlatformNameCollection.cs create mode 100644 src/Main/Base/Project/Project/IProjectService.cs create mode 100644 src/Main/Base/Project/Project/ISolution.cs create mode 100644 src/Main/Base/Project/Project/ISolutionFolder.cs create mode 100644 src/Main/Base/Project/Project/ISolutionItem.cs delete mode 100644 src/Main/Base/Project/Src/Services/ProjectService/ProjectLoader.cs diff --git a/SharpDevelop.Tests.sln b/SharpDevelop.Tests.sln index 7f871acd5a..19ce97e39a 100644 --- a/SharpDevelop.Tests.sln +++ b/SharpDevelop.Tests.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 -# SharpDevelop 5.0 +# SharpDevelop 4.3 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Main", "Main", "{256F5C28-532C-44C0-8AB8-D8EC5E492E01}" ProjectSection(SolutionItems) = postProject EndProjectSection @@ -137,7 +137,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PackageManagement.Tests", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PackageManagement.PowerShell", "src\AddIns\Misc\PackageManagement\PowerShell\Project\PackageManagement.PowerShell.csproj", "{A406803B-C584-43A3-BCEE-A0BB3132CB5F}" EndProject -Project("") = "SharpDevelop.EnvDTE", "src\AddIns\Misc\PackageManagement\SharpDevelop.EnvDTE\SharpDevelop.EnvDTE.vbproj", "C3F15E22-5793-4129-AF8C-6229112B86D2" +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "SharpDevelop.EnvDTE", "src\AddIns\Misc\PackageManagement\SharpDevelop.EnvDTE\SharpDevelop.EnvDTE.vbproj", "C3F15E22-5793-4129-AF8C-6229112B86D2" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Display Bindings", "Display Bindings", "{11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}" ProjectSection(SolutionItems) = postProject diff --git a/src/AddIns/Analysis/CodeCoverage/Project/Src/SolutionCodeCoverageResults.cs b/src/AddIns/Analysis/CodeCoverage/Project/Src/SolutionCodeCoverageResults.cs index 885989e2d2..351406a5e5 100644 --- a/src/AddIns/Analysis/CodeCoverage/Project/Src/SolutionCodeCoverageResults.cs +++ b/src/AddIns/Analysis/CodeCoverage/Project/Src/SolutionCodeCoverageResults.cs @@ -11,15 +11,15 @@ namespace ICSharpCode.CodeCoverage { public class SolutionCodeCoverageResults { - Solution solution; + ISolution solution; IFileSystem fileSystem; - public SolutionCodeCoverageResults(Solution solution) + public SolutionCodeCoverageResults(ISolution solution) : this(solution, new FileSystem()) { } - public SolutionCodeCoverageResults(Solution solution, IFileSystem fileSystem) + public SolutionCodeCoverageResults(ISolution solution, IFileSystem fileSystem) { this.solution = solution; this.fileSystem = fileSystem; diff --git a/src/AddIns/Analysis/CodeCoverage/Test/Coverage/SolutionCodeCoverageResultsTests.cs b/src/AddIns/Analysis/CodeCoverage/Test/Coverage/SolutionCodeCoverageResultsTests.cs index 035e816f3e..276ad91522 100644 --- a/src/AddIns/Analysis/CodeCoverage/Test/Coverage/SolutionCodeCoverageResultsTests.cs +++ b/src/AddIns/Analysis/CodeCoverage/Test/Coverage/SolutionCodeCoverageResultsTests.cs @@ -20,7 +20,7 @@ namespace ICSharpCode.CodeCoverage.Tests.Coverage public class SolutionCodeCoverageResultsTests : SDTestFixtureBase { SolutionCodeCoverageResults solutionCodeCoverageResults; - Solution solution; + ISolution solution; IFileSystem fakeFileSystem; void CreateSolutionCodeCoverageResults() diff --git a/src/AddIns/Analysis/UnitTesting/Test/Utils/MockCSharpProject.cs b/src/AddIns/Analysis/UnitTesting/Test/Utils/MockCSharpProject.cs index 3e53382507..5ced187b74 100644 --- a/src/AddIns/Analysis/UnitTesting/Test/Utils/MockCSharpProject.cs +++ b/src/AddIns/Analysis/UnitTesting/Test/Utils/MockCSharpProject.cs @@ -21,7 +21,7 @@ namespace UnitTesting.Tests.Utils { } - public MockCSharpProject(Solution solution, string name) + public MockCSharpProject(ISolution solution, string name) : base(new ProjectCreateInformation { Solution = solution, ProjectName = name, diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableProject.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableProject.cs index 182d40a3bf..0e86cc15e1 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableProject.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableProject.cs @@ -50,7 +50,7 @@ namespace AspNet.Mvc.Tests.Helpers IsSaved = true; } - public override bool ReadOnly { + public override bool IsReadOnly { get { return false; } } diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs index 3ce7f73d09..afe8555920 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs @@ -84,7 +84,7 @@ namespace CSharpBinding public override Task BuildAsync(ProjectBuildOptions options, IBuildFeedbackSink feedbackSink, IProgressMonitor progressMonitor) { - if (this.MinimumSolutionVersion == Solution.SolutionVersionVS2005) { + if (this.MinimumSolutionVersion == ISolution.SolutionVersionVS2005) { return MSBuildEngine.BuildAsync( this, options, feedbackSink, progressMonitor.CancellationToken, MSBuildEngine.AdditionalTargetFiles.Concat( @@ -177,12 +177,12 @@ namespace CSharpBinding public override CompilerVersion CurrentCompilerVersion { get { switch (Project.MinimumSolutionVersion) { - case Solution.SolutionVersionVS2005: + case ISolution.SolutionVersionVS2005: return msbuild20; - case Solution.SolutionVersionVS2008: + case ISolution.SolutionVersionVS2008: return msbuild35; - case Solution.SolutionVersionVS2010: - case Solution.SolutionVersionVS2012: + case ISolution.SolutionVersionVS2010: + case ISolution.SolutionVersionVS2012: return msbuild40; default: throw new NotSupportedException(); diff --git a/src/AddIns/BackendBindings/CppBinding/CppBinding/Project/ApplicationOptions.cs b/src/AddIns/BackendBindings/CppBinding/CppBinding/Project/ApplicationOptions.cs index 0d6cd658e7..687b089d40 100644 --- a/src/AddIns/BackendBindings/CppBinding/CppBinding/Project/ApplicationOptions.cs +++ b/src/AddIns/BackendBindings/CppBinding/CppBinding/Project/ApplicationOptions.cs @@ -61,7 +61,7 @@ namespace ICSharpCode.CppBinding.Project void project_MinimumSolutionVersionChanged(object sender, EventArgs e) { // embedding manifests requires the project to target MSBuild 3.5 or higher - applicationManifestComboBox.IsEnabled = base.Project.MinimumSolutionVersion >= Solution.SolutionVersionVS2008; + applicationManifestComboBox.IsEnabled = base.Project.MinimumSolutionVersion >= ISolution.SolutionVersionVS2008; } diff --git a/src/AddIns/BackendBindings/Scripting/Test/Utils/MockProject.cs b/src/AddIns/BackendBindings/Scripting/Test/Utils/MockProject.cs index 2555ad26f4..72673aa537 100644 --- a/src/AddIns/BackendBindings/Scripting/Test/Utils/MockProject.cs +++ b/src/AddIns/BackendBindings/Scripting/Test/Utils/MockProject.cs @@ -52,7 +52,7 @@ namespace ICSharpCode.Scripting.Tests.Utils get { return syncRoot; } } - public Solution ParentSolution { + public ISolution ParentSolution { get { return new Solution(new MockProjectChangeWatcher()); } } @@ -181,7 +181,7 @@ namespace ICSharpCode.Scripting.Tests.Utils } } - public ISolutionFolderContainer Parent { + public ISolutionFolder Parent { get { throw new NotImplementedException(); } diff --git a/src/AddIns/BackendBindings/WixBinding/Test/Utils/WixBindingTestsHelper.cs b/src/AddIns/BackendBindings/WixBinding/Test/Utils/WixBindingTestsHelper.cs index 0f867ba8ef..418c073368 100644 --- a/src/AddIns/BackendBindings/WixBinding/Test/Utils/WixBindingTestsHelper.cs +++ b/src/AddIns/BackendBindings/WixBinding/Test/Utils/WixBindingTestsHelper.cs @@ -25,7 +25,7 @@ namespace WixBinding.Tests.Utils { } - public override bool ReadOnly { + public override bool IsReadOnly { get { return false; } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/ConfigSettingsFileSystem.cs b/src/AddIns/Misc/PackageManagement/Project/Src/ConfigSettingsFileSystem.cs index daccf7b809..569ca9f08a 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/ConfigSettingsFileSystem.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/ConfigSettingsFileSystem.cs @@ -15,7 +15,7 @@ namespace ICSharpCode.PackageManagement { } - public static ConfigSettingsFileSystem CreateConfigSettingsFileSystem(Solution solution) + public static ConfigSettingsFileSystem CreateConfigSettingsFileSystem(ISolution solution) { string configSettingsFolder = Path.Combine(solution.Directory, ".nuget"); return new ConfigSettingsFileSystem(configSettingsFolder); diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs index f01505a719..3b9aa8b006 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs @@ -15,9 +15,9 @@ namespace ICSharpCode.PackageManagement.Design public bool IsRefreshProjectBrowserCalled; public IProject CurrentProject { get; set; } - public Solution OpenSolution { get; set; } + public ISolution OpenSolution { get; set; } - public event ProjectEventHandler ProjectAdded; + public event EventHandler ProjectAdded; public event SolutionFolderEventHandler SolutionFolderRemoved; public event EventHandler SolutionClosed; public event EventHandler SolutionLoaded; @@ -41,14 +41,14 @@ namespace ICSharpCode.PackageManagement.Design } } - public void FireSolutionLoadedEvent(Solution solution) + public void FireSolutionLoadedEvent(ISolution solution) { if (SolutionLoaded != null) { SolutionLoaded(this, new SolutionEventArgs(solution)); } } - public void FireSolutionFolderRemoved(ISolutionFolder solutionFolder) + public void FireSolutionFolderRemoved(ISolutionItem solutionFolder) { if (SolutionFolderRemoved != null) { SolutionFolderRemoved(this, new SolutionFolderEventArgs(solutionFolder)); @@ -82,9 +82,9 @@ namespace ICSharpCode.PackageManagement.Design project.Save(); } - public Solution SavedSolution; + public ISolution SavedSolution; - public void Save(Solution solution) + public void Save(ISolution solution) { SavedSolution = solution; } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProjectService.cs b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProjectService.cs index 2596d0dd63..26c72dad3c 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProjectService.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProjectService.cs @@ -12,10 +12,10 @@ namespace ICSharpCode.PackageManagement public interface IPackageManagementProjectService { IProject CurrentProject { get; } - Solution OpenSolution { get; } + ISolution OpenSolution { get; } IProjectBuilder ProjectBuilder { get; } - event ProjectEventHandler ProjectAdded; + event EventHandler ProjectAdded; event SolutionFolderEventHandler SolutionFolderRemoved; event EventHandler SolutionClosed; event EventHandler SolutionLoaded; @@ -24,7 +24,7 @@ namespace ICSharpCode.PackageManagement void AddProjectItem(IProject project, ProjectItem item); void RemoveProjectItem(IProject project, ProjectItem item); void Save(IProject project); - void Save(Solution solution); + void Save(ISolution solution); IEnumerable GetOpenProjects(); diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/ISolutionPackageRepositoryFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/ISolutionPackageRepositoryFactory.cs index 6dfc2f4139..b7f4e3b82e 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/ISolutionPackageRepositoryFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/ISolutionPackageRepositoryFactory.cs @@ -8,6 +8,6 @@ namespace ICSharpCode.PackageManagement { public interface ISolutionPackageRepositoryFactory { - ISolutionPackageRepository CreateSolutionPackageRepository(Solution solution); + ISolutionPackageRepository CreateSolutionPackageRepository(ISolution solution); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProjectService.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProjectService.cs index cd60a2357c..c59f3e8878 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProjectService.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProjectService.cs @@ -24,7 +24,7 @@ namespace ICSharpCode.PackageManagement get { return ProjectService.CurrentProject; } } - public Solution OpenSolution { + public ISolution OpenSolution { get { return ProjectService.OpenSolution; } } @@ -50,7 +50,7 @@ namespace ICSharpCode.PackageManagement public IEnumerable GetOpenProjects() { - Solution solution = OpenSolution; + ISolution solution = OpenSolution; if (solution != null) { return solution.Projects; } @@ -72,7 +72,7 @@ namespace ICSharpCode.PackageManagement InvokeIfRequired(() => project.Save()); } - public void Save(Solution solution) + public void Save(ISolution solution) { InvokeIfRequired(() => solution.Save()); } @@ -82,7 +82,7 @@ namespace ICSharpCode.PackageManagement // return SD.ParserService.GetProjectContent(project); // } - public event ProjectEventHandler ProjectAdded { + public event EventHandler ProjectAdded { add { ProjectService.ProjectAdded += value; } remove { ProjectService.ProjectAdded -= value; } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSolution.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSolution.cs index 5a6069d467..c1def79231 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSolution.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSolution.cs @@ -44,7 +44,7 @@ namespace ICSharpCode.PackageManagement get { return OpenSolution.FileName; } } - Solution OpenSolution { + ISolution OpenSolution { get { return projectService.OpenSolution; } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageInitializationScriptsFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageInitializationScriptsFactory.cs index 9a422d02f0..b1d503201a 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageInitializationScriptsFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageInitializationScriptsFactory.cs @@ -9,6 +9,6 @@ namespace ICSharpCode.PackageManagement.Scripting public interface IPackageInitializationScriptsFactory { IPackageInitializationScripts CreatePackageInitializationScripts( - Solution solution); + ISolution solution); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleViewModel.cs index 55003e7c44..712e7f4c3a 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleViewModel.cs @@ -139,7 +139,7 @@ namespace ICSharpCode.PackageManagement.Scripting void AddProjects() { - Solution solution = projectService.OpenSolution; + ISolution solution = projectService.OpenSolution; if (solution != null) { AddProjects(solution); } @@ -151,7 +151,7 @@ namespace ICSharpCode.PackageManagement.Scripting DefaultProject = projects.FirstOrDefault(); } - void AddProjects(Solution solution) + void AddProjects(ISolution solution) { foreach (IProject project in solution.Projects) { projects.Add(project); diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellWorkingDirectory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellWorkingDirectory.cs index 24a3135c43..2dabb4cd15 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellWorkingDirectory.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellWorkingDirectory.cs @@ -17,7 +17,7 @@ namespace ICSharpCode.PackageManagement.Scripting public string GetWorkingDirectory() { - Solution solution = projectService.OpenSolution; + ISolution solution = projectService.OpenSolution; if (solution != null) { return QuotedDirectory(solution.Directory); } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/SharpDevelopPackageManagerFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/SharpDevelopPackageManagerFactory.cs index 97b65f0366..b93873beee 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/SharpDevelopPackageManagerFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/SharpDevelopPackageManagerFactory.cs @@ -46,7 +46,7 @@ namespace ICSharpCode.PackageManagement packageOperationResolverFactory); } - SolutionPackageRepository CreateSolutionPackageRepository(Solution solution) + SolutionPackageRepository CreateSolutionPackageRepository(ISolution solution) { return new SolutionPackageRepository(solution, packageRepositoryFactory, options); } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepository.cs b/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepository.cs index f7a92fdbba..693fc5dba6 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepository.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepository.cs @@ -18,7 +18,7 @@ namespace ICSharpCode.PackageManagement PhysicalFileSystem fileSystem; ISharedPackageRepository repository; - public SolutionPackageRepository(Solution solution) + public SolutionPackageRepository(ISolution solution) : this( solution, new SharpDevelopPackageRepositoryFactory(), @@ -27,7 +27,7 @@ namespace ICSharpCode.PackageManagement } public SolutionPackageRepository( - Solution solution, + ISolution solution, ISharpDevelopPackageRepositoryFactory repositoryFactory, PackageManagementOptions options) { diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepositoryFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepositoryFactory.cs index 8b43537de3..2be97ef102 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepositoryFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepositoryFactory.cs @@ -26,7 +26,7 @@ namespace ICSharpCode.PackageManagement this.options = options; } - public ISolutionPackageRepository CreateSolutionPackageRepository(Solution solution) + public ISolutionPackageRepository CreateSolutionPackageRepository(ISolution solution) { return new SolutionPackageRepository(solution, repositoryFactory, options); } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepositoryPath.cs b/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepositoryPath.cs index 796e159baa..bbfa7cfaf1 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepositoryPath.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepositoryPath.cs @@ -11,7 +11,7 @@ namespace ICSharpCode.PackageManagement public class SolutionPackageRepositoryPath { string packagesRelativeDirectory; - Solution solution; + ISolution solution; DefaultPackagePathResolver pathResolver; public SolutionPackageRepositoryPath(IProject project) @@ -24,7 +24,7 @@ namespace ICSharpCode.PackageManagement { } - public SolutionPackageRepositoryPath(Solution solution, PackageManagementOptions options) + public SolutionPackageRepositoryPath(ISolution solution, PackageManagementOptions options) { packagesRelativeDirectory = options.PackagesDirectory; this.solution = solution; diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageInitializationScriptsInSolutionFactory.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageInitializationScriptsInSolutionFactory.cs index 24c20e4f06..ec39ed4fa7 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageInitializationScriptsInSolutionFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageInitializationScriptsInSolutionFactory.cs @@ -12,10 +12,10 @@ namespace PackageManagement.Tests.Helpers public FakePackageInitializationScripts FakePackageInitializationScripts = new FakePackageInitializationScripts(); - public Solution SolutionPassedToCreatePackageInitializationScripts; + public ISolution SolutionPassedToCreatePackageInitializationScripts; public IPackageInitializationScripts CreatePackageInitializationScripts( - Solution solution) + ISolution solution) { SolutionPassedToCreatePackageInitializationScripts = solution; return FakePackageInitializationScripts; diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeSolutionPackageRepositoryFactory.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeSolutionPackageRepositoryFactory.cs index 6496147e46..9071071728 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeSolutionPackageRepositoryFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeSolutionPackageRepositoryFactory.cs @@ -10,9 +10,9 @@ namespace PackageManagement.Tests.Helpers public class FakeSolutionPackageRepositoryFactory : ISolutionPackageRepositoryFactory { public FakeSolutionPackageRepository FakeSolutionPackageRepository = new FakeSolutionPackageRepository(); - public Solution SolutionPassedToCreateSolutionPackageRepository; + public ISolution SolutionPassedToCreateSolutionPackageRepository; - public ISolutionPackageRepository CreateSolutionPackageRepository(Solution solution) + public ISolutionPackageRepository CreateSolutionPackageRepository(ISolution solution) { SolutionPassedToCreateSolutionPackageRepository = solution; return FakeSolutionPackageRepository; diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectHelper.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectHelper.cs index 986022cba4..9e40f515b5 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectHelper.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectHelper.cs @@ -18,14 +18,14 @@ namespace PackageManagement.Tests.Helpers public static TestableProject CreateTestProject(string name) { - Solution solution = new Solution(new MockProjectChangeWatcher()); + ISolution solution = new Solution(new MockProjectChangeWatcher()); solution.FileName = @"d:\projects\Test\TestSolution.sln"; return CreateTestProject(solution, name); } public static TestableProject CreateTestProject( - Solution parentSolution, + ISolution parentSolution, string name, string fileName = @"d:\projects\Test\TestProject\TestProject.csproj") { diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementSelectedProjectsTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementSelectedProjectsTests.cs index 19463606d5..b9822e34b8 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementSelectedProjectsTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementSelectedProjectsTests.cs @@ -43,7 +43,7 @@ namespace PackageManagement.Tests TestableProject project1 = ProjectHelper.CreateTestProject("Test1"); TestableProject project2 = ProjectHelper.CreateTestProject("Test2"); - Solution solution = project1.ParentSolution; + ISolution solution = project1.ParentSolution; project2.Parent = solution; fakeSolution.FakeMSBuildProjects.Add(project1); diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementSolutionTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementSolutionTests.cs index e3f2420b5d..d3c5b47a9a 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementSolutionTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementSolutionTests.cs @@ -415,8 +415,8 @@ namespace PackageManagement.Tests solution.IsPackageInstalled(package); - Solution expectedSolution = fakeProjectService.OpenSolution; - Solution solutionUsedToCreateSolutionPackageRepository = + ISolution expectedSolution = fakeProjectService.OpenSolution; + ISolution solutionUsedToCreateSolutionPackageRepository = fakeSolutionPackageRepositoryFactory.SolutionPassedToCreateSolutionPackageRepository; Assert.AreEqual(expectedSolution, solutionUsedToCreateSolutionPackageRepository); diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleViewModelTests.cs index 40768123a2..5c001fec9d 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleViewModelTests.cs @@ -95,10 +95,10 @@ namespace PackageManagement.Tests.Scripting return enabledPackageSource; } - Solution CreateViewModelWithOneProjectOpen() + ISolution CreateViewModelWithOneProjectOpen() { CreateConsoleHost(); - Solution solution = CreateSolutionWithOneProject(); + ISolution solution = CreateSolutionWithOneProject(); projectService = new FakePackageManagementProjectService(); projectService.OpenSolution = solution; CreateViewModel(consoleHost, projectService); @@ -106,10 +106,10 @@ namespace PackageManagement.Tests.Scripting return solution; } - Solution CreateSolutionWithOneProject() + ISolution CreateSolutionWithOneProject() { TestableProject project = ProjectHelper.CreateTestProject(); - Solution solution = project.ParentSolution; + ISolution solution = project.ParentSolution; solution.AddFolder(project); return solution; @@ -146,7 +146,7 @@ namespace PackageManagement.Tests.Scripting viewModel.PropertyChanged += (sender, e) => propertiesChanged.Add(e.PropertyName); } - Solution CreateViewModelWithEmptySolutionOpen() + ISolution CreateViewModelWithEmptySolutionOpen() { CreateConsoleHost(); var solution = new Solution(new MockProjectChangeWatcher()); @@ -156,7 +156,7 @@ namespace PackageManagement.Tests.Scripting return solution; } - TestableProject AddProjectToSolution(Solution solution) + TestableProject AddProjectToSolution(ISolution solution) { var project = ProjectHelper.CreateTestProject(); solution.AddFolder(project); @@ -169,13 +169,13 @@ namespace PackageManagement.Tests.Scripting projectService.FireSolutionClosedEvent(); } - void OpenSolution(Solution solution) + void OpenSolution(ISolution solution) { projectService.OpenSolution = solution; projectService.FireSolutionLoadedEvent(solution); } - IProject RemoveProjectFromSolution(Solution solution) + IProject RemoveProjectFromSolution(ISolution solution) { var project = solution.Projects.FirstOrDefault(); solution.RemoveFolder(project); diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/SelectedProjectsForInstalledPackagesTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/SelectedProjectsForInstalledPackagesTests.cs index 9dcac7bed1..9250a494ba 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/SelectedProjectsForInstalledPackagesTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/SelectedProjectsForInstalledPackagesTests.cs @@ -34,7 +34,7 @@ namespace PackageManagement.Tests TestableProject project1 = ProjectHelper.CreateTestProject("Test1"); TestableProject project2 = ProjectHelper.CreateTestProject("Test2"); - Solution solution = project1.ParentSolution; + ISolution solution = project1.ParentSolution; project2.Parent = solution; fakeSolution.FakeMSBuildProjects.Add(project1); diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/SelectedProjectsForUpdatedPackagesTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/SelectedProjectsForUpdatedPackagesTests.cs index c32383739b..9bae25bb17 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/SelectedProjectsForUpdatedPackagesTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/SelectedProjectsForUpdatedPackagesTests.cs @@ -34,7 +34,7 @@ namespace PackageManagement.Tests TestableProject project1 = ProjectHelper.CreateTestProject(projectName1); TestableProject project2 = ProjectHelper.CreateTestProject(projectName2); - Solution solution = project1.ParentSolution; + ISolution solution = project1.ParentSolution; project2.Parent = solution; fakeSolution.FakeMSBuildProjects.Add(project1); diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/SolutionPackageRepositoryPathTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/SolutionPackageRepositoryPathTests.cs index c3cb4d39a4..5e0ac089cf 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/SolutionPackageRepositoryPathTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/SolutionPackageRepositoryPathTests.cs @@ -17,14 +17,14 @@ namespace PackageManagement.Tests SolutionPackageRepositoryPath repositoryPath; IProject testProject; PackageManagementOptions options; - Solution solution; + ISolution solution; void CreateSolutionPackageRepositoryPath() { repositoryPath = new SolutionPackageRepositoryPath(testProject, options); } - void CreateSolutionPackageRepositoryPath(Solution solution) + void CreateSolutionPackageRepositoryPath(ISolution solution) { repositoryPath = new SolutionPackageRepositoryPath(solution, options); } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/SolutionPackageRepositoryTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/SolutionPackageRepositoryTests.cs index ef14b1f360..73e14307de 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/SolutionPackageRepositoryTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/SolutionPackageRepositoryTests.cs @@ -19,7 +19,7 @@ namespace PackageManagement.Tests { SolutionPackageRepository repository; TestablePackageManagementOptions options; - Solution solution; + ISolution solution; FakePackageRepositoryFactory fakeRepositoryFactory; FakeSharedPackageRepository fakeSharedRepository; @@ -40,13 +40,13 @@ namespace PackageManagement.Tests options = new TestablePackageManagementOptions(); } - void CreateRepository(Solution solution, TestablePackageManagementOptions options) + void CreateRepository(ISolution solution, TestablePackageManagementOptions options) { CreateFakeRepositoryFactory(); repository = new SolutionPackageRepository(solution, fakeRepositoryFactory, options); } - void CreateRepository(Solution solution) + void CreateRepository(ISolution solution) { CreateOptions(); CreateRepository(solution, options); diff --git a/src/AddIns/VersionControl/SubversionAddIn/Src/Commands/ProjectBrowserCommands.cs b/src/AddIns/VersionControl/SubversionAddIn/Src/Commands/ProjectBrowserCommands.cs index c9ea9f579e..50359279dc 100644 --- a/src/AddIns/VersionControl/SubversionAddIn/Src/Commands/ProjectBrowserCommands.cs +++ b/src/AddIns/VersionControl/SubversionAddIn/Src/Commands/ProjectBrowserCommands.cs @@ -119,9 +119,9 @@ namespace ICSharpCode.Svn.Commands protected sealed class ProjectWatcher { List list = new List(); - Solution solution; + ISolution solution; - internal ProjectWatcher(Solution solution) + internal ProjectWatcher(ISolution solution) { this.solution = solution; if (AddInOptions.AutomaticallyReloadProject && solution != null) diff --git a/src/Main/Base/Project/Designer/TypeResolutionService.cs b/src/Main/Base/Project/Designer/TypeResolutionService.cs index de086b667b..72c07477fb 100644 --- a/src/Main/Base/Project/Designer/TypeResolutionService.cs +++ b/src/Main/Base/Project/Designer/TypeResolutionService.cs @@ -74,7 +74,7 @@ namespace ICSharpCode.SharpDevelop.Designer } - string formSourceFileName; + FileName formSourceFileName; IProject callingProject; /// /// Dictionary of file name -> hash of loaded assemblies for the currently designed document. @@ -89,10 +89,7 @@ namespace ICSharpCode.SharpDevelop.Designer public IProject CallingProject { get { if (formSourceFileName != null) { - if (ProjectService.OpenSolution != null) { - return ProjectService.OpenSolution.FindProjectContainingFile(formSourceFileName); - } - formSourceFileName = null; + return SD.ProjectService.FindProjectContainingFile(formSourceFileName); } return callingProject; } @@ -102,7 +99,7 @@ namespace ICSharpCode.SharpDevelop.Designer { } - public TypeResolutionService(string formSourceFileName) + public TypeResolutionService(FileName formSourceFileName) { this.formSourceFileName = formSourceFileName; } diff --git a/src/Main/Base/Project/Dom/IModelCollection.cs b/src/Main/Base/Project/Dom/IModelCollection.cs index 3f251e7bab..fb2ac40de8 100644 --- a/src/Main/Base/Project/Dom/IModelCollection.cs +++ b/src/Main/Base/Project/Dom/IModelCollection.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Collections.Specialized; namespace ICSharpCode.SharpDevelop.Dom @@ -13,4 +14,18 @@ namespace ICSharpCode.SharpDevelop.Dom public interface IModelCollection : IReadOnlyCollection, INotifyCollectionChanged { } + + /// + /// A collection that provides change notifications. + /// + public interface IMutableModelCollection : IModelCollection, ICollection + { + } + + /// + /// A model collection implementation that is based on a ObservableCollection. + /// + public class SimpleModelCollection : ObservableCollection, IMutableModelCollection + { + } } diff --git a/src/Main/Base/Project/Dom/SimpleModelCollection.cs b/src/Main/Base/Project/Dom/SimpleModelCollection.cs deleted file mode 100644 index 903b1a65bc..0000000000 --- a/src/Main/Base/Project/Dom/SimpleModelCollection.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) - -using System; -using System.Collections.ObjectModel; - -namespace ICSharpCode.SharpDevelop.Dom -{ - /// - /// A model collection implementation that is based on a ObservableCollection. - /// - public class SimpleModelCollection : ObservableCollection, IModelCollection - { - } -} diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index ae7eb45e0a..0bd1b24292 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -108,7 +108,6 @@ - @@ -165,6 +164,14 @@ + + + + + + + + @@ -232,6 +239,8 @@ OutputWindowOptionsPanel.xaml Code + + @@ -505,7 +514,6 @@ - @@ -653,7 +661,6 @@ - @@ -705,13 +712,7 @@ - - - - - - @@ -755,7 +756,6 @@ - UserControl @@ -788,7 +788,6 @@ - Configuration\GlobalAssemblyInfo.cs @@ -832,6 +831,7 @@ + diff --git a/src/Main/Base/Project/Project/Build/IBuildService.cs b/src/Main/Base/Project/Project/Build/IBuildService.cs index 7b5cef2b35..875b90bda9 100644 --- a/src/Main/Base/Project/Project/Build/IBuildService.cs +++ b/src/Main/Base/Project/Project/Build/IBuildService.cs @@ -31,7 +31,7 @@ namespace ICSharpCode.SharpDevelop.Project Task BuildAsync(IEnumerable projects, BuildOptions options); Task BuildAsync(IProject project, BuildOptions options); - Task BuildAsync(Solution solution, BuildOptions options); + Task BuildAsync(ISolution solution, BuildOptions options); /// /// Raised when a build is started. diff --git a/src/Main/Base/Project/Project/ConfigurationAndPlatform.cs b/src/Main/Base/Project/Project/ConfigurationAndPlatform.cs new file mode 100644 index 0000000000..f6b1f9dd19 --- /dev/null +++ b/src/Main/Base/Project/Project/ConfigurationAndPlatform.cs @@ -0,0 +1,104 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Text.RegularExpressions; + +namespace ICSharpCode.SharpDevelop.Project +{ + /// + /// Represents a configuration/platform pair. + /// + public struct ConfigurationAndPlatform : IEquatable + { + readonly static Regex configurationRegEx = new Regex(@"'(?[^']*)'\s*==\s*'(?[^']*)'", RegexOptions.Compiled); + + /// + /// Gets configuration and platform from an MSBuild condition in the format "'$(Configuration)|$(Platform)' == 'configuration|platform'". + /// + public static ConfigurationAndPlatform FromCondition(string condition) + { + Match match = configurationRegEx.Match(condition); + if (match.Success) { + string conditionProperty = match.Result("${property}"); + string conditionValue = match.Result("${value}"); + if (conditionProperty == "$(Configuration)|$(Platform)") { + // configuration is ok + return FromKey(conditionValue); + } else if (conditionProperty == "$(Configuration)") { + return new ConfigurationAndPlatform(conditionValue, null); + } else if (conditionProperty == "$(Platform)") { + return new ConfigurationAndPlatform(null, conditionValue); + } else { + return default(ConfigurationAndPlatform); + } + } else { + return default(ConfigurationAndPlatform); + } + } + + /// + /// Gets configuration and platform from a key string in the format 'configuration|platform'. + /// + public static ConfigurationAndPlatform FromKey(string key) + { + int pos = key.IndexOf('|'); + if (pos < 0) + return default(ConfigurationAndPlatform); + else + return new ConfigurationAndPlatform(key.Substring(0, pos), key.Substring(pos + 1)); + } + + readonly string configuration; + readonly string platform; + + public ConfigurationAndPlatform(string configuration, string platform) + { + this.configuration = configuration; + this.platform = platform; + } + + public string Platform { + get { return platform; } + } + + public string Configuration { + get { return configuration; } + } + + #region Equals and GetHashCode implementation + public override bool Equals(object obj) + { + if (obj is ConfigurationAndPlatform) + return Equals((ConfigurationAndPlatform)obj); // use Equals method below + else + return false; + } + + public bool Equals(ConfigurationAndPlatform other) + { + return this.configuration == other.configuration && this.platform == other.platform; + } + + public override int GetHashCode() + { + return (configuration != null ? configuration.GetHashCode() : 0) ^ (platform != null ? platform.GetHashCode() : 0); + } + + public static bool operator ==(ConfigurationAndPlatform left, ConfigurationAndPlatform right) + { + return left.Equals(right); + } + + public static bool operator !=(ConfigurationAndPlatform left, ConfigurationAndPlatform right) + { + return !left.Equals(right); + } + #endregion + + public override string ToString() + { + return configuration + "|" + platform; + } + } +} diff --git a/src/Main/Base/Project/Project/IConfigurable.cs b/src/Main/Base/Project/Project/IConfigurable.cs new file mode 100644 index 0000000000..98dc95216c --- /dev/null +++ b/src/Main/Base/Project/Project/IConfigurable.cs @@ -0,0 +1,42 @@ +/* + * Created by SharpDevelop. + * User: Daniel + * Date: 2/26/2013 + * Time: 16:27 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; + +namespace ICSharpCode.SharpDevelop.Project +{ + /// + /// Description of IConfigurable. + /// + public interface IConfigurable + { + /// + /// Gets the list of available configuration names. + /// + IConfigurationOrPlatformNameCollection ConfigurationNames { get; } + + /// + /// Gets the list of available platform names. + /// + IConfigurationOrPlatformNameCollection PlatformNames { get; } + + /// + /// Gets/Sets the active configuration+platform of the solution. + /// + /// + /// After changing this property on the solution, the change will be automatically applied + /// to the projects (using the solution <-> project configuration mapping). + /// + ConfigurationAndPlatform ActiveConfiguration { get; set; } + + /// + /// Is raised after the ActiveConfiguration property has changed. + /// + event EventHandler ActiveConfigurationChanged; + } +} diff --git a/src/Main/Base/Project/Project/IConfigurationMapping.cs b/src/Main/Base/Project/Project/IConfigurationMapping.cs new file mode 100644 index 0000000000..a127713731 --- /dev/null +++ b/src/Main/Base/Project/Project/IConfigurationMapping.cs @@ -0,0 +1,33 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; + +namespace ICSharpCode.SharpDevelop.Project +{ + /// + /// Represents a mapping between solution and project configurations. + /// + public interface IConfigurationMapping + { + /// + /// Gets the project configuration corresponding to the given solution configuration. + /// + ConfigurationAndPlatform GetProjectConfiguration(ConfigurationAndPlatform solutionConfiguration); + + /// + /// Sets the project configuration corresponding to the given solution configuration. + /// + void SetProjectConfiguration(ConfigurationAndPlatform solutionConfiguration, ConfigurationAndPlatform projectConfiguration); + + /// + /// Gets whether building the project is enabled in the given solution configuration. + /// + bool IsBuildEnabled(ConfigurationAndPlatform solutionConfiguration); + + /// + /// Sets whether building the project is enabled in the given solution configuration. + /// + void SetBuildEnabled(ConfigurationAndPlatform solutionConfiguration, bool value); + } +} diff --git a/src/Main/Base/Project/Project/IConfigurationOrPlatformNameCollection.cs b/src/Main/Base/Project/Project/IConfigurationOrPlatformNameCollection.cs new file mode 100644 index 0000000000..cf458b1963 --- /dev/null +++ b/src/Main/Base/Project/Project/IConfigurationOrPlatformNameCollection.cs @@ -0,0 +1,54 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.Generic; +using System.Collections.Specialized; + +using ICSharpCode.SharpDevelop.Dom; + +namespace ICSharpCode.SharpDevelop.Project +{ + /// + /// Represents a collection of configuration or platform names. + /// + public interface IConfigurationOrPlatformNameCollection : IReadOnlyCollection, INotifyCollectionChanged + { + /// + /// Validates the input name. + /// + /// If the name is valid, this method returns the normalized form of the input name. + /// If the name is invalid, this method returns null. + /// + /// + /// Normalization will trim spaces around the name; and it will normalize between "AnyCPU" and "Any CPU". + /// + string ValidateName(string name); + /* + * if (MSBuildInternals.Escape(newName) != newName + || !FileUtility.IsValidDirectoryEntryName(newName) + || newName.Contains("'")) + { + return false; + } + */ + + /// + /// Creates a new configuration/platform. + /// Settings will be copied from the existing configuration/platform . + /// If is null, no settings will be copied. + /// + void Add(string newName, string copyFrom); + + /// + /// Removes the configuration/platform with the specified name. + /// + void Remove(string name); + + /// + /// Renames the configuration or platform from 'oldName' to 'newName'. + /// If the configuration or platform is active, the property will be changed. + /// + void Rename(string oldName, string newName); + } +} diff --git a/src/Main/Base/Project/Project/IProjectService.cs b/src/Main/Base/Project/Project/IProjectService.cs new file mode 100644 index 0000000000..85b231e5ae --- /dev/null +++ b/src/Main/Base/Project/Project/IProjectService.cs @@ -0,0 +1,80 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Dom; + +namespace ICSharpCode.SharpDevelop.Project +{ + /// + /// Deals with loading projects and solutions. + /// + [SDService("SD.ProjectService")] + public interface IProjectService + { + /// + /// Gets the solution that is currently opened within the IDE. + /// + ISolution OpenSolution { get; } + + event EventHandler OpenSolutionChanged; + + /// + /// Gets/Sets the project that is currently considered 'active' within the IDE. + /// + IProject CurrentProject { get; set; } + + event EventHandler CurrentProjectChanged; + + /// + /// Gets the list of projects that are currently opened within the IDE. + /// + IModelCollection Projects { get; } + + /// + /// Finds the project that contains the specified file. + /// Returns null if none of the open projects contains the file. + /// + /// + /// If multiple projects contain the file, any one of them is returned. + /// + IProject FindProjectContainingFile(FileName fileName); + + /// + /// If the given filename is a solution file (.sln), it is loaded and opened in the IDE. + /// Otherwise, SharpDevelop looks for a .sln file corresponding to the project file, and opens that instead. + /// If no such .sln file is found, SharpDevelop will create one. + /// + /// + /// If any errors occur, this method may display an error dialog. + /// + void OpenSolutionOrProject(FileName fileName); + + /// + /// Closes the currently open solution. + /// + void CloseSolution(); + + /// + /// Returns if the given file is considered a project or solution file. + /// This method looks at the list of registered file extensions in /SharpDevelop/Workbench/ProjectBinding. + /// + bool IsProjectOrSolutionFile(FileName fileName); + + /// + /// Loads a solution file without opening it in the IDE. + /// + /// + /// The .sln file is malformed or an unsupported version, and cannot be loaded. + /// This exception does not occur if only individual projects within the solution are invalid. + /// + ISolution LoadSolutionFile(FileName fileName); + + /// + /// Creates a new, empty solution and loads it without opening it in the IDE. + /// The file is not saved to disk until is called. + /// + ISolution CreateEmptySolutionFile(FileName fileName); + } +} diff --git a/src/Main/Base/Project/Project/ISolution.cs b/src/Main/Base/Project/Project/ISolution.cs new file mode 100644 index 0000000000..2bc28025f8 --- /dev/null +++ b/src/Main/Base/Project/Project/ISolution.cs @@ -0,0 +1,88 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Dom; + +namespace ICSharpCode.SharpDevelop.Project +{ + public enum SolutionFormatVersion // TODO: change IProject.MinimumSolutionFormatVersion to this enum type + { + VS2005 = 9, + VS2008 = 10, + VS2010 = 11, + VS2012 = 12 + } + + /// + /// Represents a solution. + /// + public interface ISolution : ISolutionFolder, ICanBeDirty, IConfigurable, IDisposable + { + Microsoft.Build.Evaluation.ProjectCollection MSBuildProjectCollection { get; } + + /// + /// Gets the full path of the .sln file. + /// + FileName FileName { get; } + + event EventHandler FileNameChanged; + + /// + /// Gets the full path of the directory containing the .sln file. + /// + string Directory { get; } + + /// + /// Gets/Sets the startup project. + /// + IProject StartupProject { get; set; } + + event EventHandler StartupProjectChanged; + + /// + /// Gets all projects in the solution. + /// + IModelCollection Projects { get; } + + /// + /// Loads an existing project from disk and adds it to this solution. + /// + /// Path to the project file + /// + /// Optional: The parent folder to which the new project should be added. + /// If this parameter is not specified, the project is added to the root folder of the solution. + /// + void AddExistingProject(FileName fileName, ISolutionFolder parentFolder = null); + + /// + /// Gets all file items in the solution. + /// + IModelCollection FileItems { get; } + + /// + /// Gets a container that can be used to store data about the solution. + /// This data is stored in SharpDevelop's config directory, not directly with the .sln file. + /// + Properties Preferences { get; } + + /// + /// Saves the preferences for this solution; and also for any projects within this solution. + /// + void SavePreferences(); + + /// + /// Gets whether the solution is read-only. + /// + bool IsReadOnly { get; } + + /// + /// Saves the solution. + /// This will also save all modified projects within this solution. + /// + void Save(); + + + } +} diff --git a/src/Main/Base/Project/Project/ISolutionFolder.cs b/src/Main/Base/Project/Project/ISolutionFolder.cs new file mode 100644 index 0000000000..f3f30b21b0 --- /dev/null +++ b/src/Main/Base/Project/Project/ISolutionFolder.cs @@ -0,0 +1,40 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.SharpDevelop.Dom; + +namespace ICSharpCode.SharpDevelop.Project +{ + /// + /// Represents a solution folder. + /// + public interface ISolutionFolder : ISolutionItem + { + /// + /// Gets/Sets the name of the folder. + /// + /// newName is not a valid solution name. + /// + /// For the solution itself, setting this property will rename the .sln file. + /// + string Name { get; set; } + + /* if (solution.Name == newName) + return; + if (!FileService.CheckFileName(newName)) + return; + string newFileName = Path.Combine(solution.Directory, newName + ".sln"); + if (!FileService.RenameFile(solution.FileName, newFileName, false)) { + return; + } + solution.FileName = newFileName; + solution.Name = newName; + */ + + /// + /// Gets the list of direct child items in this solution folder. + /// + IMutableModelCollection Items { get; } + } +} diff --git a/src/Main/Base/Project/Project/ISolutionItem.cs b/src/Main/Base/Project/Project/ISolutionItem.cs new file mode 100644 index 0000000000..ee52b00515 --- /dev/null +++ b/src/Main/Base/Project/Project/ISolutionItem.cs @@ -0,0 +1,41 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.Project +{ + /// + /// Represents an item within a solution folder. + /// This may be a file, a project, or another solution folder. + /// + public interface ISolutionItem + { + /// + /// Gets the parent folder. + /// This property will return null for the solution (which acts as the top-level folder). + /// It will also return null for folders that were removed from their parent. + /// + /// + /// The parent folder of an item can change, e.g. when a project is moved into a different folder. + /// The setter of this property should be used by the implementation only. + /// + ISolutionFolder ParentFolder { get; set; } + + /// + /// Gets the parent solution. + /// This property is thread-safe, and will never returns null. + /// + /// + /// The parent solution of a solution item cannot change; a new instance of the item must be created + /// in order to move the item to another solution. + /// + ISolution ParentSolution { get; } + } + + public interface ISolutionFileItem : ISolutionItem + { + FileName FileName { get; } + } +} diff --git a/src/Main/Base/Project/Services/SD.cs b/src/Main/Base/Project/Services/SD.cs index 73ef2f444d..b7af11f851 100644 --- a/src/Main/Base/Project/Services/SD.cs +++ b/src/Main/Base/Project/Services/SD.cs @@ -205,5 +205,10 @@ namespace ICSharpCode.SharpDevelop public static IDisplayBindingService DisplayBindingService { get { return GetRequiredService(); } } + + /// + public static IProjectService ProjectService { + get { return GetRequiredService(); } + } } } diff --git a/src/Main/Base/Project/Src/Commands/BuildCommands.cs b/src/Main/Base/Project/Src/Commands/BuildCommands.cs index 85d0aa234d..88e38067ef 100644 --- a/src/Main/Base/Project/Src/Commands/BuildCommands.cs +++ b/src/Main/Base/Project/Src/Commands/BuildCommands.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows; @@ -224,8 +225,8 @@ namespace ICSharpCode.SharpDevelop.Project.Commands { if (ProjectService.OpenSolution == null) return new MenuItem[0]; - IList configurationNames = ProjectService.OpenSolution.GetConfigurationNames(); - string activeConfiguration = ProjectService.OpenSolution.Preferences.ActiveConfiguration; + var configurationNames = ProjectService.OpenSolution.ConfigurationNames.ToList(); + string activeConfiguration = ProjectService.OpenSolution.ActiveConfiguration.Configuration; MenuItem[] items = new MenuItem[configurationNames.Count]; for (int i = 0; i < items.Length; i++) { items[i] = new MenuItem { @@ -237,12 +238,11 @@ namespace ICSharpCode.SharpDevelop.Project.Commands return items; } - void SetConfigurationItemClick(object sender, EventArgs e) + static void SetConfigurationItemClick(object sender, EventArgs e) { MenuItem item = (MenuItem)sender; - ProjectService.OpenSolution.Preferences.ActiveConfiguration = (string)item.Header; - ProjectService.OpenSolution.ApplySolutionConfigurationAndPlatformToProjects(); - ProjectBrowserPad.Instance.ProjectBrowserControl.RefreshView(); + ISolution solution = ProjectService.OpenSolution; + solution.ActiveConfiguration = new ConfigurationAndPlatform((string)item.Header, solution.ActiveConfiguration.Platform); } } @@ -252,8 +252,8 @@ namespace ICSharpCode.SharpDevelop.Project.Commands { if (ProjectService.OpenSolution == null) return new MenuItem[0]; - IList platformNames = ProjectService.OpenSolution.GetPlatformNames(); - string activePlatform = ProjectService.OpenSolution.Preferences.ActivePlatform; + IList platformNames = ProjectService.OpenSolution.PlatformNames.ToList(); + string activePlatform = ProjectService.OpenSolution.ActiveConfiguration.Platform; MenuItem[] items = new MenuItem[platformNames.Count]; for (int i = 0; i < items.Length; i++) { items[i] = new MenuItem { @@ -265,12 +265,11 @@ namespace ICSharpCode.SharpDevelop.Project.Commands return items; } - void SetPlatformItemClick(object sender, EventArgs e) + static void SetPlatformItemClick(object sender, EventArgs e) { MenuItem item = (MenuItem)sender; - ProjectService.OpenSolution.Preferences.ActivePlatform = (string)item.Header; - ProjectService.OpenSolution.ApplySolutionConfigurationAndPlatformToProjects(); - ProjectBrowserPad.Instance.ProjectBrowserControl.RefreshView(); + ISolution solution = ProjectService.OpenSolution; + solution.ActiveConfiguration = new ConfigurationAndPlatform(solution.ActiveConfiguration.Configuration, (string)item.Header); } } @@ -281,8 +280,6 @@ namespace ICSharpCode.SharpDevelop.Project.Commands using (SolutionConfigurationEditor sce = new SolutionConfigurationEditor()) { sce.ShowDialog(SD.WinForms.MainWin32Window); ProjectService.SaveSolution(); - ProjectService.OpenSolution.ApplySolutionConfigurationAndPlatformToProjects(); - ProjectBrowserPad.Instance.ProjectBrowserControl.RefreshView(); } } } diff --git a/src/Main/Base/Project/Src/Commands/FileCommands.cs b/src/Main/Base/Project/Src/Commands/FileCommands.cs index b08f63e415..1eae043a9f 100644 --- a/src/Main/Base/Project/Src/Commands/FileCommands.cs +++ b/src/Main/Base/Project/Src/Commands/FileCommands.cs @@ -22,7 +22,7 @@ namespace ICSharpCode.SharpDevelop.Commands { ProjectNode node = ProjectBrowserPad.Instance.CurrentProject; if (node != null) { - if (node.Project.ReadOnly) + if (node.Project.IsReadOnly) { MessageService.ShowWarningFormatted("${res:Dialog.NewFile.ReadOnlyProjectWarning}", node.Project.FileName); } diff --git a/src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/LocalizedObject.cs b/src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/LocalizedObject.cs index 0f20804a0e..685e8c2179 100644 --- a/src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/LocalizedObject.cs +++ b/src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/LocalizedObject.cs @@ -124,7 +124,7 @@ namespace ICSharpCode.SharpDevelop.Gui return this; } - public virtual void InformSetValue(PropertyDescriptor propertyDescriptor, object component, object value) + protected internal virtual void InformSetValue(PropertyDescriptor propertyDescriptor, object value) { } diff --git a/src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/LocalizedPropertyDescriptor.cs b/src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/LocalizedPropertyDescriptor.cs index f07abf9aca..6a8cacc36b 100644 --- a/src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/LocalizedPropertyDescriptor.cs +++ b/src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/LocalizedPropertyDescriptor.cs @@ -115,7 +115,7 @@ namespace ICSharpCode.SharpDevelop.Gui { this.basePropertyDescriptor.ResetValue(component); if (component is LocalizedObject) { - ((LocalizedObject)component).InformSetValue(this, component, null); + ((LocalizedObject)component).InformSetValue(this, null); } } @@ -132,7 +132,7 @@ namespace ICSharpCode.SharpDevelop.Gui this.basePropertyDescriptor.SetValue(component, value); } if (component is LocalizedObject) { - ((LocalizedObject)component).InformSetValue(this, component, value); + ((LocalizedObject)component).InformSetValue(this, value); } } } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ApplicationSettings.xaml.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ApplicationSettings.xaml.cs index d54b564d86..abe8e54942 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ApplicationSettings.xaml.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ApplicationSettings.xaml.cs @@ -184,7 +184,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels void project_MinimumSolutionVersionChanged(object sender, EventArgs e) { // embedding manifests requires the project to target MSBuild 3.5 or higher - applicationManifestComboBox.IsEnabled = base.Project.MinimumSolutionVersion >= Solution.SolutionVersionVS2008; + applicationManifestComboBox.IsEnabled = base.Project.MinimumSolutionVersion >= SolutionFormatVersion.VS2008; } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/BuildAdvanced.xaml.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/BuildAdvanced.xaml.cs index 4a096b0a9a..539e71b94d 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/BuildAdvanced.xaml.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/BuildAdvanced.xaml.cs @@ -60,7 +60,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels this.TargetCPU = new List(); supports32BitPreferred = false; if (DotnetDetection.IsDotnet45Installed()) { - supports32BitPreferred = projectOptions.Project.MinimumSolutionVersion >= Solution.SolutionVersionVS2010; + supports32BitPreferred = projectOptions.Project.MinimumSolutionVersion >= SolutionFormatVersion.VS2010; // Show 32 vs. 64 options even for library projects; // it's relevant for web applications. } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ProjectOptionPanel.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ProjectOptionPanel.cs index 798e4253ee..f9cfaddebc 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ProjectOptionPanel.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ProjectOptionPanel.cs @@ -120,17 +120,17 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels ApplyTemplate(); project = (MSBuildBasedProject)owner; if (configurationComboBox != null) { - List configurations = project.ConfigurationNames.Union(new[] { project.ActiveConfiguration }).ToList(); + List configurations = project.ConfigurationNames.Union(new[] { project.ActiveConfiguration.Configuration }).ToList(); configurations.Sort(); configurationComboBox.ItemsSource = configurations; - configurationComboBox.SelectedItem = project.ActiveConfiguration; + configurationComboBox.SelectedItem = project.ActiveConfiguration.Configuration; configurationComboBox.SelectionChanged += comboBox_SelectionChanged; } if (platformComboBox != null) { - List platforms = project.PlatformNames.Union(new[] { project.ActivePlatform }).ToList(); + List platforms = project.PlatformNames.Union(new[] { project.ActiveConfiguration.Platform }).ToList(); platforms.Sort(); platformComboBox.ItemsSource = platforms; - platformComboBox.SelectedItem = project.ActivePlatform; + platformComboBox.SelectedItem = project.ActiveConfiguration.Platform; platformComboBox.SelectionChanged += comboBox_SelectionChanged; } Initialize(); @@ -170,12 +170,12 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels if (configurationComboBox != null) activeConfiguration = (string)configurationComboBox.SelectedItem; else - activeConfiguration = project.ActiveConfiguration; + activeConfiguration = project.ActiveConfiguration.Configuration; if (platformComboBox != null) activePlatform = (string)platformComboBox.SelectedItem; else - activePlatform = project.ActivePlatform; + activePlatform = project.ActiveConfiguration.Platform; isLoaded = true; Load(project, activeConfiguration, activePlatform); diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/EditAvailableConfigurationsDialog.cs b/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/EditAvailableConfigurationsDialog.cs index 1d5a8fa65d..5493c8aecf 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/EditAvailableConfigurationsDialog.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/EditAvailableConfigurationsDialog.cs @@ -14,11 +14,11 @@ namespace ICSharpCode.SharpDevelop.Gui { public partial class EditAvailableConfigurationsDialog { - Solution solution; - IProject project; - bool editPlatforms; + readonly IConfigurable configurable; + readonly bool editPlatforms; + readonly IConfigurationOrPlatformNameCollection editedCollection; - private EditAvailableConfigurationsDialog() + public EditAvailableConfigurationsDialog(IConfigurable configurable, bool editPlatforms) { // // The InitializeComponent() call is required for Windows Forms designer support. @@ -28,49 +28,23 @@ namespace ICSharpCode.SharpDevelop.Gui foreach (Control ctl in this.Controls) { ctl.Text = StringParser.Parse(ctl.Text); } - } - - public EditAvailableConfigurationsDialog(Solution solution, bool editPlatforms) - : this() - { - this.solution = solution; - this.editPlatforms = editPlatforms; - InitList(); - if (editPlatforms) + if (editPlatforms) { this.Text = StringParser.Parse("${res:Dialog.EditAvailableConfigurationsDialog.EditSolutionPlatforms}"); - else + this.editedCollection = configurable.ConfigurationNames; + } else { this.Text = StringParser.Parse("${res:Dialog.EditAvailableConfigurationsDialog.EditSolutionConfigurations}"); - } - - public EditAvailableConfigurationsDialog(IProject project, bool editPlatforms) - : this() - { - this.project = project; - this.solution = project.ParentSolution; - this.editPlatforms = editPlatforms; + this.editedCollection = configurable.PlatformNames; + } InitList(); - - if (editPlatforms) - this.Text = StringParser.Parse("${res:Dialog.EditAvailableConfigurationsDialog.EditProjectPlatforms}"); - else - this.Text = StringParser.Parse("${res:Dialog.EditAvailableConfigurationsDialog.EditProjectConfigurations}"); } void InitList() { - if (project != null) { - if (editPlatforms) { - ShowEntries(project.PlatformNames, project.ActivePlatform); - } else { - ShowEntries(project.ConfigurationNames, project.ActiveConfiguration); - } + if (editPlatforms) { + ShowEntries(configurable.PlatformNames, configurable.ActiveConfiguration.Platform); } else { - if (editPlatforms) { - ShowEntries(solution.GetPlatformNames(), solution.Preferences.ActivePlatform); - } else { - ShowEntries(solution.GetConfigurationNames(), solution.Preferences.ActiveConfiguration); - } + ShowEntries(configurable.ConfigurationNames, configurable.ActiveConfiguration.Configuration); } } @@ -95,33 +69,11 @@ namespace ICSharpCode.SharpDevelop.Gui if (MessageService.AskQuestion(StringParser.Format( "${res:Dialog.EditAvailableConfigurationsDialog.ConfirmRemoveConfigurationOrPlatform}", name))) { - if (project != null) { - Remove(project, name, editPlatforms); - } else { - Remove(solution, name, editPlatforms); - } + editedCollection.Remove(name); InitList(); } } - static void Remove(IProject project, string name, bool isPlatform) - { - if (isPlatform) { - project.ParentSolution.RemoveProjectPlatform(project, name); - } else { - project.ParentSolution.RemoveProjectConfiguration(project, name); - } - } - - static void Remove(Solution solution, string name, bool isPlatform) - { - if (isPlatform) { - solution.RemoveSolutionPlatform(name); - } else { - solution.RemoveSolutionConfiguration(name); - } - } - void RenameButtonClick(object sender, EventArgs e) { string oldName = listBox.SelectedItem.ToString(); @@ -131,106 +83,50 @@ namespace ICSharpCode.SharpDevelop.Gui return; if (!EnsureCorrectName(ref newName)) return; - if (project != null) { - Rename(project, oldName, newName); - } else { - if (editPlatforms) { - solution.RenameSolutionPlatform(oldName, newName); - if (solution.Preferences.ActivePlatform == oldName) { - solution.Preferences.ActivePlatform = newName; - } - } else { - solution.RenameSolutionConfiguration(oldName, newName); - if (solution.Preferences.ActiveConfiguration == oldName) { - solution.Preferences.ActiveConfiguration = newName; - } - } + editedCollection.Rename(oldName, newName); + ISolution solution = configurable as ISolution; + if (solution != null) { // Solution platform name => project platform name foreach (IProject p in solution.Projects) { - Rename(p, oldName, newName); + if (editPlatforms) { + p.PlatformNames.Rename(oldName, newName); + } else { + p.ConfigurationNames.Rename(oldName, newName); + } } } InitList(); } - void Rename(IProject project, string oldName, string newName) - { - if (editPlatforms) { - if (project.PlatformNames.Contains(newName)) - return; - solution.RenameProjectPlatform(project, oldName, newName); - } else { - if (project.ConfigurationNames.Contains(newName)) - return; - solution.RenameProjectConfiguration(project, oldName, newName); - } - } - bool EnsureCorrectName(ref string newName) { - newName = newName.Trim(); - if (editPlatforms && string.Equals(newName, "AnyCPU", StringComparison.OrdinalIgnoreCase)) - newName = "Any CPU"; + newName = editedCollection.ValidateName(newName); + if (newName == null) { + MessageService.ShowMessage("${res:Dialog.EditAvailableConfigurationsDialog.InvalidName}"); + return false; + } foreach (string item in listBox.Items) { if (string.Equals(item, newName, StringComparison.OrdinalIgnoreCase)) { MessageService.ShowMessage("${res:Dialog.EditAvailableConfigurationsDialog.DuplicateName}"); return false; } } - if (MSBuildInternals.Escape(newName) != newName - || !FileUtility.IsValidDirectoryEntryName(newName) - || newName.Contains("'")) - { - MessageService.ShowMessage("${res:Dialog.EditAvailableConfigurationsDialog.InvalidName}"); - return false; - } return true; } void AddButtonClick(object sender, EventArgs e) { - IEnumerable availableSourceItems; - if (project != null) { - if (editPlatforms) { - availableSourceItems = project.PlatformNames; - } else { - availableSourceItems = project.ConfigurationNames; - } - } else { - if (editPlatforms) { - availableSourceItems = solution.GetPlatformNames(); - } else { - availableSourceItems = solution.GetConfigurationNames(); - } - } - using (AddNewConfigurationDialog dlg = new AddNewConfigurationDialog - (project == null, editPlatforms, - availableSourceItems, + (configurable is ISolution, editPlatforms, + editedCollection, delegate (string name) { return EnsureCorrectName(ref name); } )) { if (dlg.ShowDialog(this) == DialogResult.OK) { - string newName = dlg.NewName; - // fix up the new name - if (!EnsureCorrectName(ref newName)) - return; - - if (project != null) { - IProjectAllowChangeConfigurations pacc = project as IProjectAllowChangeConfigurations; - if (pacc != null) { - if (editPlatforms) { - pacc.AddProjectPlatform(MSBuildInternals.FixPlatformNameForProject(newName), dlg.CopyFrom); - } else { - pacc.AddProjectConfiguration(newName, dlg.CopyFrom); - } - } - } else { - if (editPlatforms) { - solution.AddSolutionPlatform(newName, dlg.CopyFrom, dlg.CreateInAllProjects); - } else { - solution.AddSolutionConfiguration(newName, dlg.CopyFrom, dlg.CreateInAllProjects); - } + editedCollection.Add(dlg.NewName, dlg.CopyFrom); + if (dlg.CreateInAllProjects) { + #warning + throw new NotImplementedException(); } InitList(); } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/SolutionConfigurationEditor.cs b/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/SolutionConfigurationEditor.cs index 4e816cc615..c61f67bbd0 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/SolutionConfigurationEditor.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/SolutionConfigurationEditor.cs @@ -13,11 +13,12 @@ namespace ICSharpCode.SharpDevelop.Gui { public partial class SolutionConfigurationEditor { - Solution solution; + ISolution solution; bool inUpdate; int configurationComboBoxEditIndex; int platformComboBoxEditIndex; + ConfigurationAndPlatform solutionConfig; public SolutionConfigurationEditor() { @@ -52,10 +53,10 @@ namespace ICSharpCode.SharpDevelop.Gui void UpdateAvailableSolutionConfigurationPlatforms() { - SetItems(configurationComboBox.Items, solution.GetConfigurationNames()); - SetItems(platformComboBox.Items, solution.GetPlatformNames()); - SelectElement(configurationComboBox, solution.Preferences.ActiveConfiguration); - SelectElement(platformComboBox, solution.Preferences.ActivePlatform); + SetItems(configurationComboBox.Items, solution.ConfigurationNames); + SetItems(platformComboBox.Items, solution.PlatformNames); + SelectElement(configurationComboBox, solution.ActiveConfiguration.Configuration); + SelectElement(platformComboBox, solution.ActiveConfiguration.Platform); string editItemText = EditTag.Instance.ToString(); configurationComboBoxEditIndex = configurationComboBox.Items.Add(editItemText); @@ -99,32 +100,21 @@ namespace ICSharpCode.SharpDevelop.Gui { inUpdate = true; - Dictionary matchingDict = - new Dictionary(); - foreach (Solution.ProjectConfigurationPlatformMatching matching in - solution.GetActiveConfigurationsAndPlatformsForProjects(configurationComboBox.Text, - platformComboBox.Text)) - { - matchingDict[matching.Project] = matching; - } + solutionConfig = new ConfigurationAndPlatform(configurationComboBox.Text, platformComboBox.Text); foreach (DataGridViewRow row in grid.Rows) { IProject p = (IProject)row.Tag; - Solution.ProjectConfigurationPlatformMatching matching; - if (!matchingDict.TryGetValue(p, out matching)) { - matching = new Solution.ProjectConfigurationPlatformMatching(p, p.ActiveConfiguration, p.ActivePlatform, null); - } + var projectConfig = p.ConfigurationMapping.GetProjectConfiguration(solutionConfig); + DataGridViewComboBoxCell c1 = (DataGridViewComboBoxCell)row.Cells[1]; - c1.Tag = matching; SetItems(c1.Items, p.ConfigurationNames); - SelectElement(c1, matching.Configuration); + SelectElement(c1, projectConfig.Configuration); c1.Items.Add(EditTag.Instance); DataGridViewComboBoxCell c2 = (DataGridViewComboBoxCell)row.Cells[2]; - c2.Tag = matching; SetItems(c2.Items, p.PlatformNames); - SelectElement(c2, matching.Platform); + SelectElement(c2, projectConfig.Platform); c2.Items.Add(EditTag.Instance); } inUpdate = false; @@ -167,26 +157,13 @@ namespace ICSharpCode.SharpDevelop.Gui { if (!inUpdate && e.RowIndex >= 0) { DataGridViewRow row = grid.Rows[e.RowIndex]; - DataGridViewCell cell = row.Cells[e.ColumnIndex]; - Solution.ProjectConfigurationPlatformMatching matching = cell.Tag as Solution.ProjectConfigurationPlatformMatching; - if (matching != null) { - if (e.ColumnIndex == configurationColumn.Index) { - matching.Configuration = cell.Value.ToString(); - } else { - matching.Platform = cell.Value.ToString(); - } - if (matching.Platform == "AnyCPU") { - matching.Platform = "Any CPU"; - } - - if (matching.SolutionItem == null) { - matching.SolutionItem = solution.CreateMatchingItem(configurationComboBox.Text, - platformComboBox.Text, - matching.Project, ""); - } - matching.SetProjectConfigurationPlatform(solution.GetProjectConfigurationsSection(), - matching.Configuration, matching.Platform); - } + IProject project = (IProject)row.Tag; + + var newConfig = new ConfigurationAndPlatform( + row.Cells[configurationColumn.Index].ToString(), + row.Cells[platformColumn.Index].ToString()); + + project.ConfigurationMapping.SetProjectConfiguration(solutionConfig, newConfig); } } @@ -216,32 +193,31 @@ namespace ICSharpCode.SharpDevelop.Gui if (gridEditingControl.SelectedItem == EditTag.Instance) { DataGridViewComboBoxCell cell = grid.CurrentCell as DataGridViewComboBoxCell; if (cell == null) return; - Solution.ProjectConfigurationPlatformMatching matching = cell.Tag as Solution.ProjectConfigurationPlatformMatching; - if (matching != null) { - inUpdate = true; - using (Form dlg = new EditAvailableConfigurationsDialog(matching.Project, - cell.ColumnIndex != configurationColumn.Index)) - { - dlg.ShowDialog(this); - } - - grid.EndEdit(); - - inUpdate = true; - - // end edit to allow updating the grid - grid.EndEdit(); - - // we need to change the current cell because otherwise UpdateGrid cannot change the - // list of combobox items in this cell - grid.CurrentCell = grid.Rows[cell.RowIndex].Cells[0]; - - // remove cell.Value because otherwise the grid view crashes in UpdateGrid - cell.Value = null; - - UpdateAvailableSolutionConfigurationPlatforms(); - UpdateGrid(); + IProject project = (IProject)cell.OwningRow.Tag; + + inUpdate = true; + using (Form dlg = new EditAvailableConfigurationsDialog(project, + cell.ColumnIndex != configurationColumn.Index)) + { + dlg.ShowDialog(this); } + + grid.EndEdit(); + + inUpdate = true; + + // end edit to allow updating the grid + grid.EndEdit(); + + // we need to change the current cell because otherwise UpdateGrid cannot change the + // list of combobox items in this cell + grid.CurrentCell = grid.Rows[cell.RowIndex].Cells[0]; + + // remove cell.Value because otherwise the grid view crashes in UpdateGrid + cell.Value = null; + + UpdateAvailableSolutionConfigurationPlatforms(); + UpdateGrid(); } } } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/WordCountDialog.cs b/src/Main/Base/Project/Src/Gui/Dialogs/WordCountDialog.cs index 3f167fb70e..a2200ea5ea 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/WordCountDialog.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/WordCountDialog.cs @@ -147,7 +147,7 @@ namespace ICSharpCode.SharpDevelop.Gui UpdateList(0); } - void CountSolution(Solution solution, ref Report all) + void CountSolution(ISolution solution, ref Report all) { foreach (IProject project in solution.Projects) { CountProject(project, ref all); diff --git a/src/Main/Base/Project/Src/Gui/Pads/FileScout.cs b/src/Main/Base/Project/Src/Gui/Pads/FileScout.cs index 1e8fca6c39..3215f231d5 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/FileScout.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/FileScout.cs @@ -398,12 +398,11 @@ namespace ICSharpCode.SharpDevelop.Gui void FileSelected(object sender, EventArgs e) { foreach (FileList.FileListItem item in filelister.SelectedItems) { - IProjectLoader loader = ProjectService.GetProjectLoader(item.FullName); - if (loader != null) { - loader.Load(item.FullName); - } else { - FileService.OpenFile(item.FullName); - } + var fileName = FileName.Create(item.FullName); + if (SD.ProjectService.IsProjectOrSolutionFile(fileName)) + SD.ProjectService.OpenSolutionOrProject(fileName); + else + FileService.OpenFile(fileName); } } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ProjectNodeCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ProjectNodeCommands.cs index ae85b17eba..c1f10b14fc 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ProjectNodeCommands.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ProjectNodeCommands.cs @@ -12,12 +12,12 @@ namespace ICSharpCode.SharpDevelop.Project.Commands { public override void Run() { - Solution solution = ProjectService.OpenSolution; + ISolution solution = ProjectService.OpenSolution; IProject project = ProjectService.CurrentProject; if (solution == null || project == null) return; if (project.IsStartable) { - solution.Preferences.StartupProject = project; + solution.StartupProject = project; } else { MessageService.ShowError("${res:BackendBindings.ExecutionManager.CantExecuteDLLError}"); } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs index 83c4384831..1a57c373ef 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs @@ -21,7 +21,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands if (node != null) { using (NewProjectDialog npdlg = new NewProjectDialog(false)) { npdlg.SolutionFolderNode = solutionFolderNode; - npdlg.InitialProjectLocationDirectory = GetInitialDirectorySuggestion(solutionFolderNode); + npdlg.InitialProjectLocationDirectory = GetInitialDirectorySuggestion(solutionFolderNode.Folder); // show the dialog to request project type and name if (npdlg.ShowDialog(SD.WinForms.MainWin32Window) == DialogResult.OK) { @@ -34,12 +34,12 @@ namespace ICSharpCode.SharpDevelop.Project.Commands } } - internal static string GetInitialDirectorySuggestion(ISolutionFolderNode solutionFolderNode) + internal static string GetInitialDirectorySuggestion(ISolutionFolder solutionFolder) { // Detect the correct folder to place the new project in: int projectCount = 0; string initialDirectory = null; - foreach (ISolutionFolder folderEntry in solutionFolderNode.Container.Folders) { + foreach (ISolutionItem folderEntry in solutionFolder.Items) { IProject project = folderEntry as IProject; if (project != null) { if (projectCount == 0) @@ -56,33 +56,13 @@ namespace ICSharpCode.SharpDevelop.Project.Commands return initialDirectory; } } else { - return solutionFolderNode.Solution.Directory; + return solutionFolder.ParentSolution.Directory; } } } public class AddExistingProjectToSolution : AbstractMenuCommand { - public static void AddProject(ISolutionFolderNode solutionFolderNode, FileName fileName) - { - if (solutionFolderNode == null) - throw new ArgumentNullException("solutionFolderNode"); - ProjectLoadInformation loadInfo = new ProjectLoadInformation(solutionFolderNode.Solution, fileName, Path.GetFileNameWithoutExtension(fileName)); - AddProject(solutionFolderNode, ProjectBindingService.LoadProject(loadInfo)); - } - - public static void AddProject(ISolutionFolderNode solutionFolderNode, IProject newProject) - { - if (solutionFolderNode == null) - throw new ArgumentNullException("solutionFolderNode"); - if (newProject != null) { - newProject.Location = FileUtility.GetRelativePath(solutionFolderNode.Solution.Directory, newProject.FileName); - ProjectService.AddProject(solutionFolderNode, newProject); - NodeBuilders.AddProjectNode((TreeNode)solutionFolderNode, newProject).EnsureVisible(); - solutionFolderNode.Solution.ApplySolutionConfigurationAndPlatformToProjects(); - } - } - public override void Run() { AbstractProjectBrowserTreeNode node = ProjectBrowserPad.Instance.ProjectBrowserControl.SelectedNode; @@ -93,10 +73,10 @@ namespace ICSharpCode.SharpDevelop.Project.Commands fdiag.Filter = ProjectService.GetAllProjectsFilter(this, false); fdiag.Multiselect = true; fdiag.CheckFileExists = true; - fdiag.InitialDirectory = AddNewProjectToSolution.GetInitialDirectorySuggestion(solutionFolderNode); + fdiag.InitialDirectory = AddNewProjectToSolution.GetInitialDirectorySuggestion(solutionFolderNode.Folder); if (fdiag.ShowDialog(SD.WinForms.MainWin32Window) == DialogResult.OK) { foreach (string fileName in fdiag.FileNames) { - AddProject(solutionFolderNode, FileName.Create(fileName)); + solutionFolderNode.Solution.AddExistingProject(FileName.Create(fileName), solutionFolderNode.Folder); } ProjectService.SaveSolution(); } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs index c1e0161aaa..b479b4c83d 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs @@ -100,12 +100,11 @@ namespace ICSharpCode.SharpDevelop.Project string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); foreach (string file in files) { try { - IProjectLoader loader = ProjectService.GetProjectLoader(file); - if (loader != null) { - FileUtility.ObservedLoad(new NamedFileOperationDelegate(loader.Load), file); - } else { - FileService.OpenFile(file); - } + var fileName = FileName.Create(file); + if (SD.ProjectService.IsProjectOrSolutionFile(fileName)) + SD.ProjectService.OpenSolutionOrProject(fileName); + else + FileService.OpenFile(fileName); } catch (Exception ex) { MessageService.ShowException(ex, "unable to open file " + file); } @@ -281,12 +280,12 @@ namespace ICSharpCode.SharpDevelop.Project TreeNode FindDeepestOpenNodeForPath(string fileName) { //LoggingService.DebugFormatted("Finding Deepest for '{0}'", fileName); - Solution solution = ProjectService.OpenSolution; + ISolution solution = ProjectService.OpenSolution; if (solution == null) { return null; } - IProject project = solution.FindProjectContainingFile(FileName.Create(fileName)); + IProject project = SD.ProjectService.FindProjectContainingFile(FileName.Create(fileName)); if (project == null) { //LoggingService.Debug("no IProject found"); return null; @@ -375,17 +374,17 @@ namespace ICSharpCode.SharpDevelop.Project } #endregion - public void ViewSolution(Solution solution) + public void ViewSolution(ISolution solution) { AbstractProjectBrowserTreeNode solutionNode = new SolutionNode(solution); treeView.Clear(); solutionNode.AddTo(treeView); - foreach (object treeObject in solution.Folders) { + foreach (var treeObject in solution.Items) { if (treeObject is IProject) { NodeBuilders.AddProjectNode(solutionNode, (IProject)treeObject); } else { - SolutionFolderNode folderNode = new SolutionFolderNode(solution, (SolutionFolder)treeObject); + SolutionFolderNode folderNode = new SolutionFolderNode(solution, (ISolutionFolder)treeObject); folderNode.InsertSorted(solutionNode); } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPad.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPad.cs index db14aff971..8a87378577 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPad.cs @@ -94,7 +94,7 @@ namespace ICSharpCode.SharpDevelop.Project void ProjectServiceSolutionPreferencesSaving(object sender, SolutionEventArgs e) { - projectBrowserPanel.StoreViewState(e.Solution.Preferences.Properties); + projectBrowserPanel.StoreViewState(e.Solution.Preferences); } void ProjectServiceSolutionLoaded(object sender, SolutionEventArgs e) @@ -102,7 +102,7 @@ namespace ICSharpCode.SharpDevelop.Project this.LoadSolution(e.Solution); } - void LoadSolution(Solution solution) + void LoadSolution(ISolution solution) { if (!ProjectBrowserControl.TreeView.IsHandleCreated) { LoggingService.Debug("ProjectBrowser: Attempt to load solution " + solution.ToString() + " before handle of ProjectBrowserControl.TreeView created"); @@ -116,12 +116,12 @@ namespace ICSharpCode.SharpDevelop.Project LoggingService.Debug("ProjectBrowser: Loading solution " + solution.ToString() + " into project tree view"); this.solutionToLoadWhenHandleIsCreated = null; projectBrowserPanel.ViewSolution(solution); - projectBrowserPanel.ReadViewState(solution.Preferences.Properties); + projectBrowserPanel.ReadViewState(solution.Preferences); } } bool treeViewHandleCreatedAttached; - Solution solutionToLoadWhenHandleIsCreated; + ISolution solutionToLoadWhenHandleIsCreated; void ProjectBrowserTreeViewHandleCreated(object sender, EventArgs e) { @@ -130,7 +130,7 @@ namespace ICSharpCode.SharpDevelop.Project treeView.HandleCreated -= this.ProjectBrowserTreeViewHandleCreated; if (this.solutionToLoadWhenHandleIsCreated != null) { LoggingService.Debug("ProjectBrowser: Tree view handle created, will load " + this.solutionToLoadWhenHandleIsCreated.ToString() + "."); - treeView.BeginInvoke(new Action(this.LoadSolution), this.solutionToLoadWhenHandleIsCreated); + treeView.BeginInvoke(new Action(this.LoadSolution), this.solutionToLoadWhenHandleIsCreated); this.solutionToLoadWhenHandleIsCreated = null; } else { LoggingService.Debug("ProjectBrowser: Tree view handle created, no solution to load."); diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPanel.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPanel.cs index 1c96d1660f..109e46e4fa 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPanel.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPanel.cs @@ -71,7 +71,7 @@ namespace ICSharpCode.SharpDevelop.Project } } - public void ViewSolution(Solution solution) + public void ViewSolution(ISolution solution) { UpdateToolStrip(null); projectBrowserControl.ViewSolution(solution); diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/AbstractProjectBrowserTreeNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/AbstractProjectBrowserTreeNode.cs index db4b671a48..63b26e4527 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/AbstractProjectBrowserTreeNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/AbstractProjectBrowserTreeNode.cs @@ -39,7 +39,7 @@ namespace ICSharpCode.SharpDevelop.Project /// Returns the solution in which this node belongs to. This assumes that /// any node is child of a solution. /// - public virtual Solution Solution { + public virtual ISolution Solution { get { AbstractProjectBrowserTreeNode parent = Parent as AbstractProjectBrowserTreeNode; if (parent != null) { diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs index d677d804ca..783a6661ce 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs @@ -645,7 +645,7 @@ namespace ICSharpCode.SharpDevelop.Project } FileProjectItem newItem = AddExistingItemsToProject.CopyFile(fileName, this, true); - IProject sourceProject = Solution.FindProjectContainingFile(fileName); + IProject sourceProject = ISolution.FindProjectContainingFile(fileName); if (sourceProject != null) { string sourceDirectory = Path.GetDirectoryName(fileName); bool dependendElementsCopied = false; diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs index 12f4bb975f..751c9029db 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs @@ -187,7 +187,7 @@ namespace ICSharpCode.SharpDevelop.Project if (dataObject.GetDataPresent(typeof(FileNode))) { // Dragging a file onto another creates a dependency. // If we are in the same directory, allow moving only. - if (this.Project.ReadOnly) + if (this.Project.IsReadOnly) return DragDropEffects.None; FileNode other = (FileNode)dataObject.GetData(typeof(FileNode)); if (other == this || !(other.ProjectItem is FileProjectItem) || !(this.ProjectItem is FileProjectItem)) diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs index 23e496e46a..3530ddf1c5 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs @@ -50,7 +50,7 @@ namespace ICSharpCode.SharpDevelop.Project this.project = project; Text = project.Name; - if (project.ReadOnly) { + if (project.IsReadOnly) { Text += StringParser.Parse(" (${res:Global.ReadOnly})"); } @@ -166,7 +166,7 @@ namespace ICSharpCode.SharpDevelop.Project public override void Cut() { DoPerformCut = true; - SD.Clipboard.SetDataObject(new DataObject(typeof(ISolutionFolder).ToString(), project.IdGuid)); + SD.Clipboard.SetDataObject(new DataObject(typeof(ISolutionItem).ToString(), project.IdGuid)); } // Paste is inherited from DirectoryNode. diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ReferenceNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ReferenceNode.cs index b9d9cab765..e790b109e9 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ReferenceNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ReferenceNode.cs @@ -31,7 +31,7 @@ namespace ICSharpCode.SharpDevelop.Project #region Cut & Paste public override bool EnableDelete { get { - return !Project.ReadOnly; + return !Project.IsReadOnly; } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionFolderNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionFolderNode.cs index 3986ae6ab8..8e5c9aa4da 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionFolderNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionFolderNode.cs @@ -12,7 +12,7 @@ namespace ICSharpCode.SharpDevelop.Project { public interface ISolutionFolderNode { - Solution Solution { + ISolution Solution { get; } @@ -20,19 +20,15 @@ namespace ICSharpCode.SharpDevelop.Project get; } - ISolutionFolderContainer Container { - get; - } - void AddItem(string fileName); } public class SolutionFolderNode : CustomFolderNode, ISolutionFolderNode { - Solution solution; - SolutionFolder folder; + ISolution solution; + ISolutionFolder folder; - public override Solution Solution { + public override ISolution Solution { get { Debug.Assert(solution != null); return solution; @@ -40,19 +36,12 @@ namespace ICSharpCode.SharpDevelop.Project } public ISolutionFolder Folder { - get { - Debug.Assert(folder != null); - return folder; - } - } - - public ISolutionFolderContainer Container { get { return folder; } } - public SolutionFolderNode(Solution solution, SolutionFolder folder) + public SolutionFolderNode(ISolution solution, ISolutionFolder folder) { sortOrder = 0; canLabelEdit = true; @@ -103,7 +92,7 @@ namespace ICSharpCode.SharpDevelop.Project // add solution items (=files) from project sections. foreach (SolutionItem item in folder.SolutionItems.Items) { - new SolutionItemNode(Solution, item).InsertSorted(this); + new SolutionItemNode(ISolution, item).InsertSorted(this); } base.Initialize(); } @@ -140,7 +129,7 @@ namespace ICSharpCode.SharpDevelop.Project public override void Cut() { DoPerformCut = true; - SD.Clipboard.SetDataObject(new DataObject(typeof(ISolutionFolder).ToString(), folder.IdGuid)); + SD.Clipboard.SetDataObject(new DataObject(typeof(ISolutionItem).ToString(), folder.IdGuid)); } public static bool DoEnablePaste(ISolutionFolderNode container) @@ -153,14 +142,14 @@ namespace ICSharpCode.SharpDevelop.Project if (dataObject == null) { return false; } - if (dataObject.GetDataPresent(typeof(ISolutionFolder).ToString())) { - string guid = dataObject.GetData(typeof(ISolutionFolder).ToString()).ToString(); - ISolutionFolder solutionFolder = container.Solution.GetSolutionFolder(guid); + if (dataObject.GetDataPresent(typeof(ISolutionItem).ToString())) { + string guid = dataObject.GetData(typeof(ISolutionItem).ToString()).ToString(); + ISolutionItem solutionFolder = container.Solution.GetSolutionFolder(guid); if (solutionFolder == null || solutionFolder == container) return false; - if (solutionFolder is ISolutionFolderContainer) { + if (solutionFolder is ISolutionFolder) { return solutionFolder.Parent != container - && !((ISolutionFolderContainer)solutionFolder).IsAncestorOf(container.Folder); + && !((ISolutionFolder)solutionFolder).IsAncestorOf(container.Folder); } else { return solutionFolder.Parent != container; } @@ -178,9 +167,9 @@ namespace ICSharpCode.SharpDevelop.Project ExtTreeNode folderTreeNode = (ExtTreeNode)folderNode; - if (dataObject.GetDataPresent(typeof(ISolutionFolder).ToString())) { - string guid = dataObject.GetData(typeof(ISolutionFolder).ToString()).ToString(); - ISolutionFolder solutionFolder = folderNode.Solution.GetSolutionFolder(guid); + if (dataObject.GetDataPresent(typeof(ISolutionItem).ToString())) { + string guid = dataObject.GetData(typeof(ISolutionItem).ToString()).ToString(); + ISolutionItem solutionFolder = folderNode.Solution.GetSolutionFolder(guid); if (solutionFolder != null) { folderNode.Container.AddFolder(solutionFolder); ExtTreeView treeView = (ExtTreeView)folderTreeNode.TreeView; @@ -223,7 +212,7 @@ namespace ICSharpCode.SharpDevelop.Project if (dataObject.GetDataPresent(typeof(SolutionFolderNode))) { SolutionFolderNode folderNode = (SolutionFolderNode)dataObject.GetData(typeof(SolutionFolderNode)); - if (folderNode.Folder.Parent != this.folder && !folderNode.Container.IsAncestorOf(Folder)) { + if (folderNode.SolutionItem.Parent != this.folder && !folderNode.Folder.IsAncestorOf(SolutionItem)) { return DragDropEffects.Move; } } @@ -261,7 +250,7 @@ namespace ICSharpCode.SharpDevelop.Project folderNode.Remove(); folderNode.InsertSorted(this); folderNode.EnsureVisible(); - this.folder.AddFolder(folderNode.Folder); + this.folder.AddFolder(folderNode.SolutionItem); if (parentNode != null) { parentNode.Refresh(); } @@ -272,7 +261,7 @@ namespace ICSharpCode.SharpDevelop.Project ISolutionFolderNode folderNode = (ISolutionFolderNode)solutionItemNode.Parent; folderNode.Container.SolutionItems.Items.Remove(solutionItemNode.SolutionItem); - Container.SolutionItems.Items.Add(solutionItemNode.SolutionItem); + Folder.SolutionItems.Items.Add(solutionItemNode.SolutionItem); solutionItemNode.Remove(); solutionItemNode.InsertSorted(this); diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs index e4dacfb91a..2918c2e9ba 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs @@ -11,10 +11,10 @@ namespace ICSharpCode.SharpDevelop.Project { public class SolutionItemNode : CustomFolderNode { - Solution solution; - SolutionItem item; + ISolution solution; + ISolutionItem item; - public SolutionItem SolutionItem { + public ISolutionItem SolutionItem { get { return item; } @@ -26,14 +26,14 @@ namespace ICSharpCode.SharpDevelop.Project } } - public SolutionItemNode(Solution solution, SolutionItem item) + public SolutionItemNode(ISolutionItem item) { sortOrder = 2; canLabelEdit = true; ContextmenuAddinTreePath = "/SharpDevelop/Pads/ProjectBrowser/ContextMenu/SolutionItemNode"; - this.solution = solution; + this.solution = item.ParentSolution; this.item = item; this.Text = Path.GetFileName(FileName); SetIcon(IconService.GetImageForFile(FileName)); diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionNode.cs index f25ad4c5d6..feb4506399 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionNode.cs @@ -11,25 +11,21 @@ namespace ICSharpCode.SharpDevelop.Project { public class SolutionNode : AbstractProjectBrowserTreeNode, ISolutionFolderNode { - Solution solution; - public ISolutionFolder Folder { - get { - return solution; - } - } + ISolution solution; - public override Solution Solution { + ISolutionFolder ISolutionFolderNode.Folder { get { return solution; } } - public ISolutionFolderContainer Container { + + public override ISolution Solution { get { return solution; } } - public SolutionNode(Solution solution) + public SolutionNode(ISolution solution) { sortOrder = -1; this.solution = solution; @@ -55,11 +51,6 @@ namespace ICSharpCode.SharpDevelop.Project return; if (!FileService.CheckFileName(newName)) return; - string newFileName = Path.Combine(solution.Directory, newName + ".sln"); - if (!FileService.RenameFile(solution.FileName, newFileName, false)) { - return; - } - solution.FileName = newFileName; solution.Name = newName; } finally { UpdateText(); @@ -69,7 +60,7 @@ namespace ICSharpCode.SharpDevelop.Project void UpdateText() { Text = ResourceService.GetString("ICSharpCode.SharpDevelop.Commands.ProjectBrowser.SolutionNodeText") + " " + solution.Name; - if (Solution.ReadOnly) { + if (solution.ReadOnly) { Text += StringParser.Parse(" (${res:Global.ReadOnly})"); } } @@ -80,7 +71,7 @@ namespace ICSharpCode.SharpDevelop.Project SolutionFolderNode node = null; foreach (TreeNode n in Nodes) { node = n as SolutionFolderNode; - if (node != null && node.Folder.Name == folderName) { + if (node != null && node.SolutionItem.Name == folderName) { break; } node = null; @@ -102,7 +93,7 @@ namespace ICSharpCode.SharpDevelop.Project if (dataObject.GetDataPresent(typeof(SolutionFolderNode))) { SolutionFolderNode folderNode = (SolutionFolderNode)dataObject.GetData(typeof(SolutionFolderNode)); - if (folderNode.Folder.Parent != solution) { + if (folderNode.SolutionItem.Parent != solution) { return DragDropEffects.All; } } @@ -129,7 +120,7 @@ namespace ICSharpCode.SharpDevelop.Project folderNode.Remove(); folderNode.InsertSorted(this); - this.solution.AddFolder(folderNode.Folder); + this.solution.AddFolder(folderNode.SolutionItem); } if (dataObject.GetDataPresent(typeof(ProjectNode))) { ProjectNode projectNode = (ProjectNode)dataObject.GetData(typeof(ProjectNode)); diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/Util/SolutionFolderRemoveVisitor.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/Util/SolutionFolderRemoveVisitor.cs index 564eb82f77..d857b42c79 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/Util/SolutionFolderRemoveVisitor.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/Util/SolutionFolderRemoveVisitor.cs @@ -8,16 +8,16 @@ namespace ICSharpCode.SharpDevelop.Project { public class SolutionFolderRemoveVisitor : ProjectBrowserTreeNodeVisitor { - ISolutionFolder folder; + ISolutionItem folder; - public SolutionFolderRemoveVisitor(ISolutionFolder folder) + public SolutionFolderRemoveVisitor(ISolutionItem folder) { this.folder = folder; } public override object Visit(SolutionFolderNode solutionFolderNode, object data) { - if (folder == solutionFolderNode.Folder) { + if (folder == solutionFolderNode.SolutionItem) { ExtTreeNode parent = solutionFolderNode.Parent as ExtTreeNode; solutionFolderNode.Remove(); if (parent != null) { diff --git a/src/Main/Base/Project/Src/Internal/ConditionEvaluators/WriteableProjectEvaluator.cs b/src/Main/Base/Project/Src/Internal/ConditionEvaluators/WriteableProjectEvaluator.cs index 96bc77aacd..aa5578505a 100644 --- a/src/Main/Base/Project/Src/Internal/ConditionEvaluators/WriteableProjectEvaluator.cs +++ b/src/Main/Base/Project/Src/Internal/ConditionEvaluators/WriteableProjectEvaluator.cs @@ -18,7 +18,7 @@ namespace ICSharpCode.SharpDevelop if (caller is ISolutionFolderNode) return ProjectService.OpenSolution != null && !ProjectService.OpenSolution.ReadOnly; IProject project = (caller as IProject) ?? ProjectService.CurrentProject; - return project != null && !project.ReadOnly; + return project != null && !project.IsReadOnly; } } } diff --git a/src/Main/Base/Project/Src/Internal/ConditionEvaluators/WriteableSolutionEvaluator.cs b/src/Main/Base/Project/Src/Internal/ConditionEvaluators/WriteableSolutionEvaluator.cs index 63dbd4f23a..b9064730c1 100644 --- a/src/Main/Base/Project/Src/Internal/ConditionEvaluators/WriteableSolutionEvaluator.cs +++ b/src/Main/Base/Project/Src/Internal/ConditionEvaluators/WriteableSolutionEvaluator.cs @@ -14,7 +14,7 @@ namespace ICSharpCode.SharpDevelop { public bool IsValid(object caller, Condition condition) { - Solution solution = ProjectService.OpenSolution; + ISolution solution = ProjectService.OpenSolution; return (solution != null && !solution.ReadOnly); } } diff --git a/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectCreateInformation.cs b/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectCreateInformation.cs index 853339116e..f25a36e8d5 100644 --- a/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectCreateInformation.cs +++ b/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectCreateInformation.cs @@ -44,7 +44,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates public string SolutionPath { get; set; } public string ProjectBasePath { get; set; } public TargetFramework TargetFramework { get; set; } - public Solution Solution { get; set; } + public ISolution Solution { get; set; } /// /// Whether to initialize the type system for the newly created project. diff --git a/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs b/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs index ff119aa827..4e490dc74a 100644 --- a/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs +++ b/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs @@ -301,6 +301,8 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates public string CreateProject(ProjectCreateInformation projectCreateInformation) { + throw new NotImplementedException(); + /* LoggingService.Info("Creating project from template '" + this.Category + "/" + this.Subcategory + "/" + this.Name + "'"); if (solutionDescriptor != null) { return solutionDescriptor.CreateSolution(projectCreateInformation, this.languagename); @@ -331,7 +333,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates } } else { return null; - } + }*/ } public void RunOpenActions(ProjectCreateInformation projectCreateInformation) diff --git a/src/Main/Base/Project/Src/Internal/Templates/Project/SolutionDescriptor.cs b/src/Main/Base/Project/Src/Internal/Templates/Project/SolutionDescriptor.cs index 187c9f0e71..81d7ee4baf 100644 --- a/src/Main/Base/Project/Src/Internal/Templates/Project/SolutionDescriptor.cs +++ b/src/Main/Base/Project/Src/Internal/Templates/Project/SolutionDescriptor.cs @@ -36,7 +36,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates } } - internal bool AddContents(Solution solution, ProjectCreateInformation projectCreateInformation, string defaultLanguage, ISolutionFolderContainer parentFolder) + internal bool AddContents(ISolution solution, ProjectCreateInformation projectCreateInformation, string defaultLanguage, ISolutionFolder parentFolder) { // Create sub projects foreach (SolutionFolderDescriptor folderDescriptor in solutionFoldersDescriptors) { @@ -110,7 +110,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates string solutionLocation = Path.Combine(projectCreateInformation.SolutionPath, newSolutionName + ".sln"); - Solution newSolution = new Solution(new ProjectChangeWatcher(solutionLocation)); + ISolution newSolution = new Solution(new ProjectChangeWatcher(solutionLocation)); projectCreateInformation.Solution = newSolution; newSolution.Name = newSolutionName; diff --git a/src/Main/Base/Project/Src/Project/AbstractProject.cs b/src/Main/Base/Project/Src/Project/AbstractProject.cs index d474f1f45e..333b0dcebf 100644 --- a/src/Main/Base/Project/Src/Project/AbstractProject.cs +++ b/src/Main/Base/Project/Src/Project/AbstractProject.cs @@ -27,7 +27,7 @@ namespace ICSharpCode.SharpDevelop.Project /// /// Default implementation of the IProject interface. /// - public abstract class AbstractProject : AbstractSolutionFolder, IProject + public abstract class AbstractProject : IProject { // Member documentation: see IProject members. @@ -132,7 +132,7 @@ namespace ICSharpCode.SharpDevelop.Project /// True if the file that contains the project is readonly. /// [ReadOnly(true)] - public virtual bool ReadOnly { + public virtual bool IsReadOnly { get { try { FileAttributes attributes = File.GetAttributes(FileName); @@ -183,12 +183,11 @@ namespace ICSharpCode.SharpDevelop.Project #endregion #region Configuration / Platform management - string activeConfiguration = "Debug"; - string activePlatform = "AnyCPU"; + ConfigurationAndPlatform activeConfiguration = new ConfigurationAndPlatform("Debug", "AnyCPU"); [ReadOnly(true)] [LocalizedProperty("${res:Dialog.Options.CombineOptions.Configurations.ConfigurationColumnHeader}")] - public string ActiveConfiguration { + public ConfigurationAndPlatform ActiveConfiguration { get { return activeConfiguration; } set { SD.MainThread.VerifyAccess(); @@ -212,43 +211,23 @@ namespace ICSharpCode.SharpDevelop.Project } } - [ReadOnly(true)] - [LocalizedProperty("${res:Dialog.ProjectOptions.Platform}")] - public string ActivePlatform { - get { return activePlatform; } - set { - SD.MainThread.VerifyAccess(); - if (value == null) - throw new ArgumentNullException(); - - if (activePlatform != value) { - activePlatform = value; - - OnActivePlatformChanged(EventArgs.Empty); - } - } - } - - public event EventHandler ActivePlatformChanged; - - protected virtual void OnActivePlatformChanged(EventArgs e) - { - if (ActivePlatformChanged != null) { - ActivePlatformChanged(this, e); + public virtual IConfigurationOrPlatformNameCollection ConfigurationNames { + get { + throw new NotImplementedException(); + //return new string[] { "Debug", "Release" }; } } - [Browsable(false)] - public virtual IReadOnlyCollection ConfigurationNames { + public virtual IConfigurationOrPlatformNameCollection PlatformNames { get { - return new string[] { "Debug", "Release" }; + throw new NotImplementedException(); + //return new string[] { "AnyCPU" }; } } - [Browsable(false)] - public virtual IReadOnlyCollection PlatformNames { + public virtual IConfigurationMapping ConfigurationMapping { get { - return new string[] { "AnyCPU" }; + throw new NotImplementedException(); } } #endregion @@ -478,8 +457,8 @@ namespace ICSharpCode.SharpDevelop.Project } [Browsable(false)] - public virtual int MinimumSolutionVersion { - get { return Solution.SolutionVersionVS2005; } + public virtual SolutionFormatVersion MinimumSolutionVersion { + get { return SolutionFormatVersion.VS2005; } } /// @@ -687,5 +666,55 @@ namespace ICSharpCode.SharpDevelop.Project return EmptyTypeDefinitionModelCollection.Instance; } } + + [Browsable(false)] + public virtual string TypeGuid { + get { + throw new NotImplementedException(); + } + set { + throw new NotImplementedException(); + } + } + + [Browsable(false)] + public virtual string IdGuid { + get { + throw new NotImplementedException(); + } + set { + throw new NotImplementedException(); + } + } + + public string Name { + get { + throw new NotImplementedException(); + } + set { + throw new NotImplementedException(); + } + } + + public ISolutionFolder ParentFolder { + get { + throw new NotImplementedException(); + } + set { + throw new NotImplementedException(); + } + } + + public ISolution ParentSolution { + get { + throw new NotImplementedException(); + } + } + + public object SyncRoot { + get { + throw new NotImplementedException(); + } + } } } diff --git a/src/Main/Base/Project/Src/Project/Behaviors/DotNetStartBehavior.cs b/src/Main/Base/Project/Src/Project/Behaviors/DotNetStartBehavior.cs index 119b327b7f..79acce9b36 100644 --- a/src/Main/Base/Project/Src/Project/Behaviors/DotNetStartBehavior.cs +++ b/src/Main/Base/Project/Src/Project/Behaviors/DotNetStartBehavior.cs @@ -136,12 +136,12 @@ namespace ICSharpCode.SharpDevelop.Project public override CompilerVersion CurrentCompilerVersion { get { switch (Project.MinimumSolutionVersion) { - case Solution.SolutionVersionVS2005: + case ISolution.SolutionVersionVS2005: return CompilerVersion.MSBuild20; - case Solution.SolutionVersionVS2008: + case ISolution.SolutionVersionVS2008: return CompilerVersion.MSBuild35; - case Solution.SolutionVersionVS2010: - case Solution.SolutionVersionVS2012: + case ISolution.SolutionVersionVS2010: + case ISolution.SolutionVersionVS2012: return CompilerVersion.MSBuild40; default: throw new NotSupportedException(); @@ -184,7 +184,7 @@ namespace ICSharpCode.SharpDevelop.Project public override void UpgradeProject(CompilerVersion newVersion, TargetFramework newFramework) { - if (!Project.ReadOnly) { + if (!Project.IsReadOnly) { lock (Project.SyncRoot) { TargetFramework oldFramework = Project.CurrentTargetFramework; if (newVersion != null && GetAvailableCompilerVersions().Contains(newVersion)) { diff --git a/src/Main/Base/Project/Src/Project/CompilableProject.cs b/src/Main/Base/Project/Src/Project/CompilableProject.cs index 43c983017b..c801be3a52 100644 --- a/src/Main/Base/Project/Src/Project/CompilableProject.cs +++ b/src/Main/Base/Project/Src/Project/CompilableProject.cs @@ -119,7 +119,7 @@ namespace ICSharpCode.SharpDevelop.Project if (string.IsNullOrEmpty(outputPath)) { outputPath = "obj"; } - outputPath = Path.Combine(outputPath, this.ActiveConfiguration); + outputPath = Path.Combine(outputPath, this.ActiveConfiguration.Configuration); } return Path.Combine(Directory, outputPath); } @@ -211,14 +211,6 @@ namespace ICSharpCode.SharpDevelop.Project } } - protected override void OnActivePlatformChanged(EventArgs e) - { - base.OnActivePlatformChanged(e); - if (!isLoading) { - Reparse(true, true); - } - } - protected override void OnPropertyChanged(ProjectPropertyChangedEventArgs e) { base.OnPropertyChanged(e); @@ -290,7 +282,7 @@ namespace ICSharpCode.SharpDevelop.Project [Browsable(false)] public virtual bool UpgradeDesired { get { - return MinimumSolutionVersion < Solution.SolutionVersionVS2010; + return MinimumSolutionVersion < ISolution.SolutionVersionVS2010; } } @@ -314,7 +306,7 @@ namespace ICSharpCode.SharpDevelop.Project public virtual void UpgradeProject(CompilerVersion newVersion, TargetFramework newFramework) { - if (!ReadOnly) + if (!IsReadOnly) GetOrCreateBehavior().UpgradeProject(newVersion, newFramework); } diff --git a/src/Main/Base/Project/Src/Project/ConfigurationGuiHelper.cs b/src/Main/Base/Project/Src/Project/ConfigurationGuiHelper.cs index 59e9808f85..03d9bf01f4 100644 --- a/src/Main/Base/Project/Src/Project/ConfigurationGuiHelper.cs +++ b/src/Main/Base/Project/Src/Project/ConfigurationGuiHelper.cs @@ -48,8 +48,8 @@ namespace ICSharpCode.SharpDevelop.Project { this.project = project; this.controlDictionary = controlDictionary; - this.configuration = project.ActiveConfiguration; - this.platform = project.ActivePlatform; + this.configuration = project.ActiveConfiguration.Configuration; + this.platform = project.ActiveConfiguration.Platform; } public MSBuildBasedProject Project { diff --git a/src/Main/Base/Project/Src/Project/Converter/LanguageConverter.cs b/src/Main/Base/Project/Src/Project/Converter/LanguageConverter.cs index 5d8977353f..64666a6274 100644 --- a/src/Main/Base/Project/Src/Project/Converter/LanguageConverter.cs +++ b/src/Main/Base/Project/Src/Project/Converter/LanguageConverter.cs @@ -198,7 +198,8 @@ namespace ICSharpCode.SharpDevelop.Project.Converter } while (node != null) { if (node is ISolutionFolderNode) { - AddExistingProjectToSolution.AddProject((ISolutionFolderNode)node, targetProject.FileName); + var solutionFolderNode = (ISolutionFolderNode)node; + solutionFolderNode.Solution.AddExistingProject(targetProject.FileName, solutionFolderNode.Folder); ProjectService.SaveSolution(); break; } diff --git a/src/Main/Base/Project/Src/Project/Converter/UpgradeView.xaml.cs b/src/Main/Base/Project/Src/Project/Converter/UpgradeView.xaml.cs index 63e48f2852..db6a3c4675 100644 --- a/src/Main/Base/Project/Src/Project/Converter/UpgradeView.xaml.cs +++ b/src/Main/Base/Project/Src/Project/Converter/UpgradeView.xaml.cs @@ -16,10 +16,10 @@ namespace ICSharpCode.SharpDevelop.Project.Converter /// internal partial class UpgradeView : UserControl { - readonly Solution solution; + readonly ISolution solution; readonly List entries; - public UpgradeView(Solution solution) + public UpgradeView(ISolution solution) { if (solution == null) throw new ArgumentNullException("solution"); @@ -38,7 +38,7 @@ namespace ICSharpCode.SharpDevelop.Project.Converter set { upgradeDescription.Visibility = value ? Visibility.Visible : Visibility.Collapsed; } } - public Solution Solution { + public ISolution Solution { get { return solution; } } diff --git a/src/Main/Base/Project/Src/Project/Converter/UpgradeViewContent.cs b/src/Main/Base/Project/Src/Project/Converter/UpgradeViewContent.cs index a2acd2758b..5e8a77ee6c 100644 --- a/src/Main/Base/Project/Src/Project/Converter/UpgradeViewContent.cs +++ b/src/Main/Base/Project/Src/Project/Converter/UpgradeViewContent.cs @@ -14,7 +14,7 @@ namespace ICSharpCode.SharpDevelop.Project.Converter /// public class UpgradeViewContent : AbstractViewContent { - public static void ShowIfRequired(Solution solution) + public static void ShowIfRequired(ISolution solution) { var projects = solution.Projects.OfType().ToList(); if (projects.Count > 0 && projects.All(u => u.UpgradeDesired)) { @@ -23,7 +23,7 @@ namespace ICSharpCode.SharpDevelop.Project.Converter } } - public static UpgradeViewContent Show(Solution solution) + public static UpgradeViewContent Show(ISolution solution) { foreach (UpgradeViewContent vc in SD.Workbench.ViewContentCollection.OfType()) { if (vc.Solution == solution) { @@ -38,7 +38,7 @@ namespace ICSharpCode.SharpDevelop.Project.Converter UpgradeView upgradeView; - public UpgradeViewContent(Solution solution) + public UpgradeViewContent(ISolution solution) { if (solution == null) throw new ArgumentNullException("solution"); @@ -46,7 +46,7 @@ namespace ICSharpCode.SharpDevelop.Project.Converter upgradeView = new UpgradeView(solution); } - public Solution Solution { + public ISolution Solution { get { return upgradeView.Solution; } } diff --git a/src/Main/Base/Project/Src/Project/CustomTool.cs b/src/Main/Base/Project/Src/Project/CustomTool.cs index 0821fe1bb1..ce1bab4f7b 100644 --- a/src/Main/Base/Project/Src/Project/CustomTool.cs +++ b/src/Main/Base/Project/Src/Project/CustomTool.cs @@ -360,7 +360,7 @@ namespace ICSharpCode.SharpDevelop.Project static void OnFileSaved(object sender, FileNameEventArgs e) { - Solution solution = ProjectService.OpenSolution; + ISolution solution = ProjectService.OpenSolution; if (solution == null) return; IProject project = solution.FindProjectContainingFile(e.FileName); if (project == null) return; diff --git a/src/Main/Base/Project/Src/Project/IProject.cs b/src/Main/Base/Project/Src/Project/IProject.cs index 03ba849777..781bff54dd 100644 --- a/src/Main/Base/Project/Src/Project/IProject.cs +++ b/src/Main/Base/Project/Src/Project/IProject.cs @@ -26,7 +26,7 @@ namespace ICSharpCode.SharpDevelop.Project /// When you implement IProject, you should also implement IProjectItemListProvider and IProjectAllowChangeConfigurations /// public interface IProject - : IBuildable, ISolutionFolder, IDisposable, IMementoCapable + : IBuildable, ISolutionItem, IDisposable, IMementoCapable, IConfigurable { /// /// Gets the list of items in the project. This member is thread-safe. @@ -108,7 +108,7 @@ namespace ICSharpCode.SharpDevelop.Project /// /// This member is thread-safe. /// - bool ReadOnly { + bool IsReadOnly { get; } @@ -156,42 +156,10 @@ namespace ICSharpCode.SharpDevelop.Project } #endregion - #region Configuration / Platform management /// - /// Gets/Sets the active configuration. + /// Gets the configuration mapping. /// - string ActiveConfiguration { - get; - set; - } - - /// - /// Gets/Sets the active platform. - /// - string ActivePlatform { - get; - set; - } - /// - /// Gets the list of available configuration names. - /// - IReadOnlyCollection ConfigurationNames { get; } - - /// - /// Gets the list of available platform names. - /// - IReadOnlyCollection PlatformNames { get; } - - /// - /// Is raised after the ActiveConfiguration property has changed. - /// - event EventHandler ActiveConfigurationChanged; - - /// - /// Is raised after the ActivePlatform property has changed. - /// - event EventHandler ActivePlatformChanged; - #endregion + IConfigurationMapping ConfigurationMapping { get; } /// /// Saves the project using its current file name. @@ -238,7 +206,7 @@ namespace ICSharpCode.SharpDevelop.Project /// /// Gets the minimum version the solution must have to support this project type. /// - int MinimumSolutionVersion { get; } + SolutionFormatVersion MinimumSolutionVersion { get; } /// /// Resolves assembly references for this project. @@ -335,12 +303,6 @@ namespace ICSharpCode.SharpDevelop.Project /// Never returns null, but may return a permanently empty collection if this project does not support such models. /// ITypeDefinitionModelCollection TypeDefinitionModels { get; } - - /// - /// Gets the parent solution. - /// This property is thread-safe. - /// - Solution ParentSolution { get; } } /// @@ -369,19 +331,4 @@ namespace ICSharpCode.SharpDevelop.Project /// bool RemoveProjectItem(ProjectItem item); } - - /// - /// Interface for changing project or solution configuration. - /// IProject implementors should implement this interface, but only the SharpDevelop methods - /// Solution.RenameProjectPlatform etc. may call the interface members. - /// - public interface IProjectAllowChangeConfigurations - { - bool RenameProjectConfiguration(string oldName, string newName); - bool RenameProjectPlatform(string oldName, string newName); - bool AddProjectConfiguration(string newName, string copyFrom); - bool AddProjectPlatform(string newName, string copyFrom); - bool RemoveProjectConfiguration(string name); - bool RemoveProjectPlatform(string name); - } } diff --git a/src/Main/Base/Project/Src/Project/Items/ProjectItem.cs b/src/Main/Base/Project/Src/Project/Items/ProjectItem.cs index d8e2fa123d..f21002dbdb 100644 --- a/src/Main/Base/Project/Src/Project/Items/ProjectItem.cs +++ b/src/Main/Base/Project/Src/Project/Items/ProjectItem.cs @@ -462,9 +462,9 @@ namespace ICSharpCode.SharpDevelop.Project } } - public override void InformSetValue(PropertyDescriptor propertyDescriptor, object component, object value) + protected internal override void InformSetValue(PropertyDescriptor propertyDescriptor, object value) { - base.InformSetValue(propertyDescriptor, component, value); + base.InformSetValue(propertyDescriptor, value); if (project != null) { project.Save(); } diff --git a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs index 02c897ed1e..6a5e60ecad 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs @@ -32,7 +32,7 @@ namespace ICSharpCode.SharpDevelop.Project /// require locking on the SyncRoot. Methods that return underlying MSBuild objects require that /// the caller locks on the SyncRoot. /// - public class MSBuildBasedProject : AbstractProject, IProjectItemListProvider, IProjectAllowChangeConfigurations + public class MSBuildBasedProject : AbstractProject, IProjectItemListProvider { /// /// The project collection that contains this project. @@ -98,7 +98,7 @@ namespace ICSharpCode.SharpDevelop.Project } } - public override int MinimumSolutionVersion { + public override SolutionFormatVersion MinimumSolutionVersion { get { lock (SyncRoot) { // This property is called by CSharpProject.StartBuild (and other derived StartBuild methods), @@ -107,11 +107,11 @@ namespace ICSharpCode.SharpDevelop.Project if (projectFile == null) throw new ObjectDisposedException("MSBuildBasedProject"); if (string.IsNullOrEmpty(projectFile.ToolsVersion) || projectFile.ToolsVersion == "2.0") { - return Solution.SolutionVersionVS2005; + return SolutionFormatVersion.VS2005; } else if (projectFile.ToolsVersion == "3.0" || projectFile.ToolsVersion == "3.5") { - return Solution.SolutionVersionVS2008; + return SolutionFormatVersion.VS2008; } else { - return Solution.SolutionVersionVS2010; + return SolutionFormatVersion.VS2010; } } } @@ -388,11 +388,11 @@ namespace ICSharpCode.SharpDevelop.Project throw new ObjectDisposedException("MSBuildBasedProject"); if (configuration == null) - configuration = this.ActiveConfiguration; + configuration = this.ActiveConfiguration.Configuration; if (platform == null) - platform = this.ActivePlatform; + platform = this.ActiveConfiguration.Platform; - bool openCurrentConfiguration = configuration == this.ActiveConfiguration && platform == this.ActivePlatform; + bool openCurrentConfiguration = configuration == this.ActiveConfiguration.Configuration && platform == this.ActiveConfiguration.Platform; if (currentlyOpenProject != null && openCurrentConfiguration) { // use currently open project @@ -1126,9 +1126,9 @@ namespace ICSharpCode.SharpDevelop.Project public override ProjectBuildOptions CreateProjectBuildOptions(BuildOptions options, bool isRootBuildable) { ProjectBuildOptions projectOptions = base.CreateProjectBuildOptions(options, isRootBuildable); - Solution solution = this.ParentSolution; - string solutionConfiguration = options.SolutionConfiguration ?? solution.Preferences.ActiveConfiguration; - string solutionPlatform = options.SolutionPlatform ?? solution.Preferences.ActivePlatform; + ISolution solution = this.ParentSolution; + string solutionConfiguration = options.SolutionConfiguration ?? solution.ActiveConfiguration.Configuration; + string solutionPlatform = options.SolutionPlatform ?? solution.ActiveConfiguration.Platform; var configMatchings = solution.GetActiveConfigurationsAndPlatformsForProjects(solutionConfiguration, solutionPlatform); // Find the project configuration, and build an XML string containing all configurations from the solution @@ -1244,7 +1244,7 @@ namespace ICSharpCode.SharpDevelop.Project void LoadProjectInternal(ProjectLoadInformation loadInformation) { - this.projectCollection = loadInformation.ParentSolution.MSBuildProjectCollection; + this.projectCollection = loadInformation.MSBuildProjectCollection; this.FileName = loadInformation.FileName; if (loadInformation.Configuration != null) this.ActiveConfiguration = loadInformation.Configuration; @@ -1322,23 +1322,12 @@ namespace ICSharpCode.SharpDevelop.Project } base.OnActiveConfigurationChanged(e); } - - protected override void OnActivePlatformChanged(EventArgs e) - { - if (!isLoading) { - lock (SyncRoot) { - UnloadCurrentlyOpenProject(); - CreateItemsListFromMSBuild(); - } - } - base.OnActivePlatformChanged(e); - } #endregion #region GetConfigurationNames / GetPlatformNames IReadOnlyCollection configurationNames, platformNames; - public override IReadOnlyCollection ConfigurationNames { + /*public override IReadOnlyCollection ConfigurationNames { get { lock (SyncRoot) { if (configurationNames == null) { @@ -1359,7 +1348,7 @@ namespace ICSharpCode.SharpDevelop.Project } } } - + */ protected void InvalidateConfigurationPlatformNames() { lock (SyncRoot) { @@ -1421,6 +1410,7 @@ namespace ICSharpCode.SharpDevelop.Project #endregion #region IProjectAllowChangeConfigurations interface implementation + /* bool IProjectAllowChangeConfigurations.RenameProjectConfiguration(string oldName, string newName) { lock (SyncRoot) { @@ -1610,6 +1600,7 @@ namespace ICSharpCode.SharpDevelop.Project return true; } } + */ #endregion #region ProjectExtensions diff --git a/src/Main/Base/Project/Src/Project/MSBuildEngine/MSBuildEngine.cs b/src/Main/Base/Project/Src/Project/MSBuildEngine/MSBuildEngine.cs index d74b10f692..390a7c3424 100755 --- a/src/Main/Base/Project/Src/Project/MSBuildEngine/MSBuildEngine.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildEngine/MSBuildEngine.cs @@ -104,14 +104,14 @@ namespace ICSharpCode.SharpDevelop.Project MSBuildEngine engine = new MSBuildEngine(project, options, feedbackSink); engine.additionalTargetFiles = additionalTargetFiles.ToList(); - if (project.MinimumSolutionVersion >= Solution.SolutionVersionVS2010) { + if (project.MinimumSolutionVersion >= SolutionFormatVersion.VS2010) { engine.additionalTargetFiles.Add(Path.Combine(Path.GetDirectoryName(typeof(MSBuildEngine).Assembly.Location), "SharpDevelop.TargetingPack.targets")); } return engine.RunBuildAsync(cancellationToken); } readonly string projectFileName; - readonly int projectMinimumSolutionVersion; + readonly SolutionFormatVersion projectMinimumSolutionVersion; ProjectBuildOptions options; IBuildFeedbackSink feedbackSink; List additionalTargetFiles; @@ -174,7 +174,7 @@ namespace ICSharpCode.SharpDevelop.Project /// /// Gets the minimum solution version (VS version) required to open the project. /// - public int ProjectMinimumSolutionVersion { + public SolutionFormatVersion ProjectMinimumSolutionVersion { get { return projectMinimumSolutionVersion; } } @@ -267,7 +267,7 @@ namespace ICSharpCode.SharpDevelop.Project } tcs = new TaskCompletionSource(); - if (projectMinimumSolutionVersion <= Solution.SolutionVersionVS2008) { + if (projectMinimumSolutionVersion <= ISolution.SolutionVersionVS2008) { if (DotnetDetection.IsDotnet35SP1Installed()) { BuildWorkerManager.MSBuild35.RunBuildJob(job, loggerChain, OnDone, cancellationToken); } else { @@ -319,7 +319,7 @@ namespace ICSharpCode.SharpDevelop.Project // 'MsTestToolsTargets' is preferred because it's at the end of the MSBuild 3.5 and 4.0 target file, // but on MSBuild 2.0 we need to fall back to 'CodeAnalysisTargets'. string hijackedProperty = "MsTestToolsTargets"; - if (projectMinimumSolutionVersion == Solution.SolutionVersionVS2005) + if (projectMinimumSolutionVersion == ISolution.SolutionVersionVS2005) hijackedProperty = "CodeAnalysisTargets"; // because we'll replace the hijackedProperty, manually write the corresponding include diff --git a/src/Main/Base/Project/Src/Project/MSBuildEngine/TargetingPackWarningWorkaround.cs b/src/Main/Base/Project/Src/Project/MSBuildEngine/TargetingPackWarningWorkaround.cs index 44cc141bc1..2b8626d850 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildEngine/TargetingPackWarningWorkaround.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildEngine/TargetingPackWarningWorkaround.cs @@ -22,7 +22,7 @@ namespace ICSharpCode.SharpDevelop.Project public IMSBuildChainedLoggerFilter CreateFilter(MSBuildEngine engine, IMSBuildChainedLoggerFilter nextFilter) { - if (engine.ProjectMinimumSolutionVersion >= Solution.SolutionVersionVS2010) { + if (engine.ProjectMinimumSolutionVersion >= ISolution.SolutionVersionVS2010) { return new TargetingPackWarningWorkaroundChainEntry(nextFilter); } else { return nextFilter; diff --git a/src/Main/Base/Project/Src/Project/MSBuildInternals.cs b/src/Main/Base/Project/Src/Project/MSBuildInternals.cs index b3a82cc814..75255d2330 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildInternals.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildInternals.cs @@ -127,36 +127,6 @@ namespace ICSharpCode.SharpDevelop.Project return location; } - readonly static Regex configurationRegEx = new Regex(@"'(?[^']*)'\s*==\s*'(?[^']*)'", RegexOptions.Compiled); - - internal static void GetConfigurationAndPlatformFromCondition(string condition, - out string configuration, - out string platform) - { - Match match = configurationRegEx.Match(condition); - if (match.Success) { - string conditionProperty = match.Result("${property}"); - string conditionValue = match.Result("${value}"); - if (conditionProperty == "$(Configuration)|$(Platform)") { - // configuration is ok - configuration = MSBuildBasedProject.GetConfigurationNameFromKey(conditionValue); - platform = MSBuildBasedProject.GetPlatformNameFromKey(conditionValue); - } else if (conditionProperty == "$(Configuration)") { - configuration = conditionValue; - platform = null; - } else if (conditionProperty == "$(Platform)") { - configuration = null; - platform = conditionValue; - } else { - configuration = null; - platform = null; - } - } else { - configuration = null; - platform = null; - } - } - /// /// Resolves the location of the reference files. /// @@ -204,7 +174,7 @@ namespace ICSharpCode.SharpDevelop.Project } List targets = new List(); - if (baseProject.MinimumSolutionVersion >= Solution.SolutionVersionVS2010) { + if (baseProject.MinimumSolutionVersion >= ISolution.SolutionVersionVS2010) { targets.Add("ResolveReferences"); targets.Add("DesignTimeResolveAssemblyReferences"); } else { diff --git a/src/Main/Base/Project/Src/Project/MissingProject.cs b/src/Main/Base/Project/Src/Project/MissingProject.cs index 089b219a6b..8d4906a955 100644 --- a/src/Main/Base/Project/Src/Project/MissingProject.cs +++ b/src/Main/Base/Project/Src/Project/MissingProject.cs @@ -15,7 +15,7 @@ namespace ICSharpCode.SharpDevelop.Project TypeGuid = "{00000000-0000-0000-0000-000000000000}"; } - public override bool ReadOnly { + public override bool IsReadOnly { get { // don't get the readonly flag from the project file - the project file does not exist. return true; diff --git a/src/Main/Base/Project/Src/Project/ProjectLoadInformation.cs b/src/Main/Base/Project/Src/Project/ProjectLoadInformation.cs index 2790352fc5..eddf3c69f4 100644 --- a/src/Main/Base/Project/Src/Project/ProjectLoadInformation.cs +++ b/src/Main/Base/Project/Src/Project/ProjectLoadInformation.cs @@ -12,10 +12,9 @@ namespace ICSharpCode.SharpDevelop.Project /// public class ProjectLoadInformation { - public Solution ParentSolution { get; private set; } + public ISolution ParentSolution { get; private set; } public FileName FileName { get; private set; } - public string Configuration { get; internal set; } - public string Platform { get; internal set; } + public ConfigurationAndPlatform Configuration { get; set; } public string ProjectName { get; private set; } public string TypeGuid { get; set; } public IList ProjectSections {get; set;} @@ -25,6 +24,7 @@ namespace ICSharpCode.SharpDevelop.Project /// The default is true. /// public bool InitializeTypeSystem { get; set; } + #warning this property is unused? internal string Guid { get; set; } @@ -45,7 +45,7 @@ namespace ICSharpCode.SharpDevelop.Project } } - public ProjectLoadInformation(Solution parentSolution, FileName fileName, string projectName) + public ProjectLoadInformation(ISolution parentSolution, FileName fileName, string projectName) { if (parentSolution == null) throw new ArgumentNullException("parentSolution"); diff --git a/src/Main/Base/Project/Src/Services/ProjectService/ProjectEventHandler.cs b/src/Main/Base/Project/Src/Services/ProjectService/ProjectEventHandler.cs index a3eadcefdd..a4311ab8da 100644 --- a/src/Main/Base/Project/Src/Services/ProjectService/ProjectEventHandler.cs +++ b/src/Main/Base/Project/Src/Services/ProjectService/ProjectEventHandler.cs @@ -5,8 +5,6 @@ using System; namespace ICSharpCode.SharpDevelop.Project { - public delegate void ProjectEventHandler(object sender, ProjectEventArgs e); - public class ProjectEventArgs : EventArgs { IProject project; diff --git a/src/Main/Base/Project/Src/Services/ProjectService/ProjectLoader.cs b/src/Main/Base/Project/Src/Services/ProjectService/ProjectLoader.cs deleted file mode 100644 index b2fd31fdf7..0000000000 --- a/src/Main/Base/Project/Src/Services/ProjectService/ProjectLoader.cs +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) - -using System; - -namespace ICSharpCode.SharpDevelop.Project -{ - /// - /// Interface called to load (convert) project and solution files - /// - public interface IProjectLoader - { - /// - /// Load/Convert the project solution - /// - void Load(string fileName); - } - - /// - /// Loader for MSBuild project files - /// - public class LoadProject : IProjectLoader - { - public void Load(string fileName) - { - ProjectService.LoadProject(fileName); - } - } - - /// - /// Loader for sln files as well as Sharpdevelop cmbx and prjx files - /// - public class LoadSolution : IProjectLoader - { - public void Load(string fileName) - { - ProjectService.LoadSolution(fileName); - } - } -} diff --git a/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs b/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs index 06873f8eb2..57d36ba004 100644 --- a/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs +++ b/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs @@ -18,10 +18,10 @@ namespace ICSharpCode.SharpDevelop.Project { public static class ProjectService { - volatile static Solution openSolution; + volatile static ISolution openSolution; volatile static IProject currentProject; - public static Solution OpenSolution { + public static ISolution OpenSolution { [System.Diagnostics.DebuggerStepThrough] get { return openSolution; @@ -54,7 +54,7 @@ namespace ICSharpCode.SharpDevelop.Project /// public static IProject GetProject(FileName projectFilename) { - Solution sln = openSolution; + ISolution sln = openSolution; if (sln == null) return null; foreach (IProject project in sln.Projects) { @@ -99,6 +99,7 @@ namespace ICSharpCode.SharpDevelop.Project return false; } + /* public static IProjectLoader GetProjectLoader(string fileName) { AddInTreeNode addinTreeNode = AddInTree.GetTreeNode("/SharpDevelop/Workbench/Combine/FileFilter"); @@ -110,7 +111,7 @@ namespace ICSharpCode.SharpDevelop.Project } } return null; - } + }*/ public static void LoadSolutionOrProject(string fileName) { @@ -130,7 +131,7 @@ namespace ICSharpCode.SharpDevelop.Project string oldName = e.SourceFile; string newName = e.TargetFile; long x = 0; - foreach (ISolutionFolderContainer container in OpenSolution.SolutionFolderContainers) { + foreach (ISolutionFolder container in OpenSolution.SolutionFolderContainers) { foreach (SolutionItem item in container.SolutionItems.Items) { string oldFullName = Path.Combine(OpenSolution.Directory, item.Name); ++x; @@ -163,7 +164,7 @@ namespace ICSharpCode.SharpDevelop.Project } string fileName = e.FileName; - foreach (ISolutionFolderContainer container in OpenSolution.SolutionFolderContainers) { + foreach (ISolutionFolder container in OpenSolution.SolutionFolderContainers) { for (int i = 0; i < container.SolutionItems.Items.Count;) { SolutionItem item = container.SolutionItems.Items[i]; if (FileUtility.IsBaseDirectory(fileName, Path.Combine(OpenSolution.Directory, item.Name))) { @@ -255,11 +256,13 @@ namespace ICSharpCode.SharpDevelop.Project } } + [Obsolete("Use SD.ProjectService.OpenSolutionOrProject() instead")] public static void LoadSolution(string fileName) { - FileUtility.ObservedLoad(LoadSolutionInternal, fileName); + SD.ProjectService.OpenSolutionOrProject(FileName.Create(fileName)); + //FileUtility.ObservedLoad(LoadSolutionInternal, fileName); } - + /* static void LoadSolutionInternal(string fileName) { if (!Path.IsPathRooted(fileName)) @@ -272,7 +275,7 @@ namespace ICSharpCode.SharpDevelop.Project OnSolutionLoading(fileName); var solutionProperties = LoadSolutionPreferences(fileName); try { - openSolution = Solution.Load(fileName, solutionProperties["ActiveConfiguration"], solutionProperties["ActivePlatform"]); + openSolution = ISolution.Load(fileName, solutionProperties["ActiveConfiguration"], solutionProperties["ActivePlatform"]); CommandManager.InvalidateRequerySuggested(); SD.ParserService.InvalidateCurrentSolutionSnapshot(); if (openSolution == null) @@ -341,15 +344,18 @@ namespace ICSharpCode.SharpDevelop.Project } } } + */ /// /// Load a single project as solution. /// + [Obsolete("Use SD.ProjectService.OpenSolutionOrProject() instead")] public static void LoadProject(string fileName) { - FileUtility.ObservedLoad(LoadProjectInternal, fileName); + SD.ProjectService.OpenSolutionOrProject(FileName.Create(fileName)); + //FileUtility.ObservedLoad(LoadProjectInternal, fileName); } - + /* static void LoadProjectInternal(string fileName) { if (!Path.IsPathRooted(fileName)) @@ -376,7 +382,7 @@ namespace ICSharpCode.SharpDevelop.Project "${res:Global.IgnoreButtonText}"); if (res == 0) { // Add project to solution - Commands.AddExistingProjectToSolution.AddProject((ISolutionFolderNode)ProjectBrowserPad.Instance.SolutionNode, FileName.Create(fileName)); + Commands.AddExistingProjectToSolution.AddProject((ISolutionItemNode)ProjectBrowserPad.Instance.SolutionNode, FileName.Create(fileName)); SaveSolution(); return; } else if (res == 1) { @@ -397,7 +403,7 @@ namespace ICSharpCode.SharpDevelop.Project return; } } - Solution solution = new Solution(new ProjectChangeWatcher(solutionFile)); + ISolution solution = new Solution(new ProjectChangeWatcher(solutionFile)); solution.Name = Path.GetFileNameWithoutExtension(fileName); IProjectBinding binding = ProjectBindingService.GetBindingPerProjectFile(fileName); IProject project; @@ -419,16 +425,16 @@ namespace ICSharpCode.SharpDevelop.Project // only load when saved succesfully LoadSolution(solutionFile); } - } + }*/ public static void SaveSolution() { if (openSolution != null) { openSolution.Save(); - foreach (IProject project in openSolution.Projects) { + /* foreach (IProject project in openSolution.Projects) { project.Save(); } - OnSolutionSaved(new SolutionEventArgs(openSolution)); + OnSolutionSaved(new SolutionEventArgs(openSolution));*/ } } @@ -488,7 +494,7 @@ namespace ICSharpCode.SharpDevelop.Project if (SolutionPreferencesSaving != null) SolutionPreferencesSaving(null, new SolutionEventArgs(openSolution)); - Properties memento = (openSolution.Preferences as IMementoCapable).CreateMemento(); + Properties memento = openSolution.Preferences.Clone(); string fullFileName = GetPreferenceFileName(openSolution.FileName); if (FileUtility.IsValidPath(fullFileName)) { @@ -622,7 +628,7 @@ namespace ICSharpCode.SharpDevelop.Project if (OpenSolution == null) { return; } - foreach (ISolutionFolder folder in OpenSolution.SolutionFolders) { + foreach (ISolutionItem folder in OpenSolution.SolutionFolders) { if (folder.IdGuid == guid) { folder.Parent.RemoveFolder(folder); OnSolutionFolderRemoved(new SolutionFolderEventArgs(folder)); @@ -632,7 +638,7 @@ namespace ICSharpCode.SharpDevelop.Project } } - static void HandleRemovedSolutionFolder(ISolutionFolder folder) + static void HandleRemovedSolutionFolder(ISolutionItem folder) { IProject project = folder as IProject; if (project != null) { @@ -640,9 +646,9 @@ namespace ICSharpCode.SharpDevelop.Project OnProjectRemoved(new ProjectEventArgs(project)); project.Dispose(); } - if (folder is ISolutionFolderContainer) { + if (folder is ISolutionFolder) { // recurse into child folders that were also removed - ((ISolutionFolderContainer)folder).Folders.ForEach(HandleRemovedSolutionFolder); + ((ISolutionFolder)folder).Folders.ForEach(HandleRemovedSolutionFolder); } } @@ -693,15 +699,15 @@ namespace ICSharpCode.SharpDevelop.Project /// /// Is raised when a new project is created. /// - public static event ProjectEventHandler ProjectCreated; + public static event EventHandler ProjectCreated; /// /// Is raised when a new or existing project is added to the solution. /// - public static event ProjectEventHandler ProjectAdded; + public static event EventHandler ProjectAdded; /// /// Is raised when a project is removed from the solution. /// - public static event ProjectEventHandler ProjectRemoved; + public static event EventHandler ProjectRemoved; /// /// Is raised when a solution folder is removed from the solution. @@ -746,7 +752,7 @@ namespace ICSharpCode.SharpDevelop.Project /// public static event EventHandler SolutionPreferencesSaving; - public static event ProjectEventHandler CurrentProjectChanged; + public static event EventHandler CurrentProjectChanged; public static event EventHandler ProjectItemAdded; public static event EventHandler ProjectItemRemoved; diff --git a/src/Main/Base/Project/Src/Services/ProjectService/SolutionConfigurationEventHandler.cs b/src/Main/Base/Project/Src/Services/ProjectService/SolutionConfigurationEventHandler.cs index 84489c2bf2..3175e02149 100644 --- a/src/Main/Base/Project/Src/Services/ProjectService/SolutionConfigurationEventHandler.cs +++ b/src/Main/Base/Project/Src/Services/ProjectService/SolutionConfigurationEventHandler.cs @@ -11,20 +11,20 @@ namespace ICSharpCode.SharpDevelop public class SolutionConfigurationEventArgs : EventArgs { string configuration; - Solution solution; + ISolution solution; public string Configuration { get { return configuration; } } - public Solution Solution { + public ISolution Solution { get { return solution; } } - public SolutionConfigurationEventArgs(Solution solution, string configuration) + public SolutionConfigurationEventArgs(ISolution solution, string configuration) { this.solution = solution; this.configuration = configuration; diff --git a/src/Main/Base/Project/Src/Services/ProjectService/SolutionEventHandler.cs b/src/Main/Base/Project/Src/Services/ProjectService/SolutionEventHandler.cs index d856f60ff3..0a01080ed6 100644 --- a/src/Main/Base/Project/Src/Services/ProjectService/SolutionEventHandler.cs +++ b/src/Main/Base/Project/Src/Services/ProjectService/SolutionEventHandler.cs @@ -8,15 +8,15 @@ namespace ICSharpCode.SharpDevelop.Project { public class SolutionEventArgs : EventArgs { - Solution solution; + ISolution solution; - public Solution Solution { + public ISolution Solution { get { return solution; } } - public SolutionEventArgs(Solution solution) + public SolutionEventArgs(ISolution solution) { this.solution = solution; } @@ -24,15 +24,15 @@ namespace ICSharpCode.SharpDevelop.Project public class SolutionCancelEventArgs : CancelEventArgs { - Solution solution; + ISolution solution; - public Solution Solution { + public ISolution Solution { get { return solution; } } - public SolutionCancelEventArgs(Solution solution) + public SolutionCancelEventArgs(ISolution solution) { this.solution = solution; } diff --git a/src/Main/Base/Project/Src/Services/ProjectService/SolutionFolderEventHandler.cs b/src/Main/Base/Project/Src/Services/ProjectService/SolutionFolderEventHandler.cs index 3a2cf236b0..084298ffe9 100644 --- a/src/Main/Base/Project/Src/Services/ProjectService/SolutionFolderEventHandler.cs +++ b/src/Main/Base/Project/Src/Services/ProjectService/SolutionFolderEventHandler.cs @@ -9,15 +9,15 @@ namespace ICSharpCode.SharpDevelop.Project public class SolutionFolderEventArgs : EventArgs { - ISolutionFolder solutionFolder; + ISolutionItem solutionFolder; - public ISolutionFolder SolutionFolder { + public ISolutionItem SolutionFolder { get { return solutionFolder; } } - public SolutionFolderEventArgs(ISolutionFolder solutionFolder) + public SolutionFolderEventArgs(ISolutionItem solutionFolder) { this.solutionFolder = solutionFolder; } diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/FindReferenceService.cs b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferenceService.cs index d838ada432..0073cad9f8 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/FindReferenceService.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferenceService.cs @@ -25,7 +25,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring #region FindReferences static IEnumerable GetProjectsThatCouldReferenceEntity(IEntity entity) { - Solution solution = ProjectService.OpenSolution; + ISolution solution = ProjectService.OpenSolution; if (solution == null) yield break; foreach (IProject project in solution.Projects) { diff --git a/src/Main/Base/Test/Project/BeforeBuildCustomToolProjectItemsTests.cs b/src/Main/Base/Test/Project/BeforeBuildCustomToolProjectItemsTests.cs index e7b3f7c108..18e2abe8f7 100644 --- a/src/Main/Base/Test/Project/BeforeBuildCustomToolProjectItemsTests.cs +++ b/src/Main/Base/Test/Project/BeforeBuildCustomToolProjectItemsTests.cs @@ -20,7 +20,7 @@ namespace ICSharpCode.SharpDevelop.Tests.Project { ProjectHelper projectHelper; BeforeBuildCustomToolProjectItems beforeBuildCustomToolProjectItems; - Solution solution; + ISolution solution; IProject CreateProject(string fileName = @"d:\MyProject\MyProject.csproj") { diff --git a/src/Main/Base/Test/SolutionTests.cs b/src/Main/Base/Test/SolutionTests.cs index 5a8e07b6a0..fbe5506419 100644 --- a/src/Main/Base/Test/SolutionTests.cs +++ b/src/Main/Base/Test/SolutionTests.cs @@ -12,7 +12,7 @@ namespace ICSharpCode.SharpDevelop.Tests [TestFixture] public class SolutionTests { - Solution solution; + ISolution solution; void CreateSolution() { diff --git a/src/Main/Base/Test/WebReferences/WebReferenceTestHelper.cs b/src/Main/Base/Test/WebReferences/WebReferenceTestHelper.cs index 100abc4675..aac00db06f 100644 --- a/src/Main/Base/Test/WebReferences/WebReferenceTestHelper.cs +++ b/src/Main/Base/Test/WebReferences/WebReferenceTestHelper.cs @@ -40,7 +40,7 @@ namespace ICSharpCode.SharpDevelop.Tests.WebReferences get { return languageName; } } - public override bool ReadOnly { + public override bool IsReadOnly { get { return readOnly; } } diff --git a/src/Main/SharpDevelop/Parser/ParserService.cs b/src/Main/SharpDevelop/Parser/ParserService.cs index 924a95d04b..c00f17e585 100644 --- a/src/Main/SharpDevelop/Parser/ParserService.cs +++ b/src/Main/SharpDevelop/Parser/ParserService.cs @@ -89,7 +89,7 @@ namespace ICSharpCode.SharpDevelop.Parser public ICompilation GetCompilationForFile(FileName fileName) { - Solution solution = ProjectService.OpenSolution; + ISolution solution = ProjectService.OpenSolution; IProject project = solution != null ? solution.FindProjectContainingFile(fileName) : null; if (project != null) return GetCompilation(project); diff --git a/src/Main/SharpDevelop/Project/Build/BuildService.cs b/src/Main/SharpDevelop/Project/Build/BuildService.cs index 687b70d20b..5f5bbfb7cb 100644 --- a/src/Main/SharpDevelop/Project/Build/BuildService.cs +++ b/src/Main/SharpDevelop/Project/Build/BuildService.cs @@ -106,7 +106,7 @@ namespace ICSharpCode.SharpDevelop.Project return Task.FromResult(new BuildResults { Result = BuildResultCode.Error }); } - public Task BuildAsync(Solution solution, BuildOptions options) + public Task BuildAsync(ISolution solution, BuildOptions options) { if (solution != null) return BuildAsync(solution.Projects, options);