private static void WriteDescription(this MamlWriter writer, ChildEntry entry, Context context)
 {
     if (entry.Particle != null)
     {
         writer.WriteSummaryForObject(context, entry.Particle);
     }
 }
        private static void WriteName(this MamlWriter writer, ChildEntry entry, TopicManager topicManager)
        {
            switch (entry.ChildType)
            {
            case ChildType.Element:
            case ChildType.ElementExtension:
                var element     = (XmlSchemaElement)entry.Particle;
                var isExtension = (entry.ChildType == ChildType.ElementExtension);
                writer.WriteElementLink(topicManager, element, isExtension);
                break;

            case ChildType.Any:
                writer.WriteHtmlArtItemWithText(ArtItem.AnyElement, "Any");
                break;

            case ChildType.All:
                writer.WriteHtmlArtItemWithText(ArtItem.All, "All");
                break;

            case ChildType.Choice:
                writer.WriteHtmlArtItemWithText(ArtItem.Choice, "Choice");
                break;

            case ChildType.Sequence:
                writer.WriteHtmlArtItemWithText(ArtItem.Sequence, "Sequence");
                break;

            default:
                throw ExceptionBuilder.UnhandledCaseLabel(entry.ChildType);
            }
        }
Example #3
0
        /// <summary>
        /// Update child life according to the current time.
        /// The entry should be in <see cref="childStateMap"/>.
        /// If the current state is <see cref="LifetimeState.Current"/> then
        /// the child should be contained in <see cref="CompositeDrawable.AliveInternalChildren"/>.
        /// Otherwise, the entry should already be removed from the corresponding list.
        /// </summary>
        /// <returns>Whether <see cref="CompositeDrawable.AliveInternalChildren"/> has changed.</returns>
        private bool updateChildEntry([NotNull] ChildEntry entry, bool onChildLifetimeChange = false)
        {
            var child    = entry.Drawable;
            var oldState = entry.State;

            Debug.Assert(child.LoadState >= LoadState.Ready);
            Debug.Assert(childStateMap.TryGetValue(child, out var e) && e == entry);
            Debug.Assert(oldState != LifetimeState.Current || AliveInternalChildren.Contains(child));
            Debug.Assert(!futureChildren.Contains(entry) && !pastChildren.Contains(entry));

            var currentTime = Time.Current;
            var newState    =
                currentTime < entry.LifetimeStart ? LifetimeState.Future :
                entry.LifetimeEnd <= currentTime ? LifetimeState.Past :
                LifetimeState.Current;

            if (newState == oldState)
            {
                // We need to re-insert to future/past children even if lifetime state is not changed if it is from ChildLifetimeChange.
                if (onChildLifetimeChange)
                {
                    futureOrPastChildren(newState)?.Add(entry);
                }
                else
                {
                    Debug.Assert(newState != LifetimeState.Future && newState != LifetimeState.Past);
                }
                return(false);
            }

            bool aliveChildrenChanged = false;

            if (newState == LifetimeState.Current)
            {
                MakeChildAlive(child);
                aliveChildrenChanged = true;
            }
            else if (oldState == LifetimeState.Current)
            {
                bool removed = MakeChildDead(child);
                Trace.Assert(!removed, $"{nameof(RemoveWhenNotAlive)} is not supported for children of {nameof(LifetimeManagementContainer)}");
                aliveChildrenChanged = true;
            }

            entry.State = newState;
            futureOrPastChildren(newState)?.Add(entry);

            enqueueEvents(child, oldState, newState);

            return(aliveChildrenChanged);
        }
        private static void WriteOccurrence(this MamlWriter writer, ChildEntry entry)
        {
            if (entry.MinOccurs == 1 && entry.MaxOccurs == 1)
            {
                return;
            }

            if (entry.MaxOccurs == decimal.MaxValue)
            {
                writer.WriteString("[{0}, *]", entry.MinOccurs);
            }
            else
            {
                writer.WriteString("[{0}, {1}]", entry.MinOccurs, entry.MaxOccurs);
            }
        }
        private static int CompareChildEntries(ChildEntry x, ChildEntry y)
        {
            if (x.ChildType == ChildType.Element &&
                y.ChildType == ChildType.Element ||
                x.ChildType == ChildType.ElementExtension &&
                y.ChildType == ChildType.ElementExtension)
            {
                var xElement = (XmlSchemaElement)x.Particle;
                var yElement = (XmlSchemaElement)y.Particle;
                return(xElement.QualifiedName.Name.CompareTo(yElement.QualifiedName.Name));
            }

            if (x.ChildType == y.ChildType)
            {
                return(0);
            }

            if (x.ChildType == ChildType.Any)
            {
                return(1);
            }

            if (y.ChildType == ChildType.Any)
            {
                return(-1);
            }

            if (x.ChildType != ChildType.Element)
            {
                return(-1);
            }

            if (y.ChildType != ChildType.Element)
            {
                return(1);
            }

            return(0);
        }
