93e08a34957c6c29cc651e342660a96548d20edd
[mono.git] / mcs / class / referencesource / System.Activities / System / Activities / XamlIntegration / XamlWriterExtensions.cs
1 //----------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation.  All rights reserved.
3 //----------------------------------------------------------------
4
5 namespace System.Activities.XamlIntegration
6 {
7     using System;
8     using System.Xaml;
9     using System.Runtime;
10
11     static class XamlWriterExtensions
12     {
13         public static void PropagateLineInfo(XamlWriter targetWriter, IXamlLineInfo lineInfo)
14         {
15             if (lineInfo != null)
16             {
17                 IXamlLineInfoConsumer consumer = targetWriter as IXamlLineInfoConsumer;            
18                 Fx.Assert(consumer != null && consumer.ShouldProvideLineInfo, "Should only call this function to write into a XamlNodeQueue.Writer, which is always IXamlLineInfoConsumer");
19                 consumer.SetLineInfo(lineInfo.LineNumber, lineInfo.LinePosition);                
20             }
21         }
22
23         public static void PropagateLineInfo(XamlWriter targetWriter, int lineNumber, int linePosition)
24         {
25             IXamlLineInfoConsumer consumer = targetWriter as IXamlLineInfoConsumer;
26             Fx.Assert(consumer != null && consumer.ShouldProvideLineInfo, "Should only call this function to write into a XamlNodeQueue.Writer, which is always IXamlLineInfoConsumer");
27             consumer.SetLineInfo(lineNumber, linePosition);
28         }
29         
30         // This method is a workaround for TFS 
31         public static void Transform(XamlReader reader, XamlWriter writer, IXamlLineInfo readerLineInfo, bool closeWriter)
32         {
33             IXamlLineInfoConsumer consumer = writer as IXamlLineInfoConsumer;
34             Fx.Assert(consumer != null && consumer.ShouldProvideLineInfo, "Should only call this function to write into a XamlNodeQueue.Writer, which is always IXamlLineInfoConsumer");
35             bool shouldPassLineNumberInfo = false;
36             if (readerLineInfo != null)
37             {
38                 shouldPassLineNumberInfo = true;
39             }
40
41             while (reader.Read())
42             {
43                 if (shouldPassLineNumberInfo)
44                 {
45                     consumer.SetLineInfo(readerLineInfo.LineNumber, readerLineInfo.LinePosition);                    
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 }