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);
}