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