fix build
[mono.git] / mcs / class / System.Design / System.ComponentModel.Design.Serialization / CodeDomSerializer.cs
1 //
2 // System.ComponentModel.Design.Serialization.CodeDomSerializer
3 //
4 // Authors:
5 //        Ivan N. Zlatev (contact i-nZ.net)
6 //
7 // (C) 2007 Ivan N. Zlatev
8
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 //
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 //
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //
29
30 #if NET_2_0
31
32 using System;
33 using System.Collections;
34 using System.ComponentModel;
35 using System.ComponentModel.Design;
36
37 using System.CodeDom;
38
39 namespace System.ComponentModel.Design.Serialization
40 {
41         public class CodeDomSerializer : CodeDomSerializerBase
42         {
43
44                 public CodeDomSerializer ()
45                 {
46                 }
47
48
49                 public virtual object SerializeAbsolute (IDesignerSerializationManager manager, object value)
50                 {
51                         if (value == null)
52                                 throw new ArgumentNullException ("value");
53                         if (manager == null)
54                                 throw new ArgumentNullException ("manager");
55
56                         SerializeAbsoluteContext context = new SerializeAbsoluteContext ();
57                         manager.Context.Push (context);
58                         object result = this.Serialize (manager, value);
59                         manager.Context.Pop ();
60                         return result;
61                 }
62
63                 public virtual object Serialize (IDesignerSerializationManager manager, object value)
64                 {
65                         if (value == null)
66                                 throw new ArgumentNullException ("value");
67                         if (manager == null)
68                                 throw new ArgumentNullException ("manager");
69
70                         object serialized = null;
71                         bool isComplete = false;
72                         CodeExpression createExpr = base.SerializeCreationExpression (manager, value, out isComplete);
73                         if (createExpr != null) {
74                                 if (isComplete) {
75                                         serialized = createExpr;
76                                 } else {
77                                         CodeStatementCollection statements = new CodeStatementCollection ();
78                                         base.SerializeProperties (manager, statements, value, new Attribute[0]);
79                                         base.SerializeEvents (manager, statements, value, new Attribute[0]);
80                                         serialized = statements;
81                                 }
82                                 base.SetExpression (manager, value, createExpr);
83                         }
84                         return serialized;
85                 }
86
87                 [Obsolete ("This method has been deprecated. Use SerializeToExpression or GetExpression instead.")] 
88                 protected CodeExpression SerializeToReferenceExpression (IDesignerSerializationManager manager, object value)
89                 {
90                         return base.SerializeToExpression (manager, value);
91                 }
92
93                 // I am not sure what this does, but the only name I can think of this can get is a variable name from 
94                 // the expression
95                 public virtual string GetTargetComponentName (CodeStatement statement, CodeExpression expression, Type targetType)
96                 {
97                         if (expression is CodeFieldReferenceExpression)
98                                 return ((CodeFieldReferenceExpression) expression).FieldName;
99                         else if (expression is CodeVariableReferenceExpression)
100                                 return ((CodeVariableReferenceExpression) expression).VariableName;
101                         return null;
102                 }
103
104                 public virtual CodeStatementCollection SerializeMember (IDesignerSerializationManager manager, 
105                                                                         object owningobject, MemberDescriptor member)
106                 {
107                         if (member == null)
108                                 throw new ArgumentNullException ("member");
109                         if (owningobject == null)
110                                 throw new ArgumentNullException ("owningobject");
111                         if (manager == null)
112                                 throw new ArgumentNullException ("manager");
113
114                         CodeStatementCollection statements = new CodeStatementCollection ();
115
116                         CodeExpression expression = base.GetExpression (manager, owningobject);
117                         if (expression == null) {
118                                 string name = manager.GetName (owningobject);
119                                 if (name == null)
120                                         name = base.GetUniqueName (manager, owningobject);
121                                 expression = new CodeVariableReferenceExpression (name);
122                                 base.SetExpression (manager, owningobject, expression);
123                         }
124
125                         if (member is PropertyDescriptor)
126                                 base.SerializeProperty (manager, statements, owningobject, (PropertyDescriptor) member);
127                         if (member is EventDescriptor)
128                                 base.SerializeEvent (manager, statements, owningobject, (EventDescriptor) member);
129
130                         return statements;
131                 }
132
133                 public virtual CodeStatementCollection SerializeMemberAbsolute (IDesignerSerializationManager manager, 
134                                                                                 object owningobject, MemberDescriptor member)
135                 {
136                         if (member == null)
137                                 throw new ArgumentNullException ("member");
138                         if (owningobject == null)
139                                 throw new ArgumentNullException ("owningobject");
140                         if (manager == null)
141                                 throw new ArgumentNullException ("manager");
142
143                         SerializeAbsoluteContext context = new SerializeAbsoluteContext (member);
144                         manager.Context.Push (context);
145                         CodeStatementCollection result = this.SerializeMember (manager, owningobject, member);
146                         manager.Context.Pop ();
147                         return result;
148                 }
149
150
151                 public virtual object Deserialize (IDesignerSerializationManager manager, object codeObject)
152                 {
153                         object deserialized = null;
154
155                         CodeExpression expression = codeObject as CodeExpression;
156                         if (expression != null)
157                                 deserialized = base.DeserializeExpression (manager, null, expression);
158
159                         CodeStatement statement = codeObject as CodeStatement;
160                         if (statement != null)
161                                 deserialized = DeserializeStatementToInstance (manager, statement);
162
163                         CodeStatementCollection statements = codeObject as CodeStatementCollection;
164                         if (statements != null) {
165                                 foreach (CodeStatement s in statements) {
166                                         if (deserialized == null)
167                                                 deserialized = DeserializeStatementToInstance (manager, s);
168                                         else
169                                                 DeserializeStatement (manager, s);
170                                 }
171                         }
172                         return deserialized;
173                 }
174
175                 protected object DeserializeStatementToInstance (IDesignerSerializationManager manager, CodeStatement statement)
176                 {
177                         CodeAssignStatement assignment = statement as CodeAssignStatement;
178                         if (assignment != null) {
179                                 // CodeFieldReferenceExpression
180                                 //
181                                 CodeFieldReferenceExpression fieldRef = assignment.Left as CodeFieldReferenceExpression;
182                                 if (fieldRef != null)
183                                         return base.DeserializeExpression (manager, fieldRef.FieldName, assignment.Right);
184                         }
185                         base.DeserializeStatement (manager, statement);
186                         return null;
187                 }
188         }
189 }
190 #endif