Example #1
0
        protected char[] SetValue(char[]                 oldValue,
                                  char[]                 value,
                                  string name,
                                  ref ElementFieldFlags flag,
                                  Action <char[], char[]> onChangedAction = null)
        {
            bool changed;

            if (oldValue != null && value != null)
            {
                changed = oldValue.SequenceEqual(value) == false;
            }

            else
            {
                changed = Equals(oldValue,
                                 value) == false;
            }

            return(SetValue(changed,
                            oldValue,
                            value,
                            name,
                            ref flag,
                            onChangedAction));
        }
Example #2
0
        protected T SetValue <T>(bool changed,
                                 T oldValue,
                                 T value,
                                 string name,
                                 ref ElementFieldFlags flag,
                                 Action <T, T> onChangedAction = null)
        {
            if (changed)
            {
                ElementFieldFlags newFlag = FieldFlagMapping.SafeGet(name,
                                                                     ElementFieldFlags.None);

                if (newFlag != ElementFieldFlags.None)
                {
                    flag |= newFlag;
                }

                onChangedAction?.Invoke(oldValue,
                                        value);

#if DEBUG && !DEBUG_IN_PROD
                LogTo.Debug("[{0} {1}] {2}: {3}",
                            GetType().Name,
                            Id,
                            name,
                            value);
#endif
            }

            return(value);
        }
Example #3
0
        protected void OnElementUpdatedInternal(ElementBase el, ElementFieldFlags flags)
        {
            bool deleted = flags.HasFlag(ElementFieldFlags.Deleted);

            try
            {
                if (deleted)
                {
                    OnElementDeleted?.Invoke(new SMElementArgs(Core.SM, el));
                }

                else
                {
                    OnElementModified?.Invoke(new SMElementChangedArgs(Core.SM,
                                                                       el,
                                                                       flags));
                }
            }
            catch (Exception ex)
            {
                var eventType = deleted ? "Deleted" : "Modified";

                LogTo.Error(ex,
                            $"Error while signaling Element {eventType} event");
            }
            finally
            {
                if (el.Id == _waitForElementId)
                {
                    _waitForElementId = -1;
                    _waitForElementEvent.Set();
                }
            }
        }
 public SMElementChangedArgs(ISuperMemo smMgmt,
                             IElement element,
                             ElementFieldFlags changedFields)
     : base(smMgmt)
 {
     Element       = element;
     ChangedFields = changedFields;
 }
Example #5
0
        protected void OnElementUpdatedInternal(ElementBase el, ElementFieldFlags flags)
        {
            bool deleted = flags.HasFlag(ElementFieldFlags.Deleted);

            try
            {
                if (deleted)
                {
                    OnElementDeleted?.Invoke(new SMElementEventArgs(Core.SM, el));
                }

                else
                {
                    OnElementModified?.Invoke(new SMElementChangedEventArgs(Core.SM, el, flags));
                }
            }
            catch (Exception ex)
            {
                var eventType = deleted ? "Deleted" : "Modified";

                LogTo.Error(ex, "Error while signaling Element {EventType} event", eventType);
            }
            finally
            {
                LastElementId = el.Id;

                if (_waitForElementId == WaitForElementCreatedTriggerId && flags.HasFlag(ElementFieldFlags.Deleted) && el.Deleted == false)
                {
                    LastCreatedElementId    = el.Id;
                    _waitForElementId       = -1;
                    _waitForElementResultId = el.Id;

                    _waitForElementCreatedEvent.Set();
                }

                else if (_waitForElementId == WaitForElementUpdatedTriggerId || _waitForElementId == WaitForElementAnyTriggerId)
                {
                    LastUpdatedElementId    = el.Id;
                    _waitForElementId       = -1;
                    _waitForElementResultId = el.Id;

                    _waitForElementUpdatedEvent.Set();
                }

                else if (el.Id == _waitForElementId)
                {
                    _waitForElementId = -1;

                    _waitForElementIdEvent.Set();
                }

                _waitForElementAnyEvent.Set();
            }
        }
