示例#1
0
        private void RemoveItem(HrItem item)
        {
            Contract.Requires(item != null);
            Contract.Ensures(!hrItems.Contains(item));

            var hrItemsCopy = new HashSet <HrItem>(hrItems);

            if (hrItems.Remove(item))
            {
                // обновляем другую сторону many-2-many
                if (item.Word != null)
                {
                    item.Word.RemoveHr(this);
                }

                EditHelper.Edit("HrItems", hrItemsCopy);
                if (InEdit)
                {
                    IsDirty = true;
                }
            }
        }
示例#2
0
 public static ConfWithHio GetConfindenceHrItemObject(this HrItem hi)
 {
     Contract.Requires(hi != null);
     return(new ConfWithHio(hi.Entity, hi.Confidence));
 }
示例#3
0
        /// <summary>
        /// Устанавливает сущности элементов записи.
        /// Полученные элементы нумеруются по порядку.
        /// </summary>
        public virtual void SetItems(IList <ConfWithHio> willChios)
        {
            Contract.Requires(willChios != null);
            Contract.Ensures(HrItems.Count() == willChios.Count);
            Contract.Ensures(HrItems.Select(x => x.Entity)
                             .ScrambledEquals(willChios.Select(x => x.HIO)));                                             // same HIOs
            Contract.Ensures(HrItems.IsUnique(x => x.Ord));
            Contract.Ensures(HrItems.Select(x => x.Word).Where(x => x != null).All(x => x.HealthRecords.Contains(this))); // word2hr relation

            var hrItems  = HrItems.ToList();
            var wasChios = hrItems.Select(x => x.GetConfindenceHrItemObject()).ToList();

            logger.DebugFormat("set HrItems. Chios was: {0}, will: {1}", wasChios.FlattenString(), willChios.FlattenString());

            // items to be in Hr = this.HrItems - itemsToRem + itemsToAdd
            var itemsToBe  = new List <HrItem>();
            var itemsToRem = new List <HrItem>();
            var itemsToAdd = new List <HrItem>();

            var willBag = new Bag <ConfWithHio>(willChios);
            var wasBag  = new Bag <ConfWithHio>(wasChios);

            // добалвяем все существующие, чьи сущности не надо убирать
            var toR = wasBag.Difference(willBag);

            for (int i = 0; i < wasChios.Count; i++)
            {
                if (toR.Contains(wasChios[i])) // убрать
                {
                    toR.Remove(wasChios[i]);
                    itemsToRem.Add(hrItems[i]);
                }
                else // оставить
                {
                    itemsToBe.Add(hrItems[i]);
                }
            }
            // добавляем новые

            var toA = willBag.Difference(wasBag);

            foreach (var item in toA)
            {
                var n = new HrItem(this, item.HIO)
                {
                    Confidence = item.Confidence
                };
                itemsToAdd.Add(n);
                itemsToBe.Add(n);
            }

            logger.DebugFormat("set HrItems. itemsToAdd: {0}, itemsToRem: {1}", itemsToAdd.FlattenString(), itemsToRem.FlattenString());

            // индексы начала поиска в автокомплите для каждой сущности
            var dict = new Dictionary <IHrItemObject, int>();

            // ставим порядок
            bool reordered = false;
            var  hiosToBe  = willChios.Select(x => x.HIO).ToList();

            for (int i = 0; i < itemsToBe.Count; i++)
            {
                var e     = itemsToBe[i].Entity;
                int start = 0;
                dict.TryGetValue(e, out start);
                var index = hiosToBe.IndexOf(e, start);

                Debug.Assert(index != -1, "hiosToBe does not contain entity from itemsToBe");

                dict[e] = index + 1;

                reordered        = itemsToBe[i].Ord != index;
                itemsToBe[i].Ord = index;
            }

            logger.DebugFormat("set HrItems. itemsToBe: {0}", itemsToBe.FlattenString());

            foreach (var item in itemsToRem)
            {
                this.RemoveItem(item);
            }
            // добавляем элементы уже с порядком
            foreach (var item in itemsToAdd)
            {
                this.AddItem(item);
            }
            if (reordered || itemsToRem.Count > 0 || itemsToAdd.Count > 0)
            {
                OnItemsChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
            }
        }