public void BufferDefinitions(DynamicActivityXamlReader parent) { XamlReader reader = parent.innerReader.ReadSubtree(); IXamlLineInfo innerReaderLineInfo = parent.innerReaderLineInfo; reader.Read(); this.outerNodes.Writer.WriteStartMember(parent.activityReplacementXamlType.GetMember("Properties"), innerReaderLineInfo); this.outerNodes.Writer.WriteGetObject(innerReaderLineInfo); this.outerNodes.Writer.WriteStartMember(XamlLanguage.Items, innerReaderLineInfo); bool flag = reader.Read(); while (flag) { if ((reader.NodeType == XamlNodeType.StartObject) && (reader.Type == XamlLanguage.Property)) { ActivityPropertyHolder holder = new ActivityPropertyHolder(parent, reader.ReadSubtree()); this.PropertyHolders.Add(holder.Name, holder); this.outerNodes.Writer.WriteValue(holder, innerReaderLineInfo); } else { this.outerNodes.Writer.WriteNode(reader, innerReaderLineInfo); flag = reader.Read(); } } this.outerNodes.Writer.WriteEndObject(innerReaderLineInfo); this.outerNodes.Writer.WriteEndMember(innerReaderLineInfo); reader.Close(); this.alreadyBufferedDefinitions = true; this.FlushValueHolders(parent); }
public void FlushTo(XamlNodeQueue targetNodeQueue, DynamicActivityXamlReader parent) { this.FlushValueHolders(parent); XamlReader reader = this.outerNodes.Reader; IXamlLineInfo readerInfo = parent.hasLineInfo ? (reader as IXamlLineInfo) : null; while (reader.Read()) { if (reader.NodeType == XamlNodeType.Value) { ActivityPropertyHolder holder = reader.Value as ActivityPropertyHolder; if (holder != null) { holder.CopyTo(targetNodeQueue, readerInfo); continue; } } targetNodeQueue.Writer.WriteNode(reader, readerInfo); } }
// Called inside of an x:Members--read up to </x:Members>, buffering definitions public void BufferDefinitions(DynamicActivityXamlReader parent) { XamlReader subReader = parent.innerReader.ReadSubtree(); IXamlLineInfo readerLineInfo = parent.innerReaderLineInfo; // 1) swap out the start member with <DynamicActivity.Properties> subReader.Read(); Fx.Assert(subReader.NodeType == XamlNodeType.StartMember && subReader.Member == XamlLanguage.Members, "Should be inside of x:Members before calling BufferDefinitions"); this.outerNodes.Writer.WriteStartMember(parent.activityReplacementXamlType.GetMember("Properties"), readerLineInfo); // x:Members directive has no following GetObject, but Properties does since it's not a directive this.outerNodes.Writer.WriteGetObject(readerLineInfo); this.outerNodes.Writer.WriteStartMember(XamlLanguage.Items, readerLineInfo); // 2) process the subnodes and store them in either ActivityPropertyHolders, // or exigent nodes in the outer node list bool continueReading = subReader.Read(); while (continueReading) { if (subReader.NodeType == XamlNodeType.StartObject && subReader.Type == XamlLanguage.Property) { // we found an x:Property. Store it in an ActivityPropertyHolder ActivityPropertyHolder newProperty = new ActivityPropertyHolder(parent, subReader.ReadSubtree()); this.PropertyHolders.Add(newProperty.Name, newProperty); // and stash away a proxy node to map later this.outerNodes.Writer.WriteValue(newProperty, readerLineInfo); // ActivityPropertyHolder consumed the subtree, so we don't need to pump a Read() in this path } else { // it's not an x:Property. Store it in our extra node list this.outerNodes.Writer.WriteNode(subReader, readerLineInfo); continueReading = subReader.Read(); } } // close the GetObject added above. Note that we are doing EndObject/EndMember after the last node (EndMember) // rather than inserting EndMember/EndObject before the last EndMember since all EndMembers are interchangable from a state perspective this.outerNodes.Writer.WriteEndObject(readerLineInfo); this.outerNodes.Writer.WriteEndMember(readerLineInfo); subReader.Close(); this.alreadyBufferedDefinitions = true; FlushValueHolders(); }