Browse Source

Move project service events to IProjectService interface.

pull/32/merge
Daniel Grunwald 13 years ago
parent
commit
c2c89c7014
  1. 2
      src/AddIns/BackendBindings/CppBinding/CppBinding/Project/ApplicationOptions.cs
  2. 2
      src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs
  3. 2
      src/AddIns/Misc/PackageManagement/Test/Src/InstallProjectTemplatePackagesCommandTests.cs
  4. 5
      src/Main/Base/Project/Dom/IModelCollection.cs
  5. 5
      src/Main/Base/Project/Dom/ITypeDefinitionModelCollection.cs
  6. 43
      src/Main/Base/Project/Dom/ImmutableModelCollection.cs
  7. 7
      src/Main/Base/Project/Dom/ModelCollectionLinq.cs
  8. 22
      src/Main/Base/Project/Dom/ReadOnlyModelCollection.cs
  9. 5
      src/Main/Base/Project/Dom/SimpleModelCollection.cs
  10. 10
      src/Main/Base/Project/Dom/SynchronizedModelCollection.cs
  11. 2
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  12. 2
      src/Main/Base/Project/Parser/ProjectContentContainer.cs
  13. 19
      src/Main/Base/Project/Project/IProjectService.cs
  14. 6
      src/Main/Base/Project/Project/ISolution.cs
  15. 6
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPad.cs
  16. 2
      src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs
  17. 12
      src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs
  18. 1
      src/Main/Base/Project/Src/Internal/Templates/Project/SolutionDescriptor.cs
  19. 2
      src/Main/Base/Project/Src/Project/AbstractProject.cs
  20. 75
      src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs
  21. 5
      src/Main/SharpDevelop/Dom/NestedTypeDefinitionModelCollection.cs
  22. 9
      src/Main/SharpDevelop/Dom/TopLevelTypeDefinitionModelCollection.cs
  23. 5
      src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs
  24. 5
      src/Main/SharpDevelop/Project/Configuration/SolutionConfigurationOrPlatformNameCollection.cs
  25. 35
      src/Main/SharpDevelop/Project/ProjectService.cs
  26. 8
      src/Main/SharpDevelop/Project/Solution.cs

2
src/AddIns/BackendBindings/CppBinding/CppBinding/Project/ApplicationOptions.cs

@ -329,7 +329,7 @@ namespace ICSharpCode.CppBinding.Project
string fileName = Path.Combine(project.Directory, rcFileName); string fileName = Path.Combine(project.Directory, rcFileName);
FileProjectItem rcFileItem = new FileProjectItem(project, project.GetDefaultItemType(fileName)); FileProjectItem rcFileItem = new FileProjectItem(project, project.GetDefaultItemType(fileName));
rcFileItem.Include = FileUtility.GetRelativePath(project.Directory, fileName); rcFileItem.Include = FileUtility.GetRelativePath(project.Directory, fileName);
((IProjectItemListProvider)project).AddProjectItem(rcFileItem); ProjectService.AddProjectItem(project, rcFileItem);
return fileName; return fileName;
} }

2
src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs

@ -45,7 +45,7 @@ namespace ICSharpCode.PackageManagement.Design
public void AddProject(IProject project) public void AddProject(IProject project)
{ {
ProjectCollections.Add(new ReadOnlyModelCollection<IProject>(new[] { project })); ProjectCollections.Add(new ImmutableModelCollection<IProject>(new[] { project }));
} }
public void AddProjectItem(IProject project, ProjectItem item) public void AddProjectItem(IProject project, ProjectItem item)

2
src/AddIns/Misc/PackageManagement/Test/Src/InstallProjectTemplatePackagesCommandTests.cs

@ -41,7 +41,7 @@ namespace PackageManagement.Tests
var createInfo = new ProjectCreateOptions(); var createInfo = new ProjectCreateOptions();
createInfo.CreatedProjects.AddRange(projects); createInfo.CreatedProjects.AddRange(projects);
command.FakeProjectService.ProjectCollections.Add(new ReadOnlyModelCollection<IProject>(projects)); command.FakeProjectService.ProjectCollections.Add(new ImmutableModelCollection<IProject>(projects));
RunCommandWithProjectCreateInfoAsOwner(createInfo); RunCommandWithProjectCreateInfoAsOwner(createInfo);
} }

5
src/Main/Base/Project/Dom/IModelCollection.cs

