cc334af1982440c28b8f118b9b7c6610d3fb7235
[mono.git] / mcs / class / PresentationFramework / Mono.Windows.Serialization / ParserConsumerBase.cs
1 using System;
2 using System.Reflection;
3 using System.Windows;
4 using System.Windows.Serialization;
5 using System.Xml;
6 using System.Diagnostics;
7
8 namespace Mono.Windows.Serialization {
9         internal abstract class ParserConsumerBase {
10                 internal void crunch (XmlTextReader reader) {
11                         int justClosed = 0;
12                         XamlParser p = new XamlParser(reader);
13                         XamlNode n;
14                         while (true) {
15                                 n = p.GetNextNode();
16                                 if (n == null)
17                                         break;
18                                 Debug.WriteLine(this.GetType() + ": INCOMING " + n.GetType());
19                                 if (n is XamlDocumentStartNode) {
20                                         Debug.WriteLine(this.GetType() + ": document begins");
21                                         // do nothing
22                                 } else if (n is XamlElementStartNode && n.Depth == 0) {
23                                         Debug.WriteLine(this.GetType() + ": element begins as top-level");
24                                         CreateTopLevel(((XamlElementStartNode)n).ElementType, ((XamlElementStartNode)n).name);
25                                 } else if (n is XamlElementStartNode && ((XamlElementStartNode)n).propertyObject) {
26                                         Debug.WriteLine(this.GetType() + ": element begins as property value");
27                                         CreatePropertyObject(((XamlElementStartNode)n).ElementType, ((XamlElementStartNode)n).name);
28                                 } else if (n is XamlElementStartNode && ((XamlElementStartNode)n).depPropertyObject) {
29                                         Debug.WriteLine(this.GetType() + ": element begins as dependency property value");
30                                         CreateDependencyPropertyObject(((XamlElementStartNode)n).ElementType, ((XamlElementStartNode)n).name);
31
32                                 } else if (n is XamlElementStartNode) {
33                                         Debug.WriteLine(this.GetType() + ": element begins");
34                                         CreateObject(((XamlElementStartNode)n).ElementType, ((XamlElementStartNode)n).name);
35                                 } else if (n is XamlPropertyNode && ((XamlPropertyNode)n).PropInfo != null) {
36                                         Debug.WriteLine(this.GetType() + ": normal property begins");
37                                         CreateProperty(((XamlPropertyNode)n).PropInfo);
38                                 } else if (n is XamlPropertyNode && ((XamlPropertyNode)n).DP != null) {
39                                         Debug.WriteLine(this.GetType() + ": dependency property begins");
40                                         DependencyProperty dp = ((XamlPropertyNode)n).DP;
41                                         Type typeAttachedTo = dp.OwnerType;
42                                         string propertyName = ((XamlPropertyNode)n).PropertyName;
43                                         
44                                         CreateDependencyProperty(typeAttachedTo, propertyName, dp.PropertyType);
45                                 } else if (n is XamlClrEventNode && !(((XamlClrEventNode)n).EventMember is EventInfo)) {
46                                         Debug.WriteLine(this.GetType() + ": delegate property");
47                                         CreatePropertyDelegate(((XamlClrEventNode)n).Value, ((PropertyInfo)((XamlClrEventNode)n).EventMember).PropertyType);
48                                         EndProperty();
49
50
51                                 } else if (n is XamlClrEventNode) {
52                                         Debug.WriteLine(this.GetType() + ": event");
53                                         CreateEvent((EventInfo)((XamlClrEventNode)n).EventMember);
54                                         CreateEventDelegate(((XamlClrEventNode)n).Value, ((EventInfo)((XamlClrEventNode)n).EventMember).EventHandlerType);
55                                         EndEvent();
56
57                                 } else if (n is XamlTextNode && ((XamlTextNode)n).mode == XamlParseMode.Object){
58                                         Debug.WriteLine(this.GetType() + ": text for object");
59                                         CreateObjectText(((XamlTextNode)n).TextContent);
60                                 } else if (n is XamlTextNode && ((XamlTextNode)n).mode == XamlParseMode.Property){
61                                         Debug.WriteLine(this.GetType() + ": text for property");
62                                         CreatePropertyText(((XamlTextNode)n).TextContent, ((XamlTextNode)n).finalType);
63                                         EndProperty();
64                                 } else if (n is XamlTextNode && ((XamlTextNode)n).mode == XamlParseMode.DependencyProperty){
65                                         Debug.WriteLine(this.GetType() + ": text for dependency property");
66                                         CreateDependencyPropertyText(((XamlTextNode)n).TextContent, ((XamlTextNode)n).finalType);
67                                         EndDependencyProperty();
68                                 } else if (n is XamlPropertyComplexEndNode) {
69                                         Debug.WriteLine(this.GetType() + ": end complex property");
70                                         if (justClosed == 2) {
71                                                 EndProperty();
72                                         } else if (justClosed == 1) {
73                                                 EndDependencyProperty();
74                                         } else {
75                                                 throw new NotImplementedException("justClosed of " + justClosed);
76                                         }
77                                         justClosed = 0;
78                                 } else if (n is XamlLiteralContentNode) {
79                                         Debug.WriteLine(this.GetType() + ": literal content");
80                                         CreateCode(((XamlLiteralContentNode)n).Content);
81                                 } else if (n is XamlElementEndNode) {
82                                         Debug.WriteLine(this.GetType() + ": end element");
83                                         Type ft = ((XamlElementEndNode)n).finalType;
84                                         if (((XamlElementEndNode)n).propertyObject) {
85                                                 EndPropertyObject(ft);
86                                                 justClosed = 2;
87                                         } else if (((XamlElementEndNode)n).depPropertyObject) {
88                                                 EndDependencyPropertyObject(ft);
89                                                 justClosed = 1;
90                                         } else {
91                                                 EndObject();
92                                         }
93                                 } else if (n is XamlDocumentEndNode) {
94                                         Debug.WriteLine(this.GetType() + ": end document");
95                                         Finish();
96                                 } else {
97                                         throw new Exception("Unknown node " + n.GetType());
98                                 }
99                         }
100
101                 }
102
103                 
104                 public abstract void CreateTopLevel(Type parent, string className);
105                 public abstract void CreateObject(Type type, string varName);
106                 public abstract void CreateProperty(PropertyInfo property);
107                 public abstract void CreateEvent(EventInfo evt);
108                 public abstract void CreateDependencyProperty(Type attachedTo, string propertyName, Type propertyType);
109                 public abstract void EndDependencyProperty();
110                 public abstract void CreateObjectText(string text);
111                 public abstract void CreateEventDelegate(string functionName, Type eventDelegateType);
112                 public abstract void CreatePropertyDelegate(string functionName, Type propertyType);
113                 public abstract void CreatePropertyText(string text, Type propertyType);
114                 public abstract void CreateDependencyPropertyText(string text, Type propertyType);
115                 public abstract void CreateDependencyPropertyObject(Type type, string varName);
116                 public abstract void CreatePropertyObject(Type type, string varName);
117                 public abstract void EndDependencyPropertyObject(Type destType);
118                 public abstract void EndPropertyObject(Type destType);
119                 public abstract void EndObject();
120                 public abstract void EndProperty();
121                 public abstract void EndEvent();
122                 public abstract void CreateCode(string code);
123                 public abstract void Finish();
124
125         }
126 }