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

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'mcs/class/PresentationFramework/Mono.Windows.Serialization/ParserConsumerBase.cs')
-rw-r--r--mcs/class/PresentationFramework/Mono.Windows.Serialization/ParserConsumerBase.cs126
1 files changed, 126 insertions, 0 deletions
diff --git a/mcs/class/PresentationFramework/Mono.Windows.Serialization/ParserConsumerBase.cs b/mcs/class/PresentationFramework/Mono.Windows.Serialization/ParserConsumerBase.cs
new file mode 100644
index 00000000000..cc334af1982
--- /dev/null
+++ b/mcs/class/PresentationFramework/Mono.Windows.Serialization/ParserConsumerBase.cs
@@ -0,0 +1,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();
+
+ }
+}