2 using System.Reflection;
4 using System.Windows.Serialization;
6 using System.Diagnostics;
8 namespace Mono.Windows.Serialization {
9 internal abstract class ParserConsumerBase {
10 internal void crunch (XmlTextReader reader) {
12 XamlParser p = new XamlParser(reader);
18 Debug.WriteLine(this.GetType() + ": INCOMING " + n.GetType());
19 if (n is XamlDocumentStartNode) {
20 Debug.WriteLine(this.GetType() + ": document begins");
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);
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;
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);
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);
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);
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) {
72 } else if (justClosed == 1) {
73 EndDependencyProperty();
75 throw new NotImplementedException("justClosed of " + justClosed);
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);
87 } else if (((XamlElementEndNode)n).depPropertyObject) {
88 EndDependencyPropertyObject(ft);
93 } else if (n is XamlDocumentEndNode) {
94 Debug.WriteLine(this.GetType() + ": end document");
97 throw new Exception("Unknown node " + n.GetType());
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();