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