diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonForm.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonForm.cs index 429a2dbb60..a2e0f76625 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonForm.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonForm.cs @@ -70,14 +70,12 @@ namespace ICSharpCode.PythonBinding /// public PropertyDescriptorCollection GetSerializableProperties(object obj) { - System.Console.WriteLine("GetSerializableProperties"); List properties = new List(); Attribute[] filter = new Attribute[] { DesignOnlyAttribute.No }; foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(obj, filter).Sort()) { if (property.SerializationVisibility == DesignerSerializationVisibility.Visible) { if (property.ShouldSerializeValue(obj)) { properties.Add(property); - System.Console.WriteLine("Property.Name: " + property.Name); } } } @@ -98,39 +96,63 @@ namespace ICSharpCode.PythonBinding /// /// Generates python code for the form's InitializeComponent method. /// - /// - /// Note that when the form is loaded in the designer the Name property appears twice: - /// - /// Property.ComponentType: System.Windows.Forms.Design.DesignerExtenders+NameExtenderProvider - /// Property.SerializationVisibility: Hidden - /// Property.IsBrowsable: True - /// - /// Property.ComponentType: System.Windows.Forms.Design.ControlDesigner - /// Property.SerializationVisibility: Visible - /// Property.IsBrowsable: False - /// void AppendForm(Form form) { - AppendComment(form.Name); + foreach (Control control in form.Controls) { + AppendControl(control); + } + + AppendControl(form, false); + + foreach (Control control in form.Controls) { + AppendIndentedLine("self.Controls.Add(self." + control.Name + ")"); + } + } - foreach (PropertyDescriptor property in GetSerializableProperties(form)) { - AppendProperty(form, property); + void AppendControl(Control control) + { + AppendControl(control, true); + } + + /// + /// Generates python code for the control. + /// + void AppendControl(Control control, bool addControlNameToProperty) + { + AppendComment(control.Name); + + string propertyOwnerName = String.Empty; + if (addControlNameToProperty) { + propertyOwnerName = control.Name; + } + + foreach (PropertyDescriptor property in GetSerializableProperties(control)) { + AppendProperty(propertyOwnerName, control, property); } } /// /// Appends a property to the InitializeComponents method. /// - void AppendProperty(object obj, PropertyDescriptor propertyDescriptor) + void AppendProperty(string propertyOwnerName, object obj, PropertyDescriptor propertyDescriptor) { object propertyValue = propertyDescriptor.GetValue(obj); if (propertyValue == null) { return; } - AppendIndentedLine("self." + propertyDescriptor.Name + " = " + PythonPropertyValueAssignment.ToString(propertyValue)); + string propertyName = GetPropertyName(propertyOwnerName, propertyDescriptor.Name); + AppendIndentedLine(propertyName + " = " + PythonPropertyValueAssignment.ToString(propertyValue)); } - + + static string GetPropertyName(string propertyOwnerName, string propertyName) + { + if (String.IsNullOrEmpty(propertyOwnerName)) { + return "self." + propertyName; + } + return "self." + propertyOwnerName + "." + propertyName; + } + /// /// Appends the comment lines before the control has its properties set. /// diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GenerateTextBoxFormTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GenerateTextBoxFormTestFixture.cs new file mode 100644 index 0000000000..bf5b8d7b93 --- /dev/null +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GenerateTextBoxFormTestFixture.cs @@ -0,0 +1,68 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Drawing; +using System.Windows.Forms; +using ICSharpCode.PythonBinding; +using NUnit.Framework; +using PythonBinding.Tests.Utils; + +namespace PythonBinding.Tests.Designer +{ + [TestFixture] + public class GenerateTextBoxFormTestFixture + { + string generatedPythonCode; + + [TestFixtureSetUp] + public void SetUpFixture() + { + using (Form form = new Form()) { + form.Name = "MainForm"; + form.ClientSize = new Size(284, 264); + + TextBox textBox = new TextBox(); + textBox.Name = "textBox1"; + textBox.Size = new Size(110, 20); + textBox.TabIndex = 1; + textBox.Location = new Point(10, 10); + + form.Controls.Add(textBox); + + string indentString = " "; + PythonForm pythonForm = new PythonForm(indentString); + generatedPythonCode = pythonForm.GenerateInitializeComponentMethod(form); + } + } + + [Test] + public void GeneratedCode() + { + string expectedCode = "def InitializeComponent(self):\r\n" + + " self.SuspendLayout()\r\n" + + " # \r\n" + + " # textBox1\r\n" + + " # \r\n" + + " self.textBox1.Location = System.Drawing.Point(10, 10)\r\n" + + " self.textBox1.Name = \"textBox1\"\r\n" + + " self.textBox1.Size = System.Drawing.Size(110, 20)\r\n" + + " self.textBox1.TabIndex = 1\r\n" + + " # \r\n" + + " # MainForm\r\n" + + " # \r\n" + + " self.ClientSize = System.Drawing.Size(284, 264)\r\n" + + " self.Name = \"MainForm\"\r\n" + + " self.Visible = False\r\n" + + " self.Controls.Add(self.textBox1)\r\n" + + " self.ResumeLayout(False)\r\n" + + " self.PerformLayout()\r\n"; + + Assert.AreEqual(expectedCode, generatedPythonCode); + } + } +} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj b/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj index f11d59417d..f1d2da6297 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj @@ -162,6 +162,7 @@ +