From d0a11e630d59afdf3ec9e7dc62b2bade22fa1da6 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 21 Sep 2012 16:08:27 +0200 Subject: [PATCH] Move bookmark-related classes to new folder structure. --- .../Debugger.AddIn/Pads/BreakPointsPad.cs | 1 + .../Src/AvalonEditViewContent.cs | 1 + .../AvalonEdit.AddIn/Src/CodeEditor.cs | 1 + .../AvalonEdit.AddIn/Src/IconBarManager.cs | 1 + .../AvalonEdit.AddIn/Src/IconBarMargin.cs | 1 + .../ILSpyAddIn/ViewContent/CodeView.cs | 2 + .../ViewContent/DecompiledViewContent.cs | 1 + .../Project/Engine/SearchManager.cs | 3 +- .../Base/Project/Dom/ConcatModelCollection.cs | 3 - .../Base/Project/Dom/FilterModelCollection.cs | 104 +++++++++++++++ .../Base/Project/Dom/SimpleModelCollection.cs | 15 +++ .../{Src => Editor}/Bookmarks/BookmarkBase.cs | 10 +- .../Bookmarks/BookmarkEventArgs.cs} | 4 +- .../Bookmarks/EntityBookmark.cs | 2 +- .../Bookmarks/IBookmark.cs} | 24 +--- .../Editor/Bookmarks/IBookmarkMargin.cs | 28 ++++ .../{Src => Editor}/Bookmarks/SDBookmark.cs | 35 ++--- .../Bookmarks/SDMarkerBookmark.cs | 7 +- .../Project/ICSharpCode.SharpDevelop.csproj | 17 ++- .../Src/Bookmarks/BookmarkConverter.cs | 123 ------------------ .../Project/Src/Bookmarks/BookmarkManager.cs | 7 +- .../Src/Bookmarks/Commands/MenuCommands.cs | 4 +- .../Project/Src/Bookmarks/Pad/BookmarkPad.cs | 1 + .../Pad/BookmarkPadToolbarCommands.cs | 1 + .../Behaviors/DefaultProjectBehavior.cs | 2 +- .../Services/Debugger/BreakpointBookmark.cs | 13 +- .../Services/Debugger/CurrentLineBookmark.cs | 17 ++- .../Src/Services/Debugger/DebuggerService.cs | 2 + .../ICSharpCode.SharpDevelop.Tests.csproj | 1 + .../Test/Utils/ModelCollectionEventCheck.cs | 68 ++++++++++ .../Project/Build/BuildService.cs | 3 +- 31 files changed, 288 insertions(+), 214 deletions(-) create mode 100644 src/Main/Base/Project/Dom/FilterModelCollection.cs create mode 100644 src/Main/Base/Project/Dom/SimpleModelCollection.cs rename src/Main/Base/Project/{Src => Editor}/Bookmarks/BookmarkBase.cs (93%) rename src/Main/Base/Project/{Src/Bookmarks/BookmarkEventHandler.cs => Editor/Bookmarks/BookmarkEventArgs.cs} (80%) rename src/Main/Base/Project/{Src => Editor}/Bookmarks/EntityBookmark.cs (97%) rename src/Main/Base/Project/{Src/Bookmarks/IBookmarkMargin.cs => Editor/Bookmarks/IBookmark.cs} (68%) create mode 100644 src/Main/Base/Project/Editor/Bookmarks/IBookmarkMargin.cs rename src/Main/Base/Project/{Src => Editor}/Bookmarks/SDBookmark.cs (71%) rename src/Main/Base/Project/{Src => Editor}/Bookmarks/SDMarkerBookmark.cs (87%) delete mode 100644 src/Main/Base/Project/Src/Bookmarks/BookmarkConverter.cs create mode 100644 src/Main/Base/Test/Utils/ModelCollectionEventCheck.cs diff --git a/src/AddIns/Debugger/Debugger.AddIn/Pads/BreakPointsPad.cs b/src/AddIns/Debugger/Debugger.AddIn/Pads/BreakPointsPad.cs index 5054e62061..b232680361 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Pads/BreakPointsPad.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Pads/BreakPointsPad.cs @@ -11,6 +11,7 @@ using ICSharpCode.Core; using ICSharpCode.Core.Presentation; using ICSharpCode.SharpDevelop.Bookmarks; using ICSharpCode.SharpDevelop.Debugging; +using ICSharpCode.SharpDevelop.Editor.Bookmarks; using ICSharpCode.SharpDevelop.Services; namespace ICSharpCode.SharpDevelop.Gui.Pads diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs index c4c3af1d19..8ffc5532c1 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs @@ -17,6 +17,7 @@ using ICSharpCode.NRefactory.Editor; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Bookmarks; using ICSharpCode.SharpDevelop.Editor; +using ICSharpCode.SharpDevelop.Editor.Bookmarks; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Parser; using ICSharpCode.SharpDevelop.Project; diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs index fba3a9bee6..deaca65730 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs @@ -27,6 +27,7 @@ using ICSharpCode.NRefactory.Editor; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Bookmarks; using ICSharpCode.SharpDevelop.Editor; +using ICSharpCode.SharpDevelop.Editor.Bookmarks; using ICSharpCode.SharpDevelop.Editor.CodeCompletion; using ICSharpCode.SharpDevelop.Parser; using ICSharpCode.SharpDevelop.Widgets.MyersDiff; diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarManager.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarManager.cs index 967a4c71c6..34b465dc0d 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarManager.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarManager.cs @@ -9,6 +9,7 @@ using System.Collections.Specialized; using ICSharpCode.NRefactory.Editor; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop.Bookmarks; +using ICSharpCode.SharpDevelop.Editor.Bookmarks; namespace ICSharpCode.AvalonEdit.AddIn { diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs index 9373668eb0..4adea7f573 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs @@ -13,6 +13,7 @@ using ICSharpCode.AvalonEdit.Utils; using ICSharpCode.SharpDevelop.Bookmarks; using ICSharpCode.SharpDevelop.Debugging; using ICSharpCode.SharpDevelop.Editor; +using ICSharpCode.SharpDevelop.Editor.Bookmarks; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Workbench; using Mono.Cecil; diff --git a/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/CodeView.cs b/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/CodeView.cs index b7dc62cefe..57cc7badf3 100644 --- a/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/CodeView.cs +++ b/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/CodeView.cs @@ -8,6 +8,7 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Input; + using ICSharpCode.AvalonEdit; using ICSharpCode.AvalonEdit.AddIn; using ICSharpCode.AvalonEdit.Document; @@ -20,6 +21,7 @@ using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Bookmarks; using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor.AvalonEdit; +using ICSharpCode.SharpDevelop.Editor.Bookmarks; using ICSharpCode.SharpDevelop.Gui; namespace ICSharpCode.ILSpyAddIn.ViewContent diff --git a/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs b/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs index 52d5db3b72..8043fa6227 100644 --- a/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs +++ b/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs @@ -20,6 +20,7 @@ using ICSharpCode.SharpDevelop.Bookmarks; using ICSharpCode.SharpDevelop.Debugging; using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor.AvalonEdit; +using ICSharpCode.SharpDevelop.Editor.Bookmarks; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Workbench; using Mono.Cecil; diff --git a/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs b/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs index 912c449735..2084217843 100644 --- a/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs +++ b/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs @@ -19,6 +19,7 @@ using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Bookmarks; using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor.AvalonEdit; +using ICSharpCode.SharpDevelop.Editor.Bookmarks; using ICSharpCode.SharpDevelop.Editor.Search; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Project; @@ -413,7 +414,7 @@ namespace SearchAndReplace return; } } - BookmarkManager.AddMark(new Bookmark(result.FileName, result.StartLocation)); + BookmarkManager.AddMark(new Bookmark { FileName = result.FileName, Location = result.StartLocation}); } } #endregion diff --git a/src/Main/Base/Project/Dom/ConcatModelCollection.cs b/src/Main/Base/Project/Dom/ConcatModelCollection.cs index 3158a9845b..5b69969510 100644 --- a/src/Main/Base/Project/Dom/ConcatModelCollection.cs +++ b/src/Main/Base/Project/Dom/ConcatModelCollection.cs @@ -16,9 +16,6 @@ namespace ICSharpCode.SharpDevelop.Dom /// public sealed class ConcatModelCollection : IModelCollection { - // TODO: do we still need this class? maybe we should remove it? - // the indirection through this collection wrapper makes the weak reference/weak event stuff too complicated... - sealed class InputCollection : Collection> { readonly ConcatModelCollection owner; diff --git a/src/Main/Base/Project/Dom/FilterModelCollection.cs b/src/Main/Base/Project/Dom/FilterModelCollection.cs new file mode 100644 index 0000000000..48d44378cf --- /dev/null +++ b/src/Main/Base/Project/Dom/FilterModelCollection.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.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Linq; + +namespace ICSharpCode.SharpDevelop.Dom +{ + /// + /// A model collection that filters an input collection. + /// + public sealed class FilterModelCollection : IModelCollection + { + readonly IModelCollection input; + readonly Func predicate; + bool isAttached; + NotifyCollectionChangedEventHandler collectionChanged; + + public FilterModelCollection(IModelCollection input, Func predicate) + { + if (input == null) + throw new ArgumentNullException("input"); + if (predicate == null) + throw new ArgumentNullException("predicate"); + this.input = input; + this.predicate = predicate; + } + + public event NotifyCollectionChangedEventHandler CollectionChanged { + add { + collectionChanged += value; + if (collectionChanged != null && !isAttached) { + input.CollectionChanged += input_CollectionChanged; + isAttached = true; + } + } + remove { + collectionChanged -= value; + if (collectionChanged == null && isAttached) { + input.CollectionChanged -= input_CollectionChanged; + isAttached = false; + } + } + } + + void input_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + switch (e.Action) { + case NotifyCollectionChangedAction.Add: + collectionChanged(this, new NotifyCollectionChangedEventArgs( + NotifyCollectionChangedAction.Add, ApplyFilter(e.NewItems))); + break; + case NotifyCollectionChangedAction.Remove: + collectionChanged(this, new NotifyCollectionChangedEventArgs( + NotifyCollectionChangedAction.Remove, ApplyFilter(e.OldItems))); + break; + case NotifyCollectionChangedAction.Replace: + collectionChanged(this, new NotifyCollectionChangedEventArgs( + NotifyCollectionChangedAction.Replace, ApplyFilter(e.OldItems), ApplyFilter(e.NewItems))); + break; + case NotifyCollectionChangedAction.Move: + // this collection is unordered + break; + case NotifyCollectionChangedAction.Reset: + collectionChanged(this, new NotifyCollectionChangedEventArgs( + NotifyCollectionChangedAction.Reset)); + break; + default: + throw new NotSupportedException(); + } + } + + IList ApplyFilter(IList inputItems) + { + if (inputItems == null) + return null; + List outputItems = new List(); + foreach (T item in inputItems) { + if (predicate(item)) + outputItems.Add(item); + } + return outputItems; + } + + public int Count { + get { + return input.Count(predicate); + } + } + + public IEnumerator GetEnumerator() + { + return input.Where(predicate).GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/src/Main/Base/Project/Dom/SimpleModelCollection.cs b/src/Main/Base/Project/Dom/SimpleModelCollection.cs new file mode 100644 index 0000000000..903b1a65bc --- /dev/null +++ b/src/Main/Base/Project/Dom/SimpleModelCollection.cs @@ -0,0 +1,15 @@ +// 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/Src/Bookmarks/BookmarkBase.cs b/src/Main/Base/Project/Editor/Bookmarks/BookmarkBase.cs similarity index 93% rename from src/Main/Base/Project/Src/Bookmarks/BookmarkBase.cs rename to src/Main/Base/Project/Editor/Bookmarks/BookmarkBase.cs index 6b650d8951..4bb07038e9 100644 --- a/src/Main/Base/Project/Src/Bookmarks/BookmarkBase.cs +++ b/src/Main/Base/Project/Editor/Bookmarks/BookmarkBase.cs @@ -7,9 +7,8 @@ using System.Windows.Media; using ICSharpCode.NRefactory; using ICSharpCode.NRefactory.Editor; -using ICSharpCode.SharpDevelop.Editor; -namespace ICSharpCode.SharpDevelop.Bookmarks +namespace ICSharpCode.SharpDevelop.Editor.Bookmarks { /// /// A bookmark that can be attached to an AvalonEdit TextDocument. @@ -147,13 +146,10 @@ namespace ICSharpCode.SharpDevelop.Bookmarks } } - public BookmarkBase(TextLocation location) - { - this.Location = location; + public static IImage DefaultBookmarkImage { + get { return SD.ResourceService.GetImage("Bookmarks.ToggleMark"); } } - public static readonly IImage DefaultBookmarkImage = new ResourceServiceImage("Bookmarks.ToggleMark"); - public virtual IImage Image { get { return DefaultBookmarkImage; } } diff --git a/src/Main/Base/Project/Src/Bookmarks/BookmarkEventHandler.cs b/src/Main/Base/Project/Editor/Bookmarks/BookmarkEventArgs.cs similarity index 80% rename from src/Main/Base/Project/Src/Bookmarks/BookmarkEventHandler.cs rename to src/Main/Base/Project/Editor/Bookmarks/BookmarkEventArgs.cs index e4fcea2da0..7e2439b458 100644 --- a/src/Main/Base/Project/Src/Bookmarks/BookmarkEventHandler.cs +++ b/src/Main/Base/Project/Editor/Bookmarks/BookmarkEventArgs.cs @@ -3,10 +3,8 @@ using System; -namespace ICSharpCode.SharpDevelop.Bookmarks +namespace ICSharpCode.SharpDevelop.Editor.Bookmarks { - public delegate void BookmarkEventHandler(object sender, BookmarkEventArgs e); - /// /// Description of BookmarkEventHandler. /// diff --git a/src/Main/Base/Project/Src/Bookmarks/EntityBookmark.cs b/src/Main/Base/Project/Editor/Bookmarks/EntityBookmark.cs similarity index 97% rename from src/Main/Base/Project/Src/Bookmarks/EntityBookmark.cs rename to src/Main/Base/Project/Editor/Bookmarks/EntityBookmark.cs index d9e0281577..18bbab782d 100644 --- a/src/Main/Base/Project/Src/Bookmarks/EntityBookmark.cs +++ b/src/Main/Base/Project/Editor/Bookmarks/EntityBookmark.cs @@ -9,7 +9,7 @@ using ICSharpCode.Core.Presentation; using ICSharpCode.NRefactory.Editor; using ICSharpCode.NRefactory.TypeSystem; -namespace ICSharpCode.SharpDevelop.Bookmarks +namespace ICSharpCode.SharpDevelop.Editor.Bookmarks { /// /// Bookmark used to give additional operations for entities. diff --git a/src/Main/Base/Project/Src/Bookmarks/IBookmarkMargin.cs b/src/Main/Base/Project/Editor/Bookmarks/IBookmark.cs similarity index 68% rename from src/Main/Base/Project/Src/Bookmarks/IBookmarkMargin.cs rename to src/Main/Base/Project/Editor/Bookmarks/IBookmark.cs index 3ced002f5a..696ace6385 100644 --- a/src/Main/Base/Project/Src/Bookmarks/IBookmarkMargin.cs +++ b/src/Main/Base/Project/Editor/Bookmarks/IBookmark.cs @@ -2,32 +2,10 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; -using System.Collections.Generic; using System.Windows.Input; -using ICSharpCode.SharpDevelop.Editor; - -namespace ICSharpCode.SharpDevelop.Bookmarks +namespace ICSharpCode.SharpDevelop.Editor.Bookmarks { - /// - /// The bookmark margin. - /// - [DocumentService] - public interface IBookmarkMargin - { - /// - /// Gets the list of bookmarks. - /// - IList Bookmarks { get; } - - /// - /// Redraws the bookmark margin. Bookmarks need to call this method when the Image changes. - /// - void Redraw(); - - event EventHandler RedrawRequested; - } - /// /// Represents a bookmark in the bookmark margin. /// diff --git a/src/Main/Base/Project/Editor/Bookmarks/IBookmarkMargin.cs b/src/Main/Base/Project/Editor/Bookmarks/IBookmarkMargin.cs new file mode 100644 index 0000000000..f4828080e8 --- /dev/null +++ b/src/Main/Base/Project/Editor/Bookmarks/IBookmarkMargin.cs @@ -0,0 +1,28 @@ +// 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 ICSharpCode.SharpDevelop.Editor; + +namespace ICSharpCode.SharpDevelop.Editor.Bookmarks +{ + /// + /// The bookmark margin. + /// + [DocumentService] + public interface IBookmarkMargin + { + /// + /// Gets the list of bookmarks. + /// + IList Bookmarks { get; } + + /// + /// Redraws the bookmark margin. Bookmarks need to call this method when the Image changes. + /// + void Redraw(); + + event EventHandler RedrawRequested; + } +} diff --git a/src/Main/Base/Project/Src/Bookmarks/SDBookmark.cs b/src/Main/Base/Project/Editor/Bookmarks/SDBookmark.cs similarity index 71% rename from src/Main/Base/Project/Src/Bookmarks/SDBookmark.cs rename to src/Main/Base/Project/Editor/Bookmarks/SDBookmark.cs index 94a55a05b4..714b918c6e 100644 --- a/src/Main/Base/Project/Src/Bookmarks/SDBookmark.cs +++ b/src/Main/Base/Project/Editor/Bookmarks/SDBookmark.cs @@ -4,22 +4,18 @@ using System; using System.ComponentModel; using System.IO; + using ICSharpCode.Core; using ICSharpCode.NRefactory; +using ICSharpCode.SharpDevelop.Bookmarks; -namespace ICSharpCode.SharpDevelop.Bookmarks +namespace ICSharpCode.SharpDevelop.Editor.Bookmarks { /// /// A bookmark that is persistant across SharpDevelop sessions. /// - [TypeConverter(typeof(BookmarkConverter))] public abstract class SDBookmark : BookmarkBase { - public SDBookmark(FileName fileName, TextLocation location) : base(location) - { - this.fileName = fileName; - } - FileName fileName; public FileName FileName { @@ -55,39 +51,29 @@ namespace ICSharpCode.SharpDevelop.Bookmarks LineNumberChanged(this, EventArgs.Empty); } - bool isSaved = true; - /// /// Gets/Sets if the bookmark should be saved to the project memento file. /// /// - /// Default is true, set this property to false if you are using the bookmark for + /// Default is true; override this property if you are using the bookmark for /// something special like like "CurrentLineBookmark" in the debugger. /// - public bool IsSaved { + public virtual bool IsSaved { get { - return isSaved; - } - set { - isSaved = value; + return true; } } - bool isVisibleInBookmarkPad = true; - /// /// Gets/Sets if the bookmark is shown in the bookmark pad. /// /// - /// Default is true, set this property to false if you are using the bookmark for + /// Default is true, override this property if you are using the bookmark for /// something special like like "CurrentLineBookmark" in the debugger. /// - public bool IsVisibleInBookmarkPad { + public virtual bool IsVisibleInBookmarkPad { get { - return isVisibleInBookmarkPad; - } - set { - isVisibleInBookmarkPad = value; + return true; } } @@ -102,8 +88,5 @@ namespace ICSharpCode.SharpDevelop.Bookmarks /// public sealed class Bookmark : SDBookmark { - public Bookmark(FileName fileName, TextLocation location) : base(fileName, location) - { - } } } diff --git a/src/Main/Base/Project/Src/Bookmarks/SDMarkerBookmark.cs b/src/Main/Base/Project/Editor/Bookmarks/SDMarkerBookmark.cs similarity index 87% rename from src/Main/Base/Project/Src/Bookmarks/SDMarkerBookmark.cs rename to src/Main/Base/Project/Editor/Bookmarks/SDMarkerBookmark.cs index 6e8df849af..ee262b1bb9 100644 --- a/src/Main/Base/Project/Src/Bookmarks/SDMarkerBookmark.cs +++ b/src/Main/Base/Project/Editor/Bookmarks/SDMarkerBookmark.cs @@ -7,18 +7,13 @@ using ICSharpCode.Core; using ICSharpCode.NRefactory; using ICSharpCode.SharpDevelop.Editor; -namespace ICSharpCode.SharpDevelop.Bookmarks +namespace ICSharpCode.SharpDevelop.Editor.Bookmarks { /// /// A bookmark that is persistant across SharpDevelop sessions and has a text marker assigned to it. /// public abstract class SDMarkerBookmark : SDBookmark { - public SDMarkerBookmark(FileName fileName, TextLocation location) : base(fileName, location) - { - //SetMarker(); - } - ITextMarker marker; protected abstract ITextMarker CreateMarker(ITextMarkerService markerService); diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 932d89f2fa..9dad51a574 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -96,6 +96,7 @@ Src\Project\MSBuildEngine\ExtendedBinaryReader.cs + @@ -105,6 +106,14 @@ + + + + + + + + @@ -693,15 +702,10 @@ - - - - - @@ -715,8 +719,6 @@ Component - - @@ -871,6 +873,7 @@ + diff --git a/src/Main/Base/Project/Src/Bookmarks/BookmarkConverter.cs b/src/Main/Base/Project/Src/Bookmarks/BookmarkConverter.cs deleted file mode 100644 index ada0bb7036..0000000000 --- a/src/Main/Base/Project/Src/Bookmarks/BookmarkConverter.cs +++ /dev/null @@ -1,123 +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.ComponentModel; -using System.Globalization; -using System.Text; -using System.Windows; -using ICSharpCode.Core; -using ICSharpCode.NRefactory; - -namespace ICSharpCode.SharpDevelop.Bookmarks -{ - public sealed class BookmarkConverter : TypeConverter - { - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) - { - if (sourceType == typeof(string)) { - return true; - } else { - return base.CanConvertFrom(context, sourceType); - } - } - - public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) - { - if (value is string) { - string[] v = ((string)value).Split('|'); - - FileName fileName = FileName.Create(v[1]); - int lineNumber = int.Parse(v[2], culture); - int columnNumber = int.Parse(v[3], culture); - if (lineNumber < 0) - return null; - if (columnNumber < 0) - return null; - SDBookmark bookmark; - switch (v[0]) { - case "Breakpoint": - Debugging.BreakpointAction action = Debugging.BreakpointAction.Break; - string scriptLanguage = ""; - string script = ""; - action = (Debugging.BreakpointAction)Enum.Parse(typeof(Debugging.BreakpointAction), v[5]); - scriptLanguage = v[6]; - script = v[7]; - - var bbm = new Debugging.BreakpointBookmark(fileName, new TextLocation(lineNumber, columnNumber), action, scriptLanguage, script); - bbm.IsEnabled = bool.Parse(v[4]); - bbm.Action = action; - bbm.ScriptLanguage = scriptLanguage; - bbm.Condition = script; - bookmark = bbm; - break; - case "DecompiledBreakpointBookmark": - action = (Debugging.BreakpointAction)Enum.Parse(typeof(Debugging.BreakpointAction), v[5]); - scriptLanguage = v[6]; - script = v[7]; - - bbm = new DecompiledBreakpointBookmark(fileName, new TextLocation(columnNumber, lineNumber), action, scriptLanguage, script); - bbm.IsEnabled = bool.Parse(v[4]); - bbm.Action = action; - bbm.ScriptLanguage = scriptLanguage; - bbm.Condition = script; - bookmark = bbm; - break; - default: - bookmark = new Bookmark(fileName, new TextLocation(lineNumber, columnNumber)); - break; - } - return bookmark; - } else { - return base.ConvertFrom(context, culture, value); - } - } - - public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) - { - SDBookmark bookmark = value as SDBookmark; - if (destinationType == typeof(string) && bookmark != null) { - StringBuilder b = new StringBuilder(); - if (bookmark is DecompiledBreakpointBookmark) { - b.Append("DecompiledBreakpointBookmark"); - } else if (bookmark is Debugging.BreakpointBookmark) { - b.Append("Breakpoint"); - } else { - b.Append("Bookmark"); - } - b.Append('|'); - b.Append(bookmark.FileName); - b.Append('|'); - b.Append(bookmark.LineNumber); - b.Append('|'); - b.Append(bookmark.ColumnNumber); - - if (bookmark is DecompiledBreakpointBookmark) { - var bbm = (DecompiledBreakpointBookmark)bookmark; - b.Append('|'); - b.Append(bbm.IsEnabled.ToString()); - b.Append('|'); - b.Append(bbm.Action.ToString()); - b.Append('|'); - b.Append(bbm.ScriptLanguage); - b.Append('|'); - b.Append(bbm.Condition); - } else if (bookmark is Debugging.BreakpointBookmark) { - var bbm = (Debugging.BreakpointBookmark)bookmark; - b.Append('|'); - b.Append(bbm.IsEnabled.ToString()); - b.Append('|'); - b.Append(bbm.Action.ToString()); - b.Append('|'); - b.Append(bbm.ScriptLanguage); - b.Append('|'); - b.Append(bbm.Condition); - } - - return b.ToString(); - } else { - return base.ConvertTo(context, culture, value, destinationType); - } - } - } -} diff --git a/src/Main/Base/Project/Src/Bookmarks/BookmarkManager.cs b/src/Main/Base/Project/Src/Bookmarks/BookmarkManager.cs index 6c638395fe..fda35572a4 100644 --- a/src/Main/Base/Project/Src/Bookmarks/BookmarkManager.cs +++ b/src/Main/Base/Project/Src/Bookmarks/BookmarkManager.cs @@ -1,12 +1,13 @@ // Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -using ICSharpCode.NRefactory; using System; using System.Collections.Generic; using ICSharpCode.Core; +using ICSharpCode.NRefactory; using ICSharpCode.SharpDevelop.Debugging; using ICSharpCode.SharpDevelop.Editor; +using ICSharpCode.SharpDevelop.Editor.Bookmarks; using ICSharpCode.SharpDevelop.Gui; namespace ICSharpCode.SharpDevelop.Bookmarks @@ -146,7 +147,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks } } - public static event BookmarkEventHandler Removed; - public static event BookmarkEventHandler Added; + public static event EventHandler Removed; + public static event EventHandler Added; } } diff --git a/src/Main/Base/Project/Src/Bookmarks/Commands/MenuCommands.cs b/src/Main/Base/Project/Src/Bookmarks/Commands/MenuCommands.cs index 1c0f862ea6..b6d725b9bf 100644 --- a/src/Main/Base/Project/Src/Bookmarks/Commands/MenuCommands.cs +++ b/src/Main/Base/Project/Src/Bookmarks/Commands/MenuCommands.cs @@ -4,8 +4,10 @@ using System; using System.Collections.Generic; using System.Linq; + using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Editor; +using ICSharpCode.SharpDevelop.Editor.Bookmarks; using ICSharpCode.SharpDevelop.Gui; namespace ICSharpCode.SharpDevelop.Bookmarks @@ -40,7 +42,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks { BookmarkManager.ToggleBookmark(editor, editor.Caret.Line, b => b.CanToggle && b.GetType() == typeof(Bookmark), - location => new Bookmark(editor.FileName, location)); + location => new Bookmark { FileName = editor.FileName, Location = location}); } } public class PrevBookmark : BookmarkMenuCommand diff --git a/src/Main/Base/Project/Src/Bookmarks/Pad/BookmarkPad.cs b/src/Main/Base/Project/Src/Bookmarks/Pad/BookmarkPad.cs index cd7c4cf51c..87fcdb0aab 100644 --- a/src/Main/Base/Project/Src/Bookmarks/Pad/BookmarkPad.cs +++ b/src/Main/Base/Project/Src/Bookmarks/Pad/BookmarkPad.cs @@ -10,6 +10,7 @@ using System.Windows.Controls; using ICSharpCode.Core; using ICSharpCode.Core.Presentation; using ICSharpCode.SharpDevelop.Debugging; +using ICSharpCode.SharpDevelop.Editor.Bookmarks; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Workbench; diff --git a/src/Main/Base/Project/Src/Bookmarks/Pad/BookmarkPadToolbarCommands.cs b/src/Main/Base/Project/Src/Bookmarks/Pad/BookmarkPadToolbarCommands.cs index 6b00672959..f488b9f451 100644 --- a/src/Main/Base/Project/Src/Bookmarks/Pad/BookmarkPadToolbarCommands.cs +++ b/src/Main/Base/Project/Src/Bookmarks/Pad/BookmarkPadToolbarCommands.cs @@ -8,6 +8,7 @@ using System.Windows.Forms; using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Debugging; +using ICSharpCode.SharpDevelop.Editor.Bookmarks; namespace ICSharpCode.SharpDevelop.Bookmarks { diff --git a/src/Main/Base/Project/Src/Project/Behaviors/DefaultProjectBehavior.cs b/src/Main/Base/Project/Src/Project/Behaviors/DefaultProjectBehavior.cs index 889507798a..a25e64e4a3 100644 --- a/src/Main/Base/Project/Src/Project/Behaviors/DefaultProjectBehavior.cs +++ b/src/Main/Base/Project/Src/Project/Behaviors/DefaultProjectBehavior.cs @@ -112,7 +112,7 @@ namespace ICSharpCode.SharpDevelop.Project { WorkbenchSingleton.AssertMainThread(); - foreach (var mark in memento.GetList("bookmarks")) { + foreach (var mark in memento.GetList("bookmarks")) { ICSharpCode.SharpDevelop.Bookmarks.BookmarkManager.AddMark(mark); } List filesToOpen = new List(); diff --git a/src/Main/Base/Project/Src/Services/Debugger/BreakpointBookmark.cs b/src/Main/Base/Project/Src/Services/Debugger/BreakpointBookmark.cs index 09304b435d..5dde7e0c47 100644 --- a/src/Main/Base/Project/Src/Services/Debugger/BreakpointBookmark.cs +++ b/src/Main/Base/Project/Src/Services/Debugger/BreakpointBookmark.cs @@ -4,12 +4,14 @@ using System; using System.Linq; using System.Windows.Media; + using ICSharpCode.AvalonEdit.Highlighting; using ICSharpCode.Core; using ICSharpCode.NRefactory; using ICSharpCode.NRefactory.Editor; using ICSharpCode.SharpDevelop.Bookmarks; using ICSharpCode.SharpDevelop.Editor; +using ICSharpCode.SharpDevelop.Editor.Bookmarks; namespace ICSharpCode.SharpDevelop.Debugging { @@ -97,8 +99,17 @@ namespace ICSharpCode.SharpDevelop.Debugging set { tooltip = value; } } - public BreakpointBookmark(FileName fileName, TextLocation location, BreakpointAction action, string scriptLanguage, string script) : base(fileName, location) + /// + /// parameter-less ctor is necessary for deserialization + /// + public BreakpointBookmark() + { + } + + public BreakpointBookmark(FileName fileName, TextLocation location, BreakpointAction action, string scriptLanguage, string script) { + this.Location = location; + this.FileName = fileName; this.action = action; this.scriptLanguage = scriptLanguage; this.condition = script; diff --git a/src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs b/src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs index d28439abe9..48f0c0b59c 100644 --- a/src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs +++ b/src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs @@ -9,6 +9,7 @@ using ICSharpCode.NRefactory; using ICSharpCode.NRefactory.Editor; using ICSharpCode.SharpDevelop.Bookmarks; using ICSharpCode.SharpDevelop.Editor; +using ICSharpCode.SharpDevelop.Editor.Bookmarks; using ICSharpCode.SharpDevelop.Gui; namespace ICSharpCode.SharpDevelop.Debugging @@ -56,7 +57,9 @@ namespace ICSharpCode.SharpDevelop.Debugging IDocumentLine line = document.GetLineByNumber(startLine); if (endColumn < 1 || endColumn > line.Length) endColumn = line.Length; - instance = new CurrentLineBookmark(fileName, new TextLocation(startLine, startColumn)); + instance = new CurrentLineBookmark(); + instance.Location = new TextLocation(startLine, startColumn); + instance.FileName = fileName; BookmarkManager.AddMark(instance); } @@ -81,16 +84,16 @@ namespace ICSharpCode.SharpDevelop.Debugging get { return 100; } } - public CurrentLineBookmark(FileName fileName, TextLocation location) : base(fileName, location) - { - this.IsSaved = false; - this.IsVisibleInBookmarkPad = false; + public override bool IsSaved { + get { return false; } } - readonly static IImage currentLineArrow = new ResourceServiceImage("Bookmarks.CurrentLine"); + public override bool IsVisibleInBookmarkPad { + get { return false; } + } public override IImage Image { - get { return currentLineArrow; } + get { return SD.ResourceService.GetImage("Bookmarks.CurrentLine"); } } protected override ITextMarker CreateMarker(ITextMarkerService markerService) diff --git a/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs b/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs index 45ccd62ea6..6dbe8392fa 100644 --- a/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs +++ b/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; + using ICSharpCode.Core; using ICSharpCode.NRefactory; using ICSharpCode.NRefactory.Editor; @@ -13,6 +14,7 @@ using ICSharpCode.NRefactory.Semantics; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop.Bookmarks; using ICSharpCode.SharpDevelop.Editor; +using ICSharpCode.SharpDevelop.Editor.Bookmarks; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Parser; using ICSharpCode.SharpDevelop.Project; diff --git a/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj b/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj index e75c412c8d..5594aa083e 100644 --- a/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj +++ b/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj @@ -126,6 +126,7 @@ + diff --git a/src/Main/Base/Test/Utils/ModelCollectionEventCheck.cs b/src/Main/Base/Test/Utils/ModelCollectionEventCheck.cs new file mode 100644 index 0000000000..ac90030bfb --- /dev/null +++ b/src/Main/Base/Test/Utils/ModelCollectionEventCheck.cs @@ -0,0 +1,68 @@ +// 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 System.Linq; +using ICSharpCode.SharpDevelop.Dom; +using NUnit.Framework; + +namespace ICSharpCode.SharpDevelop.Utils +{ + /// + /// Checks the change events of a model collection for consistency + /// with the collection data. + /// + public class ModelCollectionEventCheck + { + readonly IModelCollection modelCollection; + List list; + + public ModelCollectionEventCheck(IModelCollection modelCollection) + { + if (modelCollection == null) + throw new ArgumentNullException("modelCollection"); + this.modelCollection = modelCollection; + this.list = new List(modelCollection); + modelCollection.CollectionChanged += OnCollectionChanged; + } + + void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + switch (e.Action) { + case NotifyCollectionChangedAction.Add: + list.InsertRange(e.NewStartingIndex, e.NewItems.Cast()); + break; + case NotifyCollectionChangedAction.Remove: + Assert.AreEqual(list.GetRange(e.OldStartingIndex, e.OldItems.Count), e.OldItems); + list.RemoveRange(e.OldStartingIndex, e.OldItems.Count); + break; + case NotifyCollectionChangedAction.Replace: + Assert.AreEqual(e.OldStartingIndex, e.NewStartingIndex, "Old and new starting index must be identical for replace action"); + Assert.AreEqual(list.GetRange(e.OldStartingIndex, e.OldItems.Count), e.OldItems); + list.RemoveRange(e.OldStartingIndex, e.OldItems.Count); + list.InsertRange(e.NewStartingIndex, e.NewItems.Cast()); + break; + case NotifyCollectionChangedAction.Move: + Assert.AreEqual(e.OldItems, e.NewItems); + Assert.AreEqual(list.GetRange(e.OldStartingIndex, e.OldItems.Count), e.OldItems); + list.RemoveRange(e.OldStartingIndex, e.OldItems.Count); + list.InsertRange(e.NewStartingIndex, e.NewItems.Cast()); + break; + case NotifyCollectionChangedAction.Reset: + list.Clear(); + list.AddRange(modelCollection); + break; + default: + throw new Exception("Invalid value for NotifyCollectionChangedAction"); + } + Verify(); + } + + public void Verify() + { + Assert.AreEqual(list, modelCollection.ToList()); + } + } +} diff --git a/src/Main/SharpDevelop/Project/Build/BuildService.cs b/src/Main/SharpDevelop/Project/Build/BuildService.cs index 6478cda4fc..9566863a3c 100644 --- a/src/Main/SharpDevelop/Project/Build/BuildService.cs +++ b/src/Main/SharpDevelop/Project/Build/BuildService.cs @@ -68,7 +68,8 @@ namespace ICSharpCode.SharpDevelop.Project buildable = buildModifiedProjectsOnly.WrapBuildable(buildable, options.BuildDetection); var sink = new UIBuildFeedbackSink(TaskService.BuildMessageViewCategory, SD.StatusBar); - var results = await BuildInBackgroundAsync(buildable, options, sink, progressMonitor); + // Actually run the build: + var results = await BuildEngine.BuildAsync(buildable, options, sink, progressMonitor); string message; if (results.Result == BuildResultCode.Cancelled) {