Example #6
0
        protected override bool CheckChildrenLife()
        {
            // We have to at least wait until Clock becomes available.
            if (LoadState != LoadState.Loaded)
            {
                return(false);
            }

            bool aliveChildrenChanged = false;

            // Move loaded children to appropriate list.
            for (var i = newChildren.Count - 1; i >= 0; --i)
            {
                FrameStatistics.Increment(StatisticsCounterType.CCL);
                var child = newChildren[i];

                if (child.LoadState >= LoadState.Ready)
                {
                    Debug.Assert(!childStateMap.ContainsKey(child));

                    newChildren.RemoveAt(i);

                    var entry = new ChildEntry(child);
                    childStateMap.Add(child, entry);

                    aliveChildrenChanged |= updateChildEntry(entry);
                }
            }

            var currentTime = Time.Current;

            // Checks for newly alive children when time is increased or new children added.
            while (futureChildren.Count > 0)
            {
                FrameStatistics.Increment(StatisticsCounterType.CCL);
                var entry = futureChildren.Min;
                Debug.Assert(entry.State == LifetimeState.Future);

                if (currentTime < entry.LifetimeStart)
                {
                    break;
                }

                futureChildren.Remove(entry);

                aliveChildrenChanged |= updateChildEntry(entry);
            }

            while (pastChildren.Count > 0)
            {
                FrameStatistics.Increment(StatisticsCounterType.CCL);
                var entry = pastChildren.Max;
                Debug.Assert(entry.State == LifetimeState.Past);

                if (entry.LifetimeEnd <= currentTime)
                {
                    break;
                }

                pastChildren.Remove(entry);

                aliveChildrenChanged |= updateChildEntry(entry);
            }

            for (var i = AliveInternalChildren.Count - 1; i >= 0; --i)
            {
                FrameStatistics.Increment(StatisticsCounterType.CCL);
                var child = AliveInternalChildren[i];
                Debug.Assert(childStateMap.ContainsKey(child));
                var entry = childStateMap[child];

                aliveChildrenChanged |= updateChildEntry(entry);
            }

            Debug.Assert(newChildren.Count + futureChildren.Count + pastChildren.Count + AliveInternalChildren.Count == InternalChildren.Count);

            while (eventQueue.Count != 0)
            {
                var e = eventQueue.Dequeue();
                OnChildLifetimeBoundaryCrossed(e);
            }

            return(aliveChildrenChanged);
        }
 public void Remove(ChildEntry entry)
 {
     Entries.Remove(entry);
 }
 public void Add()
 {
     Entries.Add(NewEntry);
     NewEntry = new ChildEntry();
 }
Example #9
0
 /// <summary>
 ///     Removes the entry with the specified id.
 /// </summary>
 /// <param name="id"> The id. </param>
 /// <param name="entry"> The entry. </param>
 public virtual void RemoveEntry(int id, ChildEntry entry)
 {
     entries.Remove(id);
 }
Example #10
0
 /// <summary>
 ///     Replaces or inserts the child entry with the specified id.
 /// </summary>
 /// <param name="id"> The id. </param>
 /// <param name="entry"> The entry. </param>
 public virtual void PutEntry(int id, ChildEntry entry)
 {
     entries.Add(id, entry);
 }
Example #11
0
 async void Add_Children_Handler(object sender, EventArgs e)
 {
     var childEntryPage = new ChildEntry();
     await Navigation.PushModalAsync(childEntryPage);
 }