@ -29,6 +29,11 @@ namespace ICSharpCode.SharpDevelop.Dom
public interface IModelCollection<out T> : IReadOnlyCollection<T> public interface IModelCollection<out T> : IReadOnlyCollection<T>
{ {
event ModelCollectionChangedEventHandler<T> CollectionChanged; event ModelCollectionChangedEventHandler<T> CollectionChanged;
/// <summary>
/// Creates an immutable snapshot of the collection.
/// </summary>
IReadOnlyCollection<T> CreateSnapshot();
} }
/// <summary> /// <summary>

5
src/Main/Base/Project/Dom/ITypeDefinitionModelCollection.cs

@ -43,6 +43,11 @@ namespace ICSharpCode.SharpDevelop.Dom
remove { } remove { }
} }
IReadOnlyCollection<ITypeDefinitionModel> IModelCollection<ITypeDefinitionModel>.CreateSnapshot()
{
return this; // already immutable
}
ITypeDefinitionModel ITypeDefinitionModelCollection.this[FullTypeName name] { ITypeDefinitionModel ITypeDefinitionModelCollection.this[FullTypeName name] {
get { return null; } get { return null; }
} }

43
src/Main/Base/Project/Dom/ImmutableModelCollection.cs

@ -0,0 +1,43 @@
// 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.ObjectModel;
using System.Linq;
namespace ICSharpCode.SharpDevelop.Dom
{
/// <summary>
/// An immutable model collection.
/// </summary>
public class ImmutableModelCollection<T> : ReadOnlyCollection<T>, IModelCollection<T>, IMutableModelCollection<T>
{
public ImmutableModelCollection(IEnumerable<T> items)
: base(items.ToList())
{
}
event ModelCollectionChangedEventHandler<T> IModelCollection<T>.CollectionChanged { add {} remove {} }
IReadOnlyCollection<T> IModelCollection<T>.CreateSnapshot()
{
return this;
}
void IMutableModelCollection<T>.AddRange(IEnumerable<T> items)
{
throw new NotSupportedException();
}
int IMutableModelCollection<T>.RemoveAll(System.Predicate<T> predicate)
{
throw new NotSupportedException();
}
IDisposable IMutableModelCollection<T>.BatchUpdate()
{
return null;
}
}
}

7
src/Main/Base/Project/Dom/ModelCollectionLinq.cs

