Example #1
0
        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));
        }
Example #2
0
        /// <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));
        }
Example #3
0
        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));
        }
Example #4
0
        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;
            }
        }