Browse Source

Worked on new ProjectService implementation.

pull/32/merge
Daniel Grunwald 13 years ago
parent
commit
785c54c9e8
  1. 65
      src/AddIns/Analysis/UnitTesting/Model/TestSolution.cs
  2. 3
      src/AddIns/Analysis/UnitTesting/Pad/UnitTestNode.cs
  3. 14
      src/Main/Base/Project/Project/Configuration/IConfigurable.cs
  4. 5
      src/Main/Base/Project/Project/IProjectService.cs
  5. 9
      src/Main/Base/Project/Project/ISolution.cs
  6. 2
      src/Main/Base/Project/Project/SolutionSection.cs
  7. 2
      src/Main/Base/Project/Services/SD.cs
  8. 8
      src/Main/Base/Project/Src/Gui/Dialogs/ProjectOptionsView.cs
  9. 1
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ProjectReferencePanel.cs
  10. 1
      src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs
  11. 15
      src/Main/Base/Project/Src/Project/AbstractProject.cs
  12. 7
      src/Main/Base/Project/Src/Project/Behaviors/DefaultProjectBehavior.cs
  13. 45
      src/Main/Base/Project/Src/Project/IProject.cs
  14. 10
      src/Main/Base/Project/Src/Project/Items/ProjectReferenceProjectItem.cs
  15. 20
      src/Main/Base/Project/Src/Services/NavigationService/NavigationService.cs
  16. 309
      src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs
  17. 43
      src/Main/Base/Project/Util/SharpDevelopServiceContainer.cs
  18. 9
      src/Main/SharpDevelop/Project/Build/BuildService.cs
  19. 4
      src/Main/SharpDevelop/Project/Configuration/ConfigurationMapping.cs
  20. 122
      src/Main/SharpDevelop/Project/ProjectService.cs
  21. 96
      src/Main/SharpDevelop/Project/Solution.cs
  22. 17
      src/Main/SharpDevelop/Project/SolutionFolder.cs

65
src/AddIns/Analysis/UnitTesting/Model/TestSolution.cs