@ -29,7 +29,7 @@ namespace ICSharpCode.SharpDevelop.Dom
public static IModelCollection<TResult> Select<TSource, TResult>(this IModelCollection<TSource> source, Func<TSource, TResult> selector) public static IModelCollection<TResult> Select<TSource, TResult>(this IModelCollection<TSource> source, Func<TSource, TResult> selector)
{ {
// HACK: emulating Select with SelectMany is much less efficient than a direct implementation could be // HACK: emulating Select with SelectMany is much less efficient than a direct implementation could be
return SelectMany(source, item => new ReadOnlyModelCollection<TSource>(new[] { item }), (a, b) => selector(b)); return SelectMany(source, item => new ImmutableModelCollection<TSource>(new[] { item }), (a, b) => selector(b));
} }
#endregion #endregion
@ -170,6 +170,11 @@ namespace ICSharpCode.SharpDevelop.Dom
} }
} }
IReadOnlyCollection<TResult> IModelCollection<TResult>.CreateSnapshot()
{
return this.ToList();
}
public IEnumerator<TResult> GetEnumerator() public IEnumerator<TResult> GetEnumerator()
{ {
return source.AsEnumerable().SelectMany(collectionSelector, resultSelector).GetEnumerator(); return source.AsEnumerable().SelectMany(collectionSelector, resultSelector).GetEnumerator();

22
src/Main/Base/Project/Dom/ReadOnlyModelCollection.cs

@ -1,22 +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.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
namespace ICSharpCode.SharpDevelop.Dom
{
/// <summary>
/// A model collection implementation that is based on a ReadOnlyCollection.
/// </summary>
public class ReadOnlyModelCollection<T> : ReadOnlyCollection<T>, IModelCollection<T>
{
public ReadOnlyModelCollection(IEnumerable<T> items)
: base(items.ToList())
{
}
event ModelCollectionChangedEventHandler<T> IModelCollection<T>.CollectionChanged { add {} remove {} }
}
}

5
src/Main/Base/Project/Dom/SimpleModelCollection.cs

@ -85,6 +85,11 @@ namespace ICSharpCode.SharpDevelop.Dom
#region Read-Only list access #region Read-Only list access
public IReadOnlyCollection<T> CreateSnapshot()
{
return list.ToArray();
}
public int Count { public int Count {
get { return list.Count; } get { return list.Count; }
} }

10
src/Main/Base/Project/Dom/SynchronizedModelCollection.cs

@ -89,6 +89,12 @@ namespace ICSharpCode.SharpDevelop.Dom
#endregion #endregion
#region ICollection implementation #region ICollection implementation
public IReadOnlyCollection<T> CreateSnapshot()
{
lock (syncRoot) {
return underlyingCollection.CreateSnapshot();
}
}
public bool Contains(T item) public bool Contains(T item)
{ {
@ -124,9 +130,7 @@ namespace ICSharpCode.SharpDevelop.Dom
{ {
IEnumerable<T> snapshot; IEnumerable<T> snapshot;
lock (syncRoot) { lock (syncRoot) {
T[] array = new T[underlyingCollection.Count]; snapshot = underlyingCollection.CreateSnapshot();
underlyingCollection.CopyTo(array, 0);
snapshot = array;
} }
return snapshot.GetEnumerator(); return snapshot.GetEnumerator();
} }

2
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -93,7 +93,7 @@
<Compile Include="Dom\IModelCollection.cs" /> <Compile Include="Dom\IModelCollection.cs" />
<Compile Include="Dom\ITreeNodeFactory.cs" /> <Compile Include="Dom\ITreeNodeFactory.cs" />
<Compile Include="Dom\ModelCollectionLinq.cs" /> <Compile Include="Dom\ModelCollectionLinq.cs" />
<Compile Include="Dom\ReadOnlyModelCollection.cs" /> <Compile Include="Dom\ImmutableModelCollection.cs" />
<Compile Include="Dom\SimpleModelCollection.cs" /> <Compile Include="Dom\SimpleModelCollection.cs" />
<Compile Include="Dom\SynchronizedModelCollection.cs" /> <Compile Include="Dom\SynchronizedModelCollection.cs" />
<Compile Include="Editor\AvalonEditTextEditorAdapter.cs" /> <Compile Include="Editor\AvalonEditTextEditorAdapter.cs" />

2
src/Main/Base/Project/Parser/ProjectContentContainer.cs

@ -286,7 +286,7 @@ namespace ICSharpCode.SharpDevelop.Parser
} }
} }
double scalingFactor = 1.0 / (project.Items.Count + LoadingReferencesWorkAmount); double scalingFactor = 1.0 / (projectItems.Count + LoadingReferencesWorkAmount);
using (IProgressMonitor initReferencesProgressMonitor = progressMonitor.CreateSubTask(LoadingReferencesWorkAmount * scalingFactor), using (IProgressMonitor initReferencesProgressMonitor = progressMonitor.CreateSubTask(LoadingReferencesWorkAmount * scalingFactor),
parseProgressMonitor = progressMonitor.CreateSubTask(projectItems.Count * scalingFactor)) parseProgressMonitor = progressMonitor.CreateSubTask(projectItems.Count * scalingFactor))
{ {

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

@ -129,5 +129,24 @@ namespace ICSharpCode.SharpDevelop.Project
/// This method is thread-safe. /// This method is thread-safe.
/// </remarks> /// </remarks>
ISolution CreateEmptySolutionFile(FileName fileName); ISolution CreateEmptySolutionFile(FileName fileName);
/// <summary>
/// Is raised when a new project is created.
/// </summary>
event EventHandler<ProjectEventArgs> ProjectCreated;
event EventHandler<SolutionEventArgs> SolutionCreated;
event EventHandler<ProjectItemEventArgs> ProjectItemAdded;
event EventHandler<ProjectItemEventArgs> ProjectItemRemoved;
}
public interface IProjectServiceRaiseEvents
{
void RaiseProjectCreated(ProjectEventArgs e);
void RaiseSolutionCreated(SolutionEventArgs e);
void RaiseProjectItemAdded(ProjectItemEventArgs e);
void RaiseProjectItemRemoved(ProjectItemEventArgs e);
} }
} }

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

@ -78,6 +78,12 @@ namespace ICSharpCode.SharpDevelop.Project
/// </summary> /// </summary>
Properties Preferences { get; } Properties Preferences { get; }
/// <summary>
/// This event is raised by <see cref="SavePreferences"/> immediately before the preferences are saved to disk.
/// It can be used to set additional data on the preferences at the last moment.
/// </summary>
event EventHandler PreferencesSaving;
/// <summary> /// <summary>
/// Saves the preferences for this solution; and also for any projects within this solution. /// Saves the preferences for this solution; and also for any projects within this solution.
/// </summary> /// </summary>

