8b73e31c731c583d685fafa6836e3fa82dbd889c
[mono.git] / mcs / class / referencesource / System.Activities.Presentation / Microsoft.Tools.Common / Microsoft / Activities / Presentation / Xaml / XamlWriterExtensions.cs
1 // <copyright>
2 //   Copyright (c) Microsoft Corporation.  All rights reserved.
3 // </copyright>
4
5 namespace Microsoft.Activities.Presentation.Xaml
6 {
7     using System.Xaml;
8
9     // 
10     internal static class XamlWriterExtensions
11     {
12         public static void PropagateLineInfo(XamlWriter targetWriter, IXamlLineInfo lineInfo)
13         {
14             if (lineInfo != null)
15             {
16                 IXamlLineInfoConsumer consumer = targetWriter as IXamlLineInfoConsumer;
17                 SharedFx.Assert(consumer != null && consumer.ShouldProvideLineInfo, "Should only call this function to write into a XamlNodeQueue.Writer, which is always IXamlLineInfoConsumer");
18                 consumer.SetLineInfo(lineInfo.LineNumber, lineInfo.LinePosition);
19             }
20         }
21
22         public static void PropagateLineInfo(XamlWriter targetWriter, int lineNumber, int linePosition)
23         {
24             IXamlLineInfoConsumer consumer = targetWriter as IXamlLineInfoConsumer;
25             SharedFx.Assert(consumer != null && consumer.ShouldProvideLineInfo, "Should only call this function to write into a XamlNodeQueue.Writer, which is always IXamlLineInfoConsumer");
26             consumer.SetLineInfo(lineNumber, linePosition);
27         }
28
29         // This method is a workaround for TFS bug #788190, since XamlReader.ReadSubtree() should (but doesn't) preserve IXamlLineInfo on the subreader
30         public static void Transform(XamlReader reader, XamlWriter writer, IXamlLineInfo readerLineInfo, bool closeWriter)
31         {
32             IXamlLineInfoConsumer consumer = writer as IXamlLineInfoConsumer;
33             SharedFx.Assert(consumer != null && consumer.ShouldProvideLineInfo, "Should only call this function to write into a XamlNodeQueue.Writer, which is always IXamlLineInfoConsumer");
34             bool shouldPassLineNumberInfo = false;
35             if (readerLineInfo != null)
36             {
37                 shouldPassLineNumberInfo = true;
38             }
39
40             while (reader.Read())
41             {
42                 if (shouldPassLineNumberInfo)
43                 {
44                     consumer.SetLineInfo(readerLineInfo.LineNumber, readerLineInfo.LinePosition);
45                 }
46
47                 writer.WriteNode(reader);
48             }
49
50             if (closeWriter)
51             {
52                 writer.Close();
53             }
54         }
55
56         public static void WriteNode(this XamlWriter writer, XamlReader reader, IXamlLineInfo lineInfo)
57         {
58             PropagateLineInfo(writer, lineInfo);
59             writer.WriteNode(reader);
60         }
61
62         public static void WriteEndMember(this XamlWriter writer, IXamlLineInfo lineInfo)
63         {
64             PropagateLineInfo(writer, lineInfo);
65             writer.WriteEndMember();
66         }
67
68         public static void WriteEndObject(this XamlWriter writer, IXamlLineInfo lineInfo)
69         {
70             PropagateLineInfo(writer, lineInfo);
71             writer.WriteEndObject();
72         }
73
74         public static void WriteGetObject(this XamlWriter writer, IXamlLineInfo lineInfo)
75         {
76             PropagateLineInfo(writer, lineInfo);
77             writer.WriteGetObject();
78         }
79
80         public static void WriteNamespace(this XamlWriter writer, NamespaceDeclaration namespaceDeclaration, IXamlLineInfo lineInfo)
81         {
82             PropagateLineInfo(writer, lineInfo);
83             writer.WriteNamespace(namespaceDeclaration);
84         }
85
86         public static void WriteStartMember(this XamlWriter writer, XamlMember xamlMember, IXamlLineInfo lineInfo)
87         {
88             PropagateLineInfo(writer, lineInfo);
89             writer.WriteStartMember(xamlMember);
90         }
91
92         public static void WriteStartMember(this XamlWriter writer, XamlMember xamlMember, int lineNumber, int linePosition)
93         {
94             PropagateLineInfo(writer, lineNumber, linePosition);
95             writer.WriteStartMember(xamlMember);
96         }
97
98         public static void WriteStartObject(this XamlWriter writer, XamlType type, IXamlLineInfo lineInfo)
99         {
100             PropagateLineInfo(writer, lineInfo);
101             writer.WriteStartObject(type);
102         }
103
104         public static void WriteValue(this XamlWriter writer, object value, IXamlLineInfo lineInfo)
105         {
106             PropagateLineInfo(writer, lineInfo);
107             writer.WriteValue(value);
108         }
109     }
110 }