@ -4,6 +4,7 @@ @@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
using ICSharpCode.Core;
using ICSharpCode.NRefactory.TypeSystem;
@ -30,15 +31,12 @@ namespace ICSharpCode.UnitTesting @@ -30,15 +31,12 @@ namespace ICSharpCode.UnitTesting
throw new ArgumentNullException("resourceService");
this.testService = testService;
this.resourceService = resourceService;
ProjectService.SolutionLoaded += ProjectService_SolutionLoaded;
ProjectService.SolutionClosed += ProjectService_SolutionClosed;
ProjectService.ProjectAdded += ProjectService_ProjectAdded;
ProjectService.ProjectRemoved += ProjectService_ProjectRemoved;
SD.ProjectService.AllProjects.CollectionChanged += OnProjectsCollectionChanged;
SD.ParserService.LoadSolutionProjectsThread.Finished += SD_ParserService_LoadSolutionProjectsThread_Finished;
if (ProjectService.OpenSolution != null) {
ProjectService_SolutionLoaded(null, new SolutionEventArgs(ProjectService.OpenSolution));
SD_ParserService_LoadSolutionProjectsThread_Finished(null, null);
foreach (var project in SD.ProjectService.AllProjects) {
AddProject(project);
}
SD_ParserService_LoadSolutionProjectsThread_Finished(null, null);
}
public override string DisplayName {
@ -138,9 +136,31 @@ namespace ICSharpCode.UnitTesting @@ -138,9 +136,31 @@ namespace ICSharpCode.UnitTesting
}
}
void ProjectService_ProjectAdded(object sender, ProjectEventArgs e)
void OnProjectsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
AddProject(e.Project);
if (e.Action == NotifyCollectionChangedAction.Reset) {
for (int i = 0; i < changeListeners.Count; i++) {
changeListeners[i].Stop();
}
changeListeners.Clear();
foreach (var project in SD.ProjectService.AllProjects) {
AddProject(project);
}
} else {
if (e.OldItems != null) {
for (int i = 0; i < changeListeners.Count; i++) {
if (e.OldItems.Contains(changeListeners[i].project)) {
changeListeners[i].Stop();
changeListeners.RemoveAt(i--);
}
}
}
if (e.NewItems != null) {
foreach (var project in e.NewItems.OfType<IProject>()) {
AddProject(project);
}
}
}
}
void AddProject(IProject project)
@ -150,33 +170,6 @@ namespace ICSharpCode.UnitTesting @@ -150,33 +170,6 @@ namespace ICSharpCode.UnitTesting
listener.Start();
}
void ProjectService_ProjectRemoved(object sender, ProjectEventArgs e)
{
for (int i = 0; i < changeListeners.Count; i++) {
if (changeListeners[i].project == e.Project) {
changeListeners[i].Stop();
changeListeners.RemoveAt(i);
break;
}
}
}
void ProjectService_SolutionClosed(object sender, EventArgs e)
{
for (int i = 0; i < changeListeners.Count; i++) {
changeListeners[i].Stop();
}
changeListeners.Clear();
}
void ProjectService_SolutionLoaded(object sender, SolutionEventArgs e)
{
ProjectService_SolutionClosed(sender, e);
foreach (var project in e.Solution.Projects) {
AddProject(project);
}
}
void SD_ParserService_LoadSolutionProjectsThread_Finished(object sender, EventArgs e)
{
for (int i = 0; i < changeListeners.Count; i++) {

3
src/AddIns/Analysis/UnitTesting/Pad/UnitTestNode.cs

@ -50,7 +50,8 @@ namespace ICSharpCode.UnitTesting @@ -50,7 +50,8 @@ namespace ICSharpCode.UnitTesting
public override void ActivateItem(RoutedEventArgs e)
{
test.GoToDefinition.Execute(e);
if (test.GoToDefinition.CanExecute(e))
test.GoToDefinition.Execute(e);
}
#region Manage Children

14
src/Main/Base/Project/Project/Configuration/IConfigurable.cs

@ -1,18 +1,10 @@ @@ -1,18 +1,10 @@
/*
* Created by SharpDevelop.
* User: Daniel
* Date: 2/26/2013
* Time: 16:27
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
// 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
{
/// <summary>
/// Description of IConfigurable.
/// </summary>
public interface IConfigurable
{
/// <summary>

5
src/Main/Base/Project/Project/IProjectService.cs

@ -25,6 +25,11 @@ namespace ICSharpCode.SharpDevelop.Project @@ -25,6 +25,11 @@ namespace ICSharpCode.SharpDevelop.Project
event PropertyChangedEventHandler<ISolution> CurrentSolutionChanged;
/// <summary>
/// This event is raised after a solution is opened.
/// </summary>
event EventHandler<SolutionEventArgs> SolutionLoaded;
/// <summary>
/// This event is raised before a solution is closed.
/// </summary>

9
src/Main/Base/Project/Project/ISolution.cs

@ -91,4 +91,13 @@ namespace ICSharpCode.SharpDevelop.Project @@ -91,4 +91,13 @@ namespace ICSharpCode.SharpDevelop.Project
/// </summary>
void Save();
}
/// <summary>
/// This is a HACK to make project creation work; I don't think we should expose this method.
/// Maybe make IConfigurationMapping a concrete class and use an event for setting the solution's dirty flag?
/// </summary>
internal interface ISolutionInternal : ISolution
{
IConfigurationMapping CreateMappingForNewProject();
}
}

2
src/Main/Base/Project/Project/SolutionSection.cs

@ -14,6 +14,8 @@ namespace ICSharpCode.SharpDevelop.Project @@ -14,6 +14,8 @@ namespace ICSharpCode.SharpDevelop.Project
/// </summary>
public class SolutionSection : IReadOnlyDictionary<string, string>
{
// TODO: expose some change event so that the solution can be marked as dirty when a section is changed
static readonly char[] forbiddenChars = { '\n', '\r', '\0', '=' };
static void Validate(string key, string value)

2
src/Main/Base/Project/Services/SD.cs

@ -87,7 +87,7 @@ namespace ICSharpCode.SharpDevelop @@ -87,7 +87,7 @@ namespace ICSharpCode.SharpDevelop
/// </remarks>
public static Task<T> GetFutureService<T>() where T : class
{
throw new NotImplementedException();
return GetRequiredService<SharpDevelopServiceContainer>().GetFutureService<T>();
}
/// <summary>

8
src/Main/Base/Project/Src/Gui/Dialogs/ProjectOptionsView.cs

@ -41,12 +41,12 @@ namespace ICSharpCode.SharpDevelop.Project.Dialogs @@ -41,12 +41,12 @@ namespace ICSharpCode.SharpDevelop.Project.Dialogs
tabControl.IsDirtyChanged += delegate { RaiseIsDirtyChanged(); };
tabControl.AddOptionPanels(node.BuildChildItems<IOptionPanelDescriptor>(project));
ProjectService.ProjectRemoved += ProjectService_ProjectRemoved;
project.Disposed += Project_Disposed;
}
void ProjectService_ProjectRemoved(object sender, ProjectEventArgs e)
void Project_Disposed(object sender, EventArgs e)
{
if (e.Project == project && this.WorkbenchWindow != null)
if (this.WorkbenchWindow != null)
WorkbenchWindow.CloseWindow(true);
}
@ -76,7 +76,7 @@ namespace ICSharpCode.SharpDevelop.Project.Dialogs @@ -76,7 +76,7 @@ namespace ICSharpCode.SharpDevelop.Project.Dialogs
public override void Dispose()
{
ProjectService.ProjectRemoved -= ProjectService_ProjectRemoved;
project.Disposed -= Project_Disposed;
foreach (IDisposable op in tabControl.OptionPanels.OfType<IDisposable>()) {
op.Dispose();
}

1
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ProjectReferencePanel.cs

@ -39,7 +39,6 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -39,7 +39,6 @@ namespace ICSharpCode.SharpDevelop.Gui
{
foreach (ListViewItem item in SelectedItems) {
IProject project = (IProject)item.Tag;
IProjectBinding binding = ProjectBindingService.GetBindingPerLanguageName(project.Language);
selectDialog.AddReference(
project.Name, "Project", project.OutputAssemblyFullPath,

1
src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs

@ -415,6 +415,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -415,6 +415,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
#region Create Project
IProject project;
try {
projectCreateInformation.ConfigurationMapping = ((ISolutionInternal)projectCreateInformation.Solution).CreateMappingForNewProject();
project = languageinfo.CreateProject(projectCreateInformation);
} catch (ProjectLoadException ex) {
MessageService.ShowError(ex.Message);

15
src/Main/Base/Project/Src/Project/AbstractProject.cs

@ -71,7 +71,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -71,7 +71,7 @@ namespace ICSharpCode.SharpDevelop.Project
get { return isDisposed; }
}
//public event EventHandler Disposed = delegate {};
public event EventHandler Disposed;
public virtual void Dispose()
{
@ -83,7 +83,8 @@ namespace ICSharpCode.SharpDevelop.Project @@ -83,7 +83,8 @@ namespace ICSharpCode.SharpDevelop.Project
if (watcher != null)
watcher.Dispose();
}
//Disposed(this, EventArgs.Empty);
if (Disposed != null)
Disposed(this, EventArgs.Empty);
}
#endregion
@ -179,10 +180,10 @@ namespace ICSharpCode.SharpDevelop.Project @@ -179,10 +180,10 @@ namespace ICSharpCode.SharpDevelop.Project
#endregion
#region ProjectSections
List<SolutionSection> projectSections = new List<SolutionSection>();
SimpleModelCollection<SolutionSection> projectSections = new SimpleModelCollection<SolutionSection>();
[Browsable(false)]
public IList<SolutionSection> ProjectSections {
public IMutableModelCollection<SolutionSection> ProjectSections {
get {
SD.MainThread.VerifyAccess();
return projectSections;
@ -259,10 +260,8 @@ namespace ICSharpCode.SharpDevelop.Project @@ -259,10 +260,8 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
public virtual IConfigurationMapping ConfigurationMapping {
get {
throw new NotImplementedException();
}
public IConfigurationMapping ConfigurationMapping {
get { return configurationMapping; }
}
#endregion

7
src/Main/Base/Project/Src/Project/Behaviors/DefaultProjectBehavior.cs

@ -66,11 +66,6 @@ namespace ICSharpCode.SharpDevelop.Project @@ -66,11 +66,6 @@ namespace ICSharpCode.SharpDevelop.Project
return new UnknownProjectItem(Project, item);
}
public override void ProjectCreationComplete()
{
}
public override IEnumerable<CompilerVersion> GetAvailableCompilerVersions()
{
return Enumerable.Empty<CompilerVersion>();
@ -124,8 +119,10 @@ namespace ICSharpCode.SharpDevelop.Project @@ -124,8 +119,10 @@ namespace ICSharpCode.SharpDevelop.Project
System.Windows.Threading.DispatcherPriority.Background,
new Action(
delegate {
NavigationService.SuspendLogging();
foreach (string file in filesToOpen)
FileService.OpenFile(file);
NavigationService.ResumeLogging();
}));
base.SetMemento(memento);

45
src/Main/Base/Project/Src/Project/IProject.cs

@ -33,18 +33,14 @@ namespace ICSharpCode.SharpDevelop.Project @@ -33,18 +33,14 @@ namespace ICSharpCode.SharpDevelop.Project
/// Thread-safe members lock on this object, but if you manipulate underlying structures
/// (such as the MSBuild project for MSBuildBasedProjects) directly, you will have to lock on this object.
/// </summary>
object SyncRoot {
get;
}
object SyncRoot { get; }
/// <summary>
/// Gets the list of items in the project. This member is thread-safe.
/// The returned collection is guaranteed not to change - adding new items or removing existing items
/// will create a new collection.
/// </summary>
IReadOnlyCollection<ProjectItem> Items {
get;
}
IReadOnlyCollection<ProjectItem> Items { get; }
/// <summary>
/// Gets all items in the project that have the specified item type.
@ -61,14 +57,12 @@ namespace ICSharpCode.SharpDevelop.Project @@ -61,14 +57,12 @@ namespace ICSharpCode.SharpDevelop.Project
/// <summary>
/// Gets the list of available file item types. This member is thread-safe.
/// </summary>
IReadOnlyCollection<ItemType> AvailableFileItemTypes {
get;
}
IReadOnlyCollection<ItemType> AvailableFileItemTypes { get; }
/// <summary>
/// Gets a list of project sections stored in the solution file for this project.
/// </summary>
IList<SolutionSection> ProjectSections { get; }
IMutableModelCollection<SolutionSection> ProjectSections { get; }
/// <summary>
/// Gets the name of the project file.
@ -76,10 +70,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -76,10 +70,7 @@ namespace ICSharpCode.SharpDevelop.Project
///
/// Only the getter is thread-safe.
/// </summary>
FileName FileName {
get;
set;
}
FileName FileName { get; set; }
/// <summary>
/// Gets/Sets the name of the project.
@ -89,10 +80,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -89,10 +80,7 @@ namespace ICSharpCode.SharpDevelop.Project
/// <remarks>
/// Name already exists in IBuildable; we're adding the setter here.
/// </remarks>
new string Name {
get;
set;
}
new string Name { get; set; }
/// <summary>
/// Gets the directory of the project file.
@ -101,9 +89,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -101,9 +89,7 @@ namespace ICSharpCode.SharpDevelop.Project
///
/// This member is thread-safe.
/// </summary>
DirectoryName Directory {
get;
}
DirectoryName Directory { get; }
/// <summary>
/// <para>
@ -114,9 +100,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -114,9 +100,7 @@ namespace ICSharpCode.SharpDevelop.Project
/// </para>
/// <para>This member is thread-safe.</para>
/// </summary>
bool IsReadOnly {
get;
}
bool IsReadOnly { get; }
#region MSBuild properties used inside SharpDevelop base
/// <summary>
@ -228,14 +212,23 @@ namespace ICSharpCode.SharpDevelop.Project @@ -228,14 +212,23 @@ namespace ICSharpCode.SharpDevelop.Project
/// <summary>
/// Loads the project extension content with the specified name.
/// </summary>
/// <remarks>
/// Project extensions are custom XML elements that are stored within the .csproj file.
/// </remarks>
XElement LoadProjectExtensions(string name);
/// <summary>
/// Saves the project extension content with the specified name.
/// </summary>
/// <remarks>
/// Project extensions are custom XML elements that are stored within the .csproj file.
/// </remarks>
void SaveProjectExtensions(string name, XElement element);
// TODO:
/// <summary>
/// Determines whether this project has the specified type.
/// Projects may have multiple type GUIDs.
/// </summary>
bool HasProjectType(Guid projectTypeGuid);
/// <summary>
@ -314,6 +307,8 @@ namespace ICSharpCode.SharpDevelop.Project @@ -314,6 +307,8 @@ namespace ICSharpCode.SharpDevelop.Project
/// Gets whether this project was unloaded.
/// </summary>
bool IsDisposed { get; }
event EventHandler Disposed;
}
/// <summary>

10
src/Main/Base/Project/Src/Project/Items/ProjectReferenceProjectItem.cs

@ -18,7 +18,15 @@ namespace ICSharpCode.SharpDevelop.Project @@ -18,7 +18,15 @@ namespace ICSharpCode.SharpDevelop.Project
get {
// must be thread-safe because it's used by LoadSolutionProjectsThread,
// and by IAssemblyReference.Resolve()
return ProjectService.GetProject(Core.FileName.Create(this.FileName));
IProject parentProject = this.Project;
if (parentProject == null)
return null;
var fileName = Core.FileName.Create(this.FileName);
foreach (var project in parentProject.ParentSolution.Projects) {
if (project.FileName == fileName)
return project;
}
return null;
}
}

20
src/Main/Base/Project/Src/Services/NavigationService/NavigationService.cs

@ -72,10 +72,6 @@ namespace ICSharpCode.SharpDevelop @@ -72,10 +72,6 @@ namespace ICSharpCode.SharpDevelop
// trap changes in the secondary tab via the workbench's ActiveViewContentChanged event
SD.Workbench.ActiveViewContentChanged += ActiveViewContentChanged;
// ignore files opened as part of loading a solution.
ProjectService.SolutionLoading += ProjectService_SolutionLoading;
SD.ParserService.LoadSolutionProjectsThread.Finished += LoadSolutionProjectsThreadEnded;
FileService.FileRenamed += FileService_FileRenamed;
ProjectService.SolutionClosed += ProjectService_SolutionClosed;
serviceInitialized = true;
@ -364,22 +360,6 @@ namespace ICSharpCode.SharpDevelop @@ -364,22 +360,6 @@ namespace ICSharpCode.SharpDevelop
// how to test code triggered by the user interacting with the workbench
#region event trapping
/// <summary>
/// Prepares the NavigationService to load a new solution.
/// </summary>
static void ProjectService_SolutionLoading(object sender, EventArgs e)
{
SuspendLogging();
}
/// <summary>
/// Prepares the NavigationService for working with a newly loaded solution
/// </summary>
static void LoadSolutionProjectsThreadEnded(object sender, EventArgs e)
{
ResumeLogging();
}
/// <summary>
/// Respond to changes in the <see cref="IWorkbench.ActiveViewContent">
/// ActiveViewContent</see> by logging the new <see cref="IViewContent"/>.

309
src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs

@ -6,14 +6,9 @@ using System.Collections.Generic; @@ -6,14 +6,9 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Input;
using System.Xml;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Parser;
using ICSharpCode.SharpDevelop.Util;
using ICSharpCode.SharpDevelop.Workbench;
namespace ICSharpCode.SharpDevelop.Project
{
@ -41,22 +36,6 @@ namespace ICSharpCode.SharpDevelop.Project @@ -41,22 +36,6 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
/// <summary>
/// Gets an open project by the name of the project file.
/// </summary>
public static IProject GetProject(FileName projectFilename)
{
ISolution sln = SD.ProjectService.CurrentSolution;
if (sln == null)
return null;
foreach (IProject project in sln.Projects) {
if (project.FileName == projectFilename) {
return project;
}
}
return null;
}
/// <summary>
/// Returns if a project loader exists for the given file. This method works even in early
/// startup (before service initialization)
@ -67,38 +46,12 @@ namespace ICSharpCode.SharpDevelop.Project @@ -67,38 +46,12 @@ namespace ICSharpCode.SharpDevelop.Project
return SD.ProjectService.IsProjectOrSolutionFile(FileName.Create(fileName));
}
/*
public static IProjectLoader GetProjectLoader(string fileName)
{
AddInTreeNode addinTreeNode = AddInTree.GetTreeNode("/SharpDevelop/Workbench/Combine/FileFilter");
foreach (Codon codon in addinTreeNode.Codons) {
string pattern = codon.Properties.Get("extensions", "");
if (FileUtility.MatchesPattern(fileName, pattern) && codon.Properties.Contains("class")) {
object binding = codon.AddIn.CreateObject(codon.Properties["class"]);
return binding as IProjectLoader;
}
}
return null;
}*/
[Obsolete("Use SD.ProjectService.OpenSolutionOrProject instead")]
public static void LoadSolutionOrProject(string fileName)
{
SD.ProjectService.OpenSolutionOrProject(FileName.Create(fileName));
}
static void ActiveViewContentChanged(object sender, EventArgs e)
{
IViewContent viewContent = SD.Workbench.ActiveViewContent;
if (OpenSolution == null || viewContent == null) {
return;
}
FileName fileName = viewContent.PrimaryFileName;
if (fileName == null) {
return;
}
CurrentProject = SD.ProjectService.FindProjectContainingFile(fileName) ?? CurrentProject;
}
/// <summary>
/// Adds a project item to the project, raising the ProjectItemAdded event.
/// Make sure you call project.Save() after adding new items!
@ -131,106 +84,12 @@ namespace ICSharpCode.SharpDevelop.Project @@ -131,106 +84,12 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
/*
static void BeforeLoadSolution()
{
if (openSolution != null && !IsClosingCanceled()) {
SaveSolutionPreferences();
SD.Workbench.CloseAllViews();
CloseSolution();
}
}
*/
[Obsolete("Use SD.ProjectService.OpenSolutionOrProject() instead")]
public static void LoadSolution(string fileName)
{
SD.ProjectService.OpenSolutionOrProject(FileName.Create(fileName));
//FileUtility.ObservedLoad(LoadSolutionInternal, fileName);
}
/*
static void LoadSolutionInternal(string fileName)
{
if (!Path.IsPathRooted(fileName))
throw new ArgumentException("Path must be rooted!");
if (IsClosingCanceled())
return;
BeforeLoadSolution();
OnSolutionLoading(fileName);
var solutionProperties = LoadSolutionPreferences(fileName);
try {
openSolution = ISolution.Load(fileName, solutionProperties["ActiveConfiguration"], solutionProperties["ActivePlatform"]);
CommandManager.InvalidateRequerySuggested();
SD.ParserService.InvalidateCurrentSolutionSnapshot();
if (openSolution == null)
return;
} catch (IOException ex) {
LoggingService.Warn(ex);
MessageService.ShowError(ex.Message);
return;
} catch (UnauthorizedAccessException ex) {
LoggingService.Warn(ex);
MessageService.ShowError(ex.Message);
return;
}
(openSolution.Preferences as IMementoCapable).SetMemento(solutionProperties);
try {
ApplyConfigurationAndReadProjectPreferences();
} catch (Exception ex) {
MessageService.ShowException(ex);
}
SD.ParserService.InvalidateCurrentSolutionSnapshot();
SD.FileService.RecentOpen.AddRecentProject(openSolution.FileName);
Project.Converter.UpgradeViewContent.ShowIfRequired(openSolution);
// preferences must be read before OnSolutionLoad is called to enable
// the event listeners to read e.Solution.Preferences.Properties
OnSolutionLoaded(new SolutionEventArgs(openSolution));
}
static Properties LoadSolutionPreferences(string solutionFileName)
{
try {
string file = GetPreferenceFileName(solutionFileName);
if (FileUtility.IsValidPath(file) && File.Exists(file)) {
try {
return Properties.Load(file);
} catch (IOException) {
} catch (UnauthorizedAccessException) {
} catch (XmlException) {
// ignore errors about inaccessible or malformed files
}
}
} catch (Exception ex) {
MessageService.ShowException(ex);
}
return new Properties();
}
static void ApplyConfigurationAndReadProjectPreferences()
{
openSolution.ApplySolutionConfigurationAndPlatformToProjects();
foreach (IProject project in openSolution.Projects) {
string file = GetPreferenceFileName(project.FileName);
if (FileUtility.IsValidPath(file) && File.Exists(file)) {
Properties properties = null;
try {
properties = Properties.Load(file);
} catch (IOException) {
} catch (UnauthorizedAccessException) {
} catch (XmlException) {
// ignore errors about inaccessible or malformed files
}
if (properties != null)
project.SetMemento(properties);
}
}
}
*/
/// <summary>
/// Load a single project as solution.
@ -241,77 +100,6 @@ namespace ICSharpCode.SharpDevelop.Project @@ -241,77 +100,6 @@ namespace ICSharpCode.SharpDevelop.Project
SD.ProjectService.OpenSolutionOrProject(FileName.Create(fileName));
//FileUtility.ObservedLoad(LoadProjectInternal, fileName);
}
/*
static void LoadProjectInternal(string fileName)
{
if (!Path.IsPathRooted(fileName))
throw new ArgumentException("Path must be rooted!");
string solutionFile = Path.ChangeExtension(fileName, ".sln");
if (File.Exists(solutionFile)) {
LoadSolutionInternal(solutionFile);
if (openSolution != null) {
bool found = false;
foreach (IProject p in openSolution.Projects) {
if (FileUtility.IsEqualFileName(fileName, p.FileName)) {
found = true;
break;
}
}
if (found == false) {
var parseArgs = new[] { new StringTagPair("SolutionName", Path.GetFileName(solutionFile)), new StringTagPair("ProjectName", Path.GetFileName(fileName))};
int res = MessageService.ShowCustomDialog(MessageService.ProductName,
StringParser.Parse("${res:ICSharpCode.SharpDevelop.Commands.OpenCombine.SolutionDoesNotContainProject}", parseArgs),
0, 2,
StringParser.Parse("${res:ICSharpCode.SharpDevelop.Commands.OpenCombine.SolutionDoesNotContainProject.AddProjectToSolution}", parseArgs),
StringParser.Parse("${res:ICSharpCode.SharpDevelop.Commands.OpenCombine.SolutionDoesNotContainProject.CreateNewSolution}", parseArgs),
"${res:Global.IgnoreButtonText}");
if (res == 0) {
// Add project to solution
Commands.AddExistingProjectToSolution.AddProject((ISolutionItemNode)ProjectBrowserPad.Instance.SolutionNode, FileName.Create(fileName));
SaveSolution();
return;
} else if (res == 1) {
CloseSolution();
try {
File.Copy(solutionFile, Path.ChangeExtension(solutionFile, ".old.sln"), true);
} catch (IOException){}
} else {
// ignore, just open the solution
return;
}
} else {
// opened solution instead and correctly found the project
return;
}
} else {
// some problem during opening, abort
return;
}
}
ISolution solution = new Solution(new ProjectChangeWatcher(solutionFile));
solution.Name = Path.GetFileNameWithoutExtension(fileName);
IProjectBinding binding = ProjectBindingService.GetBindingPerProjectFile(fileName);
IProject project;
if (binding != null) {
project = ProjectBindingService.LoadProject(new ProjectLoadInformation(solution, FileName.Create(fileName), solution.Name));
if (project is UnknownProject) {
if (((UnknownProject)project).WarningDisplayedToUser == false) {
((UnknownProject)project).ShowWarningMessageBox();
}
return;
}
} else {
MessageService.ShowError(StringParser.Parse("${res:ICSharpCode.SharpDevelop.Commands.OpenCombine.InvalidProjectOrCombine}", new StringTagPair("FileName", fileName)));
return;
}
solution.AddFolder(project);
if (FileUtility.ObservedSave((NamedFileOperationDelegate)solution.Save, solutionFile) == FileOperationResult.OK) {
// only load when saved succesfully
LoadSolution(solutionFile);
}
}*/
public static void SaveSolution()
{
@ -360,67 +148,6 @@ namespace ICSharpCode.SharpDevelop.Project @@ -360,67 +148,6 @@ namespace ICSharpCode.SharpDevelop.Project
return b.ToString();
}
internal static string GetPreferenceFileName(string projectFileName)
{
string directory = Path.Combine(PropertyService.ConfigDirectory, "preferences");
return Path.Combine(directory,
Path.GetFileName(projectFileName)
+ "." + projectFileName.ToLowerInvariant().GetHashCode().ToString("x")
+ ".xml");
}
public static void SaveSolutionPreferences()
{
throw new NotImplementedException();
/*if (openSolution == null)
return;
string directory = Path.Combine(PropertyService.ConfigDirectory, "preferences");
if (!Directory.Exists(directory)) {
Directory.CreateDirectory(directory);
}
if (SolutionPreferencesSaving != null)
SolutionPreferencesSaving(null, new SolutionEventArgs(openSolution));
Properties memento = openSolution.Preferences.Clone();
string fullFileName = GetPreferenceFileName(openSolution.FileName);
if (FileUtility.IsValidPath(fullFileName)) {
#if DEBUG
memento.Save(fullFileName);
#else
FileUtility.ObservedSave(new NamedFileOperationDelegate(memento.Save), fullFileName, FileErrorPolicy.Inform);
#endif
}
foreach (IProject project in OpenSolution.Projects) {
memento = project.CreateMemento();
if (memento == null) continue;
fullFileName = GetPreferenceFileName(project.FileName);
if (FileUtility.IsValidPath(fullFileName)) {
#if DEBUG
memento.Save(fullFileName);
#else
FileUtility.ObservedSave(new NamedFileOperationDelegate(memento.Save), fullFileName, FileErrorPolicy.Inform);
#endif
}
}*/
}
static void OnSolutionLoading(string fileName)
{
if (SolutionLoading != null) {
SolutionLoading(fileName, EventArgs.Empty);
}
}
static void OnSolutionLoaded(SolutionEventArgs e)
{
if (SolutionLoaded != null) {
SolutionLoaded(null, e);
}
}
[Obsolete]
public static bool IsBuilding {
get {
@ -440,18 +167,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -440,18 +167,7 @@ namespace ICSharpCode.SharpDevelop.Project
ProjectItemRemoved(null, e);
}
}
static void OnProjectAdded(ProjectEventArgs e)
{
if (ProjectAdded != null) {
ProjectAdded(null, e);
}
}
static void OnProjectRemoved(ProjectEventArgs e)
{
if (ProjectRemoved != null) {
ProjectRemoved(null, e);
}
}
internal static void OnProjectCreated(ProjectEventArgs e)
{
if (ProjectCreated != null) {
@ -469,30 +185,22 @@ namespace ICSharpCode.SharpDevelop.Project @@ -469,30 +185,22 @@ namespace ICSharpCode.SharpDevelop.Project
/// Is raised when a new project is created.
/// </summary>
public static event EventHandler<ProjectEventArgs> ProjectCreated;
/// <summary>
/// Is raised when a new or existing project is added to the solution.
/// </summary>
public static event EventHandler<ProjectEventArgs> ProjectAdded;
/// <summary>
/// Is raised when a project is removed from the solution.
/// </summary>
public static event EventHandler<ProjectEventArgs> ProjectRemoved;
public static event EventHandler<SolutionEventArgs> SolutionCreated;
[Obsolete("Use SD.BuildService.BuildStarted instead")]
public static event EventHandler<BuildEventArgs> BuildStarted {
add { SD.BuildService.BuildStarted += value; }
remove { SD.BuildService.BuildStarted -= value; }
}
[Obsolete("Use SD.BuildService.BuildFinished instead")]
public static event EventHandler<BuildEventArgs> BuildFinished {
add { SD.BuildService.BuildFinished += value; }
remove { SD.BuildService.BuildFinished -= value; }
}
public static event EventHandler<SolutionEventArgs> SolutionCreated;
public static event EventHandler SolutionLoading;
public static event EventHandler<SolutionEventArgs> SolutionLoaded;
public static event EventHandler<SolutionEventArgs> SolutionLoaded {
add { SD.ProjectService.SolutionLoaded += value; }
remove { SD.ProjectService.SolutionLoaded -= value; }
}
public static event EventHandler<SolutionEventArgs> SolutionClosed {
add { SD.ProjectService.SolutionClosed += value; }
@ -515,6 +223,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -515,6 +223,7 @@ namespace ICSharpCode.SharpDevelop.Project
SD.GetService<IProjectService>(), (s, v) => s.CurrentProjectChanged += v, (s, v) => s.CurrentProjectChanged -= v,
handler => (sender, e) => handler(null, new ProjectEventArgs(e.NewValue)));
[Obsolete("Use SD.ProjectService.CurrentProjectChanged instead")]
public static event EventHandler<ProjectEventArgs> CurrentProjectChanged {
add { currentProjectChangedAdapter.Add(value); }
remove { currentProjectChangedAdapter.Remove(value); }

43
src/Main/Base/Project/Util/SharpDevelopServiceContainer.cs

@ -5,6 +5,7 @@ using System; @@ -5,6 +5,7 @@ using System;
using System.ComponentModel.Design;
using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace ICSharpCode.SharpDevelop
{
@ -16,6 +17,7 @@ namespace ICSharpCode.SharpDevelop @@ -16,6 +17,7 @@ namespace ICSharpCode.SharpDevelop
readonly IServiceProvider parentProvider;
readonly Dictionary<Type, object> services = new Dictionary<Type, object>();
readonly List<IDisposable> servicesToDispose = new List<IDisposable>();
readonly Dictionary<Type, object> taskCompletionSources = new Dictionary<Type, object>(); // object = TaskCompletionSource<T> for various T
public SharpDevelopServiceContainer()
{
@ -38,10 +40,8 @@ namespace ICSharpCode.SharpDevelop @@ -38,10 +40,8 @@ namespace ICSharpCode.SharpDevelop
SD.Log.Debug("Service startup: " + serviceType);
instance = callback(this, serviceType);
if (instance != null) {
IDisposable disposableService = instance as IDisposable;
if (disposableService != null)
servicesToDispose.Add(disposableService);
services[serviceType] = instance;
OnServiceInitialized(serviceType, instance);
} else {
services.Remove(serviceType);
}
@ -70,13 +70,24 @@ namespace ICSharpCode.SharpDevelop @@ -70,13 +70,24 @@ namespace ICSharpCode.SharpDevelop
}
}
void OnServiceInitialized(Type serviceType, object serviceInstance)
{
IDisposable disposableService = serviceInstance as IDisposable;
if (disposableService != null)
servicesToDispose.Add(disposableService);
dynamic taskCompletionSource;
if (taskCompletionSources.TryGetValue(serviceType, out taskCompletionSource)) {
taskCompletionSources.Remove(serviceType);
taskCompletionSource.SetResult((dynamic)serviceInstance);
}
}
public void AddService(Type serviceType, object serviceInstance)
{
lock (services) {
IDisposable disposableService = serviceInstance as IDisposable;
if (disposableService != null)
servicesToDispose.Add(disposableService);
services.Add(serviceType, serviceInstance);
OnServiceInitialized(serviceType, serviceInstance);
}
}
@ -108,5 +119,25 @@ namespace ICSharpCode.SharpDevelop @@ -108,5 +119,25 @@ namespace ICSharpCode.SharpDevelop
{
RemoveService(serviceType);
}
public Task<T> GetFutureService<T>()
{
Type serviceType = typeof(T);
lock (services) {
object instance;
if (services.TryGetValue(serviceType, out instance)) {
return Task.FromResult((T)instance);
} else {
object taskCompletionSource;
if (taskCompletionSources.TryGetValue(serviceType, out taskCompletionSource)) {
return ((TaskCompletionSource<T>)taskCompletionSource).Task;
} else {
var tcs = new TaskCompletionSource<T>();
taskCompletionSources.Add(serviceType, tcs);
return tcs.Task;
}
}
}
}
}
}

9
src/Main/SharpDevelop/Project/Build/BuildService.cs

@ -108,10 +108,13 @@ namespace ICSharpCode.SharpDevelop.Project @@ -108,10 +108,13 @@ namespace ICSharpCode.SharpDevelop.Project
public Task<BuildResults> BuildAsync(ISolution solution, BuildOptions options)
{
if (solution != null)
return BuildAsync(solution.Projects, options);
else
if (solution != null) {
var solutionConfiguration = new ConfigurationAndPlatform(options.SolutionConfiguration ?? solution.ActiveConfiguration.Configuration,
options.SolutionPlatform ?? solution.ActiveConfiguration.Platform);
return BuildAsync(solution.Projects.Where(p => p.ConfigurationMapping.IsBuildEnabled(solutionConfiguration)), options);
} else {
return Task.FromResult(new BuildResults { Result = BuildResultCode.Error });
}
}
public Task<BuildResults> BuildInBackgroundAsync(IBuildable buildable, BuildOptions options, IBuildFeedbackSink buildFeedbackSink, IProgressMonitor progressMonitor)

4
src/Main/SharpDevelop/Project/Configuration/ConfigurationMapping.cs

@ -3,6 +3,8 @@ @@ -3,6 +3,8 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics;
using System.Linq;
namespace ICSharpCode.SharpDevelop.Project
@ -49,6 +51,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -49,6 +51,7 @@ namespace ICSharpCode.SharpDevelop.Project
public void SetProjectConfiguration(ConfigurationAndPlatform solutionConfiguration, ConfigurationAndPlatform projectConfiguration)
{
Debug.Assert(projectConfiguration.Platform != "Any CPU");
GetEntry(solutionConfiguration).Config = projectConfiguration;
if (parentSolution != null)
parentSolution.IsDirty = true;
@ -69,6 +72,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -69,6 +72,7 @@ namespace ICSharpCode.SharpDevelop.Project
public void RenameSolutionConfig(string oldName, string newName, bool isPlatform)
{
throw new NotImplementedException();
lock (dict) {
foreach (var pair in dict.ToArray()) {
if (oldName == (isPlatform ? pair.Key.Platform : pair.Key.Configuration)) {

122
src/Main/SharpDevelop/Project/ProjectService.cs

@ -3,11 +3,13 @@ @@ -3,11 +3,13 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Input;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Workbench;
namespace ICSharpCode.SharpDevelop.Project
{
@ -15,9 +17,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -15,9 +17,7 @@ namespace ICSharpCode.SharpDevelop.Project
{
public SDProjectService()
{
// SD.Workbench.ActiveViewContentChanged += ActiveViewContentChanged;
// FileService.FileRenamed += FileServiceFileRenamed;
// FileService.FileRemoved += FileServiceFileRemoved;
SD.GetFutureService<IWorkbench>().ContinueWith(t => t.Result.ActiveViewContentChanged += ActiveViewContentChanged);
var applicationStateInfoService = SD.GetService<ApplicationStateInfoService>();
if (applicationStateInfoService != null) {
@ -46,6 +46,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -46,6 +46,7 @@ namespace ICSharpCode.SharpDevelop.Project
if (value != null)
allProjects.Inputs.Add(value.Projects);
CommandManager.InvalidateRequerySuggested();
SD.ParserService.InvalidateCurrentSolutionSnapshot();
}
}
}
@ -73,6 +74,21 @@ namespace ICSharpCode.SharpDevelop.Project @@ -73,6 +74,21 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
}
void ActiveViewContentChanged(object sender, EventArgs e)
{
IViewContent viewContent = SD.Workbench.ActiveViewContent;
if (currentSolution == null || viewContent == null) {
return;
}
FileName fileName = viewContent.PrimaryFileName;
if (fileName == null) {
return;
}
IProject project = FindProjectContainingFile(fileName);
if (project != null)
CurrentProject = project;
}
#endregion
#region FindProjectContainingFile
@ -104,6 +120,8 @@ namespace ICSharpCode.SharpDevelop.Project @@ -104,6 +120,8 @@ namespace ICSharpCode.SharpDevelop.Project
#endregion
#region OpenSolutionOrProject
public event EventHandler<SolutionEventArgs> SolutionLoaded = delegate {};
public void OpenSolutionOrProject(FileName fileName)
{
if (!IsProjectOrSolutionFile(fileName)) {
@ -117,12 +135,96 @@ namespace ICSharpCode.SharpDevelop.Project @@ -117,12 +135,96 @@ namespace ICSharpCode.SharpDevelop.Project
void OpenSolutionOrProjectInternal(FileName fileName)
{
using (var progress = AsynchronousWaitDialog.ShowWaitDialog("Loading Solution")) {
ISolution solution;
using (var progress = AsynchronousWaitDialog.ShowWaitDialog("Loading Solution...")) {
solution = LoadSolutionFile(fileName, progress);
//(openSolution.Preferences as IMementoCapable).SetMemento(solutionProperties);
ISolution solution = LoadSolutionFile(fileName, progress);
throw new NotImplementedException();
// try {
// ApplyConfigurationAndReadProjectPreferences();
// } catch (Exception ex) {
// MessageService.ShowException(ex);
// }
this.CurrentSolution = solution;
}
SolutionLoaded(this, new SolutionEventArgs(solution));
SD.FileService.RecentOpen.AddRecentProject(solution.FileName);
Project.Converter.UpgradeViewContent.ShowIfRequired(solution);
}
/*
static void LoadProjectInternal(string fileName)
{
if (!Path.IsPathRooted(fileName))
throw new ArgumentException("Path must be rooted!");
string solutionFile = Path.ChangeExtension(fileName, ".sln");
if (File.Exists(solutionFile)) {
LoadSolutionInternal(solutionFile);
if (openSolution != null) {
bool found = false;
foreach (IProject p in openSolution.Projects) {
if (FileUtility.IsEqualFileName(fileName, p.FileName)) {
found = true;
break;
}
}
if (found == false) {
var parseArgs = new[] { new StringTagPair("SolutionName", Path.GetFileName(solutionFile)), new StringTagPair("ProjectName", Path.GetFileName(fileName))};
int res = MessageService.ShowCustomDialog(MessageService.ProductName,
StringParser.Parse("${res:ICSharpCode.SharpDevelop.Commands.OpenCombine.SolutionDoesNotContainProject}", parseArgs),
0, 2,
StringParser.Parse("${res:ICSharpCode.SharpDevelop.Commands.OpenCombine.SolutionDoesNotContainProject.AddProjectToSolution}", parseArgs),
StringParser.Parse("${res:ICSharpCode.SharpDevelop.Commands.OpenCombine.SolutionDoesNotContainProject.CreateNewSolution}", parseArgs),
"${res:Global.IgnoreButtonText}");
if (res == 0) {
// Add project to solution
Commands.AddExistingProjectToSolution.AddProject((ISolutionItemNode)ProjectBrowserPad.Instance.SolutionNode, FileName.Create(fileName));
SaveSolution();
return;
} else if (res == 1) {
CloseSolution();
try {
File.Copy(solutionFile, Path.ChangeExtension(solutionFile, ".old.sln"), true);
} catch (IOException){}
} else {
// ignore, just open the solution
return;
}
} else {
// opened solution instead and correctly found the project
return;
}
} else {
// some problem during opening, abort
return;
}
}
ISolution solution = new Solution(new ProjectChangeWatcher(solutionFile));
solution.Name = Path.GetFileNameWithoutExtension(fileName);
IProjectBinding binding = ProjectBindingService.GetBindingPerProjectFile(fileName);
IProject project;
if (binding != null) {
project = ProjectBindingService.LoadProject(new ProjectLoadInformation(solution, FileName.Create(fileName), solution.Name));
if (project is UnknownProject) {
if (((UnknownProject)project).WarningDisplayedToUser == false) {
((UnknownProject)project).ShowWarningMessageBox();
}
return;
}
} else {
MessageService.ShowError(StringParser.Parse("${res:ICSharpCode.SharpDevelop.Commands.OpenCombine.InvalidProjectOrCombine}", new StringTagPair("FileName", fileName)));
return;
}
solution.AddFolder(project);
if (FileUtility.ObservedSave((NamedFileOperationDelegate)solution.Save, solutionFile) == FileOperationResult.OK) {
// only load when saved succesfully
LoadSolution(solutionFile);
}
}*/
#endregion
#region CloseSolution
@ -141,6 +243,8 @@ namespace ICSharpCode.SharpDevelop.Project @@ -141,6 +243,8 @@ namespace ICSharpCode.SharpDevelop.Project
if (allowCancel && cancelEventArgs.Cancel)
return false;
solution.SavePreferences();
if (!SD.Workbench.CloseAllSolutionViews(force: !allowCancel))
return false;
@ -175,6 +279,12 @@ namespace ICSharpCode.SharpDevelop.Project @@ -175,6 +279,12 @@ namespace ICSharpCode.SharpDevelop.Project
#region LoadSolutionFile + CreateEmptySolutionFile
public ISolution LoadSolutionFile(FileName fileName, IProgressMonitor progress)
{
if (fileName == null)
throw new ArgumentNullException("fileName");
if (progress == null)
throw new ArgumentNullException("progress");
if (!Path.IsPathRooted(fileName))
throw new ArgumentException("Path must be rooted!");
Solution solution = new Solution(fileName, new ProjectChangeWatcher(fileName), SD.FileService);
bool ok = false;
try {

96
src/Main/SharpDevelop/Project/Solution.cs

@ -12,7 +12,7 @@ using ICSharpCode.SharpDevelop.Workbench; @@ -12,7 +12,7 @@ using ICSharpCode.SharpDevelop.Workbench;
namespace ICSharpCode.SharpDevelop.Project
{
class Solution : SolutionFolder, ISolution
class Solution : SolutionFolder, ISolution, ISolutionInternal
{
FileName fileName;
DirectoryName directory;
@ -109,12 +109,14 @@ namespace ICSharpCode.SharpDevelop.Project @@ -109,12 +109,14 @@ namespace ICSharpCode.SharpDevelop.Project
void OnProjectAdded(IProject project)
{
projects.Add(project);
project.ProjectSections.CollectionChanged += OnProjectSectionsChanged;
if (startupProject == null && AutoDetectStartupProject() == project)
this.StartupProject = project; // when there's no startable project in the solution and one is added, we mark that it as the startup project
}
void OnProjectRemoved(IProject project)
{
project.ProjectSections.CollectionChanged -= OnProjectSectionsChanged;
bool wasStartupProject = (startupProject == project);
if (wasStartupProject)
startupProject = null; // this will force auto-detection on the next property access
@ -129,6 +131,12 @@ namespace ICSharpCode.SharpDevelop.Project @@ -129,6 +131,12 @@ namespace ICSharpCode.SharpDevelop.Project
}, DispatcherPriority.Background);
}
void OnProjectSectionsChanged(object sender, EventArgs e)
{
this.IsDirty = true;
// TODO: also monitor changes within the project section
}
internal void ReportRemovedItem(ISolutionItem oldItem)
{
if (oldItem is ISolutionFolder) {
@ -149,7 +157,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -149,7 +157,7 @@ namespace ICSharpCode.SharpDevelop.Project
ReportAddedItem(childItem);
}
} else if (newItem is IProject) {
OnProjectRemoved((IProject)newItem);
OnProjectAdded((IProject)newItem);
}
}
#endregion
@ -197,11 +205,86 @@ namespace ICSharpCode.SharpDevelop.Project @@ -197,11 +205,86 @@ namespace ICSharpCode.SharpDevelop.Project
// - we avoid an expensive configuration switch during solution load.
}
/*
static Properties LoadSolutionPreferences(string solutionFileName)
{
try {
string file = GetPreferenceFileName(solutionFileName);
if (FileUtility.IsValidPath(file) && File.Exists(file)) {
try {
return Properties.Load(file);
} catch (IOException) {
} catch (UnauthorizedAccessException) {
} catch (XmlException) {
// ignore errors about inaccessible or malformed files
}
}
} catch (Exception ex) {
MessageService.ShowException(ex);
}
return new Properties();
}
static void ApplyConfigurationAndReadProjectPreferences()
{
openSolution.ApplySolutionConfigurationAndPlatformToProjects();
foreach (IProject project in openSolution.Projects) {
string file = GetPreferenceFileName(project.FileName);
if (FileUtility.IsValidPath(file) && File.Exists(file)) {
Properties properties = null;
try {
properties = Properties.Load(file);
} catch (IOException) {
} catch (UnauthorizedAccessException) {
} catch (XmlException) {
// ignore errors about inaccessible or malformed files
}
if (properties != null)
project.SetMemento(properties);
}
}
}
*/
public void SavePreferences()
{
preferences.Set("ActiveConfiguration.Configuration", activeConfiguration.Configuration);
preferences.Set("ActiveConfiguration.Platform", activeConfiguration.Platform);
// TODO: save to disk
/*
string directory = Path.Combine(PropertyService.ConfigDirectory, "preferences");
if (!Directory.Exists(directory)) {
Directory.CreateDirectory(directory);
}
if (SolutionPreferencesSaving != null)
SolutionPreferencesSaving(null, new SolutionEventArgs(openSolution));
Properties memento = openSolution.Preferences.Clone();
string fullFileName = GetPreferenceFileName(openSolution.FileName);
if (FileUtility.IsValidPath(fullFileName)) {
#if DEBUG
memento.Save(fullFileName);
#else
FileUtility.ObservedSave(new NamedFileOperationDelegate(memento.Save), fullFileName, FileErrorPolicy.Inform);
#endif
}
foreach (IProject project in OpenSolution.Projects) {
memento = project.CreateMemento();
if (memento == null) continue;
fullFileName = GetPreferenceFileName(project.FileName);
if (FileUtility.IsValidPath(fullFileName)) {
#if DEBUG
memento.Save(fullFileName);
#else
FileUtility.ObservedSave(new NamedFileOperationDelegate(memento.Save), fullFileName, FileErrorPolicy.Inform);
#endif
}
}*/
}
#endregion
@ -392,6 +475,15 @@ namespace ICSharpCode.SharpDevelop.Project @@ -392,6 +475,15 @@ namespace ICSharpCode.SharpDevelop.Project
}
#endregion
#region ISolutionInternal implementation
IConfigurationMapping ISolutionInternal.CreateMappingForNewProject()
{
return new ConfigurationMapping(this);
}
#endregion
public override string ToString()
{
return "[Solution " + fileName + " with " + projects.Count + " projects]";

17
src/Main/SharpDevelop/Project/SolutionFolder.cs

@ -134,12 +134,25 @@ namespace ICSharpCode.SharpDevelop.Project @@ -134,12 +134,25 @@ namespace ICSharpCode.SharpDevelop.Project
public IProject AddExistingProject(FileName fileName)
{
throw new NotImplementedException();
ProjectLoadInformation loadInfo = new ProjectLoadInformation(parentSolution, fileName, fileName.GetFileNameWithoutExtension());
loadInfo.ConfigurationMapping = new ConfigurationMapping(parentSolution);
loadInfo.ProjectConfiguration = loadInfo.ConfigurationMapping.GetProjectConfiguration(parentSolution.ActiveConfiguration);
var descriptor = ProjectBindingService.GetCodonPerProjectFile(fileName);
if (descriptor != null) {
loadInfo.TypeGuid = descriptor.Guid;
}
IProject project = ProjectBindingService.LoadProject(loadInfo);
Debug.Assert(project.IdGuid != Guid.Empty);
this.Items.Add(project);
return project;
}
public ISolutionFileItem AddFile(FileName fileName)
{
throw new NotImplementedException();
var newItem = new SolutionFileItem(parentSolution);
newItem.FileName = fileName;
this.Items.Add(newItem);
return newItem;
}
public ISolutionFolder CreateFolder(string name)

Loading…
Cancel
Save