6
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPad.cs

@ -78,7 +78,6 @@ namespace ICSharpCode.SharpDevelop.Project
instance = this; instance = this;
ProjectService.SolutionLoaded += ProjectServiceSolutionLoaded; ProjectService.SolutionLoaded += ProjectServiceSolutionLoaded;
ProjectService.SolutionClosed += ProjectServiceSolutionClosed; ProjectService.SolutionClosed += ProjectServiceSolutionClosed;
ProjectService.SolutionPreferencesSaving += ProjectServiceSolutionPreferencesSaving;
SD.Workbench.ActiveContentChanged += ActiveContentChanged; SD.Workbench.ActiveContentChanged += ActiveContentChanged;
if (ProjectService.OpenSolution != null) { if (ProjectService.OpenSolution != null) {
@ -92,9 +91,9 @@ namespace ICSharpCode.SharpDevelop.Project
ProjectBrowserControl.TreeView.StartLabelEdit(node); ProjectBrowserControl.TreeView.StartLabelEdit(node);
} }
void ProjectServiceSolutionPreferencesSaving(object sender, SolutionEventArgs e) void SolutionPreferencesSaving(object sender, EventArgs e)
{ {
projectBrowserPanel.StoreViewState(e.Solution.Preferences); projectBrowserPanel.StoreViewState(((ISolution)sender).Preferences);
} }
void ProjectServiceSolutionLoaded(object sender, SolutionEventArgs e) void ProjectServiceSolutionLoaded(object sender, SolutionEventArgs e)
@ -117,6 +116,7 @@ namespace ICSharpCode.SharpDevelop.Project
this.solutionToLoadWhenHandleIsCreated = null; this.solutionToLoadWhenHandleIsCreated = null;
projectBrowserPanel.ViewSolution(solution); projectBrowserPanel.ViewSolution(solution);
projectBrowserPanel.ReadViewState(solution.Preferences); projectBrowserPanel.ReadViewState(solution.Preferences);
solution.PreferencesSaving += SolutionPreferencesSaving;
} }
} }

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

@ -506,7 +506,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
project.Save(); project.Save();
ProjectService.OnProjectCreated(new ProjectEventArgs(project)); SD.GetRequiredService<IProjectServiceRaiseEvents>().RaiseProjectCreated(new ProjectEventArgs(project));
projectCreateOptions.CreatedProjects.Add(project); projectCreateOptions.CreatedProjects.Add(project);
success = true; success = true;
return project; return project;

12
src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs

@ -318,22 +318,24 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
public ISolution CreateSolution(ProjectCreateOptions projectCreateInformation) public ISolution CreateSolution(ProjectCreateOptions projectCreateInformation)
{ {
LoggingService.Info("Creating solution from template '" + this.Category + "/" + this.Subcategory + "/" + this.Name + "'"); LoggingService.Info("Creating solution from template '" + this.Category + "/" + this.Subcategory + "/" + this.Name + "'");
ISolution solution;
if (solutionDescriptor != null) { if (solutionDescriptor != null) {
return solutionDescriptor.CreateSolution(projectCreateInformation, this.languagename); solution = solutionDescriptor.CreateSolution(projectCreateInformation, this.languagename);
} else { } else {
FileName fileName = FileName.Create(Path.Combine(projectCreateInformation.SolutionPath, projectCreateInformation.SolutionName + ".sln")); FileName fileName = FileName.Create(Path.Combine(projectCreateInformation.SolutionPath, projectCreateInformation.SolutionName + ".sln"));
ISolution solution = SD.ProjectService.CreateEmptySolutionFile(fileName); solution = SD.ProjectService.CreateEmptySolutionFile(fileName);
IProject project = projectDescriptor.CreateProject(solution, projectCreateInformation, this.languagename); IProject project = projectDescriptor.CreateProject(solution, projectCreateInformation, this.languagename);
if (project != null) { if (project != null) {
solution.Items.Add(project); solution.Items.Add(project);
solution.Save(); solution.Save();
ProjectService.OnSolutionCreated(new SolutionEventArgs(solution));
return solution;
} else { } else {
solution.Dispose(); solution.Dispose();
return null; solution = null;
} }
} }
if (solution != null)
SD.GetRequiredService<IProjectServiceRaiseEvents>().RaiseSolutionCreated(new SolutionEventArgs(solution));
return solution;
} }
public IProject CreateProject(ISolution solution, ProjectCreateOptions projectCreateInformation) public IProject CreateProject(ISolution solution, ProjectCreateOptions projectCreateInformation)

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

