diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/CodeSnippet.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/CodeSnippet.cs index 9161dd99c4..97027964f8 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/CodeSnippet.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/CodeSnippet.cs @@ -23,16 +23,26 @@ namespace ICSharpCode.AvalonEdit.AddIn.Snippets /// /// A code snippet. /// - public class CodeSnippet : INotifyPropertyChanged + public class CodeSnippet : INotifyPropertyChanged, IEquatable { string name, description, text, keyword; - bool isUserModified; + + public CodeSnippet() + { + } + + public CodeSnippet(CodeSnippet copy) + { + this.name = copy.name; + this.description = copy.description; + this.text = copy.text; + this.keyword = copy.keyword; + } public string Name { get { return name; } set { if (name != value) { - isUserModified = true; name = value; OnPropertyChanged("Name"); } @@ -43,7 +53,6 @@ namespace ICSharpCode.AvalonEdit.AddIn.Snippets get { return text; } set { if (text != value) { - isUserModified = true; text = value; OnPropertyChanged("Text"); } @@ -54,7 +63,6 @@ namespace ICSharpCode.AvalonEdit.AddIn.Snippets get { return description; } set { if (description != value) { - isUserModified = true; description = value; OnPropertyChanged("Description"); } @@ -73,23 +81,12 @@ namespace ICSharpCode.AvalonEdit.AddIn.Snippets get { return keyword; } set { if (keyword != value) { - isUserModified = true; keyword = value; OnPropertyChanged("Keyword"); } } } - public bool IsUserModified { - get { return isUserModified; } - set { - if (isUserModified != value) { - isUserModified = value; - OnPropertyChanged("IsUserModified"); - } - } - } - public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) @@ -241,12 +238,42 @@ namespace ICSharpCode.AvalonEdit.AddIn.Snippets } } + public override int GetHashCode() + { + int hashCode = 0; + unchecked { + if (name != null) + hashCode += 1000000007 * name.GetHashCode(); + if (description != null) + hashCode += 1000000009 * description.GetHashCode(); + if (text != null) + hashCode += 1000000021 * text.GetHashCode(); + if (keyword != null) + hashCode += 1000000033 * keyword.GetHashCode(); + } + return hashCode; + } + + public override bool Equals(object obj) + { + CodeSnippet other = obj as CodeSnippet; + return Equals(other); + } + + public bool Equals(CodeSnippet other) + { + if (other == null) + return false; + return this.name == other.name && this.description == other.description && this.text == other.text && this.keyword == other.keyword; + } + /// /// Reports the snippet usage to UDC /// internal void TrackUsage(string activationMethod) { - Core.AnalyticsMonitorService.TrackFeature(typeof(CodeSnippet), IsUserModified ? "usersnippet" : Name, activationMethod); + bool isUserModified = !SnippetManager.defaultSnippets.Any(g => g.Snippets.Contains(this)); + Core.AnalyticsMonitorService.TrackFeature(typeof(CodeSnippet), isUserModified ? "usersnippet" : Name, activationMethod); } } } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetManager.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetManager.cs index 1a07849169..4f674e8253 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetManager.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetManager.cs @@ -22,7 +22,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Snippets public sealed class SnippetManager { readonly object lockObj = new object(); - static readonly List defaultSnippets = new List { + internal static readonly List defaultSnippets = new List { new CodeSnippetGroup { Extensions = ".cs", Snippets = { @@ -272,7 +272,6 @@ End Property${Caret}" private SnippetManager() { snippetElementProviders = AddInTree.BuildItems("/SharpDevelop/ViewContent/AvalonEdit/SnippetElementProviders", null, false); - defaultSnippets.ForEach(x => x.Snippets.ForEach(s => s.IsUserModified = false)); } /// @@ -289,7 +288,7 @@ End Property${Caret}" defaultGroup.Snippets.Except( group.Snippets, new PredicateComparer((x, y) => x.Name == y.Name, x => x.Name.GetHashCode()) - ) + ).Select(s => new CodeSnippet(s)) ).OrderBy(s => s.Name).ToList(); group.Snippets.Clear(); group.Snippets.AddRange(merged); @@ -338,11 +337,19 @@ End Property${Caret}" List modifiedGroups = new List(); foreach (var group in groups) { + var defaultGroup = defaultSnippets.FirstOrDefault(i => i.Extensions == group.Extensions); + + IEnumerable saveSnippets = group.Snippets; + + if (defaultGroup != null) { + saveSnippets = group.Snippets.Except(defaultGroup.Snippets); + } + // save all groups, even if they're empty var copy = new CodeSnippetGroup() { Extensions = group.Extensions }; - copy.Snippets.AddRange(group.Snippets.Where(s => s.IsUserModified)); + copy.Snippets.AddRange(saveSnippets); modifiedGroups.Add(copy); }