2007-12-18 Ivan N. Zlatev <contact@i-nz.net>
authorIvan Zlatev <ivan@ivanz.com>
Tue, 18 Dec 2007 19:53:39 +0000 (19:53 -0000)
committerIvan Zlatev <ivan@ivanz.com>
Tue, 18 Dec 2007 19:53:39 +0000 (19:53 -0000)
        * 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

mcs/class/System.Design/System.ComponentModel.Design.Serialization/Changelog
mcs/class/System.Design/System.ComponentModel.Design.Serialization/DesignerSerializationManager.cs
mcs/class/System.Design/System.Design.dll.sources
mcs/class/System.Design/System.Windows.Forms.Design/ControlCodeDomSerializer.cs [new file with mode: 0644]
mcs/class/System.Design/System.Windows.Forms.Design/ControlCollectionCodeDomSerializer.cs [new file with mode: 0644]

index 149e8aeca72470c74697f91f5ae317e216287f51..7ab5373b9ea9967bf5165a147e8f111171f3c85c 100644 (file)
@@ -1,3 +1,11 @@
+2007-12-18  Ivan N. Zlatev  <contact@i-nz.net>
+
+       * 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  <contact@i-nz.net>
 
        * CodeDomSerializerBase.cs:
index 88cf9dd529fbde7c115f811b338425858b6a89e8..12aee8ecdae159d316d425c607625ee7740a25e1 100644 (file)
@@ -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)
index 4a80f655d9e7faa43cb92822d48e45f78481f883..d3b1a596ad09f2c964dc26307392794c8a4be247 100755 (executable)
@@ -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
diff --git a/mcs/class/System.Design/System.Windows.Forms.Design/ControlCodeDomSerializer.cs b/mcs/class/System.Design/System.Windows.Forms.Design/ControlCodeDomSerializer.cs
new file mode 100644 (file)
index 0000000..447c442
--- /dev/null
@@ -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
diff --git a/mcs/class/System.Design/System.Windows.Forms.Design/ControlCollectionCodeDomSerializer.cs b/mcs/class/System.Design/System.Windows.Forms.Design/ControlCollectionCodeDomSerializer.cs
new file mode 100644 (file)
index 0000000..f5cb941
--- /dev/null
@@ -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