@ -110,7 +110,6 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
} else { } else {
newSolution.Save(); newSolution.Save();
} }
ProjectService.OnSolutionCreated(new SolutionEventArgs(newSolution));
return newSolution; return newSolution;
} }

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

@ -207,7 +207,7 @@ namespace ICSharpCode.SharpDevelop.Project
} }
} }
sealed class ReadOnlyConfigurationOrPlatformNameCollection : ReadOnlyModelCollection<string>, IConfigurationOrPlatformNameCollection sealed class ReadOnlyConfigurationOrPlatformNameCollection : ImmutableModelCollection<string>, IConfigurationOrPlatformNameCollection
{ {
public ReadOnlyConfigurationOrPlatformNameCollection(IEnumerable<string> items) public ReadOnlyConfigurationOrPlatformNameCollection(IEnumerable<string> items)
: base(items) : base(items)

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

@ -63,7 +63,9 @@ namespace ICSharpCode.SharpDevelop.Project
IProjectItemListProvider provider = project as IProjectItemListProvider; IProjectItemListProvider provider = project as IProjectItemListProvider;
if (provider != null) { if (provider != null) {
provider.AddProjectItem(item); provider.AddProjectItem(item);
OnProjectItemAdded(new ProjectItemEventArgs(project, item)); IProjectServiceRaiseEvents re = SD.GetService<IProjectServiceRaiseEvents>();
if (re != null)
re.RaiseProjectItemAdded(new ProjectItemEventArgs(project, item));
} }
} }
@ -79,7 +81,9 @@ namespace ICSharpCode.SharpDevelop.Project
IProjectItemListProvider provider = project as IProjectItemListProvider; IProjectItemListProvider provider = project as IProjectItemListProvider;
if (provider != null) { if (provider != null) {
if (provider.RemoveProjectItem(item)) { if (provider.RemoveProjectItem(item)) {
OnProjectItemRemoved(new ProjectItemEventArgs(project, item)); IProjectServiceRaiseEvents re = SD.GetService<IProjectServiceRaiseEvents>();
if (re != null)
re.RaiseProjectItemRemoved(new ProjectItemEventArgs(project, item));
} }
} }
} }
@ -101,6 +105,9 @@ namespace ICSharpCode.SharpDevelop.Project
//FileUtility.ObservedLoad(LoadProjectInternal, fileName); //FileUtility.ObservedLoad(LoadProjectInternal, fileName);
} }
/// <summary>
/// Saves the current solution and all of its projects.
/// </summary>
public static void SaveSolution() public static void SaveSolution()
{ {
var openSolution = SD.ProjectService.CurrentSolution; var openSolution = SD.ProjectService.CurrentSolution;
@ -148,76 +155,58 @@ namespace ICSharpCode.SharpDevelop.Project
return b.ToString(); return b.ToString();
} }
[Obsolete] [Obsolete("Use SD.BuildService.IsBuilding instead")]
public static bool IsBuilding { public static bool IsBuilding {
get { get {
return SD.BuildService.IsBuilding; return SD.BuildService.IsBuilding;
} }
} }
internal static void OnProjectItemAdded(ProjectItemEventArgs e)
{
if (ProjectItemAdded != null) {
ProjectItemAdded(null, e);
}
}
internal static void OnProjectItemRemoved(ProjectItemEventArgs e)
{
if (ProjectItemRemoved != null) {
ProjectItemRemoved(null, e);
}
}
internal static void OnProjectCreated(ProjectEventArgs e)
{
if (ProjectCreated != null) {
ProjectCreated(null, e);
}
}
internal static void OnSolutionCreated(SolutionEventArgs e)
{
if (SolutionCreated != null) {
SolutionCreated(null, e);
}
}
/// <summary> /// <summary>
/// Is raised when a new project is created. /// Is raised when a new project is created.
/// </summary> /// </summary>
public static event EventHandler<ProjectEventArgs> ProjectCreated; [Obsolete("Use SD.ProjectService.ProjectCreated instead")]
public static event EventHandler<SolutionEventArgs> SolutionCreated; public static event EventHandler<ProjectEventArgs> ProjectCreated {
add { SD.ProjectService.ProjectCreated += value; }
remove { SD.ProjectService.ProjectCreated -= value; }
}
[Obsolete("Use SD.ProjectService.SolutionCreated instead")]
public static event EventHandler<SolutionEventArgs> SolutionCreated {
add { SD.ProjectService.SolutionCreated += value; }
remove { SD.ProjectService.SolutionCreated -= value; }
}
[Obsolete("Use SD.BuildService.BuildStarted instead")]
public static event EventHandler<BuildEventArgs> BuildStarted { public static event EventHandler<BuildEventArgs> BuildStarted {
add { SD.BuildService.BuildStarted += value; } add { SD.BuildService.BuildStarted += value; }
remove { SD.BuildService.BuildStarted -= value; } remove { SD.BuildService.BuildStarted -= value; }
} }
[Obsolete("Use SD.BuildService.BuildFinished instead")]
public static event EventHandler<BuildEventArgs> BuildFinished { public static event EventHandler<BuildEventArgs> BuildFinished {
add { SD.BuildService.BuildFinished += value; } add { SD.BuildService.BuildFinished += value; }
remove { SD.BuildService.BuildFinished -= value; } remove { SD.BuildService.BuildFinished -= value; }
} }
[Obsolete("Use SD.ProjectService.SolutionOpened instead")]
public static event EventHandler<SolutionEventArgs> SolutionLoaded { public static event EventHandler<SolutionEventArgs> SolutionLoaded {
add { SD.ProjectService.SolutionOpened += value; } add { SD.ProjectService.SolutionOpened += value; }
remove { SD.ProjectService.SolutionOpened -= value; } remove { SD.ProjectService.SolutionOpened -= value; }
} }
[Obsolete("Use SD.ProjectService.SolutionClosed instead")]
public static event EventHandler<SolutionEventArgs> SolutionClosed { public static event EventHandler<SolutionEventArgs> SolutionClosed {
add { SD.ProjectService.SolutionClosed += value; } add { SD.ProjectService.SolutionClosed += value; }
remove { SD.ProjectService.SolutionClosed -= value; } remove { SD.ProjectService.SolutionClosed -= value; }
} }
[Obsolete("Use SD.ProjectService.SolutionClosing instead")]
public static event EventHandler<SolutionClosingEventArgs> SolutionClosing { public static event EventHandler<SolutionClosingEventArgs> SolutionClosing {
add { SD.ProjectService.SolutionClosing += value; } add { SD.ProjectService.SolutionClosing += value; }
remove { SD.ProjectService.SolutionClosing -= value; } remove { SD.ProjectService.SolutionClosing -= value; }
} }
/// <summary>
/// Raised before the solution preferences are being saved. Allows you to save
/// your additional properties in the solution preferences.
/// </summary>
public static event EventHandler<SolutionEventArgs> SolutionPreferencesSaving;
static EventAdapter<IProjectService, PropertyChangedEventHandler<IProject>, EventHandler<ProjectEventArgs>> currentProjectChangedAdapter = static EventAdapter<IProjectService, PropertyChangedEventHandler<IProject>, EventHandler<ProjectEventArgs>> currentProjectChangedAdapter =
new EventAdapter<IProjectService, PropertyChangedEventHandler<IProject>, EventHandler<ProjectEventArgs>>( new EventAdapter<IProjectService, PropertyChangedEventHandler<IProject>, EventHandler<ProjectEventArgs>>(
SD.GetService<IProjectService>(), (s, v) => s.CurrentProjectChanged += v, (s, v) => s.CurrentProjectChanged -= v, SD.GetService<IProjectService>(), (s, v) => s.CurrentProjectChanged += v, (s, v) => s.CurrentProjectChanged -= v,
@ -229,7 +218,15 @@ namespace ICSharpCode.SharpDevelop.Project
remove { currentProjectChangedAdapter.Remove(value); } remove { currentProjectChangedAdapter.Remove(value); }
} }
public static event EventHandler<ProjectItemEventArgs> ProjectItemAdded; [Obsolete("Use SD.ProjectService.ProjectItemAdded instead")]
public static event EventHandler<ProjectItemEventArgs> ProjectItemRemoved; public static event EventHandler<ProjectItemEventArgs> ProjectItemAdded {
add { SD.ProjectService.ProjectItemAdded += value; }
remove { SD.ProjectService.ProjectItemAdded -= value; }
}
[Obsolete("Use SD.ProjectService.ProjectItemRemoved instead")]
public static event EventHandler<ProjectItemEventArgs> ProjectItemRemoved {
add { SD.ProjectService.ProjectItemRemoved += value; }
remove { SD.ProjectService.ProjectItemRemoved -= value; }
}
} }
} }

