Procházet zdrojové kódy

2007-12-18 Ivan N. Zlatev <[email protected]>

        * ControlCodeDomSerializer.cs: Add. Handles Resume/Suspend
        layout serialization.
        * ControlCollectionCodeDomSerializer.cs: Add.
        * DesignerSerializationManager.cs: DesignerSerializerAttribute
        should have higher precedence than the serializer providers.


svn path=/trunk/mcs/; revision=91575
Ivan Zlatev před 18 roky
rodič
revize
feed353065

+ 8 - 0
mcs/class/System.Design/System.ComponentModel.Design.Serialization/Changelog

@@ -1,3 +1,11 @@
+2007-12-18  Ivan N. Zlatev  <[email protected]>
+
+	* ControlCodeDomSerializer.cs: Add. Handles Resume/Suspend
+	layout serialization.
+	* ControlCollectionCodeDomSerializer.cs: Add.
+	* DesignerSerializationManager.cs: DesignerSerializerAttribute
+	should have higher precedence than the serializer providers.
+
 2007-11-01  Ivan N. Zlatev  <[email protected]>
 
 	* CodeDomSerializerBase.cs:

+ 20 - 22
mcs/class/System.Design/System.ComponentModel.Design.Serialization/DesignerSerializationManager.cs

@@ -246,16 +246,31 @@ namespace System.ComponentModel.Design.Serialization
 				DefaultSerializationProviderAttribute providerAttribute = attributes[typeof (DefaultSerializationProviderAttribute)] 
 																			   as DefaultSerializationProviderAttribute;
 				if (providerAttribute != null && this.GetType (providerAttribute.ProviderTypeName) == serializerType) {
-					
 					object provider = Activator.CreateInstance (this.GetType (providerAttribute.ProviderTypeName), 
 																 BindingFlags.CreateInstance | BindingFlags.Public | BindingFlags.NonPublic, 
 																 null, null, null);
-	
 					((IDesignerSerializationManager)this).AddSerializationProvider ((IDesignerSerializationProvider) provider);
 				}
 			}
-			
-			// try 2: from provider
+
+			// try 2: DesignerSerializerAttribute
+			//
+			if (serializer == null && componentType != null) {
+				AttributeCollection attributes = TypeDescriptor.GetAttributes (componentType);
+				DesignerSerializerAttribute serializerAttribute = attributes[typeof (DesignerSerializerAttribute)] as DesignerSerializerAttribute;
+				if (serializerAttribute != null && 
+					this.GetType (serializerAttribute.SerializerBaseTypeName) == serializerType) {
+					serializer = Activator.CreateInstance (this.GetType (serializerAttribute.SerializerTypeName), 
+														   BindingFlags.CreateInstance | BindingFlags.Instance | 
+														   BindingFlags.Public | BindingFlags.NonPublic, 
+														   null, null, null);
+				}
+				
+				if (serializer != null)
+					_serializersCache[componentType] = serializer;
+			}
+
+			// try 3: from provider
 			//
 			if (serializer == null) {
 				foreach (IDesignerSerializationProvider provider in _serializationProviders) {
@@ -265,26 +280,9 @@ namespace System.ComponentModel.Design.Serialization
 				}
 			}
 
-			if (componentType != null) {
-				// try 3: Activator
-				//
-				if (serializer == null) {
-					AttributeCollection attributes = TypeDescriptor.GetAttributes (componentType);
-					DesignerSerializerAttribute serializerAttribute = attributes[typeof (DesignerSerializerAttribute)] as DesignerSerializerAttribute;
-					if (serializerAttribute != null && this.GetType (serializerAttribute.SerializerTypeName) == serializerType) {
-							serializer = Activator.CreateInstance (this.GetType (serializerAttribute.SerializerTypeName), 
-										 BindingFlags.CreateInstance | BindingFlags.Public | BindingFlags.NonPublic, 
-										 null, null, null);
-					}
-				}
-				
-				if (serializer != null)
-					_serializersCache[componentType] = serializer;
-			}
-			
 			return serializer;
 		}