Example #6
0
        protected virtual ElementFieldFlags UpdateElement(
            ElementBase elem,
            InfContentsElem17 cttElem,
            InfElementsElemContainer17 elElem)
        {
#if DEBUG && !DEBUG_IN_PROD
            LogTo.Debug("[{0} {1}] Updating",
                        elem.GetType().Name,
                        elem.Id);
#endif

            ElementFieldFlags flags = ElementFieldFlags.None;

            void UpdateFlag(object sender, PropertyChangedEventArgs e)
            {
                var fieldFlag = ElementBase.FieldFlagMapping.SafeGet(e.PropertyName);

                flags |= fieldFlag;
            }

            elem.PropertyChanged += UpdateFlag;

            if (elElem != null)
            {
                elem.TitleTextId = elElem._elem.titleTextId;

                elem.TemplateId = elElem._elem.templateId;
                elem.ConceptId  = elElem._elem.conceptId;

                elem.ComponentPos = elElem._elem.componPos;
                // elem.AFactor = elElem._elem.AFactor
            }

            if (cttElem != null)
            {
                elem.Deleted = cttElem.deleted != 0;

                elem.ParentId      = cttElem.parentId;
                elem.FirstChildId  = cttElem.firstChildId;
                elem.LastChildId   = cttElem.lastChildId;
                elem.NextSiblingId = cttElem.nextSiblingId;
                elem.PrevSiblingId = cttElem.prevSiblingId;

                elem.DescendantCount = cttElem.descendantCount;
                elem.ChildrenCount   = cttElem.childrenCount;
            }

            elem.PropertyChanged -= UpdateFlag;

            elem.OnUpdated(flags);

            return(flags);
        }
Example #7
0
 public void OnUpdated(ElementFieldFlags flags)
 {
     try
     {
         OnChanged?.Invoke(new SMElementChangedEventArgs(Core.SM,
                                                         (IElement)this,
                                                         flags));
     }
     catch (Exception ex)
     {
         LogTo.Error(ex, "Error while signaling Element Changed event");
     }
 }
Example #8
0
        protected T SetValue <T>(T oldValue,
                                 T value,
                                 string name,
                                 ref ElementFieldFlags flag,
                                 Action <T, T> onChangedAction = null)
        {
            bool changed = Equals(oldValue,
                                  value) == false;

            return(SetValue(changed,
                            oldValue,
                            value,
                            name,
                            ref flag,
                            onChangedAction));
        }
Example #9
0
        public ElementFieldFlags Update(InfContentsElem cttElem,
                                        InfElementsElemContainer elElem)
        {
#if DEBUG && !DEBUG_IN_PROD
            LogTo.Debug("[{0} {1}] Updating",
                        GetType().Name,
                        Id);
#endif

            // TODO: Set/Clear events handlers on component change
            ElementFieldFlags flags = ElementFieldFlags.None;

            if (elElem != null)
            {
                TitleTextId = SetValue(TitleTextId,
                                       elElem._elem.titleTextId,
                                       nameof(TitleTextId),
                                       ref flags);

                TemplateId = SetValue(TemplateId,
                                      elElem._elem.templateId,
                                      nameof(TemplateId),
                                      ref flags);
                ConceptId = SetValue(ConceptId,
                                     elElem._elem.conceptId,
                                     nameof(ConceptId),
                                     ref flags);

                ComponentPos = SetValue(ComponentPos,
                                        elElem._elem.componPos,
                                        nameof(ComponentPos),
                                        ref flags,
                                        OnComponentPosChanged);
                //AFactor = SetDbg(elElem._elem.AFactor, nameof(AFactor));
            }

            if (cttElem != null)
            {
                Deleted = SetValue(Deleted,
                                   cttElem.deleted != 0,
                                   nameof(Deleted),
                                   ref flags);

                ParentId = SetValue(ParentId,
                                    cttElem.parentId,
                                    nameof(ParentId),
                                    ref flags);
                FirstChildId = SetValue(FirstChildId,
                                        cttElem.firstChildId,
                                        nameof(FirstChildId),
                                        ref flags);
                LastChildId = SetValue(LastChildId,
                                       cttElem.lastChildId,
                                       nameof(LastChildId),
                                       ref flags);
                NextSiblingId = SetValue(NextSiblingId,
                                         cttElem.nextSiblingId,
                                         nameof(NextSiblingId),
                                         ref flags);
                PrevSiblingId = SetValue(PrevSiblingId,
                                         cttElem.prevSiblingId,
                                         nameof(PrevSiblingId),
                                         ref flags);

                DescendantCount = SetValue(DescendantCount,
                                           cttElem.descendantCount,
                                           nameof(DescendantCount),
                                           ref flags);
                ChildrenCount = SetValue(ChildrenCount,
                                         cttElem.childrenCount,
                                         nameof(ChildrenCount),
                                         ref flags);
            }

            try
            {
                OnChanged?.Invoke(new SMElementChangedArgs(SMA.SMA.Instance,
                                                           (IElement)this,
                                                           flags));
            }
            catch (Exception ex)
            {
                LogTo.Error(ex,
                            "Error while signaling Element Changed event");
            }

            return(flags);
        }