public virtual CollectionDiff <T, T> SyncByContent(IEnumerable <ILocalizedString> newNames, INameFactory <T> nameFactory, Action <T[]> deletedCallback = null) { ParamIs.NotNull(() => newNames); ParamIs.NotNull(() => nameFactory); var diff = CollectionHelper.Diff(Names, newNames, (n1, n2) => n1.ContentEquals(n2)); var created = new List <T>(); foreach (var n in diff.Removed) { Remove(n); } deletedCallback?.Invoke(diff.Removed); foreach (var nameEntry in diff.Added) { var n = nameFactory.CreateName(nameEntry.Value, nameEntry.Language); created.Add(n); } UpdateSortNames(); return(new CollectionDiff <T, T>(created, diff.Removed, diff.Unchanged)); }
/// <summary> /// Sync names. Adds new names, updates existing names (unless immutable), and deletes removed names. /// </summary> /// <param name="newNames">New list of names. Cannot be null.</param> /// <param name="nameFactory">Factory for creating new names. Cannot be null.</param> /// <param name="deletedCallback"> /// Callback to be executed after names have been deleted. Can be null. /// </param> /// <param name="editedCallback">Callback to be executed after names have been updated. Can be null.</param> /// <param name="immutable"> /// Whether to treat names as immutable. /// If this is true, names will never be updated - instead, changed names are deleted and recreated. /// </param> /// <returns>Resulted diff for name update. Cannot be null.</returns> public virtual CollectionDiffWithValue <T, T> Sync(IEnumerable <LocalizedStringWithIdContract> newNames, INameFactory <T> nameFactory, Action <T[]> deletedCallback = null, Action <T[]> editedCallback = null, bool immutable = false) { ParamIs.NotNull(() => newNames); ParamIs.NotNull(() => nameFactory); var diff = CollectionHelper.Diff(Names, newNames, (n1, n2) => n1.Id == n2.Id && (!immutable || n1.ContentEquals(n2))); var created = new List <T>(); var edited = new List <T>(); foreach (var n in diff.Removed) { Remove(n); } if (deletedCallback != null) { deletedCallback(diff.Removed); } foreach (var old in diff.Unchanged) { var nameEntry = newNames.First(n => n.Id == old.Id); if (!old.ContentEquals(nameEntry)) { old.Language = nameEntry.Language; old.Value = nameEntry.Value; edited.Add(old); } } if (editedCallback != null) { editedCallback(edited.ToArray()); } foreach (var nameEntry in diff.Added) { var n = nameFactory.CreateName(nameEntry.Value, nameEntry.Language); created.Add(n); } UpdateSortNames(); return(new CollectionDiffWithValue <T, T>(created, diff.Removed, diff.Unchanged, edited)); }
public virtual CollectionDiffWithValue <T, T> Sync(IEnumerable <LocalizedStringWithIdContract> newNames, INameFactory <T> nameFactory) { ParamIs.NotNull(() => newNames); ParamIs.NotNull(() => nameFactory); var diff = CollectionHelper.Diff(Names, newNames, (n1, n2) => n1.Id == n2.Id); var created = new List <T>(); var edited = new List <T>(); foreach (var n in diff.Removed) { Remove(n); } foreach (var nameEntry in newNames) { var entry = nameEntry; var old = (entry.Id != 0 ? Names.FirstOrDefault(n => n.Id == entry.Id) : null); if (old != null) { if (!old.ContentEquals(nameEntry)) { old.Language = nameEntry.Language; old.Value = nameEntry.Value; edited.Add(old); } } else { var n = nameFactory.CreateName(nameEntry.Value, nameEntry.Language); created.Add(n); } } UpdateSortNames(); return(new CollectionDiffWithValue <T, T>(created, diff.Removed, diff.Unchanged, edited)); }
public virtual void Init(IEnumerable <LocalizedStringContract> names, INameFactory <T> nameFactory) { ParamIs.NotNull(() => names); ParamIs.NotNull(() => nameFactory); foreach (var name in names) { nameFactory.CreateName(name.Value, name.Language); } if (names.Any(n => n.Language == ContentLanguageSelection.Japanese)) { SortNames.DefaultLanguage = ContentLanguageSelection.Japanese; } else if (names.Any(n => n.Language == ContentLanguageSelection.Romaji)) { SortNames.DefaultLanguage = ContentLanguageSelection.Romaji; } else if (names.Any(n => n.Language == ContentLanguageSelection.English)) { SortNames.DefaultLanguage = ContentLanguageSelection.English; } }