5
src/Main/SharpDevelop/Dom/NestedTypeDefinitionModelCollection.cs

@ -21,6 +21,11 @@ namespace ICSharpCode.SharpDevelop.Dom
public event ModelCollectionChangedEventHandler<ITypeDefinitionModel> CollectionChanged; public event ModelCollectionChangedEventHandler<ITypeDefinitionModel> CollectionChanged;
public IReadOnlyCollection<ITypeDefinitionModel> CreateSnapshot()
{
return list.ToArray();
}
public IEnumerator<ITypeDefinitionModel> GetEnumerator() public IEnumerator<ITypeDefinitionModel> GetEnumerator()
{ {
return list.GetEnumerator(); return list.GetEnumerator();

9
src/Main/SharpDevelop/Dom/TopLevelTypeDefinitionModelCollection.cs

@ -5,6 +5,7 @@ using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Linq;
using ICSharpCode.NRefactory; using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem;
@ -17,7 +18,6 @@ namespace ICSharpCode.SharpDevelop.Dom
{ {
readonly IEntityModelContext context; readonly IEntityModelContext context;
Dictionary<TopLevelTypeName, TypeDefinitionModel> dict = new Dictionary<TopLevelTypeName, TypeDefinitionModel>(); Dictionary<TopLevelTypeName, TypeDefinitionModel> dict = new Dictionary<TopLevelTypeName, TypeDefinitionModel>();
public event ModelCollectionChangedEventHandler<ITypeDefinitionModel> CollectionChanged;
public TopLevelTypeDefinitionModelCollection(IEntityModelContext context) public TopLevelTypeDefinitionModelCollection(IEntityModelContext context)
{ {
@ -26,6 +26,13 @@ namespace ICSharpCode.SharpDevelop.Dom
this.context = context; this.context = context;
} }
public event ModelCollectionChangedEventHandler<ITypeDefinitionModel> CollectionChanged;
public IReadOnlyCollection<ITypeDefinitionModel> CreateSnapshot()
{
return dict.Values.ToArray();
}
public int Count { public int Count {
get { return dict.Count; } get { return dict.Count; }
} }

5
src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs

@ -183,6 +183,11 @@ namespace ICSharpCode.SharpDevelop.Dom
get { return GetCount(lists.Count); } get { return GetCount(lists.Count); }
} }
public IReadOnlyCollection<MemberModel> CreateSnapshot()
{
return this.ToArray();
}
public IEnumerator<MemberModel> GetEnumerator() public IEnumerator<MemberModel> GetEnumerator()
{ {
return lists.SelectMany(i => i).GetEnumerator(); return lists.SelectMany(i => i).GetEnumerator();

5
src/Main/SharpDevelop/Project/Configuration/SolutionConfigurationOrPlatformNameCollection.cs

@ -45,6 +45,11 @@ namespace ICSharpCode.SharpDevelop.Project
#region IReadOnlyCollection implementation #region IReadOnlyCollection implementation
public IReadOnlyCollection<string> CreateSnapshot()
{
return listSnapshot;
}
public int Count { public int Count {
get { get {
return listSnapshot.Count; return listSnapshot.Count;

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

@ -13,10 +13,13 @@ using ICSharpCode.SharpDevelop.Workbench;
namespace ICSharpCode.SharpDevelop.Project namespace ICSharpCode.SharpDevelop.Project
{ {
sealed class SDProjectService : IProjectService sealed class SDProjectService : IProjectService, IProjectServiceRaiseEvents
{ {
public SDProjectService() public SDProjectService()
{ {
allSolutions = new SimpleModelCollection<ISolution>();
allProjects = allSolutions.SelectMany(s => s.Projects);
SD.GetFutureService<IWorkbench>().ContinueWith(t => t.Result.ActiveViewContentChanged += ActiveViewContentChanged); SD.GetFutureService<IWorkbench>().ContinueWith(t => t.Result.ActiveViewContentChanged += ActiveViewContentChanged);
var applicationStateInfoService = SD.GetService<ApplicationStateInfoService>(); var applicationStateInfoService = SD.GetService<ApplicationStateInfoService>();
@ -25,8 +28,7 @@ namespace ICSharpCode.SharpDevelop.Project
applicationStateInfoService.RegisterStateGetter("ProjectService.CurrentProject", delegate { return CurrentProject; }); applicationStateInfoService.RegisterStateGetter("ProjectService.CurrentProject", delegate { return CurrentProject; });
} }
allSolutions = new SimpleModelCollection<ISolution>(); SD.Services.AddService(typeof(IProjectServiceRaiseEvents), this);
allProjects = allSolutions.SelectMany(s => s.Projects);
} }
#region CurrentSolution property + AllProjects collection #region CurrentSolution property + AllProjects collection
@ -333,5 +335,32 @@ namespace ICSharpCode.SharpDevelop.Project
return solution; return solution;
} }
#endregion #endregion
#region IProjectServiceRaiseEvents
public event EventHandler<ProjectEventArgs> ProjectCreated = delegate { };
public event EventHandler<SolutionEventArgs> SolutionCreated = delegate { };
public event EventHandler<ProjectItemEventArgs> ProjectItemAdded = delegate { };
public event EventHandler<ProjectItemEventArgs> ProjectItemRemoved = delegate { };
void IProjectServiceRaiseEvents.RaiseProjectCreated(ProjectEventArgs e)
{
ProjectCreated(this, e);
}
void IProjectServiceRaiseEvents.RaiseSolutionCreated(SolutionEventArgs e)
{
SolutionCreated(this, e);
}
void IProjectServiceRaiseEvents.RaiseProjectItemAdded(ProjectItemEventArgs e)
{
ProjectItemAdded(this, e);
}
void IProjectServiceRaiseEvents.RaiseProjectItemRemoved(ProjectItemEventArgs e)
{
ProjectItemRemoved(this, e);
}
#endregion
} }
} }

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

@ -277,11 +277,13 @@ namespace ICSharpCode.SharpDevelop.Project
} }
*/ */
public event EventHandler PreferencesSaving = delegate { };
public void SavePreferences() public void SavePreferences()
{ {
preferences.Set("ActiveConfiguration.Configuration", activeConfiguration.Configuration); preferences.Set("ActiveConfiguration.Configuration", activeConfiguration.Configuration);
preferences.Set("ActiveConfiguration.Platform", activeConfiguration.Platform); preferences.Set("ActiveConfiguration.Platform", activeConfiguration.Platform);
PreferencesSaving(this, EventArgs.Empty);
// TODO: save to disk // TODO: save to disk
/* /*
string directory = Path.Combine(PropertyService.ConfigDirectory, "preferences"); string directory = Path.Combine(PropertyService.ConfigDirectory, "preferences");
@ -388,9 +390,9 @@ namespace ICSharpCode.SharpDevelop.Project
if (FileUtility.IsBaseDirectory(project.Directory, oldName)) { if (FileUtility.IsBaseDirectory(project.Directory, oldName)) {
foreach (ProjectItem item in project.Items) { foreach (ProjectItem item in project.Items) {
if (FileUtility.IsBaseDirectory(oldName, item.FileName)) { if (FileUtility.IsBaseDirectory(oldName, item.FileName)) {
ProjectService.OnProjectItemRemoved(new ProjectItemEventArgs(project, item)); SD.GetRequiredService<IProjectServiceRaiseEvents>().RaiseProjectItemRemoved(new ProjectItemEventArgs(project, item));
item.FileName = FileUtility.RenameBaseDirectory(item.FileName, oldName, newName); item.FileName = FileUtility.RenameBaseDirectory(item.FileName, oldName, newName);
ProjectService.OnProjectItemAdded(new ProjectItemEventArgs(project, item)); SD.GetRequiredService<IProjectServiceRaiseEvents>().RaiseProjectItemAdded(new ProjectItemEventArgs(project, item));
} }
} }
} }
@ -414,7 +416,7 @@ namespace ICSharpCode.SharpDevelop.Project
foreach (ProjectItem item in provider.Items.ToArray()) { foreach (ProjectItem item in provider.Items.ToArray()) {
if (FileUtility.IsBaseDirectory(fileName, item.FileName)) { if (FileUtility.IsBaseDirectory(fileName, item.FileName)) {
provider.RemoveProjectItem(item); provider.RemoveProjectItem(item);
ProjectService.OnProjectItemRemoved(new ProjectItemEventArgs(project, item)); SD.GetRequiredService<IProjectServiceRaiseEvents>().RaiseProjectItemRemoved(new ProjectItemEventArgs(project, item));
} }
} }
} }

Loading…
Cancel
Save