Welcome to mirror list, hosted at ThFree Co, Russian Federation.

ParserConsumerBase.cs « Mono.Windows.Serialization « PresentationFramework « class « mcs - github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: cc334af1982440c28b8f118b9b7c6610d3fb7235 (plain)
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();

	}
}