-		
+
 		private void VerifyInSession ()
 		{
 			if (_session == null)

+ 2 - 0
mcs/class/System.Design/System.Design.dll.sources

@@ -261,6 +261,8 @@ System.Windows.Forms.Design/BorderSidesEditor.cs
 System.Windows.Forms.Design/ComponentDocumentDesigner.cs
 System.Windows.Forms.Design/ComponentTray.cs
 System.Windows.Forms.Design/ControlBindingsConverter.cs
+System.Windows.Forms.Design/ControlCodeDomSerializer.cs
+System.Windows.Forms.Design/ControlCollectionCodeDomSerializer.cs
 System.Windows.Forms.Design/ControlDataObject.cs
 System.Windows.Forms.Design/ControlDesigner.cs
 System.Windows.Forms.Design/DataMemberFieldConverter.cs

+ 81 - 0
mcs/class/System.Design/System.Windows.Forms.Design/ControlCodeDomSerializer.cs

@@ -0,0 +1,81 @@
+//
+// System.Windows.Forms.Design.ControlCodeDomSerializaer
+//
+// Authors:
+//	  Ivan N. Zlatev (contact i-nZ.net)
+//
+// (C) 2007 Ivan N. Zlatev
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#if NET_2_0
+
+using System;
+using System.Collections;
+using System.Reflection;
+using System.ComponentModel;
+using System.ComponentModel.Design;
+using System.ComponentModel.Design.Serialization;
+using System.CodeDom;
+using System.Windows.Forms;
+
+namespace System.Windows.Forms.Design
+{
+	internal class ControlCodeDomSerializer : ComponentCodeDomSerializer
+	{
+
+		public ControlCodeDomSerializer ()
+		{
+		}
+
+		public override object Serialize (IDesignerSerializationManager manager, object value)
+		{
+			if (value == null)
+				throw new ArgumentNullException ("value");
+			if (manager == null)
+				throw new ArgumentNullException ("manager");
+
+			if (!(value is Control))
+				throw new InvalidOperationException ("value is not a Control");
+
+			object serialized = base.Serialize (manager, value);
+			CodeStatementCollection statements = serialized as CodeStatementCollection;
+			if (statements != null) {
+				ICollection childControls = TypeDescriptor.GetProperties (value)["Controls"].GetValue (value) as ICollection;
+				// If the serialized object is not a statements collection then we don't do anything,
+				// because this means that the object is not under context (serialized to experssion)
+				// 
+				if (childControls.Count > 0) {
+					CodeExpression componentRef = base.GetExpression (manager, value);
+					statements.Insert (0, new CodeExpressionStatement (
+						new CodeMethodInvokeExpression (componentRef, "SuspendLayout")));
+					statements.Add (new CodeMethodInvokeExpression (componentRef, "ResumeLayout", 
+																		   new CodeExpression[] { 
+																			   new CodePrimitiveExpression (false) }));
+					serialized = statements;
+				}
+			}
+			return serialized;
+		}
+	}
+}
+#endif

+ 51 - 0
mcs/class/System.Design/System.Windows.Forms.Design/ControlCollectionCodeDomSerializer.cs

@@ -0,0 +1,51 @@
+//
+// System.Windows.Forms.Design.ControlCollectionCodeDomSerializaer
+//
+// Authors:
+//	  Ivan N. Zlatev (contact i-nZ.net)
+//
+// (C) 2007 Ivan N. Zlatev
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#if NET_2_0
+
+using System;
+using System.Collections;
+using System.Reflection;
+using System.ComponentModel;
+using System.ComponentModel.Design;
+using System.ComponentModel.Design.Serialization;
+using System.CodeDom;
+using System.Windows.Forms;
+
+namespace System.Windows.Forms.Design
+{
+	internal class ControlCollectionCodeDomSerializaer : CollectionCodeDomSerializer
+	{
+
+		public ControlCollectionCodeDomSerializaer ()
+		{
+		}
+	}
+}
+#endif